11e32ee23SPeter Maydell /* 21e32ee23SPeter Maydell * Helpers for TLBI insns 31e32ee23SPeter Maydell * 41e32ee23SPeter Maydell * This code is licensed under the GNU GPL v2 or later. 51e32ee23SPeter Maydell * 61e32ee23SPeter Maydell * SPDX-License-Identifier: GPL-2.0-or-later 71e32ee23SPeter Maydell */ 81e32ee23SPeter Maydell #include "qemu/osdep.h" 91e32ee23SPeter Maydell #include "exec/exec-all.h" 101e32ee23SPeter Maydell #include "cpu.h" 111e32ee23SPeter Maydell #include "internals.h" 121e32ee23SPeter Maydell #include "cpu-features.h" 131e32ee23SPeter Maydell #include "cpregs.h" 141e32ee23SPeter Maydell 151e32ee23SPeter Maydell /* IS variants of TLB operations must affect all cores */ 161e32ee23SPeter Maydell static void tlbiall_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 171e32ee23SPeter Maydell uint64_t value) 181e32ee23SPeter Maydell { 191e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 201e32ee23SPeter Maydell 211e32ee23SPeter Maydell tlb_flush_all_cpus_synced(cs); 221e32ee23SPeter Maydell } 231e32ee23SPeter Maydell 241e32ee23SPeter Maydell static void tlbiasid_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 251e32ee23SPeter Maydell uint64_t value) 261e32ee23SPeter Maydell { 271e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 281e32ee23SPeter Maydell 291e32ee23SPeter Maydell tlb_flush_all_cpus_synced(cs); 301e32ee23SPeter Maydell } 311e32ee23SPeter Maydell 321e32ee23SPeter Maydell static void tlbimva_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 331e32ee23SPeter Maydell uint64_t value) 341e32ee23SPeter Maydell { 351e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 361e32ee23SPeter Maydell 371e32ee23SPeter Maydell tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK); 381e32ee23SPeter Maydell } 391e32ee23SPeter Maydell 401e32ee23SPeter Maydell static void tlbimvaa_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 411e32ee23SPeter Maydell uint64_t value) 421e32ee23SPeter Maydell { 431e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 441e32ee23SPeter Maydell 451e32ee23SPeter Maydell tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK); 461e32ee23SPeter Maydell } 471e32ee23SPeter Maydell 481e32ee23SPeter Maydell static void tlbiall_write(CPUARMState *env, const ARMCPRegInfo *ri, 491e32ee23SPeter Maydell uint64_t value) 501e32ee23SPeter Maydell { 511e32ee23SPeter Maydell /* Invalidate all (TLBIALL) */ 521e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 531e32ee23SPeter Maydell 541e32ee23SPeter Maydell if (tlb_force_broadcast(env)) { 551e32ee23SPeter Maydell tlb_flush_all_cpus_synced(cs); 561e32ee23SPeter Maydell } else { 571e32ee23SPeter Maydell tlb_flush(cs); 581e32ee23SPeter Maydell } 591e32ee23SPeter Maydell } 601e32ee23SPeter Maydell 611e32ee23SPeter Maydell static void tlbimva_write(CPUARMState *env, const ARMCPRegInfo *ri, 621e32ee23SPeter Maydell uint64_t value) 631e32ee23SPeter Maydell { 641e32ee23SPeter Maydell /* Invalidate single TLB entry by MVA and ASID (TLBIMVA) */ 651e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 661e32ee23SPeter Maydell 671e32ee23SPeter Maydell value &= TARGET_PAGE_MASK; 681e32ee23SPeter Maydell if (tlb_force_broadcast(env)) { 691e32ee23SPeter Maydell tlb_flush_page_all_cpus_synced(cs, value); 701e32ee23SPeter Maydell } else { 711e32ee23SPeter Maydell tlb_flush_page(cs, value); 721e32ee23SPeter Maydell } 731e32ee23SPeter Maydell } 741e32ee23SPeter Maydell 751e32ee23SPeter Maydell static void tlbiasid_write(CPUARMState *env, const ARMCPRegInfo *ri, 761e32ee23SPeter Maydell uint64_t value) 771e32ee23SPeter Maydell { 781e32ee23SPeter Maydell /* Invalidate by ASID (TLBIASID) */ 791e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 801e32ee23SPeter Maydell 811e32ee23SPeter Maydell if (tlb_force_broadcast(env)) { 821e32ee23SPeter Maydell tlb_flush_all_cpus_synced(cs); 831e32ee23SPeter Maydell } else { 841e32ee23SPeter Maydell tlb_flush(cs); 851e32ee23SPeter Maydell } 861e32ee23SPeter Maydell } 871e32ee23SPeter Maydell 881e32ee23SPeter Maydell static void tlbimvaa_write(CPUARMState *env, const ARMCPRegInfo *ri, 891e32ee23SPeter Maydell uint64_t value) 901e32ee23SPeter Maydell { 911e32ee23SPeter Maydell /* Invalidate single entry by MVA, all ASIDs (TLBIMVAA) */ 921e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 931e32ee23SPeter Maydell 941e32ee23SPeter Maydell value &= TARGET_PAGE_MASK; 951e32ee23SPeter Maydell if (tlb_force_broadcast(env)) { 961e32ee23SPeter Maydell tlb_flush_page_all_cpus_synced(cs, value); 971e32ee23SPeter Maydell } else { 981e32ee23SPeter Maydell tlb_flush_page(cs, value); 991e32ee23SPeter Maydell } 1001e32ee23SPeter Maydell } 1011e32ee23SPeter Maydell 102d6b6da1fSPeter Maydell static void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri, 103d6b6da1fSPeter Maydell uint64_t value) 104d6b6da1fSPeter Maydell { 105d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 106d6b6da1fSPeter Maydell uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12); 107d6b6da1fSPeter Maydell 108d6b6da1fSPeter Maydell tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E2); 109d6b6da1fSPeter Maydell } 110d6b6da1fSPeter Maydell 111d6b6da1fSPeter Maydell static void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 112d6b6da1fSPeter Maydell uint64_t value) 113d6b6da1fSPeter Maydell { 114d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 115d6b6da1fSPeter Maydell uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12); 116d6b6da1fSPeter Maydell 117d6b6da1fSPeter Maydell tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, 118d6b6da1fSPeter Maydell ARMMMUIdxBit_E2); 119d6b6da1fSPeter Maydell } 120d6b6da1fSPeter Maydell 1211e32ee23SPeter Maydell static void tlbiipas2_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri, 1221e32ee23SPeter Maydell uint64_t value) 1231e32ee23SPeter Maydell { 1241e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 1251e32ee23SPeter Maydell uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12; 1261e32ee23SPeter Maydell 1271e32ee23SPeter Maydell tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_Stage2); 1281e32ee23SPeter Maydell } 1291e32ee23SPeter Maydell 1301e32ee23SPeter Maydell static void tlbiipas2is_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri, 1311e32ee23SPeter Maydell uint64_t value) 1321e32ee23SPeter Maydell { 1331e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 1341e32ee23SPeter Maydell uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12; 1351e32ee23SPeter Maydell 1361e32ee23SPeter Maydell tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, ARMMMUIdxBit_Stage2); 1371e32ee23SPeter Maydell } 1381e32ee23SPeter Maydell 139d6b6da1fSPeter Maydell static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri, 140d6b6da1fSPeter Maydell uint64_t value) 141d6b6da1fSPeter Maydell { 142d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 143d6b6da1fSPeter Maydell 144d6b6da1fSPeter Maydell tlb_flush_by_mmuidx(cs, alle1_tlbmask(env)); 145d6b6da1fSPeter Maydell } 146d6b6da1fSPeter Maydell 147d6b6da1fSPeter Maydell static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 148d6b6da1fSPeter Maydell uint64_t value) 149d6b6da1fSPeter Maydell { 150d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 151d6b6da1fSPeter Maydell 152d6b6da1fSPeter Maydell tlb_flush_by_mmuidx_all_cpus_synced(cs, alle1_tlbmask(env)); 153d6b6da1fSPeter Maydell } 154d6b6da1fSPeter Maydell 155d6b6da1fSPeter Maydell 156d6b6da1fSPeter Maydell static void tlbiall_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri, 157d6b6da1fSPeter Maydell uint64_t value) 158d6b6da1fSPeter Maydell { 159d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 160d6b6da1fSPeter Maydell 161d6b6da1fSPeter Maydell tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E2); 162d6b6da1fSPeter Maydell } 163d6b6da1fSPeter Maydell 164d6b6da1fSPeter Maydell static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 165d6b6da1fSPeter Maydell uint64_t value) 166d6b6da1fSPeter Maydell { 167d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 168d6b6da1fSPeter Maydell 169d6b6da1fSPeter Maydell tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E2); 170d6b6da1fSPeter Maydell } 171d6b6da1fSPeter Maydell 172abbb8264SPeter Maydell static void tlbi_aa64_vmalle1_write(CPUARMState *env, const ARMCPRegInfo *ri, 173abbb8264SPeter Maydell uint64_t value) 174abbb8264SPeter Maydell { 175abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 176abbb8264SPeter Maydell int mask = vae1_tlbmask(env); 177abbb8264SPeter Maydell 178abbb8264SPeter Maydell if (tlb_force_broadcast(env)) { 179abbb8264SPeter Maydell tlb_flush_by_mmuidx_all_cpus_synced(cs, mask); 180abbb8264SPeter Maydell } else { 181abbb8264SPeter Maydell tlb_flush_by_mmuidx(cs, mask); 182abbb8264SPeter Maydell } 183abbb8264SPeter Maydell } 184abbb8264SPeter Maydell 185abbb8264SPeter Maydell static void tlbi_aa64_alle1_write(CPUARMState *env, const ARMCPRegInfo *ri, 186abbb8264SPeter Maydell uint64_t value) 187abbb8264SPeter Maydell { 188abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 189abbb8264SPeter Maydell int mask = alle1_tlbmask(env); 190abbb8264SPeter Maydell 191abbb8264SPeter Maydell tlb_flush_by_mmuidx(cs, mask); 192abbb8264SPeter Maydell } 193abbb8264SPeter Maydell 1947cadf113SPeter Maydell static void tlbi_aa64_alle2_write(CPUARMState *env, const ARMCPRegInfo *ri, 1957cadf113SPeter Maydell uint64_t value) 1967cadf113SPeter Maydell { 1977cadf113SPeter Maydell CPUState *cs = env_cpu(env); 1987cadf113SPeter Maydell int mask = e2_tlbmask(env); 1997cadf113SPeter Maydell 2007cadf113SPeter Maydell tlb_flush_by_mmuidx(cs, mask); 2017cadf113SPeter Maydell } 2027cadf113SPeter Maydell 203*5991e5abSPeter Maydell static void tlbi_aa64_alle3_write(CPUARMState *env, const ARMCPRegInfo *ri, 204*5991e5abSPeter Maydell uint64_t value) 205*5991e5abSPeter Maydell { 206*5991e5abSPeter Maydell ARMCPU *cpu = env_archcpu(env); 207*5991e5abSPeter Maydell CPUState *cs = CPU(cpu); 208*5991e5abSPeter Maydell 209*5991e5abSPeter Maydell tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E3); 210*5991e5abSPeter Maydell } 211*5991e5abSPeter Maydell 2127cadf113SPeter Maydell static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri, 2137cadf113SPeter Maydell uint64_t value) 2147cadf113SPeter Maydell { 2157cadf113SPeter Maydell /* 2167cadf113SPeter Maydell * Invalidate by VA, EL2 2177cadf113SPeter Maydell * Currently handles both VAE2 and VALE2, since we don't support 2187cadf113SPeter Maydell * flush-last-level-only. 2197cadf113SPeter Maydell */ 2207cadf113SPeter Maydell CPUState *cs = env_cpu(env); 2217cadf113SPeter Maydell int mask = vae2_tlbmask(env); 2227cadf113SPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 2237cadf113SPeter Maydell int bits = vae2_tlbbits(env, pageaddr); 2247cadf113SPeter Maydell 2257cadf113SPeter Maydell tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits); 2267cadf113SPeter Maydell } 2277cadf113SPeter Maydell 228*5991e5abSPeter Maydell static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri, 229*5991e5abSPeter Maydell uint64_t value) 230*5991e5abSPeter Maydell { 231*5991e5abSPeter Maydell /* 232*5991e5abSPeter Maydell * Invalidate by VA, EL3 233*5991e5abSPeter Maydell * Currently handles both VAE3 and VALE3, since we don't support 234*5991e5abSPeter Maydell * flush-last-level-only. 235*5991e5abSPeter Maydell */ 236*5991e5abSPeter Maydell ARMCPU *cpu = env_archcpu(env); 237*5991e5abSPeter Maydell CPUState *cs = CPU(cpu); 238*5991e5abSPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 239*5991e5abSPeter Maydell 240*5991e5abSPeter Maydell tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E3); 241*5991e5abSPeter Maydell } 242*5991e5abSPeter Maydell 243abbb8264SPeter Maydell static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri, 244abbb8264SPeter Maydell uint64_t value) 245abbb8264SPeter Maydell { 246abbb8264SPeter Maydell /* 247abbb8264SPeter Maydell * Invalidate by VA, EL1&0 (AArch64 version). 248abbb8264SPeter Maydell * Currently handles all of VAE1, VAAE1, VAALE1 and VALE1, 249abbb8264SPeter Maydell * since we don't support flush-for-specific-ASID-only or 250abbb8264SPeter Maydell * flush-last-level-only. 251abbb8264SPeter Maydell */ 252abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 253abbb8264SPeter Maydell int mask = vae1_tlbmask(env); 254abbb8264SPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 255abbb8264SPeter Maydell int bits = vae1_tlbbits(env, pageaddr); 256abbb8264SPeter Maydell 257abbb8264SPeter Maydell if (tlb_force_broadcast(env)) { 258abbb8264SPeter Maydell tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits); 259abbb8264SPeter Maydell } else { 260abbb8264SPeter Maydell tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits); 261abbb8264SPeter Maydell } 262abbb8264SPeter Maydell } 263abbb8264SPeter Maydell 264abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri, 265abbb8264SPeter Maydell uint64_t value) 266abbb8264SPeter Maydell { 267abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 268abbb8264SPeter Maydell int mask = ipas2e1_tlbmask(env, value); 269abbb8264SPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 270abbb8264SPeter Maydell 271abbb8264SPeter Maydell if (tlb_force_broadcast(env)) { 272abbb8264SPeter Maydell tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask); 273abbb8264SPeter Maydell } else { 274abbb8264SPeter Maydell tlb_flush_page_by_mmuidx(cs, pageaddr, mask); 275abbb8264SPeter Maydell } 276abbb8264SPeter Maydell } 277abbb8264SPeter Maydell 278abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri, 279abbb8264SPeter Maydell uint64_t value) 280abbb8264SPeter Maydell { 281abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 282abbb8264SPeter Maydell int mask = ipas2e1_tlbmask(env, value); 283abbb8264SPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 284abbb8264SPeter Maydell 285abbb8264SPeter Maydell tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask); 286abbb8264SPeter Maydell } 287abbb8264SPeter Maydell 2881e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_not_v7_cp_reginfo[] = { 2891e32ee23SPeter Maydell /* 2901e32ee23SPeter Maydell * MMU TLB control. Note that the wildcarding means we cover not just 2911e32ee23SPeter Maydell * the unified TLB ops but also the dside/iside/inner-shareable variants. 2921e32ee23SPeter Maydell */ 2931e32ee23SPeter Maydell { .name = "TLBIALL", .cp = 15, .crn = 8, .crm = CP_ANY, 2941e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 0, .access = PL1_W, .writefn = tlbiall_write, 2951e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 2961e32ee23SPeter Maydell { .name = "TLBIMVA", .cp = 15, .crn = 8, .crm = CP_ANY, 2971e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 1, .access = PL1_W, .writefn = tlbimva_write, 2981e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 2991e32ee23SPeter Maydell { .name = "TLBIASID", .cp = 15, .crn = 8, .crm = CP_ANY, 3001e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 2, .access = PL1_W, .writefn = tlbiasid_write, 3011e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 3021e32ee23SPeter Maydell { .name = "TLBIMVAA", .cp = 15, .crn = 8, .crm = CP_ANY, 3031e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 3, .access = PL1_W, .writefn = tlbimvaa_write, 3041e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 3051e32ee23SPeter Maydell }; 3061e32ee23SPeter Maydell 3071e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7_cp_reginfo[] = { 3081e32ee23SPeter Maydell /* 32 bit ITLB invalidates */ 3091e32ee23SPeter Maydell { .name = "ITLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 0, 3101e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3111e32ee23SPeter Maydell .writefn = tlbiall_write }, 3121e32ee23SPeter Maydell { .name = "ITLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1, 3131e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3141e32ee23SPeter Maydell .writefn = tlbimva_write }, 3151e32ee23SPeter Maydell { .name = "ITLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 2, 3161e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3171e32ee23SPeter Maydell .writefn = tlbiasid_write }, 3181e32ee23SPeter Maydell /* 32 bit DTLB invalidates */ 3191e32ee23SPeter Maydell { .name = "DTLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 0, 3201e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3211e32ee23SPeter Maydell .writefn = tlbiall_write }, 3221e32ee23SPeter Maydell { .name = "DTLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1, 3231e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3241e32ee23SPeter Maydell .writefn = tlbimva_write }, 3251e32ee23SPeter Maydell { .name = "DTLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 2, 3261e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3271e32ee23SPeter Maydell .writefn = tlbiasid_write }, 3281e32ee23SPeter Maydell /* 32 bit TLB invalidates */ 3291e32ee23SPeter Maydell { .name = "TLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0, 3301e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3311e32ee23SPeter Maydell .writefn = tlbiall_write }, 3321e32ee23SPeter Maydell { .name = "TLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1, 3331e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3341e32ee23SPeter Maydell .writefn = tlbimva_write }, 3351e32ee23SPeter Maydell { .name = "TLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2, 3361e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3371e32ee23SPeter Maydell .writefn = tlbiasid_write }, 3381e32ee23SPeter Maydell { .name = "TLBIMVAA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3, 3391e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3401e32ee23SPeter Maydell .writefn = tlbimvaa_write }, 3411e32ee23SPeter Maydell }; 3421e32ee23SPeter Maydell 3431e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7mp_cp_reginfo[] = { 3441e32ee23SPeter Maydell /* 32 bit TLB invalidates, Inner Shareable */ 3451e32ee23SPeter Maydell { .name = "TLBIALLIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0, 3461e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3471e32ee23SPeter Maydell .writefn = tlbiall_is_write }, 3481e32ee23SPeter Maydell { .name = "TLBIMVAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1, 3491e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3501e32ee23SPeter Maydell .writefn = tlbimva_is_write }, 3511e32ee23SPeter Maydell { .name = "TLBIASIDIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2, 3521e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3531e32ee23SPeter Maydell .writefn = tlbiasid_is_write }, 3541e32ee23SPeter Maydell { .name = "TLBIMVAAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3, 3551e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3561e32ee23SPeter Maydell .writefn = tlbimvaa_is_write }, 3571e32ee23SPeter Maydell }; 3581e32ee23SPeter Maydell 3591e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v8_cp_reginfo[] = { 3601e32ee23SPeter Maydell /* AArch32 TLB invalidate last level of translation table walk */ 3611e32ee23SPeter Maydell { .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5, 3621e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3631e32ee23SPeter Maydell .writefn = tlbimva_is_write }, 3641e32ee23SPeter Maydell { .name = "TLBIMVAALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7, 3651e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3661e32ee23SPeter Maydell .writefn = tlbimvaa_is_write }, 3671e32ee23SPeter Maydell { .name = "TLBIMVAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5, 3681e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3691e32ee23SPeter Maydell .writefn = tlbimva_write }, 3701e32ee23SPeter Maydell { .name = "TLBIMVAAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7, 3711e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3721e32ee23SPeter Maydell .writefn = tlbimvaa_write }, 3731e32ee23SPeter Maydell { .name = "TLBIMVALH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5, 3741e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3751e32ee23SPeter Maydell .writefn = tlbimva_hyp_write }, 3761e32ee23SPeter Maydell { .name = "TLBIMVALHIS", 3771e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5, 3781e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3791e32ee23SPeter Maydell .writefn = tlbimva_hyp_is_write }, 3801e32ee23SPeter Maydell { .name = "TLBIIPAS2", 3811e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1, 3821e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3831e32ee23SPeter Maydell .writefn = tlbiipas2_hyp_write }, 3841e32ee23SPeter Maydell { .name = "TLBIIPAS2IS", 3851e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1, 3861e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3871e32ee23SPeter Maydell .writefn = tlbiipas2is_hyp_write }, 3881e32ee23SPeter Maydell { .name = "TLBIIPAS2L", 3891e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5, 3901e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3911e32ee23SPeter Maydell .writefn = tlbiipas2_hyp_write }, 3921e32ee23SPeter Maydell { .name = "TLBIIPAS2LIS", 3931e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5, 3941e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3951e32ee23SPeter Maydell .writefn = tlbiipas2is_hyp_write }, 396abbb8264SPeter Maydell /* AArch64 TLBI operations */ 397abbb8264SPeter Maydell { .name = "TLBI_VMALLE1IS", .state = ARM_CP_STATE_AA64, 398abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0, 399abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 400abbb8264SPeter Maydell .fgt = FGT_TLBIVMALLE1IS, 401abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1is_write }, 402abbb8264SPeter Maydell { .name = "TLBI_VAE1IS", .state = ARM_CP_STATE_AA64, 403abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1, 404abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 405abbb8264SPeter Maydell .fgt = FGT_TLBIVAE1IS, 406abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 407abbb8264SPeter Maydell { .name = "TLBI_ASIDE1IS", .state = ARM_CP_STATE_AA64, 408abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2, 409abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 410abbb8264SPeter Maydell .fgt = FGT_TLBIASIDE1IS, 411abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1is_write }, 412abbb8264SPeter Maydell { .name = "TLBI_VAAE1IS", .state = ARM_CP_STATE_AA64, 413abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3, 414abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 415abbb8264SPeter Maydell .fgt = FGT_TLBIVAAE1IS, 416abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 417abbb8264SPeter Maydell { .name = "TLBI_VALE1IS", .state = ARM_CP_STATE_AA64, 418abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5, 419abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 420abbb8264SPeter Maydell .fgt = FGT_TLBIVALE1IS, 421abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 422abbb8264SPeter Maydell { .name = "TLBI_VAALE1IS", .state = ARM_CP_STATE_AA64, 423abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7, 424abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 425abbb8264SPeter Maydell .fgt = FGT_TLBIVAALE1IS, 426abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 427abbb8264SPeter Maydell { .name = "TLBI_VMALLE1", .state = ARM_CP_STATE_AA64, 428abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0, 429abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 430abbb8264SPeter Maydell .fgt = FGT_TLBIVMALLE1, 431abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1_write }, 432abbb8264SPeter Maydell { .name = "TLBI_VAE1", .state = ARM_CP_STATE_AA64, 433abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1, 434abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 435abbb8264SPeter Maydell .fgt = FGT_TLBIVAE1, 436abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 437abbb8264SPeter Maydell { .name = "TLBI_ASIDE1", .state = ARM_CP_STATE_AA64, 438abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2, 439abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 440abbb8264SPeter Maydell .fgt = FGT_TLBIASIDE1, 441abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1_write }, 442abbb8264SPeter Maydell { .name = "TLBI_VAAE1", .state = ARM_CP_STATE_AA64, 443abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3, 444abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 445abbb8264SPeter Maydell .fgt = FGT_TLBIVAAE1, 446abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 447abbb8264SPeter Maydell { .name = "TLBI_VALE1", .state = ARM_CP_STATE_AA64, 448abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5, 449abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 450abbb8264SPeter Maydell .fgt = FGT_TLBIVALE1, 451abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 452abbb8264SPeter Maydell { .name = "TLBI_VAALE1", .state = ARM_CP_STATE_AA64, 453abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7, 454abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 455abbb8264SPeter Maydell .fgt = FGT_TLBIVAALE1, 456abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 457abbb8264SPeter Maydell { .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64, 458abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1, 459abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 460abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1is_write }, 461abbb8264SPeter Maydell { .name = "TLBI_IPAS2LE1IS", .state = ARM_CP_STATE_AA64, 462abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5, 463abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 464abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1is_write }, 465abbb8264SPeter Maydell { .name = "TLBI_ALLE1IS", .state = ARM_CP_STATE_AA64, 466abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4, 467abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 468abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1is_write }, 469abbb8264SPeter Maydell { .name = "TLBI_VMALLS12E1IS", .state = ARM_CP_STATE_AA64, 470abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 6, 471abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 472abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1is_write }, 473abbb8264SPeter Maydell { .name = "TLBI_IPAS2E1", .state = ARM_CP_STATE_AA64, 474abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1, 475abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 476abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1_write }, 477abbb8264SPeter Maydell { .name = "TLBI_IPAS2LE1", .state = ARM_CP_STATE_AA64, 478abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5, 479abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 480abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1_write }, 481abbb8264SPeter Maydell { .name = "TLBI_ALLE1", .state = ARM_CP_STATE_AA64, 482abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4, 483abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 484abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1_write }, 485abbb8264SPeter Maydell { .name = "TLBI_VMALLS12E1", .state = ARM_CP_STATE_AA64, 486abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 6, 487abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 488abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1is_write }, 4891e32ee23SPeter Maydell }; 4901e32ee23SPeter Maydell 491d6b6da1fSPeter Maydell static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = { 492d6b6da1fSPeter Maydell { .name = "TLBIALLNSNH", 493d6b6da1fSPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4, 494d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 495d6b6da1fSPeter Maydell .writefn = tlbiall_nsnh_write }, 496d6b6da1fSPeter Maydell { .name = "TLBIALLNSNHIS", 497d6b6da1fSPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4, 498d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 499d6b6da1fSPeter Maydell .writefn = tlbiall_nsnh_is_write }, 500d6b6da1fSPeter Maydell { .name = "TLBIALLH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0, 501d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 502d6b6da1fSPeter Maydell .writefn = tlbiall_hyp_write }, 503d6b6da1fSPeter Maydell { .name = "TLBIALLHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0, 504d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 505d6b6da1fSPeter Maydell .writefn = tlbiall_hyp_is_write }, 506d6b6da1fSPeter Maydell { .name = "TLBIMVAH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1, 507d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 508d6b6da1fSPeter Maydell .writefn = tlbimva_hyp_write }, 509d6b6da1fSPeter Maydell { .name = "TLBIMVAHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1, 510d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 511d6b6da1fSPeter Maydell .writefn = tlbimva_hyp_is_write }, 5127cadf113SPeter Maydell { .name = "TLBI_ALLE2", .state = ARM_CP_STATE_AA64, 5137cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0, 5147cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 5157cadf113SPeter Maydell .writefn = tlbi_aa64_alle2_write }, 5167cadf113SPeter Maydell { .name = "TLBI_VAE2", .state = ARM_CP_STATE_AA64, 5177cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1, 5187cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 5197cadf113SPeter Maydell .writefn = tlbi_aa64_vae2_write }, 5207cadf113SPeter Maydell { .name = "TLBI_VALE2", .state = ARM_CP_STATE_AA64, 5217cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5, 5227cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 5237cadf113SPeter Maydell .writefn = tlbi_aa64_vae2_write }, 5247cadf113SPeter Maydell { .name = "TLBI_ALLE2IS", .state = ARM_CP_STATE_AA64, 5257cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0, 5267cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 5277cadf113SPeter Maydell .writefn = tlbi_aa64_alle2is_write }, 5287cadf113SPeter Maydell { .name = "TLBI_VAE2IS", .state = ARM_CP_STATE_AA64, 5297cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1, 5307cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 5317cadf113SPeter Maydell .writefn = tlbi_aa64_vae2is_write }, 5327cadf113SPeter Maydell { .name = "TLBI_VALE2IS", .state = ARM_CP_STATE_AA64, 5337cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5, 5347cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 5357cadf113SPeter Maydell .writefn = tlbi_aa64_vae2is_write }, 536d6b6da1fSPeter Maydell }; 537d6b6da1fSPeter Maydell 538*5991e5abSPeter Maydell static const ARMCPRegInfo tlbi_el3_cp_reginfo[] = { 539*5991e5abSPeter Maydell { .name = "TLBI_ALLE3IS", .state = ARM_CP_STATE_AA64, 540*5991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 0, 541*5991e5abSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 542*5991e5abSPeter Maydell .writefn = tlbi_aa64_alle3is_write }, 543*5991e5abSPeter Maydell { .name = "TLBI_VAE3IS", .state = ARM_CP_STATE_AA64, 544*5991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 1, 545*5991e5abSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 546*5991e5abSPeter Maydell .writefn = tlbi_aa64_vae3is_write }, 547*5991e5abSPeter Maydell { .name = "TLBI_VALE3IS", .state = ARM_CP_STATE_AA64, 548*5991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 5, 549*5991e5abSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 550*5991e5abSPeter Maydell .writefn = tlbi_aa64_vae3is_write }, 551*5991e5abSPeter Maydell { .name = "TLBI_ALLE3", .state = ARM_CP_STATE_AA64, 552*5991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 0, 553*5991e5abSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 554*5991e5abSPeter Maydell .writefn = tlbi_aa64_alle3_write }, 555*5991e5abSPeter Maydell { .name = "TLBI_VAE3", .state = ARM_CP_STATE_AA64, 556*5991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 1, 557*5991e5abSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 558*5991e5abSPeter Maydell .writefn = tlbi_aa64_vae3_write }, 559*5991e5abSPeter Maydell { .name = "TLBI_VALE3", .state = ARM_CP_STATE_AA64, 560*5991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 5, 561*5991e5abSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 562*5991e5abSPeter Maydell .writefn = tlbi_aa64_vae3_write }, 563*5991e5abSPeter Maydell }; 564*5991e5abSPeter Maydell 5651e32ee23SPeter Maydell void define_tlb_insn_regs(ARMCPU *cpu) 5661e32ee23SPeter Maydell { 5671e32ee23SPeter Maydell CPUARMState *env = &cpu->env; 5681e32ee23SPeter Maydell 5691e32ee23SPeter Maydell if (!arm_feature(env, ARM_FEATURE_V7)) { 5701e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_not_v7_cp_reginfo); 5711e32ee23SPeter Maydell } else { 5721e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v7_cp_reginfo); 5731e32ee23SPeter Maydell } 5741e32ee23SPeter Maydell if (arm_feature(env, ARM_FEATURE_V7MP) && 5751e32ee23SPeter Maydell !arm_feature(env, ARM_FEATURE_PMSA)) { 5761e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v7mp_cp_reginfo); 5771e32ee23SPeter Maydell } 5781e32ee23SPeter Maydell if (arm_feature(env, ARM_FEATURE_V8)) { 5791e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v8_cp_reginfo); 5801e32ee23SPeter Maydell } 581d6b6da1fSPeter Maydell /* 582d6b6da1fSPeter Maydell * We retain the existing logic for when to register these TLBI 583d6b6da1fSPeter Maydell * ops (i.e. matching the condition for el2_cp_reginfo[] in 584d6b6da1fSPeter Maydell * helper.c), but we will be able to simplify this later. 585d6b6da1fSPeter Maydell */ 586d6b6da1fSPeter Maydell if (arm_feature(env, ARM_FEATURE_EL2) 587d6b6da1fSPeter Maydell || (arm_feature(env, ARM_FEATURE_EL3) 588d6b6da1fSPeter Maydell && arm_feature(env, ARM_FEATURE_V8))) { 589d6b6da1fSPeter Maydell define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo); 590d6b6da1fSPeter Maydell } 591*5991e5abSPeter Maydell if (arm_feature(env, ARM_FEATURE_EL3)) { 592*5991e5abSPeter Maydell define_arm_cp_regs(cpu, tlbi_el3_cp_reginfo); 593*5991e5abSPeter Maydell } 5941e32ee23SPeter Maydell } 595