]> www.infradead.org Git - linux.git/commitdiff
Merge branch kvm-arm64/ctr-el0 into kvmarm/next
authorOliver Upton <oliver.upton@linux.dev>
Sun, 14 Jul 2024 00:15:00 +0000 (00:15 +0000)
committerOliver Upton <oliver.upton@linux.dev>
Sun, 14 Jul 2024 00:22:32 +0000 (00:22 +0000)
* kvm-arm64/ctr-el0:
  : Support for user changes to CTR_EL0, courtesy of Sebastian Ott
  :
  : Allow userspace to change the guest-visible value of CTR_EL0 for a VM,
  : so long as the requested value represents a subset of features supported
  : by hardware. In other words, prevent the VMM from over-promising the
  : capabilities of hardware.
  :
  : Make this happen by fitting CTR_EL0 into the existing infrastructure for
  : feature ID registers.
  KVM: selftests: Assert that MPIDR_EL1 is unchanged across vCPU reset
  KVM: arm64: nv: Unfudge ID_AA64PFR0_EL1 masking
  KVM: selftests: arm64: Test writes to CTR_EL0
  KVM: arm64: rename functions for invariant sys regs
  KVM: arm64: show writable masks for feature registers
  KVM: arm64: Treat CTR_EL0 as a VM feature ID register
  KVM: arm64: unify code to prepare traps
  KVM: arm64: nv: Use accessors for modifying ID registers
  KVM: arm64: Add helper for writing ID regs
  KVM: arm64: Use read-only helper for reading VM ID registers
  KVM: arm64: Make idregs debugfs iterator search sysreg table directly
  KVM: arm64: Get sys_reg encoding from descriptor in idregs_debug_show()

Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
1  2 
arch/arm64/include/asm/kvm_emulate.h
arch/arm64/include/asm/kvm_host.h
arch/arm64/kvm/arm.c
arch/arm64/kvm/nested.c
arch/arm64/kvm/sys_regs.c

Simple merge
Simple merge
Simple merge
index 1d44318744e0fcd1ccdef6ee459150559693201c,794ed18c05375fd1229273c4b26e2e03ef27c91d..9ae4be49e22339eb60d149cec2fa5ee5984d47d8
@@@ -799,142 -23,131 +799,132 @@@ void kvm_arch_flush_shadow_all(struct k
   * This list should get updated as new features get added to the NV
   * support, and new extension to the architecture.
   */
- static u64 limit_nv_id_reg(u32 id, u64 val)
- {
-       u64 tmp;
-       switch (id) {
-       case SYS_ID_AA64ISAR0_EL1:
-               /* Support everything but TME */
-               val &= ~NV_FTR(ISAR0, TME);
-               break;
-       case SYS_ID_AA64ISAR1_EL1:
-               /* Support everything but Spec Invalidation and LS64 */
-               val &= ~(NV_FTR(ISAR1, LS64)    |
-                        NV_FTR(ISAR1, SPECRES));
-               break;
-       case SYS_ID_AA64PFR0_EL1:
-               /* No AMU, MPAM, S-EL2, RAS or SVE */
-               val &= ~(GENMASK_ULL(55, 52)    |
-                        NV_FTR(PFR0, AMU)      |
-                        NV_FTR(PFR0, MPAM)     |
-                        NV_FTR(PFR0, SEL2)     |
-                        NV_FTR(PFR0, RAS)      |
-                        NV_FTR(PFR0, SVE)      |
-                        NV_FTR(PFR0, EL3)      |
-                        NV_FTR(PFR0, EL2)      |
-                        NV_FTR(PFR0, EL1));
-               /* 64bit EL1/EL2/EL3 only */
-               val |= FIELD_PREP(NV_FTR(PFR0, EL1), 0b0001);
-               val |= FIELD_PREP(NV_FTR(PFR0, EL2), 0b0001);
-               val |= FIELD_PREP(NV_FTR(PFR0, EL3), 0b0001);
-               break;
-       case SYS_ID_AA64PFR1_EL1:
-               /* Only support BTI, SSBS, CSV2_frac */
-               val &= (NV_FTR(PFR1, BT)        |
-                       NV_FTR(PFR1, SSBS)      |
-                       NV_FTR(PFR1, CSV2_frac));
-               break;
-       case SYS_ID_AA64MMFR0_EL1:
-               /* Hide ECV, ExS, Secure Memory */
-               val &= ~(NV_FTR(MMFR0, ECV)             |
-                        NV_FTR(MMFR0, EXS)             |
-                        NV_FTR(MMFR0, TGRAN4_2)        |
-                        NV_FTR(MMFR0, TGRAN16_2)       |
-                        NV_FTR(MMFR0, TGRAN64_2)       |
-                        NV_FTR(MMFR0, SNSMEM));
-               /* Disallow unsupported S2 page sizes */
-               switch (PAGE_SIZE) {
-               case SZ_64K:
-                       val |= FIELD_PREP(NV_FTR(MMFR0, TGRAN16_2), 0b0001);
-                       fallthrough;
-               case SZ_16K:
-                       val |= FIELD_PREP(NV_FTR(MMFR0, TGRAN4_2), 0b0001);
-                       fallthrough;
-               case SZ_4K:
-                       /* Support everything */
-                       break;
-               }
-               /*
-                * Since we can't support a guest S2 page size smaller than
-                * the host's own page size (due to KVM only populating its
-                * own S2 using the kernel's page size), advertise the
-                * limitation using FEAT_GTG.
-                */
-               switch (PAGE_SIZE) {
-               case SZ_4K:
-                       val |= FIELD_PREP(NV_FTR(MMFR0, TGRAN4_2), 0b0010);
-                       fallthrough;
-               case SZ_16K:
-                       val |= FIELD_PREP(NV_FTR(MMFR0, TGRAN16_2), 0b0010);
-                       fallthrough;
-               case SZ_64K:
-                       val |= FIELD_PREP(NV_FTR(MMFR0, TGRAN64_2), 0b0010);
-                       break;
-               }
-               /* Cap PARange to 48bits */
-               tmp = FIELD_GET(NV_FTR(MMFR0, PARANGE), val);
-               if (tmp > 0b0101) {
-                       val &= ~NV_FTR(MMFR0, PARANGE);
-                       val |= FIELD_PREP(NV_FTR(MMFR0, PARANGE), 0b0101);
-               }
-               break;
-       case SYS_ID_AA64MMFR1_EL1:
-               val &= (NV_FTR(MMFR1, HCX)      |
-                       NV_FTR(MMFR1, PAN)      |
-                       NV_FTR(MMFR1, LO)       |
-                       NV_FTR(MMFR1, HPDS)     |
-                       NV_FTR(MMFR1, VH)       |
-                       NV_FTR(MMFR1, VMIDBits));
-               break;
-       case SYS_ID_AA64MMFR2_EL1:
-               val &= ~(NV_FTR(MMFR2, BBM)     |
-                        NV_FTR(MMFR2, TTL)     |
-                        GENMASK_ULL(47, 44)    |
-                        NV_FTR(MMFR2, ST)      |
-                        NV_FTR(MMFR2, CCIDX)   |
-                        NV_FTR(MMFR2, VARange));
-               /* Force TTL support */
-               val |= FIELD_PREP(NV_FTR(MMFR2, TTL), 0b0001);
-               break;
-       case SYS_ID_AA64MMFR4_EL1:
-               val = 0;
-               if (!cpus_have_final_cap(ARM64_HAS_HCR_NV1))
-                       val |= FIELD_PREP(NV_FTR(MMFR4, E2H0),
-                                         ID_AA64MMFR4_EL1_E2H0_NI_NV1);
-               break;
-       case SYS_ID_AA64DFR0_EL1:
-               /* Only limited support for PMU, Debug, BPs and WPs */
-               val &= (NV_FTR(DFR0, PMUVer)    |
-                       NV_FTR(DFR0, WRPs)      |
-                       NV_FTR(DFR0, BRPs)      |
-                       NV_FTR(DFR0, DebugVer));
-               /* Cap Debug to ARMv8.1 */
-               tmp = FIELD_GET(NV_FTR(DFR0, DebugVer), val);
-               if (tmp > 0b0111) {
-                       val &= ~NV_FTR(DFR0, DebugVer);
-                       val |= FIELD_PREP(NV_FTR(DFR0, DebugVer), 0b0111);
-               }
+ static void limit_nv_id_regs(struct kvm *kvm)
+ {
+       u64 val, tmp;
 -      /* Support everything but TME, O.S. and Range TLBIs */
++      /* Support everything but TME */
+       val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64ISAR0_EL1);
 -      val &= ~(NV_FTR(ISAR0, TLB)     |
 -               NV_FTR(ISAR0, TME));
++      val &= ~NV_FTR(ISAR0, TME);
+       kvm_set_vm_id_reg(kvm, SYS_ID_AA64ISAR0_EL1, val);
 -      /* Support everything but Spec Invalidation */
++      /* Support everything but Spec Invalidation and LS64 */
+       val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64ISAR1_EL1);
 -      val &= ~(GENMASK_ULL(63, 56)    |
++      val &= ~(NV_FTR(ISAR1, LS64)    |
+                NV_FTR(ISAR1, SPECRES));
+       kvm_set_vm_id_reg(kvm, SYS_ID_AA64ISAR1_EL1, val);
+       /* No AMU, MPAM, S-EL2, RAS or SVE */
+       val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64PFR0_EL1);
+       val &= ~(GENMASK_ULL(55, 52)    |
+                NV_FTR(PFR0, AMU)      |
+                NV_FTR(PFR0, MPAM)     |
+                NV_FTR(PFR0, SEL2)     |
+                NV_FTR(PFR0, RAS)      |
+                NV_FTR(PFR0, SVE)      |
+                NV_FTR(PFR0, EL3)      |
+                NV_FTR(PFR0, EL2)      |
+                NV_FTR(PFR0, EL1));
+       /* 64bit EL1/EL2/EL3 only */
+       val |= FIELD_PREP(NV_FTR(PFR0, EL1), 0b0001);
+       val |= FIELD_PREP(NV_FTR(PFR0, EL2), 0b0001);
+       val |= FIELD_PREP(NV_FTR(PFR0, EL3), 0b0001);
+       kvm_set_vm_id_reg(kvm, SYS_ID_AA64PFR0_EL1, val);
 -      /* Only support SSBS */
++      /* Only support BTI, SSBS, CSV2_frac */
+       val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64PFR1_EL1);
 -      val &= NV_FTR(PFR1, SSBS);
++      val &= (NV_FTR(PFR1, BT)        |
++              NV_FTR(PFR1, SSBS)      |
++              NV_FTR(PFR1, CSV2_frac));
+       kvm_set_vm_id_reg(kvm, SYS_ID_AA64PFR1_EL1, val);
+       /* Hide ECV, ExS, Secure Memory */
+       val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64MMFR0_EL1);
+       val &= ~(NV_FTR(MMFR0, ECV)             |
+                NV_FTR(MMFR0, EXS)             |
+                NV_FTR(MMFR0, TGRAN4_2)        |
+                NV_FTR(MMFR0, TGRAN16_2)       |
+                NV_FTR(MMFR0, TGRAN64_2)       |
+                NV_FTR(MMFR0, SNSMEM));
+       /* Disallow unsupported S2 page sizes */
+       switch (PAGE_SIZE) {
+       case SZ_64K:
+               val |= FIELD_PREP(NV_FTR(MMFR0, TGRAN16_2), 0b0001);
+               fallthrough;
+       case SZ_16K:
+               val |= FIELD_PREP(NV_FTR(MMFR0, TGRAN4_2), 0b0001);
+               fallthrough;
+       case SZ_4K:
+               /* Support everything */
                break;
-       default:
-               /* Unknown register, just wipe it clean */
-               val = 0;
+       }
+       /*
+        * Since we can't support a guest S2 page size smaller than
+        * the host's own page size (due to KVM only populating its
+        * own S2 using the kernel's page size), advertise the
+        * limitation using FEAT_GTG.
+        */
+       switch (PAGE_SIZE) {
+       case SZ_4K:
+               val |= FIELD_PREP(NV_FTR(MMFR0, TGRAN4_2), 0b0010);
+               fallthrough;
+       case SZ_16K:
+               val |= FIELD_PREP(NV_FTR(MMFR0, TGRAN16_2), 0b0010);
+               fallthrough;
+       case SZ_64K:
+               val |= FIELD_PREP(NV_FTR(MMFR0, TGRAN64_2), 0b0010);
                break;
        }
-       return val;
+       /* Cap PARange to 48bits */
+       tmp = FIELD_GET(NV_FTR(MMFR0, PARANGE), val);
+       if (tmp > 0b0101) {
+               val &= ~NV_FTR(MMFR0, PARANGE);
+               val |= FIELD_PREP(NV_FTR(MMFR0, PARANGE), 0b0101);
+       }
+       kvm_set_vm_id_reg(kvm, SYS_ID_AA64MMFR0_EL1, val);
+       val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64MMFR1_EL1);
+       val &= (NV_FTR(MMFR1, HCX)      |
+               NV_FTR(MMFR1, PAN)      |
+               NV_FTR(MMFR1, LO)       |
+               NV_FTR(MMFR1, HPDS)     |
+               NV_FTR(MMFR1, VH)       |
+               NV_FTR(MMFR1, VMIDBits));
+       kvm_set_vm_id_reg(kvm, SYS_ID_AA64MMFR1_EL1, val);
+       val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64MMFR2_EL1);
+       val &= ~(NV_FTR(MMFR2, BBM)     |
+                NV_FTR(MMFR2, TTL)     |
+                GENMASK_ULL(47, 44)    |
+                NV_FTR(MMFR2, ST)      |
+                NV_FTR(MMFR2, CCIDX)   |
+                NV_FTR(MMFR2, VARange));
+       /* Force TTL support */
+       val |= FIELD_PREP(NV_FTR(MMFR2, TTL), 0b0001);
+       kvm_set_vm_id_reg(kvm, SYS_ID_AA64MMFR2_EL1, val);
+       val = 0;
+       if (!cpus_have_final_cap(ARM64_HAS_HCR_NV1))
+               val |= FIELD_PREP(NV_FTR(MMFR4, E2H0),
+                                 ID_AA64MMFR4_EL1_E2H0_NI_NV1);
+       kvm_set_vm_id_reg(kvm, SYS_ID_AA64MMFR4_EL1, val);
+       /* Only limited support for PMU, Debug, BPs and WPs */
+       val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64DFR0_EL1);
+       val &= (NV_FTR(DFR0, PMUVer)    |
+               NV_FTR(DFR0, WRPs)      |
+               NV_FTR(DFR0, BRPs)      |
+               NV_FTR(DFR0, DebugVer));
+       /* Cap Debug to ARMv8.1 */
+       tmp = FIELD_GET(NV_FTR(DFR0, DebugVer), val);
+       if (tmp > 0b0111) {
+               val &= ~NV_FTR(DFR0, DebugVer);
+               val |= FIELD_PREP(NV_FTR(DFR0, DebugVer), 0b0111);
+       }
+       kvm_set_vm_id_reg(kvm, SYS_ID_AA64DFR0_EL1, val);
  }
  
  u64 kvm_vcpu_sanitise_vncr_reg(const struct kvm_vcpu *vcpu, enum vcpu_sysreg sr)
