[PATCH] arm64 : fix makedumpfile failure on 5.4+ kernels

Ioanna Alifieraki ioanna-maria.alifieraki at canonical.com
Wed Sep 9 20:54:29 EDT 2020


Currently makedumpfile fails on arm64 for 5.4 and newer kernels with
the following :

[9.595476] kdump-tools[513]: Starting kdump-tools:
[9.597988] kdump-tools[519]:  * running makedumpfile -c -d 31 /proc/vmcore /var/crash/202009011332/dump-incomplete
[9.636915] kdump-tools[537]: calculate_plat_config: PAGE SIZE 0x1000 and VA Bits 47 not supported
[9.639652] kdump-tools[537]: get_machdep_info_arm64: Can't determine platform config values
[9.642085] kdump-tools[537]: makedumpfile Failed.
[9.643064] kdump-tools[519]:  * kdump-tools: makedumpfile failed, falling back to 'cp'

The problem starts at get_versiondep_info_arm64 function.
This functions uses _stext to calculate the va_bits.
Up to 5.3 kernels the _stext would be ffff000010081000.
After commit 14c127c957c1c607 (arm64: mm: Flip kernel VA space),
_stext is ffff800010081000 which ends up the va_bits getting the value
of 47, even though the kernel configuration is 48 bits.
Now _stext has contiguous bits ffff8  and matches the 47 bits
while in the past it had ffff0 that would match the 48 bits.
The va_bits variable is already exported in vmcoreinfo and therefore
that could be solved by reading the value  from there
(va_bits = NUMBER(VA_BITS)) instead of relying on _stext.
However, if we do so, the page_offset is not calculated properly.
Currently :
info->page_offset = (0xffffffffffffffffUL) << (va_bits - 1);
The page_offset still depends on the _stext value.
So read the va_bits from vmcoreinfo and keep the old logic of calculating
va_bits to calculate page_offset (calc_page_offset_variable).

Signed-off-by: Ioanna Alifieraki <ioanna-maria.alifieraki at canonical.com>
---
 arch/arm64.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/arch/arm64.c b/arch/arm64.c
index 54d60b4..2b0fca3 100644
--- a/arch/arm64.c
+++ b/arch/arm64.c
@@ -290,6 +290,7 @@ int
 get_versiondep_info_arm64(void)
 {
 	ulong _stext;
+	int calc_page_offset;
 
 	_stext = get_stext_symbol();
 	if (!_stext) {
@@ -297,25 +298,28 @@ get_versiondep_info_arm64(void)
 		return FALSE;
 	}
 
+	va_bits = NUMBER(VA_BITS);
+
 	/* Derive va_bits as per arch/arm64/Kconfig */
 	if ((_stext & PAGE_OFFSET_36) == PAGE_OFFSET_36) {
-		va_bits = 36;
+		calc_page_offset = 36;
 	} else if ((_stext & PAGE_OFFSET_39) == PAGE_OFFSET_39) {
-		va_bits = 39;
+		calc_page_offset = 39;
 	} else if ((_stext & PAGE_OFFSET_42) == PAGE_OFFSET_42) {
-		va_bits = 42;
+		calc_page_offset = 42;
 	} else if ((_stext & PAGE_OFFSET_47) == PAGE_OFFSET_47) {
-		va_bits = 47;
+		calc_page_offset = 47;
 	} else if ((_stext & PAGE_OFFSET_48) == PAGE_OFFSET_48) {
-		va_bits = 48;
+		calc_page_offset = 48;
 	} else {
-		ERRMSG("Cannot find a proper _stext for calculating VA_BITS\n");
+		ERRMSG("Cannot find a proper _stext for calculating page_offset\n");
 		return FALSE;
 	}
 
-	info->page_offset = (0xffffffffffffffffUL) << (va_bits - 1);
+	info->page_offset = (0xffffffffffffffffUL) << (calc_page_offset - 1);
 
 	DEBUG_MSG("va_bits      : %d\n", va_bits);
+	DEBUG_MSG("calc_page_offset  : %d\n", calc_page_offset);
 	DEBUG_MSG("page_offset  : %lx\n", info->page_offset);
 
 	return TRUE;
-- 
2.17.1




More information about the kexec mailing list