3f5a509172
Release: crash-8.0.5-5 Resolves: RHEL-33667 Signed-off-by: Tao Liu <ltao@redhat.com>
127 lines
5.0 KiB
Diff
127 lines
5.0 KiB
Diff
From 1c6da3eaff820708d4286324051d153a01766b02 Mon Sep 17 00:00:00 2001
|
|
From: bevis_chen <bevis_chen@asus.com>
|
|
Date: Thu, 25 Jul 2024 09:38:59 +0800
|
|
Subject: [PATCH 2/5] arm64: Fix bt command show wrong stacktrace on ramdump
|
|
source
|
|
|
|
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>
|
|
---
|
|
arm64.c | 29 +++++++++++++++++++++++++++++
|
|
1 file changed, 29 insertions(+)
|
|
|
|
diff --git a/arm64.c b/arm64.c
|
|
index 624dba2..78e6609 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.40.1
|
|
|