FAQ Search Today's Posts Mark Forums Read

» Linux Archive
Home
New Posts
Search
FAQ


Go Back   Linux Archive > Redhat > Crash Utility

 
 
LinkBack Thread Tools
 
Old 04-18-2008, 12:13 AM
Itsuro ODA
 
Default some updates of xencrash

Hi,

The attached is some fixes which are necessary for xencrash to use
for the newer version of xen (after 3.1.0, ex. 3.1.2, 3.2.0).

* x86
- add some symbols which are used to know the boundary
condition at the tracing in 'bt'.
- fix for the symbol 'idle_pg_table_l3' going away.

* x86_64
- fix for the virtual address area of xen code/data is added.
- fix for the symbol 'idle_pg_table_l4' going away.
- add the option '--xen_phys_start_mfn='
newer version of xen (ex. RHEL5.2, 3.2.0) moves the
physical(machine) address of xen code/data area after
the system started up.
The relocated physical(machine) address of xen code/data
area is necessary to use xencrash.
The value can be got by 'cat /proc/iomem' under dom0.
-------------------------------------------------------
# cat /proc/iomem
...
7e600000-7f5fffff : Hypervisor code and data *** this line
...
-------------------------------------------------------
ex. to use xencrash:
# crash --xen_phys_start_mfn=0x7e600 xen-syms vmcore
- extract 'xen_phys_start_mfn' from the XEN_ELFNOTE_CRASH_INFO
ElfNote.
This is experimental code because it is necessary to modify
the xen to add the xen_phys_start_mfn value in the ElfNote
at crash time. (the patch is also attached in this mail.)
A sample dump is availavle in the following URL:
http://people.valinux.co.jp/~oda/x86_64_dump_080417.tar.gz

This patch is for crash-4.0-6.2.

Thanks.
Itsuro Oda

