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

View File

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