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

Re: [Xen-devel] [PATCH v2] x86/msr: Fix fallout from mostly c/s 832c180



> -----Original Message-----
> From: Xen-devel [mailto:xen-devel-bounces@xxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> Andrew Cooper
> Sent: 15 April 2019 13:03
> To: Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
> Cc: Kevin Tian <kevin.tian@xxxxxxxxx>; Wei Liu <wei.liu2@xxxxxxxxxx>; Jan 
> Beulich <JBeulich@xxxxxxxx>;
> Andrew Cooper <Andrew.Cooper3@xxxxxxxxxx>; Jun Nakajima 
> <jun.nakajima@xxxxxxxxx>; Roger Pau Monne
> <roger.pau@xxxxxxxxxx>
> Subject: [Xen-devel] [PATCH v2] x86/msr: Fix fallout from mostly c/s 832c180
> 
>  * Fix the shim build by providing a !CONFIG_HVM declaration for
>    hvm_get_guest_bndcfgs(), and removing the introduced
>    ASSERT(is_hvm_domain(d))'s.  They are needed for DCE to keep the build
>    working.  Furthermore, in this way, the risk of runtime type confusion is
>    removed.
>  * Revert the de-const'ing of the vcpu pointer in vmx_get_guest_bndcfgs().
>    vmx_vmcs_enter() really does mutate the vcpu, and may cause it to undergo a
>    full de/reschedule, which is in violation of the ABI described by
>    hvm_get_guest_bndcfgs().  guest_rdmsr() was always going to need to lose
>    its const parameter, and this was the correct time for it to happen.
>  * The MSRs in vcpu_msrs are in numeric order.  Re-position XSS to match.

My R-b was actually contingent on a comment in the header above the sruct to 
state the desire for the MSRs to be in numeric order.

  Paul

> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> Reviewed-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
> ---
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> CC: Wei Liu <wei.liu2@xxxxxxxxxx>
> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> CC: Jun Nakajima <jun.nakajima@xxxxxxxxx>
> CC: Kevin Tian <kevin.tian@xxxxxxxxx>
> 
> v2:
>  * Rephrase the commit message
> ---
>  xen/arch/x86/hvm/vmx/vmx.c     |  5 +----
>  xen/arch/x86/msr.c             | 18 +++++-------------
>  xen/arch/x86/pv/emul-priv-op.c |  2 +-
>  xen/include/asm-x86/hvm/hvm.h  |  5 +++--
>  xen/include/asm-x86/msr.h      | 12 ++++++------
>  5 files changed, 16 insertions(+), 26 deletions(-)
> 
> diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
> index c46e05b..283eb7b 100644
> --- a/xen/arch/x86/hvm/vmx/vmx.c
> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> @@ -1150,11 +1150,8 @@ static bool vmx_set_guest_bndcfgs(struct vcpu *v, u64 
> val)
>      return true;
>  }
> 
> -static bool vmx_get_guest_bndcfgs(const struct vcpu *cv, u64 *val)
> +static bool vmx_get_guest_bndcfgs(struct vcpu *v, u64 *val)
>  {
> -    /* Get a non-const pointer for vmx_vmcs_enter() */
> -    struct vcpu *v = cv->domain->vcpu[cv->vcpu_id];
> -
>      ASSERT(cpu_has_mpx && cpu_has_vmx_mpx);
> 
>      vmx_vmcs_enter(v);
> diff --git a/xen/arch/x86/msr.c b/xen/arch/x86/msr.c
> index 815d599..0049a73 100644
> --- a/xen/arch/x86/msr.c
> +++ b/xen/arch/x86/msr.c
> @@ -115,7 +115,7 @@ int init_vcpu_msr_policy(struct vcpu *v)
>      return 0;
>  }
> 
> -int guest_rdmsr(const struct vcpu *v, uint32_t msr, uint64_t *val)
> +int guest_rdmsr(struct vcpu *v, uint32_t msr, uint64_t *val)
>  {
>      const struct vcpu *curr = current;
>      const struct domain *d = v->domain;
> @@ -182,13 +182,9 @@ int guest_rdmsr(const struct vcpu *v, uint32_t msr, 
> uint64_t *val)
>          break;
> 
>      case MSR_IA32_BNDCFGS:
> -        if ( !cp->feat.mpx )
> +        if ( !cp->feat.mpx || !is_hvm_domain(d) ||
> +             !hvm_get_guest_bndcfgs(v, val) )
>              goto gp_fault;
> -
> -        ASSERT(is_hvm_domain(d));
> -        if (!hvm_get_guest_bndcfgs(v, val) )
> -            goto gp_fault;
> -
>          break;
> 
>      case MSR_IA32_XSS:
> @@ -375,13 +371,9 @@ int guest_wrmsr(struct vcpu *v, uint32_t msr, uint64_t 
> val)
>          break;
> 
>      case MSR_IA32_BNDCFGS:
> -        if ( !cp->feat.mpx )
> +        if ( !cp->feat.mpx || !is_hvm_domain(d) ||
> +             !hvm_set_guest_bndcfgs(v, val) )
>              goto gp_fault;
> -
> -        ASSERT(is_hvm_domain(d));
> -        if ( !hvm_set_guest_bndcfgs(v, val) )
> -            goto gp_fault;
> -
>          break;
> 
>      case MSR_IA32_XSS:
> diff --git a/xen/arch/x86/pv/emul-priv-op.c b/xen/arch/x86/pv/emul-priv-op.c
> index a55a400..af74f50 100644
> --- a/xen/arch/x86/pv/emul-priv-op.c
> +++ b/xen/arch/x86/pv/emul-priv-op.c
> @@ -819,7 +819,7 @@ static inline bool is_cpufreq_controller(const struct 
> domain *d)
>  static int read_msr(unsigned int reg, uint64_t *val,
>                      struct x86_emulate_ctxt *ctxt)
>  {
> -    const struct vcpu *curr = current;
> +    struct vcpu *curr = current;
>      const struct domain *currd = curr->domain;
>      bool vpmu_msr = false;
>      int ret;
> diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h
> index c811fa9..157f0de 100644
> --- a/xen/include/asm-x86/hvm/hvm.h
> +++ b/xen/include/asm-x86/hvm/hvm.h
> @@ -145,7 +145,7 @@ struct hvm_function_table {
>      int  (*get_guest_pat)(struct vcpu *v, u64 *);
>      int  (*set_guest_pat)(struct vcpu *v, u64);
> 
> -    bool (*get_guest_bndcfgs)(const struct vcpu *v, u64 *);
> +    bool (*get_guest_bndcfgs)(struct vcpu *v, u64 *);
>      bool (*set_guest_bndcfgs)(struct vcpu *v, u64);
> 
>      void (*set_tsc_offset)(struct vcpu *v, u64 offset, u64 at_tsc);
> @@ -444,7 +444,7 @@ static inline unsigned long hvm_get_shadow_gs_base(struct 
> vcpu *v)
>      return hvm_funcs.get_shadow_gs_base(v);
>  }
> 
> -static inline bool hvm_get_guest_bndcfgs(const struct vcpu *v, u64 *val)
> +static inline bool hvm_get_guest_bndcfgs(struct vcpu *v, u64 *val)
>  {
>      return hvm_funcs.get_guest_bndcfgs &&
>             hvm_funcs.get_guest_bndcfgs(v, val);
> @@ -692,6 +692,7 @@ unsigned long hvm_get_shadow_gs_base(struct vcpu *v);
>  void hvm_set_info_guest(struct vcpu *v);
>  void hvm_cpuid_policy_changed(struct vcpu *v);
>  void hvm_set_tsc_offset(struct vcpu *v, uint64_t offset, uint64_t at_tsc);
> +bool hvm_get_guest_bndcfgs(struct vcpu *v, uint64_t *val);
> 
>  /* End of prototype list */
> 
> diff --git a/xen/include/asm-x86/msr.h b/xen/include/asm-x86/msr.h
> index 0d52c08..3cbbc65 100644
> --- a/xen/include/asm-x86/msr.h
> +++ b/xen/include/asm-x86/msr.h
> @@ -296,6 +296,11 @@ struct vcpu_msrs
>          };
>      } misc_features_enables;
> 
> +    /* 0x00000da0 - MSR_IA32_XSS */
> +    struct {
> +        uint64_t raw;
> +    } xss;
> +
>      /*
>       * 0xc0000103 - MSR_TSC_AUX
>       *
> @@ -313,11 +318,6 @@ struct vcpu_msrs
>       * values here may be stale in current context.
>       */
>      uint32_t dr_mask[4];
> -
> -    /* 0x00000da0 - MSR_IA32_XSS */
> -    struct {
> -        uint64_t raw;
> -    } xss;
>  };
> 
>  void init_guest_msr_policy(void);
> @@ -333,7 +333,7 @@ int init_vcpu_msr_policy(struct vcpu *v);
>   * These functions are also used by the migration logic, so need to cope with
>   * being used outside of v's context.
>   */
> -int guest_rdmsr(const struct vcpu *v, uint32_t msr, uint64_t *val);
> +int guest_rdmsr(struct vcpu *v, uint32_t msr, uint64_t *val);
>  int guest_wrmsr(struct vcpu *v, uint32_t msr, uint64_t val);
> 
>  #endif /* !__ASSEMBLY__ */
> --
> 2.1.4
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxxx
> https://lists.xenproject.org/mailman/listinfo/xen-devel
_______________________________________________
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®.