index 803cd5f16e43b8b40f010b1b9573b262442a7cbf,71a4ed58f94b1c4210f824e69e39c901662641be..52588aa7862a9a4110db20440a227503337c121b
@@@ -3009,150 -2769,8 +3027,148 @@@ static struct sys_reg_desc sys_insn_des
        { SYS_DESC(SYS_DC_CISW), access_dcsw },
        { SYS_DESC(SYS_DC_CIGSW), access_dcgsw },
        { SYS_DESC(SYS_DC_CIGDSW), access_dcgsw },
 +
 +      SYS_INSN(TLBI_VMALLE1OS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAE1OS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_ASIDE1OS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAAE1OS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VALE1OS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAALE1OS, handle_tlbi_el1),
 +
 +      SYS_INSN(TLBI_RVAE1IS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVAAE1IS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVALE1IS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVAALE1IS, handle_tlbi_el1),
 +
 +      SYS_INSN(TLBI_VMALLE1IS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAE1IS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_ASIDE1IS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAAE1IS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VALE1IS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAALE1IS, handle_tlbi_el1),
 +
 +      SYS_INSN(TLBI_RVAE1OS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVAAE1OS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVALE1OS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVAALE1OS, handle_tlbi_el1),
 +
 +      SYS_INSN(TLBI_RVAE1, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVAAE1, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVALE1, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVAALE1, handle_tlbi_el1),
 +
 +      SYS_INSN(TLBI_VMALLE1, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAE1, handle_tlbi_el1),
 +      SYS_INSN(TLBI_ASIDE1, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAAE1, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VALE1, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAALE1, handle_tlbi_el1),
 +
 +      SYS_INSN(TLBI_VMALLE1OSNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAE1OSNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_ASIDE1OSNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAAE1OSNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VALE1OSNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAALE1OSNXS, handle_tlbi_el1),
 +
 +      SYS_INSN(TLBI_RVAE1ISNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVAAE1ISNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVALE1ISNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVAALE1ISNXS, handle_tlbi_el1),
 +
 +      SYS_INSN(TLBI_VMALLE1ISNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAE1ISNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_ASIDE1ISNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAAE1ISNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VALE1ISNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAALE1ISNXS, handle_tlbi_el1),
 +
 +      SYS_INSN(TLBI_RVAE1OSNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVAAE1OSNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVALE1OSNXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVAALE1OSNXS, handle_tlbi_el1),
 +
 +      SYS_INSN(TLBI_RVAE1NXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVAAE1NXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVALE1NXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_RVAALE1NXS, handle_tlbi_el1),
 +
 +      SYS_INSN(TLBI_VMALLE1NXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAE1NXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_ASIDE1NXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAAE1NXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VALE1NXS, handle_tlbi_el1),
 +      SYS_INSN(TLBI_VAALE1NXS, handle_tlbi_el1),
 +
 +      SYS_INSN(TLBI_IPAS2E1IS, handle_ipas2e1is),
 +      SYS_INSN(TLBI_RIPAS2E1IS, handle_ripas2e1is),
 +      SYS_INSN(TLBI_IPAS2LE1IS, handle_ipas2e1is),
 +      SYS_INSN(TLBI_RIPAS2LE1IS, handle_ripas2e1is),
 +
 +      SYS_INSN(TLBI_ALLE2OS, trap_undef),
 +      SYS_INSN(TLBI_VAE2OS, trap_undef),
 +      SYS_INSN(TLBI_ALLE1OS, handle_alle1is),
 +      SYS_INSN(TLBI_VALE2OS, trap_undef),
 +      SYS_INSN(TLBI_VMALLS12E1OS, handle_vmalls12e1is),
 +
 +      SYS_INSN(TLBI_RVAE2IS, trap_undef),
 +      SYS_INSN(TLBI_RVALE2IS, trap_undef),
 +
 +      SYS_INSN(TLBI_ALLE1IS, handle_alle1is),
 +      SYS_INSN(TLBI_VMALLS12E1IS, handle_vmalls12e1is),
 +      SYS_INSN(TLBI_IPAS2E1OS, handle_ipas2e1is),
 +      SYS_INSN(TLBI_IPAS2E1, handle_ipas2e1is),
 +      SYS_INSN(TLBI_RIPAS2E1, handle_ripas2e1is),
 +      SYS_INSN(TLBI_RIPAS2E1OS, handle_ripas2e1is),
 +      SYS_INSN(TLBI_IPAS2LE1OS, handle_ipas2e1is),
 +      SYS_INSN(TLBI_IPAS2LE1, handle_ipas2e1is),
 +      SYS_INSN(TLBI_RIPAS2LE1, handle_ripas2e1is),
 +      SYS_INSN(TLBI_RIPAS2LE1OS, handle_ripas2e1is),
 +      SYS_INSN(TLBI_RVAE2OS, trap_undef),
 +      SYS_INSN(TLBI_RVALE2OS, trap_undef),
 +      SYS_INSN(TLBI_RVAE2, trap_undef),
 +      SYS_INSN(TLBI_RVALE2, trap_undef),
 +      SYS_INSN(TLBI_ALLE1, handle_alle1is),
 +      SYS_INSN(TLBI_VMALLS12E1, handle_vmalls12e1is),
 +
 +      SYS_INSN(TLBI_IPAS2E1ISNXS, handle_ipas2e1is),
 +      SYS_INSN(TLBI_RIPAS2E1ISNXS, handle_ripas2e1is),
 +      SYS_INSN(TLBI_IPAS2LE1ISNXS, handle_ipas2e1is),
 +      SYS_INSN(TLBI_RIPAS2LE1ISNXS, handle_ripas2e1is),
 +
 +      SYS_INSN(TLBI_ALLE2OSNXS, trap_undef),
 +      SYS_INSN(TLBI_VAE2OSNXS, trap_undef),
 +      SYS_INSN(TLBI_ALLE1OSNXS, handle_alle1is),
 +      SYS_INSN(TLBI_VALE2OSNXS, trap_undef),
 +      SYS_INSN(TLBI_VMALLS12E1OSNXS, handle_vmalls12e1is),
 +
 +      SYS_INSN(TLBI_RVAE2ISNXS, trap_undef),
 +      SYS_INSN(TLBI_RVALE2ISNXS, trap_undef),
 +      SYS_INSN(TLBI_ALLE2ISNXS, trap_undef),
 +      SYS_INSN(TLBI_VAE2ISNXS, trap_undef),
 +
 +      SYS_INSN(TLBI_ALLE1ISNXS, handle_alle1is),
 +      SYS_INSN(TLBI_VALE2ISNXS, trap_undef),
 +      SYS_INSN(TLBI_VMALLS12E1ISNXS, handle_vmalls12e1is),
 +      SYS_INSN(TLBI_IPAS2E1OSNXS, handle_ipas2e1is),
 +      SYS_INSN(TLBI_IPAS2E1NXS, handle_ipas2e1is),
 +      SYS_INSN(TLBI_RIPAS2E1NXS, handle_ripas2e1is),
 +      SYS_INSN(TLBI_RIPAS2E1OSNXS, handle_ripas2e1is),
 +      SYS_INSN(TLBI_IPAS2LE1OSNXS, handle_ipas2e1is),
 +      SYS_INSN(TLBI_IPAS2LE1NXS, handle_ipas2e1is),
 +      SYS_INSN(TLBI_RIPAS2LE1NXS, handle_ripas2e1is),
 +      SYS_INSN(TLBI_RIPAS2LE1OSNXS, handle_ripas2e1is),
 +      SYS_INSN(TLBI_RVAE2OSNXS, trap_undef),
 +      SYS_INSN(TLBI_RVALE2OSNXS, trap_undef),
 +      SYS_INSN(TLBI_RVAE2NXS, trap_undef),
 +      SYS_INSN(TLBI_RVALE2NXS, trap_undef),
 +      SYS_INSN(TLBI_ALLE2NXS, trap_undef),
 +      SYS_INSN(TLBI_VAE2NXS, trap_undef),
 +      SYS_INSN(TLBI_ALLE1NXS, handle_alle1is),
 +      SYS_INSN(TLBI_VALE2NXS, trap_undef),
 +      SYS_INSN(TLBI_VMALLS12E1NXS, handle_vmalls12e1is),
  };
  
- static const struct sys_reg_desc *first_idreg;
  static bool trap_dbgdidr(struct kvm_vcpu *vcpu,
                        struct sys_reg_params *p,
                        const struct sys_reg_desc *r)