X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/953ec70c3a5163eb13db4bf998c9b21a3964df9c..4033103109721ab7a85c743c5c9d1c8f29a734ef:/aseg-paging/pagingstub.c diff --git a/aseg-paging/pagingstub.c b/aseg-paging/pagingstub.c index 849c6dc..d839966 100644 --- a/aseg-paging/pagingstub.c +++ b/aseg-paging/pagingstub.c @@ -8,8 +8,8 @@ #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 +105,30 @@ 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."); + 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); }