|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86: Always have CR4.PKE set in HVM context
On 30.04.2021 00:12, Andrew Cooper wrote:
> The sole user of read_pkru() is the emulated pagewalk, and guarded behind
> guest_pku_enabled() which restricts the path to HVM (hap, even) context only.
>
> The commentary in read_pkru() concerning _PAGE_GNTTAB overlapping with
> _PAGE_PKEY_BITS is only applicable to PV guests.
>
> The context switch path, via write_ptbase() unconditionally writes CR4 on any
> context switch.
>
> Therefore, we can guarantee to separate CR4.PKE between PV and HVM context at
> no extra cost. Set PKE in mmu_cr4_features on boot, so it becomes set in HVM
> context, and clear it in pv_make_cr4().
>
> Rename read_pkru() to rdpkru() now that it is a simple wrapper around the
> instruction. This saves two CR4 writes on every pagewalk, which typically
> occur more than one per emulation.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> ---
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> CC: Wei Liu <wl@xxxxxxx>
>
> It also occurs to me that for HVM/Idle => HVM/Idle context switches, we never
> need to change CR4. I think this is substantially clearer following XSA-293 /
> c/s b2dd00574a4f ("x86/pv: Rewrite guest %cr4 handling from scratch") which
> introduced pv_make_cr4().
Never needing to change CR4 doesn't uniformly mean writes can be avoided.
Part of the purpose of the writes is to flush the TLB. Per-domain as well
as shadow mappings may be in need of such if global mappings are used
anywhere.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |