[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [IA64] Fix infinite loop in fault handler if debugger is not connected
# HG changeset patch # User Alex Williamson <alex.williamson@xxxxxx> # Date 1201716809 25200 # Node ID 33d0cf9474f93ff1eb7654754554b41351148f57 # Parent 13eb21985d3d990592f1becc1a2dbfb62630aceb [IA64] Fix infinite loop in fault handler if debugger is not connected If xen is compiled with crash_debug=y and the debugger is not connected, the fault handler enters infinite loop. regs may be on stack, so split the incrementing out of vcpu_increment_iip(). Signed-off-by: Kazuhiro Suzuki <kaz@xxxxxxxxxxxxxx> --- xen/arch/ia64/vmx/vmx_fault.c | 1 + xen/arch/ia64/xen/faults.c | 1 + xen/arch/ia64/xen/vcpu.c | 7 +------ xen/include/asm-ia64/linux-xen/asm/ptrace.h | 9 +++++++++ 4 files changed, 12 insertions(+), 6 deletions(-) diff -r 13eb21985d3d -r 33d0cf9474f9 xen/arch/ia64/vmx/vmx_fault.c --- a/xen/arch/ia64/vmx/vmx_fault.c Wed Jan 30 10:50:24 2008 -0700 +++ b/xen/arch/ia64/vmx/vmx_fault.c Wed Jan 30 11:13:29 2008 -0700 @@ -181,6 +181,7 @@ vmx_ia64_handle_break (unsigned long ifa if (iim == 0) show_registers(regs); debugger_trap_fatal(0 /* don't care */, regs); + regs_increment_iip(regs); } else #endif { diff -r 13eb21985d3d -r 33d0cf9474f9 xen/arch/ia64/xen/faults.c --- a/xen/arch/ia64/xen/faults.c Wed Jan 30 10:50:24 2008 -0700 +++ b/xen/arch/ia64/xen/faults.c Wed Jan 30 11:13:29 2008 -0700 @@ -515,6 +515,7 @@ ia64_handle_break(unsigned long ifa, str if (iim == 0) show_registers(regs); debugger_trap_fatal(0 /* don't care */ , regs); + regs_increment_iip(regs); } #endif else if (iim == d->arch.breakimm && diff -r 13eb21985d3d -r 33d0cf9474f9 xen/arch/ia64/xen/vcpu.c --- a/xen/arch/ia64/xen/vcpu.c Wed Jan 30 10:50:24 2008 -0700 +++ b/xen/arch/ia64/xen/vcpu.c Wed Jan 30 11:13:29 2008 -0700 @@ -804,12 +804,7 @@ IA64FAULT vcpu_increment_iip(VCPU * vcpu IA64FAULT vcpu_increment_iip(VCPU * vcpu) { REGS *regs = vcpu_regs(vcpu); - struct ia64_psr *ipsr = (struct ia64_psr *)®s->cr_ipsr; - if (ipsr->ri == 2) { - ipsr->ri = 0; - regs->cr_iip += 16; - } else - ipsr->ri++; + regs_increment_iip(regs); return IA64_NO_FAULT; } diff -r 13eb21985d3d -r 33d0cf9474f9 xen/include/asm-ia64/linux-xen/asm/ptrace.h --- a/xen/include/asm-ia64/linux-xen/asm/ptrace.h Wed Jan 30 10:50:24 2008 -0700 +++ b/xen/include/asm-ia64/linux-xen/asm/ptrace.h Wed Jan 30 11:13:29 2008 -0700 @@ -281,6 +281,15 @@ struct switch_stack { # define guest_mode(regs) (ia64_psr(regs)->cpl != 0) # define guest_kernel_mode(regs) (ia64_psr(regs)->cpl == CONFIG_CPL0_EMUL) # define vmx_guest_kernel_mode(regs) (ia64_psr(regs)->cpl == 0) +# define regs_increment_iip(regs) \ +do { \ + struct ia64_psr *ipsr = ia64_psr(regs); \ + if (ipsr->ri == 2) { \ + ipsr->ri = 0; \ + regs->cr_iip += 16; \ + } else \ + ipsr->ri++; \ +} while (0) #else # define user_mode(regs) (((struct ia64_psr *) &(regs)->cr_ipsr)->cpl != 0) #endif _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |