X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/953ec70c3a5163eb13db4bf998c9b21a3964df9c..98d29191ab62caf43c16b3d792996ea51bec067d:/aseg-paging/pagingstub.c?ds=inline diff --git a/aseg-paging/pagingstub.c b/aseg-paging/pagingstub.c index 849c6dc..0115713 100644 --- a/aseg-paging/pagingstub.c +++ b/aseg-paging/pagingstub.c @@ -5,11 +5,12 @@ #include #include #include +#include "traps.h" #include "../net/net.h" #include "vga-overlay.h" +extern void smi_init(); #include "vm_flags.h" -#include "pagetable.h" void set_cr0(unsigned int); void ps_switch_stack (void (*call)(), int stack); @@ -105,28 +106,36 @@ void c_entry(void) unsigned char *bp; outb(0x80, 0x41); - char * pagedir = pt_setup(0xA0000, 0x1FF80000, 0x80000); - outb(0x80, 0x43); - set_cr3((int)pagedir); - outb(0x80, 0xA5); - - /* Turn paging on */ + if (!entry_initialized) + pt_setup(0xA0000, 0x1FF80000, 0x80000); + + /* Enable paging. */ + outb(0x80, 0x42); + set_cr3(0x1FF80000); set_cr0(get_cr0() | CR0_PG); - serial_init(); - serial_tx('A'); - outb(0x80, 0xAA); - + outb(0x80, 0x43); + if (!entry_initialized) { - serial_tx('B'); - outb(0x80, 0xAB); + + /* If needed, copy in data. */ for (bp = (void *)0x200000; (void *)bp < (void *)&_bss; bp++) *bp = *(bp + 0x100000); for (bp = (void *)&_bss; (void *)bp < (void *)&_bssend; bp++) *bp = 0; + serial_init(); + dolog("Paging enabled."); + } + + traps_install(); + + if (!entry_initialized) { + smi_init(); + + entry_initialized = 1; } - outb(0x80, 0xAC); - ps_switch_stack(smi_entry, 0x2FF000); + outb(0x80, 0x44); + ps_switch_stack(smi_entry, 0x270000); outb(0x80, 0xFA); }