From e203095f8958cb0991916b336bb4422c4642179a Mon Sep 17 00:00:00 2001 From: Atsushi Kumagai Date: Fri, 15 Mar 2013 19:34:30 +0900 Subject: [PATCH 4/4] Use vmap_area_list to get vmalloc_start for ppc64. Try to get vmalloc_start value from vmap_area_list first for newer ppc64 kernels. Signed-off-by: Atsushi Kumagai --- arch/ppc64.c | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) (limited to 'arch') diff --git a/arch/ppc64.c b/arch/ppc64.c index afbaf55..c229ede 100644 --- a/arch/ppc64.c +++ b/arch/ppc64.c @@ -66,22 +66,40 @@ get_machdep_info_ppc64(void) DEBUG_MSG("kernel_start : %lx\n", info->kernel_start); /* - * For the compatibility, makedumpfile should run without the symbol - * vmlist and the offset of vm_struct.addr if they are not necessary. + * Get vmalloc_start value from either vmap_area_list or vmlist. */ - if ((SYMBOL(vmlist) == NOT_FOUND_SYMBOL) - || (OFFSET(vm_struct.addr) == NOT_FOUND_STRUCTURE)) { + if ((SYMBOL(vmap_area_list) != NOT_FOUND_SYMBOL) + && (OFFSET(vmap_area.va_start) != NOT_FOUND_STRUCTURE) + && (OFFSET(vmap_area.list) != NOT_FOUND_STRUCTURE)) { + if (!readmem(VADDR, SYMBOL(vmap_area_list) + OFFSET(list_head.next), + &vmap_area_list, sizeof(vmap_area_list))) { + ERRMSG("Can't get vmap_area_list.\n"); + return FALSE; + } + if (!readmem(VADDR, vmap_area_list - OFFSET(vmap_area.list) + + OFFSET(vmap_area.va_start), &vmalloc_start, + sizeof(vmalloc_start))) { + ERRMSG("Can't get vmalloc_start.\n"); + return FALSE; + } + } else if ((SYMBOL(vmlist) != NOT_FOUND_SYMBOL) + && (OFFSET(vm_struct.addr) != NOT_FOUND_STRUCTURE)) { + if (!readmem(VADDR, SYMBOL(vmlist), &vmlist, sizeof(vmlist))) { + ERRMSG("Can't get vmlist.\n"); + return FALSE; + } + if (!readmem(VADDR, vmlist + OFFSET(vm_struct.addr), &vmalloc_start, + sizeof(vmalloc_start))) { + ERRMSG("Can't get vmalloc_start.\n"); + return FALSE; + } + } else { + /* + * For the compatibility, makedumpfile should run without the symbol + * vmlist and the offset of vm_struct.addr if they are not necessary. + */ return TRUE; } - if (!readmem(VADDR, SYMBOL(vmlist), &vmlist, sizeof(vmlist))) { - ERRMSG("Can't get vmlist.\n"); - return FALSE; - } - if (!readmem(VADDR, vmlist + OFFSET(vm_struct.addr), &vmalloc_start, - sizeof(vmalloc_start))) { - ERRMSG("Can't get vmalloc_start.\n"); - return FALSE; - } info->vmalloc_start = vmalloc_start; DEBUG_MSG("vmalloc_start: %lx\n", vmalloc_start); -- cgit v1.2.3