|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/4 V2] X86: MPX IA32_BNDCFGS msr handle
Jan Beulich wrote:
>>>> On 25.11.13 at 09:25, "Liu, Jinsong" <jinsong.liu@xxxxxxxxx> wrote:
>> +static bool_t bndcfgs_invalid(u64 msr_content)
>> +{
>> + /* BNDCFGS MSR reserved bits (11 ~ 2) must be zero */
>> + if ( msr_content & 0xffc )
>> + return 1;
>> +
>> + /* Canonical address reserved bits must be zero */
>> + if ( hvm_long_mode_enabled(current) )
>> + /* 48b linear address for x86_64 guest */
>> + return !!(msr_content & (~(u64)0 << 48) );
>
> !is_canonical_address()
Not simply is_canonical_address() check, per MPX doc 9.3.5.1,
It will #GP if canonical address reserved bits (must be zero) check fails
>
>> + else
>> + /* 32b linear address for x86_32 (include PAE) guest */
>> + return !!(msr_content & (~(u64)0 << 32) );
>
> !!(msr_content >> 32)
>
>> @@ -3010,6 +3025,12 @@ int hvm_msr_read_intercept(unsigned int msr,
>> uint64_t *msr_content) hvm_get_guest_pat(v, msr_content);
>> break;
>>
>> + case MSR_IA32_BNDCFGS:
>> + if ( !cpu_has_mpx )
>
> Wasn't it you who started to properly use hvm_cpuid() for cases like
> this? We're not after host capabilities here, but after what the guest
> is supposed to (not) use.
When malicious or flawed guest access reserved or unimplemented msr, I think
inject #GP is better than silently ignore?
>
>> @@ -955,6 +956,34 @@ static int construct_vmcs(struct vcpu *v)
>> vmx_disable_intercept_for_msr(v, MSR_IA32_SYSENTER_EIP,
>> MSR_TYPE_R | MSR_TYPE_W); if ( paging_mode_hap(d) &&
>> (!iommu_enabled || iommu_snoop) )
>> vmx_disable_intercept_for_msr(v, MSR_IA32_CR_PAT, MSR_TYPE_R |
>> MSR_TYPE_W); + + if ( cpu_has_mpx ) + {
>> + /*
>> + * When MPX supported, a new guest-state field for
>> IA32_BNDCFGS + * is added to the VMCS. In addition, two
>> new controls are added: + * - a VM-exit control called
>> "clear BNDCFGS" + * - a VM-entry control called "load
>> BNDCFGS." + * VM exits always save IA32_BNDCFGS into
>> BNDCFGS field of VMCS. + */ + if (
>> likely((vmexit_ctl & VM_EXIT_CLEAR_BNDCFGS) && +
>> (vmentry_ctl & VM_ENTRY_LOAD_BNDCFGS)) ) + { +
>> vmx_disable_intercept_for_msr(v, MSR_IA32_BNDCFGS, +
>> MSR_TYPE_R | MSR_TYPE_W); + } + /* Unlikely,
>> just in case buggy VMX ucode */ + else + {
>> + int ret;
>> + ret = vmx_add_guest_msr(MSR_IA32_BNDCFGS); +
>> if ( ret ) + return ret;
>> + ret = vmx_add_host_load_msr(MSR_IA32_BNDCFGS); +
>> if ( ret ) + return ret;
>
> You can't just return here - a vmx_vmcs_exit() is needed on any
> exit path in the middle of this function.
>
Yes.
Thanks,
Jinsong
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |