File 0011-arm64-Fix-bt-command-show-wrong-stacktrace-on-ramdum.patch of Package crash.20241029092954

From: bevis_chen <bevis_chen@asus.com>
Date: Thu, 25 Jul 2024 09:38:59 +0800
Subject: arm64: Fix bt command show wrong stacktrace on ramdump source
Git-repo: https://github.com/crash-utility/crash.git
Git-commit: 1c6da3eaff820708d4286324051d153a01766b02
Patch-mainline: 8.0.6
References: bsc#1228388

For ramdump(Qcom phone device) case with the kernel option
CONFIG_ARM64_PTR_AUTH_KERNEL enabled, the bt command may print
incorrect stacktrace as below:

  crash> bt 16930
  PID: 16930    TASK: ffffff89b3eada00  CPU: 2    COMMAND: "Firebase Backgr"
   #0 [ffffffc034c437f0] __switch_to at ffffffe0036832d4
   #1 [ffffffc034c43850] __kvm_nvhe_$d.2314 at 6be732e004cf05a0
   #2 [ffffffc034c438b0] __kvm_nvhe_$d.2314 at 86c54c6004ceff80
   #3 [ffffffc034c43950] __kvm_nvhe_$d.2314 at 55d6f96003a7b120
  ...
       PC: 00000073f5294840   LR: 00000070d8f39ba4   SP: 00000070d4afd5d0
      X29: 00000070d4afd600  X28: b4000071efcda7f0  X27: 00000070d4afe000
      X26: 0000000000000000  X25: 00000070d9616000  X24: 0000000000000000
      X23: 0000000000000000  X22: 0000000000000000  X21: 0000000000000000
      X20: b40000728fd27520  X19: b40000728fd27550  X18: 000000702daba000
      X17: 00000073f5294820  X16: 00000070d940f9d8  X15: 00000000000000bf
      X14: 0000000000000000  X13: 00000070d8ad2fac  X12: b40000718fce5040
      X11: 0000000000000000  X10: 0000000000000070   X9: 0000000000000001
       X8: 0000000000000062   X7: 0000000000000020   X6: 0000000000000000
       X5: 0000000000000000   X4: 0000000000000000   X3: 0000000000000000
       X2: 0000000000000002   X1: 0000000000000080   X0: b40000728fd27550
      ORIG_X0: b40000728fd27550  SYSCALLNO: ffffffff  PSTATE: 40001000

Crash tool can not get the KERNELPACMASK value from the vmcoreinfo, need
to calculate its value based on the vabits.

With the patch:

  crash> bt 16930
  PID: 16930    TASK: ffffff89b3eada00  CPU: 2    COMMAND: "Firebase Backgr"
   #0 [ffffffc034c437f0] __switch_to at ffffffe0036832d4
   #1 [ffffffc034c43850] __schedule at ffffffe004cf05a0
   #2 [ffffffc034c438b0] preempt_schedule_common at ffffffe004ceff80
   #3 [ffffffc034c43950] unmap_page_range at ffffffe003a7b120
   #4 [ffffffc034c439f0] unmap_vmas at ffffffe003a80a64
   #5 [ffffffc034c43ac0] exit_mmap at ffffffe003a945c4
   #6 [ffffffc034c43b10] __mmput at ffffffe00372c818
   #7 [ffffffc034c43b40] mmput at ffffffe00372c0d0
   #8 [ffffffc034c43b90] exit_mm at ffffffe00373d0ac
   #9 [ffffffc034c43c00] do_exit at ffffffe00373bedc
       PC: 00000073f5294840   LR: 00000070d8f39ba4   SP: 00000070d4afd5d0
      X29: 00000070d4afd600  X28: b4000071efcda7f0  X27: 00000070d4afe000
      X26: 0000000000000000  X25: 00000070d9616000  X24: 0000000000000000
      X23: 0000000000000000  X22: 0000000000000000  X21: 0000000000000000
      X20: b40000728fd27520  X19: b40000728fd27550  X18: 000000702daba000
      X17: 00000073f5294820  X16: 00000070d940f9d8  X15: 00000000000000bf
      X14: 0000000000000000  X13: 00000070d8ad2fac  X12: b40000718fce5040
      X11: 0000000000000000  X10: 0000000000000070   X9: 0000000000000001
       X8: 0000000000000062   X7: 0000000000000020   X6: 0000000000000000
       X5: 0000000000000000   X4: 0000000000000000   X3: 0000000000000000
       X2: 0000000000000002   X1: 0000000000000080   X0: b40000728fd27550
      ORIG_X0: b40000728fd27550  SYSCALLNO: ffffffff  PSTATE: 40001000

Related kernel commits:
689eae42afd7 ("arm64: mask PAC bits of __builtin_return_address")
de1702f65feb ("arm64: move PAC masks to <asm/pointer_auth.h>")

Signed-off-by: bevis_chen <bevis_chen@asus.com>
Signed-off-by: Jiri Slaby (SUSE) <jirislaby@kernel.org>
---
 arm64.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/arm64.c b/arm64.c
index 624dba2368d7..78e6609e3722 100644
--- a/arm64.c
+++ b/arm64.c
@@ -92,6 +92,7 @@ static void arm64_get_crash_notes(void);
 static void arm64_calc_VA_BITS(void);
 static int arm64_is_uvaddr(ulong, struct task_context *);
 static void arm64_calc_KERNELPACMASK(void);
+static void arm64_recalc_KERNELPACMASK(void);
 static int arm64_get_vmcoreinfo(unsigned long *vaddr, const char *label, int base);
 
 struct kernel_range {
@@ -581,6 +582,16 @@ arm64_init(int when)
 		if (!machdep->hz)
 			machdep->hz = 100;
 
+
+		/*
+		 * Let's calculate the KERNELPACMASK value based on the
+		 * vabits, see:
+		 * arch/arm64/kernel/vmcore_info.c
+		 * arch/arm64/include/asm/pointer_auth.h
+		 */
+		if(!machdep->machspec->CONFIG_ARM64_KERNELPACMASK)
+			arm64_recalc_KERNELPACMASK();
+
 		arm64_irq_stack_init();
 		arm64_overflow_stack_init();
 		arm64_stackframe_init();
@@ -4921,6 +4932,24 @@ static void arm64_calc_KERNELPACMASK(void)
 	}
 }
 
+#define GENMASK_UL(h, l) \
+    (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
+
+static void arm64_recalc_KERNELPACMASK(void){
+	/*
+	 * Check if PAC is enabled according to the existence of
+	 * kernel symbol 'ptrauth_keys_kernel'.
+	 */
+	if (STRUCT_EXISTS("ptrauth_keys_kernel") &&
+			machdep->machspec->VA_BITS_ACTUAL){
+		machdep->machspec->CONFIG_ARM64_KERNELPACMASK =
+			GENMASK_UL(63, machdep->machspec->VA_BITS_ACTUAL);
+		if (CRASHDEBUG(1))
+			fprintf(fp, "CONFIG_ARM64_KERNELPACMASK: %lx\n",
+				machdep->machspec->CONFIG_ARM64_KERNELPACMASK);
+	}
+}
+
 #endif  /* ARM64 */
 
 
-- 
2.45.2

openSUSE Build Service is sponsored by