diff --git a/0001-gdb-Fix-an-assertion-failure-in-the-gdb-s-copy_type.patch b/0001-gdb-Fix-an-assertion-failure-in-the-gdb-s-copy_type.patch new file mode 100644 index 0000000..a227f44 --- /dev/null +++ b/0001-gdb-Fix-an-assertion-failure-in-the-gdb-s-copy_type.patch @@ -0,0 +1,75 @@ +From d941266da5fb9c386128a180f39281ec9d4aa242 Mon Sep 17 00:00:00 2001 +From: Lianbo Jiang +Date: Mon, 20 Feb 2023 15:57:04 +0800 +Subject: [PATCH] gdb: Fix an assertion failure in the gdb's copy_type() + +This is a backported patch from gdb. Without the patch, the following +crash command may abort due to an assertion failure in the gdb's +copy_type(): + + crash> px __per_cpu_start:0 + gdbtypes.c:5505: internal-error: type* copy_type(const type*): Assertion `TYPE_OBJFILE_OWNED (type)' failed. + A problem internal to GDB has been detected, + further debugging may prove unreliable. + Quit this debugging session? (y or n) + +The gdb commit 8e2da1651879 ("Fix assertion failure in copy_type") +solved the current issue. + +Reported-by: Buland Kumar Singh +Signed-off-by: Lianbo Jiang +--- + gdb-10.2.patch | 40 ++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 40 insertions(+) + +diff --git a/gdb-10.2.patch b/gdb-10.2.patch +index 91edfb338445..8c3b5a7fdf77 100644 +--- a/gdb-10.2.patch ++++ b/gdb-10.2.patch +@@ -1737,3 +1737,43 @@ exit 0 + struct field *nextfield; + short nfields; + struct type *typedef_type, *target_type; ++--- gdb-10.2/gdb/gdbtypes.c.orig +++++ gdb-10.2/gdb/gdbtypes.c ++@@ -5492,27 +5492,25 @@ copy_type_recursive (struct objfile *objfile, ++ } ++ ++ /* Make a copy of the given TYPE, except that the pointer & reference ++- types are not preserved. ++- ++- This function assumes that the given type has an associated objfile. ++- This objfile is used to allocate the new type. */ +++ types are not preserved. */ ++ ++ struct type * ++ copy_type (const struct type *type) ++ { ++- struct type *new_type; ++- ++- gdb_assert (TYPE_OBJFILE_OWNED (type)); +++ struct type *new_type = alloc_type_copy (type); ++ ++- new_type = alloc_type_copy (type); ++ TYPE_INSTANCE_FLAGS (new_type) = TYPE_INSTANCE_FLAGS (type); ++ TYPE_LENGTH (new_type) = TYPE_LENGTH (type); ++ memcpy (TYPE_MAIN_TYPE (new_type), TYPE_MAIN_TYPE (type), ++ sizeof (struct main_type)); ++ if (type->main_type->dyn_prop_list != NULL) ++- new_type->main_type->dyn_prop_list ++- = copy_dynamic_prop_list (&TYPE_OBJFILE (type) -> objfile_obstack, ++- type->main_type->dyn_prop_list); +++ { +++ struct obstack *storage = (TYPE_OBJFILE_OWNED (type) +++ ? &TYPE_OBJFILE (type)->objfile_obstack +++ : gdbarch_obstack (TYPE_OWNER (type).gdbarch)); +++ new_type->main_type->dyn_prop_list +++ = copy_dynamic_prop_list (storage, type->main_type->dyn_prop_list); +++ } ++ ++ return new_type; ++ } ++ +-- +2.37.1 + diff --git a/0002-Fix-for-bt-command-printing-bogus-exception-frame-wa.patch b/0002-Fix-for-bt-command-printing-bogus-exception-frame-wa.patch new file mode 100644 index 0000000..c8bac89 --- /dev/null +++ b/0002-Fix-for-bt-command-printing-bogus-exception-frame-wa.patch @@ -0,0 +1,79 @@ +From 92de7c34b1f910abff4d77522f74454ea0263a90 Mon Sep 17 00:00:00 2001 +From: Lianbo Jiang +Date: Mon, 13 Feb 2023 11:12:12 +0800 +Subject: [PATCH] Fix for "bt" command printing "bogus exception frame" warning + +Currently, the "bt" command may print a bogus exception frame +and the remaining frame will be truncated on x86_64 when using the +"virsh send-key KEY_LEFTALT KEY_SYSRQ KEY_C" command +to trigger a panic from the KVM host. For example: + + crash> bt + PID: 0 TASK: ffff9e7a47e32f00 CPU: 3 COMMAND: "swapper/3" + #0 [ffffba7900118bb8] machine_kexec at ffffffff87e5c2c7 + #1 [ffffba7900118c08] __crash_kexec at ffffffff87f9500d + #2 [ffffba7900118cd0] panic at ffffffff87edfff9 + #3 [ffffba7900118d50] sysrq_handle_crash at ffffffff883ce2c1 + ... + #16 [ffffba7900118fd8] handle_edge_irq at ffffffff87f559f2 + #17 [ffffba7900118ff0] asm_call_on_stack at ffffffff88800fa2 + --- --- + #18 [ffffba790008bda0] asm_call_on_stack at ffffffff88800fa2 + RIP: ffffffffffffffff RSP: 0000000000000124 RFLAGS: 00000003 + RAX: 0000000000000000 RBX: 0000000000000001 RCX: 0000000000000000 + RDX: ffffffff88800c1e RSI: 0000000000000000 RDI: 0000000000000000 + RBP: 0000000000000001 R8: 0000000000000000 R9: 0000000000000000 + R10: 0000000000000000 R11: ffffffff88760555 R12: ffffba790008be08 + R13: ffffffff87f18002 R14: ffff9e7a47e32f00 R15: ffff9e7bb6198e00 + ORIG_RAX: 0000000000000000 CS: 0003 SS: 0000 + bt: WARNING: possibly bogus exception frame + crash> + +The following related kernel commits cause the current issue, crash +needs to adjust the value of irq_eframe_link. + +Related kernel commits: +[1] v5.8: 931b94145981 ("x86/entry: Provide helpers for executing on the irqstack") +[2] v5.8: fa5e5c409213 ("x86/entry: Use idtentry for interrupts") +[3] v5.12: 52d743f3b712 ("x86/softirq: Remove indirection in do_softirq_own_stack()") + +Signed-off-by: Lianbo Jiang +Signed-off-by: Kazuhito Hagio +--- + x86_64.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/x86_64.c b/x86_64.c +index 7a5d6f050c89..5b671bd97775 100644 +--- a/x86_64.c ++++ b/x86_64.c +@@ -3938,6 +3938,11 @@ in_exception_stack: + if (irq_eframe) { + bt->flags |= BT_EXCEPTION_FRAME; + i = (irq_eframe - bt->stackbase)/sizeof(ulong); ++ if (symbol_exists("asm_common_interrupt")) { ++ i -= 1; ++ up = (ulong *)(&bt->stackbuf[i*sizeof(ulong)]); ++ bt->instptr = *up; ++ } + x86_64_print_stack_entry(bt, ofp, level, i, bt->instptr); + bt->flags &= ~(ulonglong)BT_EXCEPTION_FRAME; + cs = x86_64_exception_frame(EFRAME_PRINT|EFRAME_CS, 0, +@@ -6521,6 +6526,14 @@ x86_64_irq_eframe_link_init(void) + else + return; + ++ if (symbol_exists("asm_common_interrupt")) { ++ if (symbol_exists("asm_call_on_stack")) ++ machdep->machspec->irq_eframe_link = -64; ++ else ++ machdep->machspec->irq_eframe_link = -32; ++ return; ++ } ++ + if (THIS_KERNEL_VERSION < LINUX(2,6,9)) + return; + +-- +2.37.1 + diff --git a/0003-Fix-for-bt-command-unnecessarily-printing-an-excepti.patch b/0003-Fix-for-bt-command-unnecessarily-printing-an-excepti.patch new file mode 100644 index 0000000..266e3dc --- /dev/null +++ b/0003-Fix-for-bt-command-unnecessarily-printing-an-excepti.patch @@ -0,0 +1,78 @@ +From e0e6e4a7ee03b3d00b50a9e4db2f2ea6f7da0da3 Mon Sep 17 00:00:00 2001 +From: Lianbo Jiang +Date: Wed, 15 Feb 2023 16:24:57 +0800 +Subject: [PATCH] Fix for "bt" command unnecessarily printing an exception + frame + +Kernel commit 7d65f4a65532 ("irq: Consolidate do_softirq() arch overriden +implementations") renamed the call_softirq to do_softirq_own_stack, and +there is no exception frame also when coming from do_softirq_own_stack. +Without the patch, crash may unnecessarily output an exception frame with +a warning as below: + + crash> foreach bt + ... + PID: 0 TASK: ffff914f820a8000 CPU: 25 COMMAND: "swapper/25" + #0 [fffffe0000504e48] crash_nmi_callback at ffffffffa665d763 + #1 [fffffe0000504e50] nmi_handle at ffffffffa662a423 + #2 [fffffe0000504ea8] default_do_nmi at ffffffffa6fe7dc9 + #3 [fffffe0000504ec8] do_nmi at ffffffffa662a97f + #4 [fffffe0000504ef0] end_repeat_nmi at ffffffffa70015e8 + [exception RIP: clone_endio+172] + RIP: ffffffffc005c1ec RSP: ffffa1d403d08e98 RFLAGS: 00000246 + RAX: 0000000000000000 RBX: ffff915326fba230 RCX: 0000000000000018 + RDX: ffffffffc0075400 RSI: 0000000000000000 RDI: ffff915326fba230 + RBP: ffff915326fba1c0 R8: 0000000000001000 R9: ffff915308d6d2a0 + R10: 000000a97dfe5e10 R11: ffffa1d40038fe98 R12: ffff915302babc40 + R13: ffff914f94360000 R14: 0000000000000000 R15: 0000000000000000 + ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018 + --- --- + #5 [ffffa1d403d08e98] clone_endio at ffffffffc005c1ec [dm_mod] + #6 [ffffa1d403d08ed0] blk_update_request at ffffffffa6a96954 + #7 [ffffa1d403d08f10] scsi_end_request at ffffffffa6c9b968 + #8 [ffffa1d403d08f48] scsi_io_completion at ffffffffa6c9bb3e + #9 [ffffa1d403d08f90] blk_complete_reqs at ffffffffa6aa0e95 + #10 [ffffa1d403d08fa0] __softirqentry_text_start at ffffffffa72000dc + #11 [ffffa1d403d08ff0] do_softirq_own_stack at ffffffffa7000f9a + --- --- + #12 [ffffa1d40038fe70] do_softirq_own_stack at ffffffffa7000f9a + [exception RIP: unknown or invalid address] + RIP: 0000000000000000 RSP: 0000000000000000 RFLAGS: 00000000 + RAX: ffffffffa672eae5 RBX: ffffffffa83b34e0 RCX: ffffffffa672eb12 + RDX: 0000000000000010 RSI: 8b7d6c8869010c00 RDI: 0000000000000085 + RBP: 0000000000000286 R8: ffff914f820a8000 R9: ffffffffa67a94e0 + R10: 0000000000000286 R11: ffffffffa66fb4c5 R12: ffffffffa67a898b + R13: 0000000000000000 R14: fffffffffffffff8 R15: ffffffffa67a1e68 + ORIG_RAX: 0000000000000000 CS: 0000 SS: ffffffffa672edff + bt: WARNING: possibly bogus exception frame + #13 [ffffa1d40038ff30] start_secondary at ffffffffa665fa2c + #14 [ffffa1d40038ff50] secondary_startup_64_no_verify at ffffffffa6600116 + ... + +Reported-by: Marco Patalano +Signed-off-by: Lianbo Jiang +--- + x86_64.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/x86_64.c b/x86_64.c +index 5b671bd97775..6cac3936b33d 100644 +--- a/x86_64.c ++++ b/x86_64.c +@@ -3825,10 +3825,11 @@ in_exception_stack: + up -= 1; + bt->instptr = *up; + /* +- * No exception frame when coming from call_softirq. ++ * No exception frame when coming from do_softirq_own_stack ++ * or call_softirq. + */ + if ((sp = value_search(bt->instptr, &offset)) && +- STREQ(sp->name, "call_softirq")) ++ (STREQ(sp->name, "do_softirq_own_stack") || STREQ(sp->name, "call_softirq"))) + irq_eframe = 0; + bt->frameptr = 0; + done = FALSE; +-- +2.37.1 + diff --git a/crash.spec b/crash.spec index d9c7f61..ed45f85 100644 --- a/crash.spec +++ b/crash.spec @@ -4,7 +4,7 @@ Summary: Kernel analysis utility for live systems, netdump, diskdump, kdump, LKCD or mcore dumpfiles Name: crash Version: 8.0.2 -Release: 1%{?dist} +Release: 2%{?dist} License: GPLv3 Source0: https://github.com/crash-utility/crash/archive/crash-%{version}.tar.gz Source1: http://ftp.gnu.org/gnu/gdb/gdb-10.2.tar.gz @@ -19,6 +19,9 @@ Provides: bundled(libiberty) Provides: bundled(gdb) = 10.2 Patch0: lzo_snappy_zstd.patch Patch1: crash-8.0.2_build.patch +Patch2: 0001-gdb-Fix-an-assertion-failure-in-the-gdb-s-copy_type.patch +Patch3: 0002-Fix-for-bt-command-printing-bogus-exception-frame-wa.patch +Patch4: 0003-Fix-for-bt-command-unnecessarily-printing-an-excepti.patch %description The core analysis suite is a self-contained tool that can be used to @@ -40,6 +43,10 @@ offered by Mission Critical Linux, or the LKCD kernel patch. %setup -n %{name}-%{version} -q %patch0 -p1 -b lzo_snappy_zstd.patch %patch1 -p1 -b crash-8.0.2_build.patch +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 + %build @@ -65,6 +72,10 @@ cp -p defs.h %{buildroot}%{_includedir}/crash %{_includedir}/* %changelog +* Mon Feb 20 2023 Lianbo Jiang - 8.0.2-2 +- Fix an assertion failure in the gdb's copy_type() +- Fix for "bt" command printing "bogus exception frame" warning + * Thu Nov 17 2022 Lianbo Jiang - 8.0.2-1 - Rebase to upstream crash 8.0.2