X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/8e6328ba94e7dadaef31a6186ba6d4437e1f06b3..307d9f0e590f4f2b2e1bcac37636374a334f3946:/aseg-paging/smi.c diff --git a/aseg-paging/smi.c b/aseg-paging/smi.c index 33536eb..e1304f3 100644 --- a/aseg-paging/smi.c +++ b/aseg-paging/smi.c @@ -4,54 +4,67 @@ #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 = 0; unsigned char vgasave = 0; -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, 0x0B); + pcisave = inl(0xCF8); vgasave = inb(0x3D4); - outb(0x80, 0x1B); -/* pci_unbother_all(); - */ + + serial_init(); + + if (fb) + fb->getvmode(fb->priv); + counter++; - outb(0x80, 0x2B); - sprintf(statstr, "15-412! %08x %08x", smi_status(), counter); - outb(0x80, 0x3B); - strblit(statstr, 0, 0); - outb(0x80, 0x4B); + sprintf(statstr, "NetWatch! %08x %08x", smi_status(), counter); + strblit(statstr, 0, 0, 0); + + /* wee! */ + if (fb && !fb->curmode.text) + { + int ass[][2] = { + {1,0}, {4,0},{5,0},{6,0}, {8,0},{9,0},{10,0}, + {0,1}, {2,1}, {4,1}, {8,1}, + {0,2},{1,2},{2,2}, {4,2},{5,2},{6,2}, {8,2},{9,2},{10,2}, + {0,3}, {2,3}, {6,3}, {10,3}, + {0,4}, {2,4}, {4,4},{5,4},{6,4}, {8,4},{9,4},{10,4}, + {-1,-1} + }; + int p; + for (p = 0; ass[p][0] != -1; p++) + { + int x, y; + unsigned long lasta = 0; + unsigned long *lastmap; + for (y = 0; y < 8; y++) + for (x = 0; x < 8; x++) + { + unsigned long a = + (unsigned long) fb->fbaddr + + ((y+ass[p][1]*8) * fb->curmode.xres + ass[p][0]*8 + x) * 4; + if ((a & ~4095) != (lasta & ~4095)) + { + lastmap = (unsigned long *)((unsigned long)p2v(a) & ~4095); + lasta = a; + } + lastmap[(a & 4095) / 4] = 0xFF0000FF; + } + } + } - /* eth_poll(); - */ if (inl(0x840) & 0x1000) { @@ -62,35 +75,37 @@ void smi_entry(void) 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); +extern void timer_handler(smi_event_t ev); +extern void kbc_handler(smi_event_t ev); +extern void gbl_rls_handler(smi_event_t ev); - outlog(); -} +void __firstrun_stub() { + /* Try really hard to shut up USB_LEGKEY. */ + pci_write16(0, 31, 2, 0xC0, pci_read16(0, 31, 2, 0xC0)); + pci_write16(0, 31, 2, 0xC0, 0); + pci_write16(0, 31, 4, 0xC0, pci_read16(0, 31, 4, 0xC0)); + pci_write16(0, 31, 4, 0xC0, 0); -void __firstrun_start() { - smi_disable(); - outb(0x80, 0x41); + /* Turn on the SMIs we want */ + smi_disable(); smi_register_handler(SMI_EVENT_FAST_TIMER, timer_handler); smi_enable_event(SMI_EVENT_FAST_TIMER); + smi_register_handler(SMI_EVENT_DEVTRAP_KBC, kbc_handler); + smi_enable_event(SMI_EVENT_DEVTRAP_KBC); + + smi_register_handler(SMI_EVENT_GBL_RLS, gbl_rls_handler); + smi_enable_event(SMI_EVENT_GBL_RLS); + smi_enable(); } -