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