x86: fixes early core_id() calls
[akaros.git] / kern / arch / x86 / cpuinfo.c
index e110bf9..2ec57c5 100644 (file)
@@ -120,16 +120,33 @@ void print_cpuinfo(void)
        else
                printk("Invariant TSC not present\n");
        cpuid(0x07, 0x0, &eax, &ebx, &ecx, &edx);
-       if (ebx & 0x00000001)
+       if (ebx & 0x00000001) {
                printk("FS/GS Base RD/W supported\n");
-       else
+               /* Untested, since we don't have a machine that supports this.  Email us
+                * if this fails. */
+               printk("Attempting to enable WRFSBASE...\n");
+               lcr4(rcr4() | (1 << 16));
+       } else {
                printk("FS/GS Base RD/W not supported\n");
+               #ifdef CONFIG_NOFASTCALL_FSBASE
+               printk("\nGIANT WARNING: Can't write FS Base from userspace, "
+                      "and no FASTCALL support!\n\n");
+               #endif
+       }
        cpuid(0x80000001, 0x0, &eax, &ebx, &ecx, &edx);
        if (edx & (1 << 27))
                printk("RDTSCP supported\n");
        else
                printk("RDTSCP not supported: don't trust detailed measurements\n");
+       printk("1 GB Jumbo pages %ssupported\n", edx & (1 << 26) ? "" : "not ");
        printk("FS/GS MSRs %ssupported\n", edx & (1 << 29) ? "" : "not ");
+       #ifdef CONFIG_X86_64
+       if (!(edx & (1 << 29))) {
+               printk("Can't handle no FS/GS MSRs!\n");
+               while (1)
+                       asm volatile ("hlt");
+       }
+       #endif
        msr_val = read_msr(IA32_MISC_ENABLE);
        /* we want this to be not set for cpuid.6h to work. */
        if (msr_val & (1 << 22))
@@ -176,25 +193,3 @@ void show_mapping(uintptr_t start, size_t size)
                }
        }
 }
-
-/* Like backtrace, this is probably not the best place for this. */
-void spinlock_debug(spinlock_t *lock)
-{
-#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));
-       buf[MIN(debuginfo.eip_fn_namelen, 255)] = 0;
-       printk("Lock %p: last locked at [<%p>] in %s(%p) on core %d\n", lock, eip, buf,
-              debuginfo.eip_fn_addr, lock->calling_core);
-#endif
-}
-