xref: /qemu/target/arm/tcg/tlb-insns.c (revision b0f7cd357218a0697b03e009e3cbc74d22a8133b)
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"
965593799SPeter Maydell #include "qemu/log.h"
101e32ee23SPeter Maydell #include "exec/exec-all.h"
111e32ee23SPeter Maydell #include "cpu.h"
121e32ee23SPeter Maydell #include "internals.h"
131e32ee23SPeter Maydell #include "cpu-features.h"
141e32ee23SPeter Maydell #include "cpregs.h"
151e32ee23SPeter Maydell 
161e32ee23SPeter Maydell /* IS variants of TLB operations must affect all cores */
171e32ee23SPeter Maydell static void tlbiall_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
181e32ee23SPeter Maydell                              uint64_t value)
191e32ee23SPeter Maydell {
201e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
211e32ee23SPeter Maydell 
221e32ee23SPeter Maydell     tlb_flush_all_cpus_synced(cs);
231e32ee23SPeter Maydell }
241e32ee23SPeter Maydell 
251e32ee23SPeter Maydell static void tlbiasid_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
261e32ee23SPeter Maydell                              uint64_t value)
271e32ee23SPeter Maydell {
281e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
291e32ee23SPeter Maydell 
301e32ee23SPeter Maydell     tlb_flush_all_cpus_synced(cs);
311e32ee23SPeter Maydell }
321e32ee23SPeter Maydell 
331e32ee23SPeter Maydell static void tlbimva_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
341e32ee23SPeter Maydell                              uint64_t value)
351e32ee23SPeter Maydell {
361e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
371e32ee23SPeter Maydell 
381e32ee23SPeter Maydell     tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK);
391e32ee23SPeter Maydell }
401e32ee23SPeter Maydell 
411e32ee23SPeter Maydell static void tlbimvaa_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
421e32ee23SPeter Maydell                              uint64_t value)
431e32ee23SPeter Maydell {
441e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
451e32ee23SPeter Maydell 
461e32ee23SPeter Maydell     tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK);
471e32ee23SPeter Maydell }
481e32ee23SPeter Maydell 
491e32ee23SPeter Maydell static void tlbiall_write(CPUARMState *env, const ARMCPRegInfo *ri,
501e32ee23SPeter Maydell                           uint64_t value)
511e32ee23SPeter Maydell {
521e32ee23SPeter Maydell     /* Invalidate all (TLBIALL) */
531e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
541e32ee23SPeter Maydell 
551e32ee23SPeter Maydell     if (tlb_force_broadcast(env)) {
561e32ee23SPeter Maydell         tlb_flush_all_cpus_synced(cs);
571e32ee23SPeter Maydell     } else {
581e32ee23SPeter Maydell         tlb_flush(cs);
591e32ee23SPeter Maydell     }
601e32ee23SPeter Maydell }
611e32ee23SPeter Maydell 
621e32ee23SPeter Maydell static void tlbimva_write(CPUARMState *env, const ARMCPRegInfo *ri,
631e32ee23SPeter Maydell                           uint64_t value)
641e32ee23SPeter Maydell {
651e32ee23SPeter Maydell     /* Invalidate single TLB entry by MVA and ASID (TLBIMVA) */
661e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
671e32ee23SPeter Maydell 
681e32ee23SPeter Maydell     value &= TARGET_PAGE_MASK;
691e32ee23SPeter Maydell     if (tlb_force_broadcast(env)) {
701e32ee23SPeter Maydell         tlb_flush_page_all_cpus_synced(cs, value);
711e32ee23SPeter Maydell     } else {
721e32ee23SPeter Maydell         tlb_flush_page(cs, value);
731e32ee23SPeter Maydell     }
741e32ee23SPeter Maydell }
751e32ee23SPeter Maydell 
761e32ee23SPeter Maydell static void tlbiasid_write(CPUARMState *env, const ARMCPRegInfo *ri,
771e32ee23SPeter Maydell                            uint64_t value)
781e32ee23SPeter Maydell {
791e32ee23SPeter Maydell     /* Invalidate by ASID (TLBIASID) */
801e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
811e32ee23SPeter Maydell 
821e32ee23SPeter Maydell     if (tlb_force_broadcast(env)) {
831e32ee23SPeter Maydell         tlb_flush_all_cpus_synced(cs);
841e32ee23SPeter Maydell     } else {
851e32ee23SPeter Maydell         tlb_flush(cs);
861e32ee23SPeter Maydell     }
871e32ee23SPeter Maydell }
881e32ee23SPeter Maydell 
891e32ee23SPeter Maydell static void tlbimvaa_write(CPUARMState *env, const ARMCPRegInfo *ri,
901e32ee23SPeter Maydell                            uint64_t value)
911e32ee23SPeter Maydell {
921e32ee23SPeter Maydell     /* Invalidate single entry by MVA, all ASIDs (TLBIMVAA) */
931e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
941e32ee23SPeter Maydell 
951e32ee23SPeter Maydell     value &= TARGET_PAGE_MASK;
961e32ee23SPeter Maydell     if (tlb_force_broadcast(env)) {
971e32ee23SPeter Maydell         tlb_flush_page_all_cpus_synced(cs, value);
981e32ee23SPeter Maydell     } else {
991e32ee23SPeter Maydell         tlb_flush_page(cs, value);
1001e32ee23SPeter Maydell     }
1011e32ee23SPeter Maydell }
1021e32ee23SPeter Maydell 
103d6b6da1fSPeter Maydell static void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
104d6b6da1fSPeter Maydell                               uint64_t value)
105d6b6da1fSPeter Maydell {
106d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
107d6b6da1fSPeter Maydell     uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
108d6b6da1fSPeter Maydell 
109d6b6da1fSPeter Maydell     tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E2);
110d6b6da1fSPeter Maydell }
111d6b6da1fSPeter Maydell 
112d6b6da1fSPeter Maydell static void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
113d6b6da1fSPeter Maydell                                  uint64_t value)
114d6b6da1fSPeter Maydell {
115d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
116d6b6da1fSPeter Maydell     uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
117d6b6da1fSPeter Maydell 
118d6b6da1fSPeter Maydell     tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr,
119d6b6da1fSPeter Maydell                                              ARMMMUIdxBit_E2);
120d6b6da1fSPeter Maydell }
121d6b6da1fSPeter Maydell 
1221e32ee23SPeter Maydell static void tlbiipas2_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
1231e32ee23SPeter Maydell                                 uint64_t value)
1241e32ee23SPeter Maydell {
1251e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
1261e32ee23SPeter Maydell     uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12;
1271e32ee23SPeter Maydell 
1281e32ee23SPeter Maydell     tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_Stage2);
1291e32ee23SPeter Maydell }
1301e32ee23SPeter Maydell 
1311e32ee23SPeter Maydell static void tlbiipas2is_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
1321e32ee23SPeter Maydell                                 uint64_t value)
1331e32ee23SPeter Maydell {
1341e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
1351e32ee23SPeter Maydell     uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12;
1361e32ee23SPeter Maydell 
1371e32ee23SPeter Maydell     tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, ARMMMUIdxBit_Stage2);
1381e32ee23SPeter Maydell }
1391e32ee23SPeter Maydell 
140d6b6da1fSPeter Maydell static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri,
141d6b6da1fSPeter Maydell                                uint64_t value)
142d6b6da1fSPeter Maydell {
143d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
144d6b6da1fSPeter Maydell 
145d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx(cs, alle1_tlbmask(env));
146d6b6da1fSPeter Maydell }
147d6b6da1fSPeter Maydell 
148d6b6da1fSPeter Maydell static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
149d6b6da1fSPeter Maydell                                   uint64_t value)
150d6b6da1fSPeter Maydell {
151d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
152d6b6da1fSPeter Maydell 
153d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, alle1_tlbmask(env));
154d6b6da1fSPeter Maydell }
155d6b6da1fSPeter Maydell 
156d6b6da1fSPeter Maydell 
157d6b6da1fSPeter Maydell static void tlbiall_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
158d6b6da1fSPeter Maydell                               uint64_t value)
159d6b6da1fSPeter Maydell {
160d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
161d6b6da1fSPeter Maydell 
162d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E2);
163d6b6da1fSPeter Maydell }
164d6b6da1fSPeter Maydell 
165d6b6da1fSPeter Maydell static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
166d6b6da1fSPeter Maydell                                  uint64_t value)
167d6b6da1fSPeter Maydell {
168d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
169d6b6da1fSPeter Maydell 
170d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E2);
171d6b6da1fSPeter Maydell }
172d6b6da1fSPeter Maydell 
173abbb8264SPeter Maydell static void tlbi_aa64_vmalle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
174abbb8264SPeter Maydell                                     uint64_t value)
175abbb8264SPeter Maydell {
176abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
177abbb8264SPeter Maydell     int mask = vae1_tlbmask(env);
178abbb8264SPeter Maydell 
179abbb8264SPeter Maydell     if (tlb_force_broadcast(env)) {
180abbb8264SPeter Maydell         tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
181abbb8264SPeter Maydell     } else {
182abbb8264SPeter Maydell         tlb_flush_by_mmuidx(cs, mask);
183abbb8264SPeter Maydell     }
184abbb8264SPeter Maydell }
185abbb8264SPeter Maydell 
186abbb8264SPeter Maydell static void tlbi_aa64_alle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
187abbb8264SPeter Maydell                                   uint64_t value)
188abbb8264SPeter Maydell {
189abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
190abbb8264SPeter Maydell     int mask = alle1_tlbmask(env);
191abbb8264SPeter Maydell 
192abbb8264SPeter Maydell     tlb_flush_by_mmuidx(cs, mask);
193abbb8264SPeter Maydell }
194abbb8264SPeter Maydell 
1957cadf113SPeter Maydell static void tlbi_aa64_alle2_write(CPUARMState *env, const ARMCPRegInfo *ri,
1967cadf113SPeter Maydell                                   uint64_t value)
1977cadf113SPeter Maydell {
1987cadf113SPeter Maydell     CPUState *cs = env_cpu(env);
1997cadf113SPeter Maydell     int mask = e2_tlbmask(env);
2007cadf113SPeter Maydell 
2017cadf113SPeter Maydell     tlb_flush_by_mmuidx(cs, mask);
2027cadf113SPeter Maydell }
2037cadf113SPeter Maydell 
2045991e5abSPeter Maydell static void tlbi_aa64_alle3_write(CPUARMState *env, const ARMCPRegInfo *ri,
2055991e5abSPeter Maydell                                   uint64_t value)
2065991e5abSPeter Maydell {
2075991e5abSPeter Maydell     ARMCPU *cpu = env_archcpu(env);
2085991e5abSPeter Maydell     CPUState *cs = CPU(cpu);
2095991e5abSPeter Maydell 
2105991e5abSPeter Maydell     tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E3);
2115991e5abSPeter Maydell }
2125991e5abSPeter Maydell 
2137cadf113SPeter Maydell static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri,
2147cadf113SPeter Maydell                                  uint64_t value)
2157cadf113SPeter Maydell {
2167cadf113SPeter Maydell     /*
2177cadf113SPeter Maydell      * Invalidate by VA, EL2
2187cadf113SPeter Maydell      * Currently handles both VAE2 and VALE2, since we don't support
2197cadf113SPeter Maydell      * flush-last-level-only.
2207cadf113SPeter Maydell      */
2217cadf113SPeter Maydell     CPUState *cs = env_cpu(env);
2227cadf113SPeter Maydell     int mask = vae2_tlbmask(env);
2237cadf113SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
2247cadf113SPeter Maydell     int bits = vae2_tlbbits(env, pageaddr);
2257cadf113SPeter Maydell 
2267cadf113SPeter Maydell     tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
2277cadf113SPeter Maydell }
2287cadf113SPeter Maydell 
2295991e5abSPeter Maydell static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri,
2305991e5abSPeter Maydell                                  uint64_t value)
2315991e5abSPeter Maydell {
2325991e5abSPeter Maydell     /*
2335991e5abSPeter Maydell      * Invalidate by VA, EL3
2345991e5abSPeter Maydell      * Currently handles both VAE3 and VALE3, since we don't support
2355991e5abSPeter Maydell      * flush-last-level-only.
2365991e5abSPeter Maydell      */
2375991e5abSPeter Maydell     ARMCPU *cpu = env_archcpu(env);
2385991e5abSPeter Maydell     CPUState *cs = CPU(cpu);
2395991e5abSPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
2405991e5abSPeter Maydell 
2415991e5abSPeter Maydell     tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E3);
2425991e5abSPeter Maydell }
2435991e5abSPeter Maydell 
244abbb8264SPeter Maydell static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
245abbb8264SPeter Maydell                                  uint64_t value)
246abbb8264SPeter Maydell {
247abbb8264SPeter Maydell     /*
248abbb8264SPeter Maydell      * Invalidate by VA, EL1&0 (AArch64 version).
249abbb8264SPeter Maydell      * Currently handles all of VAE1, VAAE1, VAALE1 and VALE1,
250abbb8264SPeter Maydell      * since we don't support flush-for-specific-ASID-only or
251abbb8264SPeter Maydell      * flush-last-level-only.
252abbb8264SPeter Maydell      */
253abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
254abbb8264SPeter Maydell     int mask = vae1_tlbmask(env);
255abbb8264SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
256abbb8264SPeter Maydell     int bits = vae1_tlbbits(env, pageaddr);
257abbb8264SPeter Maydell 
258abbb8264SPeter Maydell     if (tlb_force_broadcast(env)) {
259abbb8264SPeter Maydell         tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
260abbb8264SPeter Maydell     } else {
261abbb8264SPeter Maydell         tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
262abbb8264SPeter Maydell     }
263abbb8264SPeter Maydell }
264abbb8264SPeter Maydell 
265abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
266abbb8264SPeter Maydell                                     uint64_t value)
267abbb8264SPeter Maydell {
268abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
269abbb8264SPeter Maydell     int mask = ipas2e1_tlbmask(env, value);
270abbb8264SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
271abbb8264SPeter Maydell 
272abbb8264SPeter Maydell     if (tlb_force_broadcast(env)) {
273abbb8264SPeter Maydell         tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask);
274abbb8264SPeter Maydell     } else {
275abbb8264SPeter Maydell         tlb_flush_page_by_mmuidx(cs, pageaddr, mask);
276abbb8264SPeter Maydell     }
277abbb8264SPeter Maydell }
278abbb8264SPeter Maydell 
279abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
280abbb8264SPeter Maydell                                       uint64_t value)
281abbb8264SPeter Maydell {
282abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
283abbb8264SPeter Maydell     int mask = ipas2e1_tlbmask(env, value);
284abbb8264SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
285abbb8264SPeter Maydell 
286abbb8264SPeter Maydell     tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask);
287abbb8264SPeter Maydell }
288abbb8264SPeter Maydell 
2891e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_not_v7_cp_reginfo[] = {
2901e32ee23SPeter Maydell     /*
2911e32ee23SPeter Maydell      * MMU TLB control. Note that the wildcarding means we cover not just
2921e32ee23SPeter Maydell      * the unified TLB ops but also the dside/iside/inner-shareable variants.
2931e32ee23SPeter Maydell      */
2941e32ee23SPeter Maydell     { .name = "TLBIALL", .cp = 15, .crn = 8, .crm = CP_ANY,
2951e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 0, .access = PL1_W, .writefn = tlbiall_write,
2961e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
2971e32ee23SPeter Maydell     { .name = "TLBIMVA", .cp = 15, .crn = 8, .crm = CP_ANY,
2981e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 1, .access = PL1_W, .writefn = tlbimva_write,
2991e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
3001e32ee23SPeter Maydell     { .name = "TLBIASID", .cp = 15, .crn = 8, .crm = CP_ANY,
3011e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 2, .access = PL1_W, .writefn = tlbiasid_write,
3021e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
3031e32ee23SPeter Maydell     { .name = "TLBIMVAA", .cp = 15, .crn = 8, .crm = CP_ANY,
3041e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 3, .access = PL1_W, .writefn = tlbimvaa_write,
3051e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
3061e32ee23SPeter Maydell };
3071e32ee23SPeter Maydell 
3081e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7_cp_reginfo[] = {
3091e32ee23SPeter Maydell     /* 32 bit ITLB invalidates */
3101e32ee23SPeter Maydell     { .name = "ITLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 0,
3111e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3121e32ee23SPeter Maydell       .writefn = tlbiall_write },
3131e32ee23SPeter Maydell     { .name = "ITLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
3141e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3151e32ee23SPeter Maydell       .writefn = tlbimva_write },
3161e32ee23SPeter Maydell     { .name = "ITLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 2,
3171e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3181e32ee23SPeter Maydell       .writefn = tlbiasid_write },
3191e32ee23SPeter Maydell     /* 32 bit DTLB invalidates */
3201e32ee23SPeter Maydell     { .name = "DTLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 0,
3211e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3221e32ee23SPeter Maydell       .writefn = tlbiall_write },
3231e32ee23SPeter Maydell     { .name = "DTLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
3241e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3251e32ee23SPeter Maydell       .writefn = tlbimva_write },
3261e32ee23SPeter Maydell     { .name = "DTLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 2,
3271e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3281e32ee23SPeter Maydell       .writefn = tlbiasid_write },
3291e32ee23SPeter Maydell     /* 32 bit TLB invalidates */
3301e32ee23SPeter Maydell     { .name = "TLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
3311e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3321e32ee23SPeter Maydell       .writefn = tlbiall_write },
3331e32ee23SPeter Maydell     { .name = "TLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
3341e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3351e32ee23SPeter Maydell       .writefn = tlbimva_write },
3361e32ee23SPeter Maydell     { .name = "TLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
3371e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3381e32ee23SPeter Maydell       .writefn = tlbiasid_write },
3391e32ee23SPeter Maydell     { .name = "TLBIMVAA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
3401e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3411e32ee23SPeter Maydell       .writefn = tlbimvaa_write },
3421e32ee23SPeter Maydell };
3431e32ee23SPeter Maydell 
3441e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7mp_cp_reginfo[] = {
3451e32ee23SPeter Maydell     /* 32 bit TLB invalidates, Inner Shareable */
3461e32ee23SPeter Maydell     { .name = "TLBIALLIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
3471e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3481e32ee23SPeter Maydell       .writefn = tlbiall_is_write },
3491e32ee23SPeter Maydell     { .name = "TLBIMVAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
3501e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3511e32ee23SPeter Maydell       .writefn = tlbimva_is_write },
3521e32ee23SPeter Maydell     { .name = "TLBIASIDIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
3531e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3541e32ee23SPeter Maydell       .writefn = tlbiasid_is_write },
3551e32ee23SPeter Maydell     { .name = "TLBIMVAAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
3561e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3571e32ee23SPeter Maydell       .writefn = tlbimvaa_is_write },
3581e32ee23SPeter Maydell };
3591e32ee23SPeter Maydell 
3601e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v8_cp_reginfo[] = {
3611e32ee23SPeter Maydell     /* AArch32 TLB invalidate last level of translation table walk */
3621e32ee23SPeter Maydell     { .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
3631e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3641e32ee23SPeter Maydell       .writefn = tlbimva_is_write },
3651e32ee23SPeter Maydell     { .name = "TLBIMVAALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
3661e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
3671e32ee23SPeter Maydell       .writefn = tlbimvaa_is_write },
3681e32ee23SPeter Maydell     { .name = "TLBIMVAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
3691e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3701e32ee23SPeter Maydell       .writefn = tlbimva_write },
3711e32ee23SPeter Maydell     { .name = "TLBIMVAAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
3721e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
3731e32ee23SPeter Maydell       .writefn = tlbimvaa_write },
3741e32ee23SPeter Maydell     { .name = "TLBIMVALH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
3751e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3761e32ee23SPeter Maydell       .writefn = tlbimva_hyp_write },
3771e32ee23SPeter Maydell     { .name = "TLBIMVALHIS",
3781e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
3791e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3801e32ee23SPeter Maydell       .writefn = tlbimva_hyp_is_write },
3811e32ee23SPeter Maydell     { .name = "TLBIIPAS2",
3821e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
3831e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3841e32ee23SPeter Maydell       .writefn = tlbiipas2_hyp_write },
3851e32ee23SPeter Maydell     { .name = "TLBIIPAS2IS",
3861e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
3871e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3881e32ee23SPeter Maydell       .writefn = tlbiipas2is_hyp_write },
3891e32ee23SPeter Maydell     { .name = "TLBIIPAS2L",
3901e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
3911e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3921e32ee23SPeter Maydell       .writefn = tlbiipas2_hyp_write },
3931e32ee23SPeter Maydell     { .name = "TLBIIPAS2LIS",
3941e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
3951e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
3961e32ee23SPeter Maydell       .writefn = tlbiipas2is_hyp_write },
397abbb8264SPeter Maydell     /* AArch64 TLBI operations */
398abbb8264SPeter Maydell     { .name = "TLBI_VMALLE1IS", .state = ARM_CP_STATE_AA64,
399abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
400abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
401abbb8264SPeter Maydell       .fgt = FGT_TLBIVMALLE1IS,
402abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1is_write },
403abbb8264SPeter Maydell     { .name = "TLBI_VAE1IS", .state = ARM_CP_STATE_AA64,
404abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
405abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
406abbb8264SPeter Maydell       .fgt = FGT_TLBIVAE1IS,
407abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
408abbb8264SPeter Maydell     { .name = "TLBI_ASIDE1IS", .state = ARM_CP_STATE_AA64,
409abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
410abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
411abbb8264SPeter Maydell       .fgt = FGT_TLBIASIDE1IS,
412abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1is_write },
413abbb8264SPeter Maydell     { .name = "TLBI_VAAE1IS", .state = ARM_CP_STATE_AA64,
414abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
415abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
416abbb8264SPeter Maydell       .fgt = FGT_TLBIVAAE1IS,
417abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
418abbb8264SPeter Maydell     { .name = "TLBI_VALE1IS", .state = ARM_CP_STATE_AA64,
419abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
420abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
421abbb8264SPeter Maydell       .fgt = FGT_TLBIVALE1IS,
422abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
423abbb8264SPeter Maydell     { .name = "TLBI_VAALE1IS", .state = ARM_CP_STATE_AA64,
424abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
425abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
426abbb8264SPeter Maydell       .fgt = FGT_TLBIVAALE1IS,
427abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
428abbb8264SPeter Maydell     { .name = "TLBI_VMALLE1", .state = ARM_CP_STATE_AA64,
429abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
430abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
431abbb8264SPeter Maydell       .fgt = FGT_TLBIVMALLE1,
432abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1_write },
433abbb8264SPeter Maydell     { .name = "TLBI_VAE1", .state = ARM_CP_STATE_AA64,
434abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
435abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
436abbb8264SPeter Maydell       .fgt = FGT_TLBIVAE1,
437abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
438abbb8264SPeter Maydell     { .name = "TLBI_ASIDE1", .state = ARM_CP_STATE_AA64,
439abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
440abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
441abbb8264SPeter Maydell       .fgt = FGT_TLBIASIDE1,
442abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1_write },
443abbb8264SPeter Maydell     { .name = "TLBI_VAAE1", .state = ARM_CP_STATE_AA64,
444abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
445abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
446abbb8264SPeter Maydell       .fgt = FGT_TLBIVAAE1,
447abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
448abbb8264SPeter Maydell     { .name = "TLBI_VALE1", .state = ARM_CP_STATE_AA64,
449abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
450abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
451abbb8264SPeter Maydell       .fgt = FGT_TLBIVALE1,
452abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
453abbb8264SPeter Maydell     { .name = "TLBI_VAALE1", .state = ARM_CP_STATE_AA64,
454abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
455abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
456abbb8264SPeter Maydell       .fgt = FGT_TLBIVAALE1,
457abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
458abbb8264SPeter Maydell     { .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64,
459abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
460abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
461abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1is_write },
462abbb8264SPeter Maydell     { .name = "TLBI_IPAS2LE1IS", .state = ARM_CP_STATE_AA64,
463abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
464abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
465abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1is_write },
466abbb8264SPeter Maydell     { .name = "TLBI_ALLE1IS", .state = ARM_CP_STATE_AA64,
467abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
468abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
469abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
470abbb8264SPeter Maydell     { .name = "TLBI_VMALLS12E1IS", .state = ARM_CP_STATE_AA64,
471abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 6,
472abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
473abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
474abbb8264SPeter Maydell     { .name = "TLBI_IPAS2E1", .state = ARM_CP_STATE_AA64,
475abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
476abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
477abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1_write },
478abbb8264SPeter Maydell     { .name = "TLBI_IPAS2LE1", .state = ARM_CP_STATE_AA64,
479abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
480abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
481abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1_write },
482abbb8264SPeter Maydell     { .name = "TLBI_ALLE1", .state = ARM_CP_STATE_AA64,
483abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
484abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
485abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1_write },
486abbb8264SPeter Maydell     { .name = "TLBI_VMALLS12E1", .state = ARM_CP_STATE_AA64,
487abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 6,
488abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
489abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
4901e32ee23SPeter Maydell };
4911e32ee23SPeter Maydell 
492d6b6da1fSPeter Maydell static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = {
493d6b6da1fSPeter Maydell     { .name = "TLBIALLNSNH",
494d6b6da1fSPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
495d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
496d6b6da1fSPeter Maydell       .writefn = tlbiall_nsnh_write },
497d6b6da1fSPeter Maydell     { .name = "TLBIALLNSNHIS",
498d6b6da1fSPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
499d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
500d6b6da1fSPeter Maydell       .writefn = tlbiall_nsnh_is_write },
501d6b6da1fSPeter Maydell     { .name = "TLBIALLH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
502d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
503d6b6da1fSPeter Maydell       .writefn = tlbiall_hyp_write },
504d6b6da1fSPeter Maydell     { .name = "TLBIALLHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
505d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
506d6b6da1fSPeter Maydell       .writefn = tlbiall_hyp_is_write },
507d6b6da1fSPeter Maydell     { .name = "TLBIMVAH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
508d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
509d6b6da1fSPeter Maydell       .writefn = tlbimva_hyp_write },
510d6b6da1fSPeter Maydell     { .name = "TLBIMVAHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
511d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
512d6b6da1fSPeter Maydell       .writefn = tlbimva_hyp_is_write },
5137cadf113SPeter Maydell     { .name = "TLBI_ALLE2", .state = ARM_CP_STATE_AA64,
5147cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
5157cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
5167cadf113SPeter Maydell       .writefn = tlbi_aa64_alle2_write },
5177cadf113SPeter Maydell     { .name = "TLBI_VAE2", .state = ARM_CP_STATE_AA64,
5187cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
5197cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
5207cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2_write },
5217cadf113SPeter Maydell     { .name = "TLBI_VALE2", .state = ARM_CP_STATE_AA64,
5227cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
5237cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
5247cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2_write },
5257cadf113SPeter Maydell     { .name = "TLBI_ALLE2IS", .state = ARM_CP_STATE_AA64,
5267cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
5277cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
5287cadf113SPeter Maydell       .writefn = tlbi_aa64_alle2is_write },
5297cadf113SPeter Maydell     { .name = "TLBI_VAE2IS", .state = ARM_CP_STATE_AA64,
5307cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
5317cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
5327cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2is_write },
5337cadf113SPeter Maydell     { .name = "TLBI_VALE2IS", .state = ARM_CP_STATE_AA64,
5347cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
5357cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
5367cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2is_write },
537d6b6da1fSPeter Maydell };
538d6b6da1fSPeter Maydell 
5395991e5abSPeter Maydell static const ARMCPRegInfo tlbi_el3_cp_reginfo[] = {
5405991e5abSPeter Maydell     { .name = "TLBI_ALLE3IS", .state = ARM_CP_STATE_AA64,
5415991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 0,
5425991e5abSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
5435991e5abSPeter Maydell       .writefn = tlbi_aa64_alle3is_write },
5445991e5abSPeter Maydell     { .name = "TLBI_VAE3IS", .state = ARM_CP_STATE_AA64,
5455991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 1,
5465991e5abSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
5475991e5abSPeter Maydell       .writefn = tlbi_aa64_vae3is_write },
5485991e5abSPeter Maydell     { .name = "TLBI_VALE3IS", .state = ARM_CP_STATE_AA64,
5495991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 5,
5505991e5abSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
5515991e5abSPeter Maydell       .writefn = tlbi_aa64_vae3is_write },
5525991e5abSPeter Maydell     { .name = "TLBI_ALLE3", .state = ARM_CP_STATE_AA64,
5535991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 0,
5545991e5abSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
5555991e5abSPeter Maydell       .writefn = tlbi_aa64_alle3_write },
5565991e5abSPeter Maydell     { .name = "TLBI_VAE3", .state = ARM_CP_STATE_AA64,
5575991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 1,
5585991e5abSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
5595991e5abSPeter Maydell       .writefn = tlbi_aa64_vae3_write },
5605991e5abSPeter Maydell     { .name = "TLBI_VALE3", .state = ARM_CP_STATE_AA64,
5615991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 5,
5625991e5abSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
5635991e5abSPeter Maydell       .writefn = tlbi_aa64_vae3_write },
5645991e5abSPeter Maydell };
5655991e5abSPeter Maydell 
56665593799SPeter Maydell #ifdef TARGET_AARCH64
56765593799SPeter Maydell typedef struct {
56865593799SPeter Maydell     uint64_t base;
56965593799SPeter Maydell     uint64_t length;
57065593799SPeter Maydell } TLBIRange;
57165593799SPeter Maydell 
57265593799SPeter Maydell static ARMGranuleSize tlbi_range_tg_to_gran_size(int tg)
57365593799SPeter Maydell {
57465593799SPeter Maydell     /*
57565593799SPeter Maydell      * Note that the TLBI range TG field encoding differs from both
57665593799SPeter Maydell      * TG0 and TG1 encodings.
57765593799SPeter Maydell      */
57865593799SPeter Maydell     switch (tg) {
57965593799SPeter Maydell     case 1:
58065593799SPeter Maydell         return Gran4K;
58165593799SPeter Maydell     case 2:
58265593799SPeter Maydell         return Gran16K;
58365593799SPeter Maydell     case 3:
58465593799SPeter Maydell         return Gran64K;
58565593799SPeter Maydell     default:
58665593799SPeter Maydell         return GranInvalid;
58765593799SPeter Maydell     }
58865593799SPeter Maydell }
58965593799SPeter Maydell 
59065593799SPeter Maydell static TLBIRange tlbi_aa64_get_range(CPUARMState *env, ARMMMUIdx mmuidx,
59165593799SPeter Maydell                                      uint64_t value)
59265593799SPeter Maydell {
59365593799SPeter Maydell     unsigned int page_size_granule, page_shift, num, scale, exponent;
59465593799SPeter Maydell     /* Extract one bit to represent the va selector in use. */
59565593799SPeter Maydell     uint64_t select = sextract64(value, 36, 1);
59665593799SPeter Maydell     ARMVAParameters param = aa64_va_parameters(env, select, mmuidx, true, false);
59765593799SPeter Maydell     TLBIRange ret = { };
59865593799SPeter Maydell     ARMGranuleSize gran;
59965593799SPeter Maydell 
60065593799SPeter Maydell     page_size_granule = extract64(value, 46, 2);
60165593799SPeter Maydell     gran = tlbi_range_tg_to_gran_size(page_size_granule);
60265593799SPeter Maydell 
60365593799SPeter Maydell     /* The granule encoded in value must match the granule in use. */
60465593799SPeter Maydell     if (gran != param.gran) {
60565593799SPeter Maydell         qemu_log_mask(LOG_GUEST_ERROR, "Invalid tlbi page size granule %d\n",
60665593799SPeter Maydell                       page_size_granule);
60765593799SPeter Maydell         return ret;
60865593799SPeter Maydell     }
60965593799SPeter Maydell 
61065593799SPeter Maydell     page_shift = arm_granule_bits(gran);
61165593799SPeter Maydell     num = extract64(value, 39, 5);
61265593799SPeter Maydell     scale = extract64(value, 44, 2);
61365593799SPeter Maydell     exponent = (5 * scale) + 1;
61465593799SPeter Maydell 
61565593799SPeter Maydell     ret.length = (num + 1) << (exponent + page_shift);
61665593799SPeter Maydell 
61765593799SPeter Maydell     if (param.select) {
61865593799SPeter Maydell         ret.base = sextract64(value, 0, 37);
61965593799SPeter Maydell     } else {
62065593799SPeter Maydell         ret.base = extract64(value, 0, 37);
62165593799SPeter Maydell     }
62265593799SPeter Maydell     if (param.ds) {
62365593799SPeter Maydell         /*
62465593799SPeter Maydell          * With DS=1, BaseADDR is always shifted 16 so that it is able
62565593799SPeter Maydell          * to address all 52 va bits.  The input address is perforce
62665593799SPeter Maydell          * aligned on a 64k boundary regardless of translation granule.
62765593799SPeter Maydell          */
62865593799SPeter Maydell         page_shift = 16;
62965593799SPeter Maydell     }
63065593799SPeter Maydell     ret.base <<= page_shift;
63165593799SPeter Maydell 
63265593799SPeter Maydell     return ret;
63365593799SPeter Maydell }
63465593799SPeter Maydell 
63565593799SPeter Maydell static void do_rvae_write(CPUARMState *env, uint64_t value,
63665593799SPeter Maydell                           int idxmap, bool synced)
63765593799SPeter Maydell {
63865593799SPeter Maydell     ARMMMUIdx one_idx = ARM_MMU_IDX_A | ctz32(idxmap);
63965593799SPeter Maydell     TLBIRange range;
64065593799SPeter Maydell     int bits;
64165593799SPeter Maydell 
64265593799SPeter Maydell     range = tlbi_aa64_get_range(env, one_idx, value);
64365593799SPeter Maydell     bits = tlbbits_for_regime(env, one_idx, range.base);
64465593799SPeter Maydell 
64565593799SPeter Maydell     if (synced) {
64665593799SPeter Maydell         tlb_flush_range_by_mmuidx_all_cpus_synced(env_cpu(env),
64765593799SPeter Maydell                                                   range.base,
64865593799SPeter Maydell                                                   range.length,
64965593799SPeter Maydell                                                   idxmap,
65065593799SPeter Maydell                                                   bits);
65165593799SPeter Maydell     } else {
65265593799SPeter Maydell         tlb_flush_range_by_mmuidx(env_cpu(env), range.base,
65365593799SPeter Maydell                                   range.length, idxmap, bits);
65465593799SPeter Maydell     }
65565593799SPeter Maydell }
65665593799SPeter Maydell 
65765593799SPeter Maydell static void tlbi_aa64_rvae1_write(CPUARMState *env,
65865593799SPeter Maydell                                   const ARMCPRegInfo *ri,
65965593799SPeter Maydell                                   uint64_t value)
66065593799SPeter Maydell {
66165593799SPeter Maydell     /*
66265593799SPeter Maydell      * Invalidate by VA range, EL1&0.
66365593799SPeter Maydell      * Currently handles all of RVAE1, RVAAE1, RVAALE1 and RVALE1,
66465593799SPeter Maydell      * since we don't support flush-for-specific-ASID-only or
66565593799SPeter Maydell      * flush-last-level-only.
66665593799SPeter Maydell      */
66765593799SPeter Maydell 
66865593799SPeter Maydell     do_rvae_write(env, value, vae1_tlbmask(env),
66965593799SPeter Maydell                   tlb_force_broadcast(env));
67065593799SPeter Maydell }
67165593799SPeter Maydell 
67265593799SPeter Maydell static void tlbi_aa64_rvae1is_write(CPUARMState *env,
67365593799SPeter Maydell                                     const ARMCPRegInfo *ri,
67465593799SPeter Maydell                                     uint64_t value)
67565593799SPeter Maydell {
67665593799SPeter Maydell     /*
67765593799SPeter Maydell      * Invalidate by VA range, Inner/Outer Shareable EL1&0.
67865593799SPeter Maydell      * Currently handles all of RVAE1IS, RVAE1OS, RVAAE1IS, RVAAE1OS,
67965593799SPeter Maydell      * RVAALE1IS, RVAALE1OS, RVALE1IS and RVALE1OS, since we don't support
68065593799SPeter Maydell      * flush-for-specific-ASID-only, flush-last-level-only or inner/outer
68165593799SPeter Maydell      * shareable specific flushes.
68265593799SPeter Maydell      */
68365593799SPeter Maydell 
68465593799SPeter Maydell     do_rvae_write(env, value, vae1_tlbmask(env), true);
68565593799SPeter Maydell }
68665593799SPeter Maydell 
68765593799SPeter Maydell static void tlbi_aa64_rvae2_write(CPUARMState *env,
68865593799SPeter Maydell                                   const ARMCPRegInfo *ri,
68965593799SPeter Maydell                                   uint64_t value)
69065593799SPeter Maydell {
69165593799SPeter Maydell     /*
69265593799SPeter Maydell      * Invalidate by VA range, EL2.
69365593799SPeter Maydell      * Currently handles all of RVAE2 and RVALE2,
69465593799SPeter Maydell      * since we don't support flush-for-specific-ASID-only or
69565593799SPeter Maydell      * flush-last-level-only.
69665593799SPeter Maydell      */
69765593799SPeter Maydell 
69865593799SPeter Maydell     do_rvae_write(env, value, vae2_tlbmask(env),
69965593799SPeter Maydell                   tlb_force_broadcast(env));
70065593799SPeter Maydell 
70165593799SPeter Maydell 
70265593799SPeter Maydell }
70365593799SPeter Maydell 
70465593799SPeter Maydell static void tlbi_aa64_rvae2is_write(CPUARMState *env,
70565593799SPeter Maydell                                     const ARMCPRegInfo *ri,
70665593799SPeter Maydell                                     uint64_t value)
70765593799SPeter Maydell {
70865593799SPeter Maydell     /*
70965593799SPeter Maydell      * Invalidate by VA range, Inner/Outer Shareable, EL2.
71065593799SPeter Maydell      * Currently handles all of RVAE2IS, RVAE2OS, RVALE2IS and RVALE2OS,
71165593799SPeter Maydell      * since we don't support flush-for-specific-ASID-only,
71265593799SPeter Maydell      * flush-last-level-only or inner/outer shareable specific flushes.
71365593799SPeter Maydell      */
71465593799SPeter Maydell 
71565593799SPeter Maydell     do_rvae_write(env, value, vae2_tlbmask(env), true);
71665593799SPeter Maydell 
71765593799SPeter Maydell }
71865593799SPeter Maydell 
71965593799SPeter Maydell static void tlbi_aa64_rvae3_write(CPUARMState *env,
72065593799SPeter Maydell                                   const ARMCPRegInfo *ri,
72165593799SPeter Maydell                                   uint64_t value)
72265593799SPeter Maydell {
72365593799SPeter Maydell     /*
72465593799SPeter Maydell      * Invalidate by VA range, EL3.
72565593799SPeter Maydell      * Currently handles all of RVAE3 and RVALE3,
72665593799SPeter Maydell      * since we don't support flush-for-specific-ASID-only or
72765593799SPeter Maydell      * flush-last-level-only.
72865593799SPeter Maydell      */
72965593799SPeter Maydell 
73065593799SPeter Maydell     do_rvae_write(env, value, ARMMMUIdxBit_E3, tlb_force_broadcast(env));
73165593799SPeter Maydell }
73265593799SPeter Maydell 
73365593799SPeter Maydell static void tlbi_aa64_rvae3is_write(CPUARMState *env,
73465593799SPeter Maydell                                     const ARMCPRegInfo *ri,
73565593799SPeter Maydell                                     uint64_t value)
73665593799SPeter Maydell {
73765593799SPeter Maydell     /*
73865593799SPeter Maydell      * Invalidate by VA range, EL3, Inner/Outer Shareable.
73965593799SPeter Maydell      * Currently handles all of RVAE3IS, RVAE3OS, RVALE3IS and RVALE3OS,
74065593799SPeter Maydell      * since we don't support flush-for-specific-ASID-only,
74165593799SPeter Maydell      * flush-last-level-only or inner/outer specific flushes.
74265593799SPeter Maydell      */
74365593799SPeter Maydell 
74465593799SPeter Maydell     do_rvae_write(env, value, ARMMMUIdxBit_E3, true);
74565593799SPeter Maydell }
74665593799SPeter Maydell 
74765593799SPeter Maydell static void tlbi_aa64_ripas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
74865593799SPeter Maydell                                      uint64_t value)
74965593799SPeter Maydell {
75065593799SPeter Maydell     do_rvae_write(env, value, ipas2e1_tlbmask(env, value),
75165593799SPeter Maydell                   tlb_force_broadcast(env));
75265593799SPeter Maydell }
75365593799SPeter Maydell 
75465593799SPeter Maydell static void tlbi_aa64_ripas2e1is_write(CPUARMState *env,
75565593799SPeter Maydell                                        const ARMCPRegInfo *ri,
75665593799SPeter Maydell                                        uint64_t value)
75765593799SPeter Maydell {
75865593799SPeter Maydell     do_rvae_write(env, value, ipas2e1_tlbmask(env, value), true);
75965593799SPeter Maydell }
76065593799SPeter Maydell 
76165593799SPeter Maydell static const ARMCPRegInfo tlbirange_reginfo[] = {
76265593799SPeter Maydell     { .name = "TLBI_RVAE1IS", .state = ARM_CP_STATE_AA64,
76365593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 1,
76465593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
76565593799SPeter Maydell       .fgt = FGT_TLBIRVAE1IS,
76665593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
76765593799SPeter Maydell     { .name = "TLBI_RVAAE1IS", .state = ARM_CP_STATE_AA64,
76865593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 3,
76965593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
77065593799SPeter Maydell       .fgt = FGT_TLBIRVAAE1IS,
77165593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
77265593799SPeter Maydell    { .name = "TLBI_RVALE1IS", .state = ARM_CP_STATE_AA64,
77365593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 5,
77465593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
77565593799SPeter Maydell       .fgt = FGT_TLBIRVALE1IS,
77665593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
77765593799SPeter Maydell     { .name = "TLBI_RVAALE1IS", .state = ARM_CP_STATE_AA64,
77865593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 7,
77965593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
78065593799SPeter Maydell       .fgt = FGT_TLBIRVAALE1IS,
78165593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
78265593799SPeter Maydell     { .name = "TLBI_RVAE1OS", .state = ARM_CP_STATE_AA64,
78365593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
78465593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
78565593799SPeter Maydell       .fgt = FGT_TLBIRVAE1OS,
78665593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
78765593799SPeter Maydell     { .name = "TLBI_RVAAE1OS", .state = ARM_CP_STATE_AA64,
78865593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 3,
78965593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
79065593799SPeter Maydell       .fgt = FGT_TLBIRVAAE1OS,
79165593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
79265593799SPeter Maydell    { .name = "TLBI_RVALE1OS", .state = ARM_CP_STATE_AA64,
79365593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 5,
79465593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
79565593799SPeter Maydell       .fgt = FGT_TLBIRVALE1OS,
79665593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
79765593799SPeter Maydell     { .name = "TLBI_RVAALE1OS", .state = ARM_CP_STATE_AA64,
79865593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 7,
79965593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
80065593799SPeter Maydell       .fgt = FGT_TLBIRVAALE1OS,
80165593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
80265593799SPeter Maydell     { .name = "TLBI_RVAE1", .state = ARM_CP_STATE_AA64,
80365593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
80465593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
80565593799SPeter Maydell       .fgt = FGT_TLBIRVAE1,
80665593799SPeter Maydell       .writefn = tlbi_aa64_rvae1_write },
80765593799SPeter Maydell     { .name = "TLBI_RVAAE1", .state = ARM_CP_STATE_AA64,
80865593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 3,
80965593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
81065593799SPeter Maydell       .fgt = FGT_TLBIRVAAE1,
81165593799SPeter Maydell       .writefn = tlbi_aa64_rvae1_write },
81265593799SPeter Maydell    { .name = "TLBI_RVALE1", .state = ARM_CP_STATE_AA64,
81365593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 5,
81465593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
81565593799SPeter Maydell       .fgt = FGT_TLBIRVALE1,
81665593799SPeter Maydell       .writefn = tlbi_aa64_rvae1_write },
81765593799SPeter Maydell     { .name = "TLBI_RVAALE1", .state = ARM_CP_STATE_AA64,
81865593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 7,
81965593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
82065593799SPeter Maydell       .fgt = FGT_TLBIRVAALE1,
82165593799SPeter Maydell       .writefn = tlbi_aa64_rvae1_write },
82265593799SPeter Maydell     { .name = "TLBI_RIPAS2E1IS", .state = ARM_CP_STATE_AA64,
82365593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 2,
82465593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
82565593799SPeter Maydell       .writefn = tlbi_aa64_ripas2e1is_write },
82665593799SPeter Maydell     { .name = "TLBI_RIPAS2LE1IS", .state = ARM_CP_STATE_AA64,
82765593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 6,
82865593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
82965593799SPeter Maydell       .writefn = tlbi_aa64_ripas2e1is_write },
83065593799SPeter Maydell     { .name = "TLBI_RVAE2IS", .state = ARM_CP_STATE_AA64,
83165593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 1,
83265593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
83365593799SPeter Maydell       .writefn = tlbi_aa64_rvae2is_write },
83465593799SPeter Maydell    { .name = "TLBI_RVALE2IS", .state = ARM_CP_STATE_AA64,
83565593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 5,
83665593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
83765593799SPeter Maydell       .writefn = tlbi_aa64_rvae2is_write },
83865593799SPeter Maydell     { .name = "TLBI_RIPAS2E1", .state = ARM_CP_STATE_AA64,
83965593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 2,
84065593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
84165593799SPeter Maydell       .writefn = tlbi_aa64_ripas2e1_write },
84265593799SPeter Maydell     { .name = "TLBI_RIPAS2LE1", .state = ARM_CP_STATE_AA64,
84365593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 6,
84465593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
84565593799SPeter Maydell       .writefn = tlbi_aa64_ripas2e1_write },
84665593799SPeter Maydell    { .name = "TLBI_RVAE2OS", .state = ARM_CP_STATE_AA64,
84765593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 1,
84865593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
84965593799SPeter Maydell       .writefn = tlbi_aa64_rvae2is_write },
85065593799SPeter Maydell    { .name = "TLBI_RVALE2OS", .state = ARM_CP_STATE_AA64,
85165593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 5,
85265593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
85365593799SPeter Maydell       .writefn = tlbi_aa64_rvae2is_write },
85465593799SPeter Maydell     { .name = "TLBI_RVAE2", .state = ARM_CP_STATE_AA64,
85565593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 1,
85665593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
85765593799SPeter Maydell       .writefn = tlbi_aa64_rvae2_write },
85865593799SPeter Maydell    { .name = "TLBI_RVALE2", .state = ARM_CP_STATE_AA64,
85965593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 5,
86065593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
86165593799SPeter Maydell       .writefn = tlbi_aa64_rvae2_write },
86265593799SPeter Maydell    { .name = "TLBI_RVAE3IS", .state = ARM_CP_STATE_AA64,
86365593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 1,
86465593799SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
86565593799SPeter Maydell       .writefn = tlbi_aa64_rvae3is_write },
86665593799SPeter Maydell    { .name = "TLBI_RVALE3IS", .state = ARM_CP_STATE_AA64,
86765593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 5,
86865593799SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
86965593799SPeter Maydell       .writefn = tlbi_aa64_rvae3is_write },
87065593799SPeter Maydell    { .name = "TLBI_RVAE3OS", .state = ARM_CP_STATE_AA64,
87165593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 1,
87265593799SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
87365593799SPeter Maydell       .writefn = tlbi_aa64_rvae3is_write },
87465593799SPeter Maydell    { .name = "TLBI_RVALE3OS", .state = ARM_CP_STATE_AA64,
87565593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 5,
87665593799SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
87765593799SPeter Maydell       .writefn = tlbi_aa64_rvae3is_write },
87865593799SPeter Maydell    { .name = "TLBI_RVAE3", .state = ARM_CP_STATE_AA64,
87965593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 1,
88065593799SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
88165593799SPeter Maydell       .writefn = tlbi_aa64_rvae3_write },
88265593799SPeter Maydell    { .name = "TLBI_RVALE3", .state = ARM_CP_STATE_AA64,
88365593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 5,
88465593799SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
88565593799SPeter Maydell       .writefn = tlbi_aa64_rvae3_write },
88665593799SPeter Maydell };
887*b0f7cd35SPeter Maydell 
888*b0f7cd35SPeter Maydell static const ARMCPRegInfo tlbios_reginfo[] = {
889*b0f7cd35SPeter Maydell     { .name = "TLBI_VMALLE1OS", .state = ARM_CP_STATE_AA64,
890*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 0,
891*b0f7cd35SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
892*b0f7cd35SPeter Maydell       .fgt = FGT_TLBIVMALLE1OS,
893*b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vmalle1is_write },
894*b0f7cd35SPeter Maydell     { .name = "TLBI_VAE1OS", .state = ARM_CP_STATE_AA64,
895*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 1,
896*b0f7cd35SPeter Maydell       .fgt = FGT_TLBIVAE1OS,
897*b0f7cd35SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
898*b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
899*b0f7cd35SPeter Maydell     { .name = "TLBI_ASIDE1OS", .state = ARM_CP_STATE_AA64,
900*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 2,
901*b0f7cd35SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
902*b0f7cd35SPeter Maydell       .fgt = FGT_TLBIASIDE1OS,
903*b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vmalle1is_write },
904*b0f7cd35SPeter Maydell     { .name = "TLBI_VAAE1OS", .state = ARM_CP_STATE_AA64,
905*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 3,
906*b0f7cd35SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
907*b0f7cd35SPeter Maydell       .fgt = FGT_TLBIVAAE1OS,
908*b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
909*b0f7cd35SPeter Maydell     { .name = "TLBI_VALE1OS", .state = ARM_CP_STATE_AA64,
910*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 5,
911*b0f7cd35SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
912*b0f7cd35SPeter Maydell       .fgt = FGT_TLBIVALE1OS,
913*b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
914*b0f7cd35SPeter Maydell     { .name = "TLBI_VAALE1OS", .state = ARM_CP_STATE_AA64,
915*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 7,
916*b0f7cd35SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
917*b0f7cd35SPeter Maydell       .fgt = FGT_TLBIVAALE1OS,
918*b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
919*b0f7cd35SPeter Maydell     { .name = "TLBI_ALLE2OS", .state = ARM_CP_STATE_AA64,
920*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 0,
921*b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
922*b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_alle2is_write },
923*b0f7cd35SPeter Maydell     { .name = "TLBI_VAE2OS", .state = ARM_CP_STATE_AA64,
924*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 1,
925*b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
926*b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae2is_write },
927*b0f7cd35SPeter Maydell    { .name = "TLBI_ALLE1OS", .state = ARM_CP_STATE_AA64,
928*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 4,
929*b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
930*b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
931*b0f7cd35SPeter Maydell     { .name = "TLBI_VALE2OS", .state = ARM_CP_STATE_AA64,
932*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 5,
933*b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
934*b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae2is_write },
935*b0f7cd35SPeter Maydell     { .name = "TLBI_VMALLS12E1OS", .state = ARM_CP_STATE_AA64,
936*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 6,
937*b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
938*b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
939*b0f7cd35SPeter Maydell     { .name = "TLBI_IPAS2E1OS", .state = ARM_CP_STATE_AA64,
940*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 0,
941*b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NOP },
942*b0f7cd35SPeter Maydell     { .name = "TLBI_RIPAS2E1OS", .state = ARM_CP_STATE_AA64,
943*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 3,
944*b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NOP },
945*b0f7cd35SPeter Maydell     { .name = "TLBI_IPAS2LE1OS", .state = ARM_CP_STATE_AA64,
946*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 4,
947*b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NOP },
948*b0f7cd35SPeter Maydell     { .name = "TLBI_RIPAS2LE1OS", .state = ARM_CP_STATE_AA64,
949*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 7,
950*b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NOP },
951*b0f7cd35SPeter Maydell     { .name = "TLBI_ALLE3OS", .state = ARM_CP_STATE_AA64,
952*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 0,
953*b0f7cd35SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
954*b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_alle3is_write },
955*b0f7cd35SPeter Maydell     { .name = "TLBI_VAE3OS", .state = ARM_CP_STATE_AA64,
956*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 1,
957*b0f7cd35SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
958*b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae3is_write },
959*b0f7cd35SPeter Maydell     { .name = "TLBI_VALE3OS", .state = ARM_CP_STATE_AA64,
960*b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 5,
961*b0f7cd35SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
962*b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae3is_write },
963*b0f7cd35SPeter Maydell };
96465593799SPeter Maydell #endif
96565593799SPeter Maydell 
9661e32ee23SPeter Maydell void define_tlb_insn_regs(ARMCPU *cpu)
9671e32ee23SPeter Maydell {
9681e32ee23SPeter Maydell     CPUARMState *env = &cpu->env;
9691e32ee23SPeter Maydell 
9701e32ee23SPeter Maydell     if (!arm_feature(env, ARM_FEATURE_V7)) {
9711e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_not_v7_cp_reginfo);
9721e32ee23SPeter Maydell     } else {
9731e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v7_cp_reginfo);
9741e32ee23SPeter Maydell     }
9751e32ee23SPeter Maydell     if (arm_feature(env, ARM_FEATURE_V7MP) &&
9761e32ee23SPeter Maydell         !arm_feature(env, ARM_FEATURE_PMSA)) {
9771e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v7mp_cp_reginfo);
9781e32ee23SPeter Maydell     }
9791e32ee23SPeter Maydell     if (arm_feature(env, ARM_FEATURE_V8)) {
9801e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v8_cp_reginfo);
9811e32ee23SPeter Maydell     }
982d6b6da1fSPeter Maydell     /*
983d6b6da1fSPeter Maydell      * We retain the existing logic for when to register these TLBI
984d6b6da1fSPeter Maydell      * ops (i.e. matching the condition for el2_cp_reginfo[] in
985d6b6da1fSPeter Maydell      * helper.c), but we will be able to simplify this later.
986d6b6da1fSPeter Maydell      */
987d6b6da1fSPeter Maydell     if (arm_feature(env, ARM_FEATURE_EL2)
988d6b6da1fSPeter Maydell         || (arm_feature(env, ARM_FEATURE_EL3)
989d6b6da1fSPeter Maydell             && arm_feature(env, ARM_FEATURE_V8))) {
990d6b6da1fSPeter Maydell         define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo);
991d6b6da1fSPeter Maydell     }
9925991e5abSPeter Maydell     if (arm_feature(env, ARM_FEATURE_EL3)) {
9935991e5abSPeter Maydell         define_arm_cp_regs(cpu, tlbi_el3_cp_reginfo);
9945991e5abSPeter Maydell     }
99565593799SPeter Maydell #ifdef TARGET_AARCH64
99665593799SPeter Maydell     if (cpu_isar_feature(aa64_tlbirange, cpu)) {
99765593799SPeter Maydell         define_arm_cp_regs(cpu, tlbirange_reginfo);
99865593799SPeter Maydell     }
999*b0f7cd35SPeter Maydell     if (cpu_isar_feature(aa64_tlbios, cpu)) {
1000*b0f7cd35SPeter Maydell         define_arm_cp_regs(cpu, tlbios_reginfo);
1001*b0f7cd35SPeter Maydell     }
100265593799SPeter Maydell #endif
10031e32ee23SPeter Maydell }
1004