Kernel: Fix si_addr reporting
Meaning of this is signal specific and not the instruction pointer
This commit is contained in:
@@ -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");
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user