From b085050fa5980434ffa95e54d76656234c697753 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Mon, 20 Jan 2014 19:24:08 +0100 Subject: [PATCH] Fix usermode->kernelmode transition --- kernel/include/gdt.hpp | 3 ++- kernel/src/interrupts.cpp | 2 +- kernel/src/shell.cpp | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/kernel/include/gdt.hpp b/kernel/include/gdt.hpp index 63781c9c..30475b66 100644 --- a/kernel/include/gdt.hpp +++ b/kernel/include/gdt.hpp @@ -90,7 +90,8 @@ static_assert(sizeof(tss_descriptor_t) == 16, "TSS descriptor in long mode is 16 struct task_state_segment_t { uint32_t reserved_0; - uint64_t rsp0; + uint32_t rsp0_low; + uint32_t rsp0_high; uint64_t rsp1; uint64_t rsp2; uint64_t reserved_1; diff --git a/kernel/src/interrupts.cpp b/kernel/src/interrupts.cpp index b4940a45..02fc3d3b 100644 --- a/kernel/src/interrupts.cpp +++ b/kernel/src/interrupts.cpp @@ -154,7 +154,7 @@ void install_irqs(){ } void install_syscalls(){ - idt_set_gate(interrupt::SYSCALL_FIRST, _syscall0, gdt::LONG_SELECTOR, 0xEE); + idt_set_gate(interrupt::SYSCALL_FIRST+0, _syscall0, gdt::LONG_SELECTOR, 0xEE); idt_set_gate(interrupt::SYSCALL_FIRST+1, _syscall1, gdt::LONG_SELECTOR, 0xEE); idt_set_gate(interrupt::SYSCALL_FIRST+2, _syscall2, gdt::LONG_SELECTOR, 0xEE); idt_set_gate(interrupt::SYSCALL_FIRST+3, _syscall3, gdt::LONG_SELECTOR, 0xEE); diff --git a/kernel/src/shell.cpp b/kernel/src/shell.cpp index 956d31a7..aa8cbda6 100644 --- a/kernel/src/shell.cpp +++ b/kernel/src/shell.cpp @@ -913,7 +913,8 @@ void exec_command(const std::vector& params){ if(stack_physical){ uint64_t rsp; asm volatile("mov %0, rsp;" : "=m" (rsp)); - gdt::tss.rsp0 = rsp; + gdt::tss.rsp0_low = rsp; + gdt::tss.rsp0_high = rsp >> 32; asm volatile("mov ax, %0; mov ds, ax; mov es, ax; mov fs, ax; mov gs, ax;" : //No outputs