diff --git a/arch/x86/kernel/gencore.c b/arch/x86/kernel/gencore.c index 4954523b..72a3b547 100644 --- a/arch/x86/kernel/gencore.c +++ b/arch/x86/kernel/gencore.c @@ -222,7 +222,7 @@ int gencore(struct process *proc, void *regs, } list_for_each_entry(range, &vm->vm_range_list, list) { - dkprintf("start:%x end:%x flag:%x objoff:%x\n", + dkprintf("start:%lx end:%lx flag:%lx objoff:%lx\n", range->start, range->end, range->flag, range->objoff); /* We omit reserved areas because they are only for mckernel's internal use. */ @@ -235,18 +235,16 @@ int gencore(struct process *proc, void *regs, { struct vm_regions region = proc->vm->region; - dkprintf("text: %x-%x\n", region.text_start, region.text_end); - dkprintf("data: %x-%x\n", region.data_start, region.data_end); - dkprintf("brk: %x-%x\n", region.brk_start, region.brk_end); - dkprintf("map: %x-%x\n", region.map_start, region.map_end); - dkprintf("stack: %x-%x\n", region.stack_start, region.stack_end); - dkprintf("user: %x-%x\n\n", region.user_start, region.user_end); + dkprintf("text: %lx-%lx\n", region.text_start, region.text_end); + dkprintf("data: %lx-%lx\n", region.data_start, region.data_end); + dkprintf("brk: %lx-%lx\n", region.brk_start, region.brk_end); + dkprintf("map: %lx-%lx\n", region.map_start, region.map_end); + dkprintf("stack: %lx-%lx\n", region.stack_start, region.stack_end); + dkprintf("user: %lx-%lx\n\n", region.user_start, region.user_end); } dkprintf("now generate a core file image\n"); -#ifndef DUMMY - offset += sizeof(eh); fill_elf_header(&eh, segs); @@ -310,12 +308,15 @@ int gencore(struct process *proc, void *regs, ct[0].addr = virt_to_phys(&eh); /* ELF header */ ct[0].len = 64; + dkprintf("coretable[0]: %lx@%lx(%lx)\n", ct[0].len, ct[0].addr, &eh); ct[1].addr = virt_to_phys(ph); /* program header table */ ct[1].len = phsize; + dkprintf("coretable[1]: %lx@%lx(%lx)\n", ct[1].len, ct[1].addr, ph); ct[2].addr = virt_to_phys(note); /* NOTE segment */ ct[2].len = notesize; + dkprintf("coretable[2]: %lx@%lx(%lx)\n", ct[2].len, ct[2].addr, note); i = 3; /* memory segments */ list_for_each_entry(range, &vm->vm_range_list, list) { @@ -323,29 +324,12 @@ int gencore(struct process *proc, void *regs, continue; ct[i].addr = virt_to_phys(range->start); ct[i].len = range->end - range->start; + dkprintf("coretable[%d]: %lx@%lx(%lx)\n", i, ct[i].len, ct[i].addr, range->start); i++; } *chunks = segs + 2; - -#else /* dummy */ - *coretable = kmalloc(sizeof(struct coretable) * 3, IHK_MC_AP_NOWAIT); - if (!*coretable) { - dkprintf("could not alloc a coretable.\n"); - goto fail; - } - - ct[0].len = 8; - ct[0].addr = virt_to_phys("this is "); - ct[1].len = 7; - ct[1].addr = virt_to_phys("a test "); - ct[2].len = 15; - ct[2].addr = virt_to_phys("for coredump.\n"); - - dkprintf("generated a core table.\n"); - - *chunks = 3; -#endif *coretable = ct; + return 0; fail: diff --git a/executer/kernel/syscall.c b/executer/kernel/syscall.c index 7dd1cbc0..fcb56e8f 100644 --- a/executer/kernel/syscall.c +++ b/executer/kernel/syscall.c @@ -1200,9 +1200,19 @@ static int writecore(ihk_os_t os, unsigned long rcoretable, int chunks) { /* map and write the chunk out */ rphys = coretable[i].addr; size = coretable[i].len; + dprintk("mapping remote %lx@%lx -> ", size, rphys); phys = ihk_device_map_memory(dev, rphys, size); + dprintk("physical %lx, ", phys); pt = ihk_device_map_virtual(dev, phys, size, NULL, 0); - ret = file->f_op->write(file, pt, size, &file->f_pos); + dprintk("virtual %lx\n", pt); + if (pt != NULL) { + ret = file->f_op->write(file, pt, size, &file->f_pos); + } else { + dprintk("cannot map physical memory(%lx) to virtual memory.\n", + phys); + ihk_device_unmap_memory(dev, phys, size); + break; + } /* unmap the chunk */ ihk_device_unmap_virtual(dev, pt, size); ihk_device_unmap_memory(dev, phys, size);