change to throw signal SIGILL to SIGSEGV when GPE
This commit is contained in:
@ -456,16 +456,50 @@ void handle_interrupt(int vector, struct x86_regs *regs)
|
||||
panic("Invalid interrupt vector.");
|
||||
}
|
||||
else if (vector < 32) {
|
||||
if (vector == 8 ||
|
||||
(vector >= 10 && vector <= 15) || vector == 17) {
|
||||
kprintf("Exception %d, rflags: 0x%lX CS: 0x%lX, RIP: 0x%lX\n",
|
||||
vector, regs->rflags, regs->cs, regs->rip);
|
||||
} else {
|
||||
struct siginfo info;
|
||||
switch(vector){
|
||||
case 0:
|
||||
memset(&info, '\0', sizeof info);
|
||||
info.si_signo = SIGFPE;
|
||||
info.si_code = FPE_INTDIV;
|
||||
info._sifields._sigfault.si_addr = (void *)regs->rip;
|
||||
set_signal(SIGFPE, regs, &info);
|
||||
break;
|
||||
case 9:
|
||||
case 16:
|
||||
case 19:
|
||||
set_signal(SIGFPE, regs, NULL);
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
set_signal(SIGSEGV, regs, NULL);
|
||||
break;
|
||||
case 6:
|
||||
memset(&info, '\0', sizeof info);
|
||||
info.si_signo = SIGILL;
|
||||
info.si_code = ILL_ILLOPN;
|
||||
info._sifields._sigfault.si_addr = (void *)regs->rip;
|
||||
set_signal(SIGILL, regs, &info);
|
||||
break;
|
||||
case 10:
|
||||
set_signal(SIGSEGV, regs, NULL);
|
||||
break;
|
||||
case 11:
|
||||
case 12:
|
||||
set_signal(SIGBUS, regs, NULL);
|
||||
break;
|
||||
case 17:
|
||||
memset(&info, '\0', sizeof info);
|
||||
info.si_signo = SIGBUS;
|
||||
info.si_code = BUS_ADRALN;
|
||||
set_signal(SIGBUS, regs, &info);
|
||||
break;
|
||||
default:
|
||||
kprintf("Exception %d, rflags: 0x%lX CS: 0x%lX, RIP: 0x%lX\n",
|
||||
vector, regs->rflags, regs->cs, regs->rip);
|
||||
arch_show_interrupt_context(regs);
|
||||
panic("Unhandled exception");
|
||||
}
|
||||
arch_show_interrupt_context(regs);
|
||||
panic("Unhandled exception");
|
||||
}
|
||||
else if (vector >= IHK_TLB_FLUSH_IRQ_VECTOR_START &&
|
||||
vector < IHK_TLB_FLUSH_IRQ_VECTOR_END) {
|
||||
@ -486,13 +520,10 @@ void handle_interrupt(int vector, struct x86_regs *regs)
|
||||
|
||||
void gpe_handler(struct x86_regs *regs)
|
||||
{
|
||||
struct siginfo info;
|
||||
|
||||
kprintf("General protection fault (err: %lx, %lx:%lx)\n",
|
||||
regs->error, regs->cs, regs->rip);
|
||||
arch_show_interrupt_context(regs);
|
||||
memset(&info, '\0', sizeof info);
|
||||
set_signal(SIGILL, regs, &info);
|
||||
set_signal(SIGSEGV, regs, NULL);
|
||||
check_signal(0, regs);
|
||||
check_need_resched();
|
||||
// panic("GPF");
|
||||
|
||||
@ -684,10 +684,17 @@ do_kill(int pid, int tid, int sig, siginfo_t *info, int ptracecont)
|
||||
int doint;
|
||||
ihk_spinlock_t *savelock = NULL;
|
||||
int found = 0;
|
||||
siginfo_t info0;
|
||||
|
||||
if(sig > 64 || sig < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if(info == NULL){
|
||||
memset(&info0, '\0', sizeof info0);
|
||||
info = &info0;
|
||||
info0.si_signo = sig;
|
||||
}
|
||||
|
||||
if(tid == -1 && pid <= 0){
|
||||
int pgid = -pid;
|
||||
int rc = -ESRCH;
|
||||
@ -935,6 +942,5 @@ set_signal(int sig, void *regs0, siginfo_t *info)
|
||||
coredump(proc, regs0);
|
||||
terminate(0, sig | 0x80, (ihk_mc_user_context_t *)regs->rsp);
|
||||
}
|
||||
else
|
||||
do_kill(proc->ftn->pid, proc->ftn->tid, sig, info, 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user