[PATCH v3 00/42] KVM: arm64: Revamp Fine Grained Trap handling
Ganapatrao Kulkarni
gankulkarni at os.amperecomputing.com
Mon Apr 28 11:33:10 PDT 2025
Hi Marc,
On 26-04-2025 17:57, Marc Zyngier wrote:
> This is yet another version of the series last posted at [1].
>
> The eagled eye reviewer will have noticed that since v2, the series
> has more or less doubled in size for any reasonable metric (number of
> patches, number of lines added or deleted). It is therefore pretty
> urgent that this gets either merged or forgotten! ;-)
>
> See the change log below for the details -- most of it is related to
> FGT2 (and its rather large dependencies) being added.
>
> * From v2:
>
> - Added comprehensive support for FEAT_FGT2, as the host kernel is
> now making use of these registers, without any form of context
> switch in KVM. What could possibly go wrong?
>
> - Reworked some of the FGT description and handling primitives,
> reducing the boilerplate code and tables that get added over time.
>
> - Rebased on 6.15-rc3.
>
> [1]: https://lore.kernel.org/r/20250310122505.2857610-1-maz@kernel.org
>
> Marc Zyngier (41):
> arm64: sysreg: Add ID_AA64ISAR1_EL1.LS64 encoding for FEAT_LS64WB
> arm64: sysreg: Update ID_AA64MMFR4_EL1 description
> arm64: sysreg: Add layout for HCR_EL2
> arm64: sysreg: Replace HGFxTR_EL2 with HFG{R,W}TR_EL2
> arm64: sysreg: Update ID_AA64PFR0_EL1 description
> arm64: sysreg: Update PMSIDR_EL1 description
> arm64: sysreg: Update TRBIDR_EL1 description
> arm64: sysreg: Add registers trapped by HFG{R,W}TR2_EL2
> arm64: sysreg: Add registers trapped by HDFG{R,W}TR2_EL2
> arm64: sysreg: Add system instructions trapped by HFGIRT2_EL2
> arm64: Remove duplicated sysreg encodings
> arm64: tools: Resync sysreg.h
> arm64: Add syndrome information for trapped LD64B/ST64B{,V,V0}
> arm64: Add FEAT_FGT2 capability
> KVM: arm64: Tighten handling of unknown FGT groups
> KVM: arm64: Simplify handling of negative FGT bits
> 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 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
> KVM: arm64: Allow kvm_has_feat() to take variable arguments
> KVM: arm64: Use HCRX_EL2 feature map to drive fixed-value bits
> KVM: arm64: Use HCR_EL2 feature map to drive fixed-value bits
> KVM: arm64: Add FEAT_FGT2 registers to the VNCR page
> KVM: arm64: Add sanitisation for FEAT_FGT2 registers
> KVM: arm64: Add trap routing for FEAT_FGT2 registers
> KVM: arm64: Add context-switch for FEAT_FGT2 registers
> KVM: arm64: Allow sysreg ranges for FGT descriptors
> KVM: arm64: Add FGT descriptors for FEAT_FGT2
> KVM: arm64: Handle TSB CSYNC traps
>
> Mark Rutland (1):
> KVM: arm64: Unconditionally configure fine-grain traps
>
> arch/arm64/include/asm/el2_setup.h | 14 +-
> arch/arm64/include/asm/esr.h | 10 +-
> arch/arm64/include/asm/kvm_arm.h | 186 ++--
> arch/arm64/include/asm/kvm_host.h | 56 +-
> arch/arm64/include/asm/sysreg.h | 26 +-
> arch/arm64/include/asm/vncr_mapping.h | 5 +
> arch/arm64/kernel/cpufeature.c | 7 +
> arch/arm64/kvm/Makefile | 2 +-
> arch/arm64/kvm/arm.c | 13 +
> arch/arm64/kvm/config.c | 1085 +++++++++++++++++++++++
> arch/arm64/kvm/emulate-nested.c | 580 ++++++++----
> arch/arm64/kvm/handle_exit.c | 77 ++
> arch/arm64/kvm/hyp/include/hyp/switch.h | 158 ++--
> arch/arm64/kvm/hyp/nvhe/switch.c | 12 +
> arch/arm64/kvm/hyp/vgic-v3-sr.c | 8 +-
> arch/arm64/kvm/nested.c | 223 +----
> arch/arm64/kvm/sys_regs.c | 68 +-
> arch/arm64/tools/cpucaps | 1 +
> arch/arm64/tools/sysreg | 1002 ++++++++++++++++++++-
> tools/arch/arm64/include/asm/sysreg.h | 65 +-
> 20 files changed, 2888 insertions(+), 710 deletions(-)
> create mode 100644 arch/arm64/kvm/config.c
>
I am trying nv-next branch and I believe these FGT related changes are
merged. With this, selftest arm64/set_id_regs is failing. From initial
debug it seems, the register access of SYS_CTR_EL0, SYS_MIDR_EL1,
SYS_REVIDR_EL1 and SYS_AIDR_EL1 from guest_code is resulting in trap to
EL2 (HCR_ID1,ID2 are set) and is getting forwarded back to EL1, since
EL1 sync handler is not installed in the test code, resulting in
hang(endless guest_exit/entry).
It is due to function "triage_sysreg_trap" is returning true.
When guest_code is in EL1 (default case) it is due to return in below if.
if (tc.fgt != __NO_FGT_GROUP__ &&
(vcpu->kvm->arch.fgu[tc.fgt] & BIT(tc.bit))) {
kvm_inject_undefined(vcpu);
return true;
}
IMO, Host should return the value of these sysreg read instead of
forwarding the trap to guest or something more to be added to testcode?
--
Thanks,
Gk
More information about the linux-arm-kernel
mailing list