|
[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 |