X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/a02e8abd81a60f123ccdc7ded655c16711094122..eda689ee9aa29e6c4e791a7f295bc4a0a3ad5d83:/aseg-paging/smi.c?ds=sidebyside diff --git a/aseg-paging/smi.c b/aseg-paging/smi.c index 1152723..d519341 100644 --- a/aseg-paging/smi.c +++ b/aseg-paging/smi.c @@ -5,6 +5,9 @@ #include #include #include +#include +#include +#include #include "../net/net.h" #include "vga-overlay.h" @@ -16,15 +19,25 @@ 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(); + + serial_init(); + + if (fb) + fb->getvmode(fb->priv); counter++; - sprintf(statstr, "NetWatch! %08x %08x", smi_status(), counter); - strblit(statstr, 0, 0, 0); + if (!fb || fb->curmode.text) + { + sprintf(statstr, "NetWatch! %08x %08x", smi_status(), counter); + strblit(statstr, 0, 0, 0); + } - serial_init(); eth_poll(); if (inl(0x840) & 0x1000) @@ -42,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);