Kernel: Fix si_addr reporting

Meaning of this is signal specific and not the instruction pointer
This commit is contained in:
2026-04-08 12:41:11 +03:00
parent 7333008f40
commit d11160d2f7
2 changed files with 5 additions and 4 deletions

View File

@@ -358,6 +358,7 @@ namespace Kernel
case ISR::InvalidOpcode: case ISR::InvalidOpcode:
signal_info.si_signo = SIGILL; signal_info.si_signo = SIGILL;
signal_info.si_code = ILL_ILLOPC; signal_info.si_code = ILL_ILLOPC;
signal_info.si_addr = reinterpret_cast<void*>(interrupt_stack->ip);
break; break;
case ISR::PageFault: case ISR::PageFault:
signal_info.si_signo = SIGSEGV; signal_info.si_signo = SIGSEGV;
@@ -365,6 +366,7 @@ namespace Kernel
signal_info.si_code = SEGV_ACCERR; signal_info.si_code = SEGV_ACCERR;
else else
signal_info.si_code = SEGV_MAPERR; signal_info.si_code = SEGV_MAPERR;
signal_info.si_addr = reinterpret_cast<void*>(regs->cr2);
break; break;
default: default:
dwarnln("Unhandled exception"); dwarnln("Unhandled exception");

View File

@@ -628,6 +628,7 @@ namespace Kernel
signal_info = m_process->m_signal_infos[signal]; signal_info = m_process->m_signal_infos[signal];
else else
signal_info = m_signal_infos[signal]; signal_info = m_signal_infos[signal];
signal_info.si_signo = signal;
handle_info = remove_signal_and_get_info(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, interrupt_stack.flags);
write_to_stack(interrupt_stack.sp, handle_info.restore_sigmask); write_to_stack(interrupt_stack.sp, handle_info.restore_sigmask);
siginfo_t copy = signal_info; ASSERT(signal_info.si_signo == signal);
copy.si_signo = signal; write_to_stack(interrupt_stack.sp, signal_info);
copy.si_addr = reinterpret_cast<void*>(interrupt_stack.ip);
write_to_stack(interrupt_stack.sp, copy);
write_to_stack(interrupt_stack.sp, static_cast<uintptr_t>(signal)); write_to_stack(interrupt_stack.sp, static_cast<uintptr_t>(signal));
write_to_stack(interrupt_stack.sp, handle_info.handler); write_to_stack(interrupt_stack.sp, handle_info.handler);