X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/2cd64cbf2e235c588ffee9f3de974903d5e7087e..9e2a82e4e9495f33b8e6423c335a9a157f056254:/aseg-paging/paging.c diff --git a/aseg-paging/paging.c b/aseg-paging/paging.c new file mode 100644 index 0000000..fd5d15d --- /dev/null +++ b/aseg-paging/paging.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include +#include +#include "../net/net.h" +#include "vga-overlay.h" + +#include "pagetable.h" + +unsigned int counter = 0; +unsigned int lastctr = 0; +unsigned long pcisave; +unsigned char vgasave; + +void set_cr0(unsigned int); + +#define get_cr0() \ + ({ \ + register unsigned int _temp__; \ + asm volatile("mov %%cr0, %0" : "=r" (_temp__)); \ + _temp__; \ + }) + + +#define set_cr3(value) \ + { \ + register unsigned int _temp__ = (value); \ + asm volatile("mov %0, %%cr3" : : "r" (_temp__)); \ + } +#define CR0_PG 0x80000000 + + +void smi_entry(void) +{ +/* + char statstr[512]; +*/ + + outb(0x80, 0xBB); + return; + + char * pagedir = pt_setup(0xA0000); + outb(0x80, 0x43); + set_cr3((int)pagedir); + outb(0x80, 0xA5); + + /* Turn paging on */ + set_cr0(get_cr0() | CR0_PG); + outb(0x80, 0xAA); + + pcisave = inl(0xCF8); + vgasave = inb(0x3D4); +/* + pci_unbother_all(); + */ + + counter++; + /* + sprintf(statstr, "15-412! %08x %08x", smi_status(), counter); + strblit(statstr, 0, 0); + */ + + /* + eth_poll(); + */ + + if (inl(0x840) & 0x1000) + { + /* + pci_dump(); + */ + outl(0x840, 0x1100); + outl(0x840, 0x0100); + } + +/* + smi_poll(); + + pci_bother_all(); + */ + outl(0xCF8, pcisave); + outb(0x3D4, vgasave); +} + +void timer_handler(smi_event_t ev) +{ + static unsigned int ticks = 0; + + smi_disable_event(SMI_EVENT_FAST_TIMER); + smi_enable_event(SMI_EVENT_FAST_TIMER); + + outb(0x80, (ticks++) & 0xFF); + + outlog(); +} + + +void __firstrun_start() { + smi_disable(); + outb(0x80, 0x41); + + smi_register_handler(SMI_EVENT_FAST_TIMER, timer_handler); + smi_enable_event(SMI_EVENT_FAST_TIMER); + + smi_enable(); +} +