11e32ee23SPeter Maydell /* 21e32ee23SPeter Maydell * Helpers for TLBI insns 31e32ee23SPeter Maydell * 41e32ee23SPeter Maydell * This code is licensed under the GNU GPL v2 or later. 51e32ee23SPeter Maydell * 61e32ee23SPeter Maydell * SPDX-License-Identifier: GPL-2.0-or-later 71e32ee23SPeter Maydell */ 81e32ee23SPeter Maydell #include "qemu/osdep.h" 965593799SPeter Maydell #include "qemu/log.h" 101e32ee23SPeter Maydell #include "exec/exec-all.h" 111e32ee23SPeter Maydell #include "cpu.h" 121e32ee23SPeter Maydell #include "internals.h" 131e32ee23SPeter Maydell #include "cpu-features.h" 141e32ee23SPeter Maydell #include "cpregs.h" 151e32ee23SPeter Maydell 1627fb860fSPeter Maydell /* Check for traps from EL1 due to HCR_EL2.TTLB. */ 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. */ 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. */ 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 */ 511e32ee23SPeter Maydell static void tlbiall_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 521e32ee23SPeter Maydell uint64_t value) 531e32ee23SPeter Maydell { 541e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 551e32ee23SPeter Maydell 561e32ee23SPeter Maydell tlb_flush_all_cpus_synced(cs); 571e32ee23SPeter Maydell } 581e32ee23SPeter Maydell 591e32ee23SPeter Maydell static void tlbiasid_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 601e32ee23SPeter Maydell uint64_t value) 611e32ee23SPeter Maydell { 621e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 631e32ee23SPeter Maydell 641e32ee23SPeter Maydell tlb_flush_all_cpus_synced(cs); 651e32ee23SPeter Maydell } 661e32ee23SPeter Maydell 671e32ee23SPeter Maydell static void tlbimva_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 681e32ee23SPeter Maydell uint64_t value) 691e32ee23SPeter Maydell { 701e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 711e32ee23SPeter Maydell 721e32ee23SPeter Maydell tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK); 731e32ee23SPeter Maydell } 741e32ee23SPeter Maydell 751e32ee23SPeter Maydell static void tlbimvaa_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 761e32ee23SPeter Maydell uint64_t value) 771e32ee23SPeter Maydell { 781e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 791e32ee23SPeter Maydell 801e32ee23SPeter Maydell tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK); 811e32ee23SPeter Maydell } 821e32ee23SPeter Maydell 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 */ 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 931e32ee23SPeter Maydell static void tlbiall_write(CPUARMState *env, const ARMCPRegInfo *ri, 941e32ee23SPeter Maydell uint64_t value) 951e32ee23SPeter Maydell { 961e32ee23SPeter Maydell /* Invalidate all (TLBIALL) */ 971e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 981e32ee23SPeter Maydell 991e32ee23SPeter Maydell if (tlb_force_broadcast(env)) { 1001e32ee23SPeter Maydell tlb_flush_all_cpus_synced(cs); 1011e32ee23SPeter Maydell } else { 1021e32ee23SPeter Maydell tlb_flush(cs); 1031e32ee23SPeter Maydell } 1041e32ee23SPeter Maydell } 1051e32ee23SPeter Maydell 1061e32ee23SPeter Maydell static void tlbimva_write(CPUARMState *env, const ARMCPRegInfo *ri, 1071e32ee23SPeter Maydell uint64_t value) 1081e32ee23SPeter Maydell { 1091e32ee23SPeter Maydell /* Invalidate single TLB entry by MVA and ASID (TLBIMVA) */ 1101e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 1111e32ee23SPeter Maydell 1121e32ee23SPeter Maydell value &= TARGET_PAGE_MASK; 1131e32ee23SPeter Maydell if (tlb_force_broadcast(env)) { 1141e32ee23SPeter Maydell tlb_flush_page_all_cpus_synced(cs, value); 1151e32ee23SPeter Maydell } else { 1161e32ee23SPeter Maydell tlb_flush_page(cs, value); 1171e32ee23SPeter Maydell } 1181e32ee23SPeter Maydell } 1191e32ee23SPeter Maydell 1201e32ee23SPeter Maydell static void tlbiasid_write(CPUARMState *env, const ARMCPRegInfo *ri, 1211e32ee23SPeter Maydell uint64_t value) 1221e32ee23SPeter Maydell { 1231e32ee23SPeter Maydell /* Invalidate by ASID (TLBIASID) */ 1241e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 1251e32ee23SPeter Maydell 1261e32ee23SPeter Maydell if (tlb_force_broadcast(env)) { 1271e32ee23SPeter Maydell tlb_flush_all_cpus_synced(cs); 1281e32ee23SPeter Maydell } else { 1291e32ee23SPeter Maydell tlb_flush(cs); 1301e32ee23SPeter Maydell } 1311e32ee23SPeter Maydell } 1321e32ee23SPeter Maydell 1331e32ee23SPeter Maydell static void tlbimvaa_write(CPUARMState *env, const ARMCPRegInfo *ri, 1341e32ee23SPeter Maydell uint64_t value) 1351e32ee23SPeter Maydell { 1361e32ee23SPeter Maydell /* Invalidate single entry by MVA, all ASIDs (TLBIMVAA) */ 1371e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 1381e32ee23SPeter Maydell 1391e32ee23SPeter Maydell value &= TARGET_PAGE_MASK; 1401e32ee23SPeter Maydell if (tlb_force_broadcast(env)) { 1411e32ee23SPeter Maydell tlb_flush_page_all_cpus_synced(cs, value); 1421e32ee23SPeter Maydell } else { 1431e32ee23SPeter Maydell tlb_flush_page(cs, value); 1441e32ee23SPeter Maydell } 1451e32ee23SPeter Maydell } 1461e32ee23SPeter Maydell 147d6b6da1fSPeter Maydell static void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri, 148d6b6da1fSPeter Maydell uint64_t value) 149d6b6da1fSPeter Maydell { 150d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 151d6b6da1fSPeter Maydell uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12); 152d6b6da1fSPeter Maydell 153d6b6da1fSPeter Maydell tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E2); 154d6b6da1fSPeter Maydell } 155d6b6da1fSPeter Maydell 156d6b6da1fSPeter Maydell static void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 157d6b6da1fSPeter Maydell uint64_t value) 158d6b6da1fSPeter Maydell { 159d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 160d6b6da1fSPeter Maydell uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12); 161d6b6da1fSPeter Maydell 162d6b6da1fSPeter Maydell tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, 163d6b6da1fSPeter Maydell ARMMMUIdxBit_E2); 164d6b6da1fSPeter Maydell } 165d6b6da1fSPeter Maydell 1661e32ee23SPeter Maydell static void tlbiipas2_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri, 1671e32ee23SPeter Maydell uint64_t value) 1681e32ee23SPeter Maydell { 1691e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 1701e32ee23SPeter Maydell uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12; 1711e32ee23SPeter Maydell 1721e32ee23SPeter Maydell tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_Stage2); 1731e32ee23SPeter Maydell } 1741e32ee23SPeter Maydell 1751e32ee23SPeter Maydell static void tlbiipas2is_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri, 1761e32ee23SPeter Maydell uint64_t value) 1771e32ee23SPeter Maydell { 1781e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 1791e32ee23SPeter Maydell uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12; 1801e32ee23SPeter Maydell 1811e32ee23SPeter Maydell tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, ARMMMUIdxBit_Stage2); 1821e32ee23SPeter Maydell } 1831e32ee23SPeter Maydell 184d6b6da1fSPeter Maydell static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri, 185d6b6da1fSPeter Maydell uint64_t value) 186d6b6da1fSPeter Maydell { 187d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 188d6b6da1fSPeter Maydell 189d6b6da1fSPeter Maydell tlb_flush_by_mmuidx(cs, alle1_tlbmask(env)); 190d6b6da1fSPeter Maydell } 191d6b6da1fSPeter Maydell 192d6b6da1fSPeter Maydell static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 193d6b6da1fSPeter Maydell uint64_t value) 194d6b6da1fSPeter Maydell { 195d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 196d6b6da1fSPeter Maydell 197d6b6da1fSPeter Maydell tlb_flush_by_mmuidx_all_cpus_synced(cs, alle1_tlbmask(env)); 198d6b6da1fSPeter Maydell } 199d6b6da1fSPeter Maydell 200d6b6da1fSPeter Maydell 201d6b6da1fSPeter Maydell static void tlbiall_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri, 202d6b6da1fSPeter Maydell uint64_t value) 203d6b6da1fSPeter Maydell { 204d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 205d6b6da1fSPeter Maydell 206d6b6da1fSPeter Maydell tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E2); 207d6b6da1fSPeter Maydell } 208d6b6da1fSPeter Maydell 209d6b6da1fSPeter Maydell static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 210d6b6da1fSPeter Maydell uint64_t value) 211d6b6da1fSPeter Maydell { 212d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 213d6b6da1fSPeter Maydell 214d6b6da1fSPeter Maydell tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E2); 215d6b6da1fSPeter Maydell } 216d6b6da1fSPeter Maydell 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 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 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. */ 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 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 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 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 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 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 334abbb8264SPeter Maydell static void tlbi_aa64_alle1_write(CPUARMState *env, const ARMCPRegInfo *ri, 335abbb8264SPeter Maydell uint64_t value) 336abbb8264SPeter Maydell { 337abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 338abbb8264SPeter Maydell int mask = alle1_tlbmask(env); 339abbb8264SPeter Maydell 340abbb8264SPeter Maydell tlb_flush_by_mmuidx(cs, mask); 341abbb8264SPeter Maydell } 342abbb8264SPeter Maydell 3437cadf113SPeter Maydell static void tlbi_aa64_alle2_write(CPUARMState *env, const ARMCPRegInfo *ri, 3447cadf113SPeter Maydell uint64_t value) 3457cadf113SPeter Maydell { 3467cadf113SPeter Maydell CPUState *cs = env_cpu(env); 3477cadf113SPeter Maydell int mask = e2_tlbmask(env); 3487cadf113SPeter Maydell 3497cadf113SPeter Maydell tlb_flush_by_mmuidx(cs, mask); 3507cadf113SPeter Maydell } 3517cadf113SPeter Maydell 3525991e5abSPeter Maydell static void tlbi_aa64_alle3_write(CPUARMState *env, const ARMCPRegInfo *ri, 3535991e5abSPeter Maydell uint64_t value) 3545991e5abSPeter Maydell { 3555991e5abSPeter Maydell ARMCPU *cpu = env_archcpu(env); 3565991e5abSPeter Maydell CPUState *cs = CPU(cpu); 3575991e5abSPeter Maydell 3585991e5abSPeter Maydell tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E3); 3595991e5abSPeter Maydell } 3605991e5abSPeter Maydell 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 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 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 3877cadf113SPeter Maydell static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri, 3887cadf113SPeter Maydell uint64_t value) 3897cadf113SPeter Maydell { 3907cadf113SPeter Maydell /* 3917cadf113SPeter Maydell * Invalidate by VA, EL2 3927cadf113SPeter Maydell * Currently handles both VAE2 and VALE2, since we don't support 3937cadf113SPeter Maydell * flush-last-level-only. 3947cadf113SPeter Maydell */ 3957cadf113SPeter Maydell CPUState *cs = env_cpu(env); 3967cadf113SPeter Maydell int mask = vae2_tlbmask(env); 3977cadf113SPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 3987cadf113SPeter Maydell int bits = vae2_tlbbits(env, pageaddr); 3997cadf113SPeter Maydell 4007cadf113SPeter Maydell tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits); 4017cadf113SPeter Maydell } 4027cadf113SPeter Maydell 4035991e5abSPeter Maydell static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri, 4045991e5abSPeter Maydell uint64_t value) 4055991e5abSPeter Maydell { 4065991e5abSPeter Maydell /* 4075991e5abSPeter Maydell * Invalidate by VA, EL3 4085991e5abSPeter Maydell * Currently handles both VAE3 and VALE3, since we don't support 4095991e5abSPeter Maydell * flush-last-level-only. 4105991e5abSPeter Maydell */ 4115991e5abSPeter Maydell ARMCPU *cpu = env_archcpu(env); 4125991e5abSPeter Maydell CPUState *cs = CPU(cpu); 4135991e5abSPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 4145991e5abSPeter Maydell 4155991e5abSPeter Maydell tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E3); 4165991e5abSPeter Maydell } 4175991e5abSPeter Maydell 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 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 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 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 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 485abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri, 486abbb8264SPeter Maydell uint64_t value) 487abbb8264SPeter Maydell { 488abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 489abbb8264SPeter Maydell int mask = ipas2e1_tlbmask(env, value); 490abbb8264SPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 491abbb8264SPeter Maydell 492abbb8264SPeter Maydell if (tlb_force_broadcast(env)) { 493abbb8264SPeter Maydell tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask); 494abbb8264SPeter Maydell } else { 495abbb8264SPeter Maydell tlb_flush_page_by_mmuidx(cs, pageaddr, mask); 496abbb8264SPeter Maydell } 497abbb8264SPeter Maydell } 498abbb8264SPeter Maydell 499abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri, 500abbb8264SPeter Maydell uint64_t value) 501abbb8264SPeter Maydell { 502abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 503abbb8264SPeter Maydell int mask = ipas2e1_tlbmask(env, value); 504abbb8264SPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 505abbb8264SPeter Maydell 506abbb8264SPeter Maydell tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask); 507abbb8264SPeter Maydell } 508abbb8264SPeter Maydell 5091e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_not_v7_cp_reginfo[] = { 5101e32ee23SPeter Maydell /* 5111e32ee23SPeter Maydell * MMU TLB control. Note that the wildcarding means we cover not just 5121e32ee23SPeter Maydell * the unified TLB ops but also the dside/iside/inner-shareable variants. 5131e32ee23SPeter Maydell */ 5141e32ee23SPeter Maydell { .name = "TLBIALL", .cp = 15, .crn = 8, .crm = CP_ANY, 5151e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 0, .access = PL1_W, .writefn = tlbiall_write, 5161e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 5171e32ee23SPeter Maydell { .name = "TLBIMVA", .cp = 15, .crn = 8, .crm = CP_ANY, 5181e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 1, .access = PL1_W, .writefn = tlbimva_write, 5191e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 5201e32ee23SPeter Maydell { .name = "TLBIASID", .cp = 15, .crn = 8, .crm = CP_ANY, 5211e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 2, .access = PL1_W, .writefn = tlbiasid_write, 5221e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 5231e32ee23SPeter Maydell { .name = "TLBIMVAA", .cp = 15, .crn = 8, .crm = CP_ANY, 5241e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 3, .access = PL1_W, .writefn = tlbimvaa_write, 5251e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 5261e32ee23SPeter Maydell }; 5271e32ee23SPeter Maydell 5281e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7_cp_reginfo[] = { 5291e32ee23SPeter Maydell /* 32 bit ITLB invalidates */ 5301e32ee23SPeter Maydell { .name = "ITLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 0, 5311e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 5321e32ee23SPeter Maydell .writefn = tlbiall_write }, 5331e32ee23SPeter Maydell { .name = "ITLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1, 5341e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 5351e32ee23SPeter Maydell .writefn = tlbimva_write }, 5361e32ee23SPeter Maydell { .name = "ITLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 2, 5371e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 5381e32ee23SPeter Maydell .writefn = tlbiasid_write }, 5391e32ee23SPeter Maydell /* 32 bit DTLB invalidates */ 5401e32ee23SPeter Maydell { .name = "DTLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 0, 5411e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 5421e32ee23SPeter Maydell .writefn = tlbiall_write }, 5431e32ee23SPeter Maydell { .name = "DTLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1, 5441e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 5451e32ee23SPeter Maydell .writefn = tlbimva_write }, 5461e32ee23SPeter Maydell { .name = "DTLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 2, 5471e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 5481e32ee23SPeter Maydell .writefn = tlbiasid_write }, 5491e32ee23SPeter Maydell /* 32 bit TLB invalidates */ 5501e32ee23SPeter Maydell { .name = "TLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0, 5511e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 5521e32ee23SPeter Maydell .writefn = tlbiall_write }, 5531e32ee23SPeter Maydell { .name = "TLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1, 5541e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 5551e32ee23SPeter Maydell .writefn = tlbimva_write }, 5561e32ee23SPeter Maydell { .name = "TLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2, 5571e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 5581e32ee23SPeter Maydell .writefn = tlbiasid_write }, 5591e32ee23SPeter Maydell { .name = "TLBIMVAA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3, 5601e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 5611e32ee23SPeter Maydell .writefn = tlbimvaa_write }, 5621e32ee23SPeter Maydell }; 5631e32ee23SPeter Maydell 5641e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7mp_cp_reginfo[] = { 5651e32ee23SPeter Maydell /* 32 bit TLB invalidates, Inner Shareable */ 5661e32ee23SPeter Maydell { .name = "TLBIALLIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0, 5671e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 5681e32ee23SPeter Maydell .writefn = tlbiall_is_write }, 5691e32ee23SPeter Maydell { .name = "TLBIMVAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1, 5701e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 5711e32ee23SPeter Maydell .writefn = tlbimva_is_write }, 5721e32ee23SPeter Maydell { .name = "TLBIASIDIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2, 5731e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 5741e32ee23SPeter Maydell .writefn = tlbiasid_is_write }, 5751e32ee23SPeter Maydell { .name = "TLBIMVAAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3, 5761e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 5771e32ee23SPeter Maydell .writefn = tlbimvaa_is_write }, 5781e32ee23SPeter Maydell }; 5791e32ee23SPeter Maydell 5801e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v8_cp_reginfo[] = { 5811e32ee23SPeter Maydell /* AArch32 TLB invalidate last level of translation table walk */ 5821e32ee23SPeter Maydell { .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5, 5831e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 5841e32ee23SPeter Maydell .writefn = tlbimva_is_write }, 5851e32ee23SPeter Maydell { .name = "TLBIMVAALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7, 5861e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 5871e32ee23SPeter Maydell .writefn = tlbimvaa_is_write }, 5881e32ee23SPeter Maydell { .name = "TLBIMVAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5, 5891e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 5901e32ee23SPeter Maydell .writefn = tlbimva_write }, 5911e32ee23SPeter Maydell { .name = "TLBIMVAAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7, 5921e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 5931e32ee23SPeter Maydell .writefn = tlbimvaa_write }, 5941e32ee23SPeter Maydell { .name = "TLBIMVALH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5, 5951e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 5961e32ee23SPeter Maydell .writefn = tlbimva_hyp_write }, 5971e32ee23SPeter Maydell { .name = "TLBIMVALHIS", 5981e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5, 5991e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 6001e32ee23SPeter Maydell .writefn = tlbimva_hyp_is_write }, 6011e32ee23SPeter Maydell { .name = "TLBIIPAS2", 6021e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1, 6031e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 6041e32ee23SPeter Maydell .writefn = tlbiipas2_hyp_write }, 6051e32ee23SPeter Maydell { .name = "TLBIIPAS2IS", 6061e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1, 6071e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 6081e32ee23SPeter Maydell .writefn = tlbiipas2is_hyp_write }, 6091e32ee23SPeter Maydell { .name = "TLBIIPAS2L", 6101e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5, 6111e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 6121e32ee23SPeter Maydell .writefn = tlbiipas2_hyp_write }, 6131e32ee23SPeter Maydell { .name = "TLBIIPAS2LIS", 6141e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5, 6151e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 6161e32ee23SPeter Maydell .writefn = tlbiipas2is_hyp_write }, 617abbb8264SPeter Maydell /* AArch64 TLBI operations */ 618abbb8264SPeter Maydell { .name = "TLBI_VMALLE1IS", .state = ARM_CP_STATE_AA64, 619abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0, 620abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 621abbb8264SPeter Maydell .fgt = FGT_TLBIVMALLE1IS, 622abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1is_write }, 623abbb8264SPeter Maydell { .name = "TLBI_VAE1IS", .state = ARM_CP_STATE_AA64, 624abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1, 625abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 626abbb8264SPeter Maydell .fgt = FGT_TLBIVAE1IS, 627abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 628abbb8264SPeter Maydell { .name = "TLBI_ASIDE1IS", .state = ARM_CP_STATE_AA64, 629abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2, 630abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 631abbb8264SPeter Maydell .fgt = FGT_TLBIASIDE1IS, 632abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1is_write }, 633abbb8264SPeter Maydell { .name = "TLBI_VAAE1IS", .state = ARM_CP_STATE_AA64, 634abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3, 635abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 636abbb8264SPeter Maydell .fgt = FGT_TLBIVAAE1IS, 637abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 638abbb8264SPeter Maydell { .name = "TLBI_VALE1IS", .state = ARM_CP_STATE_AA64, 639abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5, 640abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 641abbb8264SPeter Maydell .fgt = FGT_TLBIVALE1IS, 642abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 643abbb8264SPeter Maydell { .name = "TLBI_VAALE1IS", .state = ARM_CP_STATE_AA64, 644abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7, 645abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 646abbb8264SPeter Maydell .fgt = FGT_TLBIVAALE1IS, 647abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 648abbb8264SPeter Maydell { .name = "TLBI_VMALLE1", .state = ARM_CP_STATE_AA64, 649abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0, 650abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 651abbb8264SPeter Maydell .fgt = FGT_TLBIVMALLE1, 652abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1_write }, 653abbb8264SPeter Maydell { .name = "TLBI_VAE1", .state = ARM_CP_STATE_AA64, 654abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1, 655abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 656abbb8264SPeter Maydell .fgt = FGT_TLBIVAE1, 657abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 658abbb8264SPeter Maydell { .name = "TLBI_ASIDE1", .state = ARM_CP_STATE_AA64, 659abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2, 660abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 661abbb8264SPeter Maydell .fgt = FGT_TLBIASIDE1, 662abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1_write }, 663abbb8264SPeter Maydell { .name = "TLBI_VAAE1", .state = ARM_CP_STATE_AA64, 664abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3, 665abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 666abbb8264SPeter Maydell .fgt = FGT_TLBIVAAE1, 667abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 668abbb8264SPeter Maydell { .name = "TLBI_VALE1", .state = ARM_CP_STATE_AA64, 669abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5, 670abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 671abbb8264SPeter Maydell .fgt = FGT_TLBIVALE1, 672abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 673abbb8264SPeter Maydell { .name = "TLBI_VAALE1", .state = ARM_CP_STATE_AA64, 674abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7, 675abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 676abbb8264SPeter Maydell .fgt = FGT_TLBIVAALE1, 677abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 678abbb8264SPeter Maydell { .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64, 679abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1, 680abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 681abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1is_write }, 682abbb8264SPeter Maydell { .name = "TLBI_IPAS2LE1IS", .state = ARM_CP_STATE_AA64, 683abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5, 684abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 685abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1is_write }, 686abbb8264SPeter Maydell { .name = "TLBI_ALLE1IS", .state = ARM_CP_STATE_AA64, 687abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4, 688abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 689abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1is_write }, 690abbb8264SPeter Maydell { .name = "TLBI_VMALLS12E1IS", .state = ARM_CP_STATE_AA64, 691abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 6, 692abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 693abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1is_write }, 694abbb8264SPeter Maydell { .name = "TLBI_IPAS2E1", .state = ARM_CP_STATE_AA64, 695abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1, 696abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 697abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1_write }, 698abbb8264SPeter Maydell { .name = "TLBI_IPAS2LE1", .state = ARM_CP_STATE_AA64, 699abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5, 700abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 701abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1_write }, 702abbb8264SPeter Maydell { .name = "TLBI_ALLE1", .state = ARM_CP_STATE_AA64, 703abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4, 704abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 705abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1_write }, 706abbb8264SPeter Maydell { .name = "TLBI_VMALLS12E1", .state = ARM_CP_STATE_AA64, 707abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 6, 708abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 709abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1is_write }, 7101e32ee23SPeter Maydell }; 7111e32ee23SPeter Maydell 712d6b6da1fSPeter Maydell static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = { 713d6b6da1fSPeter Maydell { .name = "TLBIALLNSNH", 714d6b6da1fSPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4, 715d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 716d6b6da1fSPeter Maydell .writefn = tlbiall_nsnh_write }, 717d6b6da1fSPeter Maydell { .name = "TLBIALLNSNHIS", 718d6b6da1fSPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4, 719d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 720d6b6da1fSPeter Maydell .writefn = tlbiall_nsnh_is_write }, 721d6b6da1fSPeter Maydell { .name = "TLBIALLH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0, 722d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 723d6b6da1fSPeter Maydell .writefn = tlbiall_hyp_write }, 724d6b6da1fSPeter Maydell { .name = "TLBIALLHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0, 725d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 726d6b6da1fSPeter Maydell .writefn = tlbiall_hyp_is_write }, 727d6b6da1fSPeter Maydell { .name = "TLBIMVAH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1, 728d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 729d6b6da1fSPeter Maydell .writefn = tlbimva_hyp_write }, 730d6b6da1fSPeter Maydell { .name = "TLBIMVAHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1, 731d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 732d6b6da1fSPeter Maydell .writefn = tlbimva_hyp_is_write }, 7337cadf113SPeter Maydell { .name = "TLBI_ALLE2", .state = ARM_CP_STATE_AA64, 7347cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0, 7357cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 7367cadf113SPeter Maydell .writefn = tlbi_aa64_alle2_write }, 7377cadf113SPeter Maydell { .name = "TLBI_VAE2", .state = ARM_CP_STATE_AA64, 7387cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1, 7397cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 7407cadf113SPeter Maydell .writefn = tlbi_aa64_vae2_write }, 7417cadf113SPeter Maydell { .name = "TLBI_VALE2", .state = ARM_CP_STATE_AA64, 7427cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5, 7437cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 7447cadf113SPeter Maydell .writefn = tlbi_aa64_vae2_write }, 7457cadf113SPeter Maydell { .name = "TLBI_ALLE2IS", .state = ARM_CP_STATE_AA64, 7467cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0, 7477cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 7487cadf113SPeter Maydell .writefn = tlbi_aa64_alle2is_write }, 7497cadf113SPeter Maydell { .name = "TLBI_VAE2IS", .state = ARM_CP_STATE_AA64, 7507cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1, 7517cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 7527cadf113SPeter Maydell .writefn = tlbi_aa64_vae2is_write }, 7537cadf113SPeter Maydell { .name = "TLBI_VALE2IS", .state = ARM_CP_STATE_AA64, 7547cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5, 7557cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 7567cadf113SPeter Maydell .writefn = tlbi_aa64_vae2is_write }, 757d6b6da1fSPeter Maydell }; 758d6b6da1fSPeter Maydell 7595991e5abSPeter Maydell static const ARMCPRegInfo tlbi_el3_cp_reginfo[] = { 7605991e5abSPeter Maydell { .name = "TLBI_ALLE3IS", .state = ARM_CP_STATE_AA64, 7615991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 0, 7625991e5abSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 7635991e5abSPeter Maydell .writefn = tlbi_aa64_alle3is_write }, 7645991e5abSPeter Maydell { .name = "TLBI_VAE3IS", .state = ARM_CP_STATE_AA64, 7655991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 1, 7665991e5abSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 7675991e5abSPeter Maydell .writefn = tlbi_aa64_vae3is_write }, 7685991e5abSPeter Maydell { .name = "TLBI_VALE3IS", .state = ARM_CP_STATE_AA64, 7695991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 5, 7705991e5abSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 7715991e5abSPeter Maydell .writefn = tlbi_aa64_vae3is_write }, 7725991e5abSPeter Maydell { .name = "TLBI_ALLE3", .state = ARM_CP_STATE_AA64, 7735991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 0, 7745991e5abSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 7755991e5abSPeter Maydell .writefn = tlbi_aa64_alle3_write }, 7765991e5abSPeter Maydell { .name = "TLBI_VAE3", .state = ARM_CP_STATE_AA64, 7775991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 1, 7785991e5abSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 7795991e5abSPeter Maydell .writefn = tlbi_aa64_vae3_write }, 7805991e5abSPeter Maydell { .name = "TLBI_VALE3", .state = ARM_CP_STATE_AA64, 7815991e5abSPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 5, 7825991e5abSPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 7835991e5abSPeter Maydell .writefn = tlbi_aa64_vae3_write }, 7845991e5abSPeter Maydell }; 7855991e5abSPeter Maydell 78665593799SPeter Maydell #ifdef TARGET_AARCH64 78765593799SPeter Maydell typedef struct { 78865593799SPeter Maydell uint64_t base; 78965593799SPeter Maydell uint64_t length; 79065593799SPeter Maydell } TLBIRange; 79165593799SPeter Maydell 79265593799SPeter Maydell static ARMGranuleSize tlbi_range_tg_to_gran_size(int tg) 79365593799SPeter Maydell { 79465593799SPeter Maydell /* 79565593799SPeter Maydell * Note that the TLBI range TG field encoding differs from both 79665593799SPeter Maydell * TG0 and TG1 encodings. 79765593799SPeter Maydell */ 79865593799SPeter Maydell switch (tg) { 79965593799SPeter Maydell case 1: 80065593799SPeter Maydell return Gran4K; 80165593799SPeter Maydell case 2: 80265593799SPeter Maydell return Gran16K; 80365593799SPeter Maydell case 3: 80465593799SPeter Maydell return Gran64K; 80565593799SPeter Maydell default: 80665593799SPeter Maydell return GranInvalid; 80765593799SPeter Maydell } 80865593799SPeter Maydell } 80965593799SPeter Maydell 81065593799SPeter Maydell static TLBIRange tlbi_aa64_get_range(CPUARMState *env, ARMMMUIdx mmuidx, 81165593799SPeter Maydell uint64_t value) 81265593799SPeter Maydell { 81365593799SPeter Maydell unsigned int page_size_granule, page_shift, num, scale, exponent; 81465593799SPeter Maydell /* Extract one bit to represent the va selector in use. */ 81565593799SPeter Maydell uint64_t select = sextract64(value, 36, 1); 81665593799SPeter Maydell ARMVAParameters param = aa64_va_parameters(env, select, mmuidx, true, false); 81765593799SPeter Maydell TLBIRange ret = { }; 81865593799SPeter Maydell ARMGranuleSize gran; 81965593799SPeter Maydell 82065593799SPeter Maydell page_size_granule = extract64(value, 46, 2); 82165593799SPeter Maydell gran = tlbi_range_tg_to_gran_size(page_size_granule); 82265593799SPeter Maydell 82365593799SPeter Maydell /* The granule encoded in value must match the granule in use. */ 82465593799SPeter Maydell if (gran != param.gran) { 82565593799SPeter Maydell qemu_log_mask(LOG_GUEST_ERROR, "Invalid tlbi page size granule %d\n", 82665593799SPeter Maydell page_size_granule); 82765593799SPeter Maydell return ret; 82865593799SPeter Maydell } 82965593799SPeter Maydell 83065593799SPeter Maydell page_shift = arm_granule_bits(gran); 83165593799SPeter Maydell num = extract64(value, 39, 5); 83265593799SPeter Maydell scale = extract64(value, 44, 2); 83365593799SPeter Maydell exponent = (5 * scale) + 1; 83465593799SPeter Maydell 83565593799SPeter Maydell ret.length = (num + 1) << (exponent + page_shift); 83665593799SPeter Maydell 83765593799SPeter Maydell if (param.select) { 83865593799SPeter Maydell ret.base = sextract64(value, 0, 37); 83965593799SPeter Maydell } else { 84065593799SPeter Maydell ret.base = extract64(value, 0, 37); 84165593799SPeter Maydell } 84265593799SPeter Maydell if (param.ds) { 84365593799SPeter Maydell /* 84465593799SPeter Maydell * With DS=1, BaseADDR is always shifted 16 so that it is able 84565593799SPeter Maydell * to address all 52 va bits. The input address is perforce 84665593799SPeter Maydell * aligned on a 64k boundary regardless of translation granule. 84765593799SPeter Maydell */ 84865593799SPeter Maydell page_shift = 16; 84965593799SPeter Maydell } 85065593799SPeter Maydell ret.base <<= page_shift; 85165593799SPeter Maydell 85265593799SPeter Maydell return ret; 85365593799SPeter Maydell } 85465593799SPeter Maydell 85565593799SPeter Maydell static void do_rvae_write(CPUARMState *env, uint64_t value, 85665593799SPeter Maydell int idxmap, bool synced) 85765593799SPeter Maydell { 85865593799SPeter Maydell ARMMMUIdx one_idx = ARM_MMU_IDX_A | ctz32(idxmap); 85965593799SPeter Maydell TLBIRange range; 86065593799SPeter Maydell int bits; 86165593799SPeter Maydell 86265593799SPeter Maydell range = tlbi_aa64_get_range(env, one_idx, value); 86365593799SPeter Maydell bits = tlbbits_for_regime(env, one_idx, range.base); 86465593799SPeter Maydell 86565593799SPeter Maydell if (synced) { 86665593799SPeter Maydell tlb_flush_range_by_mmuidx_all_cpus_synced(env_cpu(env), 86765593799SPeter Maydell range.base, 86865593799SPeter Maydell range.length, 86965593799SPeter Maydell idxmap, 87065593799SPeter Maydell bits); 87165593799SPeter Maydell } else { 87265593799SPeter Maydell tlb_flush_range_by_mmuidx(env_cpu(env), range.base, 87365593799SPeter Maydell range.length, idxmap, bits); 87465593799SPeter Maydell } 87565593799SPeter Maydell } 87665593799SPeter Maydell 87765593799SPeter Maydell static void tlbi_aa64_rvae1_write(CPUARMState *env, 87865593799SPeter Maydell const ARMCPRegInfo *ri, 87965593799SPeter Maydell uint64_t value) 88065593799SPeter Maydell { 88165593799SPeter Maydell /* 88265593799SPeter Maydell * Invalidate by VA range, EL1&0. 88365593799SPeter Maydell * Currently handles all of RVAE1, RVAAE1, RVAALE1 and RVALE1, 88465593799SPeter Maydell * since we don't support flush-for-specific-ASID-only or 88565593799SPeter Maydell * flush-last-level-only. 88665593799SPeter Maydell */ 88765593799SPeter Maydell 88865593799SPeter Maydell do_rvae_write(env, value, vae1_tlbmask(env), 88965593799SPeter Maydell tlb_force_broadcast(env)); 89065593799SPeter Maydell } 89165593799SPeter Maydell 89265593799SPeter Maydell static void tlbi_aa64_rvae1is_write(CPUARMState *env, 89365593799SPeter Maydell const ARMCPRegInfo *ri, 89465593799SPeter Maydell uint64_t value) 89565593799SPeter Maydell { 89665593799SPeter Maydell /* 89765593799SPeter Maydell * Invalidate by VA range, Inner/Outer Shareable EL1&0. 89865593799SPeter Maydell * Currently handles all of RVAE1IS, RVAE1OS, RVAAE1IS, RVAAE1OS, 89965593799SPeter Maydell * RVAALE1IS, RVAALE1OS, RVALE1IS and RVALE1OS, since we don't support 90065593799SPeter Maydell * flush-for-specific-ASID-only, flush-last-level-only or inner/outer 90165593799SPeter Maydell * shareable specific flushes. 90265593799SPeter Maydell */ 90365593799SPeter Maydell 90465593799SPeter Maydell do_rvae_write(env, value, vae1_tlbmask(env), true); 90565593799SPeter Maydell } 90665593799SPeter Maydell 90765593799SPeter Maydell static void tlbi_aa64_rvae2_write(CPUARMState *env, 90865593799SPeter Maydell const ARMCPRegInfo *ri, 90965593799SPeter Maydell uint64_t value) 91065593799SPeter Maydell { 91165593799SPeter Maydell /* 91265593799SPeter Maydell * Invalidate by VA range, EL2. 91365593799SPeter Maydell * Currently handles all of RVAE2 and RVALE2, 91465593799SPeter Maydell * since we don't support flush-for-specific-ASID-only or 91565593799SPeter Maydell * flush-last-level-only. 91665593799SPeter Maydell */ 91765593799SPeter Maydell 91865593799SPeter Maydell do_rvae_write(env, value, vae2_tlbmask(env), 91965593799SPeter Maydell tlb_force_broadcast(env)); 92065593799SPeter Maydell 92165593799SPeter Maydell 92265593799SPeter Maydell } 92365593799SPeter Maydell 92465593799SPeter Maydell static void tlbi_aa64_rvae2is_write(CPUARMState *env, 92565593799SPeter Maydell const ARMCPRegInfo *ri, 92665593799SPeter Maydell uint64_t value) 92765593799SPeter Maydell { 92865593799SPeter Maydell /* 92965593799SPeter Maydell * Invalidate by VA range, Inner/Outer Shareable, EL2. 93065593799SPeter Maydell * Currently handles all of RVAE2IS, RVAE2OS, RVALE2IS and RVALE2OS, 93165593799SPeter Maydell * since we don't support flush-for-specific-ASID-only, 93265593799SPeter Maydell * flush-last-level-only or inner/outer shareable specific flushes. 93365593799SPeter Maydell */ 93465593799SPeter Maydell 93565593799SPeter Maydell do_rvae_write(env, value, vae2_tlbmask(env), true); 93665593799SPeter Maydell 93765593799SPeter Maydell } 93865593799SPeter Maydell 93965593799SPeter Maydell static void tlbi_aa64_rvae3_write(CPUARMState *env, 94065593799SPeter Maydell const ARMCPRegInfo *ri, 94165593799SPeter Maydell uint64_t value) 94265593799SPeter Maydell { 94365593799SPeter Maydell /* 94465593799SPeter Maydell * Invalidate by VA range, EL3. 94565593799SPeter Maydell * Currently handles all of RVAE3 and RVALE3, 94665593799SPeter Maydell * since we don't support flush-for-specific-ASID-only or 94765593799SPeter Maydell * flush-last-level-only. 94865593799SPeter Maydell */ 94965593799SPeter Maydell 95065593799SPeter Maydell do_rvae_write(env, value, ARMMMUIdxBit_E3, tlb_force_broadcast(env)); 95165593799SPeter Maydell } 95265593799SPeter Maydell 95365593799SPeter Maydell static void tlbi_aa64_rvae3is_write(CPUARMState *env, 95465593799SPeter Maydell const ARMCPRegInfo *ri, 95565593799SPeter Maydell uint64_t value) 95665593799SPeter Maydell { 95765593799SPeter Maydell /* 95865593799SPeter Maydell * Invalidate by VA range, EL3, Inner/Outer Shareable. 95965593799SPeter Maydell * Currently handles all of RVAE3IS, RVAE3OS, RVALE3IS and RVALE3OS, 96065593799SPeter Maydell * since we don't support flush-for-specific-ASID-only, 96165593799SPeter Maydell * flush-last-level-only or inner/outer specific flushes. 96265593799SPeter Maydell */ 96365593799SPeter Maydell 96465593799SPeter Maydell do_rvae_write(env, value, ARMMMUIdxBit_E3, true); 96565593799SPeter Maydell } 96665593799SPeter Maydell 96765593799SPeter Maydell static void tlbi_aa64_ripas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri, 96865593799SPeter Maydell uint64_t value) 96965593799SPeter Maydell { 97065593799SPeter Maydell do_rvae_write(env, value, ipas2e1_tlbmask(env, value), 97165593799SPeter Maydell tlb_force_broadcast(env)); 97265593799SPeter Maydell } 97365593799SPeter Maydell 97465593799SPeter Maydell static void tlbi_aa64_ripas2e1is_write(CPUARMState *env, 97565593799SPeter Maydell const ARMCPRegInfo *ri, 97665593799SPeter Maydell uint64_t value) 97765593799SPeter Maydell { 97865593799SPeter Maydell do_rvae_write(env, value, ipas2e1_tlbmask(env, value), true); 97965593799SPeter Maydell } 98065593799SPeter Maydell 98165593799SPeter Maydell static const ARMCPRegInfo tlbirange_reginfo[] = { 98265593799SPeter Maydell { .name = "TLBI_RVAE1IS", .state = ARM_CP_STATE_AA64, 98365593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 1, 98465593799SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 98565593799SPeter Maydell .fgt = FGT_TLBIRVAE1IS, 98665593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write }, 98765593799SPeter Maydell { .name = "TLBI_RVAAE1IS", .state = ARM_CP_STATE_AA64, 98865593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 3, 98965593799SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 99065593799SPeter Maydell .fgt = FGT_TLBIRVAAE1IS, 99165593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write }, 99265593799SPeter Maydell { .name = "TLBI_RVALE1IS", .state = ARM_CP_STATE_AA64, 99365593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 5, 99465593799SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 99565593799SPeter Maydell .fgt = FGT_TLBIRVALE1IS, 99665593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write }, 99765593799SPeter Maydell { .name = "TLBI_RVAALE1IS", .state = ARM_CP_STATE_AA64, 99865593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 7, 99965593799SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 100065593799SPeter Maydell .fgt = FGT_TLBIRVAALE1IS, 100165593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write }, 100265593799SPeter Maydell { .name = "TLBI_RVAE1OS", .state = ARM_CP_STATE_AA64, 100365593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1, 100465593799SPeter Maydell .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW, 100565593799SPeter Maydell .fgt = FGT_TLBIRVAE1OS, 100665593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write }, 100765593799SPeter Maydell { .name = "TLBI_RVAAE1OS", .state = ARM_CP_STATE_AA64, 100865593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 3, 100965593799SPeter Maydell .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW, 101065593799SPeter Maydell .fgt = FGT_TLBIRVAAE1OS, 101165593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write }, 101265593799SPeter Maydell { .name = "TLBI_RVALE1OS", .state = ARM_CP_STATE_AA64, 101365593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 5, 101465593799SPeter Maydell .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW, 101565593799SPeter Maydell .fgt = FGT_TLBIRVALE1OS, 101665593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write }, 101765593799SPeter Maydell { .name = "TLBI_RVAALE1OS", .state = ARM_CP_STATE_AA64, 101865593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 7, 101965593799SPeter Maydell .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW, 102065593799SPeter Maydell .fgt = FGT_TLBIRVAALE1OS, 102165593799SPeter Maydell .writefn = tlbi_aa64_rvae1is_write }, 102265593799SPeter Maydell { .name = "TLBI_RVAE1", .state = ARM_CP_STATE_AA64, 102365593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1, 102465593799SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 102565593799SPeter Maydell .fgt = FGT_TLBIRVAE1, 102665593799SPeter Maydell .writefn = tlbi_aa64_rvae1_write }, 102765593799SPeter Maydell { .name = "TLBI_RVAAE1", .state = ARM_CP_STATE_AA64, 102865593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 3, 102965593799SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 103065593799SPeter Maydell .fgt = FGT_TLBIRVAAE1, 103165593799SPeter Maydell .writefn = tlbi_aa64_rvae1_write }, 103265593799SPeter Maydell { .name = "TLBI_RVALE1", .state = ARM_CP_STATE_AA64, 103365593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 5, 103465593799SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 103565593799SPeter Maydell .fgt = FGT_TLBIRVALE1, 103665593799SPeter Maydell .writefn = tlbi_aa64_rvae1_write }, 103765593799SPeter Maydell { .name = "TLBI_RVAALE1", .state = ARM_CP_STATE_AA64, 103865593799SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 7, 103965593799SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 104065593799SPeter Maydell .fgt = FGT_TLBIRVAALE1, 104165593799SPeter Maydell .writefn = tlbi_aa64_rvae1_write }, 104265593799SPeter Maydell { .name = "TLBI_RIPAS2E1IS", .state = ARM_CP_STATE_AA64, 104365593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 2, 104465593799SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 104565593799SPeter Maydell .writefn = tlbi_aa64_ripas2e1is_write }, 104665593799SPeter Maydell { .name = "TLBI_RIPAS2LE1IS", .state = ARM_CP_STATE_AA64, 104765593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 6, 104865593799SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 104965593799SPeter Maydell .writefn = tlbi_aa64_ripas2e1is_write }, 105065593799SPeter Maydell { .name = "TLBI_RVAE2IS", .state = ARM_CP_STATE_AA64, 105165593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 1, 105265593799SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 105365593799SPeter Maydell .writefn = tlbi_aa64_rvae2is_write }, 105465593799SPeter Maydell { .name = "TLBI_RVALE2IS", .state = ARM_CP_STATE_AA64, 105565593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 5, 105665593799SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 105765593799SPeter Maydell .writefn = tlbi_aa64_rvae2is_write }, 105865593799SPeter Maydell { .name = "TLBI_RIPAS2E1", .state = ARM_CP_STATE_AA64, 105965593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 2, 106065593799SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 106165593799SPeter Maydell .writefn = tlbi_aa64_ripas2e1_write }, 106265593799SPeter Maydell { .name = "TLBI_RIPAS2LE1", .state = ARM_CP_STATE_AA64, 106365593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 6, 106465593799SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 106565593799SPeter Maydell .writefn = tlbi_aa64_ripas2e1_write }, 106665593799SPeter Maydell { .name = "TLBI_RVAE2OS", .state = ARM_CP_STATE_AA64, 106765593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 1, 106865593799SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 106965593799SPeter Maydell .writefn = tlbi_aa64_rvae2is_write }, 107065593799SPeter Maydell { .name = "TLBI_RVALE2OS", .state = ARM_CP_STATE_AA64, 107165593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 5, 107265593799SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 107365593799SPeter Maydell .writefn = tlbi_aa64_rvae2is_write }, 107465593799SPeter Maydell { .name = "TLBI_RVAE2", .state = ARM_CP_STATE_AA64, 107565593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 1, 107665593799SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 107765593799SPeter Maydell .writefn = tlbi_aa64_rvae2_write }, 107865593799SPeter Maydell { .name = "TLBI_RVALE2", .state = ARM_CP_STATE_AA64, 107965593799SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 5, 108065593799SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 108165593799SPeter Maydell .writefn = tlbi_aa64_rvae2_write }, 108265593799SPeter Maydell { .name = "TLBI_RVAE3IS", .state = ARM_CP_STATE_AA64, 108365593799SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 1, 108465593799SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 108565593799SPeter Maydell .writefn = tlbi_aa64_rvae3is_write }, 108665593799SPeter Maydell { .name = "TLBI_RVALE3IS", .state = ARM_CP_STATE_AA64, 108765593799SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 5, 108865593799SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 108965593799SPeter Maydell .writefn = tlbi_aa64_rvae3is_write }, 109065593799SPeter Maydell { .name = "TLBI_RVAE3OS", .state = ARM_CP_STATE_AA64, 109165593799SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 1, 109265593799SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 109365593799SPeter Maydell .writefn = tlbi_aa64_rvae3is_write }, 109465593799SPeter Maydell { .name = "TLBI_RVALE3OS", .state = ARM_CP_STATE_AA64, 109565593799SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 5, 109665593799SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 109765593799SPeter Maydell .writefn = tlbi_aa64_rvae3is_write }, 109865593799SPeter Maydell { .name = "TLBI_RVAE3", .state = ARM_CP_STATE_AA64, 109965593799SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 1, 110065593799SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 110165593799SPeter Maydell .writefn = tlbi_aa64_rvae3_write }, 110265593799SPeter Maydell { .name = "TLBI_RVALE3", .state = ARM_CP_STATE_AA64, 110365593799SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 5, 110465593799SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 110565593799SPeter Maydell .writefn = tlbi_aa64_rvae3_write }, 110665593799SPeter Maydell }; 1107b0f7cd35SPeter Maydell 1108b0f7cd35SPeter Maydell static const ARMCPRegInfo tlbios_reginfo[] = { 1109b0f7cd35SPeter Maydell { .name = "TLBI_VMALLE1OS", .state = ARM_CP_STATE_AA64, 1110b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 0, 1111b0f7cd35SPeter Maydell .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW, 1112b0f7cd35SPeter Maydell .fgt = FGT_TLBIVMALLE1OS, 1113b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vmalle1is_write }, 1114b0f7cd35SPeter Maydell { .name = "TLBI_VAE1OS", .state = ARM_CP_STATE_AA64, 1115b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 1, 1116b0f7cd35SPeter Maydell .fgt = FGT_TLBIVAE1OS, 1117b0f7cd35SPeter Maydell .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW, 1118b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 1119b0f7cd35SPeter Maydell { .name = "TLBI_ASIDE1OS", .state = ARM_CP_STATE_AA64, 1120b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 2, 1121b0f7cd35SPeter Maydell .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW, 1122b0f7cd35SPeter Maydell .fgt = FGT_TLBIASIDE1OS, 1123b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vmalle1is_write }, 1124b0f7cd35SPeter Maydell { .name = "TLBI_VAAE1OS", .state = ARM_CP_STATE_AA64, 1125b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 3, 1126b0f7cd35SPeter Maydell .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW, 1127b0f7cd35SPeter Maydell .fgt = FGT_TLBIVAAE1OS, 1128b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 1129b0f7cd35SPeter Maydell { .name = "TLBI_VALE1OS", .state = ARM_CP_STATE_AA64, 1130b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 5, 1131b0f7cd35SPeter Maydell .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW, 1132b0f7cd35SPeter Maydell .fgt = FGT_TLBIVALE1OS, 1133b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 1134b0f7cd35SPeter Maydell { .name = "TLBI_VAALE1OS", .state = ARM_CP_STATE_AA64, 1135b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 7, 1136b0f7cd35SPeter Maydell .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW, 1137b0f7cd35SPeter Maydell .fgt = FGT_TLBIVAALE1OS, 1138b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 1139b0f7cd35SPeter Maydell { .name = "TLBI_ALLE2OS", .state = ARM_CP_STATE_AA64, 1140b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 0, 1141b0f7cd35SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 1142b0f7cd35SPeter Maydell .writefn = tlbi_aa64_alle2is_write }, 1143b0f7cd35SPeter Maydell { .name = "TLBI_VAE2OS", .state = ARM_CP_STATE_AA64, 1144b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 1, 1145b0f7cd35SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 1146b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae2is_write }, 1147b0f7cd35SPeter Maydell { .name = "TLBI_ALLE1OS", .state = ARM_CP_STATE_AA64, 1148b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 4, 1149b0f7cd35SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 1150b0f7cd35SPeter Maydell .writefn = tlbi_aa64_alle1is_write }, 1151b0f7cd35SPeter Maydell { .name = "TLBI_VALE2OS", .state = ARM_CP_STATE_AA64, 1152b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 5, 1153b0f7cd35SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 1154b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae2is_write }, 1155b0f7cd35SPeter Maydell { .name = "TLBI_VMALLS12E1OS", .state = ARM_CP_STATE_AA64, 1156b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 6, 1157b0f7cd35SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 1158b0f7cd35SPeter Maydell .writefn = tlbi_aa64_alle1is_write }, 1159b0f7cd35SPeter Maydell { .name = "TLBI_IPAS2E1OS", .state = ARM_CP_STATE_AA64, 1160b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 0, 1161b0f7cd35SPeter Maydell .access = PL2_W, .type = ARM_CP_NOP }, 1162b0f7cd35SPeter Maydell { .name = "TLBI_RIPAS2E1OS", .state = ARM_CP_STATE_AA64, 1163b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 3, 1164b0f7cd35SPeter Maydell .access = PL2_W, .type = ARM_CP_NOP }, 1165b0f7cd35SPeter Maydell { .name = "TLBI_IPAS2LE1OS", .state = ARM_CP_STATE_AA64, 1166b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 4, 1167b0f7cd35SPeter Maydell .access = PL2_W, .type = ARM_CP_NOP }, 1168b0f7cd35SPeter Maydell { .name = "TLBI_RIPAS2LE1OS", .state = ARM_CP_STATE_AA64, 1169b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 7, 1170b0f7cd35SPeter Maydell .access = PL2_W, .type = ARM_CP_NOP }, 1171b0f7cd35SPeter Maydell { .name = "TLBI_ALLE3OS", .state = ARM_CP_STATE_AA64, 1172b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 0, 1173b0f7cd35SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 1174b0f7cd35SPeter Maydell .writefn = tlbi_aa64_alle3is_write }, 1175b0f7cd35SPeter Maydell { .name = "TLBI_VAE3OS", .state = ARM_CP_STATE_AA64, 1176b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 1, 1177b0f7cd35SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 1178b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae3is_write }, 1179b0f7cd35SPeter Maydell { .name = "TLBI_VALE3OS", .state = ARM_CP_STATE_AA64, 1180b0f7cd35SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 5, 1181b0f7cd35SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 1182b0f7cd35SPeter Maydell .writefn = tlbi_aa64_vae3is_write }, 1183b0f7cd35SPeter Maydell }; 11840b7aefb9SPeter Maydell 11850b7aefb9SPeter Maydell static void tlbi_aa64_paall_write(CPUARMState *env, const ARMCPRegInfo *ri, 11860b7aefb9SPeter Maydell uint64_t value) 11870b7aefb9SPeter Maydell { 11880b7aefb9SPeter Maydell CPUState *cs = env_cpu(env); 11890b7aefb9SPeter Maydell 11900b7aefb9SPeter Maydell tlb_flush(cs); 11910b7aefb9SPeter Maydell } 11920b7aefb9SPeter Maydell 11930b7aefb9SPeter Maydell static void tlbi_aa64_paallos_write(CPUARMState *env, const ARMCPRegInfo *ri, 11940b7aefb9SPeter Maydell uint64_t value) 11950b7aefb9SPeter Maydell { 11960b7aefb9SPeter Maydell CPUState *cs = env_cpu(env); 11970b7aefb9SPeter Maydell 11980b7aefb9SPeter Maydell tlb_flush_all_cpus_synced(cs); 11990b7aefb9SPeter Maydell } 12000b7aefb9SPeter Maydell 12010b7aefb9SPeter Maydell static const ARMCPRegInfo tlbi_rme_reginfo[] = { 12020b7aefb9SPeter Maydell { .name = "TLBI_PAALL", .state = ARM_CP_STATE_AA64, 12030b7aefb9SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 4, 12040b7aefb9SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 12050b7aefb9SPeter Maydell .writefn = tlbi_aa64_paall_write }, 12060b7aefb9SPeter Maydell { .name = "TLBI_PAALLOS", .state = ARM_CP_STATE_AA64, 12070b7aefb9SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 4, 12080b7aefb9SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 12090b7aefb9SPeter Maydell .writefn = tlbi_aa64_paallos_write }, 12100b7aefb9SPeter Maydell /* 12110b7aefb9SPeter Maydell * QEMU does not have a way to invalidate by physical address, thus 12120b7aefb9SPeter Maydell * invalidating a range of physical addresses is accomplished by 12130b7aefb9SPeter Maydell * flushing all tlb entries in the outer shareable domain, 12140b7aefb9SPeter Maydell * just like PAALLOS. 12150b7aefb9SPeter Maydell */ 12160b7aefb9SPeter Maydell { .name = "TLBI_RPALOS", .state = ARM_CP_STATE_AA64, 12170b7aefb9SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 4, .opc2 = 7, 12180b7aefb9SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 12190b7aefb9SPeter Maydell .writefn = tlbi_aa64_paallos_write }, 12200b7aefb9SPeter Maydell { .name = "TLBI_RPAOS", .state = ARM_CP_STATE_AA64, 12210b7aefb9SPeter Maydell .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 4, .opc2 = 3, 12220b7aefb9SPeter Maydell .access = PL3_W, .type = ARM_CP_NO_RAW, 12230b7aefb9SPeter Maydell .writefn = tlbi_aa64_paallos_write }, 12240b7aefb9SPeter Maydell }; 12250b7aefb9SPeter Maydell 122665593799SPeter Maydell #endif 122765593799SPeter Maydell 12281e32ee23SPeter Maydell void define_tlb_insn_regs(ARMCPU *cpu) 12291e32ee23SPeter Maydell { 12301e32ee23SPeter Maydell CPUARMState *env = &cpu->env; 12311e32ee23SPeter Maydell 12321e32ee23SPeter Maydell if (!arm_feature(env, ARM_FEATURE_V7)) { 12331e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_not_v7_cp_reginfo); 12341e32ee23SPeter Maydell } else { 12351e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v7_cp_reginfo); 12361e32ee23SPeter Maydell } 12371e32ee23SPeter Maydell if (arm_feature(env, ARM_FEATURE_V7MP) && 12381e32ee23SPeter Maydell !arm_feature(env, ARM_FEATURE_PMSA)) { 12391e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v7mp_cp_reginfo); 12401e32ee23SPeter Maydell } 12411e32ee23SPeter Maydell if (arm_feature(env, ARM_FEATURE_V8)) { 12421e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v8_cp_reginfo); 12431e32ee23SPeter Maydell } 1244d6b6da1fSPeter Maydell /* 1245d6b6da1fSPeter Maydell * We retain the existing logic for when to register these TLBI 1246d6b6da1fSPeter Maydell * ops (i.e. matching the condition for el2_cp_reginfo[] in 1247d6b6da1fSPeter Maydell * helper.c), but we will be able to simplify this later. 1248d6b6da1fSPeter Maydell */ 1249*48e652c4SPeter Maydell if (arm_feature(env, ARM_FEATURE_EL2)) { 1250d6b6da1fSPeter Maydell define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo); 1251d6b6da1fSPeter Maydell } 12525991e5abSPeter Maydell if (arm_feature(env, ARM_FEATURE_EL3)) { 12535991e5abSPeter Maydell define_arm_cp_regs(cpu, tlbi_el3_cp_reginfo); 12545991e5abSPeter Maydell } 125565593799SPeter Maydell #ifdef TARGET_AARCH64 125665593799SPeter Maydell if (cpu_isar_feature(aa64_tlbirange, cpu)) { 125765593799SPeter Maydell define_arm_cp_regs(cpu, tlbirange_reginfo); 125865593799SPeter Maydell } 1259b0f7cd35SPeter Maydell if (cpu_isar_feature(aa64_tlbios, cpu)) { 1260b0f7cd35SPeter Maydell define_arm_cp_regs(cpu, tlbios_reginfo); 1261b0f7cd35SPeter Maydell } 12620b7aefb9SPeter Maydell if (cpu_isar_feature(aa64_rme, cpu)) { 12630b7aefb9SPeter Maydell define_arm_cp_regs(cpu, tlbi_rme_reginfo); 12640b7aefb9SPeter Maydell } 126565593799SPeter Maydell #endif 12661e32ee23SPeter Maydell } 1267