[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 *)&regs->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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.