Przeglądaj źródła

Kernel: Clear the x86 DF flag when entering the kernel

The SysV ABI says that the DF flag should be clear on function entry.
That means we have to clear it when jumping into the kernel from some
random userspace context.
Andreas Kling 5 lat temu
rodzic
commit
b285a1944e
3 zmienionych plików z 33 dodań i 28 usunięć
  1. 31 28
      Kernel/Arch/i386/CPU.cpp
  2. 1 0
      Kernel/Arch/i386/PIT.cpp
  3. 1 0
      Kernel/Syscall.cpp

+ 31 - 28
Kernel/Arch/i386/CPU.cpp

@@ -55,6 +55,7 @@ asm(
     "    pushw %ss\n"
     "    pushw %ss\n"
     "    popw %ds\n"
     "    popw %ds\n"
     "    popw %es\n"
     "    popw %es\n"
+    "    cld\n"
     "    call handle_irq\n"
     "    call handle_irq\n"
     "    popw %es\n"
     "    popw %es\n"
     "    popw %ds\n"
     "    popw %ds\n"
@@ -82,6 +83,7 @@ asm(
         "    popw %es\n"                                    \
         "    popw %es\n"                                    \
         "    popw %fs\n"                                    \
         "    popw %fs\n"                                    \
         "    popw %gs\n"                                    \
         "    popw %gs\n"                                    \
+        "    cld\n"                                         \
         "    call exception_" #ec "_handler\n"              \
         "    call exception_" #ec "_handler\n"              \
         "    popw %gs\n"                                    \
         "    popw %gs\n"                                    \
         "    popw %gs\n"                                    \
         "    popw %gs\n"                                    \
@@ -92,35 +94,36 @@ asm(
         "    add $0x4, %esp\n"                              \
         "    add $0x4, %esp\n"                              \
         "    iret\n");
         "    iret\n");
 
 
-#define EH_ENTRY_NO_CODE(ec)                                 \
+#define EH_ENTRY_NO_CODE(ec)                                \
     extern "C" void exception_##ec##_handler(RegisterDump); \
     extern "C" void exception_##ec##_handler(RegisterDump); \
-    extern "C" void exception_##ec##_entry();                \
-    asm(                                                     \
-        ".globl exception_" #ec "_entry\n"                   \
-        "exception_" #ec "_entry: \n"                        \
-        "    pushl $0x0\n"                                   \
-        "    pusha\n"                                        \
-        "    pushw %ds\n"                                    \
-        "    pushw %es\n"                                    \
-        "    pushw %fs\n"                                    \
-        "    pushw %gs\n"                                    \
-        "    pushw %ss\n"                                    \
-        "    pushw %ss\n"                                    \
-        "    pushw %ss\n"                                    \
-        "    pushw %ss\n"                                    \
-        "    pushw %ss\n"                                    \
-        "    popw %ds\n"                                     \
-        "    popw %es\n"                                     \
-        "    popw %fs\n"                                     \
-        "    popw %gs\n"                                     \
-        "    call exception_" #ec "_handler\n"               \
-        "    popw %gs\n"                                     \
-        "    popw %gs\n"                                     \
-        "    popw %fs\n"                                     \
-        "    popw %es\n"                                     \
-        "    popw %ds\n"                                     \
-        "    popa\n"                                         \
-        "    add $0x4, %esp\n"                               \
+    extern "C" void exception_##ec##_entry();               \
+    asm(                                                    \
+        ".globl exception_" #ec "_entry\n"                  \
+        "exception_" #ec "_entry: \n"                       \
+        "    pushl $0x0\n"                                  \
+        "    pusha\n"                                       \
+        "    pushw %ds\n"                                   \
+        "    pushw %es\n"                                   \
+        "    pushw %fs\n"                                   \
+        "    pushw %gs\n"                                   \
+        "    pushw %ss\n"                                   \
+        "    pushw %ss\n"                                   \
+        "    pushw %ss\n"                                   \
+        "    pushw %ss\n"                                   \
+        "    pushw %ss\n"                                   \
+        "    popw %ds\n"                                    \
+        "    popw %es\n"                                    \
+        "    popw %fs\n"                                    \
+        "    popw %gs\n"                                    \
+        "    cld\n"                                         \
+        "    call exception_" #ec "_handler\n"              \
+        "    popw %gs\n"                                    \
+        "    popw %gs\n"                                    \
+        "    popw %fs\n"                                    \
+        "    popw %es\n"                                    \
+        "    popw %ds\n"                                    \
+        "    popa\n"                                        \
+        "    add $0x4, %esp\n"                              \
         "    iret\n");
         "    iret\n");
 
 
 static void dump(const RegisterDump& regs)
 static void dump(const RegisterDump& regs)

+ 1 - 0
Kernel/Arch/i386/PIT.cpp

@@ -27,6 +27,7 @@ asm(
     "    popw %es\n"
     "    popw %es\n"
     "    popw %fs\n"
     "    popw %fs\n"
     "    popw %gs\n"
     "    popw %gs\n"
+    "    cld\n"
     "    call timer_interrupt_handler\n"
     "    call timer_interrupt_handler\n"
     "    popw %gs\n"
     "    popw %gs\n"
     "    popw %gs\n"
     "    popw %gs\n"

+ 1 - 0
Kernel/Syscall.cpp

@@ -24,6 +24,7 @@ asm(
     "    popw %es\n"
     "    popw %es\n"
     "    popw %fs\n"
     "    popw %fs\n"
     "    popw %gs\n"
     "    popw %gs\n"
+    "    cld\n"
     "    call syscall_trap_entry\n"
     "    call syscall_trap_entry\n"
     "    popw %gs\n"
     "    popw %gs\n"
     "    popw %gs\n"
     "    popw %gs\n"