]> Joshua Wise's Git repositories - netwatch.git/blobdiff - netwatch/smi.c
More ICH2-specific code diked out.
[netwatch.git] / netwatch / smi.c
index 88570a6bbc80582abf1d26acaea5586d142ece25..7a33559ec89dc6ee8bd210449d5e30e6a83cee3a 100644 (file)
@@ -25,47 +25,74 @@ unsigned int counter = 0;
 unsigned long pcisave = 0;
 unsigned char vgasave = 0;
 
 unsigned long pcisave = 0;
 unsigned char vgasave = 0;
 
+unsigned long lastentry = 0;
+unsigned long lastlength = 0;
+
+unsigned long rdtsc()
+{
+       unsigned long tsc;
+       asm volatile ("mov %%cr4, %%eax;"
+            "and $~2, %%eax;"
+            "mov %%eax, %%cr4;"
+            "rdtsc" : "=a"(tsc) : : "edx");
+       return tsc;
+}
+
 void smi_entry(void)
 {
        char statstr[512];
 void smi_entry(void)
 {
        char statstr[512];
+       unsigned long entrytime;
 
        /* Reenable caching on SMRAM. */
        WRMSR(0x202, (RDMSR(0x202) & ~(0xFFULL)) | 0x06ULL);
 
 
        /* Reenable caching on SMRAM. */
        WRMSR(0x202, (RDMSR(0x202) & ~(0xFFULL)) | 0x06ULL);
 
+       entrytime = rdtsc();
+
        pcisave = inl(0xCF8);
        vgasave = inb(0x3D4);
        pci_unbother_all();
        
        serial_init();
        pcisave = inl(0xCF8);
        vgasave = inb(0x3D4);
        pci_unbother_all();
        
        serial_init();
-       
+
        if (fb)
                fb->getvmode(fb->priv);
 
        counter++;
        if (!fb || fb->curmode.text)
        {
        if (fb)
                fb->getvmode(fb->priv);
 
        counter++;
        if (!fb || fb->curmode.text)
        {
-               sprintf(statstr, "NetWatch! %08x %08x", smi_status(), counter);
+               int totcyc, pct;
+               
+               if (entrytime < lastentry)
+                       totcyc = entrytime + (0xFFFFFFFFUL - lastentry) + 1;
+               else
+                       totcyc = entrytime - lastentry;
+               if (totcyc == 0)
+                       totcyc = 1;     /* argh */
+               totcyc /= 1000;
+               if (totcyc == 0)
+                       totcyc = 1;
+               
+               pct = lastlength / totcyc;
+               
+               sprintf(statstr, "NetWatch! %08x %08x, %2d.%d%%", smi_status(), counter, pct/10, pct%10);
                strblit(statstr, 0, 0, 0);
        }
        
        eth_poll();
        
                strblit(statstr, 0, 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);
        
        smi_poll();
        
        pci_bother_all();
        outl(0xCF8, pcisave);
        outb(0x3D4, vgasave);
        
+       lastentry = entrytime;
+       entrytime = rdtsc();
+       if (entrytime < lastentry)
+               lastlength = entrytime + (0xFFFFFFFFUL - lastentry) + 1;
+       else
+               lastlength = entrytime - lastentry;
+       
        /* Disable caching on SMRAM again, to prevent the user from whacking us. */
        WRMSR(0x202, RDMSR(0x202) & ~(0xFFULL));
 }
        /* Disable caching on SMRAM again, to prevent the user from whacking us. */
        WRMSR(0x202, RDMSR(0x202) & ~(0xFFULL));
 }
This page took 0.027928 seconds and 4 git commands to generate.