diff --git a/executer/kernel/mcctrl.h b/executer/kernel/mcctrl.h index b4990b81..a34e667d 100644 --- a/executer/kernel/mcctrl.h +++ b/executer/kernel/mcctrl.h @@ -57,7 +57,7 @@ struct coretable { int len; - void *addr; + unsigned long addr; }; struct ikc_scd_packet { diff --git a/executer/kernel/syscall.c b/executer/kernel/syscall.c index 7f56fcb2..7dd1cbc0 100644 --- a/executer/kernel/syscall.c +++ b/executer/kernel/syscall.c @@ -1198,7 +1198,7 @@ static int writecore(ihk_os_t os, unsigned long rcoretable, int chunks) { coretable = ihk_device_map_virtual(dev, tablephys, tablesize, NULL, 0); for (i = 0; i < chunks; i++) { /* map and write the chunk out */ - rphys = (unsigned long) coretable[i].addr; + rphys = coretable[i].addr; size = coretable[i].len; phys = ihk_device_map_memory(dev, rphys, size); pt = ihk_device_map_virtual(dev, phys, size, NULL, 0); diff --git a/kernel/include/syscall.h b/kernel/include/syscall.h index 1e4404f2..6657770a 100644 --- a/kernel/include/syscall.h +++ b/kernel/include/syscall.h @@ -224,9 +224,9 @@ enum { #undef SYSCALL_DELEGATED #define __NR_coredump 999 /* pseudo syscall for coredump */ -struct coretable { - int len; - void *addr; +struct coretable { /* table entry for a core chunk */ + int len; /* length of the chunk */ + unsigned long addr; /* physical addr of the chunk */ }; #endif diff --git a/kernel/mem.c b/kernel/mem.c index d7da0f99..2d24120d 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -34,7 +34,7 @@ #include #include -//#define DEBUG_PRINT_MEM +#define DEBUG_PRINT_MEM #ifdef DEBUG_PRINT_MEM #define dkprintf(...) kprintf(__VA_ARGS__) @@ -166,6 +166,34 @@ static struct ihk_mc_interrupt_handler query_free_mem_handler = { void set_signal(int sig, void *regs); void check_signal(unsigned long rc, void *regs); +int gencore(struct process *, void *, struct coretable **, int *); + +static void coredump(struct process *proc, void *regs) +{ + /* xxx */ + struct syscall_request request IHK_DMA_ALIGN; + int ret; + struct coretable *coretable; + int chunks; + + ret = gencore(proc, regs, &coretable, &chunks); + if (ret != 0) { + dkprintf("could not generate a core file image\n"); + return; + } + request.number = __NR_coredump; + request.args[0] = chunks; + request.args[1] = virt_to_phys(coretable); + /* no data for now */ + ret = do_syscall(&request, proc->uctx, + proc->cpu_id, proc->pid); + if (ret == 0) { + kprintf("dumped core.\n"); + } else { + kprintf("core dump failed.\n"); + } + kfree(coretable); +} static void unhandled_page_fault(struct process *proc, void *fault_addr, void *regs) { @@ -206,32 +234,9 @@ static void unhandled_page_fault(struct process *proc, void *fault_addr, void *r /* TODO */ ihk_mc_debug_show_interrupt_context(regs); - { - /* xxx */ - /* core dump framework test */ - struct syscall_request request IHK_DMA_ALIGN; - int ret; - struct coretable coreentry[3]; - coreentry[0].len = 8; - coreentry[0].addr = virt_to_phys("this is "); - coreentry[1].len = 7; - coreentry[1].addr = virt_to_phys("a test "); - coreentry[2].len = 15; - coreentry[2].addr = virt_to_phys("for coredump.\n"); - - request.number = __NR_coredump; - request.args[0] = 3; - request.args[1] = virt_to_phys(&coreentry); - /* no data for now */ - ret = do_syscall(&request, proc->uctx, - proc->cpu_id, proc->pid); - if (ret == 0) { - kprintf("dumped core.\n"); - } else { - kprintf("core dump failed.\n"); - } - } + dkprintf("now dump a core file\n"); + coredump(proc, regs); #ifdef DEBUG_PRINT_MEM {