File kexec-tools-vmcoreinfo-in-xen.patch of Package kexec-tools

From: Petr Tesarik <petr@tesarici.cz>
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 <ptesarik@suse.cz>

---
 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.
 	 */
openSUSE Build Service is sponsored by