Avoids nehalem keyboard issues, better monitors
[akaros.git] / kern / arch / i686 / cpuinfo.c
index 2a59bde..ff05d48 100644 (file)
@@ -79,6 +79,31 @@ void print_cpuinfo(void)
        } else { 
                printk("Hardware virtualization not supported\n");
        }
+       /* FP and SSE Checks */
+       if (edx & 0x00000001)
+               printk("FPU Detected\n");
+       else
+               panic("FPU Not Detected!!\n");
+       printk("SSE support: ");
+       if (edx & (1 << 25))
+               printk("sse ");
+       else
+               panic("SSE Support Not Detected!!\n");
+       if (edx & (1 << 26))
+               printk("sse2 ");
+       if (ecx & (1 << 0))
+               printk("sse3 ");
+       if (ecx & (1 << 9))
+               printk("ssse3 ");
+       if (ecx & (1 << 19))
+               printk("sse4.1 ");
+       if (ecx & (1 << 20))
+               printk("sse4.2 ");
+       if (edx & (1 << 23))
+               printk("mmx ");
+       if ((edx & (1 << 25)) && (!(edx & (1 << 24))))
+               panic("SSE support, but no FXSAVE!");
+       printk("\n");
        cpuid(0x80000008, &eax, &ebx, &ecx, &edx);
        cprintf("Physical Address Bits: %d\n", eax & 0x000000FF);
        cprintf("Cores per Die: %d\n", (ecx & 0x000000FF) + 1);
@@ -139,7 +164,7 @@ void backtrace(void)
        eip = *(ebp + 1) - 1;
        // jump back a frame (out of backtrace)
        ebp = (uint32_t*)(*ebp);
-       cprintf("Stack Backtrace:\n");
+       printk("Stack Backtrace on Core %d:\n", core_id());
        // on each iteration, ebp holds the stack frame and eip an addr in that func
        while (ebp != 0) {
                debuginfo_eip(eip, &debuginfo);
@@ -155,17 +180,25 @@ void backtrace(void)
                cprintf("\n");
                eip = *(ebp + 1) - 1;
                ebp = (uint32_t*)(*ebp);
+               #ifdef __CONFIG_RESET_STACKS__
+               if (!strncmp("__smp_idle", debuginfo.eip_fn_name, 10))
+                       break;
+               #endif /* __CONFIG_RESET_STACKS__ */
        }
 }
 
 /* Like backtrace, this is probably not the best place for this. */
 void spinlock_debug(spinlock_t *lock)
 {
-#ifdef SPINLOCK_DEBUG
+#ifdef __CONFIG_SPINLOCK_DEBUG__
        eipdebuginfo_t debuginfo;
        char buf[256];
        uint32_t eip = (uint32_t)lock->call_site;
 
+       if (!eip) {
+               printk("Lock %p: never locked\n", lock);
+               return;
+       }
        debuginfo_eip(eip, &debuginfo);
        memset(buf, 0, 256);
        strncpy(buf, debuginfo.eip_fn_name, MIN(debuginfo.eip_fn_namelen, 256));