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

[tyndur-devel] [PATCH] SSE aktivieren, um #UD zu verhindern



+ SSE wird während des init-Prozesses aktiviert, um etwaige #UD, die
durch vom Compiler zur Optimierung oder zum Handling von 64 bit Integern
eingefügte SSE Operation entstehen können, zu verhindern

Signed-off-by: Patrick Pokatilo <shyxormz@xxxxxxxxxx>
---
 src/kernel2/src/init.c |   25 ++++++++++++++++++++++++-
 1 files changed, 24 insertions(+), 1 deletions(-)

diff --git a/src/kernel2/src/init.c b/src/kernel2/src/init.c
index a4d16d5..fc9bebd 100644
--- a/src/kernel2/src/init.c
+++ b/src/kernel2/src/init.c
@@ -174,7 +174,30 @@ void init(int multiboot_magic, struct multiboot_info *boot_info, bool bsp)
     static volatile uint32_t cpus_arrived = 0;
     locked_increment(&cpus_arrived);
     while (cpus_arrived < cpu_count) asm("nop");
-    
+
+    // 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
 
     static volatile lock_t vmm_lock = LOCK_LOCKED; 
     // ACHTUNG: Hier besteht ein kleines Problem: Da in vmm_init der APIC
-- 
1.7.0.4