소스 검색

Kernel: Initialize the CPU to allow SSE on startup.

I still need to add support for SSE to the context switching code, but now
at least one process can use it.
Andreas Kling 6 년 전
부모
커밋
750d79dcaf
3개의 변경된 파일16개의 추가작업 그리고 0개의 파일을 삭제
  1. 13 0
      Kernel/i386.cpp
  2. 1 0
      Kernel/i386.h
  3. 2 0
      Kernel/init.cpp

+ 13 - 0
Kernel/i386.cpp

@@ -493,3 +493,16 @@ void __assertion_failed(const char* msg, const char* file, unsigned line, const
     asm volatile("hlt");
     asm volatile("hlt");
     for (;;);
     for (;;);
 }
 }
+
+void sse_init()
+{
+    asm volatile(
+        "mov %cr0, %eax\n"
+        "andl $0xfffffffb, %eax\n"
+        "orl $0x2, %eax\n"
+        "mov %eax, %cr0\n"
+        "mov %cr4, %eax\n"
+        "orl $0x600, %eax\n"
+        "mov %eax, %cr4\n"
+    );
+}

+ 1 - 0
Kernel/i386.h

@@ -61,6 +61,7 @@ class IRQHandler;
 
 
 void gdt_init();
 void gdt_init();
 void idt_init();
 void idt_init();
+void sse_init();
 void register_interrupt_handler(byte number, void (*f)());
 void register_interrupt_handler(byte number, void (*f)());
 void register_user_callable_interrupt_handler(byte number, void (*f)());
 void register_user_callable_interrupt_handler(byte number, void (*f)());
 void register_irq_handler(byte number, IRQHandler&);
 void register_irq_handler(byte number, IRQHandler&);

+ 2 - 0
Kernel/init.cpp

@@ -140,6 +140,8 @@ VFS* vfs;
 {
 {
     cli();
     cli();
 
 
+    sse_init();
+
     kmalloc_init();
     kmalloc_init();
     init_ksyms();
     init_ksyms();