[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v6 3/5] x86/cpuid: update signature of hvm_cr4_guest_valid_bits()



> From: Sergey Dyasli [mailto:sergey.dyasli@xxxxxxxxxx]
> Sent: Thursday, March 22, 2018 7:33 PM
> 
> With the new cpuid infrastructure there is a domain-wide struct cpuid
> policy and there is no need to pass a separate struct vcpu * into
> hvm_cr4_guest_valid_bits() anymore. Make the function accept struct
> domain * instead and update callers.
> 
> Signed-off-by: Sergey Dyasli <sergey.dyasli@xxxxxxxxxx>
> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>

Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx>

> ---
> v5 --> v6:
> - Added brackets to expression in vmx.c and replaced 0 with false
> - Added Reviewed-by
> ---
>  xen/arch/x86/hvm/domain.c       | 3 ++-
>  xen/arch/x86/hvm/hvm.c          | 7 +++----
>  xen/arch/x86/hvm/svm/svmdebug.c | 4 ++--
>  xen/arch/x86/hvm/vmx/vmx.c      | 4 ++--
>  xen/arch/x86/hvm/vmx/vvmx.c     | 2 +-
>  xen/include/asm-x86/hvm/hvm.h   | 2 +-
>  6 files changed, 11 insertions(+), 11 deletions(-)
> 
> diff --git a/xen/arch/x86/hvm/domain.c b/xen/arch/x86/hvm/domain.c
> index 60474649de..ce15ce0470 100644
> --- a/xen/arch/x86/hvm/domain.c
> +++ b/xen/arch/x86/hvm/domain.c
> @@ -111,6 +111,7 @@ static int check_segment(struct segment_register
> *reg, enum x86_segment seg)
>  /* Called by VCPUOP_initialise for HVM guests. */
>  int arch_set_info_hvm_guest(struct vcpu *v, const vcpu_hvm_context_t
> *ctx)
>  {
> +    const struct domain *d = v->domain;
>      struct cpu_user_regs *uregs = &v->arch.user_regs;
>      struct segment_register cs, ds, ss, es, tr;
>      const char *errstr;
> @@ -272,7 +273,7 @@ int arch_set_info_hvm_guest(struct vcpu *v, const
> vcpu_hvm_context_t *ctx)
>      if ( v->arch.hvm_vcpu.guest_efer & EFER_LME )
>          v->arch.hvm_vcpu.guest_efer |= EFER_LMA;
> 
> -    if ( v->arch.hvm_vcpu.guest_cr[4] & ~hvm_cr4_guest_valid_bits(v, 0) )
> +    if ( v->arch.hvm_vcpu.guest_cr[4] & ~hvm_cr4_guest_valid_bits(d,
> false) )
>      {
>          gprintk(XENLOG_ERR, "Bad CR4 value: %#016lx\n",
>                  v->arch.hvm_vcpu.guest_cr[4]);
> diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
> index 5759c73dd4..fe253034f2 100644
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -931,9 +931,8 @@ const char *hvm_efer_valid(const struct vcpu *v,
> uint64_t value,
>          X86_CR0_CD | X86_CR0_PG)))
> 
>  /* These bits in CR4 can be set by the guest. */
> -unsigned long hvm_cr4_guest_valid_bits(const struct vcpu *v, bool restore)
> +unsigned long hvm_cr4_guest_valid_bits(const struct domain *d, bool
> restore)
>  {
> -    const struct domain *d = v->domain;
>      const struct cpuid_policy *p;
>      bool mce, vmxe;
> 
> @@ -1000,7 +999,7 @@ static int hvm_load_cpu_ctxt(struct domain *d,
> hvm_domain_context_t *h)
>          return -EINVAL;
>      }
> 
> -    if ( ctxt.cr4 & ~hvm_cr4_guest_valid_bits(v, 1) )
> +    if ( ctxt.cr4 & ~hvm_cr4_guest_valid_bits(d, true) )
>      {
>          printk(XENLOG_G_ERR "HVM%d restore: bad CR4 %#" PRIx64 "\n",
>                 d->domain_id, ctxt.cr4);
> @@ -2350,7 +2349,7 @@ int hvm_set_cr4(unsigned long value, bool_t
> may_defer)
>      struct vcpu *v = current;
>      unsigned long old_cr;
> 
> -    if ( value & ~hvm_cr4_guest_valid_bits(v, 0) )
> +    if ( value & ~hvm_cr4_guest_valid_bits(v->domain, false) )
>      {
>          HVM_DBG_LOG(DBG_LEVEL_1,
>                      "Guest attempts to set reserved bit in CR4: %lx",
> diff --git a/xen/arch/x86/hvm/svm/svmdebug.c
> b/xen/arch/x86/hvm/svm/svmdebug.c
> index 091c58fa1b..6c215d19fe 100644
> --- a/xen/arch/x86/hvm/svm/svmdebug.c
> +++ b/xen/arch/x86/hvm/svm/svmdebug.c
> @@ -121,9 +121,9 @@ bool svm_vmcb_isvalid(const char *from, const
> struct vmcb_struct *vmcb,
>             (cr3 >> v->domain->arch.cpuid->extd.maxphysaddr))) )
>          PRINTF("CR3: MBZ bits are set (%#"PRIx64")\n", cr3);
> 
> -    if ( cr4 & ~hvm_cr4_guest_valid_bits(v, false) )
> +    if ( cr4 & ~hvm_cr4_guest_valid_bits(v->domain, false) )
>          PRINTF("CR4: invalid bits are set (%#"PRIx64", valid: %#"PRIx64")\n",
> -               cr4, hvm_cr4_guest_valid_bits(v, false));
> +               cr4, hvm_cr4_guest_valid_bits(v->domain, false));
> 
>      if ( vmcb_get_dr6(vmcb) >> 32 )
>          PRINTF("DR6: bits [63:32] are not zero (%#"PRIx64")\n",
> diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
> index c5cc96339e..847c314a08 100644
> --- a/xen/arch/x86/hvm/vmx/vmx.c
> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> @@ -1598,8 +1598,8 @@ static void vmx_update_guest_cr(struct vcpu *v,
> unsigned int cr,
>               * Update CR4 host mask to only trap when the guest tries to set
>               * bits that are controlled by the hypervisor.
>               */
> -            v->arch.hvm_vmx.cr4_host_mask = HVM_CR4_HOST_MASK |
> X86_CR4_PKE |
> -                                            ~hvm_cr4_guest_valid_bits(v, 0);
> +            v->arch.hvm_vmx.cr4_host_mask = (HVM_CR4_HOST_MASK |
> X86_CR4_PKE |
> +                                   ~hvm_cr4_guest_valid_bits(v->domain, 
> false));
>              v->arch.hvm_vmx.cr4_host_mask |= v-
> >arch.hvm_vmx.vmx_realmode ?
>                                               X86_CR4_VME : 0;
>              v->arch.hvm_vmx.cr4_host_mask |= !hvm_paging_enabled(v) ?
> diff --git a/xen/arch/x86/hvm/vmx/vvmx.c
> b/xen/arch/x86/hvm/vmx/vvmx.c
> index dcd3b28f86..43f7297c04 100644
> --- a/xen/arch/x86/hvm/vmx/vvmx.c
> +++ b/xen/arch/x86/hvm/vmx/vvmx.c
> @@ -2140,7 +2140,7 @@ int nvmx_msr_read_intercept(unsigned int msr,
> u64 *msr_content)
>          data = X86_CR4_VMXE;
>          break;
>      case MSR_IA32_VMX_CR4_FIXED1:
> -        data = hvm_cr4_guest_valid_bits(v, 0);
> +        data = hvm_cr4_guest_valid_bits(d, false);
>          break;
>      case MSR_IA32_VMX_MISC:
>          /* Do not support CR3-target feature now */
> diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-
> x86/hvm/hvm.h
> index 2376ed6912..bfd42b065d 100644
> --- a/xen/include/asm-x86/hvm/hvm.h
> +++ b/xen/include/asm-x86/hvm/hvm.h
> @@ -621,7 +621,7 @@ static inline bool altp2m_vcpu_emulate_ve(struct
> vcpu *v)
>  /* Check CR4/EFER values */
>  const char *hvm_efer_valid(const struct vcpu *v, uint64_t value,
>                             signed int cr0_pg);
> -unsigned long hvm_cr4_guest_valid_bits(const struct vcpu *v, bool
> restore);
> +unsigned long hvm_cr4_guest_valid_bits(const struct domain *d, bool
> restore);
> 
>  /*
>   * This must be defined as a macro instead of an inline function,
> --
> 2.14.1


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.