From: Amelia Coutard Date: Wed, 1 Mar 2023 14:19:32 +0000 (+0100) Subject: Added support for haing multiple different syscalls (via a call jump table) X-Git-Url: https://git.ameliathe1st.gay/?a=commitdiff_plain;h=173f7f49f0f6256d20d91b1e1f8b33e05870e7a2;p=voyage-au-centre-des-fichiers.git Added support for haing multiple different syscalls (via a call jump table) --- diff --git a/kernel/src/ring3.S b/kernel/src/ring3.S index 913772a..b0e4274 100644 --- a/kernel/src/ring3.S +++ b/kernel/src/ring3.S @@ -20,16 +20,28 @@ ftl_to_userspace: mov $0x202, %r11 # EFLAGS sysretq +.globl load_tss +load_tss: + mov $GDT.TSS, %ax + ltr %ax + ret + .globl syscall_64bit_handler syscall_64bit_handler: push %rcx mov %r10, %rcx - call syscall_64bit_handler_cpp + cmp $syscall_n, %rax + jae incorrect_syscall + callq *syscalls_call_table(, %rax, 8) + pop %rcx + sysretq +incorrect_syscall: + call syscall_rax_error_handler pop %rcx sysretq -.globl load_tss -load_tss: - mov $GDT.TSS, %ax - ltr %ax - ret +.section .rodata +syscalls_call_table: + .quad syscall_print + .quad syscall_println +.set syscall_n, 2 diff --git a/kernel/src/ring3.cpp b/kernel/src/ring3.cpp index d4eccbd..9cddf88 100644 --- a/kernel/src/ring3.cpp +++ b/kernel/src/ring3.cpp @@ -19,8 +19,6 @@ void os::set_ring0_stack(os::tss& tss, std::uint64_t stack) { tss.rsp0 = stack; } -extern "C" void syscall_64bit_handler(); - void os::enable_syscalls() { // Enable bit 0 (SYSCALL Enable) of msr IA32_EFER. // This is required to enable syscall/sysret on x86_64 intel. @@ -35,6 +33,15 @@ void os::enable_syscalls() { os::set_msr(0xC0000084, 0x00000000); // syscall flag mask, we don't want to change the flags for now. } -extern "C" void syscall_64bit_handler_cpp(std::uint64_t v) { - os::printc((char)v); +extern "C" void syscall_print(char v) { + os::printc(v); +} + +extern "C" void syscall_println(char v) { + os::printc(v); + os::printc('\n'); +} + +extern "C" void syscall_rax_error_handler() { + os::assert(false, "Incorrect %rax for syscall."); } diff --git a/kernel/src/ring3.hpp b/kernel/src/ring3.hpp index c1fc2e2..54077c9 100644 --- a/kernel/src/ring3.hpp +++ b/kernel/src/ring3.hpp @@ -35,9 +35,15 @@ struct __attribute__((packed)) tss { std::uint16_t iopb; }; -void set_ring0_stack(tss& tss, std::uint64_t stack); +extern "C" void ftl_to_userspace(void* program, std::byte* stack); extern "C" void load_tss(); +extern "C" void syscall_64bit_handler(); + +extern "C" void syscall_print(char c); +extern "C" void syscall_println(char c); +extern "C" void syscall_rax_error_handler(); + +void set_ring0_stack(tss& tss, std::uint64_t stack); void enable_syscalls(); -extern "C" void ftl_to_userspace(void* program, std::byte* stack); } // namespace os diff --git a/test_module/src/test.S b/test_module/src/test.S index 2931661..1815f3d 100644 --- a/test_module/src/test.S +++ b/test_module/src/test.S @@ -15,5 +15,6 @@ .globl print print: + mov $0, %rax syscall ret