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" 91e32ee23SPeter Maydell #include "exec/exec-all.h" 101e32ee23SPeter Maydell #include "cpu.h" 111e32ee23SPeter Maydell #include "internals.h" 121e32ee23SPeter Maydell #include "cpu-features.h" 131e32ee23SPeter Maydell #include "cpregs.h" 141e32ee23SPeter Maydell 151e32ee23SPeter Maydell /* IS variants of TLB operations must affect all cores */ 161e32ee23SPeter Maydell static void tlbiall_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 171e32ee23SPeter Maydell uint64_t value) 181e32ee23SPeter Maydell { 191e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 201e32ee23SPeter Maydell 211e32ee23SPeter Maydell tlb_flush_all_cpus_synced(cs); 221e32ee23SPeter Maydell } 231e32ee23SPeter Maydell 241e32ee23SPeter Maydell static void tlbiasid_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 251e32ee23SPeter Maydell uint64_t value) 261e32ee23SPeter Maydell { 271e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 281e32ee23SPeter Maydell 291e32ee23SPeter Maydell tlb_flush_all_cpus_synced(cs); 301e32ee23SPeter Maydell } 311e32ee23SPeter Maydell 321e32ee23SPeter Maydell static void tlbimva_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 331e32ee23SPeter Maydell uint64_t value) 341e32ee23SPeter Maydell { 351e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 361e32ee23SPeter Maydell 371e32ee23SPeter Maydell tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK); 381e32ee23SPeter Maydell } 391e32ee23SPeter Maydell 401e32ee23SPeter Maydell static void tlbimvaa_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 411e32ee23SPeter Maydell uint64_t value) 421e32ee23SPeter Maydell { 431e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 441e32ee23SPeter Maydell 451e32ee23SPeter Maydell tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK); 461e32ee23SPeter Maydell } 471e32ee23SPeter Maydell 481e32ee23SPeter Maydell static void tlbiall_write(CPUARMState *env, const ARMCPRegInfo *ri, 491e32ee23SPeter Maydell uint64_t value) 501e32ee23SPeter Maydell { 511e32ee23SPeter Maydell /* Invalidate all (TLBIALL) */ 521e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 531e32ee23SPeter Maydell 541e32ee23SPeter Maydell if (tlb_force_broadcast(env)) { 551e32ee23SPeter Maydell tlb_flush_all_cpus_synced(cs); 561e32ee23SPeter Maydell } else { 571e32ee23SPeter Maydell tlb_flush(cs); 581e32ee23SPeter Maydell } 591e32ee23SPeter Maydell } 601e32ee23SPeter Maydell 611e32ee23SPeter Maydell static void tlbimva_write(CPUARMState *env, const ARMCPRegInfo *ri, 621e32ee23SPeter Maydell uint64_t value) 631e32ee23SPeter Maydell { 641e32ee23SPeter Maydell /* Invalidate single TLB entry by MVA and ASID (TLBIMVA) */ 651e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 661e32ee23SPeter Maydell 671e32ee23SPeter Maydell value &= TARGET_PAGE_MASK; 681e32ee23SPeter Maydell if (tlb_force_broadcast(env)) { 691e32ee23SPeter Maydell tlb_flush_page_all_cpus_synced(cs, value); 701e32ee23SPeter Maydell } else { 711e32ee23SPeter Maydell tlb_flush_page(cs, value); 721e32ee23SPeter Maydell } 731e32ee23SPeter Maydell } 741e32ee23SPeter Maydell 751e32ee23SPeter Maydell static void tlbiasid_write(CPUARMState *env, const ARMCPRegInfo *ri, 761e32ee23SPeter Maydell uint64_t value) 771e32ee23SPeter Maydell { 781e32ee23SPeter Maydell /* Invalidate by ASID (TLBIASID) */ 791e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 801e32ee23SPeter Maydell 811e32ee23SPeter Maydell if (tlb_force_broadcast(env)) { 821e32ee23SPeter Maydell tlb_flush_all_cpus_synced(cs); 831e32ee23SPeter Maydell } else { 841e32ee23SPeter Maydell tlb_flush(cs); 851e32ee23SPeter Maydell } 861e32ee23SPeter Maydell } 871e32ee23SPeter Maydell 881e32ee23SPeter Maydell static void tlbimvaa_write(CPUARMState *env, const ARMCPRegInfo *ri, 891e32ee23SPeter Maydell uint64_t value) 901e32ee23SPeter Maydell { 911e32ee23SPeter Maydell /* Invalidate single entry by MVA, all ASIDs (TLBIMVAA) */ 921e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 931e32ee23SPeter Maydell 941e32ee23SPeter Maydell value &= TARGET_PAGE_MASK; 951e32ee23SPeter Maydell if (tlb_force_broadcast(env)) { 961e32ee23SPeter Maydell tlb_flush_page_all_cpus_synced(cs, value); 971e32ee23SPeter Maydell } else { 981e32ee23SPeter Maydell tlb_flush_page(cs, value); 991e32ee23SPeter Maydell } 1001e32ee23SPeter Maydell } 1011e32ee23SPeter Maydell 102d6b6da1fSPeter Maydell static void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri, 103d6b6da1fSPeter Maydell uint64_t value) 104d6b6da1fSPeter Maydell { 105d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 106d6b6da1fSPeter Maydell uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12); 107d6b6da1fSPeter Maydell 108d6b6da1fSPeter Maydell tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E2); 109d6b6da1fSPeter Maydell } 110d6b6da1fSPeter Maydell 111d6b6da1fSPeter Maydell static void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 112d6b6da1fSPeter Maydell uint64_t value) 113d6b6da1fSPeter Maydell { 114d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 115d6b6da1fSPeter Maydell uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12); 116d6b6da1fSPeter Maydell 117d6b6da1fSPeter Maydell tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, 118d6b6da1fSPeter Maydell ARMMMUIdxBit_E2); 119d6b6da1fSPeter Maydell } 120d6b6da1fSPeter Maydell 1211e32ee23SPeter Maydell static void tlbiipas2_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri, 1221e32ee23SPeter Maydell uint64_t value) 1231e32ee23SPeter Maydell { 1241e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 1251e32ee23SPeter Maydell uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12; 1261e32ee23SPeter Maydell 1271e32ee23SPeter Maydell tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_Stage2); 1281e32ee23SPeter Maydell } 1291e32ee23SPeter Maydell 1301e32ee23SPeter Maydell static void tlbiipas2is_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri, 1311e32ee23SPeter Maydell uint64_t value) 1321e32ee23SPeter Maydell { 1331e32ee23SPeter Maydell CPUState *cs = env_cpu(env); 1341e32ee23SPeter Maydell uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12; 1351e32ee23SPeter Maydell 1361e32ee23SPeter Maydell tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, ARMMMUIdxBit_Stage2); 1371e32ee23SPeter Maydell } 1381e32ee23SPeter Maydell 139d6b6da1fSPeter Maydell static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri, 140d6b6da1fSPeter Maydell uint64_t value) 141d6b6da1fSPeter Maydell { 142d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 143d6b6da1fSPeter Maydell 144d6b6da1fSPeter Maydell tlb_flush_by_mmuidx(cs, alle1_tlbmask(env)); 145d6b6da1fSPeter Maydell } 146d6b6da1fSPeter Maydell 147d6b6da1fSPeter Maydell static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 148d6b6da1fSPeter Maydell uint64_t value) 149d6b6da1fSPeter Maydell { 150d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 151d6b6da1fSPeter Maydell 152d6b6da1fSPeter Maydell tlb_flush_by_mmuidx_all_cpus_synced(cs, alle1_tlbmask(env)); 153d6b6da1fSPeter Maydell } 154d6b6da1fSPeter Maydell 155d6b6da1fSPeter Maydell 156d6b6da1fSPeter Maydell static void tlbiall_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri, 157d6b6da1fSPeter Maydell uint64_t value) 158d6b6da1fSPeter Maydell { 159d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 160d6b6da1fSPeter Maydell 161d6b6da1fSPeter Maydell tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E2); 162d6b6da1fSPeter Maydell } 163d6b6da1fSPeter Maydell 164d6b6da1fSPeter Maydell static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 165d6b6da1fSPeter Maydell uint64_t value) 166d6b6da1fSPeter Maydell { 167d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 168d6b6da1fSPeter Maydell 169d6b6da1fSPeter Maydell tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E2); 170d6b6da1fSPeter Maydell } 171d6b6da1fSPeter Maydell 172*abbb8264SPeter Maydell static void tlbi_aa64_vmalle1_write(CPUARMState *env, const ARMCPRegInfo *ri, 173*abbb8264SPeter Maydell uint64_t value) 174*abbb8264SPeter Maydell { 175*abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 176*abbb8264SPeter Maydell int mask = vae1_tlbmask(env); 177*abbb8264SPeter Maydell 178*abbb8264SPeter Maydell if (tlb_force_broadcast(env)) { 179*abbb8264SPeter Maydell tlb_flush_by_mmuidx_all_cpus_synced(cs, mask); 180*abbb8264SPeter Maydell } else { 181*abbb8264SPeter Maydell tlb_flush_by_mmuidx(cs, mask); 182*abbb8264SPeter Maydell } 183*abbb8264SPeter Maydell } 184*abbb8264SPeter Maydell 185*abbb8264SPeter Maydell static void tlbi_aa64_alle1_write(CPUARMState *env, const ARMCPRegInfo *ri, 186*abbb8264SPeter Maydell uint64_t value) 187*abbb8264SPeter Maydell { 188*abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 189*abbb8264SPeter Maydell int mask = alle1_tlbmask(env); 190*abbb8264SPeter Maydell 191*abbb8264SPeter Maydell tlb_flush_by_mmuidx(cs, mask); 192*abbb8264SPeter Maydell } 193*abbb8264SPeter Maydell 194*abbb8264SPeter Maydell static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri, 195*abbb8264SPeter Maydell uint64_t value) 196*abbb8264SPeter Maydell { 197*abbb8264SPeter Maydell /* 198*abbb8264SPeter Maydell * Invalidate by VA, EL1&0 (AArch64 version). 199*abbb8264SPeter Maydell * Currently handles all of VAE1, VAAE1, VAALE1 and VALE1, 200*abbb8264SPeter Maydell * since we don't support flush-for-specific-ASID-only or 201*abbb8264SPeter Maydell * flush-last-level-only. 202*abbb8264SPeter Maydell */ 203*abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 204*abbb8264SPeter Maydell int mask = vae1_tlbmask(env); 205*abbb8264SPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 206*abbb8264SPeter Maydell int bits = vae1_tlbbits(env, pageaddr); 207*abbb8264SPeter Maydell 208*abbb8264SPeter Maydell if (tlb_force_broadcast(env)) { 209*abbb8264SPeter Maydell tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits); 210*abbb8264SPeter Maydell } else { 211*abbb8264SPeter Maydell tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits); 212*abbb8264SPeter Maydell } 213*abbb8264SPeter Maydell } 214*abbb8264SPeter Maydell 215*abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri, 216*abbb8264SPeter Maydell uint64_t value) 217*abbb8264SPeter Maydell { 218*abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 219*abbb8264SPeter Maydell int mask = ipas2e1_tlbmask(env, value); 220*abbb8264SPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 221*abbb8264SPeter Maydell 222*abbb8264SPeter Maydell if (tlb_force_broadcast(env)) { 223*abbb8264SPeter Maydell tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask); 224*abbb8264SPeter Maydell } else { 225*abbb8264SPeter Maydell tlb_flush_page_by_mmuidx(cs, pageaddr, mask); 226*abbb8264SPeter Maydell } 227*abbb8264SPeter Maydell } 228*abbb8264SPeter Maydell 229*abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri, 230*abbb8264SPeter Maydell uint64_t value) 231*abbb8264SPeter Maydell { 232*abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 233*abbb8264SPeter Maydell int mask = ipas2e1_tlbmask(env, value); 234*abbb8264SPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 235*abbb8264SPeter Maydell 236*abbb8264SPeter Maydell tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask); 237*abbb8264SPeter Maydell } 238*abbb8264SPeter Maydell 2391e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_not_v7_cp_reginfo[] = { 2401e32ee23SPeter Maydell /* 2411e32ee23SPeter Maydell * MMU TLB control. Note that the wildcarding means we cover not just 2421e32ee23SPeter Maydell * the unified TLB ops but also the dside/iside/inner-shareable variants. 2431e32ee23SPeter Maydell */ 2441e32ee23SPeter Maydell { .name = "TLBIALL", .cp = 15, .crn = 8, .crm = CP_ANY, 2451e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 0, .access = PL1_W, .writefn = tlbiall_write, 2461e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 2471e32ee23SPeter Maydell { .name = "TLBIMVA", .cp = 15, .crn = 8, .crm = CP_ANY, 2481e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 1, .access = PL1_W, .writefn = tlbimva_write, 2491e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 2501e32ee23SPeter Maydell { .name = "TLBIASID", .cp = 15, .crn = 8, .crm = CP_ANY, 2511e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 2, .access = PL1_W, .writefn = tlbiasid_write, 2521e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 2531e32ee23SPeter Maydell { .name = "TLBIMVAA", .cp = 15, .crn = 8, .crm = CP_ANY, 2541e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 3, .access = PL1_W, .writefn = tlbimvaa_write, 2551e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 2561e32ee23SPeter Maydell }; 2571e32ee23SPeter Maydell 2581e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7_cp_reginfo[] = { 2591e32ee23SPeter Maydell /* 32 bit ITLB invalidates */ 2601e32ee23SPeter Maydell { .name = "ITLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 0, 2611e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2621e32ee23SPeter Maydell .writefn = tlbiall_write }, 2631e32ee23SPeter Maydell { .name = "ITLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1, 2641e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2651e32ee23SPeter Maydell .writefn = tlbimva_write }, 2661e32ee23SPeter Maydell { .name = "ITLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 2, 2671e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2681e32ee23SPeter Maydell .writefn = tlbiasid_write }, 2691e32ee23SPeter Maydell /* 32 bit DTLB invalidates */ 2701e32ee23SPeter Maydell { .name = "DTLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 0, 2711e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2721e32ee23SPeter Maydell .writefn = tlbiall_write }, 2731e32ee23SPeter Maydell { .name = "DTLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1, 2741e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2751e32ee23SPeter Maydell .writefn = tlbimva_write }, 2761e32ee23SPeter Maydell { .name = "DTLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 2, 2771e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2781e32ee23SPeter Maydell .writefn = tlbiasid_write }, 2791e32ee23SPeter Maydell /* 32 bit TLB invalidates */ 2801e32ee23SPeter Maydell { .name = "TLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0, 2811e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2821e32ee23SPeter Maydell .writefn = tlbiall_write }, 2831e32ee23SPeter Maydell { .name = "TLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1, 2841e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2851e32ee23SPeter Maydell .writefn = tlbimva_write }, 2861e32ee23SPeter Maydell { .name = "TLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2, 2871e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2881e32ee23SPeter Maydell .writefn = tlbiasid_write }, 2891e32ee23SPeter Maydell { .name = "TLBIMVAA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3, 2901e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2911e32ee23SPeter Maydell .writefn = tlbimvaa_write }, 2921e32ee23SPeter Maydell }; 2931e32ee23SPeter Maydell 2941e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7mp_cp_reginfo[] = { 2951e32ee23SPeter Maydell /* 32 bit TLB invalidates, Inner Shareable */ 2961e32ee23SPeter Maydell { .name = "TLBIALLIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0, 2971e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 2981e32ee23SPeter Maydell .writefn = tlbiall_is_write }, 2991e32ee23SPeter Maydell { .name = "TLBIMVAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1, 3001e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3011e32ee23SPeter Maydell .writefn = tlbimva_is_write }, 3021e32ee23SPeter Maydell { .name = "TLBIASIDIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2, 3031e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3041e32ee23SPeter Maydell .writefn = tlbiasid_is_write }, 3051e32ee23SPeter Maydell { .name = "TLBIMVAAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3, 3061e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3071e32ee23SPeter Maydell .writefn = tlbimvaa_is_write }, 3081e32ee23SPeter Maydell }; 3091e32ee23SPeter Maydell 3101e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v8_cp_reginfo[] = { 3111e32ee23SPeter Maydell /* AArch32 TLB invalidate last level of translation table walk */ 3121e32ee23SPeter Maydell { .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5, 3131e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3141e32ee23SPeter Maydell .writefn = tlbimva_is_write }, 3151e32ee23SPeter Maydell { .name = "TLBIMVAALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7, 3161e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3171e32ee23SPeter Maydell .writefn = tlbimvaa_is_write }, 3181e32ee23SPeter Maydell { .name = "TLBIMVAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5, 3191e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3201e32ee23SPeter Maydell .writefn = tlbimva_write }, 3211e32ee23SPeter Maydell { .name = "TLBIMVAAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7, 3221e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3231e32ee23SPeter Maydell .writefn = tlbimvaa_write }, 3241e32ee23SPeter Maydell { .name = "TLBIMVALH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5, 3251e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3261e32ee23SPeter Maydell .writefn = tlbimva_hyp_write }, 3271e32ee23SPeter Maydell { .name = "TLBIMVALHIS", 3281e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5, 3291e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3301e32ee23SPeter Maydell .writefn = tlbimva_hyp_is_write }, 3311e32ee23SPeter Maydell { .name = "TLBIIPAS2", 3321e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1, 3331e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3341e32ee23SPeter Maydell .writefn = tlbiipas2_hyp_write }, 3351e32ee23SPeter Maydell { .name = "TLBIIPAS2IS", 3361e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1, 3371e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3381e32ee23SPeter Maydell .writefn = tlbiipas2is_hyp_write }, 3391e32ee23SPeter Maydell { .name = "TLBIIPAS2L", 3401e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5, 3411e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3421e32ee23SPeter Maydell .writefn = tlbiipas2_hyp_write }, 3431e32ee23SPeter Maydell { .name = "TLBIIPAS2LIS", 3441e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5, 3451e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3461e32ee23SPeter Maydell .writefn = tlbiipas2is_hyp_write }, 347*abbb8264SPeter Maydell /* AArch64 TLBI operations */ 348*abbb8264SPeter Maydell { .name = "TLBI_VMALLE1IS", .state = ARM_CP_STATE_AA64, 349*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0, 350*abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 351*abbb8264SPeter Maydell .fgt = FGT_TLBIVMALLE1IS, 352*abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1is_write }, 353*abbb8264SPeter Maydell { .name = "TLBI_VAE1IS", .state = ARM_CP_STATE_AA64, 354*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1, 355*abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 356*abbb8264SPeter Maydell .fgt = FGT_TLBIVAE1IS, 357*abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 358*abbb8264SPeter Maydell { .name = "TLBI_ASIDE1IS", .state = ARM_CP_STATE_AA64, 359*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2, 360*abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 361*abbb8264SPeter Maydell .fgt = FGT_TLBIASIDE1IS, 362*abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1is_write }, 363*abbb8264SPeter Maydell { .name = "TLBI_VAAE1IS", .state = ARM_CP_STATE_AA64, 364*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3, 365*abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 366*abbb8264SPeter Maydell .fgt = FGT_TLBIVAAE1IS, 367*abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 368*abbb8264SPeter Maydell { .name = "TLBI_VALE1IS", .state = ARM_CP_STATE_AA64, 369*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5, 370*abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 371*abbb8264SPeter Maydell .fgt = FGT_TLBIVALE1IS, 372*abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 373*abbb8264SPeter Maydell { .name = "TLBI_VAALE1IS", .state = ARM_CP_STATE_AA64, 374*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7, 375*abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 376*abbb8264SPeter Maydell .fgt = FGT_TLBIVAALE1IS, 377*abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 378*abbb8264SPeter Maydell { .name = "TLBI_VMALLE1", .state = ARM_CP_STATE_AA64, 379*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0, 380*abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 381*abbb8264SPeter Maydell .fgt = FGT_TLBIVMALLE1, 382*abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1_write }, 383*abbb8264SPeter Maydell { .name = "TLBI_VAE1", .state = ARM_CP_STATE_AA64, 384*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1, 385*abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 386*abbb8264SPeter Maydell .fgt = FGT_TLBIVAE1, 387*abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 388*abbb8264SPeter Maydell { .name = "TLBI_ASIDE1", .state = ARM_CP_STATE_AA64, 389*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2, 390*abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 391*abbb8264SPeter Maydell .fgt = FGT_TLBIASIDE1, 392*abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1_write }, 393*abbb8264SPeter Maydell { .name = "TLBI_VAAE1", .state = ARM_CP_STATE_AA64, 394*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3, 395*abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 396*abbb8264SPeter Maydell .fgt = FGT_TLBIVAAE1, 397*abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 398*abbb8264SPeter Maydell { .name = "TLBI_VALE1", .state = ARM_CP_STATE_AA64, 399*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5, 400*abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 401*abbb8264SPeter Maydell .fgt = FGT_TLBIVALE1, 402*abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 403*abbb8264SPeter Maydell { .name = "TLBI_VAALE1", .state = ARM_CP_STATE_AA64, 404*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7, 405*abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 406*abbb8264SPeter Maydell .fgt = FGT_TLBIVAALE1, 407*abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 408*abbb8264SPeter Maydell { .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64, 409*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1, 410*abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 411*abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1is_write }, 412*abbb8264SPeter Maydell { .name = "TLBI_IPAS2LE1IS", .state = ARM_CP_STATE_AA64, 413*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5, 414*abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 415*abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1is_write }, 416*abbb8264SPeter Maydell { .name = "TLBI_ALLE1IS", .state = ARM_CP_STATE_AA64, 417*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4, 418*abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 419*abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1is_write }, 420*abbb8264SPeter Maydell { .name = "TLBI_VMALLS12E1IS", .state = ARM_CP_STATE_AA64, 421*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 6, 422*abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 423*abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1is_write }, 424*abbb8264SPeter Maydell { .name = "TLBI_IPAS2E1", .state = ARM_CP_STATE_AA64, 425*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1, 426*abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 427*abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1_write }, 428*abbb8264SPeter Maydell { .name = "TLBI_IPAS2LE1", .state = ARM_CP_STATE_AA64, 429*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5, 430*abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 431*abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1_write }, 432*abbb8264SPeter Maydell { .name = "TLBI_ALLE1", .state = ARM_CP_STATE_AA64, 433*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4, 434*abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 435*abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1_write }, 436*abbb8264SPeter Maydell { .name = "TLBI_VMALLS12E1", .state = ARM_CP_STATE_AA64, 437*abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 6, 438*abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 439*abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1is_write }, 4401e32ee23SPeter Maydell }; 4411e32ee23SPeter Maydell 442d6b6da1fSPeter Maydell static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = { 443d6b6da1fSPeter Maydell { .name = "TLBIALLNSNH", 444d6b6da1fSPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4, 445d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 446d6b6da1fSPeter Maydell .writefn = tlbiall_nsnh_write }, 447d6b6da1fSPeter Maydell { .name = "TLBIALLNSNHIS", 448d6b6da1fSPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4, 449d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 450d6b6da1fSPeter Maydell .writefn = tlbiall_nsnh_is_write }, 451d6b6da1fSPeter Maydell { .name = "TLBIALLH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0, 452d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 453d6b6da1fSPeter Maydell .writefn = tlbiall_hyp_write }, 454d6b6da1fSPeter Maydell { .name = "TLBIALLHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0, 455d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 456d6b6da1fSPeter Maydell .writefn = tlbiall_hyp_is_write }, 457d6b6da1fSPeter Maydell { .name = "TLBIMVAH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1, 458d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 459d6b6da1fSPeter Maydell .writefn = tlbimva_hyp_write }, 460d6b6da1fSPeter Maydell { .name = "TLBIMVAHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1, 461d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 462d6b6da1fSPeter Maydell .writefn = tlbimva_hyp_is_write }, 463d6b6da1fSPeter Maydell }; 464d6b6da1fSPeter Maydell 4651e32ee23SPeter Maydell void define_tlb_insn_regs(ARMCPU *cpu) 4661e32ee23SPeter Maydell { 4671e32ee23SPeter Maydell CPUARMState *env = &cpu->env; 4681e32ee23SPeter Maydell 4691e32ee23SPeter Maydell if (!arm_feature(env, ARM_FEATURE_V7)) { 4701e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_not_v7_cp_reginfo); 4711e32ee23SPeter Maydell } else { 4721e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v7_cp_reginfo); 4731e32ee23SPeter Maydell } 4741e32ee23SPeter Maydell if (arm_feature(env, ARM_FEATURE_V7MP) && 4751e32ee23SPeter Maydell !arm_feature(env, ARM_FEATURE_PMSA)) { 4761e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v7mp_cp_reginfo); 4771e32ee23SPeter Maydell } 4781e32ee23SPeter Maydell if (arm_feature(env, ARM_FEATURE_V8)) { 4791e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v8_cp_reginfo); 4801e32ee23SPeter Maydell } 481d6b6da1fSPeter Maydell /* 482d6b6da1fSPeter Maydell * We retain the existing logic for when to register these TLBI 483d6b6da1fSPeter Maydell * ops (i.e. matching the condition for el2_cp_reginfo[] in 484d6b6da1fSPeter Maydell * helper.c), but we will be able to simplify this later. 485d6b6da1fSPeter Maydell */ 486d6b6da1fSPeter Maydell if (arm_feature(env, ARM_FEATURE_EL2) 487d6b6da1fSPeter Maydell || (arm_feature(env, ARM_FEATURE_EL3) 488d6b6da1fSPeter Maydell && arm_feature(env, ARM_FEATURE_V8))) { 489d6b6da1fSPeter Maydell define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo); 490d6b6da1fSPeter Maydell } 4911e32ee23SPeter Maydell } 492