Previously, get_xen_info_arch() was called after initializing the generic Xen variables. This is necessary, because the arch-specific code translates domain addresses to pickled domain IDs, and the domain list is initialized by the generic code.
Now, Xen4 on x86_64 changed the virtual memory layout, and this initialization should ideally be done in the arch-specific code. Unfortunately, the generic code must know the virtual address space to perform readmem of type XEN_VADDR, so there is no working ordering, and instead we must provide hooks for "early" arch-specific initialization to set up data needed by the generic code, and "late" arch-specific initialization to do stuff that depends on data set by the generic code (currently only the domain_list). Signed-off-by: Petr Tesarik <[email protected]> --- arch/ia64.c | 14 +++++++++++--- arch/x86.c | 24 ++++++++++++++++++++++-- arch/x86_64.c | 24 ++++++++++++++++++++++-- makedumpfile.c | 27 ++++++--------------------- makedumpfile.h | 9 +++++++++ 5 files changed, 70 insertions(+), 28 deletions(-) --- a/arch/x86.c +++ b/arch/x86.c @@ -291,11 +291,24 @@ kvtop_xen_x86(unsigned long kvaddr) return entry; } -int get_xen_info_x86(void) +int get_xen_basic_info_x86(void) { unsigned long frame_table_vaddr; unsigned long xen_end; - int i; + + if (!info->xen_phys_start) { + unsigned long size_xen_crash_info; + crash_xen_info_v2_t *xen_crash_info; + + xen_crash_info = get_xen_crash_info(&size_xen_crash_info); + if (!xen_crash_info || + size_xen_crash_info < sizeof(crash_xen_info_v2_t)) { + ERRMSG("Can't get Xen physical start address.\n" + "Please use the --xen_phys_start option."); + return FALSE; + } + info->xen_phys_start = xen_crash_info->xen_phys_start; + } if (SYMBOL(pgd_l2) == NOT_FOUND_SYMBOL && SYMBOL(pgd_l3) == NOT_FOUND_SYMBOL) { @@ -331,6 +344,13 @@ int get_xen_info_x86(void) info->xen_heap_start = 0; info->xen_heap_end = paddr_to_pfn(xen_end); + return TRUE; +} + +int get_xen_info_x86(void) +{ + int i; + /* * pickled_id == domain addr for x86 */ --- a/arch/x86_64.c +++ b/arch/x86_64.c @@ -338,11 +338,24 @@ kvtop_xen_x86_64(unsigned long kvaddr) return entry; } -int get_xen_info_x86_64(void) +int get_xen_basic_info_x86_64(void) { unsigned long frame_table_vaddr; unsigned long xen_end; - int i; + + if (!info->xen_phys_start) { + unsigned long size_xen_crash_info; + crash_xen_info_v2_t *xen_crash_info; + + xen_crash_info = get_xen_crash_info(&size_xen_crash_info); + if (!xen_crash_info || + size_xen_crash_info < sizeof(crash_xen_info_v2_t)) { + ERRMSG("Can't get Xen physical start address.\n" + "Please use the --xen_phys_start option."); + return FALSE; + } + info->xen_phys_start = xen_crash_info->xen_phys_start; + } if (SYMBOL(pgd_l4) == NOT_FOUND_SYMBOL) { ERRMSG("Can't get pml4.\n"); @@ -372,6 +385,13 @@ int get_xen_info_x86_64(void) info->xen_heap_start = 0; info->xen_heap_end = paddr_to_pfn(xen_end); + return TRUE; +} + +int get_xen_info_x86_64(void) +{ + int i; + /* * pickled_id == domain addr for x86_64 */ --- a/makedumpfile.c +++ b/makedumpfile.c @@ -5313,31 +5313,18 @@ get_structure_info_xen(void) } int -get_xen_phys_start(void) -{ - unsigned long size_xen_crash_info; - crash_xen_info_v2_t *xen_crash_info; - - if (info->xen_phys_start) - return TRUE; - -#if defined(__x86__) || defined(__x86_64__) - xen_crash_info = get_xen_crash_info(&size_xen_crash_info); - if (xen_crash_info && - size_xen_crash_info >= sizeof(crash_xen_info_v2_t)) - info->xen_phys_start = xen_crash_info->xen_phys_start; -#endif - - return TRUE; -} - -int get_xen_info(void) { unsigned long domain; unsigned int domain_id; int num_domain; + /* + * Get architecture specific basic data + */ + 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; @@ -5816,8 +5803,6 @@ initial_xen(void) if (!read_vmcoreinfo_from_vmcore(offset, size, TRUE)) return FALSE; } - if (!get_xen_phys_start()) - return FALSE; if (!get_xen_info()) return FALSE; --- a/makedumpfile.h +++ b/makedumpfile.h @@ -1274,6 +1274,7 @@ struct domain_list { #ifdef __arm__ #define kvtop_xen(X) FALSE +#define get_xen_basic_info_arch(X) FALSE #define get_xen_info_arch(X) FALSE #endif /* arm */ @@ -1292,6 +1293,8 @@ struct domain_list { unsigned long long kvtop_xen_x86(unsigned long kvaddr); #define kvtop_xen(X) kvtop_xen_x86(X) +int get_xen_basic_info_x86(void); +#define get_xen_basic_info_arch(X) get_xen_basic_info_x86(X) int get_xen_info_x86(void); #define get_xen_info_arch(X) get_xen_info_x86(X) @@ -1319,6 +1322,8 @@ int get_xen_info_x86(void); unsigned long long kvtop_xen_x86_64(unsigned long kvaddr); #define kvtop_xen(X) kvtop_xen_x86_64(X) +int get_xen_basic_info_x86_64(void); +#define get_xen_basic_info_arch(X) get_xen_basic_info_x86_64(X) int get_xen_info_x86_64(void); #define get_xen_info_arch(X) get_xen_info_x86_64(X) @@ -1354,6 +1359,8 @@ int get_xen_info_x86_64(void); unsigned long long kvtop_xen_ia64(unsigned long kvaddr); #define kvtop_xen(X) kvtop_xen_ia64(X) +int get_xen_basic_info_ia64(void); +#define get_xen_basic_info_arch(X) get_xen_basic_info_ia64(X) int get_xen_info_ia64(void); #define get_xen_info_arch(X) get_xen_info_ia64(X) @@ -1361,11 +1368,13 @@ int get_xen_info_ia64(void); #if defined(__powerpc64__) || defined(__powerpc32__) /* powerpcXX */ #define kvtop_xen(X) FALSE +#define get_xen_basic_info_arch(X) FALSE #define get_xen_info_arch(X) FALSE #endif /* powerpcXX */ #ifdef __s390x__ /* s390x */ #define kvtop_xen(X) FALSE +#define get_xen_basic_info_arch(X) FALSE #define get_xen_info_arch(X) FALSE #endif /* s390x */ --- a/arch/ia64.c +++ b/arch/ia64.c @@ -329,10 +329,9 @@ kvtop_xen_ia64(unsigned long kvaddr) } int -get_xen_info_ia64(void) +get_xen_basic_info_ia64(void) { - unsigned long xen_start, xen_end, xen_heap_start; - int i; + unsigned long xen_start, xen_end; info->frame_table_vaddr = VIRT_FRAME_TABLE_ADDR; /* "frame_table" is same value */ @@ -357,6 +356,15 @@ get_xen_info_ia64(void) info->xen_heap_start = paddr_to_pfn(xen_start); info->xen_heap_end = paddr_to_pfn(xen_end); + return TRUE; +} + +int +get_xen_info_ia64(void) +{ + unsigned long xen_heap_start; + int i; + if (SYMBOL(xen_heap_start) == NOT_FOUND_SYMBOL) { ERRMSG("Can't get the symbol of xen_heap_start.\n"); return FALSE; _______________________________________________ kexec mailing list [email protected] http://lists.infradead.org/mailman/listinfo/kexec
