x86: fixes early core_id() calls
[akaros.git] / kern / arch / x86 / cpuinfo.c
index 1e81e20..2ec57c5 100644 (file)
@@ -27,6 +27,10 @@ void print_cpuinfo(void)
        char vendor_id[13];
        extern char (SNT RO _start)[];
 
+       if (sizeof(long) == 8)
+               printk("64 bit Kernel Booting...\n");
+       else
+               printk("32 bit Kernel Booting...\n");
        asm volatile ("cpuid;"
                  "movl    %%ebx, (%2);"
                  "movl    %%edx, 4(%2);"
@@ -107,33 +111,42 @@ void print_cpuinfo(void)
        printk("\n");
        cpuid(0x80000008, 0x0, &eax, &ebx, &ecx, &edx);
        cprintf("Physical Address Bits: %d\n", eax & 0x000000FF);
-       cprintf("Cores per Die: %d\n", (ecx & 0x000000FF) + 1);
-    cprintf("This core's Default APIC ID: 0x%08x\n", lapic_get_default_id());
        msr_val = read_msr(IA32_APIC_BASE);
-       if (msr_val & MSR_APIC_ENABLE)
-               cprintf("Local APIC Enabled\n");
-       else
-               cprintf("Local APIC Disabled\n");
-       if (msr_val & 0x00000100)
-               cprintf("I am the Boot Strap Processor\n");
-       else
-               cprintf("I am an Application Processor\n");
+       if (!(msr_val & MSR_APIC_ENABLE))
+               panic("Local APIC Disabled!!");
        cpuid(0x80000007, 0x0, &eax, &ebx, &ecx, &edx);
        if (edx & 0x00000100)
                printk("Invariant TSC present\n");
        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))
@@ -145,6 +158,14 @@ void print_cpuinfo(void)
                printk("Always running APIC *not* detected\n");
 }
 
+#ifdef CONFIG_X86_64
+#define BIT_SPACING "        "
+#define BIT_DASHES "----------------"
+#else
+#define BIT_SPACING ""
+#define BIT_DASHES ""
+#endif
+
 void show_mapping(uintptr_t start, size_t size)
 {
        pde_t *pgdir = (pde_t*)vpd;
@@ -153,8 +174,9 @@ void show_mapping(uintptr_t start, size_t size)
        page_t *page;
        uintptr_t i;
 
-       printk("   Virtual    Physical  Ps Dr Ac CD WT U W P\n");
-       printk("--------------------------------------------\n");
+       printk("   %sVirtual    %sPhysical  Ps Dr Ac CD WT U W P\n", BIT_SPACING,
+              BIT_SPACING);
+       printk("--------------------------------------------%s\n", BIT_DASHES);
        for(i = 0; i < size; i += PGSIZE, start += PGSIZE) {
                pte = pgdir_walk(pgdir, (void*)start, 0);
                printk("%p  ", start);
@@ -171,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
-}
-