summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-08-29 19:56:40 +0200
committerMichal Idziorek <m.i@gmx.at>2014-08-29 19:56:40 +0200
commit47d22a238a6c5d60c6abfac724e6ad91885cdd67 (patch)
treebd3893777b58aac7c94d68fe2a4ba57cfbdb38ec
parent659f1f1ae057c82a154a1fd32cc9dca040979daa (diff)
added paging support
-rw-r--r--Makefile6
-rw-r--r--README.md8
-rw-r--r--bochsrc2
-rw-r--r--boot/mbr.asm5
-rw-r--r--boot/vesa_setup_16.asm2
-rw-r--r--kernel/console.c3
-rw-r--r--kernel/interrupts.c4
-rw-r--r--kernel/kernel.c29
-rw-r--r--kernel/keyboard.c7
-rw-r--r--kernel/mem.c40
-rw-r--r--kernel/pci.c8
-rw-r--r--kernel/shell.c11
-rw-r--r--kernel/vesa.c5
-rw-r--r--kernel/vmem.c146
-rw-r--r--kernel/x86.c14
-rw-r--r--kernel/x86.h2
-rw-r--r--lib/logger/log.c14
-rw-r--r--lib/logger/log.h1
18 files changed, 259 insertions, 48 deletions
diff --git a/Makefile b/Makefile
index a52fe12..653b9e9 100644
--- a/Makefile
+++ b/Makefile
@@ -45,7 +45,7 @@ kernel_entry.o: boot/kernel_entry.asm
kernel.o: kernel/kernel.c kernel/console.h
- gcc -ffreestanding -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0
+ gcc -ffreestanding -std=gnu99 -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0
x86.o: kernel/x86.c
gcc -ffreestanding -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0
@@ -54,10 +54,10 @@ floppy.o: kernel/floppy.c
gcc -ffreestanding -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0
vmem.o: kernel/vmem.c
- gcc -ffreestanding -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0
+ gcc -ffreestanding -std=gnu99 -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0
mem.o: kernel/mem.c
- gcc -ffreestanding -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0
+ gcc -ffreestanding --std=gnu99 -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0
e1000.o: kernel/e1000.c
gcc -ffreestanding -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0
diff --git a/README.md b/README.md
index db8e7c4..fb9f34c 100644
--- a/README.md
+++ b/README.md
@@ -24,12 +24,15 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+Notes
+-----
+
Features
--------
All features are only very rudiemntary and buggy.
-* Runs in bochs (with cirrus) and virtual box.
+* Runs in bochs (with cirrus), qemu and virtual box (disable nested paging etc)
* PIT support / Timing
* PIC support & Interrupt handling framework
* PCI bus scanning
@@ -79,6 +82,7 @@ FLOPPY IMAGE
RAM
---
+
0x1000
boot loader puts the kernel binary here.
@@ -105,6 +109,8 @@ RAM
0xb000
memory above this is used for dma (by our floppy.c driver)
+0x9000
+ esp
REFERENCES
diff --git a/bochsrc b/bochsrc
index 0f8a75b..94f0f4a 100644
--- a/bochsrc
+++ b/bochsrc
@@ -220,7 +220,7 @@ romimage: file=/home/miguel/opt/bochs-2.6.6/bios/BIOS-bochs-latest
# used all allocated host memory and wants more.
#
#=======================================================================
-memory: guest=1024, host=1024
+memory: guest=16, host=1024
#=======================================================================
# OPTROMIMAGE[1-4]:
diff --git a/boot/mbr.asm b/boot/mbr.asm
index 4dd82d1..96fc788 100644
--- a/boot/mbr.asm
+++ b/boot/mbr.asm
@@ -49,6 +49,7 @@ MEMMAP_OFFSET equ 0x7c00+0x400
VESA_MODES equ 0x8300
VESA_MODE_INFO equ 0x8400
VESA_MODE_SELECT equ 0x4114
+;VESA_MODE_SELECT equ 0x0
jmp boot_16 ;start boot process
@@ -62,7 +63,7 @@ VESA_CHECK1:
VESA_CHECK2:
db " V2",0
VESA_CHECK3:
- db " V2",0
+ db " V3",0
CHECK_A20:
db " A20",0
@@ -117,7 +118,7 @@ boot_16:
a20check:
- mov bx, STR_VERSION
+ mov bx, CHECK_A20
call print_string
call check_a20
diff --git a/boot/vesa_setup_16.asm b/boot/vesa_setup_16.asm
index 4f276b5..7180252 100644
--- a/boot/vesa_setup_16.asm
+++ b/boot/vesa_setup_16.asm
@@ -17,6 +17,7 @@ VesaSetup:
vesa_ok:
;
+
;VESA: get vesa info on mode of interest
mov ax,0 ; set target address in es:di (0:offset)
mov es,ax
@@ -32,6 +33,7 @@ VesaSetup:
jmp vesa_err2
vesa_ok2:
+
;VESA: finally switch to the mode of choice!
mov ax,0x4f02 ;vesa function: Set Mode
mov bx,VESA_MODE_SELECT
diff --git a/kernel/console.c b/kernel/console.c
index b1a9125..72ad066 100644
--- a/kernel/console.c
+++ b/kernel/console.c
@@ -1,6 +1,7 @@
#include "console.h"
-#define FOOLOS_CONSOLE
+//#define FOOLOS_CONSOLE
+//#undef FOOLOS_CONSOLE
static int posx=0;
static int posy=0;
diff --git a/kernel/interrupts.c b/kernel/interrupts.c
index 167f0ad..348972e 100644
--- a/kernel/interrupts.c
+++ b/kernel/interrupts.c
@@ -51,8 +51,6 @@ void int_def_handler()
int_unhandled++;
X86_IRQ_END
-
-
}
//set a handler for a specific interrupt
@@ -79,7 +77,7 @@ void int_init(uint16_t sel)
int_install_ir(i, 0b10001110, sel,&int_def_handler);
}
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"initializing...");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"initializing. IDT: 0x%08x, IDTD: 0x%08X",&idt,&idtd);
}
void int_install()
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 7d9b848..2dd57fd 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -25,13 +25,14 @@ void int_test_handler_worker()
{
// this can not be called directly from interrupt handler
// due to optional parameters (...) probably!
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"irq 88");
+ panic(FOOLOS_MODULE_NAME,"unhandled EXCEPTION!");
}
void int_test_handler()
{
X86_IRQ_BEGIN
int_test_handler_worker();
sleep(30);
+ while(1); // hang!
X86_IRQ_END
}
@@ -55,17 +56,23 @@ void kernel_main()
// while the last one is set in the Makefile. The font binary
// is integrated in the kernel image.
//
- vesa_init(0x8300,0x8400,0x7200);
+ // this function returns the physical base address of
+ // our video memory
+ //
+ uint32_t vesa_physbase=vesa_init(0x8300,0x8400,0x7200);
//
// PIT config (timer)
timer_init();
+
// we know that here, the bootloader placed the mamory map!
mem_init(0x7c00+0x400,*((uint16_t *)(0x7c00+0x600)));
- // paging (Todo)
- vmem_init();
+ // paging (pass the vesa physbase address for identity mapping)
+ vmem_init(vesa_physbase);
+
+ //
// init and interrupt decriptor table
int_init(0x08);
@@ -90,10 +97,15 @@ void kernel_main()
// install test software interrupt handler
int_install_ir(88, 0b10001110, 0x08,&int_test_handler);
+
+ for(int i=0;i<19;i++)
+ int_install_ir(i, 0b10001110, 0x08,&int_test_handler);
// now we can enable interrupts back again
int_enable();
+// int x=10/0;
+
// pci
pci_init();
@@ -116,6 +128,15 @@ void kernel_main()
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test mem %x",*(memtest2+1));
*/
+ /* stack pointer test?
+ uint32_t *esp=0x90000;
+ for(int i=0;i<10;i++)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"esp: %x",*esp);
+ esp--;
+ }
+ */
+
while(1); // never ending loop
diff --git a/kernel/keyboard.c b/kernel/keyboard.c
index ede71a2..7b08098 100644
--- a/kernel/keyboard.c
+++ b/kernel/keyboard.c
@@ -1,18 +1,15 @@
#include "kernel.h"
#include "x86.h"
#include "console.h"
+
#include "../lib/logger/log.h" // logger facilities
#define FOOLOS_MODULE_NAME "keyboard"
/// keyboard driver ////
-
-//static int cursor=0;
-//static char last_code=0;
-
void keyboard_handle(uint8_t in)
{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"scancode 0x%x",in);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"scancode 0x%x",in);
int i=0;
//
diff --git a/kernel/mem.c b/kernel/mem.c
index b761c8c..4896272 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -38,6 +38,39 @@ int mmap_test(int bit)
return _mmngr_memory_map[bit / 32] & (1 << (bit % 32));
}
+void mmap_show_free ()
+{
+
+ int last_pos=0;
+ uint32_t last=_mmngr_memory_map[0];
+
+ for (int i=1; i< MEM_BITMAP_SIZE ; i++)
+ {
+ if (_mmngr_memory_map[i] != last||i==MEM_BITMAP_SIZE-1)
+ {
+
+ if(last==0)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d -%d free",last_pos*32,i*32);
+ }
+ else if(last==0xffffffff)
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d -%d full",last_pos*32,i*32);
+ }
+ else
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d -%d some free",last_pos*32,i*32);
+ }
+
+ last_pos=i;
+ last=_mmngr_memory_map[i];
+
+
+ }
+ }
+
+}
+
//
int mmap_first_free ()
{
@@ -61,6 +94,7 @@ int mmap_first_free ()
}
+
void pmmngr_init ()
{
//! By default, all of memory is in use
@@ -107,7 +141,7 @@ void* pmmngr_alloc_block ()
if (frame == -1)
{
- scr_put_string_nl("OUT OF MEM!");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"OUT OF MEMORY");
return 0; //out of memory
}
@@ -231,7 +265,7 @@ void mem_init(uint16_t *memmap,uint16_t entries)
#ifdef MEM_PRINT_MEMORYMAP
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%x : 0x%08x - 0x%08x",
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"type: %02d / range: 0x%08x - 0x%08x",
memmap[8],
(((uint32_t)memmap[1])<<16)+memmap[0],
(((uint32_t)memmap[1])<<16)+memmap[0]
@@ -249,7 +283,7 @@ void mem_init(uint16_t *memmap,uint16_t entries)
}
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Available Mem: %d bytes.",avail_mem);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Available Mem: %d bytes. (~%d MB)",avail_mem,avail_mem/1024/1024);
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Available 4K blocks: %d blocks.",mem_free_blocks);
}
diff --git a/kernel/pci.c b/kernel/pci.c
index c8bd95d..c1e6753 100644
--- a/kernel/pci.c
+++ b/kernel/pci.c
@@ -85,11 +85,11 @@ uint16_t pciCheck(uint8_t bus, uint8_t slot)
{
// uint16_t irq=pciConfigReadWord(bus,slot,0,0x3C);
// uint16_t irq2=pciConfigReadWord(bus,slot,0,0x3E);
- init_e1000();
+// init_e1000();
- test_bar(bus,slot,0x10);
- test_bar(bus,slot,0x14);
- test_bar(bus,slot,0x18);
+// test_bar(bus,slot,0x10);
+// test_bar(bus,slot,0x14);
+// test_bar(bus,slot,0x18);
// scr_put_hex(irq);
// scr_put_hex(irq2);
diff --git a/kernel/shell.c b/kernel/shell.c
index 45e8620..aff2dc4 100644
--- a/kernel/shell.c
+++ b/kernel/shell.c
@@ -20,7 +20,7 @@ void shell_init()
void shell_put(char x)
{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"char:%c",x);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"char:%c",x);
if(pos<COMMAND_LENGTH-2);
@@ -65,6 +65,15 @@ void shell_execute()
{
int_generate88();
}
+ else if(1==strcmp(command,"MEM"))
+ {
+ mmap_show_free();
+ }
+ else if(1==strcmp(command,"ALLOC"))
+ {
+ uint32_t *malloc= pmmngr_alloc_block();
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"allocated 4KB block at: %08x.",malloc);
+ }
else if(1==strcmp(command,"READ"))
{
uint8_t *read= flpydsk_read_sector (10);
diff --git a/kernel/vesa.c b/kernel/vesa.c
index 048dbf1..b7b4615 100644
--- a/kernel/vesa.c
+++ b/kernel/vesa.c
@@ -57,7 +57,7 @@ static console_y;
static console_lines;
static console_cols;
-void vesa_init(vbeinfo *info,vbemodeinfo *mode,foolfont *rawfont)
+uint32_t vesa_init(vbeinfo *info,vbemodeinfo *mode,foolfont *rawfont)
{
//the only functionallu important init lines! (rest is log)
VbeModeInfoBlock=mode;
@@ -90,10 +90,13 @@ void vesa_init(vbeinfo *info,vbemodeinfo *mode,foolfont *rawfont)
while(*modeptr!=0xffff&&*modeptr!=0)
{
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"mode supported : 0x%x", (*modeptr));
+ scr_put_hex(*modeptr);
modeptr++;
}
#endif
+ return VbeModeInfoBlock->physbase;
+
}
void PutPixel(int x,int y, int color){
diff --git a/kernel/vmem.c b/kernel/vmem.c
index 9d34810..b1ecfa1 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -1,5 +1,12 @@
+// http://www.brokenthorn.com/Resources/OSDev18.html
+
#include "kernel.h"
+#include "x86.h"
+#include "../lib/logger/log.h" // logger facilities
+#define FOOLOS_MODULE_NAME "vmem"
+
+// TODO : why is the frame not 0xfffff??
enum PAGE_PTE_FLAGS {
I86_PTE_PRESENT = 1, //0000000000000000000000000000001
@@ -12,7 +19,7 @@ enum PAGE_PTE_FLAGS {
I86_PTE_PAT = 0x80, //0000000000000000000000010000000
I86_PTE_CPU_GLOBAL = 0x100, //0000000000000000000000100000000
I86_PTE_LV4_GLOBAL = 0x200, //0000000000000000000001000000000
- I86_PTE_FRAME = 0x7FFFF000 //1111111111111111111000000000000
+ I86_PTE_FRAME = 0xFFFFF000 //1111111111111111111000000000000
};
enum PAGE_PDE_FLAGS {
@@ -27,7 +34,7 @@ enum PAGE_PDE_FLAGS {
I86_PDE_4MB = 0x80, //0000000000000000000000010000000
I86_PDE_CPU_GLOBAL = 0x100, //0000000000000000000000100000000
I86_PDE_LV4_GLOBAL = 0x200, //0000000000000000000001000000000
- I86_PDE_FRAME = 0x7FFFF000 //1111111111111111111000000000000
+ I86_PDE_FRAME = 0xFFFFF000 //1111111111111111111000000000000
};
//! page table entry
@@ -62,53 +69,65 @@ typedef uint8_t bool;
#define PAGE_SIZE 4096
//! page table
-struct ptable {
+typedef struct ptable_struct {
pt_entry m_entries[PAGES_PER_TABLE];
-};
+}ptable ;
//! page directory
-struct pdirectory {
+typedef struct pdirectory_struct {
pd_entry m_entries[PAGES_PER_DIR];
-};
+}pdirectory;
-void pt_entry_add_attrib (pt_entry* e, uint32_t attrib)
+void pt_entry_add_attrib (pt_entry* e, uint32_t attrib)
{
+ *e|=attrib;
}
-void pt_entry_del_attrib (pt_entry* e, uint32_t attrib)
+void pt_entry_del_attrib (pt_entry* e, uint32_t attrib)
{
+ *e&=~attrib;
}
-void pt_entry_set_frame (pt_entry* e , physical_addr addr)
+void pt_entry_set_frame (pt_entry* e , physical_addr addr)
{
+ // *e = (*e & ~I86_PTE_FRAME) | addr;
+
+ *e|=I86_PTE_FRAME&addr;
+
}
-bool pt_entry_is_present (pt_entry e)
+bool pt_entry_is_present (pt_entry e)
{
- return 1;
+ return e&I86_PTE_PRESENT;
}
-bool pt_entry_is_writable (pt_entry e)
+
+bool pt_entry_is_writable (pt_entry e)
{
- return 1;
+ return e&I86_PTE_WRITABLE;
}
-physical_addr pt_entry_pfn (pt_entry e)
+
+physical_addr pt_entry_pfn (pt_entry e)
{
- return 1;
+ return e&I86_PTE_FRAME;
}
void pd_entry_add_attrib (pd_entry* e, uint32_t attrib)
{
+ *e|=attrib;
}
void pd_entry_del_attrib (pd_entry* e, uint32_t attrib)
{
+ *e&=~attrib;
}
void pd_entry_set_frame (pd_entry* e, physical_addr add)
{
+ *e|=I86_PDE_FRAME&add;
}
bool pd_entry_is_present (pd_entry e)
{
- return 1;
+ return e&I86_PDE_PRESENT;
}
+/*
bool pd_entry_is_user (pd_entry e)
{
return 1;
@@ -118,20 +137,23 @@ bool pd_entry_is_4mb (pd_entry e)
{
return 1;
}
+*/
bool pd_entry_is_writable (pd_entry e)
{
- return 1;
+ return e&I86_PDE_WRITABLE;
}
physical_addr pd_entry_pfn (pd_entry e)
{
- return 1;
+ return e&I86_PDE_FRAME;
}
+/*
void pd_entry_enable_global (pd_entry e)
{
}
+*/
uint8_t vmmngr_alloc_page (pt_entry* e)
{
@@ -148,8 +170,94 @@ uint8_t vmmngr_alloc_page (pt_entry* e)
return 1;
}
-void vmem_init()
+void vmmngr_free_page (pt_entry* e)
+{
+ void* p = (void*)pt_entry_pfn (*e);
+ if (p)
+ pmmngr_free_block (p);
+
+ pt_entry_del_attrib (e, I86_PTE_PRESENT);
+}
+
+pt_entry* vmmngr_ptable_lookup_entry (ptable* p, virtual_addr addr)
+{
+
+ if (p)
+ return &p->m_entries[ PAGE_TABLE_INDEX (addr) ];
+
+ return 0;
+}
+
+// TODO !? http://www.brokenthorn.com/Resources/OSDev18.html
+void vmmngr_map_page (void* phys, void* virt)
+{
+
+}
+
+void vmem_init(uint32_t vesa_physbase)
{
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging (vesa base: 0x%08x)",vesa_physbase);
+
+ ptable* table1 = (ptable*) pmmngr_alloc_block ();
+
+ if (!table1)panic(FOOLOS_MODULE_NAME,"unable to alloc table1");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table1: 0x%X",table1);
+
+ ptable* table2 = (ptable*) pmmngr_alloc_block ();
+
+ if (!table1)panic(FOOLOS_MODULE_NAME,"unable to alloc table2");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table2: 0x%X",table2);
+
+ // TODO: 3blocks?
+ pdirectory* dir = (pdirectory*) pmmngr_alloc_block ();
+ if (!dir)panic(FOOLOS_MODULE_NAME,"unable to alloc pdirectory");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"pdirectory: 0x%X",dir);
+
+ //! map 1mb to 3gb (where we are at)
+ for (int i=0, frame=vesa_physbase, virt=vesa_physbase; i<1024; i++, frame+=4096, virt+=4096) {
+
+ //! create a new page
+ pt_entry page=0;
+ pt_entry_add_attrib (&page, I86_PTE_PRESENT);
+ pt_entry_set_frame (&page, frame);
+
+ //! ...and add it to the page table
+ table1->m_entries [PAGE_TABLE_INDEX (virt) ] = page;
+ }
+
+ //! 1st 4mb are idenitity mapped
+ for (int i=0, frame=0x0, virt=0x00000000; i<1024; i++, frame+=4096, virt+=4096)
+ {
+
+ //! create a new page
+ pt_entry page=0;
+ pt_entry_add_attrib (&page, I86_PTE_PRESENT);
+ pt_entry_set_frame (&page, frame);
+
+ //! ...and add it to the page table
+ table2->m_entries [PAGE_TABLE_INDEX (virt) ] = page;
+ }
+
+
+ pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (vesa_physbase) ];
+ *entry=0;
+ pd_entry_add_attrib (entry, I86_PDE_PRESENT);
+ pd_entry_add_attrib (entry, I86_PDE_WRITABLE);
+ pd_entry_set_frame (entry, (physical_addr)table1);
+
+
+ pd_entry* entry2 = &dir->m_entries [PAGE_DIRECTORY_INDEX (0x00000000) ];
+ *entry2=0;
+ pd_entry_add_attrib (entry2, I86_PDE_PRESENT);
+ pd_entry_add_attrib (entry2, I86_PDE_WRITABLE);
+ pd_entry_set_frame (entry2, (physical_addr)table2);
+
+
+ x86_set_pdbr(dir);
+
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"enabling paging...");
+ x86_paging_enable();
+
}
diff --git a/kernel/x86.c b/kernel/x86.c
index ee38599..cc7c303 100644
--- a/kernel/x86.c
+++ b/kernel/x86.c
@@ -36,3 +36,17 @@ uint32_t x86_inl(int port)
return data;
}
+
+void x86_set_pdbr(uint32_t addr)
+{
+ asm volatile("mov %0, %%cr3":: "b"(addr));
+
+}
+
+void x86_paging_enable()
+{
+ unsigned int cr0;
+ asm volatile("mov %%cr0, %0": "=b"(cr0));
+ cr0 |= 0x80000000;
+ asm volatile("mov %0, %%cr0":: "b"(cr0));
+}
diff --git a/kernel/x86.h b/kernel/x86.h
index 2b7572c..3233124 100644
--- a/kernel/x86.h
+++ b/kernel/x86.h
@@ -16,5 +16,7 @@ void x86_outw(int port, uint16_t data);
uint16_t x86_inw(int port);
void x86_outl(int port, uint32_t data);
uint32_t x86_inl(int port);
+void x86_set_pdbr(uint32_t addr);
+void x86_paging_enable();
#endif
diff --git a/lib/logger/log.c b/lib/logger/log.c
index 3a6606e..fd226e5 100644
--- a/lib/logger/log.c
+++ b/lib/logger/log.c
@@ -19,3 +19,17 @@ void log(char *module_name, int log_level, char *format_string, ...)
}
+void panic(char *module_name, char *format_string)
+{
+
+ PutConsole("!! KERNEL PANIC !! ",0b1111100000000000,0);
+ PutConsole(module_name,0b1111100000000000,0);
+ PutConsole(" : ",0b0000011111100000,0);
+ PutConsole(format_string,0b1111100000000000,0);
+
+
+ while(1); // halt
+
+
+
+}
diff --git a/lib/logger/log.h b/lib/logger/log.h
index 9c32a39..251c66f 100644
--- a/lib/logger/log.h
+++ b/lib/logger/log.h
@@ -6,6 +6,7 @@
#define FOOLOS_LOG_FINE 1
void log(char *module_name, int prio, char *format_string, ...);
+void panic(char *module_name, char *format_string);
#endif