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

Patrick Rudolph (siro@das-labor.org) gerrit at coreboot.org
Sat Feb 25 10:06:03 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 065515982ebd9360878b5dc480a1fcb903add55d
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/head.S | 43 +++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/payloads/libpayload/arch/x86/head.S b/payloads/libpayload/arch/x86/head.S
index 94a4d41..7f2ea15 100644
--- a/payloads/libpayload/arch/x86/head.S
+++ b/payloads/libpayload/arch/x86/head.S
@@ -2,6 +2,7 @@
  * This file is part of the libpayload project.
  *
  * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ * Copyright (C) 2017 Patrick Rudolph <siro at das-labor.org>
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -89,6 +90,48 @@ _init:
 	movl $_stack, %esp
 	pushl %eax
 
+	/* Enable special x86 functions if present. */
+	pushl %eax
+	pushl %ebx
+	pushl %ecx
+	pushl %edx
+
+	movl $0, %eax
+	cpuid
+	/* Test if CPUID(eax=1) is available. */
+	test %eax, %eax
+	je cpuid_done
+
+	/* Get CPU features. */
+	movl $1, %eax
+	cpuid
+
+cpuid_fpu:
+	/* Test if x87 FPU is present */
+	test $1, %edx
+	je cpuid_see
+
+	fninit
+	movl %cr0, %eax
+	andl $0xFFFFFFFB, %eax	/* clear EM */
+	orl $0x00000022, %eax	/* set MP, NE */
+	movl %eax, %cr0
+
+cpuid_see:
+	/* Test if SSE is available */
+	test $0x02000000, %edx
+	je cpuid_done
+
+	movl %cr4, %eax
+	orl $0x00000600, %eax	/* set OSFXSR, OSXMMEXCPT */
+	movl %eax, %cr4
+
+cpuid_done:
+	popl %edx
+	popl %ecx
+	popl %ebx
+	popl %eax
+
 	/* Let's rock. */
 	call start_main
 



More information about the coreboot-gerrit mailing list