[Crash-utility] [PATCHv8 1/4] crash-utility/arm64: introduce a dedicated field to record the mem layout changes

Pingfan Liu piliu at redhat.com
Wed Jun 9 01:50:49 UTC 2021


At present, we have the following important changes for arm64 memory
layout:

-1. redesigned ARM64 kernel virtual memory layout and associated KASLR
    support that was introduced in Linux 4.6. And NEW_VMEMMAP is used to
    flag it.
-2. memory layout flipped just right before introducing 52-bits kernel.
-3. introducing of vabits_actual and phyvirt_offset in kernel
-4. removing phyvirt_offset.

These changes have effects on PTOV()/VTOP() formula. So introducing a
dedicate field mmlayout_flags to record it.

Among above, 2 and 3 are introduced closely, and are not distinguished
in current implement. And this patch also keep this practice and use
vabits_actual as a hint to flag mem flipped.

Signed-off-by: Pingfan Liu <piliu at redhat.com>
Cc: HAGIO KAZUHITO <k-hagio-ab at nec.com>
Cc: Lianbo Jiang <lijiang at redhat.com>
Cc: Bhupesh Sharma <bhupesh.sharma at linaro.org>
To: crash-utility at redhat.com
---
 arm64.c | 11 +++++++++++
 defs.h  |  3 +++
 2 files changed, 14 insertions(+)

diff --git a/arm64.c b/arm64.c
index 8934961..98138b2 100644
--- a/arm64.c
+++ b/arm64.c
@@ -560,6 +560,10 @@ arm64_dump_machdep_table(ulong arg)
 		fprintf(fp, "%sMACHDEP_BT_TEXT", others++ ? "|" : "");
 	if (machdep->flags & NEW_VMEMMAP)
 		fprintf(fp, "%sNEW_VMEMMAP", others++ ? "|" : "");
+	if (machdep->flags & FLIPPED_VM)
+		fprintf(fp, "%sFLIPPED_VM", others++ ? "|" : "");
+	if (machdep->flags & HAS_PHYSVIRT_OFFSET)
+		fprintf(fp, "%sHAS_PHYSVIRT_OFFSET", others++ ? "|" : "");
 	fprintf(fp, ")\n");
 
 	fprintf(fp, "              kvbase: %lx\n", machdep->kvbase);
@@ -994,6 +998,7 @@ arm64_calc_physvirt_offset(void)
 		if (READMEM(pc->mfd, &physvirt_offset, sizeof(physvirt_offset),
 			sp->value, sp->value -
 			machdep->machspec->kimage_voffset) > 0) {
+				machdep->flags |= HAS_PHYSVIRT_OFFSET;
 				ms->physvirt_offset = physvirt_offset;
 		}
 	}
@@ -3923,6 +3928,7 @@ arm64_calc_VA_BITS(void)
 	if (kernel_symbol_exists("vabits_actual")) {
 		if (pc->flags & PROC_KCORE) {
 			vabits_actual = symbol_value_from_proc_kallsyms("vabits_actual");
+			machdep->flags |= FLIPPED_VM;
 			if ((vabits_actual != BADVAL) && (READMEM(pc->mfd, &value, sizeof(ulong),
 		    	    vabits_actual, KCORE_USE_VADDR) > 0)) {
 				if (CRASHDEBUG(1))
@@ -3953,6 +3959,11 @@ arm64_calc_VA_BITS(void)
 				machdep->machspec->VA_BITS_ACTUAL = value;
 				machdep->machspec->VA_BITS = value;
 				machdep->machspec->VA_START = _VA_START(machdep->machspec->VA_BITS_ACTUAL);
+				/*
+				 * The mm flip commit is introduced before 52-bits VA, which is before the
+				 * commit to export NUMBER(TCR_EL1_T1SZ)
+				 */
+				machdep->flags |= FLIPPED_VM;
 			} else if (machdep->machspec->VA_BITS_ACTUAL) {
 				machdep->machspec->VA_BITS = machdep->machspec->VA_BITS_ACTUAL;
 				machdep->machspec->VA_START = _VA_START(machdep->machspec->VA_BITS_ACTUAL);
diff --git a/defs.h b/defs.h
index 396d61a..24d41e7 100644
--- a/defs.h
+++ b/defs.h
@@ -3208,6 +3208,8 @@ typedef signed int s32;
 #define NEW_VMEMMAP   (0x80)
 #define VM_L4_4K      (0x100)
 #define UNW_4_14      (0x200)
+#define FLIPPED_VM    (0x400)
+#define HAS_PHYSVIRT_OFFSET (0x800)
 
 /*
  * Get kimage_voffset from /dev/crash
@@ -3290,6 +3292,7 @@ struct arm64_pt_regs {
 struct machine_specific {
 	ulong flags;
 	ulong userspace_top;
+	ulong mmlayout_flags;
 	ulong page_offset;
 	ulong vmalloc_start_addr;
 	ulong vmalloc_end;
-- 
2.29.2




More information about the Crash-utility mailing list