]> Joshua Wise's Git repositories - netwatch.git/commitdiff
Add TSC checks to measure how much time we spend in SMM.
authorJoshua Wise <joshua@escape.wv.cc.cmu.edu>
Mon, 12 Oct 2009 03:05:43 +0000 (23:05 -0400)
committerJoshua Wise <joshua@escape.wv.cc.cmu.edu>
Mon, 12 Oct 2009 03:05:43 +0000 (23:05 -0400)
netwatch/smi.c

index 88570a6bbc80582abf1d26acaea5586d142ece25..3172cfd29d112a7b9e398d34704e8edd14c3414e 100644 (file)
@@ -25,26 +25,56 @@ unsigned int counter = 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];
+       unsigned long entrytime;
 
        /* Reenable caching on SMRAM. */
        WRMSR(0x202, (RDMSR(0x202) & ~(0xFFULL)) | 0x06ULL);
 
+       entrytime = rdtsc();
+
        pcisave = inl(0xCF8);
        vgasave = inb(0x3D4);
        pci_unbother_all();
        
        serial_init();
-       
+
        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);
        }
        
@@ -66,6 +96,13 @@ void smi_entry(void)
        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));
 }
This page took 0.02937 seconds and 4 git commands to generate.