Message ID | 20220902154804.1939819-1-oliver.upton@linux.dev (mailing list archive) |
---|---|
Headers | show |
Series | KVM: arm64: Use visibility hook to treat ID regs as RAZ | expand |
Lol, mess up my own copypasta: On Fri, Sep 02, 2022 at 03:47:56PM +0000, Oliver Upton wrote: > For reasons unknown, the Arm architecture defines the 64-bit views of > the 32-bit ID registers as UNKNOWN [1]. This combines poorly with the ^ on AArch64-only systems. > fact that KVM unconditionally exposes these registers to userspace, > which could throw a wrench in migration between 64-bit only systems. > > This series reworks KVM's definition of these registers to RAZ/WI with > the goal of providing consistent register values across 64-bit machines. > > Patches 1-3 clean up the ID register accessors, taking advantage of the > fact that the generic accessors know how to handle RAZ. > > Patches 4-6 start switch the handling of potentially nonzero AArch32 ID > registers to RAZ/WI. RAZ covers up the architecturally UNKNOWN values, > and WI allows for migration off of kernels that may provide garbage. > Note that hidden AArch32 ID registers continue to have RAZ behavior with > the additional expectation of invariance. > > Lastly, patch 7 includes a small test for the issue. > > Applies to 6.0-rc3. Tested with KVM selftests under the fast model w/ > asymmetric 32 bit support and no 32 bit support whatsoever. [1]: DDI0487H.a Table D12-2 'Instruction encodings for non-Debug System Register accesses' v1: https://lore.kernel.org/kvmarm/20220817214818.3243383-1-oliver.upton@linux.dev/ -- Thanks, Oliver > v1 -> v2: > - Collect Reiji's r-b tags (thanks!) > - Call sysreg_visible_as_raz() from read_id_reg() (Reiji) > - Hoist sysreg_user_write_ignore() into kvm_sys_reg_set_user() (Reiji) > > Oliver Upton (7): > KVM: arm64: Use visibility hook to treat ID regs as RAZ > KVM: arm64: Remove internal accessor helpers for id regs > KVM: arm64: Drop raz parameter from read_id_reg() > KVM: arm64: Spin off helper for calling visibility hook > KVM: arm64: Add a visibility bit to ignore user writes > KVM: arm64: Treat 32bit ID registers as RAZ/WI on 64bit-only system > KVM: selftests: Add test for RAZ/WI AArch32 ID registers > > arch/arm64/kvm/sys_regs.c | 150 +++++++++--------- > arch/arm64/kvm/sys_regs.h | 24 ++- > tools/testing/selftests/kvm/.gitignore | 1 + > tools/testing/selftests/kvm/Makefile | 1 + > .../kvm/aarch64/aarch64_only_id_regs.c | 135 ++++++++++++++++ > 5 files changed, 225 insertions(+), 86 deletions(-) > create mode 100644 tools/testing/selftests/kvm/aarch64/aarch64_only_id_regs.c > > > base-commit: b90cb1053190353cc30f0fef0ef1f378ccc063c5 > -- > 2.37.2.789.g6183377224-goog >