In Xen4, init_tss is a per-cpu symbol. Without this patch, crash fails on Xen4 
hypervisor dumps during initialization with 'crash: cannot 
resolve "init_tss"'.

Signed-off-by: Petr Tesarik <[email protected]>
---
 xen_hyper.c |   15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

--- a/xen_hyper.c
+++ b/xen_hyper.c
@@ -319,6 +319,7 @@
        struct xen_hyper_pcpu_context *pcc;
        char *buf, *bp;
        int i, cpuid;
+       int flag;
 
        
XEN_HYPER_MEMBER_OFFSET_INIT(cpu_info_guest_cpu_user_regs, "cpu_info", 
"guest_cpu_user_regs");
        
XEN_HYPER_MEMBER_OFFSET_INIT(cpu_info_processor_id, "cpu_info", "processor_id");
@@ -330,11 +331,21 @@
 
        /* get physical cpu context */
        xen_hyper_alloc_pcpu_context_space(XEN_HYPER_MAX_CPUS());
-       init_tss_base = symbol_value("init_tss");
+       if (symbol_exists("per_cpu__init_tss")) {
+               init_tss_base = symbol_value("per_cpu__init_tss");
+               flag = TRUE;
+       } else {
+               init_tss_base = symbol_value("init_tss");
+               flag = FALSE;
+       }
        buf = GETBUF(XEN_HYPER_SIZE(tss_struct));       
        for_cpu_indexes(i, cpuid)
        {
-               init_tss = init_tss_base + XEN_HYPER_SIZE(tss_struct) * cpuid;
+               if (flag)
+                       init_tss = xen_hyper_per_cpu(init_tss_base, cpuid);
+               else
+                       init_tss = init_tss_base +
+                               XEN_HYPER_SIZE(tss_struct) * cpuid;
                if (!readmem(init_tss, KVADDR, buf,
                        XEN_HYPER_SIZE(tss_struct), "init_tss", 
RETURN_ON_ERROR)) {
                        error(FATAL, "cannot read init_tss.\n");

--
Crash-utility mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/crash-utility

Reply via email to