From 7b825c0a65827e77033ccc2a6fbdc433fc0cbcda Mon Sep 17 00:00:00 2001 From: Tomoki Shirasawa Date: Wed, 3 Sep 2014 10:56:41 +0900 Subject: [PATCH] fix coredump (ltp abort01) --- arch/x86/kernel/syscall.c | 27 +++++++++++++++++++++++---- kernel/mem.c | 14 +++++++------- kernel/syscall.c | 4 ++-- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/arch/x86/kernel/syscall.c b/arch/x86/kernel/syscall.c index 6a3b99ea..281620c6 100644 --- a/arch/x86/kernel/syscall.c +++ b/arch/x86/kernel/syscall.c @@ -189,6 +189,8 @@ do_setpgid(int pid, int pgid) } } +extern void coredump(struct process *proc, void *regs); + void do_signal(unsigned long rc, void *regs0, struct process *proc, struct sig_pending *pending) { @@ -260,11 +262,26 @@ do_signal(unsigned long rc, void *regs0, struct process *proc, struct sig_pendin ihk_mc_spinlock_unlock(&proc->sighandler->lock, irqstate); } else{ + int coredumped = 0; kfree(pending); ihk_mc_spinlock_unlock(&proc->sighandler->lock, irqstate); - if(sig == SIGCHLD || sig == SIGURG) + switch(sig){ + case SIGCHLD: + case SIGURG: return; - terminate(0, sig, (ihk_mc_user_context_t *)regs->rsp); + case SIGQUIT: + case SIGILL: + case SIGTRAP: + case SIGABRT: + case SIGBUS: + case SIGFPE: + case SIGUSR1: + case SIGSEGV: + case SIGUSR2: + coredump(proc, regs); + coredumped = 0x80; + } + terminate(0, sig | coredumped, (ihk_mc_user_context_t *)regs->rsp); } } @@ -561,8 +578,10 @@ set_signal(int sig, void *regs0) return; if((__sigmask(sig) & proc->sigmask.__val[0]) || - (regs->rsp & 0x8000000000000000)) - terminate(0, sig, (ihk_mc_user_context_t *)regs->rsp); + (regs->rsp & 0x8000000000000000)){ + coredump(proc, regs0); + terminate(0, sig | 0x80, (ihk_mc_user_context_t *)regs->rsp); + } else do_kill(proc->pid, proc->tid, sig); } diff --git a/kernel/mem.c b/kernel/mem.c index a931cc6f..8db8f27c 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -180,7 +180,7 @@ void freecore(struct coretable **); * \param regs A pointer to a x86_regs structure. */ -static void coredump(struct process *proc, void *regs) +void coredump(struct process *proc, void *regs) { struct syscall_request request IHK_DMA_ALIGN; int ret; @@ -216,9 +216,9 @@ static void unhandled_page_fault(struct process *proc, void *fault_addr, void *r unsigned long error = ((struct x86_regs *)regs)->error; irqflags = kprintf_lock(); - __kprintf("[%d] Page fault for 0x%lX\n", + dkprintf("[%d] Page fault for 0x%lX\n", ihk_mc_get_processor_id(), address); - __kprintf("%s for %s access in %s mode (reserved bit %s set), " + dkprintf("%s for %s access in %s mode (reserved bit %s set), " "it %s an instruction fetch\n", (error & PF_PROT ? "protection fault" : "no page found"), (error & PF_WRITE ? "write" : "read"), @@ -230,14 +230,14 @@ static void unhandled_page_fault(struct process *proc, void *fault_addr, void *r list_for_each_entry(range, &vm->vm_range_list, list) { if (range->start <= address && range->end > address) { found = 1; - __kprintf("address is in range, flag: 0x%X! \n", + dkprintf("address is in range, flag: 0x%X! \n", range->flag); ihk_mc_pt_print_pte(vm->page_table, (void*)address); break; } } if (!found) { - __kprintf("address is out of range! \n"); + dkprintf("address is out of range! \n"); } kprintf_unlock(irqflags); @@ -246,8 +246,8 @@ static void unhandled_page_fault(struct process *proc, void *fault_addr, void *r ihk_mc_debug_show_interrupt_context(regs); - dkprintf("now dump a core file\n"); - coredump(proc, regs); + //dkprintf("now dump a core file\n"); + //coredump(proc, regs); #ifdef DEBUG_PRINT_MEM { diff --git a/kernel/syscall.c b/kernel/syscall.c index 41f33f78..5cdf9234 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -400,7 +400,7 @@ terminate(int rc, int sig, ihk_mc_user_context_t *ctx) struct fork_tree_node *child, *next; request.number = __NR_exit_group; - request.args[0] = ((rc & 0x00ff) << 8) | (sig & 0x7f); + request.args[0] = ((rc & 0x00ff) << 8) | (sig & 0xff); #ifdef DCFA_KMOD do_mod_exit(rc); @@ -430,7 +430,7 @@ terminate(int rc, int sig, ihk_mc_user_context_t *ctx) ihk_mc_spinlock_lock_noirq(&ftn->lock); ftn->pid = proc->pid; - ftn->exit_status = ((rc & 0x00ff) << 8) | (sig & 0x7f); + ftn->exit_status = ((rc & 0x00ff) << 8) | (sig & 0xff); ftn->status = PS_ZOMBIE; ihk_mc_spinlock_unlock_noirq(&ftn->lock);