[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH] kernel2: auf Vorhandensein von SSE prüfen vor dem versuch es zu aktivieren ;)



! auf älteren CPUs ohne sse hatte der init code einen GP gebaut wegen nicht vorhandenen Bits in cr4. Check für
Vorhandensein davor eingebaut

Signed-off-by: Stefan Linke <particleflux@xxxxxxxxxxxxxx>
---
 src/kernel2/src/init.c |   48 ++++++++++++++++++++++++++----------------------
 1 files changed, 26 insertions(+), 22 deletions(-)

diff --git a/src/kernel2/src/init.c b/src/kernel2/src/init.c
index 08c0a71..37bc60e 100644
--- a/src/kernel2/src/init.c
+++ b/src/kernel2/src/init.c
@@ -219,28 +219,32 @@ void init(int multiboot_magic, struct multiboot_info *boot_info, bool bsp)
 
     // SSE aktivieren
     // TODO: Buildscripts fixen?
-    #if CONFIG_ARCH == ARCH_AMD64
-        asm volatile(
-            "movq %cr0, %rax;"
-            "andq $0xfffffffffffffffb, %rax;"
-            "orq $2, %rax;"
-            "movq %rax, %cr0;"
-            "movq %cr4, %rax;"
-            "orq $0x600, %rax;"
-            "movq %rax, %cr4;"
-            );
-    #else
-        asm volatile(
-            "movl %cr0, %eax;"
-            "andl $0xfffffffb, %eax;"
-            "orl $2, %eax;"
-            "movl %eax, %cr0;"
-            "movl %cr4, %eax;"
-            "orl $0x600, %eax;"
-            "movl %eax, %cr4;"
-        );
-    #endif
-
+	uint32_t edx=0;
+	asm volatile("cpuid": "=d" (edx) : "a" (1) : "ebx", "ecx");
+	if ((edx & (1 << 24)) && (edx & (1 << 25))) {	// check if FXSR and SSE bits are set
+		#if CONFIG_ARCH == ARCH_AMD64
+			asm volatile(
+				"movq %cr0, %rax;"
+				"andq $0xfffffffffffffffb, %rax;"
+				"orq $2, %rax;"
+				"movq %rax, %cr0;"
+				"movq %cr4, %rax;"
+				"orq $0x600, %rax;"
+				"movq %rax, %cr4;"
+				);
+		#else
+			asm volatile(
+				"movl %cr0, %eax;"
+				"andl $0xfffffffb, %eax;"
+				"orl $2, %eax;"
+				"movl %eax, %cr0;"
+				"movl %cr4, %eax;"
+				"orl $0x600, %eax;"
+				"movl %eax, %cr4;"
+			);
+		#endif
+	}
+	
     static volatile lock_t vmm_lock = LOCK_LOCKED;
     // ACHTUNG: Hier besteht ein kleines Problem: Da in vmm_init der APIC
     // gemappt wird, kann nicht mehr darauf zugegriffen werden, bis Paging
-- 
1.7.8.6