return rc;
}
+static int hvmop_set_evtchn_upcall_vector(
+ XEN_GUEST_HANDLE_PARAM(xen_hvm_evtchn_upcall_vector_t) uop)
+{
+ xen_hvm_evtchn_upcall_vector_t op;
+ struct domain *d = current->domain;
+ struct vcpu *v;
+
+ if ( copy_from_guest(&op, uop, 1) )
+ return -EFAULT;
+
+ if ( !is_hvm_domain(d) )
+ return -EINVAL;
+
+ if ( op.vector < 0x10 )
+ return -EINVAL;
+
+ if ( op.vcpu >= d->max_vcpus || (v = d->vcpu[op.vcpu]) == NULL )
+ return -ENOENT;
+
+ printk(XENLOG_G_INFO "%pv: upcall vector %02x\n", v, op.vector);
+
+ v->arch.hvm_vcpu.evtchn_upcall_vector = op.vector;
+ return 0;
+}
+
/*
* Note that this value is effectively part of the ABI, even if we don't need
* to make it a formal part of it: A guest suspended for migration in the
guest_handle_cast(arg, xen_hvm_destroy_ioreq_server_t));
break;
+ case HVMOP_set_evtchn_upcall_vector:
+ rc = hvmop_set_evtchn_upcall_vector(
+ guest_handle_cast(arg, xen_hvm_evtchn_upcall_vector_t));
+ break;
+
case HVMOP_set_param:
case HVMOP_get_param:
{
return;
}
- if ( is_hvm_pv_evtchn_vcpu(v) )
+ if ( v->arch.hvm_vcpu.evtchn_upcall_vector != 0 )
+ {
+ uint8_t vector = v->arch.hvm_vcpu.evtchn_upcall_vector;
+
+ vlapic_set_irq(vcpu_vlapic(v), vector, 0);
+ }
+ else if ( is_hvm_pv_evtchn_vcpu(v) )
vcpu_kick(v);
else if ( v->vcpu_id == 0 )
hvm_set_callback_irq_level(v);
/* In mode delay_for_missed_ticks, VCPUs have differing guest times. */
int64_t stime_offset;
+ u8 evtchn_upcall_vector;
+
/* Which cache mode is this VCPU in (CR0:CD/NW)? */
u8 cache_mode;
#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */
+#if defined(__i386__) || defined(__x86_64__)
+
+/*
+ * HVMOP_set_evtchn_upcall_vector: Set a <vector> that should be used for event
+ * channel upcalls on the specified <vcpu>. If set,
+ * this vector will be used in preference to the
+ * domain global callback via (see
+ * HVM_PARAM_CALLBACK_IRQ).
+ */
+#define HVMOP_set_evtchn_upcall_vector 23
+struct xen_hvm_evtchn_upcall_vector {
+ uint32_t vcpu;
+ uint8_t vector;
+};
+typedef struct xen_hvm_evtchn_upcall_vector xen_hvm_evtchn_upcall_vector_t;
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_evtchn_upcall_vector_t);
+
+#endif /* defined(__i386__) || defined(__x86_64__) */
+
#endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */
/*