xref: /qemu/target/arm/tcg/tlb-insns.c (revision d6b6da1fc84173d1d8e8777c487c21ffeab5f5ce)
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 
102*d6b6da1fSPeter Maydell static void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
103*d6b6da1fSPeter Maydell                               uint64_t value)
104*d6b6da1fSPeter Maydell {
105*d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
106*d6b6da1fSPeter Maydell     uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
107*d6b6da1fSPeter Maydell 
108*d6b6da1fSPeter Maydell     tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E2);
109*d6b6da1fSPeter Maydell }
110*d6b6da1fSPeter Maydell 
111*d6b6da1fSPeter Maydell static void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
112*d6b6da1fSPeter Maydell                                  uint64_t value)
113*d6b6da1fSPeter Maydell {
114*d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
115*d6b6da1fSPeter Maydell     uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
116*d6b6da1fSPeter Maydell 
117*d6b6da1fSPeter Maydell     tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr,
118*d6b6da1fSPeter Maydell                                              ARMMMUIdxBit_E2);
119*d6b6da1fSPeter Maydell }
120*d6b6da1fSPeter 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 
139*d6b6da1fSPeter Maydell static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri,
140*d6b6da1fSPeter Maydell                                uint64_t value)
141*d6b6da1fSPeter Maydell {
142*d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
143*d6b6da1fSPeter Maydell 
144*d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx(cs, alle1_tlbmask(env));
145*d6b6da1fSPeter Maydell }
146*d6b6da1fSPeter Maydell 
147*d6b6da1fSPeter Maydell static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
148*d6b6da1fSPeter Maydell                                   uint64_t value)
149*d6b6da1fSPeter Maydell {
150*d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
151*d6b6da1fSPeter Maydell 
152*d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, alle1_tlbmask(env));
153*d6b6da1fSPeter Maydell }
154*d6b6da1fSPeter Maydell 
155*d6b6da1fSPeter Maydell 
156*d6b6da1fSPeter Maydell static void tlbiall_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
157*d6b6da1fSPeter Maydell                               uint64_t value)
158*d6b6da1fSPeter Maydell {
159*d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
160*d6b6da1fSPeter Maydell 
161*d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E2);
162*d6b6da1fSPeter Maydell }
163*d6b6da1fSPeter Maydell 
164*d6b6da1fSPeter Maydell static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
165*d6b6da1fSPeter Maydell                                  uint64_t value)
166*d6b6da1fSPeter Maydell {
167*d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
168*d6b6da1fSPeter Maydell 
169*d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E2);
170*d6b6da1fSPeter Maydell }
171*d6b6da1fSPeter Maydell 
1721e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_not_v7_cp_reginfo[] = {
1731e32ee23SPeter Maydell     /*
1741e32ee23SPeter Maydell      * MMU TLB control. Note that the wildcarding means we cover not just
1751e32ee23SPeter Maydell      * the unified TLB ops but also the dside/iside/inner-shareable variants.
1761e32ee23SPeter Maydell      */
1771e32ee23SPeter Maydell     { .name = "TLBIALL", .cp = 15, .crn = 8, .crm = CP_ANY,
1781e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 0, .access = PL1_W, .writefn = tlbiall_write,
1791e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
1801e32ee23SPeter Maydell     { .name = "TLBIMVA", .cp = 15, .crn = 8, .crm = CP_ANY,
1811e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 1, .access = PL1_W, .writefn = tlbimva_write,
1821e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
1831e32ee23SPeter Maydell     { .name = "TLBIASID", .cp = 15, .crn = 8, .crm = CP_ANY,
1841e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 2, .access = PL1_W, .writefn = tlbiasid_write,
1851e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
1861e32ee23SPeter Maydell     { .name = "TLBIMVAA", .cp = 15, .crn = 8, .crm = CP_ANY,
1871e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 3, .access = PL1_W, .writefn = tlbimvaa_write,
1881e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
1891e32ee23SPeter Maydell };
1901e32ee23SPeter Maydell 
1911e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7_cp_reginfo[] = {
1921e32ee23SPeter Maydell     /* 32 bit ITLB invalidates */
1931e32ee23SPeter Maydell     { .name = "ITLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 0,
1941e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
1951e32ee23SPeter Maydell       .writefn = tlbiall_write },
1961e32ee23SPeter Maydell     { .name = "ITLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
1971e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
1981e32ee23SPeter Maydell       .writefn = tlbimva_write },
1991e32ee23SPeter Maydell     { .name = "ITLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 2,
2001e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2011e32ee23SPeter Maydell       .writefn = tlbiasid_write },
2021e32ee23SPeter Maydell     /* 32 bit DTLB invalidates */
2031e32ee23SPeter Maydell     { .name = "DTLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 0,
2041e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2051e32ee23SPeter Maydell       .writefn = tlbiall_write },
2061e32ee23SPeter Maydell     { .name = "DTLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
2071e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2081e32ee23SPeter Maydell       .writefn = tlbimva_write },
2091e32ee23SPeter Maydell     { .name = "DTLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 2,
2101e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2111e32ee23SPeter Maydell       .writefn = tlbiasid_write },
2121e32ee23SPeter Maydell     /* 32 bit TLB invalidates */
2131e32ee23SPeter Maydell     { .name = "TLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
2141e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2151e32ee23SPeter Maydell       .writefn = tlbiall_write },
2161e32ee23SPeter Maydell     { .name = "TLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
2171e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2181e32ee23SPeter Maydell       .writefn = tlbimva_write },
2191e32ee23SPeter Maydell     { .name = "TLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
2201e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2211e32ee23SPeter Maydell       .writefn = tlbiasid_write },
2221e32ee23SPeter Maydell     { .name = "TLBIMVAA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
2231e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2241e32ee23SPeter Maydell       .writefn = tlbimvaa_write },
2251e32ee23SPeter Maydell };
2261e32ee23SPeter Maydell 
2271e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7mp_cp_reginfo[] = {
2281e32ee23SPeter Maydell     /* 32 bit TLB invalidates, Inner Shareable */
2291e32ee23SPeter Maydell     { .name = "TLBIALLIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
2301e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
2311e32ee23SPeter Maydell       .writefn = tlbiall_is_write },
2321e32ee23SPeter Maydell     { .name = "TLBIMVAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
2331e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
2341e32ee23SPeter Maydell       .writefn = tlbimva_is_write },
2351e32ee23SPeter Maydell     { .name = "TLBIASIDIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
2361e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
2371e32ee23SPeter Maydell       .writefn = tlbiasid_is_write },
2381e32ee23SPeter Maydell     { .name = "TLBIMVAAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
2391e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
2401e32ee23SPeter Maydell       .writefn = tlbimvaa_is_write },
2411e32ee23SPeter Maydell };
2421e32ee23SPeter Maydell 
2431e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v8_cp_reginfo[] = {
2441e32ee23SPeter Maydell     /* AArch32 TLB invalidate last level of translation table walk */
2451e32ee23SPeter Maydell     { .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
2461e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
2471e32ee23SPeter Maydell       .writefn = tlbimva_is_write },
2481e32ee23SPeter Maydell     { .name = "TLBIMVAALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
2491e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
2501e32ee23SPeter Maydell       .writefn = tlbimvaa_is_write },
2511e32ee23SPeter Maydell     { .name = "TLBIMVAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
2521e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2531e32ee23SPeter Maydell       .writefn = tlbimva_write },
2541e32ee23SPeter Maydell     { .name = "TLBIMVAAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
2551e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2561e32ee23SPeter Maydell       .writefn = tlbimvaa_write },
2571e32ee23SPeter Maydell     { .name = "TLBIMVALH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
2581e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
2591e32ee23SPeter Maydell       .writefn = tlbimva_hyp_write },
2601e32ee23SPeter Maydell     { .name = "TLBIMVALHIS",
2611e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
2621e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
2631e32ee23SPeter Maydell       .writefn = tlbimva_hyp_is_write },
2641e32ee23SPeter Maydell     { .name = "TLBIIPAS2",
2651e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
2661e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
2671e32ee23SPeter Maydell       .writefn = tlbiipas2_hyp_write },
2681e32ee23SPeter Maydell     { .name = "TLBIIPAS2IS",
2691e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
2701e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
2711e32ee23SPeter Maydell       .writefn = tlbiipas2is_hyp_write },
2721e32ee23SPeter Maydell     { .name = "TLBIIPAS2L",
2731e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
2741e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
2751e32ee23SPeter Maydell       .writefn = tlbiipas2_hyp_write },
2761e32ee23SPeter Maydell     { .name = "TLBIIPAS2LIS",
2771e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
2781e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
2791e32ee23SPeter Maydell       .writefn = tlbiipas2is_hyp_write },
2801e32ee23SPeter Maydell };
2811e32ee23SPeter Maydell 
282*d6b6da1fSPeter Maydell static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = {
283*d6b6da1fSPeter Maydell     { .name = "TLBIALLNSNH",
284*d6b6da1fSPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
285*d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
286*d6b6da1fSPeter Maydell       .writefn = tlbiall_nsnh_write },
287*d6b6da1fSPeter Maydell     { .name = "TLBIALLNSNHIS",
288*d6b6da1fSPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
289*d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
290*d6b6da1fSPeter Maydell       .writefn = tlbiall_nsnh_is_write },
291*d6b6da1fSPeter Maydell     { .name = "TLBIALLH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
292*d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
293*d6b6da1fSPeter Maydell       .writefn = tlbiall_hyp_write },
294*d6b6da1fSPeter Maydell     { .name = "TLBIALLHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
295*d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
296*d6b6da1fSPeter Maydell       .writefn = tlbiall_hyp_is_write },
297*d6b6da1fSPeter Maydell     { .name = "TLBIMVAH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
298*d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
299*d6b6da1fSPeter Maydell       .writefn = tlbimva_hyp_write },
300*d6b6da1fSPeter Maydell     { .name = "TLBIMVAHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
301*d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
302*d6b6da1fSPeter Maydell       .writefn = tlbimva_hyp_is_write },
303*d6b6da1fSPeter Maydell };
304*d6b6da1fSPeter Maydell 
3051e32ee23SPeter Maydell void define_tlb_insn_regs(ARMCPU *cpu)
3061e32ee23SPeter Maydell {
3071e32ee23SPeter Maydell     CPUARMState *env = &cpu->env;
3081e32ee23SPeter Maydell 
3091e32ee23SPeter Maydell     if (!arm_feature(env, ARM_FEATURE_V7)) {
3101e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_not_v7_cp_reginfo);
3111e32ee23SPeter Maydell     } else {
3121e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v7_cp_reginfo);
3131e32ee23SPeter Maydell     }
3141e32ee23SPeter Maydell     if (arm_feature(env, ARM_FEATURE_V7MP) &&
3151e32ee23SPeter Maydell         !arm_feature(env, ARM_FEATURE_PMSA)) {
3161e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v7mp_cp_reginfo);
3171e32ee23SPeter Maydell     }
3181e32ee23SPeter Maydell     if (arm_feature(env, ARM_FEATURE_V8)) {
3191e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v8_cp_reginfo);
3201e32ee23SPeter Maydell     }
321*d6b6da1fSPeter Maydell     /*
322*d6b6da1fSPeter Maydell      * We retain the existing logic for when to register these TLBI
323*d6b6da1fSPeter Maydell      * ops (i.e. matching the condition for el2_cp_reginfo[] in
324*d6b6da1fSPeter Maydell      * helper.c), but we will be able to simplify this later.
325*d6b6da1fSPeter Maydell      */
326*d6b6da1fSPeter Maydell     if (arm_feature(env, ARM_FEATURE_EL2)
327*d6b6da1fSPeter Maydell         || (arm_feature(env, ARM_FEATURE_EL3)
328*d6b6da1fSPeter Maydell             && arm_feature(env, ARM_FEATURE_V8))) {
329*d6b6da1fSPeter Maydell         define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo);
330*d6b6da1fSPeter Maydell     }
3311e32ee23SPeter Maydell }
332