=== for x86 ===
--- lkcd_x86_trace.c.org 2008-04-17 10:13:05.000000000 +0900
+++ lkcd_x86_trace.c 2008-04-17 10:13:17.000000000 +0900
@@ -1423,6 +1423,7 @@
if (XEN_HYPER_MODE()) {
func_name = kl_funcname(pc);
if (STREQ(func_name, "idle_loop") || STREQ(func_name, "hypercall")
+ || STREQ(func_name, "tracing_off")
|| STREQ(func_name, "handle_exception")) {
UPDATE_FRAME(func_name, pc, 0, sp, bp, asp, 0, 0, bp - sp, 0);
return(trace->nframes);
@@ -1682,6 +1683,7 @@
if (func_name && XEN_HYPER_MODE()) {
if (STREQ(func_name, "continue_nmi") ||
STREQ(func_name, "vmx_asm_vmexit_handler") ||
+ STREQ(func_name, "handle_nmi_mce") ||
STREQ(func_name, "deferred_nmi")) {
/* Interrupt frame */
sp = curframe->fp + 4;
--- x86.c.org 2008-04-17 10:29:21.000000000 +0900
+++ x86.c 2008-04-17 10:31:51.000000000 +0900
@@ -2846,7 +2846,10 @@
*paddr = kvaddr - DIRECTMAP_VIRT_START;
return TRUE;
}
- pgd = (ulonglong *)symbol_value("idle_pg_table_l3");
+ if (symbol_exists("idle_pg_table_l3"))
+ pgd = (ulonglong *)symbol_value("idle_pg_table_l3");
+ else
+ pgd = (ulonglong *)symbol_value("idle_pg_table");
} else {
if (!vt->vmalloc_start) {
*paddr = VTOP(kvaddr);
@@ -4965,7 +4968,8 @@
break;

case PRE_GDB:
- if (symbol_exists("idle_pg_table_l3")) {
+ if (symbol_exists("create_pae_xen_mappings") ||
+ symbol_exists("idle_pg_table_l3")) {
machdep->flags |= PAE;
PGDIR_SHIFT = PGDIR_SHIFT_3LEVEL;
PTRS_PER_PTE = PTRS_PER_PTE_3LEVEL;

=== for x86_64 ===
--- defs.h.org 2008-04-17 15:03:14.000000000 +0900
+++ defs.h 2008-04-17 15:41:10.000000000 +0900
@@ -2162,10 +2162,13 @@

#define FILL_PML4_HYPER() {
if (!machdep->machspec->last_pml4_read) {
- readmem(symbol_value("idle_pg_table_4"), KVADDR,
- machdep->machspec->pml4, PAGESIZE(), "idle_pg_table_4",
+ unsigned long idle_pg_table =
+ symbol_exists("idle_pg_table_4") ? symbol_value("idle_pg_table_4") :
+ symbol_value("idle_pg_table");
+ readmem(idle_pg_table, KVADDR,
+ machdep->machspec->pml4, PAGESIZE(), "idle_pg_table",
FAULT_ON_ERROR);
- machdep->machspec->last_pml4_read = symbol_value("idle_pg_table_4");
+ machdep->machspec->last_pml4_read = idle_pg_table;
}
}

@@ -4081,6 +4084,8 @@
void get_kdump_regs(struct bt_info *, ulong *, ulong *);
void xen_kdump_p2m_mfn(char *);
int is_sadump_xen(void);
+void set_xen_phys_start_mfn(char *);
+ulong xen_phys_start_mfn(void);

/*
* diskdump.c
--- main.c.org 2008-04-17 15:26:37.000000000 +0900
+++ main.c 2008-04-17 15:45:18.000000000 +0900
@@ -48,6 +48,7 @@
{"no_ikconfig", 0, 0, 0},
{"hyper", 0, 0, 0},
{"p2m_mfn", required_argument, 0, 0},
+ {"xen_phys_start_mfn", required_argument, 0, 0},
{"zero_excluded", 0, 0, 0},
{"no_panic", 0, 0, 0},
{"more", 0, 0, 0},
@@ -155,6 +156,9 @@
else if (STREQ(long_options[option_index].name, "p2m_mfn"))
xen_kdump_p2m_mfn(optarg);

+ else if (STREQ(long_options[option_index].name, "xen_phys_start_mfn"))
+ set_xen_phys_start_mfn(optarg);
+
else if (STREQ(long_options[option_index].name, "zero_excluded"))
*diskdump_flags |= ZERO_EXCLUDED;

--- netdump.c.org 2008-04-17 15:09:06.000000000 +0900
+++ netdump.c 2008-04-17 15:48:44.000000000 +0900
@@ -1521,6 +1521,8 @@
*/
if (!nd->xen_kdump_data->p2m_mfn)
nd->xen_kdump_data->p2m_mfn = *(uptr+(words-1));
+ if (words > 9 && !nd->xen_kdump_data->xen_phys_start_mfn)
+ nd->xen_kdump_data->xen_phys_start_mfn = *(uptr+(words-2));
}
}
break;
@@ -1724,6 +1726,8 @@
*/
if (!nd->xen_kdump_data->p2m_mfn)
nd->xen_kdump_data->p2m_mfn = *(up+(words-1));
+ if (words > 9 && !nd->xen_kdump_data->xen_phys_start_mfn)
+ nd->xen_kdump_data->xen_phys_start_mfn = *(up+(words-2));
}
}
break;
@@ -2312,3 +2316,22 @@

return FALSE;
}
+
+void
+set_xen_phys_start_mfn(char *arg)
+{
+ ulong value;
+ int errflag = 0;
+
+ value = htol(arg, RETURN_ON_ERROR|QUIET, &errflag);
+ if (!errflag)
+ xen_kdump_data.xen_phys_start_mfn = value;
+ else
+ error(WARNING, "invalid xen_phys_start_mfn argument: %s
", arg);
+}
+
+ulong
+xen_phys_start_mfn(void)
+{
+ return nd->xen_kdump_data->xen_phys_start_mfn;
+}
--- netdump.h.org 2008-04-17 15:38:59.000000000 +0900
+++ netdump.h 2008-04-17 15:39:38.000000000 +0900
@@ -109,6 +109,7 @@
ulong accesses;
int p2m_frames;
ulong *p2m_mfn_frame_list;
+ ulong xen_phys_start_mfn;
};

#define KDUMP_P2M_INIT (0x1)
--- x86_64.c.org 2008-04-17 15:34:32.000000000 +0900
+++ x86_64.c 2008-04-17 15:36:53.000000000 +0900
@@ -1401,6 +1401,10 @@
return FALSE;

if (XEN_HYPER_MODE()) {
+ if (XENTEXT_VIRT_ADDR(kvaddr)) {
+ *paddr = kvaddr - __XEN_VIRT_START + (xen_phys_start_mfn() << PAGESHIFT());
+ return TRUE;
+ }
if (DIRECTMAP_VIRT_ADDR(kvaddr)) {
*paddr = kvaddr - DIRECTMAP_VIRT_START;
return TRUE;
--- xen_hyper_defs.h.org 2008-04-17 15:31:23.000000000 +0900
+++ xen_hyper_defs.h 2008-04-17 15:34:15.000000000 +0900
@@ -64,6 +64,9 @@
#define DIRECTMAP_VIRT_START (0xffff830000000000)
#define DIRECTMAP_VIRT_END (0xffff840000000000)
#define PAGE_OFFSET_XEN_HYPER DIRECTMAP_VIRT_START
+#define __XEN_VIRT_START (0xFFFF828C80000000)
+#define XENTEXT_VIRT_ADDR(vaddr)
+ (((vaddr) >= __XEN_VIRT_START) && ((vaddr) < DIRECTMAP_VIRT_START))
#endif

#ifdef IA64

=== Xen (explanation purpose) ===
--- include/xen/elfcore.h.org 2008-04-17 14:11:41.000000000 +0900
+++ include/xen/elfcore.h 2008-04-17 14:11:57.000000000 +0900
@@ -66,6 +66,7 @@
unsigned long xen_compile_time;
unsigned long tainted;
#ifdef CONFIG_X86
+ unsigned long xen_phys_start_mfn;
unsigned long dom0_pfn_to_mfn_frame_list_list;
#endif
} crash_xen_info_t;
--- arch/x86/crash.c.org 2008-04-17 14:12:51.000000000 +0900
+++ arch/x86/crash.c 2008-04-17 14:13:13.000000000 +0900
@@ -102,6 +102,7 @@
hvm_disable();

info = kexec_crash_save_info();
+ info->xen_phys_start_mfn = xen_phys_start >> PAGE_SHIFT;
info->dom0_pfn_to_mfn_frame_list_list =
arch_get_pfn_to_mfn_frame_list_list(dom0);
}
--
Itsuro ODA <oda@valinux.co.jp>

--
Crash-utility mailing list
Crash-utility@redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility
 
Old 04-18-2008, 02:14 PM
Dave Anderson
 
Default some updates of xencrash

Itsuro ODA wrote:

Hi,

The attached is some fixes which are necessary for xencrash to use
for the newer version of xen (after 3.1.0, ex. 3.1.2, 3.2.0).

* x86
- add some symbols which are used to know the boundary
condition at the tracing in 'bt'.
- fix for the symbol 'idle_pg_table_l3' going away.

* x86_64
- fix for the virtual address area of xen code/data is added.
- fix for the symbol 'idle_pg_table_l4' going away.
- add the option '--xen_phys_start_mfn='
newer version of xen (ex. RHEL5.2, 3.2.0) moves the
physical(machine) address of xen code/data area after
the system started up.

The relocated physical(machine) address of xen code/data
area is necessary to use xencrash.
The value can be got by 'cat /proc/iomem' under dom0.
-------------------------------------------------------
# cat /proc/iomem
...
7e600000-7f5fffff : Hypervisor code and data *** this line
...
-------------------------------------------------------
ex. to use xencrash:
# crash --xen_phys_start_mfn=0x7e600 xen-syms vmcore
- extract 'xen_phys_start_mfn' from the XEN_ELFNOTE_CRASH_INFO
ElfNote.
This is experimental code because it is necessary to modify
the xen to add the xen_phys_start_mfn value in the ElfNote
at crash time. (the patch is also attached in this mail.)
A sample dump is availavle in the following URL:
http://people.valinux.co.jp/~oda/x86_64_dump_080417.tar.gz

This patch is for crash-4.0-6.2.

Thanks.
Itsuro Oda


Hi Itsuro,

Thanks very much for the quick response.

I have one relatively minor issue. I understand that the previously existing
"--p2m_mfn" option was expressed as an mfn, and that made sense because its value
exists in the xen hypervisor code as an mfn value (actually a xen_pfn_t).

But it seems unnecessary to bother going through the translation of the
hypservisors's "xen_phys_start" physical address into an mfn? And then
only to have the crash utility have to turn it back into a physical address
when it uses it? Why not just leave it as a physical address in both the
kernel patch, and when passing it to the crash utility?

From a user's standpoint, when it's necessary to pre-determine the argument from
a hypervisor/dom0 vmcore that doesn't contain it, the xen_phys_start can be determined
by either reading /proc/iomem on the live system, where as you've shown in
the example above, it's 7e600000:

> # cat /proc/iomem
> ...
> 7e600000-7f5fffff : Hypervisor code and data *** this line
> ...

Alternatively, the same dom0/HV kdump vmcore can be run in a crash session using
the dom0 vmlinux, where in this example vmcore, it's 0x3f000000:

crash> px xen_hypervisor_res
xen_hypervisor_res = $3 = {
start = 0x3f000000,
end = 0x3fffffff,
name = 0xffffffff8049ab72 "Hypervisor code and data",
flags = 0x80000200,
parent = 0xffff880000001180,
sibling = 0x0,
child = 0xffff8800000000a8
}

For convenience sake, I'd prefer to just leave it as that, without
needlessly forcing the user to translate the above into an mfn, so
that they can simply enter: "crash --xen_phys_start=0x3f000000 ..."

The same thing applies to the kernel patch -- just leave it in its
natural state as a physical (machine) address.

Unfortunately it's already going to be an annoyance to have to pre-determine
the xen_phys_start value -- so why bother making it even more cryptic by
forcing the user to turn it into an mfn?

Another theoretical question -- since the /proc/iomem exports the
xen_phys_start variable to user space, is there any way it could
be handled entirely in user space by kexec-tools?

Dave




=== for x86 ===
--- lkcd_x86_trace.c.org 2008-04-17 10:13:05.000000000 +0900
+++ lkcd_x86_trace.c 2008-04-17 10:13:17.000000000 +0900
@@ -1423,6 +1423,7 @@
if (XEN_HYPER_MODE()) {
func_name = kl_funcname(pc);
if (STREQ(func_name, "idle_loop") || STREQ(func_name, "hypercall")
+ || STREQ(func_name, "tracing_off")
|| STREQ(func_name, "handle_exception")) {
UPDATE_FRAME(func_name, pc, 0, sp, bp, asp, 0, 0, bp - sp, 0);
return(trace->nframes);
@@ -1682,6 +1683,7 @@
if (func_name && XEN_HYPER_MODE()) {
if (STREQ(func_name, "continue_nmi") ||
STREQ(func_name, "vmx_asm_vmexit_handler") ||
+ STREQ(func_name, "handle_nmi_mce") ||
STREQ(func_name, "deferred_nmi")) {
/* Interrupt frame */
sp = curframe->fp + 4;
--- x86.c.org 2008-04-17 10:29:21.000000000 +0900
+++ x86.c 2008-04-17 10:31:51.000000000 +0900
@@ -2846,7 +2846,10 @@
*paddr = kvaddr - DIRECTMAP_VIRT_START;
return TRUE;
}
- pgd = (ulonglong *)symbol_value("idle_pg_table_l3");
+ if (symbol_exists("idle_pg_table_l3"))
+ pgd = (ulonglong *)symbol_value("idle_pg_table_l3");
+ else
+ pgd = (ulonglong *)symbol_value("idle_pg_table");
} else {
if (!vt->vmalloc_start) {
*paddr = VTOP(kvaddr);
@@ -4965,7 +4968,8 @@
break;

case PRE_GDB:

- if (symbol_exists("idle_pg_table_l3")) {
+ if (symbol_exists("create_pae_xen_mappings") ||
+ symbol_exists("idle_pg_table_l3")) {
machdep->flags |= PAE;
PGDIR_SHIFT = PGDIR_SHIFT_3LEVEL;
PTRS_PER_PTE = PTRS_PER_PTE_3LEVEL;

=== for x86_64 ===
--- defs.h.org 2008-04-17 15:03:14.000000000 +0900
+++ defs.h 2008-04-17 15:41:10.000000000 +0900
@@ -2162,10 +2162,13 @@

#define FILL_PML4_HYPER() {

if (!machdep->machspec->last_pml4_read) {
- readmem(symbol_value("idle_pg_table_4"), KVADDR,
- machdep->machspec->pml4, PAGESIZE(), "idle_pg_table_4",
+ unsigned long idle_pg_table =
+ symbol_exists("idle_pg_table_4") ? symbol_value("idle_pg_table_4") :
+ symbol_value("idle_pg_table");
+ readmem(idle_pg_table, KVADDR,
+ machdep->machspec->pml4, PAGESIZE(), "idle_pg_table",
FAULT_ON_ERROR);
- machdep->machspec->last_pml4_read = symbol_value("idle_pg_table_4");
+ machdep->machspec->last_pml4_read = idle_pg_table;
}
}

@@ -4081,6 +4084,8 @@

void get_kdump_regs(struct bt_info *, ulong *, ulong *);
void xen_kdump_p2m_mfn(char *);
int is_sadump_xen(void);
+void set_xen_phys_start_mfn(char *);
+ulong xen_phys_start_mfn(void);

/*

* diskdump.c
--- main.c.org 2008-04-17 15:26:37.000000000 +0900
+++ main.c 2008-04-17 15:45:18.000000000 +0900
@@ -48,6 +48,7 @@
{"no_ikconfig", 0, 0, 0},
{"hyper", 0, 0, 0},
{"p2m_mfn", required_argument, 0, 0},
+ {"xen_phys_start_mfn", required_argument, 0, 0},
{"zero_excluded", 0, 0, 0},
{"no_panic", 0, 0, 0},
{"more", 0, 0, 0},
@@ -155,6 +156,9 @@
else if (STREQ(long_options[option_index].name, "p2m_mfn"))
xen_kdump_p2m_mfn(optarg);

+ else if (STREQ(long_options[option_index].name, "xen_phys_start_mfn"))
+ set_xen_phys_start_mfn(optarg);

+
else if (STREQ(long_options[option_index].name, "zero_excluded"))
*diskdump_flags |= ZERO_EXCLUDED;

--- netdump.c.org 2008-04-17 15:09:06.000000000 +0900

+++ netdump.c 2008-04-17 15:48:44.000000000 +0900
@@ -1521,6 +1521,8 @@
*/
if (!nd->xen_kdump_data->p2m_mfn)
nd->xen_kdump_data->p2m_mfn = *(uptr+(words-1));
+ if (words > 9 && !nd->xen_kdump_data->xen_phys_start_mfn)
+ nd->xen_kdump_data->xen_phys_start_mfn = *(uptr+(words-2));
}
}
break;
@@ -1724,6 +1726,8 @@
*/
if (!nd->xen_kdump_data->p2m_mfn)
nd->xen_kdump_data->p2m_mfn = *(up+(words-1));
+ if (words > 9 && !nd->xen_kdump_data->xen_phys_start_mfn)
+ nd->xen_kdump_data->xen_phys_start_mfn = *(up+(words-2));
}
}
break;
@@ -2312,3 +2316,22 @@

return FALSE;

}
+
+void
+set_xen_phys_start_mfn(char *arg)
+{
+ ulong value;
+ int errflag = 0;
+
+ value = htol(arg, RETURN_ON_ERROR|QUIET, &errflag);
+ if (!errflag)
+ xen_kdump_data.xen_phys_start_mfn = value;
+ else
+ error(WARNING, "invalid xen_phys_start_mfn argument: %s
", arg);

+}
+
+ulong
+xen_phys_start_mfn(void)
+{
+ return nd->xen_kdump_data->xen_phys_start_mfn;
+}
--- netdump.h.org 2008-04-17 15:38:59.000000000 +0900
+++ netdump.h 2008-04-17 15:39:38.000000000 +0900
@@ -109,6 +109,7 @@
ulong accesses;
int p2m_frames;
ulong *p2m_mfn_frame_list;
+ ulong xen_phys_start_mfn;
};

#define KDUMP_P2M_INIT (0x1)

--- x86_64.c.org 2008-04-17 15:34:32.000000000 +0900
+++ x86_64.c 2008-04-17 15:36:53.000000000 +0900
@@ -1401,6 +1401,10 @@
return FALSE;

if (XEN_HYPER_MODE()) {

+ if (XENTEXT_VIRT_ADDR(kvaddr)) {
+ *paddr = kvaddr - __XEN_VIRT_START + (xen_phys_start_mfn() << PAGESHIFT());
+ return TRUE;
+ }
if (DIRECTMAP_VIRT_ADDR(kvaddr)) {
*paddr = kvaddr - DIRECTMAP_VIRT_START;
return TRUE;
--- xen_hyper_defs.h.org 2008-04-17 15:31:23.000000000 +0900
+++ xen_hyper_defs.h 2008-04-17 15:34:15.000000000 +0900
@@ -64,6 +64,9 @@
#define DIRECTMAP_VIRT_START (0xffff830000000000)
#define DIRECTMAP_VIRT_END (0xffff840000000000)
#define PAGE_OFFSET_XEN_HYPER DIRECTMAP_VIRT_START
+#define __XEN_VIRT_START (0xFFFF828C80000000)
+#define XENTEXT_VIRT_ADDR(vaddr)
+ (((vaddr) >= __XEN_VIRT_START) && ((vaddr) < DIRECTMAP_VIRT_START))
#endif

#ifdef IA64


=== Xen (explanation purpose) ===
--- include/xen/elfcore.h.org 2008-04-17 14:11:41.000000000 +0900
+++ include/xen/elfcore.h 2008-04-17 14:11:57.000000000 +0900
@@ -66,6 +66,7 @@
unsigned long xen_compile_time;
unsigned long tainted;
#ifdef CONFIG_X86
+ unsigned long xen_phys_start_mfn;
unsigned long dom0_pfn_to_mfn_frame_list_list;
#endif
} crash_xen_info_t;
--- arch/x86/crash.c.org 2008-04-17 14:12:51.000000000 +0900
+++ arch/x86/crash.c 2008-04-17 14:13:13.000000000 +0900
@@ -102,6 +102,7 @@
hvm_disable();

info = kexec_crash_save_info();

+ info->xen_phys_start_mfn = xen_phys_start >> PAGE_SHIFT;
info->dom0_pfn_to_mfn_frame_list_list =
arch_get_pfn_to_mfn_frame_list_list(dom0);
}


--
Crash-utility mailing list
Crash-utility@redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility
 
Old 04-21-2008, 01:47 AM
Itsuro ODA
 
Default some updates of xencrash

Hi Dave,

I thought it is better to be small value from the view point
to save 'xen_phys_start' value in the crashinfo.

>From the view point of users you are right. It should be
'--xen_phys_start=<address>'.

> Another theoretical question -- since the /proc/iomem exports the
> xen_phys_start variable to user space, is there any way it could
> be handled entirely in user space by kexec-tools?

Theoretically yes. But it is necessary to add another ElfNote section.
I thought it is the smallest modication necessary to add 'xen_phys_start'
in the crashinfo.
Do you think which is better ?

Thanks.
Itsuro Oda

On Fri, 18 Apr 2008 10:14:04 -0400
Dave Anderson <anderson@redhat.com> wrote:

> Itsuro ODA wrote:
> > Hi,
> >
> > The attached is some fixes which are necessary for xencrash to use
> > for the newer version of xen (after 3.1.0, ex. 3.1.2, 3.2.0).
> >
> > * x86
> > - add some symbols which are used to know the boundary
> > condition at the tracing in 'bt'.
> > - fix for the symbol 'idle_pg_table_l3' going away.
> >
> > * x86_64
> > - fix for the virtual address area of xen code/data is added.
> > - fix for the symbol 'idle_pg_table_l4' going away.
> > - add the option '--xen_phys_start_mfn='
> > newer version of xen (ex. RHEL5.2, 3.2.0) moves the
> > physical(machine) address of xen code/data area after
> > the system started up.
> > The relocated physical(machine) address of xen code/data
> > area is necessary to use xencrash.
> > The value can be got by 'cat /proc/iomem' under dom0.
> > -------------------------------------------------------
> > # cat /proc/iomem
> > ...
> > 7e600000-7f5fffff : Hypervisor code and data *** this line
> > ...
> > -------------------------------------------------------
> > ex. to use xencrash:
> > # crash --xen_phys_start_mfn=0x7e600 xen-syms vmcore
> > - extract 'xen_phys_start_mfn' from the XEN_ELFNOTE_CRASH_INFO
> > ElfNote.
> > This is experimental code because it is necessary to modify
> > the xen to add the xen_phys_start_mfn value in the ElfNote
> > at crash time. (the patch is also attached in this mail.)
> > A sample dump is availavle in the following URL:
> > http://people.valinux.co.jp/~oda/x86_64_dump_080417.tar.gz
> >
> > This patch is for crash-4.0-6.2.
> >
> > Thanks.
> > Itsuro Oda
>
> Hi Itsuro,
>
> Thanks very much for the quick response.
>
> I have one relatively minor issue. I understand that the previously existing
> "--p2m_mfn" option was expressed as an mfn, and that made sense because its value
> exists in the xen hypervisor code as an mfn value (actually a xen_pfn_t).
>
> But it seems unnecessary to bother going through the translation of the
> hypservisors's "xen_phys_start" physical address into an mfn? And then
> only to have the crash utility have to turn it back into a physical address
> when it uses it? Why not just leave it as a physical address in both the
> kernel patch, and when passing it to the crash utility?
>
> From a user's standpoint, when it's necessary to pre-determine the argument from
> a hypervisor/dom0 vmcore that doesn't contain it, the xen_phys_start can be determined
> by either reading /proc/iomem on the live system, where as you've shown in
> the example above, it's 7e600000:
>
> > # cat /proc/iomem
> > ...
> > 7e600000-7f5fffff : Hypervisor code and data *** this line
> > ...
>
> Alternatively, the same dom0/HV kdump vmcore can be run in a crash session using
> the dom0 vmlinux, where in this example vmcore, it's 0x3f000000:
>
> crash> px xen_hypervisor_res
> xen_hypervisor_res = $3 = {
> start = 0x3f000000,
> end = 0x3fffffff,
> name = 0xffffffff8049ab72 "Hypervisor code and data",
> flags = 0x80000200,
> parent = 0xffff880000001180,
> sibling = 0x0,
> child = 0xffff8800000000a8
> }
>
> For convenience sake, I'd prefer to just leave it as that, without
> needlessly forcing the user to translate the above into an mfn, so
> that they can simply enter: "crash --xen_phys_start=0x3f000000 ..."
>
> The same thing applies to the kernel patch -- just leave it in its
> natural state as a physical (machine) address.
>
> Unfortunately it's already going to be an annoyance to have to pre-determine
> the xen_phys_start value -- so why bother making it even more cryptic by
> forcing the user to turn it into an mfn?
>
> Another theoretical question -- since the /proc/iomem exports the
> xen_phys_start variable to user space, is there any way it could
> be handled entirely in user space by kexec-tools?
>
> Dave
>
>
> >
> > === for x86 ===
> > --- lkcd_x86_trace.c.org 2008-04-17 10:13:05.000000000 +0900
> > +++ lkcd_x86_trace.c 2008-04-17 10:13:17.000000000 +0900
> > @@ -1423,6 +1423,7 @@
> > if (XEN_HYPER_MODE()) {
> > func_name = kl_funcname(pc);
> > if (STREQ(func_name, "idle_loop") || STREQ(func_name, "hypercall")
> > + || STREQ(func_name, "tracing_off")
> > || STREQ(func_name, "handle_exception")) {
> > UPDATE_FRAME(func_name, pc, 0, sp, bp, asp, 0, 0, bp - sp, 0);
> > return(trace->nframes);
> > @@ -1682,6 +1683,7 @@
> > if (func_name && XEN_HYPER_MODE()) {
> > if (STREQ(func_name, "continue_nmi") ||
> > STREQ(func_name, "vmx_asm_vmexit_handler") ||
> > + STREQ(func_name, "handle_nmi_mce") ||
> > STREQ(func_name, "deferred_nmi")) {
> > /* Interrupt frame */
> > sp = curframe->fp + 4;
> > --- x86.c.org 2008-04-17 10:29:21.000000000 +0900
> > +++ x86.c 2008-04-17 10:31:51.000000000 +0900
> > @@ -2846,7 +2846,10 @@
> > *paddr = kvaddr - DIRECTMAP_VIRT_START;
> > return TRUE;
> > }
> > - pgd = (ulonglong *)symbol_value("idle_pg_table_l3");
> > + if (symbol_exists("idle_pg_table_l3"))
> > + pgd = (ulonglong *)symbol_value("idle_pg_table_l3");
> > + else
> > + pgd = (ulonglong *)symbol_value("idle_pg_table");
> > } else {
> > if (!vt->vmalloc_start) {
> > *paddr = VTOP(kvaddr);
> > @@ -4965,7 +4968,8 @@
> > break;
> >
> > case PRE_GDB:
> > - if (symbol_exists("idle_pg_table_l3")) {
> > + if (symbol_exists("create_pae_xen_mappings") ||
> > + symbol_exists("idle_pg_table_l3")) {
> > machdep->flags |= PAE;
> > PGDIR_SHIFT = PGDIR_SHIFT_3LEVEL;
> > PTRS_PER_PTE = PTRS_PER_PTE_3LEVEL;
> >
> > === for x86_64 ===
> > --- defs.h.org 2008-04-17 15:03:14.000000000 +0900
> > +++ defs.h 2008-04-17 15:41:10.000000000 +0900
> > @@ -2162,10 +2162,13 @@
> >
> > #define FILL_PML4_HYPER() {
> > if (!machdep->machspec->last_pml4_read) {
> > - readmem(symbol_value("idle_pg_table_4"), KVADDR,
> > - machdep->machspec->pml4, PAGESIZE(), "idle_pg_table_4",
> > + unsigned long idle_pg_table =
> > + symbol_exists("idle_pg_table_4") ? symbol_value("idle_pg_table_4") :
> > + symbol_value("idle_pg_table");
> > + readmem(idle_pg_table, KVADDR,
> > + machdep->machspec->pml4, PAGESIZE(), "idle_pg_table",
> > FAULT_ON_ERROR);
> > - machdep->machspec->last_pml4_read = symbol_value("idle_pg_table_4");
> > + machdep->machspec->last_pml4_read = idle_pg_table;
> > }
> > }
> >
> > @@ -4081,6 +4084,8 @@
> > void get_kdump_regs(struct bt_info *, ulong *, ulong *);
> > void xen_kdump_p2m_mfn(char *);
> > int is_sadump_xen(void);
> > +void set_xen_phys_start_mfn(char *);
> > +ulong xen_phys_start_mfn(void);
> >
> > /*
> > * diskdump.c
> > --- main.c.org 2008-04-17 15:26:37.000000000 +0900
> > +++ main.c 2008-04-17 15:45:18.000000000 +0900
> > @@ -48,6 +48,7 @@
> > {"no_ikconfig", 0, 0, 0},
> > {"hyper", 0, 0, 0},
> > {"p2m_mfn", required_argument, 0, 0},
> > + {"xen_phys_start_mfn", required_argument, 0, 0},
> > {"zero_excluded", 0, 0, 0},
> > {"no_panic", 0, 0, 0},
> > {"more", 0, 0, 0},
> > @@ -155,6 +156,9 @@
> > else if (STREQ(long_options[option_index].name, "p2m_mfn"))
> > xen_kdump_p2m_mfn(optarg);
> >
> > + else if (STREQ(long_options[option_index].name, "xen_phys_start_mfn"))
> > + set_xen_phys_start_mfn(optarg);
> > +
> > else if (STREQ(long_options[option_index].name, "zero_excluded"))
> > *diskdump_flags |= ZERO_EXCLUDED;
> >
> > --- netdump.c.org 2008-04-17 15:09:06.000000000 +0900
> > +++ netdump.c 2008-04-17 15:48:44.000000000 +0900
> > @@ -1521,6 +1521,8 @@
> > */
> > if (!nd->xen_kdump_data->p2m_mfn)
> > nd->xen_kdump_data->p2m_mfn = *(uptr+(words-1));
> > + if (words > 9 && !nd->xen_kdump_data->xen_phys_start_mfn)
> > + nd->xen_kdump_data->xen_phys_start_mfn = *(uptr+(words-2));
> > }
> > }
> > break;
> > @@ -1724,6 +1726,8 @@
> > */
> > if (!nd->xen_kdump_data->p2m_mfn)
> > nd->xen_kdump_data->p2m_mfn = *(up+(words-1));
> > + if (words > 9 && !nd->xen_kdump_data->xen_phys_start_mfn)
> > + nd->xen_kdump_data->xen_phys_start_mfn = *(up+(words-2));
> > }
> > }
> > break;
> > @@ -2312,3 +2316,22 @@
> >
> > return FALSE;
> > }
> > +
> > +void
> > +set_xen_phys_start_mfn(char *arg)
> > +{
> > + ulong value;
> > + int errflag = 0;
> > +
> > + value = htol(arg, RETURN_ON_ERROR|QUIET, &errflag);
> > + if (!errflag)
> > + xen_kdump_data.xen_phys_start_mfn = value;
> > + else
> > + error(WARNING, "invalid xen_phys_start_mfn argument: %s
", arg);
> > +}
> > +
> > +ulong
> > +xen_phys_start_mfn(void)
> > +{
> > + return nd->xen_kdump_data->xen_phys_start_mfn;
> > +}
> > --- netdump.h.org 2008-04-17 15:38:59.000000000 +0900
> > +++ netdump.h 2008-04-17 15:39:38.000000000 +0900
> > @@ -109,6 +109,7 @@
> > ulong accesses;
> > int p2m_frames;
> > ulong *p2m_mfn_frame_list;
> > + ulong xen_phys_start_mfn;
> > };
> >
> > #define KDUMP_P2M_INIT (0x1)
> > --- x86_64.c.org 2008-04-17 15:34:32.000000000 +0900
> > +++ x86_64.c 2008-04-17 15:36:53.000000000 +0900
> > @@ -1401,6 +1401,10 @@
> > return FALSE;
> >
> > if (XEN_HYPER_MODE()) {
> > + if (XENTEXT_VIRT_ADDR(kvaddr)) {
> > + *paddr = kvaddr - __XEN_VIRT_START + (xen_phys_start_mfn() << PAGESHIFT());
> > + return TRUE;
> > + }
> > if (DIRECTMAP_VIRT_ADDR(kvaddr)) {
> > *paddr = kvaddr - DIRECTMAP_VIRT_START;
> > return TRUE;
> > --- xen_hyper_defs.h.org 2008-04-17 15:31:23.000000000 +0900
> > +++ xen_hyper_defs.h 2008-04-17 15:34:15.000000000 +0900
> > @@ -64,6 +64,9 @@
> > #define DIRECTMAP_VIRT_START (0xffff830000000000)
> > #define DIRECTMAP_VIRT_END (0xffff840000000000)
> > #define PAGE_OFFSET_XEN_HYPER DIRECTMAP_VIRT_START
> > +#define __XEN_VIRT_START (0xFFFF828C80000000)
> > +#define XENTEXT_VIRT_ADDR(vaddr)
> > + (((vaddr) >= __XEN_VIRT_START) && ((vaddr) < DIRECTMAP_VIRT_START))
> > #endif
> >
> > #ifdef IA64
> >
> > === Xen (explanation purpose) ===
> > --- include/xen/elfcore.h.org 2008-04-17 14:11:41.000000000 +0900
> > +++ include/xen/elfcore.h 2008-04-17 14:11:57.000000000 +0900
> > @@ -66,6 +66,7 @@
> > unsigned long xen_compile_time;
> > unsigned long tainted;
> > #ifdef CONFIG_X86
> > + unsigned long xen_phys_start_mfn;
> > unsigned long dom0_pfn_to_mfn_frame_list_list;
> > #endif
> > } crash_xen_info_t;
> > --- arch/x86/crash.c.org 2008-04-17 14:12:51.000000000 +0900
> > +++ arch/x86/crash.c 2008-04-17 14:13:13.000000000 +0900
> > @@ -102,6 +102,7 @@
> > hvm_disable();
> >
> > info = kexec_crash_save_info();
> > + info->xen_phys_start_mfn = xen_phys_start >> PAGE_SHIFT;
> > info->dom0_pfn_to_mfn_frame_list_list =
> > arch_get_pfn_to_mfn_frame_list_list(dom0);
> > }
>

--
Itsuro ODA <oda@valinux.co.jp>


--
Crash-utility mailing list
Crash-utility@redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility
 
Old 04-21-2008, 01:09 PM
Dave Anderson
 
Default some updates of xencrash

Itsuro ODA wrote:

Hi Dave,

I thought it is better to be small value from the view point
to save 'xen_phys_start' value in the crashinfo.


From the view point of users you are right. It should be
'--xen_phys_start=<address>'.


Hi Itsuro,

But even from the kernel viewpoint, I'm not sure why it would be better?
The xen_phys_start symbol is an unsigned long, and its container in the
crash_xen_info_t is an unsigned long. So I don't see any benefit or reason
to make it smaller.




Another theoretical question -- since the /proc/iomem exports the
xen_phys_start variable to user space, is there any way it could
be handled entirely in user space by kexec-tools?


Theoretically yes. But it is necessary to add another ElfNote section.
I thought it is the smallest modication necessary to add 'xen_phys_start'
in the crashinfo.
Do you think which is better ?


That's a good question. My concern would be to have an easier way for customers
to deal with the problem without having to upgrade the kernel package; it's always
easier to upgrade a user-package.

However, whatever gets fixed goes beyond the scope of the crash utility.
For now, the crash utility will need the --xen-phys_start=xxxx workaround
because the RHEL5.2 kernel will be released without a fix. And that
decision will have to made by the kernel kexec/kdump and kexec-tools
maintainers. Can you bring up this discussion on the kexec list?

Thanks,
Dave



Thanks.
Itsuro Oda

On Fri, 18 Apr 2008 10:14:04 -0400
Dave Anderson <anderson@redhat.com> wrote:


Itsuro ODA wrote:

Hi,

The attached is some fixes which are necessary for xencrash to use
for the newer version of xen (after 3.1.0, ex. 3.1.2, 3.2.0).

* x86
- add some symbols which are used to know the boundary
condition at the tracing in 'bt'.
- fix for the symbol 'idle_pg_table_l3' going away.

* x86_64
- fix for the virtual address area of xen code/data is added.
- fix for the symbol 'idle_pg_table_l4' going away.
- add the option '--xen_phys_start_mfn='
newer version of xen (ex. RHEL5.2, 3.2.0) moves the
physical(machine) address of xen code/data area after
the system started up.

The relocated physical(machine) address of xen code/data
area is necessary to use xencrash.
The value can be got by 'cat /proc/iomem' under dom0.
-------------------------------------------------------
# cat /proc/iomem
...
7e600000-7f5fffff : Hypervisor code and data *** this line
...
-------------------------------------------------------
ex. to use xencrash:
# crash --xen_phys_start_mfn=0x7e600 xen-syms vmcore
- extract 'xen_phys_start_mfn' from the XEN_ELFNOTE_CRASH_INFO
ElfNote.
This is experimental code because it is necessary to modify
the xen to add the xen_phys_start_mfn value in the ElfNote
at crash time. (the patch is also attached in this mail.)
A sample dump is availavle in the following URL:
http://people.valinux.co.jp/~oda/x86_64_dump_080417.tar.gz

This patch is for crash-4.0-6.2.

Thanks.
Itsuro Oda

Hi Itsuro,

Thanks very much for the quick response.

I have one relatively minor issue. I understand that the previously existing
"--p2m_mfn" option was expressed as an mfn, and that made sense because its value
exists in the xen hypervisor code as an mfn value (actually a xen_pfn_t).

But it seems unnecessary to bother going through the translation of the
hypservisors's "xen_phys_start" physical address into an mfn? And then
only to have the crash utility have to turn it back into a physical address
when it uses it? Why not just leave it as a physical address in both the
kernel patch, and when passing it to the crash utility?

From a user's standpoint, when it's necessary to pre-determine the argument from
a hypervisor/dom0 vmcore that doesn't contain it, the xen_phys_start can be determined
by either reading /proc/iomem on the live system, where as you've shown in
the example above, it's 7e600000:

> # cat /proc/iomem
> ...
> 7e600000-7f5fffff : Hypervisor code and data *** this line
> ...

Alternatively, the same dom0/HV kdump vmcore can be run in a crash session using
the dom0 vmlinux, where in this example vmcore, it's 0x3f000000:

crash> px xen_hypervisor_res
xen_hypervisor_res = $3 = {
start = 0x3f000000,
end = 0x3fffffff,
name = 0xffffffff8049ab72 "Hypervisor code and data",
flags = 0x80000200,
parent = 0xffff880000001180,
sibling = 0x0,
child = 0xffff8800000000a8
}

For convenience sake, I'd prefer to just leave it as that, without
needlessly forcing the user to translate the above into an mfn, so
that they can simply enter: "crash --xen_phys_start=0x3f000000 ..."

The same thing applies to the kernel patch -- just leave it in its
natural state as a physical (machine) address.

Unfortunately it's already going to be an annoyance to have to pre-determine
the xen_phys_start value -- so why bother making it even more cryptic by
forcing the user to turn it into an mfn?

Another theoretical question -- since the /proc/iomem exports the
xen_phys_start variable to user space, is there any way it could
be handled entirely in user space by kexec-tools?

Dave



=== for x86 ===
--- lkcd_x86_trace.c.org 2008-04-17 10:13:05.000000000 +0900
+++ lkcd_x86_trace.c 2008-04-17 10:13:17.000000000 +0900
@@ -1423,6 +1423,7 @@
if (XEN_HYPER_MODE()) {
func_name = kl_funcname(pc);
if (STREQ(func_name, "idle_loop") || STREQ(func_name, "hypercall")
+ || STREQ(func_name, "tracing_off")
|| STREQ(func_name, "handle_exception")) {
UPDATE_FRAME(func_name, pc, 0, sp, bp, asp, 0, 0, bp - sp, 0);
return(trace->nframes);
@@ -1682,6 +1683,7 @@
if (func_name && XEN_HYPER_MODE()) {
if (STREQ(func_name, "continue_nmi") ||
STREQ(func_name, "vmx_asm_vmexit_handler") ||
+ STREQ(func_name, "handle_nmi_mce") ||
STREQ(func_name, "deferred_nmi")) {
/* Interrupt frame */
sp = curframe->fp + 4;
--- x86.c.org 2008-04-17 10:29:21.000000000 +0900
+++ x86.c 2008-04-17 10:31:51.000000000 +0900
@@ -2846,7 +2846,10 @@
*paddr = kvaddr - DIRECTMAP_VIRT_START;
return TRUE;
}
- pgd = (ulonglong *)symbol_value("idle_pg_table_l3");
+ if (symbol_exists("idle_pg_table_l3"))
+ pgd = (ulonglong *)symbol_value("idle_pg_table_l3");
+ else
+ pgd = (ulonglong *)symbol_value("idle_pg_table");
} else {
if (!vt->vmalloc_start) {
*paddr = VTOP(kvaddr);
@@ -4965,7 +4968,8 @@
break;

case PRE_GDB:

- if (symbol_exists("idle_pg_table_l3")) {
+ if (symbol_exists("create_pae_xen_mappings") ||
+ symbol_exists("idle_pg_table_l3")) {
machdep->flags |= PAE;
PGDIR_SHIFT = PGDIR_SHIFT_3LEVEL;
PTRS_PER_PTE = PTRS_PER_PTE_3LEVEL;

=== for x86_64 ===
--- defs.h.org 2008-04-17 15:03:14.000000000 +0900
+++ defs.h 2008-04-17 15:41:10.000000000 +0900
@@ -2162,10 +2162,13 @@

#define FILL_PML4_HYPER() {

if (!machdep->machspec->last_pml4_read) {
- readmem(symbol_value("idle_pg_table_4"), KVADDR,
- machdep->machspec->pml4, PAGESIZE(), "idle_pg_table_4",
+ unsigned long idle_pg_table =
+ symbol_exists("idle_pg_table_4") ? symbol_value("idle_pg_table_4") :
+ symbol_value("idle_pg_table");
+ readmem(idle_pg_table, KVADDR,
+ machdep->machspec->pml4, PAGESIZE(), "idle_pg_table",
FAULT_ON_ERROR);
- machdep->machspec->last_pml4_read = symbol_value("idle_pg_table_4");
+ machdep->machspec->last_pml4_read = idle_pg_table;
}
}

@@ -4081,6 +4084,8 @@

void get_kdump_regs(struct bt_info *, ulong *, ulong *);
void xen_kdump_p2m_mfn(char *);
int is_sadump_xen(void);
+void set_xen_phys_start_mfn(char *);
+ulong xen_phys_start_mfn(void);

/*

* diskdump.c
--- main.c.org 2008-04-17 15:26:37.000000000 +0900
+++ main.c 2008-04-17 15:45:18.000000000 +0900
@@ -48,6 +48,7 @@
{"no_ikconfig", 0, 0, 0},
{"hyper", 0, 0, 0},
{"p2m_mfn", required_argument, 0, 0},
+ {"xen_phys_start_mfn", required_argument, 0, 0},
{"zero_excluded", 0, 0, 0},
{"no_panic", 0, 0, 0},
{"more", 0, 0, 0},
@@ -155,6 +156,9 @@
else if (STREQ(long_options[option_index].name, "p2m_mfn"))
xen_kdump_p2m_mfn(optarg);

+ else if (STREQ(long_options[option_index].name, "xen_phys_start_mfn"))
+ set_xen_phys_start_mfn(optarg);

+
else if (STREQ(long_options[option_index].name, "zero_excluded"))
*diskdump_flags |= ZERO_EXCLUDED;

--- netdump.c.org 2008-04-17 15:09:06.000000000 +0900

+++ netdump.c 2008-04-17 15:48:44.000000000 +0900
@@ -1521,6 +1521,8 @@
*/
if (!nd->xen_kdump_data->p2m_mfn)
nd->xen_kdump_data->p2m_mfn = *(uptr+(words-1));
+ if (words > 9 && !nd->xen_kdump_data->xen_phys_start_mfn)
+ nd->xen_kdump_data->xen_phys_start_mfn = *(uptr+(words-2));
}
}
break;
@@ -1724,6 +1726,8 @@
*/
if (!nd->xen_kdump_data->p2m_mfn)
nd->xen_kdump_data->p2m_mfn = *(up+(words-1));
+ if (words > 9 && !nd->xen_kdump_data->xen_phys_start_mfn)
+ nd->xen_kdump_data->xen_phys_start_mfn = *(up+(words-2));
}
}
break;
@@ -2312,3 +2316,22 @@

return FALSE;

}
+
+void
+set_xen_phys_start_mfn(char *arg)
+{
+ ulong value;
+ int errflag = 0;
+
+ value = htol(arg, RETURN_ON_ERROR|QUIET, &errflag);
+ if (!errflag)
+ xen_kdump_data.xen_phys_start_mfn = value;
+ else
+ error(WARNING, "invalid xen_phys_start_mfn argument: %s
", arg);

+}
+
+ulong
+xen_phys_start_mfn(void)
+{
+ return nd->xen_kdump_data->xen_phys_start_mfn;
+}
--- netdump.h.org 2008-04-17 15:38:59.000000000 +0900
+++ netdump.h 2008-04-17 15:39:38.000000000 +0900
@@ -109,6 +109,7 @@
ulong accesses;
int p2m_frames;
ulong *p2m_mfn_frame_list;
+ ulong xen_phys_start_mfn;
};

#define KDUMP_P2M_INIT (0x1)

--- x86_64.c.org 2008-04-17 15:34:32.000000000 +0900
+++ x86_64.c 2008-04-17 15:36:53.000000000 +0900
@@ -1401,6 +1401,10 @@
return FALSE;

if (XEN_HYPER_MODE()) {

+ if (XENTEXT_VIRT_ADDR(kvaddr)) {
+ *paddr = kvaddr - __XEN_VIRT_START + (xen_phys_start_mfn() << PAGESHIFT());
+ return TRUE;
+ }
if (DIRECTMAP_VIRT_ADDR(kvaddr)) {
*paddr = kvaddr - DIRECTMAP_VIRT_START;
return TRUE;
--- xen_hyper_defs.h.org 2008-04-17 15:31:23.000000000 +0900
+++ xen_hyper_defs.h 2008-04-17 15:34:15.000000000 +0900
@@ -64,6 +64,9 @@
#define DIRECTMAP_VIRT_START (0xffff830000000000)
#define DIRECTMAP_VIRT_END (0xffff840000000000)
#define PAGE_OFFSET_XEN_HYPER DIRECTMAP_VIRT_START
+#define __XEN_VIRT_START (0xFFFF828C80000000)
+#define XENTEXT_VIRT_ADDR(vaddr)
+ (((vaddr) >= __XEN_VIRT_START) && ((vaddr) < DIRECTMAP_VIRT_START))
#endif

#ifdef IA64


=== Xen (explanation purpose) ===
--- include/xen/elfcore.h.org 2008-04-17 14:11:41.000000000 +0900
+++ include/xen/elfcore.h 2008-04-17 14:11:57.000000000 +0900
@@ -66,6 +66,7 @@
unsigned long xen_compile_time;
unsigned long tainted;
#ifdef CONFIG_X86
+ unsigned long xen_phys_start_mfn;
unsigned long dom0_pfn_to_mfn_frame_list_list;
#endif
} crash_xen_info_t;
--- arch/x86/crash.c.org 2008-04-17 14:12:51.000000000 +0900
+++ arch/x86/crash.c 2008-04-17 14:13:13.000000000 +0900
@@ -102,6 +102,7 @@
hvm_disable();

info = kexec_crash_save_info();

+ info->xen_phys_start_mfn = xen_phys_start >> PAGE_SHIFT;
info->dom0_pfn_to_mfn_frame_list_list =
arch_get_pfn_to_mfn_frame_list_list(dom0);
}




--
Crash-utility mailing list
Crash-utility@redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility
 
Old 04-21-2008, 10:21 PM
Itsuro ODA
 
Default some updates of xencrash

Hi Dave,

On Mon, 21 Apr 2008 09:09:59 -0400
Dave Anderson <anderson@redhat.com> wrote:

> Itsuro ODA wrote:
> > Hi Dave,
> >
> > I thought it is better to be small value from the view point
> > to save 'xen_phys_start' value in the crashinfo.
> >
> > From the view point of users you are right. It should be
> > '--xen_phys_start=<address>'.
>
> Hi Itsuro,
>
> But even from the kernel viewpoint, I'm not sure why it would be better?
> The xen_phys_start symbol is an unsigned long, and its container in the
> crash_xen_info_t is an unsigned long. So I don't see any benefit or reason
> to make it smaller.

Yes, I was too anxious.

> >
> >> Another theoretical question -- since the /proc/iomem exports the
> >> xen_phys_start variable to user space, is there any way it could
> >> be handled entirely in user space by kexec-tools?
> >
> > Theoretically yes. But it is necessary to add another ElfNote section.
> > I thought it is the smallest modication necessary to add 'xen_phys_start'
> > in the crashinfo.
> > Do you think which is better ?
>
> That's a good question. My concern would be to have an easier way for customers
> to deal with the problem without having to upgrade the kernel package; it's always
> easier to upgrade a user-package.

I see.

> However, whatever gets fixed goes beyond the scope of the crash utility.
> For now, the crash utility will need the --xen-phys_start=xxxx workaround
> because the RHEL5.2 kernel will be released without a fix. And that
> decision will have to made by the kernel kexec/kdump and kexec-tools
> maintainers. Can you bring up this discussion on the kexec list?

Yes, sure.

Thanks.
Itsuro Oda

>
> Thanks,
> Dave
>
> >
> > Thanks.
> > Itsuro Oda
> >
> > On Fri, 18 Apr 2008 10:14:04 -0400
> > Dave Anderson <anderson@redhat.com> wrote:
> >
> >> Itsuro ODA wrote:
> >>> Hi,
> >>>
> >>> The attached is some fixes which are necessary for xencrash to use
> >>> for the newer version of xen (after 3.1.0, ex. 3.1.2, 3.2.0).
> >>>
> >>> * x86
> >>> - add some symbols which are used to know the boundary
> >>> condition at the tracing in 'bt'.
> >>> - fix for the symbol 'idle_pg_table_l3' going away.
> >>>
> >>> * x86_64
> >>> - fix for the virtual address area of xen code/data is added.
> >>> - fix for the symbol 'idle_pg_table_l4' going away.
> >>> - add the option '--xen_phys_start_mfn='
> >>> newer version of xen (ex. RHEL5.2, 3.2.0) moves the
> >>> physical(machine) address of xen code/data area after
> >>> the system started up.
> >>> The relocated physical(machine) address of xen code/data
> >>> area is necessary to use xencrash.
> >>> The value can be got by 'cat /proc/iomem' under dom0.
> >>> -------------------------------------------------------
> >>> # cat /proc/iomem
> >>> ...
> >>> 7e600000-7f5fffff : Hypervisor code and data *** this line
> >>> ...
> >>> -------------------------------------------------------
> >>> ex. to use xencrash:
> >>> # crash --xen_phys_start_mfn=0x7e600 xen-syms vmcore
> >>> - extract 'xen_phys_start_mfn' from the XEN_ELFNOTE_CRASH_INFO
> >>> ElfNote.
> >>> This is experimental code because it is necessary to modify
> >>> the xen to add the xen_phys_start_mfn value in the ElfNote
> >>> at crash time. (the patch is also attached in this mail.)
> >>> A sample dump is availavle in the following URL:
> >>> http://people.valinux.co.jp/~oda/x86_64_dump_080417.tar.gz
> >>>
> >>> This patch is for crash-4.0-6.2.
> >>>
> >>> Thanks.
> >>> Itsuro Oda
> >> Hi Itsuro,
> >>
> >> Thanks very much for the quick response.
> >>
> >> I have one relatively minor issue. I understand that the previously existing
> >> "--p2m_mfn" option was expressed as an mfn, and that made sense because its value
> >> exists in the xen hypervisor code as an mfn value (actually a xen_pfn_t).
> >>
> >> But it seems unnecessary to bother going through the translation of the
> >> hypservisors's "xen_phys_start" physical address into an mfn? And then
> >> only to have the crash utility have to turn it back into a physical address
> >> when it uses it? Why not just leave it as a physical address in both the
> >> kernel patch, and when passing it to the crash utility?
> >>
> >> From a user's standpoint, when it's necessary to pre-determine the argument from
> >> a hypervisor/dom0 vmcore that doesn't contain it, the xen_phys_start can be determined
> >> by either reading /proc/iomem on the live system, where as you've shown in
> >> the example above, it's 7e600000:
> >>
> >> > # cat /proc/iomem
> >> > ...
> >> > 7e600000-7f5fffff : Hypervisor code and data *** this line
> >> > ...
> >>
> >> Alternatively, the same dom0/HV kdump vmcore can be run in a crash session using
> >> the dom0 vmlinux, where in this example vmcore, it's 0x3f000000:
> >>
> >> crash> px xen_hypervisor_res
> >> xen_hypervisor_res = $3 = {
> >> start = 0x3f000000,
> >> end = 0x3fffffff,
> >> name = 0xffffffff8049ab72 "Hypervisor code and data",
> >> flags = 0x80000200,
> >> parent = 0xffff880000001180,
> >> sibling = 0x0,
> >> child = 0xffff8800000000a8
> >> }
> >>
> >> For convenience sake, I'd prefer to just leave it as that, without
> >> needlessly forcing the user to translate the above into an mfn, so
> >> that they can simply enter: "crash --xen_phys_start=0x3f000000 ..."
> >>
> >> The same thing applies to the kernel patch -- just leave it in its
> >> natural state as a physical (machine) address.
> >>
> >> Unfortunately it's already going to be an annoyance to have to pre-determine
> >> the xen_phys_start value -- so why bother making it even more cryptic by
> >> forcing the user to turn it into an mfn?
> >>
> >> Another theoretical question -- since the /proc/iomem exports the
> >> xen_phys_start variable to user space, is there any way it could
> >> be handled entirely in user space by kexec-tools?
> >>
> >> Dave
> >>
> >>
> >>> === for x86 ===
> >>> --- lkcd_x86_trace.c.org 2008-04-17 10:13:05.000000000 +0900
> >>> +++ lkcd_x86_trace.c 2008-04-17 10:13:17.000000000 +0900
> >>> @@ -1423,6 +1423,7 @@
> >>> if (XEN_HYPER_MODE()) {
> >>> func_name = kl_funcname(pc);
> >>> if (STREQ(func_name, "idle_loop") || STREQ(func_name, "hypercall")
> >>> + || STREQ(func_name, "tracing_off")
> >>> || STREQ(func_name, "handle_exception")) {
> >>> UPDATE_FRAME(func_name, pc, 0, sp, bp, asp, 0, 0, bp - sp, 0);
> >>> return(trace->nframes);
> >>> @@ -1682,6 +1683,7 @@
> >>> if (func_name && XEN_HYPER_MODE()) {
> >>> if (STREQ(func_name, "continue_nmi") ||
> >>> STREQ(func_name, "vmx_asm_vmexit_handler") ||
> >>> + STREQ(func_name, "handle_nmi_mce") ||
> >>> STREQ(func_name, "deferred_nmi")) {
> >>> /* Interrupt frame */
> >>> sp = curframe->fp + 4;
> >>> --- x86.c.org 2008-04-17 10:29:21.000000000 +0900
> >>> +++ x86.c 2008-04-17 10:31:51.000000000 +0900
> >>> @@ -2846,7 +2846,10 @@
> >>> *paddr = kvaddr - DIRECTMAP_VIRT_START;
> >>> return TRUE;
> >>> }
> >>> - pgd = (ulonglong *)symbol_value("idle_pg_table_l3");
> >>> + if (symbol_exists("idle_pg_table_l3"))
> >>> + pgd = (ulonglong *)symbol_value("idle_pg_table_l3");
> >>> + else
> >>> + pgd = (ulonglong *)symbol_value("idle_pg_table");
> >>> } else {
> >>> if (!vt->vmalloc_start) {
> >>> *paddr = VTOP(kvaddr);
> >>> @@ -4965,7 +4968,8 @@
> >>> break;
> >>>
> >>> case PRE_GDB:
> >>> - if (symbol_exists("idle_pg_table_l3")) {
> >>> + if (symbol_exists("create_pae_xen_mappings") ||
> >>> + symbol_exists("idle_pg_table_l3")) {
> >>> machdep->flags |= PAE;
> >>> PGDIR_SHIFT = PGDIR_SHIFT_3LEVEL;
> >>> PTRS_PER_PTE = PTRS_PER_PTE_3LEVEL;
> >>>
> >>> === for x86_64 ===
> >>> --- defs.h.org 2008-04-17 15:03:14.000000000 +0900
> >>> +++ defs.h 2008-04-17 15:41:10.000000000 +0900
> >>> @@ -2162,10 +2162,13 @@
> >>>
> >>> #define FILL_PML4_HYPER() {
> >>> if (!machdep->machspec->last_pml4_read) {
> >>> - readmem(symbol_value("idle_pg_table_4"), KVADDR,
> >>> - machdep->machspec->pml4, PAGESIZE(), "idle_pg_table_4",
> >>> + unsigned long idle_pg_table =
> >>> + symbol_exists("idle_pg_table_4") ? symbol_value("idle_pg_table_4") :
> >>> + symbol_value("idle_pg_table");
> >>> + readmem(idle_pg_table, KVADDR,
> >>> + machdep->machspec->pml4, PAGESIZE(), "idle_pg_table",
> >>> FAULT_ON_ERROR);
> >>> - machdep->machspec->last_pml4_read = symbol_value("idle_pg_table_4");
> >>> + machdep->machspec->last_pml4_read = idle_pg_table;
> >>> }
> >>> }
> >>>
> >>> @@ -4081,6 +4084,8 @@
> >>> void get_kdump_regs(struct bt_info *, ulong *, ulong *);
> >>> void xen_kdump_p2m_mfn(char *);
> >>> int is_sadump_xen(void);
> >>> +void set_xen_phys_start_mfn(char *);
> >>> +ulong xen_phys_start_mfn(void);
> >>>
> >>> /*
> >>> * diskdump.c
> >>> --- main.c.org 2008-04-17 15:26:37.000000000 +0900
> >>> +++ main.c 2008-04-17 15:45:18.000000000 +0900
> >>> @@ -48,6 +48,7 @@
> >>> {"no_ikconfig", 0, 0, 0},
> >>> {"hyper", 0, 0, 0},
> >>> {"p2m_mfn", required_argument, 0, 0},
> >>> + {"xen_phys_start_mfn", required_argument, 0, 0},
> >>> {"zero_excluded", 0, 0, 0},
> >>> {"no_panic", 0, 0, 0},
> >>> {"more", 0, 0, 0},
> >>> @@ -155,6 +156,9 @@
> >>> else if (STREQ(long_options[option_index].name, "p2m_mfn"))
> >>> xen_kdump_p2m_mfn(optarg);
> >>>
> >>> + else if (STREQ(long_options[option_index].name, "xen_phys_start_mfn"))
> >>> + set_xen_phys_start_mfn(optarg);
> >>> +
> >>> else if (STREQ(long_options[option_index].name, "zero_excluded"))
> >>> *diskdump_flags |= ZERO_EXCLUDED;
> >>>
> >>> --- netdump.c.org 2008-04-17 15:09:06.000000000 +0900
> >>> +++ netdump.c 2008-04-17 15:48:44.000000000 +0900
> >>> @@ -1521,6 +1521,8 @@
> >>> */
> >>> if (!nd->xen_kdump_data->p2m_mfn)
> >>> nd->xen_kdump_data->p2m_mfn = *(uptr+(words-1));
> >>> + if (words > 9 && !nd->xen_kdump_data->xen_phys_start_mfn)
> >>> + nd->xen_kdump_data->xen_phys_start_mfn = *(uptr+(words-2));
> >>> }
> >>> }
> >>> break;
> >>> @@ -1724,6 +1726,8 @@
> >>> */
> >>> if (!nd->xen_kdump_data->p2m_mfn)
> >>> nd->xen_kdump_data->p2m_mfn = *(up+(words-1));
> >>> + if (words > 9 && !nd->xen_kdump_data->xen_phys_start_mfn)
> >>> + nd->xen_kdump_data->xen_phys_start_mfn = *(up+(words-2));
> >>> }
> >>> }
> >>> break;
> >>> @@ -2312,3 +2316,22 @@
> >>>
> >>> return FALSE;
> >>> }
> >>> +
> >>> +void
> >>> +set_xen_phys_start_mfn(char *arg)
> >>> +{
> >>> + ulong value;
> >>> + int errflag = 0;
> >>> +
> >>> + value = htol(arg, RETURN_ON_ERROR|QUIET, &errflag);
> >>> + if (!errflag)
> >>> + xen_kdump_data.xen_phys_start_mfn = value;
> >>> + else
> >>> + error(WARNING, "invalid xen_phys_start_mfn argument: %s
", arg);
> >>> +}
> >>> +
> >>> +ulong
> >>> +xen_phys_start_mfn(void)
> >>> +{
> >>> + return nd->xen_kdump_data->xen_phys_start_mfn;
> >>> +}
> >>> --- netdump.h.org 2008-04-17 15:38:59.000000000 +0900
> >>> +++ netdump.h 2008-04-17 15:39:38.000000000 +0900
> >>> @@ -109,6 +109,7 @@
> >>> ulong accesses;
> >>> int p2m_frames;
> >>> ulong *p2m_mfn_frame_list;
> >>> + ulong xen_phys_start_mfn;
> >>> };
> >>>
> >>> #define KDUMP_P2M_INIT (0x1)
> >>> --- x86_64.c.org 2008-04-17 15:34:32.000000000 +0900
> >>> +++ x86_64.c 2008-04-17 15:36:53.000000000 +0900
> >>> @@ -1401,6 +1401,10 @@
> >>> return FALSE;
> >>>
> >>> if (XEN_HYPER_MODE()) {
> >>> + if (XENTEXT_VIRT_ADDR(kvaddr)) {
> >>> + *paddr = kvaddr - __XEN_VIRT_START + (xen_phys_start_mfn() << PAGESHIFT());
> >>> + return TRUE;
> >>> + }
> >>> if (DIRECTMAP_VIRT_ADDR(kvaddr)) {
> >>> *paddr = kvaddr - DIRECTMAP_VIRT_START;
> >>> return TRUE;
> >>> --- xen_hyper_defs.h.org 2008-04-17 15:31:23.000000000 +0900
> >>> +++ xen_hyper_defs.h 2008-04-17 15:34:15.000000000 +0900
> >>> @@ -64,6 +64,9 @@
> >>> #define DIRECTMAP_VIRT_START (0xffff830000000000)
> >>> #define DIRECTMAP_VIRT_END (0xffff840000000000)
> >>> #define PAGE_OFFSET_XEN_HYPER DIRECTMAP_VIRT_START
> >>> +#define __XEN_VIRT_START (0xFFFF828C80000000)
> >>> +#define XENTEXT_VIRT_ADDR(vaddr)
> >>> + (((vaddr) >= __XEN_VIRT_START) && ((vaddr) < DIRECTMAP_VIRT_START))
> >>> #endif
> >>>
> >>> #ifdef IA64
> >>>
> >>> === Xen (explanation purpose) ===
> >>> --- include/xen/elfcore.h.org 2008-04-17 14:11:41.000000000 +0900
> >>> +++ include/xen/elfcore.h 2008-04-17 14:11:57.000000000 +0900
> >>> @@ -66,6 +66,7 @@
> >>> unsigned long xen_compile_time;
> >>> unsigned long tainted;
> >>> #ifdef CONFIG_X86
> >>> + unsigned long xen_phys_start_mfn;
> >>> unsigned long dom0_pfn_to_mfn_frame_list_list;
> >>> #endif
> >>> } crash_xen_info_t;
> >>> --- arch/x86/crash.c.org 2008-04-17 14:12:51.000000000 +0900
> >>> +++ arch/x86/crash.c 2008-04-17 14:13:13.000000000 +0900
> >>> @@ -102,6 +102,7 @@
> >>> hvm_disable();
> >>>
> >>> info = kexec_crash_save_info();
> >>> + info->xen_phys_start_mfn = xen_phys_start >> PAGE_SHIFT;
> >>> info->dom0_pfn_to_mfn_frame_list_list =
> >>> arch_get_pfn_to_mfn_frame_list_list(dom0);
> >>> }
> >
>

--
Itsuro ODA <oda@valinux.co.jp>

--
Crash-utility mailing list
Crash-utility@redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility
 
Old 04-22-2008, 01:55 AM
Itsuro ODA
 
Default some updates of xencrash

Hi,

> > >> Another theoretical question -- since the /proc/iomem exports the
> > >> xen_phys_start variable to user space, is there any way it could
> > >> be handled entirely in user space by kexec-tools?
> > >
> > > Theoretically yes. But it is necessary to add another ElfNote section.
> > > I thought it is the smallest modication necessary to add 'xen_phys_start'
> > > in the crashinfo.

It may be necessary to modify xen hypervisor and/or linux kernel too.
Let me consider for a while.

Anyway, I will bring up this discussion on the kexec list.

Thanks.
Itsuro Oda

On Tue, 22 Apr 2008 07:21:35 +0900
Itsuro ODA <oda@valinux.co.jp> wrote:

> Hi Dave,
>
> On Mon, 21 Apr 2008 09:09:59 -0400
> Dave Anderson <anderson@redhat.com> wrote:
>
> > Itsuro ODA wrote:
> > > Hi Dave,
> > >
> > > I thought it is better to be small value from the view point
> > > to save 'xen_phys_start' value in the crashinfo.
> > >
> > > From the view point of users you are right. It should be
> > > '--xen_phys_start=<address>'.
> >
> > Hi Itsuro,
> >
> > But even from the kernel viewpoint, I'm not sure why it would be better?
> > The xen_phys_start symbol is an unsigned long, and its container in the
> > crash_xen_info_t is an unsigned long. So I don't see any benefit or reason
> > to make it smaller.
>
> Yes, I was too anxious.
>
> > >
> > >> Another theoretical question -- since the /proc/iomem exports the
> > >> xen_phys_start variable to user space, is there any way it could
> > >> be handled entirely in user space by kexec-tools?
> > >
> > > Theoretically yes. But it is necessary to add another ElfNote section.
> > > I thought it is the smallest modication necessary to add 'xen_phys_start'
> > > in the crashinfo.
> > > Do you think which is better ?
> >
> > That's a good question. My concern would be to have an easier way for customers
> > to deal with the problem without having to upgrade the kernel package; it's always
> > easier to upgrade a user-package.
>
> I see.
>
> > However, whatever gets fixed goes beyond the scope of the crash utility.
> > For now, the crash utility will need the --xen-phys_start=xxxx workaround
> > because the RHEL5.2 kernel will be released without a fix. And that
> > decision will have to made by the kernel kexec/kdump and kexec-tools
> > maintainers. Can you bring up this discussion on the kexec list?
>
> Yes, sure.
>
> Thanks.
> Itsuro Oda
>
> >
> > Thanks,
> > Dave
> >
> > >
> > > Thanks.
> > > Itsuro Oda
> > >
> > > On Fri, 18 Apr 2008 10:14:04 -0400
> > > Dave Anderson <anderson@redhat.com> wrote:
> > >
> > >> Itsuro ODA wrote:
> > >>> Hi,
> > >>>
> > >>> The attached is some fixes which are necessary for xencrash to use
> > >>> for the newer version of xen (after 3.1.0, ex. 3.1.2, 3.2.0).
> > >>>
> > >>> * x86
> > >>> - add some symbols which are used to know the boundary
> > >>> condition at the tracing in 'bt'.
> > >>> - fix for the symbol 'idle_pg_table_l3' going away.
> > >>>
> > >>> * x86_64
> > >>> - fix for the virtual address area of xen code/data is added.
> > >>> - fix for the symbol 'idle_pg_table_l4' going away.
> > >>> - add the option '--xen_phys_start_mfn='
> > >>> newer version of xen (ex. RHEL5.2, 3.2.0) moves the
> > >>> physical(machine) address of xen code/data area after
> > >>> the system started up.
> > >>> The relocated physical(machine) address of xen code/data
> > >>> area is necessary to use xencrash.
> > >>> The value can be got by 'cat /proc/iomem' under dom0.
> > >>> -------------------------------------------------------
> > >>> # cat /proc/iomem
> > >>> ...
> > >>> 7e600000-7f5fffff : Hypervisor code and data *** this line
> > >>> ...
> > >>> -------------------------------------------------------
> > >>> ex. to use xencrash:
> > >>> # crash --xen_phys_start_mfn=0x7e600 xen-syms vmcore
> > >>> - extract 'xen_phys_start_mfn' from the XEN_ELFNOTE_CRASH_INFO
> > >>> ElfNote.
> > >>> This is experimental code because it is necessary to modify
> > >>> the xen to add the xen_phys_start_mfn value in the ElfNote
> > >>> at crash time. (the patch is also attached in this mail.)
> > >>> A sample dump is availavle in the following URL:
> > >>> http://people.valinux.co.jp/~oda/x86_64_dump_080417.tar.gz
> > >>>
> > >>> This patch is for crash-4.0-6.2.
> > >>>
> > >>> Thanks.
> > >>> Itsuro Oda
> > >> Hi Itsuro,
> > >>
> > >> Thanks very much for the quick response.
> > >>
> > >> I have one relatively minor issue. I understand that the previously existing
> > >> "--p2m_mfn" option was expressed as an mfn, and that made sense because its value
> > >> exists in the xen hypervisor code as an mfn value (actually a xen_pfn_t).
> > >>
> > >> But it seems unnecessary to bother going through the translation of the
> > >> hypservisors's "xen_phys_start" physical address into an mfn? And then
> > >> only to have the crash utility have to turn it back into a physical address
> > >> when it uses it? Why not just leave it as a physical address in both the
> > >> kernel patch, and when passing it to the crash utility?
> > >>
> > >> From a user's standpoint, when it's necessary to pre-determine the argument from
> > >> a hypervisor/dom0 vmcore that doesn't contain it, the xen_phys_start can be determined
> > >> by either reading /proc/iomem on the live system, where as you've shown in
> > >> the example above, it's 7e600000:
> > >>
> > >> > # cat /proc/iomem
> > >> > ...
> > >> > 7e600000-7f5fffff : Hypervisor code and data *** this line
> > >> > ...
> > >>
> > >> Alternatively, the same dom0/HV kdump vmcore can be run in a crash session using
> > >> the dom0 vmlinux, where in this example vmcore, it's 0x3f000000:
> > >>
> > >> crash> px xen_hypervisor_res
> > >> xen_hypervisor_res = $3 = {
> > >> start = 0x3f000000,
> > >> end = 0x3fffffff,
> > >> name = 0xffffffff8049ab72 "Hypervisor code and data",
> > >> flags = 0x80000200,
> > >> parent = 0xffff880000001180,
> > >> sibling = 0x0,
> > >> child = 0xffff8800000000a8
> > >> }
> > >>
> > >> For convenience sake, I'd prefer to just leave it as that, without
> > >> needlessly forcing the user to translate the above into an mfn, so
> > >> that they can simply enter: "crash --xen_phys_start=0x3f000000 ..."
> > >>
> > >> The same thing applies to the kernel patch -- just leave it in its
> > >> natural state as a physical (machine) address.
> > >>
> > >> Unfortunately it's already going to be an annoyance to have to pre-determine
> > >> the xen_phys_start value -- so why bother making it even more cryptic by
> > >> forcing the user to turn it into an mfn?
> > >>
> > >> Another theoretical question -- since the /proc/iomem exports the
> > >> xen_phys_start variable to user space, is there any way it could
> > >> be handled entirely in user space by kexec-tools?
> > >>
> > >> Dave
> > >>
> > >>
> > >>> === for x86 ===
> > >>> --- lkcd_x86_trace.c.org 2008-04-17 10:13:05.000000000 +0900
> > >>> +++ lkcd_x86_trace.c 2008-04-17 10:13:17.000000000 +0900
> > >>> @@ -1423,6 +1423,7 @@
> > >>> if (XEN_HYPER_MODE()) {
> > >>> func_name = kl_funcname(pc);
> > >>> if (STREQ(func_name, "idle_loop") || STREQ(func_name, "hypercall")
> > >>> + || STREQ(func_name, "tracing_off")
> > >>> || STREQ(func_name, "handle_exception")) {
> > >>> UPDATE_FRAME(func_name, pc, 0, sp, bp, asp, 0, 0, bp - sp, 0);
> > >>> return(trace->nframes);
> > >>> @@ -1682,6 +1683,7 @@
> > >>> if (func_name && XEN_HYPER_MODE()) {
> > >>> if (STREQ(func_name, "continue_nmi") ||
> > >>> STREQ(func_name, "vmx_asm_vmexit_handler") ||
> > >>> + STREQ(func_name, "handle_nmi_mce") ||
> > >>> STREQ(func_name, "deferred_nmi")) {
> > >>> /* Interrupt frame */
> > >>> sp = curframe->fp + 4;
> > >>> --- x86.c.org 2008-04-17 10:29:21.000000000 +0900
> > >>> +++ x86.c 2008-04-17 10:31:51.000000000 +0900
> > >>> @@ -2846,7 +2846,10 @@
> > >>> *paddr = kvaddr - DIRECTMAP_VIRT_START;
> > >>> return TRUE;
> > >>> }
> > >>> - pgd = (ulonglong *)symbol_value("idle_pg_table_l3");
> > >>> + if (symbol_exists("idle_pg_table_l3"))
> > >>> + pgd = (ulonglong *)symbol_value("idle_pg_table_l3");
> > >>> + else
> > >>> + pgd = (ulonglong *)symbol_value("idle_pg_table");
> > >>> } else {
> > >>> if (!vt->vmalloc_start) {
> > >>> *paddr = VTOP(kvaddr);
> > >>> @@ -4965,7 +4968,8 @@
> > >>> break;
> > >>>
> > >>> case PRE_GDB:
> > >>> - if (symbol_exists("idle_pg_table_l3")) {
> > >>> + if (symbol_exists("create_pae_xen_mappings") ||
> > >>> + symbol_exists("idle_pg_table_l3")) {
> > >>> machdep->flags |= PAE;
> > >>> PGDIR_SHIFT = PGDIR_SHIFT_3LEVEL;
> > >>> PTRS_PER_PTE = PTRS_PER_PTE_3LEVEL;
> > >>>
> > >>> === for x86_64 ===
> > >>> --- defs.h.org 2008-04-17 15:03:14.000000000 +0900
> > >>> +++ defs.h 2008-04-17 15:41:10.000000000 +0900
> > >>> @@ -2162,10 +2162,13 @@
> > >>>
> > >>> #define FILL_PML4_HYPER() {
> > >>> if (!machdep->machspec->last_pml4_read) {
> > >>> - readmem(symbol_value("idle_pg_table_4"), KVADDR,
> > >>> - machdep->machspec->pml4, PAGESIZE(), "idle_pg_table_4",
> > >>> + unsigned long idle_pg_table =
> > >>> + symbol_exists("idle_pg_table_4") ? symbol_value("idle_pg_table_4") :
> > >>> + symbol_value("idle_pg_table");
> > >>> + readmem(idle_pg_table, KVADDR,
> > >>> + machdep->machspec->pml4, PAGESIZE(), "idle_pg_table",
> > >>> FAULT_ON_ERROR);
> > >>> - machdep->machspec->last_pml4_read = symbol_value("idle_pg_table_4");
> > >>> + machdep->machspec->last_pml4_read = idle_pg_table;
> > >>> }
> > >>> }
> > >>>
> > >>> @@ -4081,6 +4084,8 @@
> > >>> void get_kdump_regs(struct bt_info *, ulong *, ulong *);
> > >>> void xen_kdump_p2m_mfn(char *);
> > >>> int is_sadump_xen(void);
> > >>> +void set_xen_phys_start_mfn(char *);
> > >>> +ulong xen_phys_start_mfn(void);
> > >>>
> > >>> /*
> > >>> * diskdump.c
> > >>> --- main.c.org 2008-04-17 15:26:37.000000000 +0900
> > >>> +++ main.c 2008-04-17 15:45:18.000000000 +0900
> > >>> @@ -48,6 +48,7 @@
> > >>> {"no_ikconfig", 0, 0, 0},
> > >>> {"hyper", 0, 0, 0},
> > >>> {"p2m_mfn", required_argument, 0, 0},
> > >>> + {"xen_phys_start_mfn", required_argument, 0, 0},
> > >>> {"zero_excluded", 0, 0, 0},
> > >>> {"no_panic", 0, 0, 0},
> > >>> {"more", 0, 0, 0},
> > >>> @@ -155,6 +156,9 @@
> > >>> else if (STREQ(long_options[option_index].name, "p2m_mfn"))
> > >>> xen_kdump_p2m_mfn(optarg);
> > >>>
> > >>> + else if (STREQ(long_options[option_index].name, "xen_phys_start_mfn"))
> > >>> + set_xen_phys_start_mfn(optarg);
> > >>> +
> > >>> else if (STREQ(long_options[option_index].name, "zero_excluded"))
> > >>> *diskdump_flags |= ZERO_EXCLUDED;
> > >>>
> > >>> --- netdump.c.org 2008-04-17 15:09:06.000000000 +0900
> > >>> +++ netdump.c 2008-04-17 15:48:44.000000000 +0900
> > >>> @@ -1521,6 +1521,8 @@
> > >>> */
> > >>> if (!nd->xen_kdump_data->p2m_mfn)
> > >>> nd->xen_kdump_data->p2m_mfn = *(uptr+(words-1));
> > >>> + if (words > 9 && !nd->xen_kdump_data->xen_phys_start_mfn)
> > >>> + nd->xen_kdump_data->xen_phys_start_mfn = *(uptr+(words-2));
> > >>> }
> > >>> }
> > >>> break;
> > >>> @@ -1724,6 +1726,8 @@
> > >>> */
> > >>> if (!nd->xen_kdump_data->p2m_mfn)
> > >>> nd->xen_kdump_data->p2m_mfn = *(up+(words-1));
> > >>> + if (words > 9 && !nd->xen_kdump_data->xen_phys_start_mfn)
> > >>> + nd->xen_kdump_data->xen_phys_start_mfn = *(up+(words-2));
> > >>> }
> > >>> }
> > >>> break;
> > >>> @@ -2312,3 +2316,22 @@
> > >>>
> > >>> return FALSE;
> > >>> }
> > >>> +
> > >>> +void
> > >>> +set_xen_phys_start_mfn(char *arg)
> > >>> +{
> > >>> + ulong value;
> > >>> + int errflag = 0;
> > >>> +
> > >>> + value = htol(arg, RETURN_ON_ERROR|QUIET, &errflag);
> > >>> + if (!errflag)
> > >>> + xen_kdump_data.xen_phys_start_mfn = value;
> > >>> + else
> > >>> + error(WARNING, "invalid xen_phys_start_mfn argument: %s
", arg);
> > >>> +}
> > >>> +
> > >>> +ulong
> > >>> +xen_phys_start_mfn(void)
> > >>> +{
> > >>> + return nd->xen_kdump_data->xen_phys_start_mfn;
> > >>> +}
> > >>> --- netdump.h.org 2008-04-17 15:38:59.000000000 +0900
> > >>> +++ netdump.h 2008-04-17 15:39:38.000000000 +0900
> > >>> @@ -109,6 +109,7 @@
> > >>> ulong accesses;
> > >>> int p2m_frames;
> > >>> ulong *p2m_mfn_frame_list;
> > >>> + ulong xen_phys_start_mfn;
> > >>> };
> > >>>
> > >>> #define KDUMP_P2M_INIT (0x1)
> > >>> --- x86_64.c.org 2008-04-17 15:34:32.000000000 +0900
> > >>> +++ x86_64.c 2008-04-17 15:36:53.000000000 +0900
> > >>> @@ -1401,6 +1401,10 @@
> > >>> return FALSE;
> > >>>
> > >>> if (XEN_HYPER_MODE()) {
> > >>> + if (XENTEXT_VIRT_ADDR(kvaddr)) {
> > >>> + *paddr = kvaddr - __XEN_VIRT_START + (xen_phys_start_mfn() << PAGESHIFT());
> > >>> + return TRUE;
> > >>> + }
> > >>> if (DIRECTMAP_VIRT_ADDR(kvaddr)) {
> > >>> *paddr = kvaddr - DIRECTMAP_VIRT_START;
> > >>> return TRUE;
> > >>> --- xen_hyper_defs.h.org 2008-04-17 15:31:23.000000000 +0900
> > >>> +++ xen_hyper_defs.h 2008-04-17 15:34:15.000000000 +0900
> > >>> @@ -64,6 +64,9 @@
> > >>> #define DIRECTMAP_VIRT_START (0xffff830000000000)
> > >>> #define DIRECTMAP_VIRT_END (0xffff840000000000)
> > >>> #define PAGE_OFFSET_XEN_HYPER DIRECTMAP_VIRT_START
> > >>> +#define __XEN_VIRT_START (0xFFFF828C80000000)
> > >>> +#define XENTEXT_VIRT_ADDR(vaddr)
> > >>> + (((vaddr) >= __XEN_VIRT_START) && ((vaddr) < DIRECTMAP_VIRT_START))
> > >>> #endif
> > >>>
> > >>> #ifdef IA64
> > >>>
> > >>> === Xen (explanation purpose) ===
> > >>> --- include/xen/elfcore.h.org 2008-04-17 14:11:41.000000000 +0900
> > >>> +++ include/xen/elfcore.h 2008-04-17 14:11:57.000000000 +0900
> > >>> @@ -66,6 +66,7 @@
> > >>> unsigned long xen_compile_time;
> > >>> unsigned long tainted;
> > >>> #ifdef CONFIG_X86
> > >>> + unsigned long xen_phys_start_mfn;
> > >>> unsigned long dom0_pfn_to_mfn_frame_list_list;
> > >>> #endif
> > >>> } crash_xen_info_t;
> > >>> --- arch/x86/crash.c.org 2008-04-17 14:12:51.000000000 +0900
> > >>> +++ arch/x86/crash.c 2008-04-17 14:13:13.000000000 +0900
> > >>> @@ -102,6 +102,7 @@
> > >>> hvm_disable();
> > >>>
> > >>> info = kexec_crash_save_info();
> > >>> + info->xen_phys_start_mfn = xen_phys_start >> PAGE_SHIFT;
> > >>> info->dom0_pfn_to_mfn_frame_list_list =
> > >>> arch_get_pfn_to_mfn_frame_list_list(dom0);
> > >>> }
> > >
> >
>
> --
> Itsuro ODA <oda@valinux.co.jp>
>
> --
> Crash-utility mailing list
> Crash-utility@redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility

--
Itsuro ODA <oda@valinux.co.jp>

--
Crash-utility mailing list
Crash-utility@redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility
 

Thread Tools




All times are GMT. The time now is 04:29 AM.

VBulletin, Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright ©2007 - 2008, www.linux-archive.org