[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/6] x86/emulate: Provide further information about software events
This is needed by subsequent patches to support correctly injecting sofware events for HVM Guests. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> --- xen/arch/x86/hvm/emulate.c | 1 + xen/arch/x86/x86_emulate/x86_emulate.c | 8 +++++++- xen/arch/x86/x86_emulate/x86_emulate.h | 9 +++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index 6ab06e0..5d5d765 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -1119,6 +1119,7 @@ static int hvmemul_inject_hw_exception( } static int hvmemul_inject_sw_interrupt( + enum x86_swint_type type, uint8_t vector, uint8_t insn_len, struct x86_emulate_ctxt *ctxt) diff --git a/xen/arch/x86/x86_emulate/x86_emulate.c b/xen/arch/x86/x86_emulate/x86_emulate.c index 1e79d0f..e06aa60 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -1333,6 +1333,7 @@ x86_emulate( bool_t lock_prefix = 0; int override_seg = -1, rc = X86EMUL_OKAY; struct operand src, dst; + enum x86_swint_type swint_type; DECLARE_ALIGNED(mmval_t, mmval); /* * Data operand effective address (usually computed from ModRM). @@ -2629,14 +2630,17 @@ x86_emulate( case 0xcc: /* int3 */ src.val = EXC_BP; + swint_type = x86_swint_int3; goto swint; case 0xcd: /* int imm8 */ src.val = insn_fetch_type(uint8_t); + swint_type = x86_swint_int; swint: fail_if(!in_realmode(ctxt, ops)); /* XSA-106 */ fail_if(ops->inject_sw_interrupt == NULL); - rc = ops->inject_sw_interrupt(src.val, _regs.eip - ctxt->regs->eip, + rc = ops->inject_sw_interrupt(swint_type, src.val, + _regs.eip - ctxt->regs->eip, ctxt) ? : X86EMUL_EXCEPTION; goto done; @@ -2645,6 +2649,7 @@ x86_emulate( if ( !(_regs.eflags & EFLG_OF) ) break; src.val = EXC_OF; + swint_type = x86_swint_into; goto swint; case 0xcf: /* iret */ { @@ -3312,6 +3317,7 @@ x86_emulate( case 0xf1: /* int1 (icebp) */ src.val = EXC_DB; + swint_type = x86_swint_icebp; goto swint; case 0xf4: /* hlt */ diff --git a/xen/arch/x86/x86_emulate/x86_emulate.h b/xen/arch/x86/x86_emulate/x86_emulate.h index 107addf..b336e17 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.h +++ b/xen/arch/x86/x86_emulate/x86_emulate.h @@ -51,6 +51,14 @@ enum x86_segment { #define is_x86_user_segment(seg) ((unsigned)(seg) <= x86_seg_gs) +/* Classification of the types of software generated interrupts/exceptions. */ +enum x86_swint_type { + x86_swint_icebp, /* 0xf1 */ + x86_swint_int3, /* 0xcc */ + x86_swint_into, /* 0xce */ + x86_swint_int, /* 0xcd $n */ +}; + /* * Attribute for segment selector. This is a copy of bit 40:47 & 52:55 of the * segment descriptor. It happens to match the format of an AMD SVM VMCB. @@ -337,6 +345,7 @@ struct x86_emulate_ops /* inject_sw_interrupt */ int (*inject_sw_interrupt)( + enum x86_swint_type type, uint8_t vector, uint8_t insn_len, struct x86_emulate_ctxt *ctxt); -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |