xref: /qemu/target/arm/tcg/tlb-insns.c (revision 27fb860fd4f1524aac245a3e9849a06dae44bdba)
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 
16*27fb860fSPeter Maydell /* Check for traps from EL1 due to HCR_EL2.TTLB. */
17*27fb860fSPeter Maydell static CPAccessResult access_ttlb(CPUARMState *env, const ARMCPRegInfo *ri,
18*27fb860fSPeter Maydell                                   bool isread)
19*27fb860fSPeter Maydell {
20*27fb860fSPeter Maydell     if (arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_TTLB)) {
21*27fb860fSPeter Maydell         return CP_ACCESS_TRAP_EL2;
22*27fb860fSPeter Maydell     }
23*27fb860fSPeter Maydell     return CP_ACCESS_OK;
24*27fb860fSPeter Maydell }
25*27fb860fSPeter Maydell 
26*27fb860fSPeter Maydell /* Check for traps from EL1 due to HCR_EL2.TTLB or TTLBIS. */
27*27fb860fSPeter Maydell static CPAccessResult access_ttlbis(CPUARMState *env, const ARMCPRegInfo *ri,
28*27fb860fSPeter Maydell                                     bool isread)
29*27fb860fSPeter Maydell {
30*27fb860fSPeter Maydell     if (arm_current_el(env) == 1 &&
31*27fb860fSPeter Maydell         (arm_hcr_el2_eff(env) & (HCR_TTLB | HCR_TTLBIS))) {
32*27fb860fSPeter Maydell         return CP_ACCESS_TRAP_EL2;
33*27fb860fSPeter Maydell     }
34*27fb860fSPeter Maydell     return CP_ACCESS_OK;
35*27fb860fSPeter Maydell }
36*27fb860fSPeter Maydell 
37*27fb860fSPeter Maydell #ifdef TARGET_AARCH64
38*27fb860fSPeter Maydell /* Check for traps from EL1 due to HCR_EL2.TTLB or TTLBOS. */
39*27fb860fSPeter Maydell static CPAccessResult access_ttlbos(CPUARMState *env, const ARMCPRegInfo *ri,
40*27fb860fSPeter Maydell                                     bool isread)
41*27fb860fSPeter Maydell {
42*27fb860fSPeter Maydell     if (arm_current_el(env) == 1 &&
43*27fb860fSPeter Maydell         (arm_hcr_el2_eff(env) & (HCR_TTLB | HCR_TTLBOS))) {
44*27fb860fSPeter Maydell         return CP_ACCESS_TRAP_EL2;
45*27fb860fSPeter Maydell     }
46*27fb860fSPeter Maydell     return CP_ACCESS_OK;
47*27fb860fSPeter Maydell }
48*27fb860fSPeter Maydell #endif
49*27fb860fSPeter Maydell 
501e32ee23SPeter Maydell /* IS variants of TLB operations must affect all cores */
511e32ee23SPeter Maydell static void tlbiall_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
521e32ee23SPeter Maydell                              uint64_t value)
531e32ee23SPeter Maydell {
541e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
551e32ee23SPeter Maydell 
561e32ee23SPeter Maydell     tlb_flush_all_cpus_synced(cs);
571e32ee23SPeter Maydell }
581e32ee23SPeter Maydell 
591e32ee23SPeter Maydell static void tlbiasid_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
601e32ee23SPeter Maydell                              uint64_t value)
611e32ee23SPeter Maydell {
621e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
631e32ee23SPeter Maydell 
641e32ee23SPeter Maydell     tlb_flush_all_cpus_synced(cs);
651e32ee23SPeter Maydell }
661e32ee23SPeter Maydell 
671e32ee23SPeter Maydell static void tlbimva_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
681e32ee23SPeter Maydell                              uint64_t value)
691e32ee23SPeter Maydell {
701e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
711e32ee23SPeter Maydell 
721e32ee23SPeter Maydell     tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK);
731e32ee23SPeter Maydell }
741e32ee23SPeter Maydell 
751e32ee23SPeter Maydell static void tlbimvaa_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
761e32ee23SPeter Maydell                              uint64_t value)
771e32ee23SPeter Maydell {
781e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
791e32ee23SPeter Maydell 
801e32ee23SPeter Maydell     tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK);
811e32ee23SPeter Maydell }
821e32ee23SPeter Maydell 
83*27fb860fSPeter Maydell /*
84*27fb860fSPeter Maydell  * Non-IS variants of TLB operations are upgraded to
85*27fb860fSPeter Maydell  * IS versions if we are at EL1 and HCR_EL2.FB is effectively set to
86*27fb860fSPeter Maydell  * force broadcast of these operations.
87*27fb860fSPeter Maydell  */
88*27fb860fSPeter Maydell static bool tlb_force_broadcast(CPUARMState *env)
89*27fb860fSPeter Maydell {
90*27fb860fSPeter Maydell     return arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_FB);
91*27fb860fSPeter Maydell }
92*27fb860fSPeter Maydell 
931e32ee23SPeter Maydell static void tlbiall_write(CPUARMState *env, const ARMCPRegInfo *ri,
941e32ee23SPeter Maydell                           uint64_t value)
951e32ee23SPeter Maydell {
961e32ee23SPeter Maydell     /* Invalidate all (TLBIALL) */
971e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
981e32ee23SPeter Maydell 
991e32ee23SPeter Maydell     if (tlb_force_broadcast(env)) {
1001e32ee23SPeter Maydell         tlb_flush_all_cpus_synced(cs);
1011e32ee23SPeter Maydell     } else {
1021e32ee23SPeter Maydell         tlb_flush(cs);
1031e32ee23SPeter Maydell     }
1041e32ee23SPeter Maydell }
1051e32ee23SPeter Maydell 
1061e32ee23SPeter Maydell static void tlbimva_write(CPUARMState *env, const ARMCPRegInfo *ri,
1071e32ee23SPeter Maydell                           uint64_t value)
1081e32ee23SPeter Maydell {
1091e32ee23SPeter Maydell     /* Invalidate single TLB entry by MVA and ASID (TLBIMVA) */
1101e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
1111e32ee23SPeter Maydell 
1121e32ee23SPeter Maydell     value &= TARGET_PAGE_MASK;
1131e32ee23SPeter Maydell     if (tlb_force_broadcast(env)) {
1141e32ee23SPeter Maydell         tlb_flush_page_all_cpus_synced(cs, value);
1151e32ee23SPeter Maydell     } else {
1161e32ee23SPeter Maydell         tlb_flush_page(cs, value);
1171e32ee23SPeter Maydell     }
1181e32ee23SPeter Maydell }
1191e32ee23SPeter Maydell 
1201e32ee23SPeter Maydell static void tlbiasid_write(CPUARMState *env, const ARMCPRegInfo *ri,
1211e32ee23SPeter Maydell                            uint64_t value)
1221e32ee23SPeter Maydell {
1231e32ee23SPeter Maydell     /* Invalidate by ASID (TLBIASID) */
1241e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
1251e32ee23SPeter Maydell 
1261e32ee23SPeter Maydell     if (tlb_force_broadcast(env)) {
1271e32ee23SPeter Maydell         tlb_flush_all_cpus_synced(cs);
1281e32ee23SPeter Maydell     } else {
1291e32ee23SPeter Maydell         tlb_flush(cs);
1301e32ee23SPeter Maydell     }
1311e32ee23SPeter Maydell }
1321e32ee23SPeter Maydell 
1331e32ee23SPeter Maydell static void tlbimvaa_write(CPUARMState *env, const ARMCPRegInfo *ri,
1341e32ee23SPeter Maydell                            uint64_t value)
1351e32ee23SPeter Maydell {
1361e32ee23SPeter Maydell     /* Invalidate single entry by MVA, all ASIDs (TLBIMVAA) */
1371e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
1381e32ee23SPeter Maydell 
1391e32ee23SPeter Maydell     value &= TARGET_PAGE_MASK;
1401e32ee23SPeter Maydell     if (tlb_force_broadcast(env)) {
1411e32ee23SPeter Maydell         tlb_flush_page_all_cpus_synced(cs, value);
1421e32ee23SPeter Maydell     } else {
1431e32ee23SPeter Maydell         tlb_flush_page(cs, value);
1441e32ee23SPeter Maydell     }
1451e32ee23SPeter Maydell }
1461e32ee23SPeter Maydell 
147d6b6da1fSPeter Maydell static void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
148d6b6da1fSPeter Maydell                               uint64_t value)
149d6b6da1fSPeter Maydell {
150d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
151d6b6da1fSPeter Maydell     uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
152d6b6da1fSPeter Maydell 
153d6b6da1fSPeter Maydell     tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E2);
154d6b6da1fSPeter Maydell }
155d6b6da1fSPeter Maydell 
156d6b6da1fSPeter Maydell static void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
157d6b6da1fSPeter Maydell                                  uint64_t value)
158d6b6da1fSPeter Maydell {
159d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
160d6b6da1fSPeter Maydell     uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
161d6b6da1fSPeter Maydell 
162d6b6da1fSPeter Maydell     tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr,
163d6b6da1fSPeter Maydell                                              ARMMMUIdxBit_E2);
164d6b6da1fSPeter Maydell }
165d6b6da1fSPeter Maydell 
1661e32ee23SPeter Maydell static void tlbiipas2_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
1671e32ee23SPeter Maydell                                 uint64_t value)
1681e32ee23SPeter Maydell {
1691e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
1701e32ee23SPeter Maydell     uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12;
1711e32ee23SPeter Maydell 
1721e32ee23SPeter Maydell     tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_Stage2);
1731e32ee23SPeter Maydell }
1741e32ee23SPeter Maydell 
1751e32ee23SPeter Maydell static void tlbiipas2is_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
1761e32ee23SPeter Maydell                                 uint64_t value)
1771e32ee23SPeter Maydell {
1781e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
1791e32ee23SPeter Maydell     uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12;
1801e32ee23SPeter Maydell 
1811e32ee23SPeter Maydell     tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, ARMMMUIdxBit_Stage2);
1821e32ee23SPeter Maydell }
1831e32ee23SPeter Maydell 
184d6b6da1fSPeter Maydell static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri,
185d6b6da1fSPeter Maydell                                uint64_t value)
186d6b6da1fSPeter Maydell {
187d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
188d6b6da1fSPeter Maydell 
189d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx(cs, alle1_tlbmask(env));
190d6b6da1fSPeter Maydell }
191d6b6da1fSPeter Maydell 
192d6b6da1fSPeter Maydell static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
193d6b6da1fSPeter Maydell                                   uint64_t value)
194d6b6da1fSPeter Maydell {
195d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
196d6b6da1fSPeter Maydell 
197d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, alle1_tlbmask(env));
198d6b6da1fSPeter Maydell }
199d6b6da1fSPeter Maydell 
200d6b6da1fSPeter Maydell 
201d6b6da1fSPeter Maydell static void tlbiall_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
202d6b6da1fSPeter Maydell                               uint64_t value)
203d6b6da1fSPeter Maydell {
204d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
205d6b6da1fSPeter Maydell 
206d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E2);
207d6b6da1fSPeter Maydell }
208d6b6da1fSPeter Maydell 
209d6b6da1fSPeter Maydell static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
210d6b6da1fSPeter Maydell                                  uint64_t value)
211d6b6da1fSPeter Maydell {
212d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
213d6b6da1fSPeter Maydell 
214d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E2);
215d6b6da1fSPeter Maydell }
216d6b6da1fSPeter Maydell 
217*27fb860fSPeter Maydell /*
218*27fb860fSPeter Maydell  * See: D4.7.2 TLB maintenance requirements and the TLB maintenance instructions
219*27fb860fSPeter Maydell  * Page D4-1736 (DDI0487A.b)
220*27fb860fSPeter Maydell  */
221*27fb860fSPeter Maydell 
222*27fb860fSPeter Maydell static int vae1_tlbmask(CPUARMState *env)
223*27fb860fSPeter Maydell {
224*27fb860fSPeter Maydell     uint64_t hcr = arm_hcr_el2_eff(env);
225*27fb860fSPeter Maydell     uint16_t mask;
226*27fb860fSPeter Maydell 
227*27fb860fSPeter Maydell     assert(arm_feature(env, ARM_FEATURE_AARCH64));
228*27fb860fSPeter Maydell 
229*27fb860fSPeter Maydell     if ((hcr & (HCR_E2H | HCR_TGE)) == (HCR_E2H | HCR_TGE)) {
230*27fb860fSPeter Maydell         mask = ARMMMUIdxBit_E20_2 |
231*27fb860fSPeter Maydell                ARMMMUIdxBit_E20_2_PAN |
232*27fb860fSPeter Maydell                ARMMMUIdxBit_E20_0;
233*27fb860fSPeter Maydell     } else {
234*27fb860fSPeter Maydell         /* This is AArch64 only, so we don't need to touch the EL30_x TLBs */
235*27fb860fSPeter Maydell         mask = ARMMMUIdxBit_E10_1 |
236*27fb860fSPeter Maydell                ARMMMUIdxBit_E10_1_PAN |
237*27fb860fSPeter Maydell                ARMMMUIdxBit_E10_0;
238*27fb860fSPeter Maydell     }
239*27fb860fSPeter Maydell     return mask;
240*27fb860fSPeter Maydell }
241*27fb860fSPeter Maydell 
242*27fb860fSPeter Maydell static int vae2_tlbmask(CPUARMState *env)
243*27fb860fSPeter Maydell {
244*27fb860fSPeter Maydell     uint64_t hcr = arm_hcr_el2_eff(env);
245*27fb860fSPeter Maydell     uint16_t mask;
246*27fb860fSPeter Maydell 
247*27fb860fSPeter Maydell     if (hcr & HCR_E2H) {
248*27fb860fSPeter Maydell         mask = ARMMMUIdxBit_E20_2 |
249*27fb860fSPeter Maydell                ARMMMUIdxBit_E20_2_PAN |
250*27fb860fSPeter Maydell                ARMMMUIdxBit_E20_0;
251*27fb860fSPeter Maydell     } else {
252*27fb860fSPeter Maydell         mask = ARMMMUIdxBit_E2;
253*27fb860fSPeter Maydell     }
254*27fb860fSPeter Maydell     return mask;
255*27fb860fSPeter Maydell }
256*27fb860fSPeter Maydell 
257*27fb860fSPeter Maydell /* Return 56 if TBI is enabled, 64 otherwise. */
258*27fb860fSPeter Maydell static int tlbbits_for_regime(CPUARMState *env, ARMMMUIdx mmu_idx,
259*27fb860fSPeter Maydell                        uint64_t addr)
260*27fb860fSPeter Maydell {
261*27fb860fSPeter Maydell     uint64_t tcr = regime_tcr(env, mmu_idx);
262*27fb860fSPeter Maydell     int tbi = aa64_va_parameter_tbi(tcr, mmu_idx);
263*27fb860fSPeter Maydell     int select = extract64(addr, 55, 1);
264*27fb860fSPeter Maydell 
265*27fb860fSPeter Maydell     return (tbi >> select) & 1 ? 56 : 64;
266*27fb860fSPeter Maydell }
267*27fb860fSPeter Maydell 
268*27fb860fSPeter Maydell static int vae1_tlbbits(CPUARMState *env, uint64_t addr)
269*27fb860fSPeter Maydell {
270*27fb860fSPeter Maydell     uint64_t hcr = arm_hcr_el2_eff(env);
271*27fb860fSPeter Maydell     ARMMMUIdx mmu_idx;
272*27fb860fSPeter Maydell 
273*27fb860fSPeter Maydell     assert(arm_feature(env, ARM_FEATURE_AARCH64));
274*27fb860fSPeter Maydell 
275*27fb860fSPeter Maydell     /* Only the regime of the mmu_idx below is significant. */
276*27fb860fSPeter Maydell     if ((hcr & (HCR_E2H | HCR_TGE)) == (HCR_E2H | HCR_TGE)) {
277*27fb860fSPeter Maydell         mmu_idx = ARMMMUIdx_E20_0;
278*27fb860fSPeter Maydell     } else {
279*27fb860fSPeter Maydell         mmu_idx = ARMMMUIdx_E10_0;
280*27fb860fSPeter Maydell     }
281*27fb860fSPeter Maydell 
282*27fb860fSPeter Maydell     return tlbbits_for_regime(env, mmu_idx, addr);
283*27fb860fSPeter Maydell }
284*27fb860fSPeter Maydell 
285*27fb860fSPeter Maydell static int vae2_tlbbits(CPUARMState *env, uint64_t addr)
286*27fb860fSPeter Maydell {
287*27fb860fSPeter Maydell     uint64_t hcr = arm_hcr_el2_eff(env);
288*27fb860fSPeter Maydell     ARMMMUIdx mmu_idx;
289*27fb860fSPeter Maydell 
290*27fb860fSPeter Maydell     /*
291*27fb860fSPeter Maydell      * Only the regime of the mmu_idx below is significant.
292*27fb860fSPeter Maydell      * Regime EL2&0 has two ranges with separate TBI configuration, while EL2
293*27fb860fSPeter Maydell      * only has one.
294*27fb860fSPeter Maydell      */
295*27fb860fSPeter Maydell     if (hcr & HCR_E2H) {
296*27fb860fSPeter Maydell         mmu_idx = ARMMMUIdx_E20_2;
297*27fb860fSPeter Maydell     } else {
298*27fb860fSPeter Maydell         mmu_idx = ARMMMUIdx_E2;
299*27fb860fSPeter Maydell     }
300*27fb860fSPeter Maydell 
301*27fb860fSPeter Maydell     return tlbbits_for_regime(env, mmu_idx, addr);
302*27fb860fSPeter Maydell }
303*27fb860fSPeter Maydell 
304*27fb860fSPeter Maydell static void tlbi_aa64_vmalle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
305*27fb860fSPeter Maydell                                       uint64_t value)
306*27fb860fSPeter Maydell {
307*27fb860fSPeter Maydell     CPUState *cs = env_cpu(env);
308*27fb860fSPeter Maydell     int mask = vae1_tlbmask(env);
309*27fb860fSPeter Maydell 
310*27fb860fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
311*27fb860fSPeter Maydell }
312*27fb860fSPeter Maydell 
313abbb8264SPeter Maydell static void tlbi_aa64_vmalle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
314abbb8264SPeter Maydell                                     uint64_t value)
315abbb8264SPeter Maydell {
316abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
317abbb8264SPeter Maydell     int mask = vae1_tlbmask(env);
318abbb8264SPeter Maydell 
319abbb8264SPeter Maydell     if (tlb_force_broadcast(env)) {
320abbb8264SPeter Maydell         tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
321abbb8264SPeter Maydell     } else {
322abbb8264SPeter Maydell         tlb_flush_by_mmuidx(cs, mask);
323abbb8264SPeter Maydell     }
324abbb8264SPeter Maydell }
325abbb8264SPeter Maydell 
326*27fb860fSPeter Maydell static int e2_tlbmask(CPUARMState *env)
327*27fb860fSPeter Maydell {
328*27fb860fSPeter Maydell     return (ARMMMUIdxBit_E20_0 |
329*27fb860fSPeter Maydell             ARMMMUIdxBit_E20_2 |
330*27fb860fSPeter Maydell             ARMMMUIdxBit_E20_2_PAN |
331*27fb860fSPeter Maydell             ARMMMUIdxBit_E2);
332*27fb860fSPeter Maydell }
333*27fb860fSPeter Maydell 
334abbb8264SPeter Maydell static void tlbi_aa64_alle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
335abbb8264SPeter Maydell                                   uint64_t value)
336abbb8264SPeter Maydell {
337abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
338abbb8264SPeter Maydell     int mask = alle1_tlbmask(env);
339abbb8264SPeter Maydell 
340abbb8264SPeter Maydell     tlb_flush_by_mmuidx(cs, mask);
341abbb8264SPeter Maydell }
342abbb8264SPeter Maydell 
3437cadf113SPeter Maydell static void tlbi_aa64_alle2_write(CPUARMState *env, const ARMCPRegInfo *ri,
3447cadf113SPeter Maydell                                   uint64_t value)
3457cadf113SPeter Maydell {
3467cadf113SPeter Maydell     CPUState *cs = env_cpu(env);
3477cadf113SPeter Maydell     int mask = e2_tlbmask(env);
3487cadf113SPeter Maydell 
3497cadf113SPeter Maydell     tlb_flush_by_mmuidx(cs, mask);
3507cadf113SPeter Maydell }
3517cadf113SPeter Maydell 
3525991e5abSPeter Maydell static void tlbi_aa64_alle3_write(CPUARMState *env, const ARMCPRegInfo *ri,
3535991e5abSPeter Maydell                                   uint64_t value)
3545991e5abSPeter Maydell {
3555991e5abSPeter Maydell     ARMCPU *cpu = env_archcpu(env);
3565991e5abSPeter Maydell     CPUState *cs = CPU(cpu);
3575991e5abSPeter Maydell 
3585991e5abSPeter Maydell     tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E3);
3595991e5abSPeter Maydell }
3605991e5abSPeter Maydell 
361*27fb860fSPeter Maydell static void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
362*27fb860fSPeter Maydell                                     uint64_t value)
363*27fb860fSPeter Maydell {
364*27fb860fSPeter Maydell     CPUState *cs = env_cpu(env);
365*27fb860fSPeter Maydell     int mask = alle1_tlbmask(env);
366*27fb860fSPeter Maydell 
367*27fb860fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
368*27fb860fSPeter Maydell }
369*27fb860fSPeter Maydell 
370*27fb860fSPeter Maydell static void tlbi_aa64_alle2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
371*27fb860fSPeter Maydell                                     uint64_t value)
372*27fb860fSPeter Maydell {
373*27fb860fSPeter Maydell     CPUState *cs = env_cpu(env);
374*27fb860fSPeter Maydell     int mask = e2_tlbmask(env);
375*27fb860fSPeter Maydell 
376*27fb860fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
377*27fb860fSPeter Maydell }
378*27fb860fSPeter Maydell 
379*27fb860fSPeter Maydell static void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
380*27fb860fSPeter Maydell                                     uint64_t value)
381*27fb860fSPeter Maydell {
382*27fb860fSPeter Maydell     CPUState *cs = env_cpu(env);
383*27fb860fSPeter Maydell 
384*27fb860fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E3);
385*27fb860fSPeter Maydell }
386*27fb860fSPeter Maydell 
3877cadf113SPeter Maydell static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri,
3887cadf113SPeter Maydell                                  uint64_t value)
3897cadf113SPeter Maydell {
3907cadf113SPeter Maydell     /*
3917cadf113SPeter Maydell      * Invalidate by VA, EL2
3927cadf113SPeter Maydell      * Currently handles both VAE2 and VALE2, since we don't support
3937cadf113SPeter Maydell      * flush-last-level-only.
3947cadf113SPeter Maydell      */
3957cadf113SPeter Maydell     CPUState *cs = env_cpu(env);
3967cadf113SPeter Maydell     int mask = vae2_tlbmask(env);
3977cadf113SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
3987cadf113SPeter Maydell     int bits = vae2_tlbbits(env, pageaddr);
3997cadf113SPeter Maydell 
4007cadf113SPeter Maydell     tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
4017cadf113SPeter Maydell }
4027cadf113SPeter Maydell 
4035991e5abSPeter Maydell static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri,
4045991e5abSPeter Maydell                                  uint64_t value)
4055991e5abSPeter Maydell {
4065991e5abSPeter Maydell     /*
4075991e5abSPeter Maydell      * Invalidate by VA, EL3
4085991e5abSPeter Maydell      * Currently handles both VAE3 and VALE3, since we don't support
4095991e5abSPeter Maydell      * flush-last-level-only.
4105991e5abSPeter Maydell      */
4115991e5abSPeter Maydell     ARMCPU *cpu = env_archcpu(env);
4125991e5abSPeter Maydell     CPUState *cs = CPU(cpu);
4135991e5abSPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
4145991e5abSPeter Maydell 
4155991e5abSPeter Maydell     tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E3);
4165991e5abSPeter Maydell }
4175991e5abSPeter Maydell 
418*27fb860fSPeter Maydell static void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
419*27fb860fSPeter Maydell                                    uint64_t value)
420*27fb860fSPeter Maydell {
421*27fb860fSPeter Maydell     CPUState *cs = env_cpu(env);
422*27fb860fSPeter Maydell     int mask = vae1_tlbmask(env);
423*27fb860fSPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
424*27fb860fSPeter Maydell     int bits = vae1_tlbbits(env, pageaddr);
425*27fb860fSPeter Maydell 
426*27fb860fSPeter Maydell     tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
427*27fb860fSPeter Maydell }
428*27fb860fSPeter Maydell 
429abbb8264SPeter Maydell static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
430abbb8264SPeter Maydell                                  uint64_t value)
431abbb8264SPeter Maydell {
432abbb8264SPeter Maydell     /*
433abbb8264SPeter Maydell      * Invalidate by VA, EL1&0 (AArch64 version).
434abbb8264SPeter Maydell      * Currently handles all of VAE1, VAAE1, VAALE1 and VALE1,
435abbb8264SPeter Maydell      * since we don't support flush-for-specific-ASID-only or
436abbb8264SPeter Maydell      * flush-last-level-only.
437abbb8264SPeter Maydell      */
438abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
439abbb8264SPeter Maydell     int mask = vae1_tlbmask(env);
440abbb8264SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
441abbb8264SPeter Maydell     int bits = vae1_tlbbits(env, pageaddr);
442abbb8264SPeter Maydell 
443abbb8264SPeter Maydell     if (tlb_force_broadcast(env)) {
444abbb8264SPeter Maydell         tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
445abbb8264SPeter Maydell     } else {
446abbb8264SPeter Maydell         tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
447abbb8264SPeter Maydell     }
448abbb8264SPeter Maydell }
449abbb8264SPeter Maydell 
450*27fb860fSPeter Maydell static void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
451*27fb860fSPeter Maydell                                    uint64_t value)
452*27fb860fSPeter Maydell {
453*27fb860fSPeter Maydell     CPUState *cs = env_cpu(env);
454*27fb860fSPeter Maydell     int mask = vae2_tlbmask(env);
455*27fb860fSPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
456*27fb860fSPeter Maydell     int bits = vae2_tlbbits(env, pageaddr);
457*27fb860fSPeter Maydell 
458*27fb860fSPeter Maydell     tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
459*27fb860fSPeter Maydell }
460*27fb860fSPeter Maydell 
461*27fb860fSPeter Maydell static void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
462*27fb860fSPeter Maydell                                    uint64_t value)
463*27fb860fSPeter Maydell {
464*27fb860fSPeter Maydell     CPUState *cs = env_cpu(env);
465*27fb860fSPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
466*27fb860fSPeter Maydell     int bits = tlbbits_for_regime(env, ARMMMUIdx_E3, pageaddr);
467*27fb860fSPeter Maydell 
468*27fb860fSPeter Maydell     tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr,
469*27fb860fSPeter Maydell                                                   ARMMMUIdxBit_E3, bits);
470*27fb860fSPeter Maydell }
471*27fb860fSPeter Maydell 
472*27fb860fSPeter Maydell static int ipas2e1_tlbmask(CPUARMState *env, int64_t value)
473*27fb860fSPeter Maydell {
474*27fb860fSPeter Maydell     /*
475*27fb860fSPeter Maydell      * The MSB of value is the NS field, which only applies if SEL2
476*27fb860fSPeter Maydell      * is implemented and SCR_EL3.NS is not set (i.e. in secure mode).
477*27fb860fSPeter Maydell      */
478*27fb860fSPeter Maydell     return (value >= 0
479*27fb860fSPeter Maydell             && cpu_isar_feature(aa64_sel2, env_archcpu(env))
480*27fb860fSPeter Maydell             && arm_is_secure_below_el3(env)
481*27fb860fSPeter Maydell             ? ARMMMUIdxBit_Stage2_S
482*27fb860fSPeter Maydell             : ARMMMUIdxBit_Stage2);
483*27fb860fSPeter Maydell }
484*27fb860fSPeter Maydell 
485abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
486abbb8264SPeter Maydell                                     uint64_t value)
487abbb8264SPeter Maydell {
488abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
489abbb8264SPeter Maydell     int mask = ipas2e1_tlbmask(env, value);
490abbb8264SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
491abbb8264SPeter Maydell 
492abbb8264SPeter Maydell     if (tlb_force_broadcast(env)) {
493abbb8264SPeter Maydell         tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask);
494abbb8264SPeter Maydell     } else {
495abbb8264SPeter Maydell         tlb_flush_page_by_mmuidx(cs, pageaddr, mask);
496abbb8264SPeter Maydell     }
497abbb8264SPeter Maydell }
498abbb8264SPeter Maydell 
499abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
500abbb8264SPeter Maydell                                       uint64_t value)
501abbb8264SPeter Maydell {
502abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
503abbb8264SPeter Maydell     int mask = ipas2e1_tlbmask(env, value);
504abbb8264SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
505abbb8264SPeter Maydell 
506abbb8264SPeter Maydell     tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask);
507abbb8264SPeter Maydell }
508abbb8264SPeter Maydell 
5091e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_not_v7_cp_reginfo[] = {
5101e32ee23SPeter Maydell     /*
5111e32ee23SPeter Maydell      * MMU TLB control. Note that the wildcarding means we cover not just
5121e32ee23SPeter Maydell      * the unified TLB ops but also the dside/iside/inner-shareable variants.
5131e32ee23SPeter Maydell      */
5141e32ee23SPeter Maydell     { .name = "TLBIALL", .cp = 15, .crn = 8, .crm = CP_ANY,
5151e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 0, .access = PL1_W, .writefn = tlbiall_write,
5161e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
5171e32ee23SPeter Maydell     { .name = "TLBIMVA", .cp = 15, .crn = 8, .crm = CP_ANY,
5181e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 1, .access = PL1_W, .writefn = tlbimva_write,
5191e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
5201e32ee23SPeter Maydell     { .name = "TLBIASID", .cp = 15, .crn = 8, .crm = CP_ANY,
5211e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 2, .access = PL1_W, .writefn = tlbiasid_write,
5221e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
5231e32ee23SPeter Maydell     { .name = "TLBIMVAA", .cp = 15, .crn = 8, .crm = CP_ANY,
5241e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 3, .access = PL1_W, .writefn = tlbimvaa_write,
5251e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
5261e32ee23SPeter Maydell };
5271e32ee23SPeter Maydell 
5281e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7_cp_reginfo[] = {
5291e32ee23SPeter Maydell     /* 32 bit ITLB invalidates */
5301e32ee23SPeter Maydell     { .name = "ITLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 0,
5311e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5321e32ee23SPeter Maydell       .writefn = tlbiall_write },
5331e32ee23SPeter Maydell     { .name = "ITLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
5341e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5351e32ee23SPeter Maydell       .writefn = tlbimva_write },
5361e32ee23SPeter Maydell     { .name = "ITLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 2,
5371e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5381e32ee23SPeter Maydell       .writefn = tlbiasid_write },
5391e32ee23SPeter Maydell     /* 32 bit DTLB invalidates */
5401e32ee23SPeter Maydell     { .name = "DTLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 0,
5411e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5421e32ee23SPeter Maydell       .writefn = tlbiall_write },
5431e32ee23SPeter Maydell     { .name = "DTLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
5441e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5451e32ee23SPeter Maydell       .writefn = tlbimva_write },
5461e32ee23SPeter Maydell     { .name = "DTLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 2,
5471e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5481e32ee23SPeter Maydell       .writefn = tlbiasid_write },
5491e32ee23SPeter Maydell     /* 32 bit TLB invalidates */
5501e32ee23SPeter Maydell     { .name = "TLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
5511e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5521e32ee23SPeter Maydell       .writefn = tlbiall_write },
5531e32ee23SPeter Maydell     { .name = "TLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
5541e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5551e32ee23SPeter Maydell       .writefn = tlbimva_write },
5561e32ee23SPeter Maydell     { .name = "TLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
5571e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5581e32ee23SPeter Maydell       .writefn = tlbiasid_write },
5591e32ee23SPeter Maydell     { .name = "TLBIMVAA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
5601e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5611e32ee23SPeter Maydell       .writefn = tlbimvaa_write },
5621e32ee23SPeter Maydell };
5631e32ee23SPeter Maydell 
5641e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7mp_cp_reginfo[] = {
5651e32ee23SPeter Maydell     /* 32 bit TLB invalidates, Inner Shareable */
5661e32ee23SPeter Maydell     { .name = "TLBIALLIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
5671e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
5681e32ee23SPeter Maydell       .writefn = tlbiall_is_write },
5691e32ee23SPeter Maydell     { .name = "TLBIMVAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
5701e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
5711e32ee23SPeter Maydell       .writefn = tlbimva_is_write },
5721e32ee23SPeter Maydell     { .name = "TLBIASIDIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
5731e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
5741e32ee23SPeter Maydell       .writefn = tlbiasid_is_write },
5751e32ee23SPeter Maydell     { .name = "TLBIMVAAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
5761e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
5771e32ee23SPeter Maydell       .writefn = tlbimvaa_is_write },
5781e32ee23SPeter Maydell };
5791e32ee23SPeter Maydell 
5801e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v8_cp_reginfo[] = {
5811e32ee23SPeter Maydell     /* AArch32 TLB invalidate last level of translation table walk */
5821e32ee23SPeter Maydell     { .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
5831e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
5841e32ee23SPeter Maydell       .writefn = tlbimva_is_write },
5851e32ee23SPeter Maydell     { .name = "TLBIMVAALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
5861e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
5871e32ee23SPeter Maydell       .writefn = tlbimvaa_is_write },
5881e32ee23SPeter Maydell     { .name = "TLBIMVAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
5891e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5901e32ee23SPeter Maydell       .writefn = tlbimva_write },
5911e32ee23SPeter Maydell     { .name = "TLBIMVAAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
5921e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5931e32ee23SPeter Maydell       .writefn = tlbimvaa_write },
5941e32ee23SPeter Maydell     { .name = "TLBIMVALH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
5951e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
5961e32ee23SPeter Maydell       .writefn = tlbimva_hyp_write },
5971e32ee23SPeter Maydell     { .name = "TLBIMVALHIS",
5981e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
5991e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
6001e32ee23SPeter Maydell       .writefn = tlbimva_hyp_is_write },
6011e32ee23SPeter Maydell     { .name = "TLBIIPAS2",
6021e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
6031e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
6041e32ee23SPeter Maydell       .writefn = tlbiipas2_hyp_write },
6051e32ee23SPeter Maydell     { .name = "TLBIIPAS2IS",
6061e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
6071e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
6081e32ee23SPeter Maydell       .writefn = tlbiipas2is_hyp_write },
6091e32ee23SPeter Maydell     { .name = "TLBIIPAS2L",
6101e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
6111e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
6121e32ee23SPeter Maydell       .writefn = tlbiipas2_hyp_write },
6131e32ee23SPeter Maydell     { .name = "TLBIIPAS2LIS",
6141e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
6151e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
6161e32ee23SPeter Maydell       .writefn = tlbiipas2is_hyp_write },
617abbb8264SPeter Maydell     /* AArch64 TLBI operations */
618abbb8264SPeter Maydell     { .name = "TLBI_VMALLE1IS", .state = ARM_CP_STATE_AA64,
619abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
620abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
621abbb8264SPeter Maydell       .fgt = FGT_TLBIVMALLE1IS,
622abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1is_write },
623abbb8264SPeter Maydell     { .name = "TLBI_VAE1IS", .state = ARM_CP_STATE_AA64,
624abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
625abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
626abbb8264SPeter Maydell       .fgt = FGT_TLBIVAE1IS,
627abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
628abbb8264SPeter Maydell     { .name = "TLBI_ASIDE1IS", .state = ARM_CP_STATE_AA64,
629abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
630abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
631abbb8264SPeter Maydell       .fgt = FGT_TLBIASIDE1IS,
632abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1is_write },
633abbb8264SPeter Maydell     { .name = "TLBI_VAAE1IS", .state = ARM_CP_STATE_AA64,
634abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
635abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
636abbb8264SPeter Maydell       .fgt = FGT_TLBIVAAE1IS,
637abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
638abbb8264SPeter Maydell     { .name = "TLBI_VALE1IS", .state = ARM_CP_STATE_AA64,
639abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
640abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
641abbb8264SPeter Maydell       .fgt = FGT_TLBIVALE1IS,
642abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
643abbb8264SPeter Maydell     { .name = "TLBI_VAALE1IS", .state = ARM_CP_STATE_AA64,
644abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
645abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
646abbb8264SPeter Maydell       .fgt = FGT_TLBIVAALE1IS,
647abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
648abbb8264SPeter Maydell     { .name = "TLBI_VMALLE1", .state = ARM_CP_STATE_AA64,
649abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
650abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
651abbb8264SPeter Maydell       .fgt = FGT_TLBIVMALLE1,
652abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1_write },
653abbb8264SPeter Maydell     { .name = "TLBI_VAE1", .state = ARM_CP_STATE_AA64,
654abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
655abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
656abbb8264SPeter Maydell       .fgt = FGT_TLBIVAE1,
657abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
658abbb8264SPeter Maydell     { .name = "TLBI_ASIDE1", .state = ARM_CP_STATE_AA64,
659abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
660abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
661abbb8264SPeter Maydell       .fgt = FGT_TLBIASIDE1,
662abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1_write },
663abbb8264SPeter Maydell     { .name = "TLBI_VAAE1", .state = ARM_CP_STATE_AA64,
664abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
665abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
666abbb8264SPeter Maydell       .fgt = FGT_TLBIVAAE1,
667abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
668abbb8264SPeter Maydell     { .name = "TLBI_VALE1", .state = ARM_CP_STATE_AA64,
669abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
670abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
671abbb8264SPeter Maydell       .fgt = FGT_TLBIVALE1,
672abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
673abbb8264SPeter Maydell     { .name = "TLBI_VAALE1", .state = ARM_CP_STATE_AA64,
674abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
675abbb8264SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
676abbb8264SPeter Maydell       .fgt = FGT_TLBIVAALE1,
677abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
678abbb8264SPeter Maydell     { .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64,
679abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
680abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
681abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1is_write },
682abbb8264SPeter Maydell     { .name = "TLBI_IPAS2LE1IS", .state = ARM_CP_STATE_AA64,
683abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
684abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
685abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1is_write },
686abbb8264SPeter Maydell     { .name = "TLBI_ALLE1IS", .state = ARM_CP_STATE_AA64,
687abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
688abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
689abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
690abbb8264SPeter Maydell     { .name = "TLBI_VMALLS12E1IS", .state = ARM_CP_STATE_AA64,
691abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 6,
692abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
693abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
694abbb8264SPeter Maydell     { .name = "TLBI_IPAS2E1", .state = ARM_CP_STATE_AA64,
695abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
696abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
697abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1_write },
698abbb8264SPeter Maydell     { .name = "TLBI_IPAS2LE1", .state = ARM_CP_STATE_AA64,
699abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
700abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
701abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1_write },
702abbb8264SPeter Maydell     { .name = "TLBI_ALLE1", .state = ARM_CP_STATE_AA64,
703abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
704abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
705abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1_write },
706abbb8264SPeter Maydell     { .name = "TLBI_VMALLS12E1", .state = ARM_CP_STATE_AA64,
707abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 6,
708abbb8264SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
709abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
7101e32ee23SPeter Maydell };
7111e32ee23SPeter Maydell 
712d6b6da1fSPeter Maydell static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = {
713d6b6da1fSPeter Maydell     { .name = "TLBIALLNSNH",
714d6b6da1fSPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
715d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
716d6b6da1fSPeter Maydell       .writefn = tlbiall_nsnh_write },
717d6b6da1fSPeter Maydell     { .name = "TLBIALLNSNHIS",
718d6b6da1fSPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
719d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
720d6b6da1fSPeter Maydell       .writefn = tlbiall_nsnh_is_write },
721d6b6da1fSPeter Maydell     { .name = "TLBIALLH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
722d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
723d6b6da1fSPeter Maydell       .writefn = tlbiall_hyp_write },
724d6b6da1fSPeter Maydell     { .name = "TLBIALLHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
725d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
726d6b6da1fSPeter Maydell       .writefn = tlbiall_hyp_is_write },
727d6b6da1fSPeter Maydell     { .name = "TLBIMVAH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
728d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
729d6b6da1fSPeter Maydell       .writefn = tlbimva_hyp_write },
730d6b6da1fSPeter Maydell     { .name = "TLBIMVAHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
731d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
732d6b6da1fSPeter Maydell       .writefn = tlbimva_hyp_is_write },
7337cadf113SPeter Maydell     { .name = "TLBI_ALLE2", .state = ARM_CP_STATE_AA64,
7347cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
7357cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
7367cadf113SPeter Maydell       .writefn = tlbi_aa64_alle2_write },
7377cadf113SPeter Maydell     { .name = "TLBI_VAE2", .state = ARM_CP_STATE_AA64,
7387cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
7397cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
7407cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2_write },
7417cadf113SPeter Maydell     { .name = "TLBI_VALE2", .state = ARM_CP_STATE_AA64,
7427cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
7437cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
7447cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2_write },
7457cadf113SPeter Maydell     { .name = "TLBI_ALLE2IS", .state = ARM_CP_STATE_AA64,
7467cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
7477cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
7487cadf113SPeter Maydell       .writefn = tlbi_aa64_alle2is_write },
7497cadf113SPeter Maydell     { .name = "TLBI_VAE2IS", .state = ARM_CP_STATE_AA64,
7507cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
7517cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
7527cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2is_write },
7537cadf113SPeter Maydell     { .name = "TLBI_VALE2IS", .state = ARM_CP_STATE_AA64,
7547cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
7557cadf113SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
7567cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2is_write },
757d6b6da1fSPeter Maydell };
758d6b6da1fSPeter Maydell 
7595991e5abSPeter Maydell static const ARMCPRegInfo tlbi_el3_cp_reginfo[] = {
7605991e5abSPeter Maydell     { .name = "TLBI_ALLE3IS", .state = ARM_CP_STATE_AA64,
7615991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 0,
7625991e5abSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
7635991e5abSPeter Maydell       .writefn = tlbi_aa64_alle3is_write },
7645991e5abSPeter Maydell     { .name = "TLBI_VAE3IS", .state = ARM_CP_STATE_AA64,
7655991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 1,
7665991e5abSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
7675991e5abSPeter Maydell       .writefn = tlbi_aa64_vae3is_write },
7685991e5abSPeter Maydell     { .name = "TLBI_VALE3IS", .state = ARM_CP_STATE_AA64,
7695991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 5,
7705991e5abSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
7715991e5abSPeter Maydell       .writefn = tlbi_aa64_vae3is_write },
7725991e5abSPeter Maydell     { .name = "TLBI_ALLE3", .state = ARM_CP_STATE_AA64,
7735991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 0,
7745991e5abSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
7755991e5abSPeter Maydell       .writefn = tlbi_aa64_alle3_write },
7765991e5abSPeter Maydell     { .name = "TLBI_VAE3", .state = ARM_CP_STATE_AA64,
7775991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 1,
7785991e5abSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
7795991e5abSPeter Maydell       .writefn = tlbi_aa64_vae3_write },
7805991e5abSPeter Maydell     { .name = "TLBI_VALE3", .state = ARM_CP_STATE_AA64,
7815991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 5,
7825991e5abSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
7835991e5abSPeter Maydell       .writefn = tlbi_aa64_vae3_write },
7845991e5abSPeter Maydell };
7855991e5abSPeter Maydell 
78665593799SPeter Maydell #ifdef TARGET_AARCH64
78765593799SPeter Maydell typedef struct {
78865593799SPeter Maydell     uint64_t base;
78965593799SPeter Maydell     uint64_t length;
79065593799SPeter Maydell } TLBIRange;
79165593799SPeter Maydell 
79265593799SPeter Maydell static ARMGranuleSize tlbi_range_tg_to_gran_size(int tg)
79365593799SPeter Maydell {
79465593799SPeter Maydell     /*
79565593799SPeter Maydell      * Note that the TLBI range TG field encoding differs from both
79665593799SPeter Maydell      * TG0 and TG1 encodings.
79765593799SPeter Maydell      */
79865593799SPeter Maydell     switch (tg) {
79965593799SPeter Maydell     case 1:
80065593799SPeter Maydell         return Gran4K;
80165593799SPeter Maydell     case 2:
80265593799SPeter Maydell         return Gran16K;
80365593799SPeter Maydell     case 3:
80465593799SPeter Maydell         return Gran64K;
80565593799SPeter Maydell     default:
80665593799SPeter Maydell         return GranInvalid;
80765593799SPeter Maydell     }
80865593799SPeter Maydell }
80965593799SPeter Maydell 
81065593799SPeter Maydell static TLBIRange tlbi_aa64_get_range(CPUARMState *env, ARMMMUIdx mmuidx,
81165593799SPeter Maydell                                      uint64_t value)
81265593799SPeter Maydell {
81365593799SPeter Maydell     unsigned int page_size_granule, page_shift, num, scale, exponent;
81465593799SPeter Maydell     /* Extract one bit to represent the va selector in use. */
81565593799SPeter Maydell     uint64_t select = sextract64(value, 36, 1);
81665593799SPeter Maydell     ARMVAParameters param = aa64_va_parameters(env, select, mmuidx, true, false);
81765593799SPeter Maydell     TLBIRange ret = { };
81865593799SPeter Maydell     ARMGranuleSize gran;
81965593799SPeter Maydell 
82065593799SPeter Maydell     page_size_granule = extract64(value, 46, 2);
82165593799SPeter Maydell     gran = tlbi_range_tg_to_gran_size(page_size_granule);
82265593799SPeter Maydell 
82365593799SPeter Maydell     /* The granule encoded in value must match the granule in use. */
82465593799SPeter Maydell     if (gran != param.gran) {
82565593799SPeter Maydell         qemu_log_mask(LOG_GUEST_ERROR, "Invalid tlbi page size granule %d\n",
82665593799SPeter Maydell                       page_size_granule);
82765593799SPeter Maydell         return ret;
82865593799SPeter Maydell     }
82965593799SPeter Maydell 
83065593799SPeter Maydell     page_shift = arm_granule_bits(gran);
83165593799SPeter Maydell     num = extract64(value, 39, 5);
83265593799SPeter Maydell     scale = extract64(value, 44, 2);
83365593799SPeter Maydell     exponent = (5 * scale) + 1;
83465593799SPeter Maydell 
83565593799SPeter Maydell     ret.length = (num + 1) << (exponent + page_shift);
83665593799SPeter Maydell 
83765593799SPeter Maydell     if (param.select) {
83865593799SPeter Maydell         ret.base = sextract64(value, 0, 37);
83965593799SPeter Maydell     } else {
84065593799SPeter Maydell         ret.base = extract64(value, 0, 37);
84165593799SPeter Maydell     }
84265593799SPeter Maydell     if (param.ds) {
84365593799SPeter Maydell         /*
84465593799SPeter Maydell          * With DS=1, BaseADDR is always shifted 16 so that it is able
84565593799SPeter Maydell          * to address all 52 va bits.  The input address is perforce
84665593799SPeter Maydell          * aligned on a 64k boundary regardless of translation granule.
84765593799SPeter Maydell          */
84865593799SPeter Maydell         page_shift = 16;
84965593799SPeter Maydell     }
85065593799SPeter Maydell     ret.base <<= page_shift;
85165593799SPeter Maydell 
85265593799SPeter Maydell     return ret;
85365593799SPeter Maydell }
85465593799SPeter Maydell 
85565593799SPeter Maydell static void do_rvae_write(CPUARMState *env, uint64_t value,
85665593799SPeter Maydell                           int idxmap, bool synced)
85765593799SPeter Maydell {
85865593799SPeter Maydell     ARMMMUIdx one_idx = ARM_MMU_IDX_A | ctz32(idxmap);
85965593799SPeter Maydell     TLBIRange range;
86065593799SPeter Maydell     int bits;
86165593799SPeter Maydell 
86265593799SPeter Maydell     range = tlbi_aa64_get_range(env, one_idx, value);
86365593799SPeter Maydell     bits = tlbbits_for_regime(env, one_idx, range.base);
86465593799SPeter Maydell 
86565593799SPeter Maydell     if (synced) {
86665593799SPeter Maydell         tlb_flush_range_by_mmuidx_all_cpus_synced(env_cpu(env),
86765593799SPeter Maydell                                                   range.base,
86865593799SPeter Maydell                                                   range.length,
86965593799SPeter Maydell                                                   idxmap,
87065593799SPeter Maydell                                                   bits);
87165593799SPeter Maydell     } else {
87265593799SPeter Maydell         tlb_flush_range_by_mmuidx(env_cpu(env), range.base,
87365593799SPeter Maydell                                   range.length, idxmap, bits);
87465593799SPeter Maydell     }
87565593799SPeter Maydell }
87665593799SPeter Maydell 
87765593799SPeter Maydell static void tlbi_aa64_rvae1_write(CPUARMState *env,
87865593799SPeter Maydell                                   const ARMCPRegInfo *ri,
87965593799SPeter Maydell                                   uint64_t value)
88065593799SPeter Maydell {
88165593799SPeter Maydell     /*
88265593799SPeter Maydell      * Invalidate by VA range, EL1&0.
88365593799SPeter Maydell      * Currently handles all of RVAE1, RVAAE1, RVAALE1 and RVALE1,
88465593799SPeter Maydell      * since we don't support flush-for-specific-ASID-only or
88565593799SPeter Maydell      * flush-last-level-only.
88665593799SPeter Maydell      */
88765593799SPeter Maydell 
88865593799SPeter Maydell     do_rvae_write(env, value, vae1_tlbmask(env),
88965593799SPeter Maydell                   tlb_force_broadcast(env));
89065593799SPeter Maydell }
89165593799SPeter Maydell 
89265593799SPeter Maydell static void tlbi_aa64_rvae1is_write(CPUARMState *env,
89365593799SPeter Maydell                                     const ARMCPRegInfo *ri,
89465593799SPeter Maydell                                     uint64_t value)
89565593799SPeter Maydell {
89665593799SPeter Maydell     /*
89765593799SPeter Maydell      * Invalidate by VA range, Inner/Outer Shareable EL1&0.
89865593799SPeter Maydell      * Currently handles all of RVAE1IS, RVAE1OS, RVAAE1IS, RVAAE1OS,
89965593799SPeter Maydell      * RVAALE1IS, RVAALE1OS, RVALE1IS and RVALE1OS, since we don't support
90065593799SPeter Maydell      * flush-for-specific-ASID-only, flush-last-level-only or inner/outer
90165593799SPeter Maydell      * shareable specific flushes.
90265593799SPeter Maydell      */
90365593799SPeter Maydell 
90465593799SPeter Maydell     do_rvae_write(env, value, vae1_tlbmask(env), true);
90565593799SPeter Maydell }
90665593799SPeter Maydell 
90765593799SPeter Maydell static void tlbi_aa64_rvae2_write(CPUARMState *env,
90865593799SPeter Maydell                                   const ARMCPRegInfo *ri,
90965593799SPeter Maydell                                   uint64_t value)
91065593799SPeter Maydell {
91165593799SPeter Maydell     /*
91265593799SPeter Maydell      * Invalidate by VA range, EL2.
91365593799SPeter Maydell      * Currently handles all of RVAE2 and RVALE2,
91465593799SPeter Maydell      * since we don't support flush-for-specific-ASID-only or
91565593799SPeter Maydell      * flush-last-level-only.
91665593799SPeter Maydell      */
91765593799SPeter Maydell 
91865593799SPeter Maydell     do_rvae_write(env, value, vae2_tlbmask(env),
91965593799SPeter Maydell                   tlb_force_broadcast(env));
92065593799SPeter Maydell 
92165593799SPeter Maydell 
92265593799SPeter Maydell }
92365593799SPeter Maydell 
92465593799SPeter Maydell static void tlbi_aa64_rvae2is_write(CPUARMState *env,
92565593799SPeter Maydell                                     const ARMCPRegInfo *ri,
92665593799SPeter Maydell                                     uint64_t value)
92765593799SPeter Maydell {
92865593799SPeter Maydell     /*
92965593799SPeter Maydell      * Invalidate by VA range, Inner/Outer Shareable, EL2.
93065593799SPeter Maydell      * Currently handles all of RVAE2IS, RVAE2OS, RVALE2IS and RVALE2OS,
93165593799SPeter Maydell      * since we don't support flush-for-specific-ASID-only,
93265593799SPeter Maydell      * flush-last-level-only or inner/outer shareable specific flushes.
93365593799SPeter Maydell      */
93465593799SPeter Maydell 
93565593799SPeter Maydell     do_rvae_write(env, value, vae2_tlbmask(env), true);
93665593799SPeter Maydell 
93765593799SPeter Maydell }
93865593799SPeter Maydell 
93965593799SPeter Maydell static void tlbi_aa64_rvae3_write(CPUARMState *env,
94065593799SPeter Maydell                                   const ARMCPRegInfo *ri,
94165593799SPeter Maydell                                   uint64_t value)
94265593799SPeter Maydell {
94365593799SPeter Maydell     /*
94465593799SPeter Maydell      * Invalidate by VA range, EL3.
94565593799SPeter Maydell      * Currently handles all of RVAE3 and RVALE3,
94665593799SPeter Maydell      * since we don't support flush-for-specific-ASID-only or
94765593799SPeter Maydell      * flush-last-level-only.
94865593799SPeter Maydell      */
94965593799SPeter Maydell 
95065593799SPeter Maydell     do_rvae_write(env, value, ARMMMUIdxBit_E3, tlb_force_broadcast(env));
95165593799SPeter Maydell }
95265593799SPeter Maydell 
95365593799SPeter Maydell static void tlbi_aa64_rvae3is_write(CPUARMState *env,
95465593799SPeter Maydell                                     const ARMCPRegInfo *ri,
95565593799SPeter Maydell                                     uint64_t value)
95665593799SPeter Maydell {
95765593799SPeter Maydell     /*
95865593799SPeter Maydell      * Invalidate by VA range, EL3, Inner/Outer Shareable.
95965593799SPeter Maydell      * Currently handles all of RVAE3IS, RVAE3OS, RVALE3IS and RVALE3OS,
96065593799SPeter Maydell      * since we don't support flush-for-specific-ASID-only,
96165593799SPeter Maydell      * flush-last-level-only or inner/outer specific flushes.
96265593799SPeter Maydell      */
96365593799SPeter Maydell 
96465593799SPeter Maydell     do_rvae_write(env, value, ARMMMUIdxBit_E3, true);
96565593799SPeter Maydell }
96665593799SPeter Maydell 
96765593799SPeter Maydell static void tlbi_aa64_ripas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
96865593799SPeter Maydell                                      uint64_t value)
96965593799SPeter Maydell {
97065593799SPeter Maydell     do_rvae_write(env, value, ipas2e1_tlbmask(env, value),
97165593799SPeter Maydell                   tlb_force_broadcast(env));
97265593799SPeter Maydell }
97365593799SPeter Maydell 
97465593799SPeter Maydell static void tlbi_aa64_ripas2e1is_write(CPUARMState *env,
97565593799SPeter Maydell                                        const ARMCPRegInfo *ri,
97665593799SPeter Maydell                                        uint64_t value)
97765593799SPeter Maydell {
97865593799SPeter Maydell     do_rvae_write(env, value, ipas2e1_tlbmask(env, value), true);
97965593799SPeter Maydell }
98065593799SPeter Maydell 
98165593799SPeter Maydell static const ARMCPRegInfo tlbirange_reginfo[] = {
98265593799SPeter Maydell     { .name = "TLBI_RVAE1IS", .state = ARM_CP_STATE_AA64,
98365593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 1,
98465593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
98565593799SPeter Maydell       .fgt = FGT_TLBIRVAE1IS,
98665593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
98765593799SPeter Maydell     { .name = "TLBI_RVAAE1IS", .state = ARM_CP_STATE_AA64,
98865593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 3,
98965593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
99065593799SPeter Maydell       .fgt = FGT_TLBIRVAAE1IS,
99165593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
99265593799SPeter Maydell    { .name = "TLBI_RVALE1IS", .state = ARM_CP_STATE_AA64,
99365593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 5,
99465593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
99565593799SPeter Maydell       .fgt = FGT_TLBIRVALE1IS,
99665593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
99765593799SPeter Maydell     { .name = "TLBI_RVAALE1IS", .state = ARM_CP_STATE_AA64,
99865593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 7,
99965593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
100065593799SPeter Maydell       .fgt = FGT_TLBIRVAALE1IS,
100165593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
100265593799SPeter Maydell     { .name = "TLBI_RVAE1OS", .state = ARM_CP_STATE_AA64,
100365593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
100465593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
100565593799SPeter Maydell       .fgt = FGT_TLBIRVAE1OS,
100665593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
100765593799SPeter Maydell     { .name = "TLBI_RVAAE1OS", .state = ARM_CP_STATE_AA64,
100865593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 3,
100965593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
101065593799SPeter Maydell       .fgt = FGT_TLBIRVAAE1OS,
101165593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
101265593799SPeter Maydell    { .name = "TLBI_RVALE1OS", .state = ARM_CP_STATE_AA64,
101365593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 5,
101465593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
101565593799SPeter Maydell       .fgt = FGT_TLBIRVALE1OS,
101665593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
101765593799SPeter Maydell     { .name = "TLBI_RVAALE1OS", .state = ARM_CP_STATE_AA64,
101865593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 7,
101965593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
102065593799SPeter Maydell       .fgt = FGT_TLBIRVAALE1OS,
102165593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
102265593799SPeter Maydell     { .name = "TLBI_RVAE1", .state = ARM_CP_STATE_AA64,
102365593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
102465593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
102565593799SPeter Maydell       .fgt = FGT_TLBIRVAE1,
102665593799SPeter Maydell       .writefn = tlbi_aa64_rvae1_write },
102765593799SPeter Maydell     { .name = "TLBI_RVAAE1", .state = ARM_CP_STATE_AA64,
102865593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 3,
102965593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
103065593799SPeter Maydell       .fgt = FGT_TLBIRVAAE1,
103165593799SPeter Maydell       .writefn = tlbi_aa64_rvae1_write },
103265593799SPeter Maydell    { .name = "TLBI_RVALE1", .state = ARM_CP_STATE_AA64,
103365593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 5,
103465593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
103565593799SPeter Maydell       .fgt = FGT_TLBIRVALE1,
103665593799SPeter Maydell       .writefn = tlbi_aa64_rvae1_write },
103765593799SPeter Maydell     { .name = "TLBI_RVAALE1", .state = ARM_CP_STATE_AA64,
103865593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 7,
103965593799SPeter Maydell       .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
104065593799SPeter Maydell       .fgt = FGT_TLBIRVAALE1,
104165593799SPeter Maydell       .writefn = tlbi_aa64_rvae1_write },
104265593799SPeter Maydell     { .name = "TLBI_RIPAS2E1IS", .state = ARM_CP_STATE_AA64,
104365593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 2,
104465593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
104565593799SPeter Maydell       .writefn = tlbi_aa64_ripas2e1is_write },
104665593799SPeter Maydell     { .name = "TLBI_RIPAS2LE1IS", .state = ARM_CP_STATE_AA64,
104765593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 6,
104865593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
104965593799SPeter Maydell       .writefn = tlbi_aa64_ripas2e1is_write },
105065593799SPeter Maydell     { .name = "TLBI_RVAE2IS", .state = ARM_CP_STATE_AA64,
105165593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 1,
105265593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
105365593799SPeter Maydell       .writefn = tlbi_aa64_rvae2is_write },
105465593799SPeter Maydell    { .name = "TLBI_RVALE2IS", .state = ARM_CP_STATE_AA64,
105565593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 5,
105665593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
105765593799SPeter Maydell       .writefn = tlbi_aa64_rvae2is_write },
105865593799SPeter Maydell     { .name = "TLBI_RIPAS2E1", .state = ARM_CP_STATE_AA64,
105965593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 2,
106065593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
106165593799SPeter Maydell       .writefn = tlbi_aa64_ripas2e1_write },
106265593799SPeter Maydell     { .name = "TLBI_RIPAS2LE1", .state = ARM_CP_STATE_AA64,
106365593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 6,
106465593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
106565593799SPeter Maydell       .writefn = tlbi_aa64_ripas2e1_write },
106665593799SPeter Maydell    { .name = "TLBI_RVAE2OS", .state = ARM_CP_STATE_AA64,
106765593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 1,
106865593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
106965593799SPeter Maydell       .writefn = tlbi_aa64_rvae2is_write },
107065593799SPeter Maydell    { .name = "TLBI_RVALE2OS", .state = ARM_CP_STATE_AA64,
107165593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 5,
107265593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
107365593799SPeter Maydell       .writefn = tlbi_aa64_rvae2is_write },
107465593799SPeter Maydell     { .name = "TLBI_RVAE2", .state = ARM_CP_STATE_AA64,
107565593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 1,
107665593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
107765593799SPeter Maydell       .writefn = tlbi_aa64_rvae2_write },
107865593799SPeter Maydell    { .name = "TLBI_RVALE2", .state = ARM_CP_STATE_AA64,
107965593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 5,
108065593799SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
108165593799SPeter Maydell       .writefn = tlbi_aa64_rvae2_write },
108265593799SPeter Maydell    { .name = "TLBI_RVAE3IS", .state = ARM_CP_STATE_AA64,
108365593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 1,
108465593799SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
108565593799SPeter Maydell       .writefn = tlbi_aa64_rvae3is_write },
108665593799SPeter Maydell    { .name = "TLBI_RVALE3IS", .state = ARM_CP_STATE_AA64,
108765593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 5,
108865593799SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
108965593799SPeter Maydell       .writefn = tlbi_aa64_rvae3is_write },
109065593799SPeter Maydell    { .name = "TLBI_RVAE3OS", .state = ARM_CP_STATE_AA64,
109165593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 1,
109265593799SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
109365593799SPeter Maydell       .writefn = tlbi_aa64_rvae3is_write },
109465593799SPeter Maydell    { .name = "TLBI_RVALE3OS", .state = ARM_CP_STATE_AA64,
109565593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 5,
109665593799SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
109765593799SPeter Maydell       .writefn = tlbi_aa64_rvae3is_write },
109865593799SPeter Maydell    { .name = "TLBI_RVAE3", .state = ARM_CP_STATE_AA64,
109965593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 1,
110065593799SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
110165593799SPeter Maydell       .writefn = tlbi_aa64_rvae3_write },
110265593799SPeter Maydell    { .name = "TLBI_RVALE3", .state = ARM_CP_STATE_AA64,
110365593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 5,
110465593799SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
110565593799SPeter Maydell       .writefn = tlbi_aa64_rvae3_write },
110665593799SPeter Maydell };
1107b0f7cd35SPeter Maydell 
1108b0f7cd35SPeter Maydell static const ARMCPRegInfo tlbios_reginfo[] = {
1109b0f7cd35SPeter Maydell     { .name = "TLBI_VMALLE1OS", .state = ARM_CP_STATE_AA64,
1110b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 0,
1111b0f7cd35SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
1112b0f7cd35SPeter Maydell       .fgt = FGT_TLBIVMALLE1OS,
1113b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vmalle1is_write },
1114b0f7cd35SPeter Maydell     { .name = "TLBI_VAE1OS", .state = ARM_CP_STATE_AA64,
1115b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 1,
1116b0f7cd35SPeter Maydell       .fgt = FGT_TLBIVAE1OS,
1117b0f7cd35SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
1118b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
1119b0f7cd35SPeter Maydell     { .name = "TLBI_ASIDE1OS", .state = ARM_CP_STATE_AA64,
1120b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 2,
1121b0f7cd35SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
1122b0f7cd35SPeter Maydell       .fgt = FGT_TLBIASIDE1OS,
1123b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vmalle1is_write },
1124b0f7cd35SPeter Maydell     { .name = "TLBI_VAAE1OS", .state = ARM_CP_STATE_AA64,
1125b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 3,
1126b0f7cd35SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
1127b0f7cd35SPeter Maydell       .fgt = FGT_TLBIVAAE1OS,
1128b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
1129b0f7cd35SPeter Maydell     { .name = "TLBI_VALE1OS", .state = ARM_CP_STATE_AA64,
1130b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 5,
1131b0f7cd35SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
1132b0f7cd35SPeter Maydell       .fgt = FGT_TLBIVALE1OS,
1133b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
1134b0f7cd35SPeter Maydell     { .name = "TLBI_VAALE1OS", .state = ARM_CP_STATE_AA64,
1135b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 7,
1136b0f7cd35SPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
1137b0f7cd35SPeter Maydell       .fgt = FGT_TLBIVAALE1OS,
1138b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
1139b0f7cd35SPeter Maydell     { .name = "TLBI_ALLE2OS", .state = ARM_CP_STATE_AA64,
1140b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 0,
1141b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
1142b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_alle2is_write },
1143b0f7cd35SPeter Maydell     { .name = "TLBI_VAE2OS", .state = ARM_CP_STATE_AA64,
1144b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 1,
1145b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
1146b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae2is_write },
1147b0f7cd35SPeter Maydell    { .name = "TLBI_ALLE1OS", .state = ARM_CP_STATE_AA64,
1148b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 4,
1149b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
1150b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
1151b0f7cd35SPeter Maydell     { .name = "TLBI_VALE2OS", .state = ARM_CP_STATE_AA64,
1152b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 5,
1153b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
1154b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae2is_write },
1155b0f7cd35SPeter Maydell     { .name = "TLBI_VMALLS12E1OS", .state = ARM_CP_STATE_AA64,
1156b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 6,
1157b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW,
1158b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
1159b0f7cd35SPeter Maydell     { .name = "TLBI_IPAS2E1OS", .state = ARM_CP_STATE_AA64,
1160b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 0,
1161b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NOP },
1162b0f7cd35SPeter Maydell     { .name = "TLBI_RIPAS2E1OS", .state = ARM_CP_STATE_AA64,
1163b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 3,
1164b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NOP },
1165b0f7cd35SPeter Maydell     { .name = "TLBI_IPAS2LE1OS", .state = ARM_CP_STATE_AA64,
1166b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 4,
1167b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NOP },
1168b0f7cd35SPeter Maydell     { .name = "TLBI_RIPAS2LE1OS", .state = ARM_CP_STATE_AA64,
1169b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 7,
1170b0f7cd35SPeter Maydell       .access = PL2_W, .type = ARM_CP_NOP },
1171b0f7cd35SPeter Maydell     { .name = "TLBI_ALLE3OS", .state = ARM_CP_STATE_AA64,
1172b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 0,
1173b0f7cd35SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
1174b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_alle3is_write },
1175b0f7cd35SPeter Maydell     { .name = "TLBI_VAE3OS", .state = ARM_CP_STATE_AA64,
1176b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 1,
1177b0f7cd35SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
1178b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae3is_write },
1179b0f7cd35SPeter Maydell     { .name = "TLBI_VALE3OS", .state = ARM_CP_STATE_AA64,
1180b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 5,
1181b0f7cd35SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
1182b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae3is_write },
1183b0f7cd35SPeter Maydell };
118465593799SPeter Maydell #endif
118565593799SPeter Maydell 
11861e32ee23SPeter Maydell void define_tlb_insn_regs(ARMCPU *cpu)
11871e32ee23SPeter Maydell {
11881e32ee23SPeter Maydell     CPUARMState *env = &cpu->env;
11891e32ee23SPeter Maydell 
11901e32ee23SPeter Maydell     if (!arm_feature(env, ARM_FEATURE_V7)) {
11911e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_not_v7_cp_reginfo);
11921e32ee23SPeter Maydell     } else {
11931e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v7_cp_reginfo);
11941e32ee23SPeter Maydell     }
11951e32ee23SPeter Maydell     if (arm_feature(env, ARM_FEATURE_V7MP) &&
11961e32ee23SPeter Maydell         !arm_feature(env, ARM_FEATURE_PMSA)) {
11971e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v7mp_cp_reginfo);
11981e32ee23SPeter Maydell     }
11991e32ee23SPeter Maydell     if (arm_feature(env, ARM_FEATURE_V8)) {
12001e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v8_cp_reginfo);
12011e32ee23SPeter Maydell     }
1202d6b6da1fSPeter Maydell     /*
1203d6b6da1fSPeter Maydell      * We retain the existing logic for when to register these TLBI
1204d6b6da1fSPeter Maydell      * ops (i.e. matching the condition for el2_cp_reginfo[] in
1205d6b6da1fSPeter Maydell      * helper.c), but we will be able to simplify this later.
1206d6b6da1fSPeter Maydell      */
1207d6b6da1fSPeter Maydell     if (arm_feature(env, ARM_FEATURE_EL2)
1208d6b6da1fSPeter Maydell         || (arm_feature(env, ARM_FEATURE_EL3)
1209d6b6da1fSPeter Maydell             && arm_feature(env, ARM_FEATURE_V8))) {
1210d6b6da1fSPeter Maydell         define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo);
1211d6b6da1fSPeter Maydell     }
12125991e5abSPeter Maydell     if (arm_feature(env, ARM_FEATURE_EL3)) {
12135991e5abSPeter Maydell         define_arm_cp_regs(cpu, tlbi_el3_cp_reginfo);
12145991e5abSPeter Maydell     }
121565593799SPeter Maydell #ifdef TARGET_AARCH64
121665593799SPeter Maydell     if (cpu_isar_feature(aa64_tlbirange, cpu)) {
121765593799SPeter Maydell         define_arm_cp_regs(cpu, tlbirange_reginfo);
121865593799SPeter Maydell     }
1219b0f7cd35SPeter Maydell     if (cpu_isar_feature(aa64_tlbios, cpu)) {
1220b0f7cd35SPeter Maydell         define_arm_cp_regs(cpu, tlbios_reginfo);
1221b0f7cd35SPeter Maydell     }
122265593799SPeter Maydell #endif
12231e32ee23SPeter Maydell }
1224