From 0f162febebc4d11a165dd40cee00f3b0ba691a52 Mon Sep 17 00:00:00 2001 From: Qi Zheng Date: Tue, 24 May 2022 20:25:54 +0800 Subject: [PATCH 07/15] bt: arm64: add support for 'bt -n idle' The '-n idle' option of bt command can help us filter the stack of the idle process when debugging the dumpfiles captured by kdump. This patch supports this feature on ARM64. Signed-off-by: Qi Zheng --- arm64.c | 19 ++++++++++++++++--- help.c | 2 +- kernel.c | 3 ++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/arm64.c b/arm64.c index 65f6cdf69fa6..0f615cf52bef 100644 --- a/arm64.c +++ b/arm64.c @@ -3681,6 +3681,12 @@ arm64_get_dumpfile_stackframe(struct bt_info *bt, struct arm64_stackframe *frame { struct machine_specific *ms = machdep->machspec; struct arm64_pt_regs *ptregs; + bool skip = false; + + if (bt->flags & BT_SKIP_IDLE) { + skip = true; + bt->flags &= ~BT_SKIP_IDLE; + } if (!ms->panic_task_regs || (!ms->panic_task_regs[bt->tc->processor].sp && @@ -3713,8 +3719,11 @@ try_kernel: } if (arm64_in_kdump_text(bt, frame) || - arm64_in_kdump_text_on_irq_stack(bt)) + arm64_in_kdump_text_on_irq_stack(bt)) { bt->flags |= BT_KDUMP_ADJUST; + if (skip && is_idle_thread(bt->task)) + bt->flags |= BT_SKIP_IDLE; + } return TRUE; } @@ -3738,10 +3747,14 @@ arm64_get_stack_frame(struct bt_info *bt, ulong *pcp, ulong *spp) int ret; struct arm64_stackframe stackframe = { 0 }; - if (DUMPFILE() && is_task_active(bt->task)) + if (DUMPFILE() && is_task_active(bt->task)) { ret = arm64_get_dumpfile_stackframe(bt, &stackframe); - else + } else { + if (bt->flags & BT_SKIP_IDLE) + bt->flags &= ~BT_SKIP_IDLE; + ret = arm64_get_stackframe(bt, &stackframe); + } if (!ret) error(WARNING, diff --git a/help.c b/help.c index e1bbc5abe029..99214c1590fa 100644 --- a/help.c +++ b/help.c @@ -1915,7 +1915,7 @@ char *help_bt[] = { " -a displays the stack traces of the active task on each CPU.", " (only applicable to crash dumps)", " -A same as -a, but also displays vector registers (S390X only).", -" -n idle filter the stack of idle tasks (x86_64).", +" -n idle filter the stack of idle tasks (x86_64, arm64).", " (only applicable to crash dumps)", " -p display the stack trace of the panic task only.", " (only applicable to crash dumps)", diff --git a/kernel.c b/kernel.c index 411e9da1e54f..a521ef30cdb0 100644 --- a/kernel.c +++ b/kernel.c @@ -2673,7 +2673,8 @@ cmd_bt(void) break; case 'n': - if (machine_type("X86_64") && STREQ(optarg, "idle")) + if ((machine_type("X86_64") || machine_type("ARM64")) && + STREQ(optarg, "idle")) bt->flags |= BT_SKIP_IDLE; else option_not_supported(c); -- 2.30.2