From: Petr Tesarik Date: Thu, 5 Apr 2018 10:57:05 +0200 Subject: Revert "kexec-tools: Read always one vmcoreinfo file" References: bsc#1085626, bsc#951740 Upstream: not yet, upstream wants to stay broken This reverts commit 455d79f57e9367e5c59093fd74798905bd5762fc. The explanation seems bogus. The file under /sys/kernel refers to the Linux kernel VMCOREINFO note, while the file under /sys/hypervisor refers to the Xen hypervisor VMCOREINFO_XEN note. The former note contains information about the Linux kernel. The latter contains information about the Xen hypervisor. Both are needed to allow page filtering in makedumpfile. Signed-off-by: Petr Tesarik --- kexec/crashdump-elf.c | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) --- a/kexec/crashdump-elf.c +++ b/kexec/crashdump-elf.c @@ -40,6 +40,8 @@ int FUNC(struct kexec_info *info, uint64_t notes_addr, notes_len; uint64_t vmcoreinfo_addr, vmcoreinfo_len; int has_vmcoreinfo = 0; + uint64_t vmcoreinfo_addr_xen, vmcoreinfo_len_xen; + int has_vmcoreinfo_xen = 0; int (*get_note_info)(int cpu, uint64_t *addr, uint64_t *len); long int count_cpu; @@ -52,14 +54,16 @@ int FUNC(struct kexec_info *info, return -1; } - if (xen_present()) { - if (!get_xen_vmcoreinfo(&vmcoreinfo_addr, &vmcoreinfo_len)) - has_vmcoreinfo = 1; - } else - if (!get_kernel_vmcoreinfo(&vmcoreinfo_addr, &vmcoreinfo_len)) - has_vmcoreinfo = 1; + if (get_kernel_vmcoreinfo(&vmcoreinfo_addr, &vmcoreinfo_len) == 0) { + has_vmcoreinfo = 1; + } + + if (xen_present() && + get_xen_vmcoreinfo(&vmcoreinfo_addr_xen, &vmcoreinfo_len_xen) == 0) { + has_vmcoreinfo_xen = 1; + } - sz = sizeof(EHDR) + (nr_cpus + has_vmcoreinfo) * sizeof(PHDR) + + sz = sizeof(EHDR) + (nr_cpus + has_vmcoreinfo + has_vmcoreinfo_xen) * sizeof(PHDR) + ranges * sizeof(PHDR); /* @@ -178,6 +182,21 @@ int FUNC(struct kexec_info *info, dbgprintf_phdr("vmcoreinfo header", phdr); } + if (has_vmcoreinfo_xen) { + phdr = (PHDR *) bufp; + bufp += sizeof(PHDR); + phdr->p_type = PT_NOTE; + phdr->p_flags = 0; + phdr->p_offset = phdr->p_paddr = vmcoreinfo_addr_xen; + phdr->p_vaddr = 0; + phdr->p_filesz = phdr->p_memsz = vmcoreinfo_len_xen; + /* Do we need any alignment of segments? */ + phdr->p_align = 0; + + (elf->e_phnum)++; + dbgprintf_phdr("vmcoreinfo_xen header", phdr); + } + /* Setup an PT_LOAD type program header for the region where * Kernel is mapped if elf_info->kern_size is non-zero. */