[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XEN PATCH v4] x86/monitor: Add new monitor event to catch I/O instructions
On 21.03.2023 11:51, Andrew Cooper wrote: > On 20/03/2023 9:56 pm, Dmitry Isaykin wrote: >> diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c >> index 00b531f76c..0b7a302928 100644 >> --- a/xen/arch/x86/hvm/vmx/vmx.c >> +++ b/xen/arch/x86/hvm/vmx/vmx.c >> @@ -4560,8 +4560,24 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs) >> break; >> >> case EXIT_REASON_IO_INSTRUCTION: >> + { >> + unsigned int port, bytes; >> + bool in, str; >> + int rc; >> + >> __vmread(EXIT_QUALIFICATION, &exit_qualification); >> - if ( exit_qualification & 0x10 ) >> + >> + port = (exit_qualification >> 16) & 0xFFFF; >> + bytes = (exit_qualification & 0x07) + 1; >> + in = (exit_qualification & 0x08); >> + str = (exit_qualification & 0x10); >> + rc = hvm_monitor_io(port, bytes, in, str); >> + if ( rc < 0 ) >> + goto exit_and_crash; >> + if ( rc ) >> + break; >> + >> + if ( str ) >> { >> /* INS, OUTS */ >> if ( !hvm_emulate_one_insn(x86_insn_is_portio, "port I/O") ) >> @@ -4570,13 +4586,11 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs) >> else >> { >> /* IN, OUT */ >> - uint16_t port = (exit_qualification >> 16) & 0xFFFF; >> - int bytes = (exit_qualification & 0x07) + 1; >> - int dir = (exit_qualification & 0x08) ? IOREQ_READ : >> IOREQ_WRITE; >> - if ( handle_pio(port, bytes, dir) ) >> + if ( handle_pio(port, bytes, in ? IOREQ_READ : IOREQ_WRITE) ) >> update_guest_eip(); /* Safe: IN, OUT */ >> } >> break; >> + } > > Sorry for the delay. I've got the Intel side sorted now too with > https://xenbits.xen.org/gitweb/?p=xen.git;a=commitdiff;h=f71f8e95c34fedb0d9ae21a100bfa9f012543abf > > The rebase is: > > diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c > index 78ac9ece6ff2..7233e805a905 100644 > --- a/xen/arch/x86/hvm/vmx/vmx.c > +++ b/xen/arch/x86/hvm/vmx/vmx.c > @@ -4578,6 +4578,14 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs) > __vmread(EXIT_QUALIFICATION, &io_qual.raw); > bytes = io_qual.size + 1; > > + rc = hvm_monitor_io(io_qual.port, bytes, > + io_qual.in ? IOREQ_READ : IOREQ_WRITE, Here the conditional operator needs dropping; it just "io_qual.in" which wants passing. Jan > + io_qual.str); > + if ( rc < 0 ) > + goto exit_and_crash; > + if ( rc ) > + break; > + > if ( io_qual.str ) > { > if ( !hvm_emulate_one_insn(x86_insn_is_portio, "port I/O") ) > > > ~Andrew
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |