|
[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:
>>>> "Liu, Jinsong" <jinsong.liu@xxxxxxxxx> 11/26/13 3:12 PM >>>
>> Jan Beulich wrote:
>>>>>> On 26.11.13 at 11:11, "Liu, Jinsong" <jinsong.liu@xxxxxxxxx>
>>>>>> wrote:
>>>> 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
>>>
>>> You're checking the reserved bits (2...11) above. For the address
>>> portion it says "The base of bound directory is a 4K page aligned
>>> linear address, and is always in canonical form. Any load into
>>> BNDCFGx (XRSTOR or WRMSR) ensures that the highest implemented bit
>>> of
>>> the linear address is sign extended to guarantee the canonicality
>>> of this address", which to me means _if_ you check anything here,
>>> then you want to check the address for being canonical.
>>>
>>>>>> + else
>>>>>> + /* 32b linear address for x86_32 (include PAE) guest */
>>>>>> + return !!(msr_content & (~(u64)0 << 32) );
>>>>>
>>>>> !!(msr_content >> 32)
>>
>> If so, canonical check for x86-32 (and pae) -- bit63~32 should not
>> always be zero, but is sign extension of bit 31?
>
> Why? Everywhere else 32-bit addresses get zero extended when a 64-bit
> value is needed.
>
> But first of all the question needs to be answered whether this
> checking is necessary at all - the documentation to me reads as if
> the hardware would not fault on non-canonical values, but simply make
> them canonical.
Re-read doc, seems your understanding is right.
So we check bit11~2 and inject #GP if check fail, and emulate making canonical
address:
* for x86-64 guest, sign extend bit47
* for x86-32 guest, bit63~32 set all 0's
>>>>>> @@ -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?
>>>
>>> I didn't say "silently ignore"; in fact, I asked you to _tighten_
>>> the check (hvm_cpuid() shouldn't return the respective flag set when
>>> !cpu_has_mpx).
>>
>> Not quite clear your meaning here, hvm_cpuid will not return flag
>> when !cpu_has_mpx.
>
> In your patch you check the hardware capability, but you ought to
> check whether the guest knows the feature to be available. The
> feature will obviously not show as available if the hardware
> capability is not there.
But the check !cpu_has_mpx has implicitly meant guest will not know this
feature -- if h/w has not mpx cability, xen will not expose it to guest.
Anything I'm missing here?
Thanks,
Jinsong
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |