xref: /qemu/target/arm/tcg/tlb-insns.c (revision abbb82646a1fab2075aae3c9ea8acf63e9fa80f7)
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 
172*abbb8264SPeter Maydell static void tlbi_aa64_vmalle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
173*abbb8264SPeter Maydell                                     uint64_t value)
174*abbb8264SPeter Maydell {
175*abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
176*abbb8264SPeter Maydell     int mask = vae1_tlbmask(env);
177*abbb8264SPeter Maydell 
178*abbb8264SPeter Maydell     if (tlb_force_broadcast(env)) {
179*abbb8264SPeter Maydell         tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
180*abbb8264SPeter Maydell     } else {
181*abbb8264SPeter Maydell         tlb_flush_by_mmuidx(cs, mask);
182*abbb8264SPeter Maydell     }
183*abbb8264SPeter Maydell }
184*abbb8264SPeter Maydell 
185*abbb8264SPeter Maydell static void tlbi_aa64_alle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
186*abbb8264SPeter Maydell                                   uint64_t value)
187*abbb8264SPeter Maydell {
188*abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
189*abbb8264SPeter Maydell     int mask = alle1_tlbmask(env);
190*abbb8264SPeter Maydell 
191*abbb8264SPeter Maydell     tlb_flush_by_mmuidx(cs, mask);
192*abbb8264SPeter Maydell }
193*abbb8264SPeter Maydell 
194*abbb8264SPeter Maydell static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
195*abbb8264SPeter Maydell                                  uint64_t value)
196*abbb8264SPeter Maydell {
197*abbb8264SPeter Maydell     /*
198*abbb8264SPeter Maydell      * Invalidate by VA, EL1&0 (AArch64 version).
199*abbb8264SPeter Maydell      * Currently handles all of VAE1, VAAE1, VAALE1 and VALE1,
200*abbb8264SPeter Maydell      * since we don't support flush-for-specific-ASID-only or
201*abbb8264SPeter Maydell      * flush-last-level-only.
202*abbb8264SPeter Maydell      */
203*abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
204*abbb8264SPeter Maydell     int mask = vae1_tlbmask(env);
205*abbb8264SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
206*abbb8264SPeter Maydell     int bits = vae1_tlbbits(env, pageaddr);
207*abbb8264SPeter Maydell 
208*abbb8264SPeter Maydell     if (tlb_force_broadcast(env)) {
209*abbb8264SPeter Maydell         tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
210*abbb8264SPeter Maydell     } else {
211*abbb8264SPeter Maydell         tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
212*abbb8264SPeter Maydell     }
213*abbb8264SPeter Maydell }
214*abbb8264SPeter Maydell 
215*abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
216*abbb8264SPeter Maydell                                     uint64_t value)
217*abbb8264SPeter Maydell {
218*abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
219*abbb8264SPeter Maydell     int mask = ipas2e1_tlbmask(env, value);
220*abbb8264SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
221*abbb8264SPeter Maydell 
222*abbb8264SPeter Maydell     if (tlb_force_broadcast(env)) {
223*abbb8264SPeter Maydell         tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask);
224*abbb8264SPeter Maydell     } else {
225*abbb8264SPeter Maydell         tlb_flush_page_by_mmuidx(cs, pageaddr, mask);
226*abbb8264SPeter Maydell     }
227*abbb8264SPeter Maydell }
228*abbb8264SPeter Maydell 
229*abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
230*abbb8264SPeter Maydell                                       uint64_t value)
231*abbb8264SPeter Maydell {
232*abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
233*abbb8264SPeter Maydell     int mask = ipas2e1_tlbmask(env, value);
234*abbb8264SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
235*abbb8264SPeter Maydell 
236*abbb8264SPeter Maydell     tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask);
237*abbb8264SPeter Maydell }
238*abbb8264SPeter Maydell 
2391e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_not_v7_cp_reginfo[] = {
2401e32ee23SPeter Maydell     /*
2411e32ee23SPeter Maydell      * MMU TLB control. Note that the wildcarding means we cover not just
2421e32ee23SPeter Maydell      * the unified TLB ops but also the dside/iside/inner-shareable variants.
2431e32ee23SPeter Maydell      */
2441e32ee23SPeter Maydell     { .name = "TLBIALL", .cp = 15, .crn = 8, .crm = CP_ANY,
2451e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 0, .access = PL1_W, .writefn = tlbiall_write,
2461e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
2471e32ee23SPeter Maydell     { .name = "TLBIMVA", .cp = 15, .crn = 8, .crm = CP_ANY,
2481e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 1, .access = PL1_W, .writefn = tlbimva_write,
2491e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
2501e32ee23SPeter Maydell     { .name = "TLBIASID", .cp = 15, .crn = 8, .crm = CP_ANY,
2511e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 2, .access = PL1_W, .writefn = tlbiasid_write,
2521e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
2531e32ee23SPeter Maydell     { .name = "TLBIMVAA", .cp = 15, .crn = 8, .crm = CP_ANY,
2541e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 3, .access = PL1_W, .writefn = tlbimvaa_write,
2551e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
2561e32ee23SPeter Maydell };
2571e32ee23SPeter Maydell 
2581e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7_cp_reginfo[] = {
2591e32ee23SPeter Maydell     /* 32 bit ITLB invalidates */
2601e32ee23SPeter Maydell     { .name = "ITLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 0,
2611e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2621e32ee23SPeter Maydell       .writefn = tlbiall_write },
2631e32ee23SPeter Maydell     { .name = "ITLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
2641e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2651e32ee23SPeter Maydell       .writefn = tlbimva_write },
2661e32ee23SPeter Maydell     { .name = "ITLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 2,
2671e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2681e32ee23SPeter Maydell       .writefn = tlbiasid_write },
2691e32ee23SPeter Maydell     /* 32 bit DTLB invalidates */
2701e32ee23SPeter Maydell     { .name = "DTLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 0,
2711e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2721e32ee23SPeter Maydell       .writefn = tlbiall_write },
2731e32ee23SPeter Maydell     { .name = "DTLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
2741e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2751e32ee23SPeter Maydell       .writefn = tlbimva_write },
2761e32ee23SPeter Maydell     { .name = "DTLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 2,
2771e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2781e32ee23SPeter Maydell       .writefn = tlbiasid_write },
2791e32ee23SPeter Maydell     /* 32 bit TLB invalidates */
2801e32ee23SPeter Maydell     { .name = "TLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
2811e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2821e32ee23SPeter Maydell       .writefn = tlbiall_write },
2831e32ee23SPeter Maydell     { .name = "TLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
2841e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2851e32ee23SPeter Maydell       .writefn = tlbimva_write },
2861e32ee23SPeter Maydell     { .name = "TLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
2871e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2881e32ee23SPeter Maydell       .writefn = tlbiasid_write },
2891e32ee23SPeter Maydell     { .name = "TLBIMVAA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
2901e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2911e32ee23SPeter Maydell       .writefn = tlbimvaa_write },
2921e32ee23SPeter Maydell };
2931e32ee23SPeter Maydell 
2941e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7mp_cp_reginfo[] = {
2951e32ee23SPeter Maydell     /* 32 bit TLB invalidates, Inner Shareable */
2961e32ee23SPeter Maydell     { .name = "TLBIALLIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
2971e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
2981e32ee23SPeter Maydell       .writefn = tlbiall_is_write },
2991e32ee23SPeter Maydell     { .name = "TLBIMVAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
3001e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3011e32ee23SPeter Maydell       .writefn = tlbimva_is_write },
3021e32ee23SPeter Maydell     { .name = "TLBIASIDIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
3031e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3041e32ee23SPeter Maydell       .writefn = tlbiasid_is_write },
3051e32ee23SPeter Maydell     { .name = "TLBIMVAAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
3061e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3071e32ee23SPeter Maydell       .writefn = tlbimvaa_is_write },
3081e32ee23SPeter Maydell };
3091e32ee23SPeter Maydell 
3101e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v8_cp_reginfo[] = {
3111e32ee23SPeter Maydell     /* AArch32 TLB invalidate last level of translation table walk */
3121e32ee23SPeter Maydell     { .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
3131e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3141e32ee23SPeter Maydell       .writefn = tlbimva_is_write },
3151e32ee23SPeter Maydell     { .name = "TLBIMVAALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
3161e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3171e32ee23SPeter Maydell       .writefn = tlbimvaa_is_write },
3181e32ee23SPeter Maydell     { .name = "TLBIMVAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
3191e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3201e32ee23SPeter Maydell       .writefn = tlbimva_write },
3211e32ee23SPeter Maydell     { .name = "TLBIMVAAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
3221e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3231e32ee23SPeter Maydell       .writefn = tlbimvaa_write },
3241e32ee23SPeter Maydell     { .name = "TLBIMVALH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
3251e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3261e32ee23SPeter Maydell       .writefn = tlbimva_hyp_write },
3271e32ee23SPeter Maydell     { .name = "TLBIMVALHIS",
3281e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
3291e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3301e32ee23SPeter Maydell       .writefn = tlbimva_hyp_is_write },
3311e32ee23SPeter Maydell     { .name = "TLBIIPAS2",
3321e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
3331e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3341e32ee23SPeter Maydell       .writefn = tlbiipas2_hyp_write },
3351e32ee23SPeter Maydell     { .name = "TLBIIPAS2IS",
3361e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
3371e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3381e32ee23SPeter Maydell       .writefn = tlbiipas2is_hyp_write },
3391e32ee23SPeter Maydell     { .name = "TLBIIPAS2L",
3401e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
3411e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3421e32ee23SPeter Maydell       .writefn = tlbiipas2_hyp_write },
3431e32ee23SPeter Maydell     { .name = "TLBIIPAS2LIS",
3441e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
3451e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3461e32ee23SPeter Maydell       .writefn = tlbiipas2is_hyp_write },
347*abbb8264SPeter Maydell     /* AArch64 TLBI operations */
348*abbb8264SPeter Maydell     { .name = "TLBI_VMALLE1IS", .state = ARM_CP_STATE_AA64,
349*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
350*abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
351*abbb8264SPeter Maydell       .fgt = FGT_TLBIVMALLE1IS,
352*abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1is_write },
353*abbb8264SPeter Maydell     { .name = "TLBI_VAE1IS", .state = ARM_CP_STATE_AA64,
354*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
355*abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
356*abbb8264SPeter Maydell       .fgt = FGT_TLBIVAE1IS,
357*abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
358*abbb8264SPeter Maydell     { .name = "TLBI_ASIDE1IS", .state = ARM_CP_STATE_AA64,
359*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
360*abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
361*abbb8264SPeter Maydell       .fgt = FGT_TLBIASIDE1IS,
362*abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1is_write },
363*abbb8264SPeter Maydell     { .name = "TLBI_VAAE1IS", .state = ARM_CP_STATE_AA64,
364*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
365*abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
366*abbb8264SPeter Maydell       .fgt = FGT_TLBIVAAE1IS,
367*abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
368*abbb8264SPeter Maydell     { .name = "TLBI_VALE1IS", .state = ARM_CP_STATE_AA64,
369*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
370*abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
371*abbb8264SPeter Maydell       .fgt = FGT_TLBIVALE1IS,
372*abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
373*abbb8264SPeter Maydell     { .name = "TLBI_VAALE1IS", .state = ARM_CP_STATE_AA64,
374*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
375*abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
376*abbb8264SPeter Maydell       .fgt = FGT_TLBIVAALE1IS,
377*abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
378*abbb8264SPeter Maydell     { .name = "TLBI_VMALLE1", .state = ARM_CP_STATE_AA64,
379*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
380*abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
381*abbb8264SPeter Maydell       .fgt = FGT_TLBIVMALLE1,
382*abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1_write },
383*abbb8264SPeter Maydell     { .name = "TLBI_VAE1", .state = ARM_CP_STATE_AA64,
384*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
385*abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
386*abbb8264SPeter Maydell       .fgt = FGT_TLBIVAE1,
387*abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
388*abbb8264SPeter Maydell     { .name = "TLBI_ASIDE1", .state = ARM_CP_STATE_AA64,
389*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
390*abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
391*abbb8264SPeter Maydell       .fgt = FGT_TLBIASIDE1,
392*abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1_write },
393*abbb8264SPeter Maydell     { .name = "TLBI_VAAE1", .state = ARM_CP_STATE_AA64,
394*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
395*abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
396*abbb8264SPeter Maydell       .fgt = FGT_TLBIVAAE1,
397*abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
398*abbb8264SPeter Maydell     { .name = "TLBI_VALE1", .state = ARM_CP_STATE_AA64,
399*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
400*abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
401*abbb8264SPeter Maydell       .fgt = FGT_TLBIVALE1,
402*abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
403*abbb8264SPeter Maydell     { .name = "TLBI_VAALE1", .state = ARM_CP_STATE_AA64,
404*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
405*abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
406*abbb8264SPeter Maydell       .fgt = FGT_TLBIVAALE1,
407*abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
408*abbb8264SPeter Maydell     { .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64,
409*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
410*abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
411*abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1is_write },
412*abbb8264SPeter Maydell     { .name = "TLBI_IPAS2LE1IS", .state = ARM_CP_STATE_AA64,
413*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
414*abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
415*abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1is_write },
416*abbb8264SPeter Maydell     { .name = "TLBI_ALLE1IS", .state = ARM_CP_STATE_AA64,
417*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
418*abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
419*abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
420*abbb8264SPeter Maydell     { .name = "TLBI_VMALLS12E1IS", .state = ARM_CP_STATE_AA64,
421*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 6,
422*abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
423*abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
424*abbb8264SPeter Maydell     { .name = "TLBI_IPAS2E1", .state = ARM_CP_STATE_AA64,
425*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
426*abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
427*abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1_write },
428*abbb8264SPeter Maydell     { .name = "TLBI_IPAS2LE1", .state = ARM_CP_STATE_AA64,
429*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
430*abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
431*abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1_write },
432*abbb8264SPeter Maydell     { .name = "TLBI_ALLE1", .state = ARM_CP_STATE_AA64,
433*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
434*abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
435*abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1_write },
436*abbb8264SPeter Maydell     { .name = "TLBI_VMALLS12E1", .state = ARM_CP_STATE_AA64,
437*abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 6,
438*abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
439*abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
4401e32ee23SPeter Maydell };
4411e32ee23SPeter Maydell 
442d6b6da1fSPeter Maydell static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = {
443d6b6da1fSPeter Maydell     { .name = "TLBIALLNSNH",
444d6b6da1fSPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
445d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
446d6b6da1fSPeter Maydell       .writefn = tlbiall_nsnh_write },
447d6b6da1fSPeter Maydell     { .name = "TLBIALLNSNHIS",
448d6b6da1fSPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
449d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
450d6b6da1fSPeter Maydell       .writefn = tlbiall_nsnh_is_write },
451d6b6da1fSPeter Maydell     { .name = "TLBIALLH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
452d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
453d6b6da1fSPeter Maydell       .writefn = tlbiall_hyp_write },
454d6b6da1fSPeter Maydell     { .name = "TLBIALLHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
455d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
456d6b6da1fSPeter Maydell       .writefn = tlbiall_hyp_is_write },
457d6b6da1fSPeter Maydell     { .name = "TLBIMVAH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
458d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
459d6b6da1fSPeter Maydell       .writefn = tlbimva_hyp_write },
460d6b6da1fSPeter Maydell     { .name = "TLBIMVAHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
461d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
462d6b6da1fSPeter Maydell       .writefn = tlbimva_hyp_is_write },
463d6b6da1fSPeter Maydell };
464d6b6da1fSPeter Maydell 
4651e32ee23SPeter Maydell void define_tlb_insn_regs(ARMCPU *cpu)
4661e32ee23SPeter Maydell {
4671e32ee23SPeter Maydell     CPUARMState *env = &cpu->env;
4681e32ee23SPeter Maydell 
4691e32ee23SPeter Maydell     if (!arm_feature(env, ARM_FEATURE_V7)) {
4701e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_not_v7_cp_reginfo);
4711e32ee23SPeter Maydell     } else {
4721e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v7_cp_reginfo);
4731e32ee23SPeter Maydell     }
4741e32ee23SPeter Maydell     if (arm_feature(env, ARM_FEATURE_V7MP) &&
4751e32ee23SPeter Maydell         !arm_feature(env, ARM_FEATURE_PMSA)) {
4761e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v7mp_cp_reginfo);
4771e32ee23SPeter Maydell     }
4781e32ee23SPeter Maydell     if (arm_feature(env, ARM_FEATURE_V8)) {
4791e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v8_cp_reginfo);
4801e32ee23SPeter Maydell     }
481d6b6da1fSPeter Maydell     /*
482d6b6da1fSPeter Maydell      * We retain the existing logic for when to register these TLBI
483d6b6da1fSPeter Maydell      * ops (i.e. matching the condition for el2_cp_reginfo[] in
484d6b6da1fSPeter Maydell      * helper.c), but we will be able to simplify this later.
485d6b6da1fSPeter Maydell      */
486d6b6da1fSPeter Maydell     if (arm_feature(env, ARM_FEATURE_EL2)
487d6b6da1fSPeter Maydell         || (arm_feature(env, ARM_FEATURE_EL3)
488d6b6da1fSPeter Maydell             && arm_feature(env, ARM_FEATURE_V8))) {
489d6b6da1fSPeter Maydell         define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo);
490d6b6da1fSPeter Maydell     }
4911e32ee23SPeter Maydell }
492