[coreboot-gerrit] Patch set updated for coreboot: libpayload: Enable SSE and FPU when present

Patrick Rudolph (siro@das-labor.org) gerrit at coreboot.org
Wed Feb 15 18:55:59 CET 2017


Patrick Rudolph (siro at das-labor.org) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/18345

-gerrit

commit ac75e44df87f23c98123767ef7e62dd749748d43
Author: Patrick Rudolph <siro at das-labor.org>
Date:   Sun Jan 15 10:49:48 2017 +0100

    libpayload: Enable SSE and FPU when present
    
    Use cpuid feature bits to detect and enable FPU and
    SSE instructions.
    
    Allows to use SSE and floating point in payloads without digging to
    much into x86 assembly code.
    
    Required for x86 SSE memcpy.
    
    Change-Id: I4a5fc633f158de421b70435a8bfdc0dcaa504c72
    Signed-off-by: Patrick Rudolph <siro at das-labor.org>
---
 payloads/libpayload/arch/x86/main.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/payloads/libpayload/arch/x86/main.c b/payloads/libpayload/arch/x86/main.c
index fbd4dc4..9376264 100644
--- a/payloads/libpayload/arch/x86/main.c
+++ b/payloads/libpayload/arch/x86/main.c
@@ -29,6 +29,7 @@
 
 #include <exception.h>
 #include <libpayload.h>
+#include <arch/cpuid.h>
 
 unsigned long loader_eax;  /**< The value of EAX passed from the loader */
 unsigned long loader_ebx;  /**< The value of EBX passed from the loader */
@@ -47,6 +48,34 @@ void start_main(void)
 {
 	extern int main(int argc, char **argv);
 
+#if IS_ENABLED(CONFIG_LP_GPL)
+	/* Optionally set up cpuid */
+	get_cpuid();
+
+	/* Enable floating point processing */
+	if (cpu_id.fid.bits.fpu)
+		__asm__ __volatile__ (
+			"fninit\n\t"
+			"movl %%cr0, %%eax\n\t"
+			"andl $0xFFFFFFFB, %%eax\n\t"	/* clear EM */
+			"orl $0x00000022, %%eax\n\t"		/* set MP, NE */
+			"movl %%eax, %%cr0\n\t"
+			: :
+			: "ax"
+		);
+#ifdef __SSE__
+	/* Enable SSE instructions */
+	if (cpu_id.fid.bits.sse)
+		__asm__ __volatile__ (
+			"movl %%cr4, %%eax\n\t"
+			"orl $0x00000600, %%eax\n\t" /* set OSFXSR, OSXMMEXCPT */
+			"movl %%eax, %%cr4\n\t"
+			: :
+			: "ax"
+		);
+#endif
+#endif
+
 	/* Gather system information. */
 	lib_get_sysinfo();
 



More information about the coreboot-gerrit mailing list