aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/libxc/xc_misc.c7
-rw-r--r--tools/libxc/xenctrl.h3
-rw-r--r--tools/tests/xen-access/xen-access.c4
-rw-r--r--xen/arch/x86/hvm/hvm.c4
-rw-r--r--xen/include/asm-x86/hvm/hvm.h14
-rw-r--r--xen/include/public/hvm/hvm_op.h17
6 files changed, 34 insertions, 15 deletions
diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c
index a029d791ba..405e619d90 100644
--- a/tools/libxc/xc_misc.c
+++ b/tools/libxc/xc_misc.c
@@ -602,7 +602,8 @@ int xc_hvm_get_mem_access(
}
int xc_hvm_inject_trap(
- xc_interface *xch, domid_t dom, int vcpu, uint32_t trap, uint32_t error_code,
+ xc_interface *xch, domid_t dom, int vcpu, uint32_t vector,
+ uint32_t type, uint32_t error_code, uint32_t inslen,
uint64_t cr2)
{
DECLARE_HYPERCALL;
@@ -618,8 +619,10 @@ int xc_hvm_inject_trap(
arg->domid = dom;
arg->vcpuid = vcpu;
- arg->trap = trap;
+ arg->vector = vector;
+ arg->type = type;
arg->error_code = error_code;
+ arg->inslen = inslen;
arg->cr2 = cr2;
hypercall.op = __HYPERVISOR_hvm_op;
diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h
index 3bbc8279ce..fe1431ac1b 100644
--- a/tools/libxc/xenctrl.h
+++ b/tools/libxc/xenctrl.h
@@ -1578,7 +1578,8 @@ int xc_hvm_get_mem_access(
* resumes.
*/
int xc_hvm_inject_trap(
- xc_interface *xch, domid_t dom, int vcpu, uint32_t trap, uint32_t error_code,
+ xc_interface *xch, domid_t dom, int vcpu, uint32_t vector,
+ uint32_t type, uint32_t error_code, uint32_t inslen,
uint64_t cr2);
/*
diff --git a/tools/tests/xen-access/xen-access.c b/tools/tests/xen-access/xen-access.c
index 906f46f25e..e2c8d5e5a4 100644
--- a/tools/tests/xen-access/xen-access.c
+++ b/tools/tests/xen-access/xen-access.c
@@ -662,7 +662,9 @@ int main(int argc, char *argv[])
req.vcpu_id);
/* Reinject */
- rc = xc_hvm_inject_trap(xch, domain_id, req.vcpu_id, 3, -1, 0);
+ rc = xc_hvm_inject_trap(
+ xch, domain_id, req.vcpu_id, 3,
+ HVMOP_TRAP_hw_exc, -1, 0, 0);
if (rc < 0)
{
ERROR("Error %d injecting int3\n", rc);
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index f3c87bc9c3..269deb2e8f 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -4289,8 +4289,10 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg)
rc = -EBUSY;
else
{
- v->arch.hvm_vcpu.inject_trap.vector = tr.trap;
+ v->arch.hvm_vcpu.inject_trap.vector = tr.vector;
+ v->arch.hvm_vcpu.inject_trap.type = tr.type;
v->arch.hvm_vcpu.inject_trap.error_code = tr.error_code;
+ v->arch.hvm_vcpu.inject_trap.inslen = tr.inslen;
v->arch.hvm_vcpu.inject_trap.cr2 = tr.cr2;
}
diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h
index a3d8bf14a0..3ac0bb44c0 100644
--- a/xen/include/asm-x86/hvm/hvm.h
+++ b/xen/include/asm-x86/hvm/hvm.h
@@ -75,8 +75,8 @@ struct hvm_trap {
int vector;
unsigned int type; /* X86_EVENTTYPE_* */
int error_code; /* HVM_DELIVER_NO_ERROR_CODE if n/a */
- unsigned long cr2; /* Only for TRAP_page_fault h/w exception */
int inslen; /* Instruction length */
+ unsigned long cr2; /* Only for TRAP_page_fault h/w exception */
};
/*
@@ -372,12 +372,12 @@ static inline int hvm_do_pmu_interrupt(struct cpu_user_regs *regs)
* Intel VMX: {VM_ENTRY,VM_EXIT,IDT_VECTORING}_INTR_INFO[10:8]
* AMD SVM: eventinj[10:8] and exitintinfo[10:8] (types 0-4 only)
*/
-#define X86_EVENTTYPE_EXT_INTR 0 /* external interrupt */
-#define X86_EVENTTYPE_NMI 2 /* NMI */
-#define X86_EVENTTYPE_HW_EXCEPTION 3 /* hardware exception */
-#define X86_EVENTTYPE_SW_INTERRUPT 4 /* software interrupt */
-#define X86_EVENTTYPE_PRI_SW_EXCEPTION 5 /* privileged software exception */
-#define X86_EVENTTYPE_SW_EXCEPTION 6 /* software exception */
+#define X86_EVENTTYPE_EXT_INTR 0 /* external interrupt */
+#define X86_EVENTTYPE_NMI 2 /* NMI */
+#define X86_EVENTTYPE_HW_EXCEPTION 3 /* hardware exception */
+#define X86_EVENTTYPE_SW_INTERRUPT 4 /* software interrupt (CD nn) */
+#define X86_EVENTTYPE_PRI_SW_EXCEPTION 5 /* ICEBP (F1) */
+#define X86_EVENTTYPE_SW_EXCEPTION 6 /* INT3 (CC), INTO (CE) */
int hvm_event_needs_reinjection(uint8_t type, uint8_t vector);
diff --git a/xen/include/public/hvm/hvm_op.h b/xen/include/public/hvm/hvm_op.h
index 6a78f757d5..dbaf5ce6ac 100644
--- a/xen/include/public/hvm/hvm_op.h
+++ b/xen/include/public/hvm/hvm_op.h
@@ -217,10 +217,21 @@ struct xen_hvm_inject_trap {
domid_t domid;
/* VCPU */
uint32_t vcpuid;
- /* Trap number */
- uint32_t trap;
- /* Error code, or -1 to skip */
+ /* Vector number */
+ uint32_t vector;
+ /* Trap type (HVMOP_TRAP_*) */
+ uint32_t type;
+/* NB. This enumeration precisely matches hvm.h:X86_EVENTTYPE_* */
+# define HVMOP_TRAP_ext_int 0 /* external interrupt */
+# define HVMOP_TRAP_nmi 2 /* nmi */
+# define HVMOP_TRAP_hw_exc 3 /* hardware exception */
+# define HVMOP_TRAP_sw_int 4 /* software interrupt (CD nn) */
+# define HVMOP_TRAP_pri_sw_exc 5 /* ICEBP (F1) */
+# define HVMOP_TRAP_sw_exc 6 /* INT3 (CC), INTO (CE) */
+ /* Error code, or ~0u to skip */
uint32_t error_code;
+ /* Intruction length */
+ uint32_t inslen;
/* CR2 for page faults */
uint64_aligned_t cr2;
};