From 19b68b7e9f59c00df6d2d894ab0a287bc195304b Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sat, 18 Jan 2014 17:59:05 +0100 Subject: [PATCH] Improve system call systems --- kernel/include/interrupts.hpp | 6 ++++ kernel/src/interrupts.cpp | 6 ++-- kernel/src/syscalls.s | 68 +++++++++++++++-------------------- kernel/src/system_calls.cpp | 2 +- 4 files changed, 38 insertions(+), 44 deletions(-) diff --git a/kernel/include/interrupts.hpp b/kernel/include/interrupts.hpp index 0d61a86b..e8b609bc 100644 --- a/kernel/include/interrupts.hpp +++ b/kernel/include/interrupts.hpp @@ -32,6 +32,12 @@ struct syscall_regs { uint64_t rdx; uint64_t rsi; uint64_t rdi; + uint64_t r8; + uint64_t r9; + uint64_t r10; + uint64_t r11; + uint64_t r12; + uint64_t code; } __attribute__((packed)); void setup_interrupts(); diff --git a/kernel/src/interrupts.cpp b/kernel/src/interrupts.cpp index dfac9a8d..697bdfc6 100644 --- a/kernel/src/interrupts.cpp +++ b/kernel/src/interrupts.cpp @@ -241,11 +241,9 @@ void _irq_handler(size_t code){ } void _syscall_handler(interrupt::syscall_regs regs){ - auto code = regs.rdi; - //If there is a handler call, it - if(syscall_handlers[code]){ - syscall_handlers[code](regs); + if(syscall_handlers[regs.code]){ + syscall_handlers[regs.code](regs); } //TODO Emit an error somehow if there is no handler diff --git a/kernel/src/syscalls.s b/kernel/src/syscalls.s index 731f1fbe..cb6373c2 100644 --- a/kernel/src/syscalls.s +++ b/kernel/src/syscalls.s @@ -24,80 +24,70 @@ _syscall0: cli - push rdi - mov rdi, 0 + push 0 jmp syscall_common_handler _syscall1: cli - push rdi - mov rdi, 1 + push 1 jmp syscall_common_handler _syscall2: cli - push rdi - mov rdi, 2 + push 2 jmp syscall_common_handler _syscall3: cli - push rdi - mov rdi, 3 + push 3 jmp syscall_common_handler _syscall4: cli - push rdi - mov rdi, 4 + push 4 jmp syscall_common_handler _syscall5: cli - push rdi - mov rdi, 5 + push 5 jmp syscall_common_handler _syscall6: cli - push rdi - mov rdi, 6 + push 6 jmp syscall_common_handler _syscall7: cli - push rdi - mov rdi, 7 + push 7 jmp syscall_common_handler _syscall8: cli - push rdi - mov rdi, 8 + push 8 jmp syscall_common_handler _syscall9: cli - push rdi - mov rdi, 9 + push 9 jmp syscall_common_handler @@ -105,33 +95,33 @@ _syscall9: //TODO Check if really safe to trash r12 syscall_common_handler: - push r8 - push r9 - push r10 - push r11 push r12 - push rax - push rbx - push rcx - push rdx - push rsi + push r11 + push r10 + push r9 + push r8 push rdi + push rsi + push rdx + push rcx + push rbx + push rax call _syscall_handler - pop rdi - pop rsi - pop rdx - pop rcx - pop rbx pop rax - pop r12 - pop r11 - pop r10 - pop r9 + pop rbx + pop rcx + pop rdx + pop rsi + pop rdi pop r8 + pop r9 + pop r10 + pop r11 + pop r12 //Was pushed by the base handler code - pop rdi + add rsp, 8 iretq // iret will clean the other automatically pushed stuff diff --git a/kernel/src/system_calls.cpp b/kernel/src/system_calls.cpp index 2017a4ba..5807ffdd 100644 --- a/kernel/src/system_calls.cpp +++ b/kernel/src/system_calls.cpp @@ -13,5 +13,5 @@ void system_call_entry(const interrupt::syscall_regs& regs){ } void install_system_calls(){ - interrupt::register_syscall_handler(interrupt::SYSCALL_FIRST, &system_call_entry); + interrupt::register_syscall_handler(0, &system_call_entry); }