WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] [IA64] vti fault handler clean up: fix vm

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [IA64] vti fault handler clean up: fix vmx_break_fault and vmx_ia64_handle_break
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 23 Jan 2008 01:10:45 -0800
Delivery-date: Wed, 23 Jan 2008 01:13:40 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1197665046 25200
# Node ID 2d01937021703d2ec5cc8c37faf73fd75b028d0b
# Parent  5ab3288e5b0fab956d0346b16d4f56e41a457aef
[IA64] vti fault handler clean up: fix vmx_break_fault and vmx_ia64_handle_break

vmx_break_fault and vmx_ia64_handle_break() should check cr.ipsr.vm bit
so that they can handle break fault in xen.

Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
---
 xen/arch/ia64/vmx/vmx_fault.c |   22 ++++++++++++----------
 xen/arch/ia64/vmx/vmx_ivt.S   |   20 +++++++-------------
 xen/arch/ia64/xen/xenmisc.c   |   11 -----------
 xen/include/asm-ia64/domain.h |    5 +++++
 xen/include/asm-ia64/vmx.h    |    1 -
 5 files changed, 24 insertions(+), 35 deletions(-)

diff -r 5ab3288e5b0f -r 2d0193702170 xen/arch/ia64/vmx/vmx_fault.c
--- a/xen/arch/ia64/vmx/vmx_fault.c     Fri Dec 14 13:40:29 2007 -0700
+++ b/xen/arch/ia64/vmx/vmx_fault.c     Fri Dec 14 13:44:06 2007 -0700
@@ -56,7 +56,6 @@
 #define INITIAL_PSR_VALUE_AT_INTERRUPTION 0x0000001808028034
 
 
-extern void die_if_kernel(char *str, struct pt_regs *regs, long err);
 extern void rnat_consumption (VCPU *vcpu);
 extern void alt_itlb (VCPU *vcpu, u64 vadr);
 extern void itlb_fault (VCPU *vcpu, u64 vadr);
