summaryrefslogtreecommitdiff
path: root/sysutils/xenkernel42/patches/patch-XSA-166
diff options
context:
space:
mode:
Diffstat (limited to 'sysutils/xenkernel42/patches/patch-XSA-166')
-rw-r--r--sysutils/xenkernel42/patches/patch-XSA-16642
1 files changed, 42 insertions, 0 deletions
diff --git a/sysutils/xenkernel42/patches/patch-XSA-166 b/sysutils/xenkernel42/patches/patch-XSA-166
new file mode 100644
index 00000000000..020f9dc7ab0
--- /dev/null
+++ b/sysutils/xenkernel42/patches/patch-XSA-166
@@ -0,0 +1,42 @@
+$NetBSD: patch-XSA-166,v 1.1.2.2 2016/01/11 20:37:17 bsiegert Exp $
+
+Patch for XSA-166, based on
+http://xenbits.xenproject.org/xsa/xsa166-4.3.patch
+
+--- xen/arch/x86/hvm/hvm.c.orig
++++ xen/arch/x86/hvm/hvm.c
+@@ -342,6 +342,7 @@ void hvm_migrate_pirqs(struct vcpu *v)
+ void hvm_do_resume(struct vcpu *v)
+ {
+ ioreq_t *p;
++ unsigned int state;
+
+ pt_restore_timer(v);
+
+@@ -349,9 +350,10 @@ void hvm_do_resume(struct vcpu *v)
+
+ /* NB. Optimised for common case (p->state == STATE_IOREQ_NONE). */
+ p = get_ioreq(v);
+- while ( p->state != STATE_IOREQ_NONE )
++ while ( (state = p->state) != STATE_IOREQ_NONE )
+ {
+- switch ( p->state )
++ rmb();
++ switch ( state )
+ {
+ case STATE_IORESP_READY: /* IORESP_READY -> NONE */
+ hvm_io_assist();
+@@ -359,11 +361,10 @@ void hvm_do_resume(struct vcpu *v)
+ case STATE_IOREQ_READY: /* IOREQ_{READY,INPROCESS} -> IORESP_READY */
+ case STATE_IOREQ_INPROCESS:
+ wait_on_xen_event_channel(v->arch.hvm_vcpu.xen_port,
+- (p->state != STATE_IOREQ_READY) &&
+- (p->state != STATE_IOREQ_INPROCESS));
++ p->state != state);
+ break;
+ default:
+- gdprintk(XENLOG_ERR, "Weird HVM iorequest state %d.\n", p->state);
++ gdprintk(XENLOG_ERR, "Weird HVM iorequest state %u\n", state);
+ domain_crash(v->domain);
+ return; /* bail */
+ }