diff --git a/arch/x86/kernel/cpu.c b/arch/x86/kernel/cpu.c index 40cb899b..e468ded5 100644 --- a/arch/x86/kernel/cpu.c +++ b/arch/x86/kernel/cpu.c @@ -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"); diff --git a/arch/x86/kernel/syscall.c b/arch/x86/kernel/syscall.c index 8ec53337..63b3e1b7 100644 --- a/arch/x86/kernel/syscall.c +++ b/arch/x86/kernel/syscall.c @@ -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); }