xref: /qemu/target/arm/tcg/tlb-insns.c (revision 7cadf1139db301d603ff5f1f0a3cc56391f68d12)
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 
194*7cadf113SPeter Maydell static void tlbi_aa64_alle2_write(CPUARMState *env, const ARMCPRegInfo *ri,
195*7cadf113SPeter Maydell                                   uint64_t value)
196*7cadf113SPeter Maydell {
197*7cadf113SPeter Maydell     CPUState *cs = env_cpu(env);
198*7cadf113SPeter Maydell     int mask = e2_tlbmask(env);
199*7cadf113SPeter Maydell 
200*7cadf113SPeter Maydell     tlb_flush_by_mmuidx(cs, mask);
201*7cadf113SPeter Maydell }
202*7cadf113SPeter Maydell 
203*7cadf113SPeter Maydell static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri,
204*7cadf113SPeter Maydell                                  uint64_t value)
205*7cadf113SPeter Maydell {
206*7cadf113SPeter Maydell     /*
207*7cadf113SPeter Maydell      * Invalidate by VA, EL2
208*7cadf113SPeter Maydell      * Currently handles both VAE2 and VALE2, since we don't support
209*7cadf113SPeter Maydell      * flush-last-level-only.
210*7cadf113SPeter Maydell      */
211*7cadf113SPeter Maydell     CPUState *cs = env_cpu(env);
212*7cadf113SPeter Maydell     int mask = vae2_tlbmask(env);
213*7cadf113SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
214*7cadf113SPeter Maydell     int bits = vae2_tlbbits(env, pageaddr);
215*7cadf113SPeter Maydell 
216*7cadf113SPeter Maydell     tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
217*7cadf113SPeter Maydell }
218*7cadf113SPeter Maydell 
219abbb8264SPeter Maydell static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
220abbb8264SPeter Maydell                                  uint64_t value)
221abbb8264SPeter Maydell {
222abbb8264SPeter Maydell     /*
223abbb8264SPeter Maydell      * Invalidate by VA, EL1&0 (AArch64 version).
224abbb8264SPeter Maydell      * Currently handles all of VAE1, VAAE1, VAALE1 and VALE1,
225abbb8264SPeter Maydell      * since we don't support flush-for-specific-ASID-only or
226abbb8264SPeter Maydell      * flush-last-level-only.
227abbb8264SPeter Maydell      */
228abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
229abbb8264SPeter Maydell     int mask = vae1_tlbmask(env);
230abbb8264SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
231abbb8264SPeter Maydell     int bits = vae1_tlbbits(env, pageaddr);
232abbb8264SPeter Maydell 
233abbb8264SPeter Maydell     if (tlb_force_broadcast(env)) {
234abbb8264SPeter Maydell         tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
235abbb8264SPeter Maydell     } else {
236abbb8264SPeter Maydell         tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
237abbb8264SPeter Maydell     }
238abbb8264SPeter Maydell }
239abbb8264SPeter Maydell 
240abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
241abbb8264SPeter Maydell                                     uint64_t value)
242abbb8264SPeter Maydell {
243abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
244abbb8264SPeter Maydell     int mask = ipas2e1_tlbmask(env, value);
245abbb8264SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
246abbb8264SPeter Maydell 
247abbb8264SPeter Maydell     if (tlb_force_broadcast(env)) {
248abbb8264SPeter Maydell         tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask);
249abbb8264SPeter Maydell     } else {
250abbb8264SPeter Maydell         tlb_flush_page_by_mmuidx(cs, pageaddr, mask);
251abbb8264SPeter Maydell     }
252abbb8264SPeter Maydell }
253abbb8264SPeter Maydell 
254abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
255abbb8264SPeter Maydell                                       uint64_t value)
256abbb8264SPeter Maydell {
257abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
258abbb8264SPeter Maydell     int mask = ipas2e1_tlbmask(env, value);
259abbb8264SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
260abbb8264SPeter Maydell 
261abbb8264SPeter Maydell     tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask);
262abbb8264SPeter Maydell }
263abbb8264SPeter Maydell 
2641e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_not_v7_cp_reginfo[] = {
2651e32ee23SPeter Maydell     /*
2661e32ee23SPeter Maydell      * MMU TLB control. Note that the wildcarding means we cover not just
2671e32ee23SPeter Maydell      * the unified TLB ops but also the dside/iside/inner-shareable variants.
2681e32ee23SPeter Maydell      */
2691e32ee23SPeter Maydell     { .name = "TLBIALL", .cp = 15, .crn = 8, .crm = CP_ANY,
2701e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 0, .access = PL1_W, .writefn = tlbiall_write,
2711e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
2721e32ee23SPeter Maydell     { .name = "TLBIMVA", .cp = 15, .crn = 8, .crm = CP_ANY,
2731e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 1, .access = PL1_W, .writefn = tlbimva_write,
2741e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
2751e32ee23SPeter Maydell     { .name = "TLBIASID", .cp = 15, .crn = 8, .crm = CP_ANY,
2761e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 2, .access = PL1_W, .writefn = tlbiasid_write,
2771e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
2781e32ee23SPeter Maydell     { .name = "TLBIMVAA", .cp = 15, .crn = 8, .crm = CP_ANY,
2791e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 3, .access = PL1_W, .writefn = tlbimvaa_write,
2801e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
2811e32ee23SPeter Maydell };
2821e32ee23SPeter Maydell 
2831e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7_cp_reginfo[] = {
2841e32ee23SPeter Maydell     /* 32 bit ITLB invalidates */
2851e32ee23SPeter Maydell     { .name = "ITLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 0,
2861e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2871e32ee23SPeter Maydell       .writefn = tlbiall_write },
2881e32ee23SPeter Maydell     { .name = "ITLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
2891e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2901e32ee23SPeter Maydell       .writefn = tlbimva_write },
2911e32ee23SPeter Maydell     { .name = "ITLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 2,
2921e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2931e32ee23SPeter Maydell       .writefn = tlbiasid_write },
2941e32ee23SPeter Maydell     /* 32 bit DTLB invalidates */
2951e32ee23SPeter Maydell     { .name = "DTLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 0,
2961e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
2971e32ee23SPeter Maydell       .writefn = tlbiall_write },
2981e32ee23SPeter Maydell     { .name = "DTLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
2991e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3001e32ee23SPeter Maydell       .writefn = tlbimva_write },
3011e32ee23SPeter Maydell     { .name = "DTLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 2,
3021e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3031e32ee23SPeter Maydell       .writefn = tlbiasid_write },
3041e32ee23SPeter Maydell     /* 32 bit TLB invalidates */
3051e32ee23SPeter Maydell     { .name = "TLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
3061e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3071e32ee23SPeter Maydell       .writefn = tlbiall_write },
3081e32ee23SPeter Maydell     { .name = "TLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
3091e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3101e32ee23SPeter Maydell       .writefn = tlbimva_write },
3111e32ee23SPeter Maydell     { .name = "TLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
3121e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3131e32ee23SPeter Maydell       .writefn = tlbiasid_write },
3141e32ee23SPeter Maydell     { .name = "TLBIMVAA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
3151e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3161e32ee23SPeter Maydell       .writefn = tlbimvaa_write },
3171e32ee23SPeter Maydell };
3181e32ee23SPeter Maydell 
3191e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7mp_cp_reginfo[] = {
3201e32ee23SPeter Maydell     /* 32 bit TLB invalidates, Inner Shareable */
3211e32ee23SPeter Maydell     { .name = "TLBIALLIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
3221e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3231e32ee23SPeter Maydell       .writefn = tlbiall_is_write },
3241e32ee23SPeter Maydell     { .name = "TLBIMVAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
3251e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3261e32ee23SPeter Maydell       .writefn = tlbimva_is_write },
3271e32ee23SPeter Maydell     { .name = "TLBIASIDIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
3281e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3291e32ee23SPeter Maydell       .writefn = tlbiasid_is_write },
3301e32ee23SPeter Maydell     { .name = "TLBIMVAAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
3311e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3321e32ee23SPeter Maydell       .writefn = tlbimvaa_is_write },
3331e32ee23SPeter Maydell };
3341e32ee23SPeter Maydell 
3351e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v8_cp_reginfo[] = {
3361e32ee23SPeter Maydell     /* AArch32 TLB invalidate last level of translation table walk */
3371e32ee23SPeter Maydell     { .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
3381e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3391e32ee23SPeter Maydell       .writefn = tlbimva_is_write },
3401e32ee23SPeter Maydell     { .name = "TLBIMVAALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
3411e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3421e32ee23SPeter Maydell       .writefn = tlbimvaa_is_write },
3431e32ee23SPeter Maydell     { .name = "TLBIMVAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
3441e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3451e32ee23SPeter Maydell       .writefn = tlbimva_write },
3461e32ee23SPeter Maydell     { .name = "TLBIMVAAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
3471e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3481e32ee23SPeter Maydell       .writefn = tlbimvaa_write },
3491e32ee23SPeter Maydell     { .name = "TLBIMVALH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
3501e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3511e32ee23SPeter Maydell       .writefn = tlbimva_hyp_write },
3521e32ee23SPeter Maydell     { .name = "TLBIMVALHIS",
3531e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
3541e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3551e32ee23SPeter Maydell       .writefn = tlbimva_hyp_is_write },
3561e32ee23SPeter Maydell     { .name = "TLBIIPAS2",
3571e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
3581e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3591e32ee23SPeter Maydell       .writefn = tlbiipas2_hyp_write },
3601e32ee23SPeter Maydell     { .name = "TLBIIPAS2IS",
3611e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
3621e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3631e32ee23SPeter Maydell       .writefn = tlbiipas2is_hyp_write },
3641e32ee23SPeter Maydell     { .name = "TLBIIPAS2L",
3651e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
3661e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3671e32ee23SPeter Maydell       .writefn = tlbiipas2_hyp_write },
3681e32ee23SPeter Maydell     { .name = "TLBIIPAS2LIS",
3691e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
3701e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3711e32ee23SPeter Maydell       .writefn = tlbiipas2is_hyp_write },
372abbb8264SPeter Maydell     /* AArch64 TLBI operations */
373abbb8264SPeter Maydell     { .name = "TLBI_VMALLE1IS", .state = ARM_CP_STATE_AA64,
374abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
375abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
376abbb8264SPeter Maydell       .fgt = FGT_TLBIVMALLE1IS,
377abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1is_write },
378abbb8264SPeter Maydell     { .name = "TLBI_VAE1IS", .state = ARM_CP_STATE_AA64,
379abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
380abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
381abbb8264SPeter Maydell       .fgt = FGT_TLBIVAE1IS,
382abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
383abbb8264SPeter Maydell     { .name = "TLBI_ASIDE1IS", .state = ARM_CP_STATE_AA64,
384abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
385abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
386abbb8264SPeter Maydell       .fgt = FGT_TLBIASIDE1IS,
387abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1is_write },
388abbb8264SPeter Maydell     { .name = "TLBI_VAAE1IS", .state = ARM_CP_STATE_AA64,
389abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
390abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
391abbb8264SPeter Maydell       .fgt = FGT_TLBIVAAE1IS,
392abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
393abbb8264SPeter Maydell     { .name = "TLBI_VALE1IS", .state = ARM_CP_STATE_AA64,
394abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
395abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
396abbb8264SPeter Maydell       .fgt = FGT_TLBIVALE1IS,
397abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
398abbb8264SPeter Maydell     { .name = "TLBI_VAALE1IS", .state = ARM_CP_STATE_AA64,
399abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
400abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
401abbb8264SPeter Maydell       .fgt = FGT_TLBIVAALE1IS,
402abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
403abbb8264SPeter Maydell     { .name = "TLBI_VMALLE1", .state = ARM_CP_STATE_AA64,
404abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
405abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
406abbb8264SPeter Maydell       .fgt = FGT_TLBIVMALLE1,
407abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1_write },
408abbb8264SPeter Maydell     { .name = "TLBI_VAE1", .state = ARM_CP_STATE_AA64,
409abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
410abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
411abbb8264SPeter Maydell       .fgt = FGT_TLBIVAE1,
412abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
413abbb8264SPeter Maydell     { .name = "TLBI_ASIDE1", .state = ARM_CP_STATE_AA64,
414abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
415abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
416abbb8264SPeter Maydell       .fgt = FGT_TLBIASIDE1,
417abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1_write },
418abbb8264SPeter Maydell     { .name = "TLBI_VAAE1", .state = ARM_CP_STATE_AA64,
419abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
420abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
421abbb8264SPeter Maydell       .fgt = FGT_TLBIVAAE1,
422abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
423abbb8264SPeter Maydell     { .name = "TLBI_VALE1", .state = ARM_CP_STATE_AA64,
424abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
425abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
426abbb8264SPeter Maydell       .fgt = FGT_TLBIVALE1,
427abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
428abbb8264SPeter Maydell     { .name = "TLBI_VAALE1", .state = ARM_CP_STATE_AA64,
429abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
430abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
431abbb8264SPeter Maydell       .fgt = FGT_TLBIVAALE1,
432abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
433abbb8264SPeter Maydell     { .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64,
434abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
435abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
436abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1is_write },
437abbb8264SPeter Maydell     { .name = "TLBI_IPAS2LE1IS", .state = ARM_CP_STATE_AA64,
438abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
439abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
440abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1is_write },
441abbb8264SPeter Maydell     { .name = "TLBI_ALLE1IS", .state = ARM_CP_STATE_AA64,
442abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
443abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
444abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
445abbb8264SPeter Maydell     { .name = "TLBI_VMALLS12E1IS", .state = ARM_CP_STATE_AA64,
446abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 6,
447abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
448abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
449abbb8264SPeter Maydell     { .name = "TLBI_IPAS2E1", .state = ARM_CP_STATE_AA64,
450abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
451abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
452abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1_write },
453abbb8264SPeter Maydell     { .name = "TLBI_IPAS2LE1", .state = ARM_CP_STATE_AA64,
454abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
455abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
456abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1_write },
457abbb8264SPeter Maydell     { .name = "TLBI_ALLE1", .state = ARM_CP_STATE_AA64,
458abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
459abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
460abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1_write },
461abbb8264SPeter Maydell     { .name = "TLBI_VMALLS12E1", .state = ARM_CP_STATE_AA64,
462abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 6,
463abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
464abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
4651e32ee23SPeter Maydell };
4661e32ee23SPeter Maydell 
467d6b6da1fSPeter Maydell static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = {
468d6b6da1fSPeter Maydell     { .name = "TLBIALLNSNH",
469d6b6da1fSPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
470d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
471d6b6da1fSPeter Maydell       .writefn = tlbiall_nsnh_write },
472d6b6da1fSPeter Maydell     { .name = "TLBIALLNSNHIS",
473d6b6da1fSPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
474d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
475d6b6da1fSPeter Maydell       .writefn = tlbiall_nsnh_is_write },
476d6b6da1fSPeter Maydell     { .name = "TLBIALLH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
477d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
478d6b6da1fSPeter Maydell       .writefn = tlbiall_hyp_write },
479d6b6da1fSPeter Maydell     { .name = "TLBIALLHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
480d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
481d6b6da1fSPeter Maydell       .writefn = tlbiall_hyp_is_write },
482d6b6da1fSPeter Maydell     { .name = "TLBIMVAH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
483d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
484d6b6da1fSPeter Maydell       .writefn = tlbimva_hyp_write },
485d6b6da1fSPeter Maydell     { .name = "TLBIMVAHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
486d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
487d6b6da1fSPeter Maydell       .writefn = tlbimva_hyp_is_write },
488*7cadf113SPeter Maydell     { .name = "TLBI_ALLE2", .state = ARM_CP_STATE_AA64,
489*7cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
490*7cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
491*7cadf113SPeter Maydell       .writefn = tlbi_aa64_alle2_write },
492*7cadf113SPeter Maydell     { .name = "TLBI_VAE2", .state = ARM_CP_STATE_AA64,
493*7cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
494*7cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
495*7cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2_write },
496*7cadf113SPeter Maydell     { .name = "TLBI_VALE2", .state = ARM_CP_STATE_AA64,
497*7cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
498*7cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
499*7cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2_write },
500*7cadf113SPeter Maydell     { .name = "TLBI_ALLE2IS", .state = ARM_CP_STATE_AA64,
501*7cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
502*7cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
503*7cadf113SPeter Maydell       .writefn = tlbi_aa64_alle2is_write },
504*7cadf113SPeter Maydell     { .name = "TLBI_VAE2IS", .state = ARM_CP_STATE_AA64,
505*7cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
506*7cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
507*7cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2is_write },
508*7cadf113SPeter Maydell     { .name = "TLBI_VALE2IS", .state = ARM_CP_STATE_AA64,
509*7cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
510*7cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
511*7cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2is_write },
512d6b6da1fSPeter Maydell };
513d6b6da1fSPeter Maydell 
5141e32ee23SPeter Maydell void define_tlb_insn_regs(ARMCPU *cpu)
5151e32ee23SPeter Maydell {
5161e32ee23SPeter Maydell     CPUARMState *env = &cpu->env;
5171e32ee23SPeter Maydell 
5181e32ee23SPeter Maydell     if (!arm_feature(env, ARM_FEATURE_V7)) {
5191e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_not_v7_cp_reginfo);
5201e32ee23SPeter Maydell     } else {
5211e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v7_cp_reginfo);
5221e32ee23SPeter Maydell     }
5231e32ee23SPeter Maydell     if (arm_feature(env, ARM_FEATURE_V7MP) &&
5241e32ee23SPeter Maydell         !arm_feature(env, ARM_FEATURE_PMSA)) {
5251e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v7mp_cp_reginfo);
5261e32ee23SPeter Maydell     }
5271e32ee23SPeter Maydell     if (arm_feature(env, ARM_FEATURE_V8)) {
5281e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v8_cp_reginfo);
5291e32ee23SPeter Maydell     }
530d6b6da1fSPeter Maydell     /*
531d6b6da1fSPeter Maydell      * We retain the existing logic for when to register these TLBI
532d6b6da1fSPeter Maydell      * ops (i.e. matching the condition for el2_cp_reginfo[] in
533d6b6da1fSPeter Maydell      * helper.c), but we will be able to simplify this later.
534d6b6da1fSPeter Maydell      */
535d6b6da1fSPeter Maydell     if (arm_feature(env, ARM_FEATURE_EL2)
536d6b6da1fSPeter Maydell         || (arm_feature(env, ARM_FEATURE_EL3)
537d6b6da1fSPeter Maydell             && arm_feature(env, ARM_FEATURE_V8))) {
538d6b6da1fSPeter Maydell         define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo);
539d6b6da1fSPeter Maydell     }
5401e32ee23SPeter Maydell }
541