--- defs.h.org 2008-10-09 09:25:11.000000000 +0900 +++ defs.h 2008-10-09 09:53:53.000000000 +0900 @@ -4118,6 +4118,8 @@ int is_sadump_xen(void); void set_xen_phys_start(char *); ulong xen_phys_start(void); +int xen_major_version(void); +int xen_minor_version(void); /* * diskdump.c --- netdump.h.org 2008-10-09 09:25:03.000000000 +0900 +++ netdump.h 2008-10-09 09:49:26.000000000 +0900 @@ -110,6 +110,8 @@ int p2m_frames; ulong *p2m_mfn_frame_list; ulong xen_phys_start; + int xen_major_version; + int xen_minor_version; }; #define KDUMP_P2M_INIT (0x1) --- netdump.c.org 2008-10-09 09:24:54.000000000 +0900 +++ netdump.c 2008-10-09 09:53:20.000000000 +0900 @@ -1525,6 +1525,8 @@ nd->xen_kdump_data->p2m_mfn = *(uptr+(words-1)); if (words > 9 && !nd->xen_kdump_data->xen_phys_start) nd->xen_kdump_data->xen_phys_start = *(uptr+(words-2)); + nd->xen_kdump_data->xen_major_version = *uptr; + nd->xen_kdump_data->xen_minor_version = *(uptr+1); } } break; @@ -1730,6 +1732,8 @@ nd->xen_kdump_data->p2m_mfn = *(up+(words-1)); if (words > 9 && !nd->xen_kdump_data->xen_phys_start) nd->xen_kdump_data->xen_phys_start = *(up+(words-2)); + nd->xen_kdump_data->xen_major_version = *up; + nd->xen_kdump_data->xen_minor_version = *(up+1); } } break; @@ -2343,3 +2347,15 @@ { return nd->xen_kdump_data->xen_phys_start; } + +int +xen_major_version(void) +{ + return nd->xen_kdump_data->xen_major_version; +} + +int +xen_minor_version(void) +{ + return nd->xen_kdump_data->xen_minor_version; +} --- xen_hyper_defs.h.org 2008-10-06 13:45:39.000000000 +0900 +++ xen_hyper_defs.h 2008-10-06 13:44:44.000000000 +0900 @@ -134,9 +134,8 @@ #endif #if defined(X86) || defined(X86_64) -#define XEN_HYPER_PERCPU_SHIFT 12 #define xen_hyper_per_cpu(var, cpu) \ - ((ulong)(var) + (((ulong)(cpu))<percpu_shift)) #elif defined(IA64) #define xen_hyper_per_cpu(var, cpu) \ ((xht->flags & XEN_HYPER_SMP) ? \ @@ -404,6 +403,7 @@ ulong *cpumask; uint *cpu_idxs; ulong *__per_cpu_offset; + int percpu_shift; }; struct xen_hyper_dumpinfo_context { --- xen_hyper.c.org 2008-10-06 13:41:14.000000000 +0900 +++ xen_hyper.c 2008-10-09 11:31:24.000000000 +0900 @@ -71,6 +71,13 @@ #endif #if defined(X86) || defined(X86_64) + if (symbol_exists("__per_cpu_shift")) { + xht->percpu_shift = (int)symbol_value("__per_cpu_shift"); + } else if (xen_major_version() >= 3 && xen_minor_version() >= 3) { + xht->percpu_shift = 13; + } else { + xht->percpu_shift = 12; + } member_offset = MEMBER_OFFSET("cpuinfo_x86", "x86_model_id"); buf = GETBUF(XEN_HYPER_SIZE(cpuinfo_x86)); if (xen_hyper_test_pcpu_id(XEN_HYPER_CRASHING_CPU())) { @@ -1746,9 +1753,11 @@ tmp2 = (ulong)jiffies_64; jiffies_64 = (ulonglong)(tmp2 - tmp1); } - } else { + } else if (symbol_exists("jiffies")) { get_symbol_data("jiffies", sizeof(long), &jiffies); jiffies_64 = (ulonglong)jiffies; + } else { + jiffies_64 = 0; /* hypervisor does not have uptime */ } return jiffies_64; --- xen_hyper_command.c.org 2008-10-07 08:05:37.000000000 +0900 +++ xen_hyper_command.c 2008-10-07 08:24:29.000000000 +0900 @@ -1022,7 +1022,8 @@ (buf1, "%d\n", XEN_HYPER_NR_DOMAINS())); /* !!!Display a date here if it can be found. */ XEN_HYPER_PRI(fp, len, "UPTIME: ", buf1, flag, - (buf1, "%s\n", convert_time(xen_hyper_get_uptime_hyper(), buf2))); + (buf1, "%s\n", (xen_hyper_get_uptime_hyper() ? + convert_time(xen_hyper_get_uptime_hyper(), buf2) : "--:--:--"))); /* !!!Display a version here if it can be found. */ XEN_HYPER_PRI_CONST(fp, len, "MACHINE: ", flag); if (strlen(uts->machine)) {