diff --git a/kernel/arch/x86_64/interrupts.S b/kernel/arch/x86_64/interrupts.S index ad6aa971..eacf910a 100644 --- a/kernel/arch/x86_64/interrupts.S +++ b/kernel/arch/x86_64/interrupts.S @@ -163,7 +163,11 @@ syscall_asm: movq %rax, %rdi movq %rbx, %rsi xchgq %rcx, %rdx + movq %rsp, %rbx + addq $120, %rbx + pushq %rbx call cpp_syscall_handler + addq $8, %rsp popaq_no_rax addq $8, %rsp iretq \ No newline at end of file diff --git a/kernel/include/kernel/InterruptStack.h b/kernel/include/kernel/InterruptStack.h new file mode 100644 index 00000000..84416b5f --- /dev/null +++ b/kernel/include/kernel/InterruptStack.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +namespace Kernel +{ + + struct InterruptStack + { + uint64_t rip; + uint64_t cs; + uint64_t flags; + uint64_t rsp; + uint64_t ss; + }; + +} \ No newline at end of file diff --git a/kernel/kernel/Syscall.cpp b/kernel/kernel/Syscall.cpp index c112f029..219828ff 100644 --- a/kernel/kernel/Syscall.cpp +++ b/kernel/kernel/Syscall.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -17,7 +18,7 @@ namespace Kernel extern "C" long sys_fork_trampoline(); - extern "C" long cpp_syscall_handler(int syscall, uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5) + extern "C" long cpp_syscall_handler(int syscall, uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5, InterruptStack& interrupt_stack) { Thread::current().set_in_syscall(true); @@ -28,6 +29,7 @@ namespace Kernel (void)arg3; (void)arg4; (void)arg5; + (void)interrupt_stack; BAN::ErrorOr ret = BAN::Error::from_errno(ENOSYS);