Basic FP support on x86
authorBarret Rhoden <brho@cs.berkeley.edu>
Sun, 25 Apr 2010 00:08:53 +0000 (17:08 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:44 +0000 (17:35 -0700)
It doesn't save or restore, but it at least makes sure the FP units are
initialized.

kern/arch/i686/cpuinfo.c
kern/arch/i686/smp_boot.c

index 41e7930..523be5a 100644 (file)
@@ -79,6 +79,29 @@ 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 ");
+       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);
index 81fe732..0fd7919 100644 (file)
@@ -301,6 +301,9 @@ void smp_percpu_init(void)
 {
        uint32_t coreid = core_id();
 
+       /* Ensure the FPU units are initialized */
+       asm volatile ("fninit");
+
        /* core 0 sets up via the global gdt symbol */
        if (!coreid)
                per_cpu_info[0].gdt = gdt;