x86/vmx: Provide named fields for IO exit qualification

This removes most of the opencoded bit logic on the exit qualification.
Unfortunately, size is 1-based not 0-based, so need adjusting in a separate
variable.

No functional change.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Andrew Cooper committed 2023-03-21 10:41:16 +00:00
1 parent 0d2686f6b6
commit f71f8e95c3
1 file changed
+22 -8
+22 -8
View File
@@ -4560,23 +4560,37 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
break;
case EXIT_REASON_IO_INSTRUCTION:
__vmread(EXIT_QUALIFICATION, &exit_qualification);
if ( exit_qualification & 0x10 )
{
union {
unsigned long raw;
struct {
uint16_t size:3;
bool in:1;
bool str:1;
bool rep:1;
bool imm:1;
uint16_t :9;
uint16_t port;
};
} io_qual;
unsigned int bytes;
__vmread(EXIT_QUALIFICATION, &io_qual.raw);
bytes = io_qual.size + 1;
if ( io_qual.str )
{
/* INS, OUTS */
if ( !hvm_emulate_one_insn(x86_insn_is_portio, "port I/O") )
hvm_inject_hw_exception(TRAP_gp_fault, 0);
}
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(io_qual.port, bytes,
io_qual.in ? IOREQ_READ : IOREQ_WRITE) )
update_guest_eip(); /* Safe: IN, OUT */
}
break;
}
case EXIT_REASON_INVD:
case EXIT_REASON_WBINVD:
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.