mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-28 15:34:33 +00:00
Fix signals from exception handler
This commit is contained in:
parent
8be2e10a8c
commit
5a00e91011
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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:
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user