Mark recently mentioned that the way we handled FGTs, and particularly their RES0 behaviour was not entirely future-proof. The main issue is that RES0 bits are extracted from the sysreg file, which is independently updated, and that the KVM-specific enablement is not necessarily done at the same time. This means that a bit that KVM considered RES0 at some point all of a sudden acquires a meaning, and that this can trigger unexpected behaviours. One way of fixing that would be to mandate that everything gets updated synchronously. While this is something I'd really want to see, it is unlikely to happen within my lifetime. So the next best option is to reintroduce KVM's own view of RES0 masks, so that it can continue to ignore a given feature in a safe manner. But instead of going back to what we have a while back in the form of hand-crafted masks that are likely to be wrong, this series makes use of the rather exhaustive description of traps that we know about, and then some more: - compile the encoding_to_fgt[] array into individual positive, negative, and res0 masks - use these masks in place of anything that is hardcoded - fix a few bugs along the way (thanks Mark!) - perform some validation and let users know that KVM may be missing some FGT bit definitions But it would be foolish to stop here. We also use FGTs to implement the so called "Fine Grained UNDEF" (FGU) bits, and make sure that system registers that are not exposed to a guest do UNDEF. This means evaluating the guest configuration and setting up these FGU bits when said configuration isn't supported. This series therefore goes one step further and, for the HFG*TR_EL2, HDFG*TR_EL2, and HAFGRTR_EL2 registers, define which bit is controlled by which feature. This is done mechanically, with very minimal human intervention, by extracting the relevant data from the ARM-released JSON files. With that data, we greatly simplify the dependency between FGUs and features, as no code needs to be written. We also use the same data to set the RES0 bits for any register that requires sanitisation (the VNCR-backed registers, for example). Overall, and while this is a lot of new LoCs, it is IMO a reduction in complexity and maintenance burden. I also have additional patches addressing HCRX_EL2 and HCR_EL2, but this is already a large series and I'd like some feedback on it. This series is atop of 6.14-rc2, and contains bits and pieces of FEAT_LS64 support thanks to the newly added HFGITR_EL2.PSBCSYNC bit sharing an EC with LS64... Marc Zyngier (17): arm64: Add ID_AA64ISAR1_EL1.LS64 encoding for FEAT_LS64WB arm64: Add syndrome information for trapped LD64B/ST64B{,V,V0} KVM: arm64: Handle trapping of FEAT_LS64* instructions KVM: arm64: Restrict ACCDATA_EL1 undef to FEAT_ST64_ACCDATA being disabled KVM: arm64: Don't treat HCRX_EL2 as a FGT register KVM: arm64: Plug FEAT_GCS handling KVM: arm64: Compute FGT masks from KVM's own FGT tables KVM: arm64: Add description of FGT bits leading to EC!=0x18 KVM: arm64: Use computed masks as sanitisers for FGT registers KVM: arm64: Propagate FGT masks to the nVHE hypervisor KVM: arm64: Use computed FGT masks to setup FGT registers KVM: arm64: Remove most hand-crafted masks for FGT registers KVM: arm64: Use KVM-specific HCRX_EL2 RES0 mask KVM: arm64: Handle PSB CSYNC traps KVM: arm64: Switch to table-driven FGU configuration KVM: arm64: Validate FGT register descriptions against RES0 masks KVM: arm64: Use FGT feature maps to drive RES0 bits Mark Rutland (1): KVM: arm64: Unconditionally configure fine-grain traps arch/arm64/include/asm/esr.h | 9 +- arch/arm64/include/asm/kvm_arm.h | 64 +-- arch/arm64/include/asm/kvm_host.h | 25 + arch/arm64/kvm/Makefile | 2 +- arch/arm64/kvm/arm.c | 8 + arch/arm64/kvm/config.c | 614 ++++++++++++++++++++++++ arch/arm64/kvm/emulate-nested.c | 140 +++++- arch/arm64/kvm/handle_exit.c | 81 ++++ arch/arm64/kvm/hyp/include/hyp/switch.h | 110 ++--- arch/arm64/kvm/hyp/nvhe/switch.c | 7 + arch/arm64/kvm/nested.c | 137 +----- arch/arm64/kvm/sys_regs.c | 65 +-- arch/arm64/tools/sysreg | 3 +- 13 files changed, 976 insertions(+), 289 deletions(-) create mode 100644 arch/arm64/kvm/config.c -- 2.39.2