From 0986058bb9ca5b4afd7c578c815dc3a4c08808a9 Mon Sep 17 00:00:00 2001 From: Fabian Imhof Date: Mon, 21 Apr 2025 08:18:41 +0000 Subject: WIP syscall --- .../generic_interrupt_handler.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'arch/x86_64/src/interrupt_handling') diff --git a/arch/x86_64/src/interrupt_handling/generic_interrupt_handler.cpp b/arch/x86_64/src/interrupt_handling/generic_interrupt_handler.cpp index 6075770..7afd87d 100644 --- a/arch/x86_64/src/interrupt_handling/generic_interrupt_handler.cpp +++ b/arch/x86_64/src/interrupt_handling/generic_interrupt_handler.cpp @@ -15,7 +15,27 @@ namespace teachos::arch::interrupt_handling [[gnu::interrupt]] [[gnu::section(".interrupt_text")]] auto syscall_interrupt_handler(interrupt_frame * frame) -> void { + // RDI, RSI, RDX, RCX, R8, R9 + // RDI -> SYSCALL number + // Others are arguments + + // TODO: The registers are not available here. We need to set them up on the stack + // and access them via argument. + + uint64_t syscall_number{}; + asm volatile("mov %%rdi, %0" : "=r"(syscall_number)); + + // Handle system call based on the number + switch (syscall_number) + { + case 1: + video::vga::text::write("SYSCALL 1.", video::vga::text::common_attributes::green_on_black); + break; + default: + // Handle unknown syscall + break; + } + (void)frame; - video::vga::text::write("A SYSCALL interrupt occurred.", video::vga::text::common_attributes::green_on_black); } } // namespace teachos::arch::interrupt_handling -- cgit v1.2.3