xref: /qemu/target/arm/tcg/tlb-insns.c (revision 5991e5abe36e228143a6488718c71ba05da05cc3)
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