Fix signals from exception handler

This commit is contained in:
EnderIce2 2024-03-28 03:15:05 +02:00
parent 8be2e10a8c
commit 5a00e91011
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD
2 changed files with 20 additions and 12 deletions

View File

@ -153,6 +153,7 @@ nsa bool UserModeExceptionHandler(CPU::ExceptionFrame *Frame)
dbgPrint(Frame);
#endif
int sigRet = -1;
switch (Frame->InterruptNumber)
{
case CPU::x86::PageFault:
@ -169,15 +170,15 @@ nsa bool UserModeExceptionHandler(CPU::ExceptionFrame *Frame)
return true;
}
proc->Signals.SendSignal(SIGSEGV,
{Tasking::KILL_CRASH});
sigRet = proc->Signals.SendSignal(SIGSEGV,
{Tasking::KILL_CRASH});
break;
}
case CPU::x86::Debug:
case CPU::x86::Breakpoint:
{
proc->Signals.SendSignal(SIGTRAP,
{Tasking::KILL_CRASH});
sigRet = proc->Signals.SendSignal(SIGTRAP,
{Tasking::KILL_CRASH});
break;
}
case CPU::x86::DivideByZero:
@ -186,21 +187,21 @@ nsa bool UserModeExceptionHandler(CPU::ExceptionFrame *Frame)
case CPU::x86::x87FloatingPoint:
case CPU::x86::SIMDFloatingPoint:
{
proc->Signals.SendSignal(SIGFPE,
{Tasking::KILL_CRASH});
sigRet = proc->Signals.SendSignal(SIGFPE,
{Tasking::KILL_CRASH});
break;
}
case CPU::x86::InvalidOpcode:
case CPU::x86::GeneralProtectionFault:
{
proc->Signals.SendSignal(SIGILL,
{Tasking::KILL_CRASH});
sigRet = proc->Signals.SendSignal(SIGILL,
{Tasking::KILL_CRASH});
break;
}
case CPU::x86::DeviceNotAvailable:
{
proc->Signals.SendSignal(SIGBUS,
{Tasking::KILL_CRASH});
sigRet = proc->Signals.SendSignal(SIGBUS,
{Tasking::KILL_CRASH});
break;
}
case CPU::x86::NonMaskableInterrupt:
@ -221,6 +222,13 @@ nsa bool UserModeExceptionHandler(CPU::ExceptionFrame *Frame)
}
}
if (sigRet == 0)
{
trace("User mode exception handler handled");
thread->SetState(Tasking::Ready);
return true;
}
error("User mode exception handler failed");
return false;
}

View File

@ -611,7 +611,7 @@ namespace Tasking
pcb->SetState(Zombie);
else
pcb->SetState(Terminated);
return 0;
return val.sival_int == Tasking::KILL_CRASH ? -EFAULT : 0;
}
case SIG_IGN:
{
@ -635,7 +635,7 @@ namespace Tasking
pcb->SetState(CoreDump);
else
pcb->SetState(Terminated);
return 0;
return val.sival_int == Tasking::KILL_CRASH ? -EFAULT : 0;
}
case SIG_STOP:
{