KVM: arm64: Add Fine-Grained UNDEF tracking information
authorMarc Zyngier <maz@kernel.org>
Wed, 14 Feb 2024 13:18:18 +0000 (13:18 +0000)
committerOliver Upton <oliver.upton@linux.dev>
Mon, 19 Feb 2024 17:13:01 +0000 (17:13 +0000)
In order to efficiently handle system register access being disabled,
and this resulting in an UNDEF exception being injected, we introduce
the (slightly dubious) concept of Fine-Grained UNDEF, modeled after
the architectural Fine-Grained Traps.

For each FGT group, we keep a 64 bit word that has the exact same
bit assignment as the corresponding FGT register, where a 1 indicates
that trapping this register should result in an UNDEF exception being
reinjected.

So far, nothing populates this information, nor sets the corresponding
trap bits.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20240214131827.2856277-18-maz@kernel.org
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/include/asm/kvm_host.h
arch/arm64/kvm/emulate-nested.c

index 914fd54179bbe9fe7942d61ddfb24aff57ede743..c69b258fc989be8c7647f79353d2bb8c780bf1cc 100644 (file)
@@ -240,9 +240,30 @@ static inline u16 kvm_mpidr_index(struct kvm_mpidr_data *data, u64 mpidr)
 
 struct kvm_sysreg_masks;
 
+enum fgt_group_id {
+       __NO_FGT_GROUP__,
+       HFGxTR_GROUP,
+       HDFGRTR_GROUP,
+       HDFGWTR_GROUP = HDFGRTR_GROUP,
+       HFGITR_GROUP,
+       HAFGRTR_GROUP,
+
+       /* Must be last */
+       __NR_FGT_GROUP_IDS__
+};
+
 struct kvm_arch {
        struct kvm_s2_mmu mmu;
 
+       /*
+        * Fine-Grained UNDEF, mimicking the FGT layout defined by the
+        * architecture. We track them globally, as we present the
+        * same feature-set to all vcpus.
+        *
+        * Index 0 is currently spare.
+        */
+       u64 fgu[__NR_FGT_GROUP_IDS__];
+
        /* Interrupt controller */
        struct vgic_dist        vgic;
 
index 4f2a32a8f24745b48074ab0dee0dd03dac3cbb9e..b67078b8271bb4fef7ebf19957abc24f723d9da8 100644 (file)
@@ -1009,18 +1009,6 @@ static const struct encoding_to_trap_config encoding_to_cgt[] __initconst = {
 
 static DEFINE_XARRAY(sr_forward_xa);
 
-enum fgt_group_id {
-       __NO_FGT_GROUP__,
-       HFGxTR_GROUP,
-       HDFGRTR_GROUP,
-       HDFGWTR_GROUP = HDFGRTR_GROUP,
-       HFGITR_GROUP,
-       HAFGRTR_GROUP,
-
-       /* Must be last */
-       __NR_FGT_GROUP_IDS__
-};
-
 enum fg_filter_id {
        __NO_FGF__,
        HCRX_FGTnXS,