xref: /qemu/target/arm/tcg/tlb-insns.c (revision 5cb8b0988bdf1e1b22f66925604fe9a44a568993)
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"
106ff5da16SPhilippe Mathieu-Daudé #include "exec/cputlb.h"
11*9c2ff9cdSPierrick Bouvier #include "exec/target_page.h"
121e32ee23SPeter Maydell #include "cpu.h"
131e32ee23SPeter Maydell #include "internals.h"
141e32ee23SPeter Maydell #include "cpu-features.h"
151e32ee23SPeter Maydell #include "cpregs.h"
161e32ee23SPeter Maydell 
1727fb860fSPeter Maydell /* Check for traps from EL1 due to HCR_EL2.TTLB. */
access_ttlb(CPUARMState * env,const ARMCPRegInfo * ri,bool isread)1827fb860fSPeter Maydell static CPAccessResult access_ttlb(CPUARMState *env, const ARMCPRegInfo *ri,
1927fb860fSPeter Maydell                                   bool isread)
2027fb860fSPeter Maydell {
2127fb860fSPeter Maydell     if (arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_TTLB)) {
2227fb860fSPeter Maydell         return CP_ACCESS_TRAP_EL2;
2327fb860fSPeter Maydell     }
2427fb860fSPeter Maydell     return CP_ACCESS_OK;
2527fb860fSPeter Maydell }
2627fb860fSPeter Maydell 
2727fb860fSPeter Maydell /* Check for traps from EL1 due to HCR_EL2.TTLB or TTLBIS. */
access_ttlbis(CPUARMState * env,const ARMCPRegInfo * ri,bool isread)2827fb860fSPeter Maydell static CPAccessResult access_ttlbis(CPUARMState *env, const ARMCPRegInfo *ri,
2927fb860fSPeter Maydell                                     bool isread)
3027fb860fSPeter Maydell {
3127fb860fSPeter Maydell     if (arm_current_el(env) == 1 &&
3227fb860fSPeter Maydell         (arm_hcr_el2_eff(env) & (HCR_TTLB | HCR_TTLBIS))) {
3327fb860fSPeter Maydell         return CP_ACCESS_TRAP_EL2;
3427fb860fSPeter Maydell     }
3527fb860fSPeter Maydell     return CP_ACCESS_OK;
3627fb860fSPeter Maydell }
3727fb860fSPeter Maydell 
3827fb860fSPeter Maydell /* Check for traps from EL1 due to HCR_EL2.TTLB or TTLBOS. */
access_ttlbos(CPUARMState * env,const ARMCPRegInfo * ri,bool isread)3927fb860fSPeter Maydell static CPAccessResult access_ttlbos(CPUARMState *env, const ARMCPRegInfo *ri,
4027fb860fSPeter Maydell                                     bool isread)
4127fb860fSPeter Maydell {
4227fb860fSPeter Maydell     if (arm_current_el(env) == 1 &&
4327fb860fSPeter Maydell         (arm_hcr_el2_eff(env) & (HCR_TTLB | HCR_TTLBOS))) {
4427fb860fSPeter Maydell         return CP_ACCESS_TRAP_EL2;
4527fb860fSPeter Maydell     }
4627fb860fSPeter Maydell     return CP_ACCESS_OK;
4727fb860fSPeter Maydell }
4827fb860fSPeter Maydell 
491e32ee23SPeter Maydell /* IS variants of TLB operations must affect all cores */
tlbiall_is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)501e32ee23SPeter Maydell static void tlbiall_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
511e32ee23SPeter Maydell                              uint64_t value)
521e32ee23SPeter Maydell {
531e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
541e32ee23SPeter Maydell 
551e32ee23SPeter Maydell     tlb_flush_all_cpus_synced(cs);
561e32ee23SPeter Maydell }
571e32ee23SPeter Maydell 
tlbiasid_is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)581e32ee23SPeter Maydell static void tlbiasid_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
591e32ee23SPeter Maydell                              uint64_t value)
601e32ee23SPeter Maydell {
611e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
621e32ee23SPeter Maydell 
631e32ee23SPeter Maydell     tlb_flush_all_cpus_synced(cs);
641e32ee23SPeter Maydell }
651e32ee23SPeter Maydell 
tlbimva_is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)661e32ee23SPeter Maydell static void tlbimva_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
671e32ee23SPeter Maydell                              uint64_t value)
681e32ee23SPeter Maydell {
691e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
701e32ee23SPeter Maydell 
711e32ee23SPeter Maydell     tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK);
721e32ee23SPeter Maydell }
731e32ee23SPeter Maydell 
tlbimvaa_is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)741e32ee23SPeter Maydell static void tlbimvaa_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
751e32ee23SPeter Maydell                              uint64_t value)
761e32ee23SPeter Maydell {
771e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
781e32ee23SPeter Maydell 
791e32ee23SPeter Maydell     tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK);
801e32ee23SPeter Maydell }
811e32ee23SPeter Maydell 
8227fb860fSPeter Maydell /*
8327fb860fSPeter Maydell  * Non-IS variants of TLB operations are upgraded to
8427fb860fSPeter Maydell  * IS versions if we are at EL1 and HCR_EL2.FB is effectively set to
8527fb860fSPeter Maydell  * force broadcast of these operations.
8627fb860fSPeter Maydell  */
tlb_force_broadcast(CPUARMState * env)8727fb860fSPeter Maydell static bool tlb_force_broadcast(CPUARMState *env)
8827fb860fSPeter Maydell {
8927fb860fSPeter Maydell     return arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_FB);
9027fb860fSPeter Maydell }
9127fb860fSPeter Maydell 
tlbiall_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)921e32ee23SPeter Maydell static void tlbiall_write(CPUARMState *env, const ARMCPRegInfo *ri,
931e32ee23SPeter Maydell                           uint64_t value)
941e32ee23SPeter Maydell {
951e32ee23SPeter Maydell     /* Invalidate all (TLBIALL) */
961e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
971e32ee23SPeter Maydell 
981e32ee23SPeter Maydell     if (tlb_force_broadcast(env)) {
991e32ee23SPeter Maydell         tlb_flush_all_cpus_synced(cs);
1001e32ee23SPeter Maydell     } else {
1011e32ee23SPeter Maydell         tlb_flush(cs);
1021e32ee23SPeter Maydell     }
1031e32ee23SPeter Maydell }
1041e32ee23SPeter Maydell 
tlbimva_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)1051e32ee23SPeter Maydell static void tlbimva_write(CPUARMState *env, const ARMCPRegInfo *ri,
1061e32ee23SPeter Maydell                           uint64_t value)
1071e32ee23SPeter Maydell {
1081e32ee23SPeter Maydell     /* Invalidate single TLB entry by MVA and ASID (TLBIMVA) */
1091e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
1101e32ee23SPeter Maydell 
1111e32ee23SPeter Maydell     value &= TARGET_PAGE_MASK;
1121e32ee23SPeter Maydell     if (tlb_force_broadcast(env)) {
1131e32ee23SPeter Maydell         tlb_flush_page_all_cpus_synced(cs, value);
1141e32ee23SPeter Maydell     } else {
1151e32ee23SPeter Maydell         tlb_flush_page(cs, value);
1161e32ee23SPeter Maydell     }
1171e32ee23SPeter Maydell }
1181e32ee23SPeter Maydell 
tlbiasid_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)1191e32ee23SPeter Maydell static void tlbiasid_write(CPUARMState *env, const ARMCPRegInfo *ri,
1201e32ee23SPeter Maydell                            uint64_t value)
1211e32ee23SPeter Maydell {
1221e32ee23SPeter Maydell     /* Invalidate by ASID (TLBIASID) */
1231e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
1241e32ee23SPeter Maydell 
1251e32ee23SPeter Maydell     if (tlb_force_broadcast(env)) {
1261e32ee23SPeter Maydell         tlb_flush_all_cpus_synced(cs);
1271e32ee23SPeter Maydell     } else {
1281e32ee23SPeter Maydell         tlb_flush(cs);
1291e32ee23SPeter Maydell     }
1301e32ee23SPeter Maydell }
1311e32ee23SPeter Maydell 
tlbimvaa_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)1321e32ee23SPeter Maydell static void tlbimvaa_write(CPUARMState *env, const ARMCPRegInfo *ri,
1331e32ee23SPeter Maydell                            uint64_t value)
1341e32ee23SPeter Maydell {
1351e32ee23SPeter Maydell     /* Invalidate single entry by MVA, all ASIDs (TLBIMVAA) */
1361e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
1371e32ee23SPeter Maydell 
1381e32ee23SPeter Maydell     value &= TARGET_PAGE_MASK;
1391e32ee23SPeter Maydell     if (tlb_force_broadcast(env)) {
1401e32ee23SPeter Maydell         tlb_flush_page_all_cpus_synced(cs, value);
1411e32ee23SPeter Maydell     } else {
1421e32ee23SPeter Maydell         tlb_flush_page(cs, value);
1431e32ee23SPeter Maydell     }
1441e32ee23SPeter Maydell }
1451e32ee23SPeter Maydell 
tlbimva_hyp_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)146d6b6da1fSPeter Maydell static void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
147d6b6da1fSPeter Maydell                               uint64_t value)
148d6b6da1fSPeter Maydell {
149d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
150d6b6da1fSPeter Maydell     uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
151d6b6da1fSPeter Maydell 
152d6b6da1fSPeter Maydell     tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E2);
153d6b6da1fSPeter Maydell }
154d6b6da1fSPeter Maydell 
tlbimva_hyp_is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)155d6b6da1fSPeter Maydell static void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
156d6b6da1fSPeter Maydell                                  uint64_t value)
157d6b6da1fSPeter Maydell {
158d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
159d6b6da1fSPeter Maydell     uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
160d6b6da1fSPeter Maydell 
161d6b6da1fSPeter Maydell     tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr,
162d6b6da1fSPeter Maydell                                              ARMMMUIdxBit_E2);
163d6b6da1fSPeter Maydell }
164d6b6da1fSPeter Maydell 
tlbiipas2_hyp_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)1651e32ee23SPeter Maydell static void tlbiipas2_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
1661e32ee23SPeter Maydell                                 uint64_t value)
1671e32ee23SPeter Maydell {
1681e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
1691e32ee23SPeter Maydell     uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12;
1701e32ee23SPeter Maydell 
1711e32ee23SPeter Maydell     tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_Stage2);
1721e32ee23SPeter Maydell }
1731e32ee23SPeter Maydell 
tlbiipas2is_hyp_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)1741e32ee23SPeter Maydell static void tlbiipas2is_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
1751e32ee23SPeter Maydell                                 uint64_t value)
1761e32ee23SPeter Maydell {
1771e32ee23SPeter Maydell     CPUState *cs = env_cpu(env);
1781e32ee23SPeter Maydell     uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12;
1791e32ee23SPeter Maydell 
1801e32ee23SPeter Maydell     tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, ARMMMUIdxBit_Stage2);
1811e32ee23SPeter Maydell }
1821e32ee23SPeter Maydell 
tlbiall_nsnh_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)183d6b6da1fSPeter Maydell static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri,
184d6b6da1fSPeter Maydell                                uint64_t value)
185d6b6da1fSPeter Maydell {
186d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
187d6b6da1fSPeter Maydell 
188d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx(cs, alle1_tlbmask(env));
189d6b6da1fSPeter Maydell }
190d6b6da1fSPeter Maydell 
tlbiall_nsnh_is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)191d6b6da1fSPeter Maydell static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
192d6b6da1fSPeter Maydell                                   uint64_t value)
193d6b6da1fSPeter Maydell {
194d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
195d6b6da1fSPeter Maydell 
196d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, alle1_tlbmask(env));
197d6b6da1fSPeter Maydell }
198d6b6da1fSPeter Maydell 
199d6b6da1fSPeter Maydell 
tlbiall_hyp_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)200d6b6da1fSPeter Maydell static void tlbiall_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
201d6b6da1fSPeter Maydell                               uint64_t value)
202d6b6da1fSPeter Maydell {
203d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
204d6b6da1fSPeter Maydell 
205d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E2);
206d6b6da1fSPeter Maydell }
207d6b6da1fSPeter Maydell 
tlbiall_hyp_is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)208d6b6da1fSPeter Maydell static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
209d6b6da1fSPeter Maydell                                  uint64_t value)
210d6b6da1fSPeter Maydell {
211d6b6da1fSPeter Maydell     CPUState *cs = env_cpu(env);
212d6b6da1fSPeter Maydell 
213d6b6da1fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E2);
214d6b6da1fSPeter Maydell }
215d6b6da1fSPeter Maydell 
21627fb860fSPeter Maydell /*
21727fb860fSPeter Maydell  * See: D4.7.2 TLB maintenance requirements and the TLB maintenance instructions
21827fb860fSPeter Maydell  * Page D4-1736 (DDI0487A.b)
21927fb860fSPeter Maydell  */
22027fb860fSPeter Maydell 
vae1_tlbmask(CPUARMState * env)22127fb860fSPeter Maydell static int vae1_tlbmask(CPUARMState *env)
22227fb860fSPeter Maydell {
22327fb860fSPeter Maydell     uint64_t hcr = arm_hcr_el2_eff(env);
22427fb860fSPeter Maydell     uint16_t mask;
22527fb860fSPeter Maydell 
22627fb860fSPeter Maydell     assert(arm_feature(env, ARM_FEATURE_AARCH64));
22727fb860fSPeter Maydell 
22827fb860fSPeter Maydell     if ((hcr & (HCR_E2H | HCR_TGE)) == (HCR_E2H | HCR_TGE)) {
22927fb860fSPeter Maydell         mask = ARMMMUIdxBit_E20_2 |
23027fb860fSPeter Maydell                ARMMMUIdxBit_E20_2_PAN |
23127fb860fSPeter Maydell                ARMMMUIdxBit_E20_0;
23227fb860fSPeter Maydell     } else {
23327fb860fSPeter Maydell         /* This is AArch64 only, so we don't need to touch the EL30_x TLBs */
23427fb860fSPeter Maydell         mask = ARMMMUIdxBit_E10_1 |
23527fb860fSPeter Maydell                ARMMMUIdxBit_E10_1_PAN |
23627fb860fSPeter Maydell                ARMMMUIdxBit_E10_0;
23727fb860fSPeter Maydell     }
23827fb860fSPeter Maydell     return mask;
23927fb860fSPeter Maydell }
24027fb860fSPeter Maydell 
vae2_tlbmask(CPUARMState * env)24127fb860fSPeter Maydell static int vae2_tlbmask(CPUARMState *env)
24227fb860fSPeter Maydell {
24327fb860fSPeter Maydell     uint64_t hcr = arm_hcr_el2_eff(env);
24427fb860fSPeter Maydell     uint16_t mask;
24527fb860fSPeter Maydell 
24627fb860fSPeter Maydell     if (hcr & HCR_E2H) {
24727fb860fSPeter Maydell         mask = ARMMMUIdxBit_E20_2 |
24827fb860fSPeter Maydell                ARMMMUIdxBit_E20_2_PAN |
24927fb860fSPeter Maydell                ARMMMUIdxBit_E20_0;
25027fb860fSPeter Maydell     } else {
25127fb860fSPeter Maydell         mask = ARMMMUIdxBit_E2;
25227fb860fSPeter Maydell     }
25327fb860fSPeter Maydell     return mask;
25427fb860fSPeter Maydell }
25527fb860fSPeter Maydell 
25627fb860fSPeter Maydell /* Return 56 if TBI is enabled, 64 otherwise. */
tlbbits_for_regime(CPUARMState * env,ARMMMUIdx mmu_idx,uint64_t addr)25727fb860fSPeter Maydell static int tlbbits_for_regime(CPUARMState *env, ARMMMUIdx mmu_idx,
25827fb860fSPeter Maydell                        uint64_t addr)
25927fb860fSPeter Maydell {
26027fb860fSPeter Maydell     uint64_t tcr = regime_tcr(env, mmu_idx);
26127fb860fSPeter Maydell     int tbi = aa64_va_parameter_tbi(tcr, mmu_idx);
26227fb860fSPeter Maydell     int select = extract64(addr, 55, 1);
26327fb860fSPeter Maydell 
26427fb860fSPeter Maydell     return (tbi >> select) & 1 ? 56 : 64;
26527fb860fSPeter Maydell }
26627fb860fSPeter Maydell 
vae1_tlbbits(CPUARMState * env,uint64_t addr)26727fb860fSPeter Maydell static int vae1_tlbbits(CPUARMState *env, uint64_t addr)
26827fb860fSPeter Maydell {
26927fb860fSPeter Maydell     uint64_t hcr = arm_hcr_el2_eff(env);
27027fb860fSPeter Maydell     ARMMMUIdx mmu_idx;
27127fb860fSPeter Maydell 
27227fb860fSPeter Maydell     assert(arm_feature(env, ARM_FEATURE_AARCH64));
27327fb860fSPeter Maydell 
27427fb860fSPeter Maydell     /* Only the regime of the mmu_idx below is significant. */
27527fb860fSPeter Maydell     if ((hcr & (HCR_E2H | HCR_TGE)) == (HCR_E2H | HCR_TGE)) {
27627fb860fSPeter Maydell         mmu_idx = ARMMMUIdx_E20_0;
27727fb860fSPeter Maydell     } else {
27827fb860fSPeter Maydell         mmu_idx = ARMMMUIdx_E10_0;
27927fb860fSPeter Maydell     }
28027fb860fSPeter Maydell 
28127fb860fSPeter Maydell     return tlbbits_for_regime(env, mmu_idx, addr);
28227fb860fSPeter Maydell }
28327fb860fSPeter Maydell 
vae2_tlbbits(CPUARMState * env,uint64_t addr)28427fb860fSPeter Maydell static int vae2_tlbbits(CPUARMState *env, uint64_t addr)
28527fb860fSPeter Maydell {
28627fb860fSPeter Maydell     uint64_t hcr = arm_hcr_el2_eff(env);
28727fb860fSPeter Maydell     ARMMMUIdx mmu_idx;
28827fb860fSPeter Maydell 
28927fb860fSPeter Maydell     /*
29027fb860fSPeter Maydell      * Only the regime of the mmu_idx below is significant.
29127fb860fSPeter Maydell      * Regime EL2&0 has two ranges with separate TBI configuration, while EL2
29227fb860fSPeter Maydell      * only has one.
29327fb860fSPeter Maydell      */
29427fb860fSPeter Maydell     if (hcr & HCR_E2H) {
29527fb860fSPeter Maydell         mmu_idx = ARMMMUIdx_E20_2;
29627fb860fSPeter Maydell     } else {
29727fb860fSPeter Maydell         mmu_idx = ARMMMUIdx_E2;
29827fb860fSPeter Maydell     }
29927fb860fSPeter Maydell 
30027fb860fSPeter Maydell     return tlbbits_for_regime(env, mmu_idx, addr);
30127fb860fSPeter Maydell }
30227fb860fSPeter Maydell 
tlbi_aa64_vmalle1is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)30327fb860fSPeter Maydell static void tlbi_aa64_vmalle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
30427fb860fSPeter Maydell                                       uint64_t value)
30527fb860fSPeter Maydell {
30627fb860fSPeter Maydell     CPUState *cs = env_cpu(env);
30727fb860fSPeter Maydell     int mask = vae1_tlbmask(env);
30827fb860fSPeter Maydell 
30927fb860fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
31027fb860fSPeter Maydell }
31127fb860fSPeter Maydell 
tlbi_aa64_vmalle1_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)312abbb8264SPeter Maydell static void tlbi_aa64_vmalle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
313abbb8264SPeter Maydell                                     uint64_t value)
314abbb8264SPeter Maydell {
315abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
316abbb8264SPeter Maydell     int mask = vae1_tlbmask(env);
317abbb8264SPeter Maydell 
318abbb8264SPeter Maydell     if (tlb_force_broadcast(env)) {
319abbb8264SPeter Maydell         tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
320abbb8264SPeter Maydell     } else {
321abbb8264SPeter Maydell         tlb_flush_by_mmuidx(cs, mask);
322abbb8264SPeter Maydell     }
323abbb8264SPeter Maydell }
324abbb8264SPeter Maydell 
e2_tlbmask(CPUARMState * env)32527fb860fSPeter Maydell static int e2_tlbmask(CPUARMState *env)
32627fb860fSPeter Maydell {
32727fb860fSPeter Maydell     return (ARMMMUIdxBit_E20_0 |
32827fb860fSPeter Maydell             ARMMMUIdxBit_E20_2 |
32927fb860fSPeter Maydell             ARMMMUIdxBit_E20_2_PAN |
33027fb860fSPeter Maydell             ARMMMUIdxBit_E2);
33127fb860fSPeter Maydell }
33227fb860fSPeter Maydell 
tlbi_aa64_alle1_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)333abbb8264SPeter Maydell static void tlbi_aa64_alle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
334abbb8264SPeter Maydell                                   uint64_t value)
335abbb8264SPeter Maydell {
336abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
337abbb8264SPeter Maydell     int mask = alle1_tlbmask(env);
338abbb8264SPeter Maydell 
339abbb8264SPeter Maydell     tlb_flush_by_mmuidx(cs, mask);
340abbb8264SPeter Maydell }
341abbb8264SPeter Maydell 
tlbi_aa64_alle2_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)3427cadf113SPeter Maydell static void tlbi_aa64_alle2_write(CPUARMState *env, const ARMCPRegInfo *ri,
3437cadf113SPeter Maydell                                   uint64_t value)
3447cadf113SPeter Maydell {
3457cadf113SPeter Maydell     CPUState *cs = env_cpu(env);
3467cadf113SPeter Maydell     int mask = e2_tlbmask(env);
3477cadf113SPeter Maydell 
3487cadf113SPeter Maydell     tlb_flush_by_mmuidx(cs, mask);
3497cadf113SPeter Maydell }
3507cadf113SPeter Maydell 
tlbi_aa64_alle3_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)3515991e5abSPeter Maydell static void tlbi_aa64_alle3_write(CPUARMState *env, const ARMCPRegInfo *ri,
3525991e5abSPeter Maydell                                   uint64_t value)
3535991e5abSPeter Maydell {
3545991e5abSPeter Maydell     ARMCPU *cpu = env_archcpu(env);
3555991e5abSPeter Maydell     CPUState *cs = CPU(cpu);
3565991e5abSPeter Maydell 
3575991e5abSPeter Maydell     tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E3);
3585991e5abSPeter Maydell }
3595991e5abSPeter Maydell 
tlbi_aa64_alle1is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)36027fb860fSPeter Maydell static void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
36127fb860fSPeter Maydell                                     uint64_t value)
36227fb860fSPeter Maydell {
36327fb860fSPeter Maydell     CPUState *cs = env_cpu(env);
36427fb860fSPeter Maydell     int mask = alle1_tlbmask(env);
36527fb860fSPeter Maydell 
36627fb860fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
36727fb860fSPeter Maydell }
36827fb860fSPeter Maydell 
tlbi_aa64_alle2is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)36927fb860fSPeter Maydell static void tlbi_aa64_alle2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
37027fb860fSPeter Maydell                                     uint64_t value)
37127fb860fSPeter Maydell {
37227fb860fSPeter Maydell     CPUState *cs = env_cpu(env);
37327fb860fSPeter Maydell     int mask = e2_tlbmask(env);
37427fb860fSPeter Maydell 
37527fb860fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
37627fb860fSPeter Maydell }
37727fb860fSPeter Maydell 
tlbi_aa64_alle3is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)37827fb860fSPeter Maydell static void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
37927fb860fSPeter Maydell                                     uint64_t value)
38027fb860fSPeter Maydell {
38127fb860fSPeter Maydell     CPUState *cs = env_cpu(env);
38227fb860fSPeter Maydell 
38327fb860fSPeter Maydell     tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E3);
38427fb860fSPeter Maydell }
38527fb860fSPeter Maydell 
tlbi_aa64_vae2_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)3867cadf113SPeter Maydell static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri,
3877cadf113SPeter Maydell                                  uint64_t value)
3887cadf113SPeter Maydell {
3897cadf113SPeter Maydell     /*
3907cadf113SPeter Maydell      * Invalidate by VA, EL2
3917cadf113SPeter Maydell      * Currently handles both VAE2 and VALE2, since we don't support
3927cadf113SPeter Maydell      * flush-last-level-only.
3937cadf113SPeter Maydell      */
3947cadf113SPeter Maydell     CPUState *cs = env_cpu(env);
3957cadf113SPeter Maydell     int mask = vae2_tlbmask(env);
3967cadf113SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
3977cadf113SPeter Maydell     int bits = vae2_tlbbits(env, pageaddr);
3987cadf113SPeter Maydell 
3997cadf113SPeter Maydell     tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
4007cadf113SPeter Maydell }
4017cadf113SPeter Maydell 
tlbi_aa64_vae3_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)4025991e5abSPeter Maydell static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri,
4035991e5abSPeter Maydell                                  uint64_t value)
4045991e5abSPeter Maydell {
4055991e5abSPeter Maydell     /*
4065991e5abSPeter Maydell      * Invalidate by VA, EL3
4075991e5abSPeter Maydell      * Currently handles both VAE3 and VALE3, since we don't support
4085991e5abSPeter Maydell      * flush-last-level-only.
4095991e5abSPeter Maydell      */
4105991e5abSPeter Maydell     ARMCPU *cpu = env_archcpu(env);
4115991e5abSPeter Maydell     CPUState *cs = CPU(cpu);
4125991e5abSPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
4135991e5abSPeter Maydell 
4145991e5abSPeter Maydell     tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E3);
4155991e5abSPeter Maydell }
4165991e5abSPeter Maydell 
tlbi_aa64_vae1is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)41727fb860fSPeter Maydell static void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
41827fb860fSPeter Maydell                                    uint64_t value)
41927fb860fSPeter Maydell {
42027fb860fSPeter Maydell     CPUState *cs = env_cpu(env);
42127fb860fSPeter Maydell     int mask = vae1_tlbmask(env);
42227fb860fSPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
42327fb860fSPeter Maydell     int bits = vae1_tlbbits(env, pageaddr);
42427fb860fSPeter Maydell 
42527fb860fSPeter Maydell     tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
42627fb860fSPeter Maydell }
42727fb860fSPeter Maydell 
tlbi_aa64_vae1_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)428abbb8264SPeter Maydell static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
429abbb8264SPeter Maydell                                  uint64_t value)
430abbb8264SPeter Maydell {
431abbb8264SPeter Maydell     /*
432abbb8264SPeter Maydell      * Invalidate by VA, EL1&0 (AArch64 version).
433abbb8264SPeter Maydell      * Currently handles all of VAE1, VAAE1, VAALE1 and VALE1,
434abbb8264SPeter Maydell      * since we don't support flush-for-specific-ASID-only or
435abbb8264SPeter Maydell      * flush-last-level-only.
436abbb8264SPeter Maydell      */
437abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
438abbb8264SPeter Maydell     int mask = vae1_tlbmask(env);
439abbb8264SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
440abbb8264SPeter Maydell     int bits = vae1_tlbbits(env, pageaddr);
441abbb8264SPeter Maydell 
442abbb8264SPeter Maydell     if (tlb_force_broadcast(env)) {
443abbb8264SPeter Maydell         tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
444abbb8264SPeter Maydell     } else {
445abbb8264SPeter Maydell         tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
446abbb8264SPeter Maydell     }
447abbb8264SPeter Maydell }
448abbb8264SPeter Maydell 
tlbi_aa64_vae2is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)44927fb860fSPeter Maydell static void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
45027fb860fSPeter Maydell                                    uint64_t value)
45127fb860fSPeter Maydell {
45227fb860fSPeter Maydell     CPUState *cs = env_cpu(env);
45327fb860fSPeter Maydell     int mask = vae2_tlbmask(env);
45427fb860fSPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
45527fb860fSPeter Maydell     int bits = vae2_tlbbits(env, pageaddr);
45627fb860fSPeter Maydell 
45727fb860fSPeter Maydell     tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
45827fb860fSPeter Maydell }
45927fb860fSPeter Maydell 
tlbi_aa64_vae3is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)46027fb860fSPeter Maydell static void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
46127fb860fSPeter Maydell                                    uint64_t value)
46227fb860fSPeter Maydell {
46327fb860fSPeter Maydell     CPUState *cs = env_cpu(env);
46427fb860fSPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
46527fb860fSPeter Maydell     int bits = tlbbits_for_regime(env, ARMMMUIdx_E3, pageaddr);
46627fb860fSPeter Maydell 
46727fb860fSPeter Maydell     tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr,
46827fb860fSPeter Maydell                                                   ARMMMUIdxBit_E3, bits);
46927fb860fSPeter Maydell }
47027fb860fSPeter Maydell 
ipas2e1_tlbmask(CPUARMState * env,int64_t value)47127fb860fSPeter Maydell static int ipas2e1_tlbmask(CPUARMState *env, int64_t value)
47227fb860fSPeter Maydell {
47327fb860fSPeter Maydell     /*
47427fb860fSPeter Maydell      * The MSB of value is the NS field, which only applies if SEL2
47527fb860fSPeter Maydell      * is implemented and SCR_EL3.NS is not set (i.e. in secure mode).
47627fb860fSPeter Maydell      */
47727fb860fSPeter Maydell     return (value >= 0
47827fb860fSPeter Maydell             && cpu_isar_feature(aa64_sel2, env_archcpu(env))
47927fb860fSPeter Maydell             && arm_is_secure_below_el3(env)
48027fb860fSPeter Maydell             ? ARMMMUIdxBit_Stage2_S
48127fb860fSPeter Maydell             : ARMMMUIdxBit_Stage2);
48227fb860fSPeter Maydell }
48327fb860fSPeter Maydell 
tlbi_aa64_ipas2e1_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)484abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
485abbb8264SPeter Maydell                                     uint64_t value)
486abbb8264SPeter Maydell {
487abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
488abbb8264SPeter Maydell     int mask = ipas2e1_tlbmask(env, value);
489abbb8264SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
490abbb8264SPeter Maydell 
491abbb8264SPeter Maydell     if (tlb_force_broadcast(env)) {
492abbb8264SPeter Maydell         tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask);
493abbb8264SPeter Maydell     } else {
494abbb8264SPeter Maydell         tlb_flush_page_by_mmuidx(cs, pageaddr, mask);
495abbb8264SPeter Maydell     }
496abbb8264SPeter Maydell }
497abbb8264SPeter Maydell 
tlbi_aa64_ipas2e1is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)498abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
499abbb8264SPeter Maydell                                       uint64_t value)
500abbb8264SPeter Maydell {
501abbb8264SPeter Maydell     CPUState *cs = env_cpu(env);
502abbb8264SPeter Maydell     int mask = ipas2e1_tlbmask(env, value);
503abbb8264SPeter Maydell     uint64_t pageaddr = sextract64(value << 12, 0, 56);
504abbb8264SPeter Maydell 
505abbb8264SPeter Maydell     tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask);
506abbb8264SPeter Maydell }
507abbb8264SPeter Maydell 
5081e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_not_v7_cp_reginfo[] = {
5091e32ee23SPeter Maydell     /*
5101e32ee23SPeter Maydell      * MMU TLB control. Note that the wildcarding means we cover not just
5111e32ee23SPeter Maydell      * the unified TLB ops but also the dside/iside/inner-shareable variants.
5121e32ee23SPeter Maydell      */
5131e32ee23SPeter Maydell     { .name = "TLBIALL", .cp = 15, .crn = 8, .crm = CP_ANY,
5141e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 0, .access = PL1_W, .writefn = tlbiall_write,
5151e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
5161e32ee23SPeter Maydell     { .name = "TLBIMVA", .cp = 15, .crn = 8, .crm = CP_ANY,
5171e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 1, .access = PL1_W, .writefn = tlbimva_write,
5181e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
5191e32ee23SPeter Maydell     { .name = "TLBIASID", .cp = 15, .crn = 8, .crm = CP_ANY,
5201e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 2, .access = PL1_W, .writefn = tlbiasid_write,
5211e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
5221e32ee23SPeter Maydell     { .name = "TLBIMVAA", .cp = 15, .crn = 8, .crm = CP_ANY,
5231e32ee23SPeter Maydell       .opc1 = CP_ANY, .opc2 = 3, .access = PL1_W, .writefn = tlbimvaa_write,
5241e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW },
5251e32ee23SPeter Maydell };
5261e32ee23SPeter Maydell 
5271e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7_cp_reginfo[] = {
5281e32ee23SPeter Maydell     /* 32 bit ITLB invalidates */
5291e32ee23SPeter Maydell     { .name = "ITLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 0,
5301e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5311e32ee23SPeter Maydell       .writefn = tlbiall_write },
5321e32ee23SPeter Maydell     { .name = "ITLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
5331e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5341e32ee23SPeter Maydell       .writefn = tlbimva_write },
5351e32ee23SPeter Maydell     { .name = "ITLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 2,
5361e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5371e32ee23SPeter Maydell       .writefn = tlbiasid_write },
5381e32ee23SPeter Maydell     /* 32 bit DTLB invalidates */
5391e32ee23SPeter Maydell     { .name = "DTLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 0,
5401e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5411e32ee23SPeter Maydell       .writefn = tlbiall_write },
5421e32ee23SPeter Maydell     { .name = "DTLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
5431e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5441e32ee23SPeter Maydell       .writefn = tlbimva_write },
5451e32ee23SPeter Maydell     { .name = "DTLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 2,
5461e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5471e32ee23SPeter Maydell       .writefn = tlbiasid_write },
5481e32ee23SPeter Maydell     /* 32 bit TLB invalidates */
5491e32ee23SPeter Maydell     { .name = "TLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
5501e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5511e32ee23SPeter Maydell       .writefn = tlbiall_write },
5521e32ee23SPeter Maydell     { .name = "TLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
5531e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5541e32ee23SPeter Maydell       .writefn = tlbimva_write },
5551e32ee23SPeter Maydell     { .name = "TLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
5561e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5571e32ee23SPeter Maydell       .writefn = tlbiasid_write },
5581e32ee23SPeter Maydell     { .name = "TLBIMVAA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
5591e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5601e32ee23SPeter Maydell       .writefn = tlbimvaa_write },
5611e32ee23SPeter Maydell };
5621e32ee23SPeter Maydell 
5631e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7mp_cp_reginfo[] = {
5641e32ee23SPeter Maydell     /* 32 bit TLB invalidates, Inner Shareable */
5651e32ee23SPeter Maydell     { .name = "TLBIALLIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
5661e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
5671e32ee23SPeter Maydell       .writefn = tlbiall_is_write },
5681e32ee23SPeter Maydell     { .name = "TLBIMVAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
5691e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
5701e32ee23SPeter Maydell       .writefn = tlbimva_is_write },
5711e32ee23SPeter Maydell     { .name = "TLBIASIDIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
5721e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
5731e32ee23SPeter Maydell       .writefn = tlbiasid_is_write },
5741e32ee23SPeter Maydell     { .name = "TLBIMVAAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
5751e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
5761e32ee23SPeter Maydell       .writefn = tlbimvaa_is_write },
5771e32ee23SPeter Maydell };
5781e32ee23SPeter Maydell 
5791e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v8_cp_reginfo[] = {
5801e32ee23SPeter Maydell     /* AArch32 TLB invalidate last level of translation table walk */
5811e32ee23SPeter Maydell     { .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
5821e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
5831e32ee23SPeter Maydell       .writefn = tlbimva_is_write },
5841e32ee23SPeter Maydell     { .name = "TLBIMVAALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
5851e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
5861e32ee23SPeter Maydell       .writefn = tlbimvaa_is_write },
5871e32ee23SPeter Maydell     { .name = "TLBIMVAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
5881e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5891e32ee23SPeter Maydell       .writefn = tlbimva_write },
5901e32ee23SPeter Maydell     { .name = "TLBIMVAAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
5911e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
5921e32ee23SPeter Maydell       .writefn = tlbimvaa_write },
5931e32ee23SPeter Maydell     { .name = "TLBIMVALH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
5941e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
5951e32ee23SPeter Maydell       .writefn = tlbimva_hyp_write },
5961e32ee23SPeter Maydell     { .name = "TLBIMVALHIS",
5971e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
5981e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
5991e32ee23SPeter Maydell       .writefn = tlbimva_hyp_is_write },
6001e32ee23SPeter Maydell     { .name = "TLBIIPAS2",
6011e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
6021e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
6031e32ee23SPeter Maydell       .writefn = tlbiipas2_hyp_write },
6041e32ee23SPeter Maydell     { .name = "TLBIIPAS2IS",
6051e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
6061e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
6071e32ee23SPeter Maydell       .writefn = tlbiipas2is_hyp_write },
6081e32ee23SPeter Maydell     { .name = "TLBIIPAS2L",
6091e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
6101e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
6111e32ee23SPeter Maydell       .writefn = tlbiipas2_hyp_write },
6121e32ee23SPeter Maydell     { .name = "TLBIIPAS2LIS",
6131e32ee23SPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
6141e32ee23SPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
6151e32ee23SPeter Maydell       .writefn = tlbiipas2is_hyp_write },
616abbb8264SPeter Maydell     /* AArch64 TLBI operations */
617abbb8264SPeter Maydell     { .name = "TLBI_VMALLE1IS", .state = ARM_CP_STATE_AA64,
618abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
6194278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis,
6204278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
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,
6254278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis,
6264278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
627abbb8264SPeter Maydell       .fgt = FGT_TLBIVAE1IS,
628abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
629abbb8264SPeter Maydell     { .name = "TLBI_ASIDE1IS", .state = ARM_CP_STATE_AA64,
630abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
6314278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis,
6324278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
633abbb8264SPeter Maydell       .fgt = FGT_TLBIASIDE1IS,
634abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1is_write },
635abbb8264SPeter Maydell     { .name = "TLBI_VAAE1IS", .state = ARM_CP_STATE_AA64,
636abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
6374278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis,
6384278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
639abbb8264SPeter Maydell       .fgt = FGT_TLBIVAAE1IS,
640abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
641abbb8264SPeter Maydell     { .name = "TLBI_VALE1IS", .state = ARM_CP_STATE_AA64,
642abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
6434278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis,
6444278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
645abbb8264SPeter Maydell       .fgt = FGT_TLBIVALE1IS,
646abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
647abbb8264SPeter Maydell     { .name = "TLBI_VAALE1IS", .state = ARM_CP_STATE_AA64,
648abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
6494278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis,
6504278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
651abbb8264SPeter Maydell       .fgt = FGT_TLBIVAALE1IS,
652abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
653abbb8264SPeter Maydell     { .name = "TLBI_VMALLE1", .state = ARM_CP_STATE_AA64,
654abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
6554278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlb,
6564278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
657abbb8264SPeter Maydell       .fgt = FGT_TLBIVMALLE1,
658abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1_write },
659abbb8264SPeter Maydell     { .name = "TLBI_VAE1", .state = ARM_CP_STATE_AA64,
660abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
6614278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlb,
6624278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
663abbb8264SPeter Maydell       .fgt = FGT_TLBIVAE1,
664abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
665abbb8264SPeter Maydell     { .name = "TLBI_ASIDE1", .state = ARM_CP_STATE_AA64,
666abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
6674278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlb,
6684278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
669abbb8264SPeter Maydell       .fgt = FGT_TLBIASIDE1,
670abbb8264SPeter Maydell       .writefn = tlbi_aa64_vmalle1_write },
671abbb8264SPeter Maydell     { .name = "TLBI_VAAE1", .state = ARM_CP_STATE_AA64,
672abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
6734278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlb,
6744278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
675abbb8264SPeter Maydell       .fgt = FGT_TLBIVAAE1,
676abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
677abbb8264SPeter Maydell     { .name = "TLBI_VALE1", .state = ARM_CP_STATE_AA64,
678abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
6794278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlb,
6804278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
681abbb8264SPeter Maydell       .fgt = FGT_TLBIVALE1,
682abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
683abbb8264SPeter Maydell     { .name = "TLBI_VAALE1", .state = ARM_CP_STATE_AA64,
684abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
6854278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlb,
6864278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
687abbb8264SPeter Maydell       .fgt = FGT_TLBIVAALE1,
688abbb8264SPeter Maydell       .writefn = tlbi_aa64_vae1_write },
689abbb8264SPeter Maydell     { .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64,
690abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
6914278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
692abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1is_write },
693abbb8264SPeter Maydell     { .name = "TLBI_IPAS2LE1IS", .state = ARM_CP_STATE_AA64,
694abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
6954278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
696abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1is_write },
697abbb8264SPeter Maydell     { .name = "TLBI_ALLE1IS", .state = ARM_CP_STATE_AA64,
698abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
6994278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
700abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
701abbb8264SPeter Maydell     { .name = "TLBI_VMALLS12E1IS", .state = ARM_CP_STATE_AA64,
702abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 6,
7034278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
704abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
705abbb8264SPeter Maydell     { .name = "TLBI_IPAS2E1", .state = ARM_CP_STATE_AA64,
706abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
7074278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
708abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1_write },
709abbb8264SPeter Maydell     { .name = "TLBI_IPAS2LE1", .state = ARM_CP_STATE_AA64,
710abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
7114278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
712abbb8264SPeter Maydell       .writefn = tlbi_aa64_ipas2e1_write },
713abbb8264SPeter Maydell     { .name = "TLBI_ALLE1", .state = ARM_CP_STATE_AA64,
714abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
7154278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
716abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1_write },
717abbb8264SPeter Maydell     { .name = "TLBI_VMALLS12E1", .state = ARM_CP_STATE_AA64,
718abbb8264SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 6,
7194278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
720abbb8264SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
7211e32ee23SPeter Maydell };
7221e32ee23SPeter Maydell 
723d6b6da1fSPeter Maydell static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = {
724d6b6da1fSPeter Maydell     { .name = "TLBIALLNSNH",
725d6b6da1fSPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
726d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
727d6b6da1fSPeter Maydell       .writefn = tlbiall_nsnh_write },
728d6b6da1fSPeter Maydell     { .name = "TLBIALLNSNHIS",
729d6b6da1fSPeter Maydell       .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
730d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
731d6b6da1fSPeter Maydell       .writefn = tlbiall_nsnh_is_write },
732d6b6da1fSPeter Maydell     { .name = "TLBIALLH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
733d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
734d6b6da1fSPeter Maydell       .writefn = tlbiall_hyp_write },
735d6b6da1fSPeter Maydell     { .name = "TLBIALLHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
736d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
737d6b6da1fSPeter Maydell       .writefn = tlbiall_hyp_is_write },
738d6b6da1fSPeter Maydell     { .name = "TLBIMVAH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
739d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
740d6b6da1fSPeter Maydell       .writefn = tlbimva_hyp_write },
741d6b6da1fSPeter Maydell     { .name = "TLBIMVAHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
742d6b6da1fSPeter Maydell       .type = ARM_CP_NO_RAW, .access = PL2_W,
743d6b6da1fSPeter Maydell       .writefn = tlbimva_hyp_is_write },
7447cadf113SPeter Maydell     { .name = "TLBI_ALLE2", .state = ARM_CP_STATE_AA64,
7457cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
7464278186aSPeter Maydell       .access = PL2_W,
7474278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
7487cadf113SPeter Maydell       .writefn = tlbi_aa64_alle2_write },
7497cadf113SPeter Maydell     { .name = "TLBI_VAE2", .state = ARM_CP_STATE_AA64,
7507cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
7514278186aSPeter Maydell       .access = PL2_W,
7524278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
7537cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2_write },
7547cadf113SPeter Maydell     { .name = "TLBI_VALE2", .state = ARM_CP_STATE_AA64,
7557cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
7564278186aSPeter Maydell       .access = PL2_W,
7574278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
7587cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2_write },
7597cadf113SPeter Maydell     { .name = "TLBI_ALLE2IS", .state = ARM_CP_STATE_AA64,
7607cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
7614278186aSPeter Maydell       .access = PL2_W,
7624278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
7637cadf113SPeter Maydell       .writefn = tlbi_aa64_alle2is_write },
7647cadf113SPeter Maydell     { .name = "TLBI_VAE2IS", .state = ARM_CP_STATE_AA64,
7657cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
7664278186aSPeter Maydell       .access = PL2_W,
7674278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
7687cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2is_write },
7697cadf113SPeter Maydell     { .name = "TLBI_VALE2IS", .state = ARM_CP_STATE_AA64,
7707cadf113SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
7714278186aSPeter Maydell       .access = PL2_W,
7724278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
7737cadf113SPeter Maydell       .writefn = tlbi_aa64_vae2is_write },
774d6b6da1fSPeter Maydell };
775d6b6da1fSPeter Maydell 
7765991e5abSPeter Maydell static const ARMCPRegInfo tlbi_el3_cp_reginfo[] = {
7775991e5abSPeter Maydell     { .name = "TLBI_ALLE3IS", .state = ARM_CP_STATE_AA64,
7785991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 0,
7794278186aSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
7805991e5abSPeter Maydell       .writefn = tlbi_aa64_alle3is_write },
7815991e5abSPeter Maydell     { .name = "TLBI_VAE3IS", .state = ARM_CP_STATE_AA64,
7825991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 1,
7834278186aSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
7845991e5abSPeter Maydell       .writefn = tlbi_aa64_vae3is_write },
7855991e5abSPeter Maydell     { .name = "TLBI_VALE3IS", .state = ARM_CP_STATE_AA64,
7865991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 5,
7874278186aSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
7885991e5abSPeter Maydell       .writefn = tlbi_aa64_vae3is_write },
7895991e5abSPeter Maydell     { .name = "TLBI_ALLE3", .state = ARM_CP_STATE_AA64,
7905991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 0,
7914278186aSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
7925991e5abSPeter Maydell       .writefn = tlbi_aa64_alle3_write },
7935991e5abSPeter Maydell     { .name = "TLBI_VAE3", .state = ARM_CP_STATE_AA64,
7945991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 1,
7954278186aSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
7965991e5abSPeter Maydell       .writefn = tlbi_aa64_vae3_write },
7975991e5abSPeter Maydell     { .name = "TLBI_VALE3", .state = ARM_CP_STATE_AA64,
7985991e5abSPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 5,
7994278186aSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
8005991e5abSPeter Maydell       .writefn = tlbi_aa64_vae3_write },
8015991e5abSPeter Maydell };
8025991e5abSPeter Maydell 
80365593799SPeter Maydell typedef struct {
80465593799SPeter Maydell     uint64_t base;
80565593799SPeter Maydell     uint64_t length;
80665593799SPeter Maydell } TLBIRange;
80765593799SPeter Maydell 
tlbi_range_tg_to_gran_size(int tg)80865593799SPeter Maydell static ARMGranuleSize tlbi_range_tg_to_gran_size(int tg)
80965593799SPeter Maydell {
81065593799SPeter Maydell     /*
81165593799SPeter Maydell      * Note that the TLBI range TG field encoding differs from both
81265593799SPeter Maydell      * TG0 and TG1 encodings.
81365593799SPeter Maydell      */
81465593799SPeter Maydell     switch (tg) {
81565593799SPeter Maydell     case 1:
81665593799SPeter Maydell         return Gran4K;
81765593799SPeter Maydell     case 2:
81865593799SPeter Maydell         return Gran16K;
81965593799SPeter Maydell     case 3:
82065593799SPeter Maydell         return Gran64K;
82165593799SPeter Maydell     default:
82265593799SPeter Maydell         return GranInvalid;
82365593799SPeter Maydell     }
82465593799SPeter Maydell }
82565593799SPeter Maydell 
tlbi_aa64_get_range(CPUARMState * env,ARMMMUIdx mmuidx,uint64_t value)82665593799SPeter Maydell static TLBIRange tlbi_aa64_get_range(CPUARMState *env, ARMMMUIdx mmuidx,
82765593799SPeter Maydell                                      uint64_t value)
82865593799SPeter Maydell {
82965593799SPeter Maydell     unsigned int page_size_granule, page_shift, num, scale, exponent;
83065593799SPeter Maydell     /* Extract one bit to represent the va selector in use. */
83165593799SPeter Maydell     uint64_t select = sextract64(value, 36, 1);
83265593799SPeter Maydell     ARMVAParameters param = aa64_va_parameters(env, select, mmuidx, true, false);
83365593799SPeter Maydell     TLBIRange ret = { };
83465593799SPeter Maydell     ARMGranuleSize gran;
83565593799SPeter Maydell 
83665593799SPeter Maydell     page_size_granule = extract64(value, 46, 2);
83765593799SPeter Maydell     gran = tlbi_range_tg_to_gran_size(page_size_granule);
83865593799SPeter Maydell 
83965593799SPeter Maydell     /* The granule encoded in value must match the granule in use. */
84065593799SPeter Maydell     if (gran != param.gran) {
84165593799SPeter Maydell         qemu_log_mask(LOG_GUEST_ERROR, "Invalid tlbi page size granule %d\n",
84265593799SPeter Maydell                       page_size_granule);
84365593799SPeter Maydell         return ret;
84465593799SPeter Maydell     }
84565593799SPeter Maydell 
84665593799SPeter Maydell     page_shift = arm_granule_bits(gran);
84765593799SPeter Maydell     num = extract64(value, 39, 5);
84865593799SPeter Maydell     scale = extract64(value, 44, 2);
84965593799SPeter Maydell     exponent = (5 * scale) + 1;
85065593799SPeter Maydell 
85165593799SPeter Maydell     ret.length = (num + 1) << (exponent + page_shift);
85265593799SPeter Maydell 
85365593799SPeter Maydell     if (param.select) {
85465593799SPeter Maydell         ret.base = sextract64(value, 0, 37);
85565593799SPeter Maydell     } else {
85665593799SPeter Maydell         ret.base = extract64(value, 0, 37);
85765593799SPeter Maydell     }
85865593799SPeter Maydell     if (param.ds) {
85965593799SPeter Maydell         /*
86065593799SPeter Maydell          * With DS=1, BaseADDR is always shifted 16 so that it is able
86165593799SPeter Maydell          * to address all 52 va bits.  The input address is perforce
86265593799SPeter Maydell          * aligned on a 64k boundary regardless of translation granule.
86365593799SPeter Maydell          */
86465593799SPeter Maydell         page_shift = 16;
86565593799SPeter Maydell     }
86665593799SPeter Maydell     ret.base <<= page_shift;
86765593799SPeter Maydell 
86865593799SPeter Maydell     return ret;
86965593799SPeter Maydell }
87065593799SPeter Maydell 
do_rvae_write(CPUARMState * env,uint64_t value,int idxmap,bool synced)87165593799SPeter Maydell static void do_rvae_write(CPUARMState *env, uint64_t value,
87265593799SPeter Maydell                           int idxmap, bool synced)
87365593799SPeter Maydell {
87465593799SPeter Maydell     ARMMMUIdx one_idx = ARM_MMU_IDX_A | ctz32(idxmap);
87565593799SPeter Maydell     TLBIRange range;
87665593799SPeter Maydell     int bits;
87765593799SPeter Maydell 
87865593799SPeter Maydell     range = tlbi_aa64_get_range(env, one_idx, value);
87965593799SPeter Maydell     bits = tlbbits_for_regime(env, one_idx, range.base);
88065593799SPeter Maydell 
88165593799SPeter Maydell     if (synced) {
88265593799SPeter Maydell         tlb_flush_range_by_mmuidx_all_cpus_synced(env_cpu(env),
88365593799SPeter Maydell                                                   range.base,
88465593799SPeter Maydell                                                   range.length,
88565593799SPeter Maydell                                                   idxmap,
88665593799SPeter Maydell                                                   bits);
88765593799SPeter Maydell     } else {
88865593799SPeter Maydell         tlb_flush_range_by_mmuidx(env_cpu(env), range.base,
88965593799SPeter Maydell                                   range.length, idxmap, bits);
89065593799SPeter Maydell     }
89165593799SPeter Maydell }
89265593799SPeter Maydell 
tlbi_aa64_rvae1_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)89365593799SPeter Maydell static void tlbi_aa64_rvae1_write(CPUARMState *env,
89465593799SPeter Maydell                                   const ARMCPRegInfo *ri,
89565593799SPeter Maydell                                   uint64_t value)
89665593799SPeter Maydell {
89765593799SPeter Maydell     /*
89865593799SPeter Maydell      * Invalidate by VA range, EL1&0.
89965593799SPeter Maydell      * Currently handles all of RVAE1, RVAAE1, RVAALE1 and RVALE1,
90065593799SPeter Maydell      * since we don't support flush-for-specific-ASID-only or
90165593799SPeter Maydell      * flush-last-level-only.
90265593799SPeter Maydell      */
90365593799SPeter Maydell 
90465593799SPeter Maydell     do_rvae_write(env, value, vae1_tlbmask(env),
90565593799SPeter Maydell                   tlb_force_broadcast(env));
90665593799SPeter Maydell }
90765593799SPeter Maydell 
tlbi_aa64_rvae1is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)90865593799SPeter Maydell static void tlbi_aa64_rvae1is_write(CPUARMState *env,
90965593799SPeter Maydell                                     const ARMCPRegInfo *ri,
91065593799SPeter Maydell                                     uint64_t value)
91165593799SPeter Maydell {
91265593799SPeter Maydell     /*
91365593799SPeter Maydell      * Invalidate by VA range, Inner/Outer Shareable EL1&0.
91465593799SPeter Maydell      * Currently handles all of RVAE1IS, RVAE1OS, RVAAE1IS, RVAAE1OS,
91565593799SPeter Maydell      * RVAALE1IS, RVAALE1OS, RVALE1IS and RVALE1OS, since we don't support
91665593799SPeter Maydell      * flush-for-specific-ASID-only, flush-last-level-only or inner/outer
91765593799SPeter Maydell      * shareable specific flushes.
91865593799SPeter Maydell      */
91965593799SPeter Maydell 
92065593799SPeter Maydell     do_rvae_write(env, value, vae1_tlbmask(env), true);
92165593799SPeter Maydell }
92265593799SPeter Maydell 
tlbi_aa64_rvae2_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)92365593799SPeter Maydell static void tlbi_aa64_rvae2_write(CPUARMState *env,
92465593799SPeter Maydell                                   const ARMCPRegInfo *ri,
92565593799SPeter Maydell                                   uint64_t value)
92665593799SPeter Maydell {
92765593799SPeter Maydell     /*
92865593799SPeter Maydell      * Invalidate by VA range, EL2.
92965593799SPeter Maydell      * Currently handles all of RVAE2 and RVALE2,
93065593799SPeter Maydell      * since we don't support flush-for-specific-ASID-only or
93165593799SPeter Maydell      * flush-last-level-only.
93265593799SPeter Maydell      */
93365593799SPeter Maydell 
93465593799SPeter Maydell     do_rvae_write(env, value, vae2_tlbmask(env),
93565593799SPeter Maydell                   tlb_force_broadcast(env));
93665593799SPeter Maydell 
93765593799SPeter Maydell 
93865593799SPeter Maydell }
93965593799SPeter Maydell 
tlbi_aa64_rvae2is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)94065593799SPeter Maydell static void tlbi_aa64_rvae2is_write(CPUARMState *env,
94165593799SPeter Maydell                                     const ARMCPRegInfo *ri,
94265593799SPeter Maydell                                     uint64_t value)
94365593799SPeter Maydell {
94465593799SPeter Maydell     /*
94565593799SPeter Maydell      * Invalidate by VA range, Inner/Outer Shareable, EL2.
94665593799SPeter Maydell      * Currently handles all of RVAE2IS, RVAE2OS, RVALE2IS and RVALE2OS,
94765593799SPeter Maydell      * since we don't support flush-for-specific-ASID-only,
94865593799SPeter Maydell      * flush-last-level-only or inner/outer shareable specific flushes.
94965593799SPeter Maydell      */
95065593799SPeter Maydell 
95165593799SPeter Maydell     do_rvae_write(env, value, vae2_tlbmask(env), true);
95265593799SPeter Maydell 
95365593799SPeter Maydell }
95465593799SPeter Maydell 
tlbi_aa64_rvae3_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)95565593799SPeter Maydell static void tlbi_aa64_rvae3_write(CPUARMState *env,
95665593799SPeter Maydell                                   const ARMCPRegInfo *ri,
95765593799SPeter Maydell                                   uint64_t value)
95865593799SPeter Maydell {
95965593799SPeter Maydell     /*
96065593799SPeter Maydell      * Invalidate by VA range, EL3.
96165593799SPeter Maydell      * Currently handles all of RVAE3 and RVALE3,
96265593799SPeter Maydell      * since we don't support flush-for-specific-ASID-only or
96365593799SPeter Maydell      * flush-last-level-only.
96465593799SPeter Maydell      */
96565593799SPeter Maydell 
96665593799SPeter Maydell     do_rvae_write(env, value, ARMMMUIdxBit_E3, tlb_force_broadcast(env));
96765593799SPeter Maydell }
96865593799SPeter Maydell 
tlbi_aa64_rvae3is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)96965593799SPeter Maydell static void tlbi_aa64_rvae3is_write(CPUARMState *env,
97065593799SPeter Maydell                                     const ARMCPRegInfo *ri,
97165593799SPeter Maydell                                     uint64_t value)
97265593799SPeter Maydell {
97365593799SPeter Maydell     /*
97465593799SPeter Maydell      * Invalidate by VA range, EL3, Inner/Outer Shareable.
97565593799SPeter Maydell      * Currently handles all of RVAE3IS, RVAE3OS, RVALE3IS and RVALE3OS,
97665593799SPeter Maydell      * since we don't support flush-for-specific-ASID-only,
97765593799SPeter Maydell      * flush-last-level-only or inner/outer specific flushes.
97865593799SPeter Maydell      */
97965593799SPeter Maydell 
98065593799SPeter Maydell     do_rvae_write(env, value, ARMMMUIdxBit_E3, true);
98165593799SPeter Maydell }
98265593799SPeter Maydell 
tlbi_aa64_ripas2e1_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)98365593799SPeter Maydell static void tlbi_aa64_ripas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
98465593799SPeter Maydell                                      uint64_t value)
98565593799SPeter Maydell {
98665593799SPeter Maydell     do_rvae_write(env, value, ipas2e1_tlbmask(env, value),
98765593799SPeter Maydell                   tlb_force_broadcast(env));
98865593799SPeter Maydell }
98965593799SPeter Maydell 
tlbi_aa64_ripas2e1is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)99065593799SPeter Maydell static void tlbi_aa64_ripas2e1is_write(CPUARMState *env,
99165593799SPeter Maydell                                        const ARMCPRegInfo *ri,
99265593799SPeter Maydell                                        uint64_t value)
99365593799SPeter Maydell {
99465593799SPeter Maydell     do_rvae_write(env, value, ipas2e1_tlbmask(env, value), true);
99565593799SPeter Maydell }
99665593799SPeter Maydell 
99765593799SPeter Maydell static const ARMCPRegInfo tlbirange_reginfo[] = {
99865593799SPeter Maydell     { .name = "TLBI_RVAE1IS", .state = ARM_CP_STATE_AA64,
99965593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 1,
10004278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis,
10014278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
100265593799SPeter Maydell       .fgt = FGT_TLBIRVAE1IS,
100365593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
100465593799SPeter Maydell     { .name = "TLBI_RVAAE1IS", .state = ARM_CP_STATE_AA64,
100565593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 3,
10064278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis,
10074278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
100865593799SPeter Maydell       .fgt = FGT_TLBIRVAAE1IS,
100965593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
101065593799SPeter Maydell    { .name = "TLBI_RVALE1IS", .state = ARM_CP_STATE_AA64,
101165593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 5,
10124278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis,
10134278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
101465593799SPeter Maydell       .fgt = FGT_TLBIRVALE1IS,
101565593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
101665593799SPeter Maydell     { .name = "TLBI_RVAALE1IS", .state = ARM_CP_STATE_AA64,
101765593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 7,
10184278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbis,
10194278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
102065593799SPeter Maydell       .fgt = FGT_TLBIRVAALE1IS,
102165593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
102265593799SPeter Maydell     { .name = "TLBI_RVAE1OS", .state = ARM_CP_STATE_AA64,
102365593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
10244278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos,
10254278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
102665593799SPeter Maydell       .fgt = FGT_TLBIRVAE1OS,
102765593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
102865593799SPeter Maydell     { .name = "TLBI_RVAAE1OS", .state = ARM_CP_STATE_AA64,
102965593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 3,
10304278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos,
10314278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
103265593799SPeter Maydell       .fgt = FGT_TLBIRVAAE1OS,
103365593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
103465593799SPeter Maydell    { .name = "TLBI_RVALE1OS", .state = ARM_CP_STATE_AA64,
103565593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 5,
10364278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos,
10374278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
103865593799SPeter Maydell       .fgt = FGT_TLBIRVALE1OS,
103965593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
104065593799SPeter Maydell     { .name = "TLBI_RVAALE1OS", .state = ARM_CP_STATE_AA64,
104165593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 7,
10424278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos,
10434278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
104465593799SPeter Maydell       .fgt = FGT_TLBIRVAALE1OS,
104565593799SPeter Maydell       .writefn = tlbi_aa64_rvae1is_write },
104665593799SPeter Maydell     { .name = "TLBI_RVAE1", .state = ARM_CP_STATE_AA64,
104765593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
10484278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlb,
10494278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
105065593799SPeter Maydell       .fgt = FGT_TLBIRVAE1,
105165593799SPeter Maydell       .writefn = tlbi_aa64_rvae1_write },
105265593799SPeter Maydell     { .name = "TLBI_RVAAE1", .state = ARM_CP_STATE_AA64,
105365593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 3,
10544278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlb,
10554278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
105665593799SPeter Maydell       .fgt = FGT_TLBIRVAAE1,
105765593799SPeter Maydell       .writefn = tlbi_aa64_rvae1_write },
105865593799SPeter Maydell    { .name = "TLBI_RVALE1", .state = ARM_CP_STATE_AA64,
105965593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 5,
10604278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlb,
10614278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
106265593799SPeter Maydell       .fgt = FGT_TLBIRVALE1,
106365593799SPeter Maydell       .writefn = tlbi_aa64_rvae1_write },
106465593799SPeter Maydell     { .name = "TLBI_RVAALE1", .state = ARM_CP_STATE_AA64,
106565593799SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 7,
10664278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlb,
10674278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
106865593799SPeter Maydell       .fgt = FGT_TLBIRVAALE1,
106965593799SPeter Maydell       .writefn = tlbi_aa64_rvae1_write },
107065593799SPeter Maydell     { .name = "TLBI_RIPAS2E1IS", .state = ARM_CP_STATE_AA64,
107165593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 2,
10724278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
107365593799SPeter Maydell       .writefn = tlbi_aa64_ripas2e1is_write },
107465593799SPeter Maydell     { .name = "TLBI_RIPAS2LE1IS", .state = ARM_CP_STATE_AA64,
107565593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 6,
10764278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
107765593799SPeter Maydell       .writefn = tlbi_aa64_ripas2e1is_write },
107865593799SPeter Maydell     { .name = "TLBI_RVAE2IS", .state = ARM_CP_STATE_AA64,
107965593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 1,
10804278186aSPeter Maydell       .access = PL2_W,
10814278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
108265593799SPeter Maydell       .writefn = tlbi_aa64_rvae2is_write },
108365593799SPeter Maydell    { .name = "TLBI_RVALE2IS", .state = ARM_CP_STATE_AA64,
108465593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 5,
10854278186aSPeter Maydell       .access = PL2_W,
10864278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
108765593799SPeter Maydell       .writefn = tlbi_aa64_rvae2is_write },
108865593799SPeter Maydell     { .name = "TLBI_RIPAS2E1", .state = ARM_CP_STATE_AA64,
108965593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 2,
10904278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
109165593799SPeter Maydell       .writefn = tlbi_aa64_ripas2e1_write },
109265593799SPeter Maydell     { .name = "TLBI_RIPAS2LE1", .state = ARM_CP_STATE_AA64,
109365593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 6,
10944278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
109565593799SPeter Maydell       .writefn = tlbi_aa64_ripas2e1_write },
109665593799SPeter Maydell    { .name = "TLBI_RVAE2OS", .state = ARM_CP_STATE_AA64,
109765593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 1,
10984278186aSPeter Maydell       .access = PL2_W,
10994278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
110065593799SPeter Maydell       .writefn = tlbi_aa64_rvae2is_write },
110165593799SPeter Maydell    { .name = "TLBI_RVALE2OS", .state = ARM_CP_STATE_AA64,
110265593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 5,
11034278186aSPeter Maydell       .access = PL2_W,
11044278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
110565593799SPeter Maydell       .writefn = tlbi_aa64_rvae2is_write },
110665593799SPeter Maydell     { .name = "TLBI_RVAE2", .state = ARM_CP_STATE_AA64,
110765593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 1,
11084278186aSPeter Maydell       .access = PL2_W,
11094278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
111065593799SPeter Maydell       .writefn = tlbi_aa64_rvae2_write },
111165593799SPeter Maydell    { .name = "TLBI_RVALE2", .state = ARM_CP_STATE_AA64,
111265593799SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 5,
11134278186aSPeter Maydell       .access = PL2_W,
11144278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
111565593799SPeter Maydell       .writefn = tlbi_aa64_rvae2_write },
111665593799SPeter Maydell    { .name = "TLBI_RVAE3IS", .state = ARM_CP_STATE_AA64,
111765593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 1,
11184278186aSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
111965593799SPeter Maydell       .writefn = tlbi_aa64_rvae3is_write },
112065593799SPeter Maydell    { .name = "TLBI_RVALE3IS", .state = ARM_CP_STATE_AA64,
112165593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 5,
11224278186aSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
112365593799SPeter Maydell       .writefn = tlbi_aa64_rvae3is_write },
112465593799SPeter Maydell    { .name = "TLBI_RVAE3OS", .state = ARM_CP_STATE_AA64,
112565593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 1,
11264278186aSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
112765593799SPeter Maydell       .writefn = tlbi_aa64_rvae3is_write },
112865593799SPeter Maydell    { .name = "TLBI_RVALE3OS", .state = ARM_CP_STATE_AA64,
112965593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 5,
11304278186aSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
113165593799SPeter Maydell       .writefn = tlbi_aa64_rvae3is_write },
113265593799SPeter Maydell    { .name = "TLBI_RVAE3", .state = ARM_CP_STATE_AA64,
113365593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 1,
11344278186aSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
113565593799SPeter Maydell       .writefn = tlbi_aa64_rvae3_write },
113665593799SPeter Maydell    { .name = "TLBI_RVALE3", .state = ARM_CP_STATE_AA64,
113765593799SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 5,
11384278186aSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
113965593799SPeter Maydell       .writefn = tlbi_aa64_rvae3_write },
114065593799SPeter Maydell };
1141b0f7cd35SPeter Maydell 
1142b0f7cd35SPeter Maydell static const ARMCPRegInfo tlbios_reginfo[] = {
1143b0f7cd35SPeter Maydell     { .name = "TLBI_VMALLE1OS", .state = ARM_CP_STATE_AA64,
1144b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 0,
11454278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos,
11464278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1147b0f7cd35SPeter Maydell       .fgt = FGT_TLBIVMALLE1OS,
1148b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vmalle1is_write },
1149b0f7cd35SPeter Maydell     { .name = "TLBI_VAE1OS", .state = ARM_CP_STATE_AA64,
1150b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 1,
1151b0f7cd35SPeter Maydell       .fgt = FGT_TLBIVAE1OS,
11524278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos,
11534278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1154b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
1155b0f7cd35SPeter Maydell     { .name = "TLBI_ASIDE1OS", .state = ARM_CP_STATE_AA64,
1156b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 2,
11574278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos,
11584278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1159b0f7cd35SPeter Maydell       .fgt = FGT_TLBIASIDE1OS,
1160b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vmalle1is_write },
1161b0f7cd35SPeter Maydell     { .name = "TLBI_VAAE1OS", .state = ARM_CP_STATE_AA64,
1162b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 3,
11634278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos,
11644278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1165b0f7cd35SPeter Maydell       .fgt = FGT_TLBIVAAE1OS,
1166b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
1167b0f7cd35SPeter Maydell     { .name = "TLBI_VALE1OS", .state = ARM_CP_STATE_AA64,
1168b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 5,
11694278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos,
11704278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1171b0f7cd35SPeter Maydell       .fgt = FGT_TLBIVALE1OS,
1172b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
1173b0f7cd35SPeter Maydell     { .name = "TLBI_VAALE1OS", .state = ARM_CP_STATE_AA64,
1174b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 7,
11754278186aSPeter Maydell       .access = PL1_W, .accessfn = access_ttlbos,
11764278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1177b0f7cd35SPeter Maydell       .fgt = FGT_TLBIVAALE1OS,
1178b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae1is_write },
1179b0f7cd35SPeter Maydell     { .name = "TLBI_ALLE2OS", .state = ARM_CP_STATE_AA64,
1180b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 0,
11814278186aSPeter Maydell       .access = PL2_W,
11824278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
1183b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_alle2is_write },
1184b0f7cd35SPeter Maydell     { .name = "TLBI_VAE2OS", .state = ARM_CP_STATE_AA64,
1185b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 1,
11864278186aSPeter Maydell       .access = PL2_W,
11874278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
1188b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae2is_write },
1189b0f7cd35SPeter Maydell    { .name = "TLBI_ALLE1OS", .state = ARM_CP_STATE_AA64,
1190b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 4,
11914278186aSPeter Maydell       .access = PL2_W,
11924278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1193b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
1194b0f7cd35SPeter Maydell     { .name = "TLBI_VALE2OS", .state = ARM_CP_STATE_AA64,
1195b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 5,
11964278186aSPeter Maydell       .access = PL2_W,
11974278186aSPeter Maydell       .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
1198b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae2is_write },
1199b0f7cd35SPeter Maydell     { .name = "TLBI_VMALLS12E1OS", .state = ARM_CP_STATE_AA64,
1200b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 6,
12014278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1202b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_alle1is_write },
1203b0f7cd35SPeter Maydell     { .name = "TLBI_IPAS2E1OS", .state = ARM_CP_STATE_AA64,
1204b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 0,
12054278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NOP | ARM_CP_ADD_TLBI_NXS },
1206b0f7cd35SPeter Maydell     { .name = "TLBI_RIPAS2E1OS", .state = ARM_CP_STATE_AA64,
1207b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 3,
12084278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NOP | ARM_CP_ADD_TLBI_NXS },
1209b0f7cd35SPeter Maydell     { .name = "TLBI_IPAS2LE1OS", .state = ARM_CP_STATE_AA64,
1210b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 4,
12114278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NOP | ARM_CP_ADD_TLBI_NXS },
1212b0f7cd35SPeter Maydell     { .name = "TLBI_RIPAS2LE1OS", .state = ARM_CP_STATE_AA64,
1213b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 7,
12144278186aSPeter Maydell       .access = PL2_W, .type = ARM_CP_NOP | ARM_CP_ADD_TLBI_NXS },
1215b0f7cd35SPeter Maydell     { .name = "TLBI_ALLE3OS", .state = ARM_CP_STATE_AA64,
1216b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 0,
12174278186aSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1218b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_alle3is_write },
1219b0f7cd35SPeter Maydell     { .name = "TLBI_VAE3OS", .state = ARM_CP_STATE_AA64,
1220b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 1,
12214278186aSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1222b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae3is_write },
1223b0f7cd35SPeter Maydell     { .name = "TLBI_VALE3OS", .state = ARM_CP_STATE_AA64,
1224b0f7cd35SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 5,
12254278186aSPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1226b0f7cd35SPeter Maydell       .writefn = tlbi_aa64_vae3is_write },
1227b0f7cd35SPeter Maydell };
12280b7aefb9SPeter Maydell 
tlbi_aa64_paall_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)12290b7aefb9SPeter Maydell static void tlbi_aa64_paall_write(CPUARMState *env, const ARMCPRegInfo *ri,
12300b7aefb9SPeter Maydell                                   uint64_t value)
12310b7aefb9SPeter Maydell {
12320b7aefb9SPeter Maydell     CPUState *cs = env_cpu(env);
12330b7aefb9SPeter Maydell 
12340b7aefb9SPeter Maydell     tlb_flush(cs);
12350b7aefb9SPeter Maydell }
12360b7aefb9SPeter Maydell 
tlbi_aa64_paallos_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)12370b7aefb9SPeter Maydell static void tlbi_aa64_paallos_write(CPUARMState *env, const ARMCPRegInfo *ri,
12380b7aefb9SPeter Maydell                                     uint64_t value)
12390b7aefb9SPeter Maydell {
12400b7aefb9SPeter Maydell     CPUState *cs = env_cpu(env);
12410b7aefb9SPeter Maydell 
12420b7aefb9SPeter Maydell     tlb_flush_all_cpus_synced(cs);
12430b7aefb9SPeter Maydell }
12440b7aefb9SPeter Maydell 
12450b7aefb9SPeter Maydell static const ARMCPRegInfo tlbi_rme_reginfo[] = {
12460b7aefb9SPeter Maydell     { .name = "TLBI_PAALL", .state = ARM_CP_STATE_AA64,
12470b7aefb9SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 4,
12480b7aefb9SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
12490b7aefb9SPeter Maydell       .writefn = tlbi_aa64_paall_write },
12500b7aefb9SPeter Maydell     { .name = "TLBI_PAALLOS", .state = ARM_CP_STATE_AA64,
12510b7aefb9SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 4,
12520b7aefb9SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
12530b7aefb9SPeter Maydell       .writefn = tlbi_aa64_paallos_write },
12540b7aefb9SPeter Maydell     /*
12550b7aefb9SPeter Maydell      * QEMU does not have a way to invalidate by physical address, thus
12560b7aefb9SPeter Maydell      * invalidating a range of physical addresses is accomplished by
12570b7aefb9SPeter Maydell      * flushing all tlb entries in the outer shareable domain,
12580b7aefb9SPeter Maydell      * just like PAALLOS.
12590b7aefb9SPeter Maydell      */
12600b7aefb9SPeter Maydell     { .name = "TLBI_RPALOS", .state = ARM_CP_STATE_AA64,
12610b7aefb9SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 4, .opc2 = 7,
12620b7aefb9SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
12630b7aefb9SPeter Maydell       .writefn = tlbi_aa64_paallos_write },
12640b7aefb9SPeter Maydell     { .name = "TLBI_RPAOS", .state = ARM_CP_STATE_AA64,
12650b7aefb9SPeter Maydell       .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 4, .opc2 = 3,
12660b7aefb9SPeter Maydell       .access = PL3_W, .type = ARM_CP_NO_RAW,
12670b7aefb9SPeter Maydell       .writefn = tlbi_aa64_paallos_write },
12680b7aefb9SPeter Maydell };
12690b7aefb9SPeter Maydell 
define_tlb_insn_regs(ARMCPU * cpu)12701e32ee23SPeter Maydell void define_tlb_insn_regs(ARMCPU *cpu)
12711e32ee23SPeter Maydell {
12721e32ee23SPeter Maydell     CPUARMState *env = &cpu->env;
12731e32ee23SPeter Maydell 
12741e32ee23SPeter Maydell     if (!arm_feature(env, ARM_FEATURE_V7)) {
12751e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_not_v7_cp_reginfo);
12761e32ee23SPeter Maydell     } else {
12771e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v7_cp_reginfo);
12781e32ee23SPeter Maydell     }
12791e32ee23SPeter Maydell     if (arm_feature(env, ARM_FEATURE_V7MP) &&
12801e32ee23SPeter Maydell         !arm_feature(env, ARM_FEATURE_PMSA)) {
12811e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v7mp_cp_reginfo);
12821e32ee23SPeter Maydell     }
12831e32ee23SPeter Maydell     if (arm_feature(env, ARM_FEATURE_V8)) {
12841e32ee23SPeter Maydell         define_arm_cp_regs(cpu, tlbi_v8_cp_reginfo);
12851e32ee23SPeter Maydell     }
1286d6b6da1fSPeter Maydell     /*
1287d6b6da1fSPeter Maydell      * We retain the existing logic for when to register these TLBI
1288d6b6da1fSPeter Maydell      * ops (i.e. matching the condition for el2_cp_reginfo[] in
1289d6b6da1fSPeter Maydell      * helper.c), but we will be able to simplify this later.
1290d6b6da1fSPeter Maydell      */
129148e652c4SPeter Maydell     if (arm_feature(env, ARM_FEATURE_EL2)) {
1292d6b6da1fSPeter Maydell         define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo);
1293d6b6da1fSPeter Maydell     }
12945991e5abSPeter Maydell     if (arm_feature(env, ARM_FEATURE_EL3)) {
12955991e5abSPeter Maydell         define_arm_cp_regs(cpu, tlbi_el3_cp_reginfo);
12965991e5abSPeter Maydell     }
129765593799SPeter Maydell     if (cpu_isar_feature(aa64_tlbirange, cpu)) {
129865593799SPeter Maydell         define_arm_cp_regs(cpu, tlbirange_reginfo);
129965593799SPeter Maydell     }
1300b0f7cd35SPeter Maydell     if (cpu_isar_feature(aa64_tlbios, cpu)) {
1301b0f7cd35SPeter Maydell         define_arm_cp_regs(cpu, tlbios_reginfo);
1302b0f7cd35SPeter Maydell     }
13030b7aefb9SPeter Maydell     if (cpu_isar_feature(aa64_rme, cpu)) {
13040b7aefb9SPeter Maydell         define_arm_cp_regs(cpu, tlbi_rme_reginfo);
13050b7aefb9SPeter Maydell     }
13061e32ee23SPeter Maydell }
1307