set_bit(reason_idx, nmi_reason(d));
- send_guest_trap(d, 0, TRAP_nmi);
+ pv_raise_interrupt(d->vcpu[0], TRAP_nmi);
}
static void pci_serr_error(const struct cpu_user_regs *regs)
return 0;
}
-int send_guest_trap(struct domain *d, uint16_t vcpuid, unsigned int trap_nr)
+int pv_raise_interrupt(struct vcpu *v, uint8_t trap_nr)
{
- struct vcpu *v;
struct softirq_trap *st = &per_cpu(softirq_trap, smp_processor_id());
- BUG_ON(d == NULL);
- BUG_ON(vcpuid >= d->max_vcpus);
- v = d->vcpu[vcpuid];
-
switch (trap_nr) {
case TRAP_nmi:
if ( cmpxchgptr(&st->vcpu, NULL, v) )
return -EBUSY;
if ( !test_and_set_bool(v->nmi_pending) ) {
- st->domain = d;
+ st->domain = v->domain;
st->processor = v->processor;
/* not safe to wake up a vcpu here */
* on the physical CPU that reported a machine check error. */
if ( !test_and_set_bool(v->mce_pending) ) {
- st->domain = d;
+ st->domain = v->domain;
st->processor = v->processor;
/* not safe to wake up a vcpu here */
#include <public/xen.h>
+/* Deliver interrupt to PV guest. Return 0 on success. */
+int pv_raise_interrupt(struct vcpu *v, uint8_t vector);
+
int pv_emulate_privileged_op(struct cpu_user_regs *regs);
void pv_emulate_gate_op(struct cpu_user_regs *regs);
bool pv_emulate_invalid_op(struct cpu_user_regs *regs);
#else /* !CONFIG_PV */
+#include <xen/errno.h>
+
+/* Deliver interrupt to PV guest. Return 0 on success. */
+static int pv_raise_interrupt(struct vcpu *v, uint8_t vector) { return -EOPNOTSUPP; }
+
static inline int pv_emulate_privileged_op(struct cpu_user_regs *regs) { return 0; }
static inline void pv_emulate_gate_op(struct cpu_user_regs *regs) {}
static inline bool pv_emulate_invalid_op(struct cpu_user_regs *regs) { return true; }
struct cpu_user_regs;
void async_exception_cleanup(struct vcpu *);
-
-/**
- * send_guest_trap
- *
- * delivers trap to guest analogous to send_guest_global_virq
- * return 0 on successful delivery
- */
-extern int send_guest_trap(struct domain *d, uint16_t vcpuid,
- unsigned int trap_nr);
uint32_t guest_io_read(unsigned int port, unsigned int bytes,
struct domain *);