# 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
|