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] x86: Avoid use of domain_crash_synchronou

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] x86: Avoid use of domain_crash_synchronous() in C code.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 08 Apr 2008 02:01:40 -0700
Delivery-date: Tue, 08 Apr 2008 02:05:34 -0700
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 Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1207322752 -3600
# Node ID b7637c5269d133fc0828e76814e7f4333729caec
# Parent  271ec82db9218b42f5b04c94d41282e145343cc4
x86: Avoid use of domain_crash_synchronous() in C code.

We continue to use it in asm where it is a greater convenience and
where also it is much more clearly correct.

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/hvm/emulate.c          |   11 +++--
 xen/arch/x86/hvm/hvm.c              |    8 ++-
 xen/arch/x86/hvm/intercept.c        |   78 ++++++++++++++++++------------------
 xen/arch/x86/hvm/io.c               |   23 +++-------
 xen/arch/x86/hvm/vmx/realmode.c     |    2 
 xen/arch/x86/hvm/vmx/vmcs.c         |    4 -
 xen/arch/x86/hvm/vmx/x86_32/exits.S |    2 
 xen/arch/x86/hvm/vmx/x86_64/exits.S |    2 
 8 files changed, 62 insertions(+), 68 deletions(-)

diff -r 271ec82db921 -r b7637c5269d1 xen/arch/x86/hvm/emulate.c
--- a/xen/arch/x86/hvm/emulate.c        Fri Apr 04 16:25:03 2008 +0100
+++ b/xen/arch/x86/hvm/emulate.c        Fri Apr 04 16:25:52 2008 +0100
@@ -41,12 +41,15 @@ static int hvmemul_do_io(
         return X86EMUL_UNHANDLEABLE;
     }
 
+    if ( p->state != STATE_IOREQ_NONE )
+    {
+        gdprintk(XENLOG_WARNING, "WARNING: io already pending (%d)?\n",
+                 p->state);
+        return X86EMUL_UNHANDLEABLE;
+    }
+
     curr->arch.hvm_vcpu.io_state =
         (val == NULL) ? HVMIO_dispatched : HVMIO_awaiting_completion;
-
-    if ( p->state != STATE_IOREQ_NONE )
-        gdprintk(XENLOG_WARNING, "WARNING: io already pending (%d)?\n",
-                 p->state);
 
     p->dir = dir;
     p->data_is_ptr = value_is_ptr;
diff -r 271ec82db921 -r b7637c5269d1 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Fri Apr 04 16:25:03 2008 +0100
+++ b/xen/arch/x86/hvm/hvm.c    Fri Apr 04 16:25:52 2008 +0100
@@ -181,7 +181,8 @@ void hvm_do_resume(struct vcpu *v)
             break;
         default:
             gdprintk(XENLOG_ERR, "Weird HVM iorequest state %d.\n", p->state);
-            domain_crash_synchronous();
+            domain_crash(v->domain);
+            return; /* bail */
         }
     }
 }
@@ -742,9 +743,10 @@ void hvm_send_assist_req(struct vcpu *v)
     p = &get_ioreq(v)->vp_ioreq;
     if ( unlikely(p->state != STATE_IOREQ_NONE) )
     {
-        /* This indicates a bug in the device model.  Crash the domain. */
+        /* This indicates a bug in the device model. Crash the domain. */
         gdprintk(XENLOG_ERR, "Device model set bad IO state %d.\n", p->state);
-        domain_crash_synchronous();
+        domain_crash(v->domain);
+        return;
     }
 
     prepare_wait_on_xen_event_channel(v->arch.hvm_vcpu.xen_port);
