fix coredump (ltp abort01)
This commit is contained in:
@@ -189,6 +189,8 @@ do_setpgid(int pid, int pgid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void coredump(struct process *proc, void *regs);
|
||||||
|
|
||||||
void
|
void
|
||||||
do_signal(unsigned long rc, void *regs0, struct process *proc, struct sig_pending *pending)
|
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);
|
ihk_mc_spinlock_unlock(&proc->sighandler->lock, irqstate);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
int coredumped = 0;
|
||||||
kfree(pending);
|
kfree(pending);
|
||||||
ihk_mc_spinlock_unlock(&proc->sighandler->lock, irqstate);
|
ihk_mc_spinlock_unlock(&proc->sighandler->lock, irqstate);
|
||||||
if(sig == SIGCHLD || sig == SIGURG)
|
switch(sig){
|
||||||
|
case SIGCHLD:
|
||||||
|
case SIGURG:
|
||||||
return;
|
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;
|
return;
|
||||||
|
|
||||||
if((__sigmask(sig) & proc->sigmask.__val[0]) ||
|
if((__sigmask(sig) & proc->sigmask.__val[0]) ||
|
||||||
(regs->rsp & 0x8000000000000000))
|
(regs->rsp & 0x8000000000000000)){
|
||||||
terminate(0, sig, (ihk_mc_user_context_t *)regs->rsp);
|
coredump(proc, regs0);
|
||||||
|
terminate(0, sig | 0x80, (ihk_mc_user_context_t *)regs->rsp);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
do_kill(proc->pid, proc->tid, sig);
|
do_kill(proc->pid, proc->tid, sig);
|
||||||
}
|
}
|
||||||
|
|||||||
14
kernel/mem.c
14
kernel/mem.c
@@ -180,7 +180,7 @@ void freecore(struct coretable **);
|
|||||||
* \param regs A pointer to a x86_regs structure.
|
* \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;
|
struct syscall_request request IHK_DMA_ALIGN;
|
||||||
int ret;
|
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;
|
unsigned long error = ((struct x86_regs *)regs)->error;
|
||||||
|
|
||||||
irqflags = kprintf_lock();
|
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);
|
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",
|
"it %s an instruction fetch\n",
|
||||||
(error & PF_PROT ? "protection fault" : "no page found"),
|
(error & PF_PROT ? "protection fault" : "no page found"),
|
||||||
(error & PF_WRITE ? "write" : "read"),
|
(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) {
|
list_for_each_entry(range, &vm->vm_range_list, list) {
|
||||||
if (range->start <= address && range->end > address) {
|
if (range->start <= address && range->end > address) {
|
||||||
found = 1;
|
found = 1;
|
||||||
__kprintf("address is in range, flag: 0x%X! \n",
|
dkprintf("address is in range, flag: 0x%X! \n",
|
||||||
range->flag);
|
range->flag);
|
||||||
ihk_mc_pt_print_pte(vm->page_table, (void*)address);
|
ihk_mc_pt_print_pte(vm->page_table, (void*)address);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
__kprintf("address is out of range! \n");
|
dkprintf("address is out of range! \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
kprintf_unlock(irqflags);
|
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);
|
ihk_mc_debug_show_interrupt_context(regs);
|
||||||
|
|
||||||
|
|
||||||
dkprintf("now dump a core file\n");
|
//dkprintf("now dump a core file\n");
|
||||||
coredump(proc, regs);
|
//coredump(proc, regs);
|
||||||
|
|
||||||
#ifdef DEBUG_PRINT_MEM
|
#ifdef DEBUG_PRINT_MEM
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -400,7 +400,7 @@ terminate(int rc, int sig, ihk_mc_user_context_t *ctx)
|
|||||||
struct fork_tree_node *child, *next;
|
struct fork_tree_node *child, *next;
|
||||||
|
|
||||||
request.number = __NR_exit_group;
|
request.number = __NR_exit_group;
|
||||||
request.args[0] = ((rc & 0x00ff) << 8) | (sig & 0x7f);
|
request.args[0] = ((rc & 0x00ff) << 8) | (sig & 0xff);
|
||||||
|
|
||||||
#ifdef DCFA_KMOD
|
#ifdef DCFA_KMOD
|
||||||
do_mod_exit(rc);
|
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);
|
ihk_mc_spinlock_lock_noirq(&ftn->lock);
|
||||||
ftn->pid = proc->pid;
|
ftn->pid = proc->pid;
|
||||||
ftn->exit_status = ((rc & 0x00ff) << 8) | (sig & 0x7f);
|
ftn->exit_status = ((rc & 0x00ff) << 8) | (sig & 0xff);
|
||||||
ftn->status = PS_ZOMBIE;
|
ftn->status = PS_ZOMBIE;
|
||||||
ihk_mc_spinlock_unlock_noirq(&ftn->lock);
|
ihk_mc_spinlock_unlock_noirq(&ftn->lock);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user