From 45685956da58b15d4542d59b95888b1968980c68 Mon Sep 17 00:00:00 2001 From: Xiaoguang Wang Date: Thu, 7 Nov 2024 14:40:07 +0800 Subject: [PATCH] arm64: fix SDEI stack frame unwind while UNW_4_14 is set Fix two bugs: 1) If BT_IRQSTACK is set, both irq_stack and sdei_normal_stack need to be checked while switching to process stack. 2) Use bt->frameptr in arm64_unwind_frame() just like irq stack. Fixes: 442da89f4898 ("crash: add SDEI stack resolution") Signed-off-by: Xiaoguang Wang --- arm64.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arm64.c b/arm64.c index b99baa3..34c3b08 100644 --- a/arm64.c +++ b/arm64.c @@ -3244,10 +3244,10 @@ arm64_unwind_frame(struct bt_info *bt, struct arm64_stackframe *frame) if (machdep->flags & UNW_4_14) { if (((bt->flags & BT_IRQSTACK) && - !arm64_on_irq_stack(bt->tc->processor, frame->fp)) || + !arm64_on_irq_stack(bt->tc->processor, frame->fp) && + !arm64_in_sdei_normal_stack(bt->tc->processor, frame->fp)) || ((bt->flags & BT_OVERFLOW_STACK) && - !arm64_on_overflow_stack(bt->tc->processor, frame->fp)) && - !arm64_in_sdei_normal_stack(bt->tc->processor, frame->fp)) { + !arm64_on_overflow_stack(bt->tc->processor, frame->fp))) { if (arm64_on_process_stack(bt, frame->fp)) { arm64_set_process_stack(bt); @@ -3696,7 +3696,7 @@ arm64_back_trace_cmd(struct bt_info *bt) arm64_set_overflow_stack(bt); bt->flags |= BT_OVERFLOW_STACK; } - if (arm64_in_sdei_normal_stack(bt->tc->processor, bt->bptr)) { + if (arm64_in_sdei_normal_stack(bt->tc->processor, bt->frameptr)) { arm64_set_sdei_normal_stack(bt); bt->flags |= BT_IRQSTACK; } -- 2.34.1