[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] x86/traps: Clean up diagnostics
commit 8e3edefb880caeeaaf80123d5599139e8c2c9ecf Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> AuthorDate: Fri Oct 8 13:40:17 2021 +0100 Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CommitDate: Fri Dec 17 17:03:54 2021 +0000 x86/traps: Clean up diagnostics do{_unhandled,}_trap() should use fatal_trap() rather than opencoding part of it. This lets the remote stack trace logic work in more fatal error conditions. With do_trap() converted, there is only one single user of trapstr() remaining. Tweak the formatting in pv_inject_event(), and remove trapstr() entirely. Rename vec_name() to vector_name() now that it is exported. Take the opportunity of vector_name() being exported to improve the diagnostics in stub_selftest(). Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> --- xen/arch/x86/extable.c | 8 +++++--- xen/arch/x86/include/asm/traps.h | 2 +- xen/arch/x86/pv/traps.c | 6 +++--- xen/arch/x86/traps.c | 29 +++++------------------------ 4 files changed, 14 insertions(+), 31 deletions(-) diff --git a/xen/arch/x86/extable.c b/xen/arch/x86/extable.c index 109ab7da98..78d6727225 100644 --- a/xen/arch/x86/extable.c +++ b/xen/arch/x86/extable.c @@ -124,6 +124,8 @@ search_exception_table(const struct cpu_user_regs *regs) } #ifndef NDEBUG +#include <asm/traps.h> + static int __init stub_selftest(void) { static const struct { @@ -172,10 +174,10 @@ static int __init stub_selftest(void) if ( res.raw != tests[i].res.raw ) { printk("Selftest %u failed: Opc %*ph " - "expected %u[%04x], got %u[%04x]\n", + "expected %s[%04x], got %s[%04x]\n", i, (int)ARRAY_SIZE(tests[i].opc), tests[i].opc, - tests[i].res.fields.trapnr, tests[i].res.fields.ec, - res.fields.trapnr, res.fields.ec); + vector_name(tests[i].res.fields.trapnr), tests[i].res.fields.ec, + vector_name(res.fields.trapnr), res.fields.ec); fail = true; } diff --git a/xen/arch/x86/include/asm/traps.h b/xen/arch/x86/include/asm/traps.h index ec23d3a70b..b0dd2d2461 100644 --- a/xen/arch/x86/include/asm/traps.h +++ b/xen/arch/x86/include/asm/traps.h @@ -19,7 +19,7 @@ #ifndef ASM_TRAP_H #define ASM_TRAP_H -const char *trapstr(unsigned int trapnr); +const char *vector_name(unsigned int vec); #endif /* ASM_TRAP_H */ diff --git a/xen/arch/x86/pv/traps.c b/xen/arch/x86/pv/traps.c index 1e05a9f1cd..170e103098 100644 --- a/xen/arch/x86/pv/traps.c +++ b/xen/arch/x86/pv/traps.c @@ -89,9 +89,9 @@ void pv_inject_event(const struct x86_event *event) if ( unlikely(null_trap_bounce(curr, tb)) ) { - gprintk(XENLOG_WARNING, - "Unhandled %s fault/trap [#%d, ec=%04x]\n", - trapstr(vector), vector, error_code); + gprintk(XENLOG_ERR, + "Unhandled: vec %u, %s[%04x]\n", + vector, vector_name(vector), error_code); if ( vector == TRAP_page_fault ) show_page_walk(event->cr2); diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 581d8be2aa..485bd66971 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -767,21 +767,7 @@ static int nmi_show_execution_state(const struct cpu_user_regs *regs, int cpu) return 1; } -const char *trapstr(unsigned int trapnr) -{ - static const char * const strings[] = { - "divide error", "debug", "nmi", "bkpt", "overflow", "bounds", - "invalid opcode", "device not available", "double fault", - "coprocessor segment", "invalid tss", "segment not found", - "stack error", "general protection fault", "page fault", - "spurious interrupt", "coprocessor error", "alignment check", - "machine check", "simd error", "virtualisation exception" - }; - - return trapnr < ARRAY_SIZE(strings) ? strings[trapnr] : "???"; -} - -static const char *vec_name(unsigned int vec) +const char *vector_name(unsigned int vec) { static const char names[][4] = { #define P(x) [X86_EXC_ ## x] = "#" #x @@ -855,7 +841,7 @@ void fatal_trap(const struct cpu_user_regs *regs, bool show_remote) } panic("FATAL TRAP: vec %u, %s[%04x]%s\n", - trapnr, vec_name(trapnr), regs->error_code, + trapnr, vector_name(trapnr), regs->error_code, (regs->eflags & X86_EFLAGS_IF) ? "" : " IN INTERRUPT CONTEXT"); } @@ -866,9 +852,7 @@ void do_unhandled_trap(struct cpu_user_regs *regs) if ( debugger_trap_fatal(trapnr, regs) ) return; - show_execution_state(regs); - panic("FATAL RESERVED TRAP: vec %u, %s[%04x]\n", - trapnr, vec_name(trapnr), regs->error_code); + fatal_trap(regs, false); } static void fixup_exception_return(struct cpu_user_regs *regs, @@ -942,7 +926,7 @@ static bool extable_fixup(struct cpu_user_regs *regs, bool print) */ if ( IS_ENABLED(CONFIG_DEBUG) && print ) printk(XENLOG_GUEST XENLOG_WARNING "Fixup %s[%04x]: %p [%ps] -> %p\n", - vec_name(regs->entry_vector), regs->error_code, + vector_name(regs->entry_vector), regs->error_code, _p(regs->rip), _p(regs->rip), _p(fixup)); fixup_exception_return(regs, fixup); @@ -978,10 +962,7 @@ void do_trap(struct cpu_user_regs *regs) if ( debugger_trap_fatal(trapnr, regs) ) return; - show_execution_state(regs); - panic("FATAL TRAP: vector = %d (%s)\n" - "[error_code=%04x]\n", - trapnr, trapstr(trapnr), regs->error_code); + fatal_trap(regs, false); } int guest_rdmsr_xen(const struct vcpu *v, uint32_t idx, uint64_t *val) -- generated by git-patchbot for /home/xen/git/xen.git#master
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |