Blame SOURCES/kexec-tools-2.0.8-arm64-kdump-copy-dtb-file-into-crash-kernel-memory.patch

de80c6
From 5c5df34886473e0dd34db3518135cad2df6e326c Mon Sep 17 00:00:00 2001
de80c6
Message-Id: <5c5df34886473e0dd34db3518135cad2df6e326c.1429703426.git.panand@redhat.com>
de80c6
In-Reply-To: <de1db775d6e9b51f014442677863b57b8566c510.1429703426.git.panand@redhat.com>
de80c6
References: <de1db775d6e9b51f014442677863b57b8566c510.1429703426.git.panand@redhat.com>
de80c6
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
de80c6
Date: Tue, 24 Feb 2015 15:48:29 +0900
de80c6
Subject: [PATCH 10/15] arm64: kdump: copy dtb file into crash kernel memory
de80c6
de80c6
---
de80c6
 kexec/arch/arm64/crashdump-arm64.c |  6 ++++++
de80c6
 kexec/arch/arm64/crashdump-arm64.h |  1 +
de80c6
 kexec/arch/arm64/kexec-arm64.c     | 15 +++++++++------
de80c6
 3 files changed, 16 insertions(+), 6 deletions(-)
de80c6
de80c6
diff --git a/kexec/arch/arm64/crashdump-arm64.c b/kexec/arch/arm64/crashdump-arm64.c
de80c6
index ec83cf0c0f38..80f5985c5d85 100644
de80c6
--- a/kexec/arch/arm64/crashdump-arm64.c
de80c6
+++ b/kexec/arch/arm64/crashdump-arm64.c
de80c6
@@ -306,3 +306,9 @@ void set_crash_entry(struct mem_ehdr *ehdr, struct kexec_info *info)
de80c6
 {
de80c6
 	info->entry = (void *)crash_reserved_mem.start + arm64_mem.text_offset;
de80c6
 }
de80c6
+
de80c6
+off_t locate_dtb_in_crashmem(struct kexec_info *info, off_t dtb_size)
de80c6
+{
de80c6
+	return locate_hole(info, dtb_size, 128UL * 1024,
de80c6
+		crash_reserved_mem.start, crash_reserved_mem.end, -1);
de80c6
+}
de80c6
diff --git a/kexec/arch/arm64/crashdump-arm64.h b/kexec/arch/arm64/crashdump-arm64.h
de80c6
index 3f8b38350841..d4fd3f2288c9 100644
de80c6
--- a/kexec/arch/arm64/crashdump-arm64.h
de80c6
+++ b/kexec/arch/arm64/crashdump-arm64.h
de80c6
@@ -21,5 +21,6 @@ extern struct memory_ranges usablemem_rgns;
de80c6
 int load_crashdump_segments(struct kexec_info *info, char **option);
de80c6
 void modify_ehdr_for_crashmem(struct mem_ehdr *ehdr);
de80c6
 void set_crash_entry(struct mem_ehdr *ehdr, struct kexec_info *info);
de80c6
+off_t locate_dtb_in_crashmem(struct kexec_info *info, off_t dtb_size);
de80c6
 
de80c6
 #endif
de80c6
diff --git a/kexec/arch/arm64/kexec-arm64.c b/kexec/arch/arm64/kexec-arm64.c
de80c6
index 173631c66951..190037c75186 100644
de80c6
--- a/kexec/arch/arm64/kexec-arm64.c
de80c6
+++ b/kexec/arch/arm64/kexec-arm64.c
de80c6
@@ -650,12 +650,15 @@ int arm64_load_other_segments(struct kexec_info *info,
de80c6
 
de80c6
 	dtb_max = dtb_2.size + 2 * 1024;
de80c6
 
de80c6
-	dtb_base = locate_hole(info, dtb_max, 128UL * 1024,
de80c6
-		arm64_mem.memstart + arm64_mem.text_offset
de80c6
-			+ arm64_mem.image_size,
de80c6
-		_ALIGN_UP(arm64_mem.memstart + arm64_mem.text_offset,
de80c6
-			512UL * 1024 * 1024),
de80c6
-		1);
de80c6
+	if (info->kexec_flags & KEXEC_ON_CRASH)
de80c6
+		dtb_base = locate_dtb_in_crashmem(info, dtb_max);
de80c6
+	else
de80c6
+		dtb_base = locate_hole(info, dtb_max, 128UL * 1024,
de80c6
+			arm64_mem.memstart + arm64_mem.text_offset
de80c6
+				+ arm64_mem.image_size,
de80c6
+			_ALIGN_UP(arm64_mem.memstart + arm64_mem.text_offset,
de80c6
+				512UL * 1024 * 1024),
de80c6
+			1);
de80c6
 
de80c6
 	dbgprintf("dtb:    base %lx, size %lxh (%ld)\n", dtb_base, dtb_2.size,
de80c6
 		dtb_2.size);
de80c6
-- 
de80c6
2.1.0
de80c6