Xen-4.0+ removes some of the symbols that were necessary to process dump files on Xen-3, and makedumpfile fails if they are not found. Since most of these symbols are not needed for Xen4, we can simply remove the checks. The only exception is "frame_table". This used to be a global variable holding the address of the array of struct page_info. In Xen-4.0 the array is always located at a fixed address in virtual address space. Xen adds a compatibility symbol for VMCOREINFO, but a "frame_table" symbol does not exist as such, so we must use the fixed address instead. Signed-off-by: Norbert Trapp Signed-off-by: Petr Tesarik --- arch/ia64.c | 41 ++++++++++++++++++++++------------------- arch/x86.c | 49 ++++++++++++++++++++++++++----------------------- arch/x86_64.c | 49 ++++++++++++++++++++++++++----------------------- makedumpfile.c | 37 ++++++++++++++++++++----------------- 4 files changed, 94 insertions(+), 82 deletions(-) --- a/makedumpfile.c +++ b/makedumpfile.c @@ -5377,23 +5377,26 @@ get_xen_info(void) if (!get_xen_basic_info_arch()) return FALSE; - if (SYMBOL(alloc_bitmap) == NOT_FOUND_SYMBOL) { - ERRMSG("Can't get the symbol of alloc_bitmap.\n"); - return FALSE; - } - if (!readmem(VADDR_XEN, SYMBOL(alloc_bitmap), &info->alloc_bitmap, - sizeof(info->alloc_bitmap))) { - ERRMSG("Can't get the value of alloc_bitmap.\n"); - return FALSE; - } - if (SYMBOL(max_page) == NOT_FOUND_SYMBOL) { - ERRMSG("Can't get the symbol of max_page.\n"); - return FALSE; - } - if (!readmem(VADDR_XEN, SYMBOL(max_page), &info->max_page, - sizeof(info->max_page))) { - ERRMSG("Can't get the value of max_page.\n"); - return FALSE; + if (!info->xen_crash_info.com || + info->xen_crash_info.com->xen_major_version < 4) { + if (SYMBOL(alloc_bitmap) == NOT_FOUND_SYMBOL) { + ERRMSG("Can't get the symbol of alloc_bitmap.\n"); + return FALSE; + } + if (!readmem(VADDR_XEN, SYMBOL(alloc_bitmap), &info->alloc_bitmap, + sizeof(info->alloc_bitmap))) { + ERRMSG("Can't get the value of alloc_bitmap.\n"); + return FALSE; + } + if (SYMBOL(max_page) == NOT_FOUND_SYMBOL) { + ERRMSG("Can't get the symbol of max_page.\n"); + return FALSE; + } + if (!readmem(VADDR_XEN, SYMBOL(max_page), &info->max_page, + sizeof(info->max_page))) { + ERRMSG("Can't get the value of max_page.\n"); + return FALSE; + } } /* --- a/arch/ia64.c +++ b/arch/ia64.c @@ -335,26 +335,29 @@ get_xen_basic_info_ia64(void) info->frame_table_vaddr = VIRT_FRAME_TABLE_ADDR; /* "frame_table" is same value */ - if (SYMBOL(xenheap_phys_end) == NOT_FOUND_SYMBOL) { - ERRMSG("Can't get the symbol of xenheap_phys_end.\n"); - return FALSE; + if (!info->xen_crash_info.com || + info->xen_crash_info.com->xen_major_version < 4) { + if (SYMBOL(xenheap_phys_end) == NOT_FOUND_SYMBOL) { + ERRMSG("Can't get the symbol of xenheap_phys_end.\n"); + return FALSE; + } + if (!readmem(VADDR_XEN, SYMBOL(xenheap_phys_end), &xen_end, + sizeof(xen_end))) { + ERRMSG("Can't get the value of xenheap_phys_end.\n"); + return FALSE; + } + if (SYMBOL(xen_pstart) == NOT_FOUND_SYMBOL) { + ERRMSG("Can't get the symbol of xen_pstart.\n"); + return FALSE; + } + if (!readmem(VADDR_XEN, SYMBOL(xen_pstart), &xen_start, + sizeof(xen_start))) { + ERRMSG("Can't get the value of xen_pstart.\n"); + return FALSE; + } + info->xen_heap_start = paddr_to_pfn(xen_start); + info->xen_heap_end = paddr_to_pfn(xen_end); } - if (!readmem(VADDR_XEN, SYMBOL(xenheap_phys_end), &xen_end, - sizeof(xen_end))) { - ERRMSG("Can't get the value of xenheap_phys_end.\n"); - return FALSE; - } - if (SYMBOL(xen_pstart) == NOT_FOUND_SYMBOL) { - ERRMSG("Can't get the symbol of xen_pstart.\n"); - return FALSE; - } - if (!readmem(VADDR_XEN, SYMBOL(xen_pstart), &xen_start, - sizeof(xen_start))) { - ERRMSG("Can't get the value of xen_pstart.\n"); - return FALSE; - } - info->xen_heap_start = paddr_to_pfn(xen_start); - info->xen_heap_end = paddr_to_pfn(xen_end); return TRUE; } --- a/arch/x86_64.c +++ b/arch/x86_64.c @@ -358,9 +358,6 @@ kvtop_xen_x86_64(unsigned long kvaddr) int get_xen_basic_info_x86_64(void) { - unsigned long frame_table_vaddr; - unsigned long xen_end; - if (!info->xen_phys_start) { if (info->xen_crash_info_v < 2) { ERRMSG("Can't get Xen physical start address.\n" @@ -384,28 +381,34 @@ int get_xen_basic_info_x86_64(void) return FALSE; } - if (SYMBOL(frame_table) == NOT_FOUND_SYMBOL) { - ERRMSG("Can't get the symbol of frame_table.\n"); - return FALSE; - } - if (!readmem(VADDR_XEN, SYMBOL(frame_table), &frame_table_vaddr, - sizeof(frame_table_vaddr))) { - ERRMSG("Can't get the value of frame_table.\n"); - return FALSE; - } - info->frame_table_vaddr = frame_table_vaddr; + if (SYMBOL(frame_table) != NOT_FOUND_SYMBOL) { + unsigned long frame_table_vaddr; - if (SYMBOL(xenheap_phys_end) == NOT_FOUND_SYMBOL) { - ERRMSG("Can't get the symbol of xenheap_phys_end.\n"); - return FALSE; - } - if (!readmem(VADDR_XEN, SYMBOL(xenheap_phys_end), &xen_end, - sizeof(xen_end))) { - ERRMSG("Can't get the value of xenheap_phys_end.\n"); - return FALSE; + if (!readmem(VADDR_XEN, SYMBOL(frame_table), + &frame_table_vaddr, sizeof(frame_table_vaddr))) { + ERRMSG("Can't get the value of frame_table.\n"); + return FALSE; + } + info->frame_table_vaddr = frame_table_vaddr; + } else + info->frame_table_vaddr = FRAMETABLE_VIRT_START; + + if (!info->xen_crash_info.com || + info->xen_crash_info.com->xen_major_version < 4) { + unsigned long xen_end; + + if (SYMBOL(xenheap_phys_end) == NOT_FOUND_SYMBOL) { + ERRMSG("Can't get the symbol of xenheap_phys_end.\n"); + return FALSE; + } + if (!readmem(VADDR_XEN, SYMBOL(xenheap_phys_end), &xen_end, + sizeof(xen_end))) { + ERRMSG("Can't get the value of xenheap_phys_end.\n"); + return FALSE; + } + info->xen_heap_start = 0; + info->xen_heap_end = paddr_to_pfn(xen_end); } - info->xen_heap_start = 0; - info->xen_heap_end = paddr_to_pfn(xen_end); return TRUE; } --- a/arch/x86.c +++ b/arch/x86.c @@ -293,9 +293,6 @@ kvtop_xen_x86(unsigned long kvaddr) int get_xen_basic_info_x86(void) { - unsigned long frame_table_vaddr; - unsigned long xen_end; - if (!info->xen_phys_start) { if (info->xen_crash_info_v < 2) { ERRMSG("Can't get Xen physical start address.\n" @@ -316,28 +313,34 @@ int get_xen_basic_info_x86(void) return FALSE; } - if (SYMBOL(frame_table) == NOT_FOUND_SYMBOL) { - ERRMSG("Can't get the symbol of frame_table.\n"); - return FALSE; - } - if (!readmem(VADDR_XEN, SYMBOL(frame_table), &frame_table_vaddr, - sizeof(frame_table_vaddr))) { - ERRMSG("Can't get the value of frame_table.\n"); - return FALSE; - } - info->frame_table_vaddr = frame_table_vaddr; + if (SYMBOL(frame_table) != NOT_FOUND_SYMBOL) { + unsigned long frame_table_vaddr; - if (SYMBOL(xenheap_phys_end) == NOT_FOUND_SYMBOL) { - ERRMSG("Can't get the symbol of xenheap_phys_end.\n"); - return FALSE; - } - if (!readmem(VADDR_XEN, SYMBOL(xenheap_phys_end), &xen_end, - sizeof(xen_end))) { - ERRMSG("Can't get the value of xenheap_phys_end.\n"); - return FALSE; + if (!readmem(VADDR_XEN, SYMBOL(frame_table), + &frame_table_vaddr, sizeof(frame_table_vaddr))) { + ERRMSG("Can't get the value of frame_table.\n"); + return FALSE; + } + info->frame_table_vaddr = frame_table_vaddr; + } else + info->frame_table_vaddr = FRAMETABLE_VIRT_START; + + if (!info->xen_crash_info.com || + info->xen_crash_info.com->xen_major_version < 4) { + unsigned long xen_end; + + if (SYMBOL(xenheap_phys_end) == NOT_FOUND_SYMBOL) { + ERRMSG("Can't get the symbol of xenheap_phys_end.\n"); + return FALSE; + } + if (!readmem(VADDR_XEN, SYMBOL(xenheap_phys_end), &xen_end, + sizeof(xen_end))) { + ERRMSG("Can't get the value of xenheap_phys_end.\n"); + return FALSE; + } + info->xen_heap_start = 0; + info->xen_heap_end = paddr_to_pfn(xen_end); } - info->xen_heap_start = 0; - info->xen_heap_end = paddr_to_pfn(xen_end); return TRUE; }