X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/307d9f0e590f4f2b2e1bcac37636374a334f3946..eda689ee9aa29e6c4e791a7f295bc4a0a3ad5d83:/aseg-paging/smi.c diff --git a/aseg-paging/smi.c b/aseg-paging/smi.c index e1304f3..d519341 100644 --- a/aseg-paging/smi.c +++ b/aseg-paging/smi.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "../net/net.h" #include "vga-overlay.h" @@ -18,6 +19,9 @@ void smi_entry(void) { char statstr[512]; + /* Reenable caching on SMRAM. */ + WRMSR(0x202, (RDMSR(0x202) & ~(0xFFULL)) | 0x06ULL); + pcisave = inl(0xCF8); vgasave = inb(0x3D4); pci_unbother_all(); @@ -28,40 +32,10 @@ void smi_entry(void) fb->getvmode(fb->priv); counter++; - sprintf(statstr, "NetWatch! %08x %08x", smi_status(), counter); - strblit(statstr, 0, 0, 0); - - /* wee! */ - if (fb && !fb->curmode.text) + 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; - } - } + sprintf(statstr, "NetWatch! %08x %08x", smi_status(), counter); + strblit(statstr, 0, 0, 0); } eth_poll(); @@ -81,6 +55,9 @@ void smi_entry(void) pci_bother_all(); outl(0xCF8, pcisave); outb(0x3D4, vgasave); + + /* Disable caching on SMRAM again, to prevent the user from whacking us. */ + WRMSR(0x202, RDMSR(0x202) & ~(0xFFULL)); } extern void timer_handler(smi_event_t ev);