Read the Xen crash ELF note into memory at startup
Subsystems (2)
PATCH v3 3/9 Read the Xen crash ELF note into memory at startup
Instead of seeking individual fields inside the ELF note, copy the corresponding struct type from the Xen sources, so people can understand why the code does what it does.
This is mainly a cleanup patch to improve maintainability, but it also simplifies reusing the crash note data from other places.
Signed-off-by Petr Tesarik <[email protected]>
--- arch/x86_64.c | 24 ++++++++++++++-- elf_info.c | 25 ----------------- elf_info.h | 2 - makedumpfile.c | 82 ++++++++++++++++++++++++++++++++++++++++++--------------- makedumpfile.h | 49 ++++++++++++++++++++++++++++++++-- 5 files changed, 130 insertions(+), 52 deletions(-)
elf_info.c +1 -24
@@ -88,7 +88,6 @@ static unsigned long size_eraseinfo;*/ static off_t offset_xen_crash_info;static unsigned long size_xen_crash_info; -static unsigned long xen_p2m_mfn;/*
@@ -292,8 +291,7 @@ static intget_pt_note_info (void) {int n_type, size_desc; -unsigned long p2m_mfn; -off_t offset, offset_desc, off_p2m =0 ; +off_t offset, offset_desc;char buf[VMCOREINFO_XEN_NOTE_NAME_BYTES ];char note[MAX_SIZE_NHDR ];
@@ -349,21 +347,6 @@ get_pt_note_info(void) offset_xen_crash_info = offset_desc; size_xen_crash_info = size_desc; - off_p2m = offset +offset_next_note (note) - -sizeof (p2m_mfn); -if (lseek (fd_memory, off_p2m,SEEK_SET ) <0 ){ -ERRMSG ("Can't seek the dump memory(%s). %s\n" , - name_memory,strerror (errno)); -return FALSE; - } -if (read (fd_memory, &p2m_mfn,sizeof (p2m_mfn)) - !=sizeof (p2m_mfn)) { -ERRMSG ("Can't read the dump memory(%s). %s\n" , - name_memory,strerror (errno)); -return FALSE; - } - xen_p2m_mfn = p2m_mfn; -/* * Check whether a source dumpfile contains eraseinfo. * /proc/vmcore does not contain eraseinfo, because eraseinfo
@@ -859,9 +842,3 @@ set_eraseinfo(off_t offset, unsigned lon size_eraseinfo = size; } -unsigned long -get_xen_p2m_mfn (void ) -{ -return xen_p2m_mfn; -} -
elf_info.h +0 -2
@@ -68,8 +68,6 @@ int has_eraseinfo(void);void get_eraseinfo (off_t *offset,unsigned long *size);void set_eraseinfo (off_t offset,unsigned long size); -unsigned long get_xen_p2m_mfn (void ); -#endif /* ELF_INFO_H */
makedumpfile.c +61 -21
105 lines not on this page · raw message
makedumpfile.h +47 -2
67 lines not on this page · raw message
arch/x86_64.c +21 -3
@@ -30,6 +30,18 @@ is_vmalloc_addr(ulong vaddr) || (vaddr >= MODULES_VADDR && vaddr <= MODULES_END)); } +static unsigned long +get_xen_p2m_mfn (void ) +{ +if (info->xen_crash_info_v >=2 ) +return info->xen_crash_info.v2-> + dom0_pfn_to_mfn_frame_list_list; +if (info->xen_crash_info_v >=1 ) +return info->xen_crash_info.v1-> + dom0_pfn_to_mfn_frame_list_list; +return NOT_FOUND_LONG_VALUE ; +} +int get_phys_base_x86_64 (void ) {
@@ -59,6 +71,7 @@ get_phys_base_x86_64(void)int get_machdep_info_x86_64 (void ) { +unsigned long p2m_mfn;int i, j, mfns[MAX_X86_64_FRAMES ];unsigned long frame_mfn[MAX_X86_64_FRAMES ];unsigned long buf[MFNS_PER_FRAME ];
@@ -72,9 +85,14 @@ get_machdep_info_x86_64(void)* Get the information for translating domain-0's physical * address into machine address. */ -if (!readmem (MADDR_XEN ,pfn_to_paddr (get_xen_p2m_mfn ()), - &frame_mfn,PAGESIZE ())) { -ERRMSG ("Can't get p2m_mfn.\n" ); + p2m_mfn =get_xen_p2m_mfn (); +if (p2m_mfn == (unsigned long )NOT_FOUND_LONG_VALUE ) { +ERRMSG ("Can't get p2m_mfn address.\n" ); +return FALSE; + } +if (!readmem (MADDR_XEN ,pfn_to_paddr (p2m_mfn), + &frame_mfn,PAGESIZE ())) { +ERRMSG ("Can't read p2m_mfn.\n" );return FALSE; }
_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec