Skip to content

Commit

Permalink
Kernel: Clear the x86 DF flag when entering the kernel
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
awesomekling committed Nov 9, 2019
1 parent fbeb1ab commit b285a19
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 28 deletions.
59 changes: 31 additions & 28 deletions Kernel/Arch/i386/CPU.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ asm(
" pushw %ss\n"
" popw %ds\n"
" popw %es\n"
" cld\n"
" call handle_irq\n"
" popw %es\n"
" popw %ds\n"
Expand Down Expand Up @@ -82,6 +83,7 @@ asm(
" popw %es\n" \
" popw %fs\n" \
" popw %gs\n" \
" cld\n" \
" call exception_" #ec "_handler\n" \
" popw %gs\n" \
" popw %gs\n" \
Expand All @@ -92,35 +94,36 @@ asm(
" add $0x4, %esp\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##_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");

static void dump(const RegisterDump& regs)
Expand Down
1 change: 1 addition & 0 deletions Kernel/Arch/i386/PIT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ asm(
" popw %es\n"
" popw %fs\n"
" popw %gs\n"
" cld\n"
" call timer_interrupt_handler\n"
" popw %gs\n"
" popw %gs\n"
Expand Down
1 change: 1 addition & 0 deletions Kernel/Syscall.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ asm(
" popw %es\n"
" popw %fs\n"
" popw %gs\n"
" cld\n"
" call syscall_trap_entry\n"
" popw %gs\n"
" popw %gs\n"
Expand Down

0 comments on commit b285a19

Please sign in to comment.