Blame SOURCES/0002-Fix-for-bt-command-printing-bogus-exception-frame-wa.patch

dbaa30
From 92de7c34b1f910abff4d77522f74454ea0263a90 Mon Sep 17 00:00:00 2001
dbaa30
From: Lianbo Jiang <lijiang@redhat.com>
dbaa30
Date: Mon, 13 Feb 2023 11:12:12 +0800
dbaa30
Subject: [PATCH] Fix for "bt" command printing "bogus exception frame" warning
dbaa30
dbaa30
Currently, the "bt" command may print a bogus exception frame
dbaa30
and the remaining frame will be truncated on x86_64 when using the
dbaa30
"virsh send-key <kvm guest> KEY_LEFTALT KEY_SYSRQ KEY_C" command
dbaa30
to trigger a panic from the KVM host. For example:
dbaa30
dbaa30
  crash> bt
dbaa30
  PID: 0        TASK: ffff9e7a47e32f00  CPU: 3    COMMAND: "swapper/3"
dbaa30
   #0 [ffffba7900118bb8] machine_kexec at ffffffff87e5c2c7
dbaa30
   #1 [ffffba7900118c08] __crash_kexec at ffffffff87f9500d
dbaa30
   #2 [ffffba7900118cd0] panic at ffffffff87edfff9
dbaa30
   #3 [ffffba7900118d50] sysrq_handle_crash at ffffffff883ce2c1
dbaa30
   ...
dbaa30
   #16 [ffffba7900118fd8] handle_edge_irq at ffffffff87f559f2
dbaa30
   #17 [ffffba7900118ff0] asm_call_on_stack at ffffffff88800fa2
dbaa30
   --- <IRQ stack> ---
dbaa30
   #18 [ffffba790008bda0] asm_call_on_stack at ffffffff88800fa2
dbaa30
       RIP: ffffffffffffffff  RSP: 0000000000000124  RFLAGS: 00000003
dbaa30
       RAX: 0000000000000000  RBX: 0000000000000001  RCX: 0000000000000000
dbaa30
       RDX: ffffffff88800c1e  RSI: 0000000000000000  RDI: 0000000000000000
dbaa30
       RBP: 0000000000000001   R8: 0000000000000000   R9: 0000000000000000
dbaa30
       R10: 0000000000000000  R11: ffffffff88760555  R12: ffffba790008be08
dbaa30
       R13: ffffffff87f18002  R14: ffff9e7a47e32f00  R15: ffff9e7bb6198e00
dbaa30
       ORIG_RAX: 0000000000000000  CS: 0003  SS: 0000
dbaa30
  bt: WARNING: possibly bogus exception frame
dbaa30
  crash>
dbaa30
dbaa30
The following related kernel commits cause the current issue, crash
dbaa30
needs to adjust the value of irq_eframe_link.
dbaa30
dbaa30
Related kernel commits:
dbaa30
[1] v5.8: 931b94145981 ("x86/entry: Provide helpers for executing on the irqstack")
dbaa30
[2] v5.8: fa5e5c409213 ("x86/entry: Use idtentry for interrupts")
dbaa30
[3] v5.12: 52d743f3b712 ("x86/softirq: Remove indirection in do_softirq_own_stack()")
dbaa30
dbaa30
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
dbaa30
Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
dbaa30
---
dbaa30
 x86_64.c | 13 +++++++++++++
dbaa30
 1 file changed, 13 insertions(+)
dbaa30
dbaa30
diff --git a/x86_64.c b/x86_64.c
dbaa30
index 7a5d6f050c89..5b671bd97775 100644
dbaa30
--- a/x86_64.c
dbaa30
+++ b/x86_64.c
dbaa30
@@ -3938,6 +3938,11 @@ in_exception_stack:
dbaa30
         if (irq_eframe) {
dbaa30
                 bt->flags |= BT_EXCEPTION_FRAME;
dbaa30
                 i = (irq_eframe - bt->stackbase)/sizeof(ulong);
dbaa30
+                if (symbol_exists("asm_common_interrupt")) {
dbaa30
+			i -= 1;
dbaa30
+			up = (ulong *)(&bt->stackbuf[i*sizeof(ulong)]);
dbaa30
+			bt->instptr = *up;
dbaa30
+                }
dbaa30
                 x86_64_print_stack_entry(bt, ofp, level, i, bt->instptr);
dbaa30
                 bt->flags &= ~(ulonglong)BT_EXCEPTION_FRAME;
dbaa30
                 cs = x86_64_exception_frame(EFRAME_PRINT|EFRAME_CS, 0, 
dbaa30
@@ -6521,6 +6526,14 @@ x86_64_irq_eframe_link_init(void)
dbaa30
 	else
dbaa30
 		return; 
dbaa30
 
dbaa30
+	if (symbol_exists("asm_common_interrupt")) {
dbaa30
+		if (symbol_exists("asm_call_on_stack"))
dbaa30
+			machdep->machspec->irq_eframe_link = -64;
dbaa30
+		else
dbaa30
+			machdep->machspec->irq_eframe_link = -32;
dbaa30
+		return;
dbaa30
+	}
dbaa30
+
dbaa30
 	if (THIS_KERNEL_VERSION < LINUX(2,6,9)) 
dbaa30
 		return;
dbaa30
 
dbaa30
-- 
dbaa30
2.37.1
dbaa30