From d11160d2f718439d292014aa1abdd4d05d6d70e7 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 8 Apr 2026 12:41:11 +0300 Subject: [PATCH] Kernel: Fix si_addr reporting Meaning of this is signal specific and not the instruction pointer --- kernel/kernel/IDT.cpp | 2 ++ kernel/kernel/Thread.cpp | 7 +++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/kernel/kernel/IDT.cpp b/kernel/kernel/IDT.cpp index 086ce92f..30006072 100644 --- a/kernel/kernel/IDT.cpp +++ b/kernel/kernel/IDT.cpp @@ -358,6 +358,7 @@ namespace Kernel case ISR::InvalidOpcode: signal_info.si_signo = SIGILL; signal_info.si_code = ILL_ILLOPC; + signal_info.si_addr = reinterpret_cast(interrupt_stack->ip); break; case ISR::PageFault: signal_info.si_signo = SIGSEGV; @@ -365,6 +366,7 @@ namespace Kernel signal_info.si_code = SEGV_ACCERR; else signal_info.si_code = SEGV_MAPERR; + signal_info.si_addr = reinterpret_cast(regs->cr2); break; default: dwarnln("Unhandled exception"); diff --git a/kernel/kernel/Thread.cpp b/kernel/kernel/Thread.cpp index 58c230fa..c1ab950c 100644 --- a/kernel/kernel/Thread.cpp +++ b/kernel/kernel/Thread.cpp @@ -628,6 +628,7 @@ namespace Kernel signal_info = m_process->m_signal_infos[signal]; else signal_info = m_signal_infos[signal]; + signal_info.si_signo = signal; handle_info = remove_signal_and_get_info(signal); } @@ -754,10 +755,8 @@ namespace Kernel write_to_stack(interrupt_stack.sp, interrupt_stack.flags); write_to_stack(interrupt_stack.sp, handle_info.restore_sigmask); - siginfo_t copy = signal_info; - copy.si_signo = signal; - copy.si_addr = reinterpret_cast(interrupt_stack.ip); - write_to_stack(interrupt_stack.sp, copy); + ASSERT(signal_info.si_signo == signal); + write_to_stack(interrupt_stack.sp, signal_info); write_to_stack(interrupt_stack.sp, static_cast(signal)); write_to_stack(interrupt_stack.sp, handle_info.handler);