X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/e68cc768d63e108b3f7747731921999bb00b7e1f..247ffdeea41720d829b9e0acc7887c5869924f56:/aseg-paging/pagingstub.c?ds=sidebyside diff --git a/aseg-paging/pagingstub.c b/aseg-paging/pagingstub.c index 8969998..d839966 100644 --- a/aseg-paging/pagingstub.c +++ b/aseg-paging/pagingstub.c @@ -8,10 +8,11 @@ #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); extern int entry_initialized; extern int _bss, _bssend, _end; @@ -33,19 +34,19 @@ void smi_entry(); #define MAP_FLAGS (PTE_PRESENT | PTE_READ_WRITE) -void * pt_setup(int smbase) { +void * pt_setup(int smbase, int tseg_start, int tseg_size) { int i; outb(0x80, 0x51); /* The page directory and page table live at SMBASE and SMBASE + 0x1000, * respectively; clear them. */ - int * pagedirectory = (int *) smbase; - int * pagetable = (int *) (smbase + 0x1000); + int * pagedirectory = (int *) tseg_start; + int * pagetable = (int *) (tseg_start + 0x1000); /* Clear out the page directory except for one entry pointing to the * page table, and clear the page table entirely. */ outb(0x80, 0x52); - pagedirectory[0] = (smbase + 0x1000) | PTE_PRESENT | PTE_READ_WRITE; + pagedirectory[0] = (tseg_start + 0x1000) | PTE_PRESENT | PTE_READ_WRITE; outb(0x80, 0x53); for (i = 1; i < 1024; i++) { @@ -86,15 +87,13 @@ void * pt_setup(int smbase) { /* Map 0x200000 to TSEG */ for (i = 0; i < 128; i++) { - pagetable[0x200 + i] = (0x1FF80000 + i * 0x1000) | MAP_FLAGS; + pagetable[0x200 + i] = (tseg_start + 0x2000 + i * 0x1000) | MAP_FLAGS; } /* Map 0x300000 -> 0x200000, so we can copy our code out of * RAM the first time around */ for (i = 0; i < 256; i++) { - /* pagetable[0x300 + i] = (0x200000 + i * 0x1000) | MAP_FLAGS; - */ - pagetable[0x200 + i] = (0x200000 + i * 0x1000) | MAP_FLAGS; + pagetable[0x300 + i] = (0x200000 + i * 0x1000) | MAP_FLAGS; } outb(0x80, 0x57); @@ -103,30 +102,33 @@ void * pt_setup(int smbase) { void c_entry(void) { -// unsigned char *bp; + unsigned char *bp; outb(0x80, 0x41); - char * pagedir = pt_setup(0xA0000); - 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; } - smi_entry(); + outb(0x80, 0x44); + ps_switch_stack(smi_entry, 0x270000); + outb(0x80, 0xFA); }