Re: [PATCH v2 2/3] x86 Test and expose CPUID faulting capabilities in /proc/cpuinfo
From: Andy Lutomirski
Date: Thu Sep 15 2016 - 19:19:30 EST
On Thu, Sep 15, 2016 at 1:38 PM, H. Peter Anvin <hpa@xxxxxxxxx> wrote:
> On September 14, 2016 6:17:51 PM PDT, Andy Lutomirski <luto@xxxxxxxxxxxxxx> wrote:
>>On Wed, Sep 14, 2016 at 3:03 PM, Kyle Huey <me@xxxxxxxxxxxx> wrote:
>>> On Wed, Sep 14, 2016 at 2:35 PM, Dave Hansen
>>> <dave.hansen@xxxxxxxxxxxxxxx> wrote:
>>>> On 09/14/2016 02:01 PM, Kyle Huey wrote:
>>
>>>> Is any of this useful to optimize away at compile-time? We have
>>config
>>>> options for when we're running as a guest, and this seems like a
>>feature
>>>> that isn't available when running on bare metal.
>>>
>>> On the contrary, this is only available when we're on bare metal.
>>> Neither Xen nor KVM virtualize CPUID faulting (although KVM correctly
>>> suppresses MSR_PLATFORM_INFO's report of support for it).
>>
>>KVM could easily support this. If rr starts using it, I think KVM
>>*should* add support, possibly even for older CPUs that don't support
>>the feature in hardware.
>>
>>It's too bad that x86 doesn't give us the instruction bytes on a
>>fault. Otherwise we could lazily switch this feature.
>>
>>--Andy
>
> You can "always" examine the instruction bytes in memory... have to make sure you properly consider the impact of race conditions though.
I'd rather avoid needing to worry about those race conditions if at
all possible, though. Intel and AMD both have fancy "decode assists"
and such -- it would be quite nice IMO if we could get the same data
exposed in the handlers of synchronous faults.
If Intel or AMD were to do this for real, presumably the rule would be
that any fault-class exception caused by a validly-decoded instruction
at CPL3 (so #PF and #GP would count but #DB probably wouldn't, and #DF
wouldn't either unless the initial fault did) would stash away the
faulting instruction and other entries would instead stash away
"nothing here". Some pair of MSRs or new instruction would read out
information. Then we could accurately emulate CPUID, we could
accurately emulate page-faulting instructions if we cared, etc. All
of the relevant hardware must already mostly exist because VMX and SVM
both have this capability.
--Andy