KVM: arm64: nv: Add handling of NXS-flavoured TLBI operations
authorMarc Zyngier <maz@kernel.org>
Fri, 14 Jun 2024 14:45:52 +0000 (15:45 +0100)
committerOliver Upton <oliver.upton@linux.dev>
Wed, 19 Jun 2024 08:14:38 +0000 (08:14 +0000)
Latest kid on the block: NXS (Non-eXtra-Slow) TLBI operations.

Let's add those in bulk (NSH, ISH, OSH, both normal and range)
as they directly map to their XS (the standard ones) counterparts.

Not a lot to say about them, they are basically useless.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20240614144552.2773592-17-maz@kernel.org
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/kvm/hyp/vhe/tlb.c
arch/arm64/kvm/sys_regs.c

index 18e30f03f3f5f31257e5fcd11e58ba8363cff829..3d50a1bd2bdbcb1d18093b2854435c37dff06fd6 100644 (file)
@@ -227,6 +227,7 @@ void __kvm_flush_vm_context(void)
  * - a TLBI targeting EL2 S1 is remapped to EL1 S1
  * - a non-shareable TLBI is upgraded to being inner-shareable
  * - an outer-shareable TLBI is also mapped to inner-shareable
+ * - an nXS TLBI is upgraded to XS
  */
 int __kvm_tlbi_s1e2(struct kvm_s2_mmu *mmu, u64 va, u64 sys_encoding)
 {
@@ -250,6 +251,12 @@ int __kvm_tlbi_s1e2(struct kvm_s2_mmu *mmu, u64 va, u64 sys_encoding)
        case OP_TLBI_VMALLE1:
        case OP_TLBI_VMALLE1IS:
        case OP_TLBI_VMALLE1OS:
+       case OP_TLBI_ALLE2NXS:
+       case OP_TLBI_ALLE2ISNXS:
+       case OP_TLBI_ALLE2OSNXS:
+       case OP_TLBI_VMALLE1NXS:
+       case OP_TLBI_VMALLE1ISNXS:
+       case OP_TLBI_VMALLE1OSNXS:
                __tlbi(vmalle1is);
                break;
        case OP_TLBI_VAE2:
@@ -258,6 +265,12 @@ int __kvm_tlbi_s1e2(struct kvm_s2_mmu *mmu, u64 va, u64 sys_encoding)
        case OP_TLBI_VAE1:
        case OP_TLBI_VAE1IS:
        case OP_TLBI_VAE1OS:
+       case OP_TLBI_VAE2NXS:
+       case OP_TLBI_VAE2ISNXS:
+       case OP_TLBI_VAE2OSNXS:
+       case OP_TLBI_VAE1NXS:
+       case OP_TLBI_VAE1ISNXS:
+       case OP_TLBI_VAE1OSNXS:
                __tlbi(vae1is, va);
                break;
        case OP_TLBI_VALE2:
@@ -266,21 +279,36 @@ int __kvm_tlbi_s1e2(struct kvm_s2_mmu *mmu, u64 va, u64 sys_encoding)
        case OP_TLBI_VALE1:
        case OP_TLBI_VALE1IS:
        case OP_TLBI_VALE1OS:
+       case OP_TLBI_VALE2NXS:
+       case OP_TLBI_VALE2ISNXS:
+       case OP_TLBI_VALE2OSNXS:
+       case OP_TLBI_VALE1NXS:
+       case OP_TLBI_VALE1ISNXS:
+       case OP_TLBI_VALE1OSNXS:
                __tlbi(vale1is, va);
                break;
        case OP_TLBI_ASIDE1:
        case OP_TLBI_ASIDE1IS:
        case OP_TLBI_ASIDE1OS:
+       case OP_TLBI_ASIDE1NXS:
+       case OP_TLBI_ASIDE1ISNXS:
+       case OP_TLBI_ASIDE1OSNXS:
                __tlbi(aside1is, va);
                break;
        case OP_TLBI_VAAE1:
        case OP_TLBI_VAAE1IS:
        case OP_TLBI_VAAE1OS:
+       case OP_TLBI_VAAE1NXS:
+       case OP_TLBI_VAAE1ISNXS:
+       case OP_TLBI_VAAE1OSNXS:
                __tlbi(vaae1is, va);
                break;
        case OP_TLBI_VAALE1:
        case OP_TLBI_VAALE1IS:
        case OP_TLBI_VAALE1OS:
+       case OP_TLBI_VAALE1NXS:
+       case OP_TLBI_VAALE1ISNXS:
+       case OP_TLBI_VAALE1OSNXS:
                __tlbi(vaale1is, va);
                break;
        case OP_TLBI_RVAE2:
@@ -289,6 +317,12 @@ int __kvm_tlbi_s1e2(struct kvm_s2_mmu *mmu, u64 va, u64 sys_encoding)
        case OP_TLBI_RVAE1:
        case OP_TLBI_RVAE1IS:
        case OP_TLBI_RVAE1OS:
+       case OP_TLBI_RVAE2NXS:
+       case OP_TLBI_RVAE2ISNXS:
+       case OP_TLBI_RVAE2OSNXS:
+       case OP_TLBI_RVAE1NXS:
+       case OP_TLBI_RVAE1ISNXS:
+       case OP_TLBI_RVAE1OSNXS:
                __tlbi(rvae1is, va);
                break;
        case OP_TLBI_RVALE2:
@@ -297,16 +331,28 @@ int __kvm_tlbi_s1e2(struct kvm_s2_mmu *mmu, u64 va, u64 sys_encoding)
        case OP_TLBI_RVALE1:
        case OP_TLBI_RVALE1IS:
        case OP_TLBI_RVALE1OS:
+       case OP_TLBI_RVALE2NXS:
+       case OP_TLBI_RVALE2ISNXS:
+       case OP_TLBI_RVALE2OSNXS:
+       case OP_TLBI_RVALE1NXS:
+       case OP_TLBI_RVALE1ISNXS:
+       case OP_TLBI_RVALE1OSNXS:
                __tlbi(rvale1is, va);
                break;
        case OP_TLBI_RVAAE1:
        case OP_TLBI_RVAAE1IS:
        case OP_TLBI_RVAAE1OS:
+       case OP_TLBI_RVAAE1NXS:
+       case OP_TLBI_RVAAE1ISNXS:
+       case OP_TLBI_RVAAE1OSNXS:
                __tlbi(rvaae1is, va);
                break;
        case OP_TLBI_RVAALE1:
        case OP_TLBI_RVAALE1IS:
        case OP_TLBI_RVAALE1OS:
+       case OP_TLBI_RVAALE1NXS:
+       case OP_TLBI_RVAALE1ISNXS:
+       case OP_TLBI_RVAALE1OSNXS:
                __tlbi(rvaale1is, va);
                break;
        default:
index f6edcb8635770e2d68a522e89d55702522c649bc..803cd5f16e43b8b40f010b1b9573b262442a7cbf 100644 (file)
@@ -3046,6 +3046,42 @@ static struct sys_reg_desc sys_insn_descs[] = {
        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),
@@ -3076,6 +3112,43 @@ static struct sys_reg_desc sys_insn_descs[] = {
        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;