@@ -177,7 +176,7 @@ vmx_ia64_handle_break (unsigned long ifa
 
     perfc_incr(vmx_ia64_handle_break);
 #ifdef CRASH_DEBUG
-    if ((iim == 0 || iim == CDB_BREAK_NUM) && !guest_mode(regs) &&
+    if ((iim == 0 || iim == CDB_BREAK_NUM) && !vmx_user_mode(regs) &&
         IS_VMM_ADDRESS(regs->cr_iip)) {
         if (iim == 0)
             show_registers(regs);
@@ -185,17 +184,20 @@ vmx_ia64_handle_break (unsigned long ifa
     } else
 #endif
     {
-        if (iim == 0) 
-            vmx_die_if_kernel("Break 0 in Hypervisor.", regs, iim);
+        if (!vmx_user_mode(regs)) {
+            show_registers(regs);
+            gdprintk(XENLOG_DEBUG, "%s:%d imm %lx\n", __func__, __LINE__, iim);
+            ia64_fault(11 /* break fault */, isr, ifa, iim,
+                       0 /* cr.itir */, 0, 0, 0, (unsigned long)regs);
+        }
 
         if (ia64_psr(regs)->cpl == 0) {
             /* Allow hypercalls only when cpl = 0.  */
-            if (iim == d->arch.breakimm) {
-                ia64_hypercall(regs);
-                vcpu_increment_iip(v);
-                return IA64_NO_FAULT;
-            }
-            else if (iim == DOMN_PAL_REQUEST) {
+
+            /* normal hypercalls are handled by vmx_break_fault */
+            BUG_ON(iim == d->arch.breakimm);
+
+            if (iim == DOMN_PAL_REQUEST) {
                 pal_emul(v);
                 vcpu_increment_iip(v);
                 return IA64_NO_FAULT;
diff -r 5ab3288e5b0f -r 2d0193702170 xen/arch/ia64/vmx/vmx_ivt.S
--- a/xen/arch/ia64/vmx/vmx_ivt.S       Fri Dec 14 13:40:29 2007 -0700
+++ b/xen/arch/ia64/vmx/vmx_ivt.S       Fri Dec 14 13:44:06 2007 -0700
@@ -461,14 +461,10 @@ ENTRY(vmx_break_fault)
     mov r31=pr
     mov r19=11
     mov r17=cr.iim
-    ;;
-#ifdef VTI_DEBUG
-    // break 0 is already handled in vmx_ia64_handle_break.
-    cmp.eq p6,p7=r17,r0
-    (p6) br.sptk vmx_fault_11
-    ;;
-#endif
     mov r29=cr.ipsr
+    ;;
+    tbit.z p6,p0=r29,IA64_PSR_VM_BIT
+(p6)br.sptk.many vmx_dispatch_break_fault /* make sure before access [r21] */
     adds r22=IA64_VCPU_BREAKIMM_OFFSET, r21
     ;;
     ld4 r22=[r22]
@@ -1426,7 +1422,7 @@ END(vmx_dispatch_tlb_miss)
 END(vmx_dispatch_tlb_miss)
 
 ENTRY(vmx_dispatch_break_fault)
-    VMX_SAVE_MIN_WITH_COVER
+    VMX_SAVE_MIN_WITH_COVER_NO_PANIC
     ;;
     alloc r14=ar.pfs,0,0,4,0 // now it's safe (must be first in insn group!)
     mov out0=cr.ifa
@@ -1439,12 +1435,12 @@ ENTRY(vmx_dispatch_break_fault)
     srlz.i                  // guarantee that interruption collection is on
     ;;
     (p15)ssm psr.i               // restore psr.i
-    movl r14=ia64_leave_hypervisor
-    ;;
+(pUStk)movl r14=ia64_leave_hypervisor
+    ;;
+(pKStk)movl r14=ia64_leave_nested
     VMX_SAVE_REST
     mov rp=r14
     ;;
-    P6_BR_CALL_PANIC(.Lvmx_dispatch_break_fault_string)
     adds out1=16,sp
     br.call.sptk.many b6=vmx_ia64_handle_break
     ;;
@@ -1478,5 +1474,3 @@ END(vmx_dispatch_interrupt)
     .asciz "vmx_dispatch_vexirq\n"
 .Lvmx_dispatch_tlb_miss_string:
     .asciz "vmx_dispatch_tlb_miss\n"
-.Lvmx_dispatch_break_fault_string:
-    .asciz "vmx_dispatch_break_fault\n"
diff -r 5ab3288e5b0f -r 2d0193702170 xen/arch/ia64/xen/xenmisc.c
--- a/xen/arch/ia64/xen/xenmisc.c       Fri Dec 14 13:40:29 2007 -0700
+++ b/xen/arch/ia64/xen/xenmisc.c       Fri Dec 14 13:44:06 2007 -0700
@@ -69,17 +69,6 @@ void die_if_kernel(char *str, struct pt_
        domain_crash_synchronous();
 }
 
-void vmx_die_if_kernel(char *str, struct pt_regs *regs, long err)
-{
-       if (vmx_user_mode(regs))
-               return;
-
-       printk("%s: %s %ld\n", __func__, str, err);
-       debugtrace_dump();
-       show_registers(regs);
-       domain_crash_synchronous();
-}
-
 long
 ia64_peek (struct task_struct *child, struct switch_stack *child_stack,
           unsigned long user_rbs_end, unsigned long addr, long *val)
diff -r 5ab3288e5b0f -r 2d0193702170 xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h     Fri Dec 14 13:40:29 2007 -0700
+++ b/xen/include/asm-ia64/domain.h     Fri Dec 14 13:44:06 2007 -0700
@@ -306,6 +306,11 @@ do_perfmon_op(unsigned long cmd,
 do_perfmon_op(unsigned long cmd,
               XEN_GUEST_HANDLE(void) arg1, unsigned long arg2);
 
+void
+ia64_fault(unsigned long vector, unsigned long isr, unsigned long ifa,
+           unsigned long iim, unsigned long itir, unsigned long arg5,
+           unsigned long arg6, unsigned long arg7, unsigned long stack);
+
 #endif /* __ASM_DOMAIN_H__ */
 
 /*
diff -r 5ab3288e5b0f -r 2d0193702170 xen/include/asm-ia64/vmx.h
--- a/xen/include/asm-ia64/vmx.h        Fri Dec 14 13:40:29 2007 -0700
+++ b/xen/include/asm-ia64/vmx.h        Fri Dec 14 13:44:06 2007 -0700
@@ -52,7 +52,6 @@ extern void rsv_reg_field (struct vcpu *
 extern void rsv_reg_field (struct vcpu *vcpu);
 extern void vmx_relinquish_guest_resources(struct domain *d);
 extern void vmx_relinquish_vcpu_resources(struct vcpu *v);
-extern void vmx_die_if_kernel(char *str, struct pt_regs *regs, long err);
 extern void vmx_send_assist_req(struct vcpu *v);
 extern void deliver_pal_init(struct vcpu *vcpu);
 extern void vmx_pend_pal_init(struct domain *d);

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [IA64] vti fault handler clean up: fix vmx_break_fault and vmx_ia64_handle_break, Xen patchbot-unstable <=