[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] x86/svm: Provide EXITINFO decodes for IO intercetps
This removes raw number manipulation, and makes the logic easier to follow. No functional change. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> CC: Wei Liu <wl@xxxxxxx> --- xen/arch/x86/hvm/svm/svm.c | 11 +++++------ xen/arch/x86/include/asm/hvm/svm/vmcb.h | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index a43bcf2e92f0..bfe03316def6 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -2939,13 +2939,12 @@ void svm_vmexit_handler(void) break; case VMEXIT_IOIO: - if ( (vmcb->exitinfo1 & (1u<<2)) == 0 ) + if ( !vmcb->ei.io.str ) { - uint16_t port = (vmcb->exitinfo1 >> 16) & 0xFFFF; - int bytes = ((vmcb->exitinfo1 >> 4) & 0x07); - int dir = (vmcb->exitinfo1 & 1) ? IOREQ_READ : IOREQ_WRITE; - if ( handle_pio(port, bytes, dir) ) - __update_guest_eip(regs, vmcb->exitinfo2 - vmcb->rip); + if ( handle_pio(vmcb->ei.io.port, + vmcb->ei.io.bytes, + vmcb->ei.io.in ? IOREQ_READ : IOREQ_WRITE) ) + __update_guest_eip(regs, vmcb->ei.io.nrip - vmcb->rip); } else if ( !hvm_emulate_one_insn(x86_insn_is_portio, "port I/O") ) hvm_inject_hw_exception(TRAP_gp_fault, 0); diff --git a/xen/arch/x86/include/asm/hvm/svm/vmcb.h b/xen/arch/x86/include/asm/hvm/svm/vmcb.h index e87728fa81cd..2981a303746a 100644 --- a/xen/arch/x86/include/asm/hvm/svm/vmcb.h +++ b/xen/arch/x86/include/asm/hvm/svm/vmcb.h @@ -436,6 +436,20 @@ struct vmcb_struct { uint64_t exitinfo2; /* offset 0x80 */ }; union { + struct { + bool in:1; + bool :1; + bool str:1; + bool /* rep */:1; + uint16_t bytes:3; + uint16_t /* asz */:3; + uint16_t /* seg */:3; + uint16_t :3; + uint16_t port; + uint32_t :32; + + uint64_t nrip; + } io; struct { uint16_t sel; uint64_t :48; -- 2.30.2
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |