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);