diff -r 271ec82db921 -r b7637c5269d1 xen/arch/x86/hvm/intercept.c
--- a/xen/arch/x86/hvm/intercept.c      Fri Apr 04 16:25:03 2008 +0100
+++ b/xen/arch/x86/hvm/intercept.c      Fri Apr 04 16:25:52 2008 +0100
@@ -52,45 +52,45 @@ static inline void hvm_mmio_access(struc
 {
     unsigned long data;
 
-    switch ( p->type )
-    {
-    case IOREQ_TYPE_COPY:
-        if ( !p->data_is_ptr ) {
-            if ( p->dir == IOREQ_READ )
-                p->data = read_handler(v, p->addr, p->size);
-            else    /* p->dir == IOREQ_WRITE */
-                write_handler(v, p->addr, p->size, p->data);
-        } else {    /* p->data_is_ptr */
-            int i, sign = (p->df) ? -1 : 1;
-
-            if ( p->dir == IOREQ_READ ) {
-                for ( i = 0; i < p->count; i++ ) {
-                    data = read_handler(v,
-                        p->addr + (sign * i * p->size),
-                        p->size);
-                    (void)hvm_copy_to_guest_phys(
-                        p->data + (sign * i * p->size),
-                        &data,
-                        p->size);
-                }
-            } else {/* p->dir == IOREQ_WRITE */
-                for ( i = 0; i < p->count; i++ ) {
-                    (void)hvm_copy_from_guest_phys(
-                        &data,
-                        p->data + (sign * i * p->size),
-                        p->size);
-                    write_handler(v,
-                        p->addr + (sign * i * p->size),
-                        p->size, data);
-                }
-            }
-        }
-        break;
-
-    default:
-        printk("hvm_mmio_access: error ioreq type %x\n", p->type);
-        domain_crash_synchronous();
-        break;
+    if ( !p->data_is_ptr )
+    {
+        if ( p->dir == IOREQ_READ )
+            p->data = read_handler(v, p->addr, p->size);
+        else    /* p->dir == IOREQ_WRITE */
+            write_handler(v, p->addr, p->size, p->data);
+    }
+    else
+    {
+        int i, sign = (p->df) ? -1 : 1;
+
+        if ( p->dir == IOREQ_READ )
+        {
+            for ( i = 0; i < p->count; i++ )
+            {
+                data = read_handler(
+                    v,
+                    p->addr + (sign * i * p->size),
+                    p->size);
+                (void)hvm_copy_to_guest_phys(
+                    p->data + (sign * i * p->size),
+                    &data,
+                    p->size);
+            }
+        }
+        else
+        {
+            for ( i = 0; i < p->count; i++ )
+            {
+                (void)hvm_copy_from_guest_phys(
+                    &data,
+                    p->data + (sign * i * p->size),
+                    p->size);
+                write_handler(
+                    v,
+                    p->addr + (sign * i * p->size),
+                    p->size, data);
+            }
+        }
     }
 }
 
diff -r 271ec82db921 -r b7637c5269d1 xen/arch/x86/hvm/io.c
--- a/xen/arch/x86/hvm/io.c     Fri Apr 04 16:25:03 2008 +0100
+++ b/xen/arch/x86/hvm/io.c     Fri Apr 04 16:25:52 2008 +0100
@@ -148,20 +148,19 @@ void send_invalidate_req(void)
 void send_invalidate_req(void)
 {
     struct vcpu *v = current;
-    vcpu_iodata_t *vio;
+    vcpu_iodata_t *vio = get_ioreq(v);
     ioreq_t *p;
 
-    vio = get_ioreq(v);
-    if ( vio == NULL )
-    {
-        printk("bad shared page: %lx\n", (unsigned long) vio);
-        domain_crash_synchronous();
-    }
+    BUG_ON(vio == NULL);
 
     p = &vio->vp_ioreq;
     if ( p->state != STATE_IOREQ_NONE )
-        printk("WARNING: send invalidate req with something "
-               "already pending (%d)?\n", p->state);
+    {
+        gdprintk(XENLOG_ERR, "WARNING: send invalidate req with something "
+                 "already pending (%d)?\n", p->state);
+        domain_crash(v->domain);
+        return;
+    }
 
     p->type = IOREQ_TYPE_INVALIDATE;
     p->size = 4;
@@ -225,12 +224,6 @@ void hvm_io_assist(void)
     ioreq_t *p = &get_ioreq(curr)->vp_ioreq;
     enum hvm_io_state io_state;
 
-    if ( p->state != STATE_IORESP_READY )
-    {
-        gdprintk(XENLOG_ERR, "Unexpected HVM iorequest state %d.\n", p->state);
-        domain_crash_synchronous();
-    }
-
     rmb(); /* see IORESP_READY /then/ read contents of ioreq */
 
     p->state = STATE_IOREQ_NONE;
diff -r 271ec82db921 -r b7637c5269d1 xen/arch/x86/hvm/vmx/realmode.c
--- a/xen/arch/x86/hvm/vmx/realmode.c   Fri Apr 04 16:25:03 2008 +0100
+++ b/xen/arch/x86/hvm/vmx/realmode.c   Fri Apr 04 16:25:52 2008 +0100
@@ -172,7 +172,7 @@ static void realmode_emulate_one(struct 
              hvmemul_ctxt->insn_buf[0], hvmemul_ctxt->insn_buf[1],
              hvmemul_ctxt->insn_buf[2], hvmemul_ctxt->insn_buf[3],
              hvmemul_ctxt->insn_buf[4], hvmemul_ctxt->insn_buf[5]);
-    domain_crash_synchronous();
+    domain_crash(curr->domain);
 }
 
 void vmx_realmode(struct cpu_user_regs *regs)
diff -r 271ec82db921 -r b7637c5269d1 xen/arch/x86/hvm/vmx/vmcs.c
--- a/xen/arch/x86/hvm/vmx/vmcs.c       Fri Apr 04 16:25:03 2008 +0100
+++ b/xen/arch/x86/hvm/vmx/vmcs.c       Fri Apr 04 16:25:52 2008 +0100
@@ -729,14 +729,14 @@ void vmx_destroy_vmcs(struct vcpu *v)
     arch_vmx->vmcs = NULL;
 }
 
-void vm_launch_fail(unsigned long eflags)
+void vm_launch_fail(void)
 {
     unsigned long error = __vmread(VM_INSTRUCTION_ERROR);
     printk("<vm_launch_fail> error code %lx\n", error);
     domain_crash_synchronous();
 }
 
-void vm_resume_fail(unsigned long eflags)
+void vm_resume_fail(void)
 {
     unsigned long error = __vmread(VM_INSTRUCTION_ERROR);
     printk("<vm_resume_fail> error code %lx\n", error);
diff -r 271ec82db921 -r b7637c5269d1 xen/arch/x86/hvm/vmx/x86_32/exits.S
--- a/xen/arch/x86/hvm/vmx/x86_32/exits.S       Fri Apr 04 16:25:03 2008 +0100
+++ b/xen/arch/x86/hvm/vmx/x86_32/exits.S       Fri Apr 04 16:25:52 2008 +0100
@@ -129,7 +129,6 @@ ENTRY(vmx_asm_do_vmentry)
 /*vmx_resume:*/
         HVM_RESTORE_ALL_NOSEGREGS
         VMRESUME
-        pushf
         call vm_resume_fail
         ud2
 
@@ -137,7 +136,6 @@ vmx_launch:
         movb $1,VCPU_vmx_launched(%ebx)
         HVM_RESTORE_ALL_NOSEGREGS
         VMLAUNCH
-        pushf
         call vm_launch_fail
         ud2
 
diff -r 271ec82db921 -r b7637c5269d1 xen/arch/x86/hvm/vmx/x86_64/exits.S
--- a/xen/arch/x86/hvm/vmx/x86_64/exits.S       Fri Apr 04 16:25:03 2008 +0100
+++ b/xen/arch/x86/hvm/vmx/x86_64/exits.S       Fri Apr 04 16:25:52 2008 +0100
@@ -148,7 +148,6 @@ ENTRY(vmx_asm_do_vmentry)
 /*vmx_resume:*/
         HVM_RESTORE_ALL_NOSEGREGS
         VMRESUME
-        pushfq
         call vm_resume_fail
         ud2
 
@@ -156,7 +155,6 @@ vmx_launch:
         movb $1,VCPU_vmx_launched(%rbx)
         HVM_RESTORE_ALL_NOSEGREGS
         VMLAUNCH
-        pushfq
         call vm_launch_fail
         ud2
 

_______________________________________________
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] x86: Avoid use of domain_crash_synchronous() in C code., Xen patchbot-unstable <=