]> Joshua Wise's Git repositories - netwatch.git/blobdiff - aseg-paging/smi.c
add paging fork of aseg; totally not working yet.
[netwatch.git] / aseg-paging / smi.c
diff --git a/aseg-paging/smi.c b/aseg-paging/smi.c
new file mode 100644 (file)
index 0000000..33536eb
--- /dev/null
@@ -0,0 +1,96 @@
+#include <io.h>
+#include <smram.h>
+#include <video_defines.h>
+#include <minilib.h>
+#include <smi.h>
+#include <pci-bother.h>
+#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();
+ */
+       counter++;
+       outb(0x80, 0x2B);
+       sprintf(statstr, "15-412! %08x %08x", smi_status(), counter);
+       outb(0x80, 0x3B);
+       strblit(statstr, 0, 0);
+       outb(0x80, 0x4B);
+       
+       /*
+       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();
+}
+
This page took 0.00835 seconds and 4 git commands to generate.