From: Amelia Coutard <eliottulio.coutard@gmail.com>
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