From d27ffce5db4605476663c617af4ca67b20f7f79f Mon Sep 17 00:00:00 2001 From: apio Date: Wed, 12 Jul 2023 13:34:30 +0200 Subject: [PATCH] kernel: Move the signal handling logic to after a syscall sets its return value When a signal was caught after a syscall, it was doing so without preserving the return value of the syscall. --- kernel/src/arch/x86_64/CPU.cpp | 1 + kernel/src/sys/Syscall.cpp | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/kernel/src/arch/x86_64/CPU.cpp b/kernel/src/arch/x86_64/CPU.cpp index 3b5739c8..dec29b60 100644 --- a/kernel/src/arch/x86_64/CPU.cpp +++ b/kernel/src/arch/x86_64/CPU.cpp @@ -186,6 +186,7 @@ extern "C" void arch_interrupt_entry(Registers* regs) { SyscallArgs args = { regs->rdi, regs->rsi, regs->rdx, regs->r10, regs->r8, regs->r9 }; regs->rax = (u64)invoke_syscall(regs, args, regs->rax); + Scheduler::current()->process_pending_signals(regs); } else { diff --git a/kernel/src/sys/Syscall.cpp b/kernel/src/sys/Syscall.cpp index a19a35be..8deb1067 100644 --- a/kernel/src/sys/Syscall.cpp +++ b/kernel/src/sys/Syscall.cpp @@ -15,8 +15,6 @@ i64 invoke_syscall(Registers* regs, SyscallArgs args, u64 syscall) auto rc = syscalls[syscall](regs, args); - Scheduler::current()->process_pending_signals(regs); - if (rc.has_error()) return -rc.error(); return (i64)rc.value(); }