[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] x86/HVM: also dump stacks from show_execution_state()
commit adb715db698bc8ec3b88c24eb88b21e9da5b6c07 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Fri Dec 3 11:15:57 2021 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Fri Dec 3 11:15:57 2021 +0100 x86/HVM: also dump stacks from show_execution_state() Wire up show_hvm_stack() also on this path. Move the show_guest_stack() invocation out of show_stack(), rendering dead the is-HVM check there. While separating guest and host paths, also move the show_code() invocation - the function bails immediately when guest_mode() returns "true". Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> --- xen/arch/x86/traps.c | 35 +++++++++++++++++++++++++---------- xen/include/asm-x86/processor.h | 1 - 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 6d7d88c3c4..2ddcd95dce 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -306,10 +306,6 @@ static void show_guest_stack(struct vcpu *v, const struct cpu_user_regs *regs) unsigned long mask = STACK_SIZE; void *stack_page = NULL; - /* Avoid HVM as we don't know what the stack looks like. */ - if ( is_hvm_vcpu(v) ) - return; - if ( is_pv_32bit_vcpu(v) ) { compat_show_guest_stack(v, regs, debug_stack_lines); @@ -618,14 +614,11 @@ static void show_trace(const struct cpu_user_regs *regs) printk("\n"); } -void show_stack(const struct cpu_user_regs *regs) +static void show_stack(const struct cpu_user_regs *regs) { unsigned long *stack = ESP_BEFORE_EXCEPTION(regs), *stack_bottom, addr; int i; - if ( guest_mode(regs) ) - return show_guest_stack(current, regs); - printk("Xen stack trace from "__OP"sp=%p:\n ", stack); stack_bottom = _p(get_stack_dump_bottom(regs->rsp)); @@ -694,8 +687,30 @@ void show_execution_state(const struct cpu_user_regs *regs) unsigned long flags = console_lock_recursive_irqsave(); show_registers(regs); - show_code(regs); - show_stack(regs); + + if ( guest_mode(regs) ) + { + struct vcpu *curr = current; + + if ( is_hvm_vcpu(curr) ) + { + /* + * Stop interleaving prevention: The necessary P2M lookups + * involve locking, which has to occur with IRQs enabled. + */ + console_unlock_recursive_irqrestore(flags); + + show_hvm_stack(curr, regs); + return; + } + + show_guest_stack(curr, regs); + } + else + { + show_code(regs); + show_stack(regs); + } console_unlock_recursive_irqrestore(flags); } diff --git a/xen/include/asm-x86/processor.h b/xen/include/asm-x86/processor.h index bc4dc69253..400b4fac5e 100644 --- a/xen/include/asm-x86/processor.h +++ b/xen/include/asm-x86/processor.h @@ -493,7 +493,6 @@ static always_inline void rep_nop(void) #define cpu_relax() rep_nop() void show_code(const struct cpu_user_regs *regs); -void show_stack(const struct cpu_user_regs *regs); void show_stack_overflow(unsigned int cpu, const struct cpu_user_regs *regs); void show_registers(const struct cpu_user_regs *regs); void show_execution_state(const struct cpu_user_regs *regs); -- generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |