change to throw signal SIGILL to SIGSEGV when GPE

This commit is contained in:
Tomoki Shirasawa
2015-02-18 14:54:49 +09:00
parent c0edb6fe6f
commit 3b04043f2a
2 changed files with 49 additions and 12 deletions

View File

@ -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");

View File

@ -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);
}