x86: Display basic CPU information on boot
authorSimon Glass <sjg@chromium.org>
Fri, 10 Oct 2014 14:21:54 +0000 (08:21 -0600)
committerSimon Glass <sjg@chromium.org>
Wed, 29 Oct 2014 02:42:56 +0000 (20:42 -0600)
Display the type of CPU (x86 or x86_64) when starting up.

Signed-off-by: Simon Glass <sjg@chromium.org>
arch/x86/cpu/cpu.c
arch/x86/include/asm/cpu.h
include/configs/coreboot.h

index 7a4de29..8c1eacc 100644 (file)
@@ -275,3 +275,67 @@ void cpu_disable_paging_pae(void)
                :
                : "eax");
 }
+
+static bool has_cpuid(void)
+{
+       unsigned long flag;
+
+       asm volatile("pushf\n" \
+               "pop %%eax\n"
+               "mov %%eax, %%ecx\n"    /* ecx = flags */
+               "xor %1, %%eax\n"
+               "push %%eax\n"
+               "popf\n"                /* flags ^= $2 */
+               "pushf\n"
+               "pop %%eax\n"           /* eax = flags */
+               "push %%ecx\n"
+               "popf\n"                /* flags = ecx */
+               "xor %%ecx, %%eax\n"
+               "mov %%eax, %0"
+               : "=r" (flag)
+               : "i" (1 << 21)
+               : "eax", "ecx", "memory");
+
+       return flag != 0;
+}
+
+static bool can_detect_long_mode(void)
+{
+       unsigned long flag;
+
+       asm volatile("mov $0x80000000, %%eax\n"
+               "cpuid\n"
+               "mov %%eax, %0"
+               : "=r" (flag)
+               :
+               : "eax", "ebx", "ecx", "edx", "memory");
+
+       return flag > 0x80000000UL;
+}
+
+static bool has_long_mode(void)
+{
+       unsigned long flag;
+
+       asm volatile("mov $0x80000001, %%eax\n"
+               "cpuid\n"
+               "mov %%edx, %0"
+               : "=r" (flag)
+               :
+               : "eax", "ebx", "ecx", "edx", "memory");
+
+       return flag & (1 << 29) ? true : false;
+}
+
+int cpu_has_64bit(void)
+{
+       return has_cpuid() && can_detect_long_mode() &&
+               has_long_mode();
+}
+
+int print_cpuinfo(void)
+{
+       printf("CPU:   %s\n", cpu_has_64bit() ? "x86_64" : "x86");
+
+       return 0;
+}
index 2938087..32930bd 100644 (file)
@@ -19,4 +19,11 @@ void cpu_enable_paging_pae(ulong cr3);
  */
 void cpu_disable_paging_pae(void);
 
+/**
+ * cpu_has_64bit() - Check if the CPU has 64-bit support
+ *
+ * @return 1 if this CPU supports long mode (64-bit), 0 if not
+ */
+int cpu_has_64bit(void);
+
 #endif
index 4b90dc2..a65d89b 100644 (file)
@@ -26,6 +26,7 @@
 #define CONFIG_PHYSMEM
 #define CONFIG_SYS_EARLY_PCI_INIT
 #define CONFIG_DISPLAY_BOARDINFO_LATE
+#define CONFIG_DISPLAY_CPUINFO
 
 #define CONFIG_DM
 #define CONFIG_CMD_DM