|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/vtx: Introduce a typed union for CR access exit information
>>> On 15.03.18 at 13:07, <andrew.cooper3@xxxxxxxxxx> wrote:
> --- a/xen/arch/x86/hvm/vmx/vvmx.c
> +++ b/xen/arch/x86/hvm/vmx/vvmx.c
> @@ -2448,27 +2448,24 @@ int nvmx_n2_vmexit_handler(struct cpu_user_regs *regs,
> break;
> case EXIT_REASON_CR_ACCESS:
> {
> - unsigned long exit_qualification;
> - int cr, write;
> + cr_access_qual_t qual;
> u32 mask = 0;
>
> - __vmread(EXIT_QUALIFICATION, &exit_qualification);
> - cr = VMX_CONTROL_REG_ACCESS_NUM(exit_qualification);
> - write = VMX_CONTROL_REG_ACCESS_TYPE(exit_qualification);
> + __vmread(EXIT_QUALIFICATION, &qual.raw);
> /* also according to guest exec_control */
> ctrl = __n2_exec_control(v);
>
> - if ( cr == 3 )
> + if ( qual.cr == 3 )
> {
> - mask = write? CPU_BASED_CR3_STORE_EXITING:
> - CPU_BASED_CR3_LOAD_EXITING;
> + mask = qual.access_type ? CPU_BASED_CR3_STORE_EXITING
> + : CPU_BASED_CR3_LOAD_EXITING;
I realize the old code has the same problem, but is this correct?
Only type 1 is a read from the CR, types 0, 2, and 3 are writes.
At least have an assertion here that types 2 and 3 can't occur?
> if ( ctrl & mask )
> nvcpu->nv_vmexit_pending = 1;
> }
> - else if ( cr == 8 )
> + else if ( qual.cr == 8 )
> {
> - mask = write? CPU_BASED_CR8_STORE_EXITING:
> - CPU_BASED_CR8_LOAD_EXITING;
> + mask = qual.access_type ? CPU_BASED_CR3_STORE_EXITING
> + : CPU_BASED_CR3_LOAD_EXITING;
Copy-and-paste mistake (ought to be CR8 here).
> --- a/xen/include/asm-x86/hvm/vmx/vmx.h
> +++ b/xen/include/asm-x86/hvm/vmx/vmx.h
> @@ -232,18 +232,25 @@ static inline void pi_clear_sn(struct pi_desc *pi_desc)
> /*
> * Exit Qualifications for MOV for Control Register Access
> */
> - /* 3:0 - control register number (CRn) */
> -#define VMX_CONTROL_REG_ACCESS_NUM(eq) ((eq) & 0xf)
> - /* 5:4 - access type (CR write, CR read, CLTS, LMSW) */
> -#define VMX_CONTROL_REG_ACCESS_TYPE(eq) (((eq) >> 4) & 0x3)
> -# define VMX_CONTROL_REG_ACCESS_TYPE_MOV_TO_CR 0
> -# define VMX_CONTROL_REG_ACCESS_TYPE_MOV_FROM_CR 1
> -# define VMX_CONTROL_REG_ACCESS_TYPE_CLTS 2
> -# define VMX_CONTROL_REG_ACCESS_TYPE_LMSW 3
> - /* 11:8 - general purpose register operand */
> -#define VMX_CONTROL_REG_ACCESS_GPR(eq) (((eq) >> 8) & 0xf)
> - /* 31:16 - LMSW source data */
> -#define VMX_CONTROL_REG_ACCESS_DATA(eq) ((uint32_t)(eq) >> 16)
> +enum {
> + VMX_CR_ACCESS_TYPE_MOV_TO_CR,
> + VMX_CR_ACCESS_TYPE_MOV_FROM_CR,
> + VMX_CR_ACCESS_TYPE_CLTS,
> + VMX_CR_ACCESS_TYPE_LMSW,
The trailing comma is sort of pointless here with the field being
just 2 bits wide.
> +};
> +typedef union cr_access_qual {
> + unsigned long raw;
> + struct {
> + uint16_t cr:4,
> + access_type:2, /* VMX_CR_ACCESS_TYPE_* */
> + lmsw_op_type:1, /* 0 => reg, 1 => mem */
> + :1,
> + gpr:4,
> + :4;
> + uint16_t lmsw_data;
> + uint32_t :32;
Strictly speaking this doesn't belong here, as it doesn't exist for
32-bit VMX implementations.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |