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"
10*6ff5da16SPhilippe Mathieu-Daudé #include "exec/cputlb.h"
111e32ee23SPeter Maydell #include "cpu.h"
121e32ee23SPeter Maydell #include "internals.h"
131e32ee23SPeter Maydell #include "cpu-features.h"
141e32ee23SPeter Maydell #include "cpregs.h"
151e32ee23SPeter Maydell
1627fb860fSPeter Maydell /* Check for traps from EL1 due to HCR_EL2.TTLB. */
access_ttlb(CPUARMState * env,const ARMCPRegInfo * ri,bool isread)1727fb860fSPeter Maydell static CPAccessResult access_ttlb(CPUARMState *env, const ARMCPRegInfo *ri,
1827fb860fSPeter Maydell bool isread)
1927fb860fSPeter Maydell {
2027fb860fSPeter Maydell if (arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_TTLB)) {
2127fb860fSPeter Maydell return CP_ACCESS_TRAP_EL2;
2227fb860fSPeter Maydell }
2327fb860fSPeter Maydell return CP_ACCESS_OK;
2427fb860fSPeter Maydell }
2527fb860fSPeter Maydell
2627fb860fSPeter Maydell /* Check for traps from EL1 due to HCR_EL2.TTLB or TTLBIS. */
access_ttlbis(CPUARMState * env,const ARMCPRegInfo * ri,bool isread)2727fb860fSPeter Maydell static CPAccessResult access_ttlbis(CPUARMState *env, const ARMCPRegInfo *ri,
2827fb860fSPeter Maydell bool isread)
2927fb860fSPeter Maydell {
3027fb860fSPeter Maydell if (arm_current_el(env) == 1 &&
3127fb860fSPeter Maydell (arm_hcr_el2_eff(env) & (HCR_TTLB | HCR_TTLBIS))) {
3227fb860fSPeter Maydell return CP_ACCESS_TRAP_EL2;
3327fb860fSPeter Maydell }
3427fb860fSPeter Maydell return CP_ACCESS_OK;
3527fb860fSPeter Maydell }
3627fb860fSPeter Maydell
3727fb860fSPeter Maydell #ifdef TARGET_AARCH64
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 #endif
4927fb860fSPeter Maydell
501e32ee23SPeter Maydell /* IS variants of TLB operations must affect all cores */
tlbiall_is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbiasid_is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbimva_is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbimvaa_is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
8327fb860fSPeter Maydell /*
8427fb860fSPeter Maydell * Non-IS variants of TLB operations are upgraded to
8527fb860fSPeter Maydell * IS versions if we are at EL1 and HCR_EL2.FB is effectively set to
8627fb860fSPeter Maydell * force broadcast of these operations.
8727fb860fSPeter Maydell */
tlb_force_broadcast(CPUARMState * env)8827fb860fSPeter Maydell static bool tlb_force_broadcast(CPUARMState *env)
8927fb860fSPeter Maydell {
9027fb860fSPeter Maydell return arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_FB);
9127fb860fSPeter Maydell }
9227fb860fSPeter Maydell
tlbiall_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbimva_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbiasid_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbimvaa_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbimva_hyp_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbimva_hyp_is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbiipas2_hyp_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbiipas2is_hyp_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbiall_nsnh_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbiall_nsnh_is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbiall_hyp_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbiall_hyp_is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
21727fb860fSPeter Maydell /*
21827fb860fSPeter Maydell * See: D4.7.2 TLB maintenance requirements and the TLB maintenance instructions
21927fb860fSPeter Maydell * Page D4-1736 (DDI0487A.b)
22027fb860fSPeter Maydell */
22127fb860fSPeter Maydell
vae1_tlbmask(CPUARMState * env)22227fb860fSPeter Maydell static int vae1_tlbmask(CPUARMState *env)
22327fb860fSPeter Maydell {
22427fb860fSPeter Maydell uint64_t hcr = arm_hcr_el2_eff(env);
22527fb860fSPeter Maydell uint16_t mask;
22627fb860fSPeter Maydell
22727fb860fSPeter Maydell assert(arm_feature(env, ARM_FEATURE_AARCH64));
22827fb860fSPeter Maydell
22927fb860fSPeter Maydell if ((hcr & (HCR_E2H | HCR_TGE)) == (HCR_E2H | HCR_TGE)) {
23027fb860fSPeter Maydell mask = ARMMMUIdxBit_E20_2 |
23127fb860fSPeter Maydell ARMMMUIdxBit_E20_2_PAN |
23227fb860fSPeter Maydell ARMMMUIdxBit_E20_0;
23327fb860fSPeter Maydell } else {
23427fb860fSPeter Maydell /* This is AArch64 only, so we don't need to touch the EL30_x TLBs */
23527fb860fSPeter Maydell mask = ARMMMUIdxBit_E10_1 |
23627fb860fSPeter Maydell ARMMMUIdxBit_E10_1_PAN |
23727fb860fSPeter Maydell ARMMMUIdxBit_E10_0;
23827fb860fSPeter Maydell }
23927fb860fSPeter Maydell return mask;
24027fb860fSPeter Maydell }
24127fb860fSPeter Maydell
vae2_tlbmask(CPUARMState * env)24227fb860fSPeter Maydell static int vae2_tlbmask(CPUARMState *env)
24327fb860fSPeter Maydell {
24427fb860fSPeter Maydell uint64_t hcr = arm_hcr_el2_eff(env);
24527fb860fSPeter Maydell uint16_t mask;
24627fb860fSPeter Maydell
24727fb860fSPeter Maydell if (hcr & HCR_E2H) {
24827fb860fSPeter Maydell mask = ARMMMUIdxBit_E20_2 |
24927fb860fSPeter Maydell ARMMMUIdxBit_E20_2_PAN |
25027fb860fSPeter Maydell ARMMMUIdxBit_E20_0;
25127fb860fSPeter Maydell } else {
25227fb860fSPeter Maydell mask = ARMMMUIdxBit_E2;
25327fb860fSPeter Maydell }
25427fb860fSPeter Maydell return mask;
25527fb860fSPeter Maydell }
25627fb860fSPeter Maydell
25727fb860fSPeter Maydell /* Return 56 if TBI is enabled, 64 otherwise. */
tlbbits_for_regime(CPUARMState * env,ARMMMUIdx mmu_idx,uint64_t addr)25827fb860fSPeter Maydell static int tlbbits_for_regime(CPUARMState *env, ARMMMUIdx mmu_idx,
25927fb860fSPeter Maydell uint64_t addr)
26027fb860fSPeter Maydell {
26127fb860fSPeter Maydell uint64_t tcr = regime_tcr(env, mmu_idx);
26227fb860fSPeter Maydell int tbi = aa64_va_parameter_tbi(tcr, mmu_idx);
26327fb860fSPeter Maydell int select = extract64(addr, 55, 1);
26427fb860fSPeter Maydell
26527fb860fSPeter Maydell return (tbi >> select) & 1 ? 56 : 64;
26627fb860fSPeter Maydell }
26727fb860fSPeter Maydell
vae1_tlbbits(CPUARMState * env,uint64_t addr)26827fb860fSPeter Maydell static int vae1_tlbbits(CPUARMState *env, uint64_t addr)
26927fb860fSPeter Maydell {
27027fb860fSPeter Maydell uint64_t hcr = arm_hcr_el2_eff(env);
27127fb860fSPeter Maydell ARMMMUIdx mmu_idx;
27227fb860fSPeter Maydell
27327fb860fSPeter Maydell assert(arm_feature(env, ARM_FEATURE_AARCH64));
27427fb860fSPeter Maydell
27527fb860fSPeter Maydell /* Only the regime of the mmu_idx below is significant. */
27627fb860fSPeter Maydell if ((hcr & (HCR_E2H | HCR_TGE)) == (HCR_E2H | HCR_TGE)) {
27727fb860fSPeter Maydell mmu_idx = ARMMMUIdx_E20_0;
27827fb860fSPeter Maydell } else {
27927fb860fSPeter Maydell mmu_idx = ARMMMUIdx_E10_0;
28027fb860fSPeter Maydell }
28127fb860fSPeter Maydell
28227fb860fSPeter Maydell return tlbbits_for_regime(env, mmu_idx, addr);
28327fb860fSPeter Maydell }
28427fb860fSPeter Maydell
vae2_tlbbits(CPUARMState * env,uint64_t addr)28527fb860fSPeter Maydell static int vae2_tlbbits(CPUARMState *env, uint64_t addr)
28627fb860fSPeter Maydell {
28727fb860fSPeter Maydell uint64_t hcr = arm_hcr_el2_eff(env);
28827fb860fSPeter Maydell ARMMMUIdx mmu_idx;
28927fb860fSPeter Maydell
29027fb860fSPeter Maydell /*
29127fb860fSPeter Maydell * Only the regime of the mmu_idx below is significant.
29227fb860fSPeter Maydell * Regime EL2&0 has two ranges with separate TBI configuration, while EL2
29327fb860fSPeter Maydell * only has one.
29427fb860fSPeter Maydell */
29527fb860fSPeter Maydell if (hcr & HCR_E2H) {
29627fb860fSPeter Maydell mmu_idx = ARMMMUIdx_E20_2;
29727fb860fSPeter Maydell } else {
29827fb860fSPeter Maydell mmu_idx = ARMMMUIdx_E2;
29927fb860fSPeter Maydell }
30027fb860fSPeter Maydell
30127fb860fSPeter Maydell return tlbbits_for_regime(env, mmu_idx, addr);
30227fb860fSPeter Maydell }
30327fb860fSPeter Maydell
tlbi_aa64_vmalle1is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)30427fb860fSPeter Maydell static void tlbi_aa64_vmalle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
30527fb860fSPeter Maydell uint64_t value)
30627fb860fSPeter Maydell {
30727fb860fSPeter Maydell CPUState *cs = env_cpu(env);
30827fb860fSPeter Maydell int mask = vae1_tlbmask(env);
30927fb860fSPeter Maydell
31027fb860fSPeter Maydell tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
31127fb860fSPeter Maydell }
31227fb860fSPeter Maydell
tlbi_aa64_vmalle1_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
e2_tlbmask(CPUARMState * env)32627fb860fSPeter Maydell static int e2_tlbmask(CPUARMState *env)
32727fb860fSPeter Maydell {
32827fb860fSPeter Maydell return (ARMMMUIdxBit_E20_0 |
32927fb860fSPeter Maydell ARMMMUIdxBit_E20_2 |
33027fb860fSPeter Maydell ARMMMUIdxBit_E20_2_PAN |
33127fb860fSPeter Maydell ARMMMUIdxBit_E2);
33227fb860fSPeter Maydell }
33327fb860fSPeter Maydell
tlbi_aa64_alle1_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbi_aa64_alle2_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbi_aa64_alle3_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbi_aa64_alle1is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)36127fb860fSPeter Maydell static void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
36227fb860fSPeter Maydell uint64_t value)
36327fb860fSPeter Maydell {
36427fb860fSPeter Maydell CPUState *cs = env_cpu(env);
36527fb860fSPeter Maydell int mask = alle1_tlbmask(env);
36627fb860fSPeter Maydell
36727fb860fSPeter Maydell tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
36827fb860fSPeter Maydell }
36927fb860fSPeter Maydell
tlbi_aa64_alle2is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)37027fb860fSPeter Maydell static void tlbi_aa64_alle2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
37127fb860fSPeter Maydell uint64_t value)
37227fb860fSPeter Maydell {
37327fb860fSPeter Maydell CPUState *cs = env_cpu(env);
37427fb860fSPeter Maydell int mask = e2_tlbmask(env);
37527fb860fSPeter Maydell
37627fb860fSPeter Maydell tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
37727fb860fSPeter Maydell }
37827fb860fSPeter Maydell
tlbi_aa64_alle3is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)37927fb860fSPeter Maydell static void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
38027fb860fSPeter Maydell uint64_t value)
38127fb860fSPeter Maydell {
38227fb860fSPeter Maydell CPUState *cs = env_cpu(env);
38327fb860fSPeter Maydell
38427fb860fSPeter Maydell tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E3);
38527fb860fSPeter Maydell }
38627fb860fSPeter Maydell
tlbi_aa64_vae2_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbi_aa64_vae3_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbi_aa64_vae1is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)41827fb860fSPeter Maydell static void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
41927fb860fSPeter Maydell uint64_t value)
42027fb860fSPeter Maydell {
42127fb860fSPeter Maydell CPUState *cs = env_cpu(env);
42227fb860fSPeter Maydell int mask = vae1_tlbmask(env);
42327fb860fSPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56);
42427fb860fSPeter Maydell int bits = vae1_tlbbits(env, pageaddr);
42527fb860fSPeter Maydell
42627fb860fSPeter Maydell tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
42727fb860fSPeter Maydell }
42827fb860fSPeter Maydell
tlbi_aa64_vae1_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbi_aa64_vae2is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)45027fb860fSPeter Maydell static void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
45127fb860fSPeter Maydell uint64_t value)
45227fb860fSPeter Maydell {
45327fb860fSPeter Maydell CPUState *cs = env_cpu(env);
45427fb860fSPeter Maydell int mask = vae2_tlbmask(env);
45527fb860fSPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56);
45627fb860fSPeter Maydell int bits = vae2_tlbbits(env, pageaddr);
45727fb860fSPeter Maydell
45827fb860fSPeter Maydell tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
45927fb860fSPeter Maydell }
46027fb860fSPeter Maydell
tlbi_aa64_vae3is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)46127fb860fSPeter Maydell static void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
46227fb860fSPeter Maydell uint64_t value)
46327fb860fSPeter Maydell {
46427fb860fSPeter Maydell CPUState *cs = env_cpu(env);
46527fb860fSPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56);
46627fb860fSPeter Maydell int bits = tlbbits_for_regime(env, ARMMMUIdx_E3, pageaddr);
46727fb860fSPeter Maydell
46827fb860fSPeter Maydell tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr,
46927fb860fSPeter Maydell ARMMMUIdxBit_E3, bits);
47027fb860fSPeter Maydell }
47127fb860fSPeter Maydell
ipas2e1_tlbmask(CPUARMState * env,int64_t value)47227fb860fSPeter Maydell static int ipas2e1_tlbmask(CPUARMState *env, int64_t value)
47327fb860fSPeter Maydell {
47427fb860fSPeter Maydell /*
47527fb860fSPeter Maydell * The MSB of value is the NS field, which only applies if SEL2
47627fb860fSPeter Maydell * is implemented and SCR_EL3.NS is not set (i.e. in secure mode).
47727fb860fSPeter Maydell */
47827fb860fSPeter Maydell return (value >= 0
47927fb860fSPeter Maydell && cpu_isar_feature(aa64_sel2, env_archcpu(env))
48027fb860fSPeter Maydell && arm_is_secure_below_el3(env)
48127fb860fSPeter Maydell ? ARMMMUIdxBit_Stage2_S
48227fb860fSPeter Maydell : ARMMMUIdxBit_Stage2);
48327fb860fSPeter Maydell }
48427fb860fSPeter Maydell
tlbi_aa64_ipas2e1_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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
tlbi_aa64_ipas2e1is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)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,
6204278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbis,
6214278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
622abbb8264SPeter Maydell .fgt = FGT_TLBIVMALLE1IS,
623abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1is_write },
624abbb8264SPeter Maydell { .name = "TLBI_VAE1IS", .state = ARM_CP_STATE_AA64,
625abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
6264278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbis,
6274278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
628abbb8264SPeter Maydell .fgt = FGT_TLBIVAE1IS,
629abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write },
630abbb8264SPeter Maydell { .name = "TLBI_ASIDE1IS", .state = ARM_CP_STATE_AA64,
631abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
6324278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbis,
6334278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
634abbb8264SPeter Maydell .fgt = FGT_TLBIASIDE1IS,
635abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1is_write },
636abbb8264SPeter Maydell { .name = "TLBI_VAAE1IS", .state = ARM_CP_STATE_AA64,
637abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
6384278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbis,
6394278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
640abbb8264SPeter Maydell .fgt = FGT_TLBIVAAE1IS,
641abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write },
642abbb8264SPeter Maydell { .name = "TLBI_VALE1IS", .state = ARM_CP_STATE_AA64,
643abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
6444278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbis,
6454278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
646abbb8264SPeter Maydell .fgt = FGT_TLBIVALE1IS,
647abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write },
648abbb8264SPeter Maydell { .name = "TLBI_VAALE1IS", .state = ARM_CP_STATE_AA64,
649abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
6504278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbis,
6514278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
652abbb8264SPeter Maydell .fgt = FGT_TLBIVAALE1IS,
653abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write },
654abbb8264SPeter Maydell { .name = "TLBI_VMALLE1", .state = ARM_CP_STATE_AA64,
655abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
6564278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlb,
6574278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
658abbb8264SPeter Maydell .fgt = FGT_TLBIVMALLE1,
659abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1_write },
660abbb8264SPeter Maydell { .name = "TLBI_VAE1", .state = ARM_CP_STATE_AA64,
661abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
6624278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlb,
6634278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
664abbb8264SPeter Maydell .fgt = FGT_TLBIVAE1,
665abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write },
666abbb8264SPeter Maydell { .name = "TLBI_ASIDE1", .state = ARM_CP_STATE_AA64,
667abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
6684278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlb,
6694278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
670abbb8264SPeter Maydell .fgt = FGT_TLBIASIDE1,
671abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1_write },
672abbb8264SPeter Maydell { .name = "TLBI_VAAE1", .state = ARM_CP_STATE_AA64,
673abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
6744278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlb,
6754278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
676abbb8264SPeter Maydell .fgt = FGT_TLBIVAAE1,
677abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write },
678abbb8264SPeter Maydell { .name = "TLBI_VALE1", .state = ARM_CP_STATE_AA64,
679abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
6804278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlb,
6814278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
682abbb8264SPeter Maydell .fgt = FGT_TLBIVALE1,
683abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write },
684abbb8264SPeter Maydell { .name = "TLBI_VAALE1", .state = ARM_CP_STATE_AA64,
685abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
6864278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlb,
6874278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
688abbb8264SPeter Maydell .fgt = FGT_TLBIVAALE1,
689abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write },
690abbb8264SPeter Maydell { .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64,
691abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
6924278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
693abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1is_write },
694abbb8264SPeter Maydell { .name = "TLBI_IPAS2LE1IS", .state = ARM_CP_STATE_AA64,
695abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
6964278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
697abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1is_write },
698abbb8264SPeter Maydell { .name = "TLBI_ALLE1IS", .state = ARM_CP_STATE_AA64,
699abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
7004278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
701abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1is_write },
702abbb8264SPeter Maydell { .name = "TLBI_VMALLS12E1IS", .state = ARM_CP_STATE_AA64,
703abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 6,
7044278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
705abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1is_write },
706abbb8264SPeter Maydell { .name = "TLBI_IPAS2E1", .state = ARM_CP_STATE_AA64,
707abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
7084278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
709abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1_write },
710abbb8264SPeter Maydell { .name = "TLBI_IPAS2LE1", .state = ARM_CP_STATE_AA64,
711abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
7124278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
713abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1_write },
714abbb8264SPeter Maydell { .name = "TLBI_ALLE1", .state = ARM_CP_STATE_AA64,
715abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
7164278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
717abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1_write },
718abbb8264SPeter Maydell { .name = "TLBI_VMALLS12E1", .state = ARM_CP_STATE_AA64,
719abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 6,
7204278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
721abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1is_write },
7221e32ee23SPeter Maydell };
7231e32ee23SPeter Maydell
724d6b6da1fSPeter Maydell static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = {
725d6b6da1fSPeter Maydell { .name = "TLBIALLNSNH",
726d6b6da1fSPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
727d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W,
728d6b6da1fSPeter Maydell .writefn = tlbiall_nsnh_write },
729d6b6da1fSPeter Maydell { .name = "TLBIALLNSNHIS",
730d6b6da1fSPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
731d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W,
732d6b6da1fSPeter Maydell .writefn = tlbiall_nsnh_is_write },
733d6b6da1fSPeter Maydell { .name = "TLBIALLH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
734d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W,
735d6b6da1fSPeter Maydell .writefn = tlbiall_hyp_write },
736d6b6da1fSPeter Maydell { .name = "TLBIALLHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
737d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W,
738d6b6da1fSPeter Maydell .writefn = tlbiall_hyp_is_write },
739d6b6da1fSPeter Maydell { .name = "TLBIMVAH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
740d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W,
741d6b6da1fSPeter Maydell .writefn = tlbimva_hyp_write },
742d6b6da1fSPeter Maydell { .name = "TLBIMVAHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
743d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W,
744d6b6da1fSPeter Maydell .writefn = tlbimva_hyp_is_write },
7457cadf113SPeter Maydell { .name = "TLBI_ALLE2", .state = ARM_CP_STATE_AA64,
7467cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
7474278186aSPeter Maydell .access = PL2_W,
7484278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
7497cadf113SPeter Maydell .writefn = tlbi_aa64_alle2_write },
7507cadf113SPeter Maydell { .name = "TLBI_VAE2", .state = ARM_CP_STATE_AA64,
7517cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
7524278186aSPeter Maydell .access = PL2_W,
7534278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
7547cadf113SPeter Maydell .writefn = tlbi_aa64_vae2_write },
7557cadf113SPeter Maydell { .name = "TLBI_VALE2", .state = ARM_CP_STATE_AA64,
7567cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
7574278186aSPeter Maydell .access = PL2_W,
7584278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
7597cadf113SPeter Maydell .writefn = tlbi_aa64_vae2_write },
7607cadf113SPeter Maydell { .name = "TLBI_ALLE2IS", .state = ARM_CP_STATE_AA64,
7617cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
7624278186aSPeter Maydell .access = PL2_W,
7634278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
7647cadf113SPeter Maydell .writefn = tlbi_aa64_alle2is_write },
7657cadf113SPeter Maydell { .name = "TLBI_VAE2IS", .state = ARM_CP_STATE_AA64,
7667cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
7674278186aSPeter Maydell .access = PL2_W,
7684278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
7697cadf113SPeter Maydell .writefn = tlbi_aa64_vae2is_write },
7707cadf113SPeter Maydell { .name = "TLBI_VALE2IS", .state = ARM_CP_STATE_AA64,
7717cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
7724278186aSPeter Maydell .access = PL2_W,
7734278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
7747cadf113SPeter Maydell .writefn = tlbi_aa64_vae2is_write },
775d6b6da1fSPeter Maydell };
776d6b6da1fSPeter Maydell
7775991e5abSPeter Maydell static const ARMCPRegInfo tlbi_el3_cp_reginfo[] = {
7785991e5abSPeter Maydell { .name = "TLBI_ALLE3IS", .state = ARM_CP_STATE_AA64,
7795991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 0,
7804278186aSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
7815991e5abSPeter Maydell .writefn = tlbi_aa64_alle3is_write },
7825991e5abSPeter Maydell { .name = "TLBI_VAE3IS", .state = ARM_CP_STATE_AA64,
7835991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 1,
7844278186aSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
7855991e5abSPeter Maydell .writefn = tlbi_aa64_vae3is_write },
7865991e5abSPeter Maydell { .name = "TLBI_VALE3IS", .state = ARM_CP_STATE_AA64,
7875991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 5,
7884278186aSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
7895991e5abSPeter Maydell .writefn = tlbi_aa64_vae3is_write },
7905991e5abSPeter Maydell { .name = "TLBI_ALLE3", .state = ARM_CP_STATE_AA64,
7915991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 0,
7924278186aSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
7935991e5abSPeter Maydell .writefn = tlbi_aa64_alle3_write },
7945991e5abSPeter Maydell { .name = "TLBI_VAE3", .state = ARM_CP_STATE_AA64,
7955991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 1,
7964278186aSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
7975991e5abSPeter Maydell .writefn = tlbi_aa64_vae3_write },
7985991e5abSPeter Maydell { .name = "TLBI_VALE3", .state = ARM_CP_STATE_AA64,
7995991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 5,
8004278186aSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
8015991e5abSPeter Maydell .writefn = tlbi_aa64_vae3_write },
8025991e5abSPeter Maydell };
8035991e5abSPeter Maydell
80465593799SPeter Maydell #ifdef TARGET_AARCH64
80565593799SPeter Maydell typedef struct {
80665593799SPeter Maydell uint64_t base;
80765593799SPeter Maydell uint64_t length;
80865593799SPeter Maydell } TLBIRange;
80965593799SPeter Maydell
tlbi_range_tg_to_gran_size(int tg)81065593799SPeter Maydell static ARMGranuleSize tlbi_range_tg_to_gran_size(int tg)
81165593799SPeter Maydell {
81265593799SPeter Maydell /*
81365593799SPeter Maydell * Note that the TLBI range TG field encoding differs from both
81465593799SPeter Maydell * TG0 and TG1 encodings.
81565593799SPeter Maydell */
81665593799SPeter Maydell switch (tg) {
81765593799SPeter Maydell case 1:
81865593799SPeter Maydell return Gran4K;
81965593799SPeter Maydell case 2:
82065593799SPeter Maydell return Gran16K;
82165593799SPeter Maydell case 3:
82265593799SPeter Maydell return Gran64K;
82365593799SPeter Maydell default:
82465593799SPeter Maydell return GranInvalid;
82565593799SPeter Maydell }
82665593799SPeter Maydell }
82765593799SPeter Maydell
tlbi_aa64_get_range(CPUARMState * env,ARMMMUIdx mmuidx,uint64_t value)82865593799SPeter Maydell static TLBIRange tlbi_aa64_get_range(CPUARMState *env, ARMMMUIdx mmuidx,
82965593799SPeter Maydell uint64_t value)
83065593799SPeter Maydell {
83165593799SPeter Maydell unsigned int page_size_granule, page_shift, num, scale, exponent;
83265593799SPeter Maydell /* Extract one bit to represent the va selector in use. */
83365593799SPeter Maydell uint64_t select = sextract64(value, 36, 1);
83465593799SPeter Maydell ARMVAParameters param = aa64_va_parameters(env, select, mmuidx, true, false);
83565593799SPeter Maydell TLBIRange ret = { };
83665593799SPeter Maydell ARMGranuleSize gran;
83765593799SPeter Maydell
83865593799SPeter Maydell page_size_granule = extract64(value, 46, 2);
83965593799SPeter Maydell gran = tlbi_range_tg_to_gran_size(page_size_granule);
84065593799SPeter Maydell
84165593799SPeter Maydell /* The granule encoded in value must match the granule in use. */
84265593799SPeter Maydell if (gran != param.gran) {
84365593799SPeter Maydell qemu_log_mask(LOG_GUEST_ERROR, "Invalid tlbi page size granule %d\n",
84465593799SPeter Maydell page_size_granule);
84565593799SPeter Maydell return ret;
84665593799SPeter Maydell }
84765593799SPeter Maydell
84865593799SPeter Maydell page_shift = arm_granule_bits(gran);
84965593799SPeter Maydell num = extract64(value, 39, 5);
85065593799SPeter Maydell scale = extract64(value, 44, 2);
85165593799SPeter Maydell exponent = (5 * scale) + 1;
85265593799SPeter Maydell
85365593799SPeter Maydell ret.length = (num + 1) << (exponent + page_shift);
85465593799SPeter Maydell
85565593799SPeter Maydell if (param.select) {
85665593799SPeter Maydell ret.base = sextract64(value, 0, 37);
85765593799SPeter Maydell } else {
85865593799SPeter Maydell ret.base = extract64(value, 0, 37);
85965593799SPeter Maydell }
86065593799SPeter Maydell if (param.ds) {
86165593799SPeter Maydell /*
86265593799SPeter Maydell * With DS=1, BaseADDR is always shifted 16 so that it is able
86365593799SPeter Maydell * to address all 52 va bits. The input address is perforce
86465593799SPeter Maydell * aligned on a 64k boundary regardless of translation granule.
86565593799SPeter Maydell */
86665593799SPeter Maydell page_shift = 16;
86765593799SPeter Maydell }
86865593799SPeter Maydell ret.base <<= page_shift;
86965593799SPeter Maydell
87065593799SPeter Maydell return ret;
87165593799SPeter Maydell }
87265593799SPeter Maydell
do_rvae_write(CPUARMState * env,uint64_t value,int idxmap,bool synced)87365593799SPeter Maydell static void do_rvae_write(CPUARMState *env, uint64_t value,
87465593799SPeter Maydell int idxmap, bool synced)
87565593799SPeter Maydell {
87665593799SPeter Maydell ARMMMUIdx one_idx = ARM_MMU_IDX_A | ctz32(idxmap);
87765593799SPeter Maydell TLBIRange range;
87865593799SPeter Maydell int bits;
87965593799SPeter Maydell
88065593799SPeter Maydell range = tlbi_aa64_get_range(env, one_idx, value);
88165593799SPeter Maydell bits = tlbbits_for_regime(env, one_idx, range.base);
88265593799SPeter Maydell
88365593799SPeter Maydell if (synced) {
88465593799SPeter Maydell tlb_flush_range_by_mmuidx_all_cpus_synced(env_cpu(env),
88565593799SPeter Maydell range.base,
88665593799SPeter Maydell range.length,
88765593799SPeter Maydell idxmap,
88865593799SPeter Maydell bits);
88965593799SPeter Maydell } else {
89065593799SPeter Maydell tlb_flush_range_by_mmuidx(env_cpu(env), range.base,
89165593799SPeter Maydell range.length, idxmap, bits);
89265593799SPeter Maydell }
89365593799SPeter Maydell }
89465593799SPeter Maydell
tlbi_aa64_rvae1_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)89565593799SPeter Maydell static void tlbi_aa64_rvae1_write(CPUARMState *env,
89665593799SPeter Maydell const ARMCPRegInfo *ri,
89765593799SPeter Maydell uint64_t value)
89865593799SPeter Maydell {
89965593799SPeter Maydell /*
90065593799SPeter Maydell * Invalidate by VA range, EL1&0.
90165593799SPeter Maydell * Currently handles all of RVAE1, RVAAE1, RVAALE1 and RVALE1,
90265593799SPeter Maydell * since we don't support flush-for-specific-ASID-only or
90365593799SPeter Maydell * flush-last-level-only.
90465593799SPeter Maydell */
90565593799SPeter Maydell
90665593799SPeter Maydell do_rvae_write(env, value, vae1_tlbmask(env),
90765593799SPeter Maydell tlb_force_broadcast(env));
90865593799SPeter Maydell }
90965593799SPeter Maydell
tlbi_aa64_rvae1is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)91065593799SPeter Maydell static void tlbi_aa64_rvae1is_write(CPUARMState *env,
91165593799SPeter Maydell const ARMCPRegInfo *ri,
91265593799SPeter Maydell uint64_t value)
91365593799SPeter Maydell {
91465593799SPeter Maydell /*
91565593799SPeter Maydell * Invalidate by VA range, Inner/Outer Shareable EL1&0.
91665593799SPeter Maydell * Currently handles all of RVAE1IS, RVAE1OS, RVAAE1IS, RVAAE1OS,
91765593799SPeter Maydell * RVAALE1IS, RVAALE1OS, RVALE1IS and RVALE1OS, since we don't support
91865593799SPeter Maydell * flush-for-specific-ASID-only, flush-last-level-only or inner/outer
91965593799SPeter Maydell * shareable specific flushes.
92065593799SPeter Maydell */
92165593799SPeter Maydell
92265593799SPeter Maydell do_rvae_write(env, value, vae1_tlbmask(env), true);
92365593799SPeter Maydell }
92465593799SPeter Maydell
tlbi_aa64_rvae2_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)92565593799SPeter Maydell static void tlbi_aa64_rvae2_write(CPUARMState *env,
92665593799SPeter Maydell const ARMCPRegInfo *ri,
92765593799SPeter Maydell uint64_t value)
92865593799SPeter Maydell {
92965593799SPeter Maydell /*
93065593799SPeter Maydell * Invalidate by VA range, EL2.
93165593799SPeter Maydell * Currently handles all of RVAE2 and RVALE2,
93265593799SPeter Maydell * since we don't support flush-for-specific-ASID-only or
93365593799SPeter Maydell * flush-last-level-only.
93465593799SPeter Maydell */
93565593799SPeter Maydell
93665593799SPeter Maydell do_rvae_write(env, value, vae2_tlbmask(env),
93765593799SPeter Maydell tlb_force_broadcast(env));
93865593799SPeter Maydell
93965593799SPeter Maydell
94065593799SPeter Maydell }
94165593799SPeter Maydell
tlbi_aa64_rvae2is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)94265593799SPeter Maydell static void tlbi_aa64_rvae2is_write(CPUARMState *env,
94365593799SPeter Maydell const ARMCPRegInfo *ri,
94465593799SPeter Maydell uint64_t value)
94565593799SPeter Maydell {
94665593799SPeter Maydell /*
94765593799SPeter Maydell * Invalidate by VA range, Inner/Outer Shareable, EL2.
94865593799SPeter Maydell * Currently handles all of RVAE2IS, RVAE2OS, RVALE2IS and RVALE2OS,
94965593799SPeter Maydell * since we don't support flush-for-specific-ASID-only,
95065593799SPeter Maydell * flush-last-level-only or inner/outer shareable specific flushes.
95165593799SPeter Maydell */
95265593799SPeter Maydell
95365593799SPeter Maydell do_rvae_write(env, value, vae2_tlbmask(env), true);
95465593799SPeter Maydell
95565593799SPeter Maydell }
95665593799SPeter Maydell
tlbi_aa64_rvae3_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)95765593799SPeter Maydell static void tlbi_aa64_rvae3_write(CPUARMState *env,
95865593799SPeter Maydell const ARMCPRegInfo *ri,
95965593799SPeter Maydell uint64_t value)
96065593799SPeter Maydell {
96165593799SPeter Maydell /*
96265593799SPeter Maydell * Invalidate by VA range, EL3.
96365593799SPeter Maydell * Currently handles all of RVAE3 and RVALE3,
96465593799SPeter Maydell * since we don't support flush-for-specific-ASID-only or
96565593799SPeter Maydell * flush-last-level-only.
96665593799SPeter Maydell */
96765593799SPeter Maydell
96865593799SPeter Maydell do_rvae_write(env, value, ARMMMUIdxBit_E3, tlb_force_broadcast(env));
96965593799SPeter Maydell }
97065593799SPeter Maydell
tlbi_aa64_rvae3is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)97165593799SPeter Maydell static void tlbi_aa64_rvae3is_write(CPUARMState *env,
97265593799SPeter Maydell const ARMCPRegInfo *ri,
97365593799SPeter Maydell uint64_t value)
97465593799SPeter Maydell {
97565593799SPeter Maydell /*
97665593799SPeter Maydell * Invalidate by VA range, EL3, Inner/Outer Shareable.
97765593799SPeter Maydell * Currently handles all of RVAE3IS, RVAE3OS, RVALE3IS and RVALE3OS,
97865593799SPeter Maydell * since we don't support flush-for-specific-ASID-only,
97965593799SPeter Maydell * flush-last-level-only or inner/outer specific flushes.
98065593799SPeter Maydell */
98165593799SPeter Maydell
98265593799SPeter Maydell do_rvae_write(env, value, ARMMMUIdxBit_E3, true);
98365593799SPeter Maydell }
98465593799SPeter Maydell
tlbi_aa64_ripas2e1_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)98565593799SPeter Maydell static void tlbi_aa64_ripas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
98665593799SPeter Maydell uint64_t value)
98765593799SPeter Maydell {
98865593799SPeter Maydell do_rvae_write(env, value, ipas2e1_tlbmask(env, value),
98965593799SPeter Maydell tlb_force_broadcast(env));
99065593799SPeter Maydell }
99165593799SPeter Maydell
tlbi_aa64_ripas2e1is_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)99265593799SPeter Maydell static void tlbi_aa64_ripas2e1is_write(CPUARMState *env,
99365593799SPeter Maydell const ARMCPRegInfo *ri,
99465593799SPeter Maydell uint64_t value)
99565593799SPeter Maydell {
99665593799SPeter Maydell do_rvae_write(env, value, ipas2e1_tlbmask(env, value), true);
99765593799SPeter Maydell }
99865593799SPeter Maydell
99965593799SPeter Maydell static const ARMCPRegInfo tlbirange_reginfo[] = {
100065593799SPeter Maydell { .name = "TLBI_RVAE1IS", .state = ARM_CP_STATE_AA64,
100165593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 1,
10024278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbis,
10034278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
100465593799SPeter Maydell .fgt = FGT_TLBIRVAE1IS,
100565593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write },
100665593799SPeter Maydell { .name = "TLBI_RVAAE1IS", .state = ARM_CP_STATE_AA64,
100765593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 3,
10084278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbis,
10094278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
101065593799SPeter Maydell .fgt = FGT_TLBIRVAAE1IS,
101165593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write },
101265593799SPeter Maydell { .name = "TLBI_RVALE1IS", .state = ARM_CP_STATE_AA64,
101365593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 5,
10144278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbis,
10154278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
101665593799SPeter Maydell .fgt = FGT_TLBIRVALE1IS,
101765593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write },
101865593799SPeter Maydell { .name = "TLBI_RVAALE1IS", .state = ARM_CP_STATE_AA64,
101965593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 7,
10204278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbis,
10214278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
102265593799SPeter Maydell .fgt = FGT_TLBIRVAALE1IS,
102365593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write },
102465593799SPeter Maydell { .name = "TLBI_RVAE1OS", .state = ARM_CP_STATE_AA64,
102565593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
10264278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbos,
10274278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
102865593799SPeter Maydell .fgt = FGT_TLBIRVAE1OS,
102965593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write },
103065593799SPeter Maydell { .name = "TLBI_RVAAE1OS", .state = ARM_CP_STATE_AA64,
103165593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 3,
10324278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbos,
10334278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
103465593799SPeter Maydell .fgt = FGT_TLBIRVAAE1OS,
103565593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write },
103665593799SPeter Maydell { .name = "TLBI_RVALE1OS", .state = ARM_CP_STATE_AA64,
103765593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 5,
10384278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbos,
10394278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
104065593799SPeter Maydell .fgt = FGT_TLBIRVALE1OS,
104165593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write },
104265593799SPeter Maydell { .name = "TLBI_RVAALE1OS", .state = ARM_CP_STATE_AA64,
104365593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 7,
10444278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbos,
10454278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
104665593799SPeter Maydell .fgt = FGT_TLBIRVAALE1OS,
104765593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write },
104865593799SPeter Maydell { .name = "TLBI_RVAE1", .state = ARM_CP_STATE_AA64,
104965593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
10504278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlb,
10514278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
105265593799SPeter Maydell .fgt = FGT_TLBIRVAE1,
105365593799SPeter Maydell .writefn = tlbi_aa64_rvae1_write },
105465593799SPeter Maydell { .name = "TLBI_RVAAE1", .state = ARM_CP_STATE_AA64,
105565593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 3,
10564278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlb,
10574278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
105865593799SPeter Maydell .fgt = FGT_TLBIRVAAE1,
105965593799SPeter Maydell .writefn = tlbi_aa64_rvae1_write },
106065593799SPeter Maydell { .name = "TLBI_RVALE1", .state = ARM_CP_STATE_AA64,
106165593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 5,
10624278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlb,
10634278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
106465593799SPeter Maydell .fgt = FGT_TLBIRVALE1,
106565593799SPeter Maydell .writefn = tlbi_aa64_rvae1_write },
106665593799SPeter Maydell { .name = "TLBI_RVAALE1", .state = ARM_CP_STATE_AA64,
106765593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 7,
10684278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlb,
10694278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
107065593799SPeter Maydell .fgt = FGT_TLBIRVAALE1,
107165593799SPeter Maydell .writefn = tlbi_aa64_rvae1_write },
107265593799SPeter Maydell { .name = "TLBI_RIPAS2E1IS", .state = ARM_CP_STATE_AA64,
107365593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 2,
10744278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
107565593799SPeter Maydell .writefn = tlbi_aa64_ripas2e1is_write },
107665593799SPeter Maydell { .name = "TLBI_RIPAS2LE1IS", .state = ARM_CP_STATE_AA64,
107765593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 6,
10784278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
107965593799SPeter Maydell .writefn = tlbi_aa64_ripas2e1is_write },
108065593799SPeter Maydell { .name = "TLBI_RVAE2IS", .state = ARM_CP_STATE_AA64,
108165593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 1,
10824278186aSPeter Maydell .access = PL2_W,
10834278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
108465593799SPeter Maydell .writefn = tlbi_aa64_rvae2is_write },
108565593799SPeter Maydell { .name = "TLBI_RVALE2IS", .state = ARM_CP_STATE_AA64,
108665593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 5,
10874278186aSPeter Maydell .access = PL2_W,
10884278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
108965593799SPeter Maydell .writefn = tlbi_aa64_rvae2is_write },
109065593799SPeter Maydell { .name = "TLBI_RIPAS2E1", .state = ARM_CP_STATE_AA64,
109165593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 2,
10924278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
109365593799SPeter Maydell .writefn = tlbi_aa64_ripas2e1_write },
109465593799SPeter Maydell { .name = "TLBI_RIPAS2LE1", .state = ARM_CP_STATE_AA64,
109565593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 6,
10964278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
109765593799SPeter Maydell .writefn = tlbi_aa64_ripas2e1_write },
109865593799SPeter Maydell { .name = "TLBI_RVAE2OS", .state = ARM_CP_STATE_AA64,
109965593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 1,
11004278186aSPeter Maydell .access = PL2_W,
11014278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
110265593799SPeter Maydell .writefn = tlbi_aa64_rvae2is_write },
110365593799SPeter Maydell { .name = "TLBI_RVALE2OS", .state = ARM_CP_STATE_AA64,
110465593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 5,
11054278186aSPeter Maydell .access = PL2_W,
11064278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
110765593799SPeter Maydell .writefn = tlbi_aa64_rvae2is_write },
110865593799SPeter Maydell { .name = "TLBI_RVAE2", .state = ARM_CP_STATE_AA64,
110965593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 1,
11104278186aSPeter Maydell .access = PL2_W,
11114278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
111265593799SPeter Maydell .writefn = tlbi_aa64_rvae2_write },
111365593799SPeter Maydell { .name = "TLBI_RVALE2", .state = ARM_CP_STATE_AA64,
111465593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 5,
11154278186aSPeter Maydell .access = PL2_W,
11164278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
111765593799SPeter Maydell .writefn = tlbi_aa64_rvae2_write },
111865593799SPeter Maydell { .name = "TLBI_RVAE3IS", .state = ARM_CP_STATE_AA64,
111965593799SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 1,
11204278186aSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
112165593799SPeter Maydell .writefn = tlbi_aa64_rvae3is_write },
112265593799SPeter Maydell { .name = "TLBI_RVALE3IS", .state = ARM_CP_STATE_AA64,
112365593799SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 5,
11244278186aSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
112565593799SPeter Maydell .writefn = tlbi_aa64_rvae3is_write },
112665593799SPeter Maydell { .name = "TLBI_RVAE3OS", .state = ARM_CP_STATE_AA64,
112765593799SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 1,
11284278186aSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
112965593799SPeter Maydell .writefn = tlbi_aa64_rvae3is_write },
113065593799SPeter Maydell { .name = "TLBI_RVALE3OS", .state = ARM_CP_STATE_AA64,
113165593799SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 5,
11324278186aSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
113365593799SPeter Maydell .writefn = tlbi_aa64_rvae3is_write },
113465593799SPeter Maydell { .name = "TLBI_RVAE3", .state = ARM_CP_STATE_AA64,
113565593799SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 1,
11364278186aSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
113765593799SPeter Maydell .writefn = tlbi_aa64_rvae3_write },
113865593799SPeter Maydell { .name = "TLBI_RVALE3", .state = ARM_CP_STATE_AA64,
113965593799SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 5,
11404278186aSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
114165593799SPeter Maydell .writefn = tlbi_aa64_rvae3_write },
114265593799SPeter Maydell };
1143b0f7cd35SPeter Maydell
1144b0f7cd35SPeter Maydell static const ARMCPRegInfo tlbios_reginfo[] = {
1145b0f7cd35SPeter Maydell { .name = "TLBI_VMALLE1OS", .state = ARM_CP_STATE_AA64,
1146b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 0,
11474278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbos,
11484278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1149b0f7cd35SPeter Maydell .fgt = FGT_TLBIVMALLE1OS,
1150b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vmalle1is_write },
1151b0f7cd35SPeter Maydell { .name = "TLBI_VAE1OS", .state = ARM_CP_STATE_AA64,
1152b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 1,
1153b0f7cd35SPeter Maydell .fgt = FGT_TLBIVAE1OS,
11544278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbos,
11554278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1156b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae1is_write },
1157b0f7cd35SPeter Maydell { .name = "TLBI_ASIDE1OS", .state = ARM_CP_STATE_AA64,
1158b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 2,
11594278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbos,
11604278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1161b0f7cd35SPeter Maydell .fgt = FGT_TLBIASIDE1OS,
1162b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vmalle1is_write },
1163b0f7cd35SPeter Maydell { .name = "TLBI_VAAE1OS", .state = ARM_CP_STATE_AA64,
1164b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 3,
11654278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbos,
11664278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1167b0f7cd35SPeter Maydell .fgt = FGT_TLBIVAAE1OS,
1168b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae1is_write },
1169b0f7cd35SPeter Maydell { .name = "TLBI_VALE1OS", .state = ARM_CP_STATE_AA64,
1170b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 5,
11714278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbos,
11724278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1173b0f7cd35SPeter Maydell .fgt = FGT_TLBIVALE1OS,
1174b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae1is_write },
1175b0f7cd35SPeter Maydell { .name = "TLBI_VAALE1OS", .state = ARM_CP_STATE_AA64,
1176b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 7,
11774278186aSPeter Maydell .access = PL1_W, .accessfn = access_ttlbos,
11784278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1179b0f7cd35SPeter Maydell .fgt = FGT_TLBIVAALE1OS,
1180b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae1is_write },
1181b0f7cd35SPeter Maydell { .name = "TLBI_ALLE2OS", .state = ARM_CP_STATE_AA64,
1182b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 0,
11834278186aSPeter Maydell .access = PL2_W,
11844278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
1185b0f7cd35SPeter Maydell .writefn = tlbi_aa64_alle2is_write },
1186b0f7cd35SPeter Maydell { .name = "TLBI_VAE2OS", .state = ARM_CP_STATE_AA64,
1187b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 1,
11884278186aSPeter Maydell .access = PL2_W,
11894278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
1190b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae2is_write },
1191b0f7cd35SPeter Maydell { .name = "TLBI_ALLE1OS", .state = ARM_CP_STATE_AA64,
1192b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 4,
11934278186aSPeter Maydell .access = PL2_W,
11944278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1195b0f7cd35SPeter Maydell .writefn = tlbi_aa64_alle1is_write },
1196b0f7cd35SPeter Maydell { .name = "TLBI_VALE2OS", .state = ARM_CP_STATE_AA64,
1197b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 5,
11984278186aSPeter Maydell .access = PL2_W,
11994278186aSPeter Maydell .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
1200b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae2is_write },
1201b0f7cd35SPeter Maydell { .name = "TLBI_VMALLS12E1OS", .state = ARM_CP_STATE_AA64,
1202b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 6,
12034278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1204b0f7cd35SPeter Maydell .writefn = tlbi_aa64_alle1is_write },
1205b0f7cd35SPeter Maydell { .name = "TLBI_IPAS2E1OS", .state = ARM_CP_STATE_AA64,
1206b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 0,
12074278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NOP | ARM_CP_ADD_TLBI_NXS },
1208b0f7cd35SPeter Maydell { .name = "TLBI_RIPAS2E1OS", .state = ARM_CP_STATE_AA64,
1209b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 3,
12104278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NOP | ARM_CP_ADD_TLBI_NXS },
1211b0f7cd35SPeter Maydell { .name = "TLBI_IPAS2LE1OS", .state = ARM_CP_STATE_AA64,
1212b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 4,
12134278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NOP | ARM_CP_ADD_TLBI_NXS },
1214b0f7cd35SPeter Maydell { .name = "TLBI_RIPAS2LE1OS", .state = ARM_CP_STATE_AA64,
1215b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 7,
12164278186aSPeter Maydell .access = PL2_W, .type = ARM_CP_NOP | ARM_CP_ADD_TLBI_NXS },
1217b0f7cd35SPeter Maydell { .name = "TLBI_ALLE3OS", .state = ARM_CP_STATE_AA64,
1218b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 0,
12194278186aSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1220b0f7cd35SPeter Maydell .writefn = tlbi_aa64_alle3is_write },
1221b0f7cd35SPeter Maydell { .name = "TLBI_VAE3OS", .state = ARM_CP_STATE_AA64,
1222b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 1,
12234278186aSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1224b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae3is_write },
1225b0f7cd35SPeter Maydell { .name = "TLBI_VALE3OS", .state = ARM_CP_STATE_AA64,
1226b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 5,
12274278186aSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
1228b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae3is_write },
1229b0f7cd35SPeter Maydell };
12300b7aefb9SPeter Maydell
tlbi_aa64_paall_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)12310b7aefb9SPeter Maydell static void tlbi_aa64_paall_write(CPUARMState *env, const ARMCPRegInfo *ri,
12320b7aefb9SPeter Maydell uint64_t value)
12330b7aefb9SPeter Maydell {
12340b7aefb9SPeter Maydell CPUState *cs = env_cpu(env);
12350b7aefb9SPeter Maydell
12360b7aefb9SPeter Maydell tlb_flush(cs);
12370b7aefb9SPeter Maydell }
12380b7aefb9SPeter Maydell
tlbi_aa64_paallos_write(CPUARMState * env,const ARMCPRegInfo * ri,uint64_t value)12390b7aefb9SPeter Maydell static void tlbi_aa64_paallos_write(CPUARMState *env, const ARMCPRegInfo *ri,
12400b7aefb9SPeter Maydell uint64_t value)
12410b7aefb9SPeter Maydell {
12420b7aefb9SPeter Maydell CPUState *cs = env_cpu(env);
12430b7aefb9SPeter Maydell
12440b7aefb9SPeter Maydell tlb_flush_all_cpus_synced(cs);
12450b7aefb9SPeter Maydell }
12460b7aefb9SPeter Maydell
12470b7aefb9SPeter Maydell static const ARMCPRegInfo tlbi_rme_reginfo[] = {
12480b7aefb9SPeter Maydell { .name = "TLBI_PAALL", .state = ARM_CP_STATE_AA64,
12490b7aefb9SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 4,
12500b7aefb9SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW,
12510b7aefb9SPeter Maydell .writefn = tlbi_aa64_paall_write },
12520b7aefb9SPeter Maydell { .name = "TLBI_PAALLOS", .state = ARM_CP_STATE_AA64,
12530b7aefb9SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 4,
12540b7aefb9SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW,
12550b7aefb9SPeter Maydell .writefn = tlbi_aa64_paallos_write },
12560b7aefb9SPeter Maydell /*
12570b7aefb9SPeter Maydell * QEMU does not have a way to invalidate by physical address, thus
12580b7aefb9SPeter Maydell * invalidating a range of physical addresses is accomplished by
12590b7aefb9SPeter Maydell * flushing all tlb entries in the outer shareable domain,
12600b7aefb9SPeter Maydell * just like PAALLOS.
12610b7aefb9SPeter Maydell */
12620b7aefb9SPeter Maydell { .name = "TLBI_RPALOS", .state = ARM_CP_STATE_AA64,
12630b7aefb9SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 4, .opc2 = 7,
12640b7aefb9SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW,
12650b7aefb9SPeter Maydell .writefn = tlbi_aa64_paallos_write },
12660b7aefb9SPeter Maydell { .name = "TLBI_RPAOS", .state = ARM_CP_STATE_AA64,
12670b7aefb9SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 4, .opc2 = 3,
12680b7aefb9SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW,
12690b7aefb9SPeter Maydell .writefn = tlbi_aa64_paallos_write },
12700b7aefb9SPeter Maydell };
12710b7aefb9SPeter Maydell
127265593799SPeter Maydell #endif
127365593799SPeter Maydell
define_tlb_insn_regs(ARMCPU * cpu)12741e32ee23SPeter Maydell void define_tlb_insn_regs(ARMCPU *cpu)
12751e32ee23SPeter Maydell {
12761e32ee23SPeter Maydell CPUARMState *env = &cpu->env;
12771e32ee23SPeter Maydell
12781e32ee23SPeter Maydell if (!arm_feature(env, ARM_FEATURE_V7)) {
12791e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_not_v7_cp_reginfo);
12801e32ee23SPeter Maydell } else {
12811e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v7_cp_reginfo);
12821e32ee23SPeter Maydell }
12831e32ee23SPeter Maydell if (arm_feature(env, ARM_FEATURE_V7MP) &&
12841e32ee23SPeter Maydell !arm_feature(env, ARM_FEATURE_PMSA)) {
12851e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v7mp_cp_reginfo);
12861e32ee23SPeter Maydell }
12871e32ee23SPeter Maydell if (arm_feature(env, ARM_FEATURE_V8)) {
12881e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v8_cp_reginfo);
12891e32ee23SPeter Maydell }
1290d6b6da1fSPeter Maydell /*
1291d6b6da1fSPeter Maydell * We retain the existing logic for when to register these TLBI
1292d6b6da1fSPeter Maydell * ops (i.e. matching the condition for el2_cp_reginfo[] in
1293d6b6da1fSPeter Maydell * helper.c), but we will be able to simplify this later.
1294d6b6da1fSPeter Maydell */
129548e652c4SPeter Maydell if (arm_feature(env, ARM_FEATURE_EL2)) {
1296d6b6da1fSPeter Maydell define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo);
1297d6b6da1fSPeter Maydell }
12985991e5abSPeter Maydell if (arm_feature(env, ARM_FEATURE_EL3)) {
12995991e5abSPeter Maydell define_arm_cp_regs(cpu, tlbi_el3_cp_reginfo);
13005991e5abSPeter Maydell }
130165593799SPeter Maydell #ifdef TARGET_AARCH64
130265593799SPeter Maydell if (cpu_isar_feature(aa64_tlbirange, cpu)) {
130365593799SPeter Maydell define_arm_cp_regs(cpu, tlbirange_reginfo);
130465593799SPeter Maydell }
1305b0f7cd35SPeter Maydell if (cpu_isar_feature(aa64_tlbios, cpu)) {
1306b0f7cd35SPeter Maydell define_arm_cp_regs(cpu, tlbios_reginfo);
1307b0f7cd35SPeter Maydell }
13080b7aefb9SPeter Maydell if (cpu_isar_feature(aa64_rme, cpu)) {
13090b7aefb9SPeter Maydell define_arm_cp_regs(cpu, tlbi_rme_reginfo);
13100b7aefb9SPeter Maydell }
131165593799SPeter Maydell #endif
13121e32ee23SPeter Maydell }
1313