|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] x86/svm: Provide EXITINFO decodes for IO intercetps
commit df9369154aa010b2322e3f3e0727a242784cfd4f
Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Wed Mar 15 19:52:25 2023 +0000
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Fri Mar 17 10:44:16 2023 +0000
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>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
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 a43bcf2e92..bfe03316de 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 e87728fa81..b809e85507 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;
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |