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 102*d6b6da1fSPeter Maydell static void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri, 103*d6b6da1fSPeter Maydell uint64_t value) 104*d6b6da1fSPeter Maydell { 105*d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 106*d6b6da1fSPeter Maydell uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12); 107*d6b6da1fSPeter Maydell 108*d6b6da1fSPeter Maydell tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E2); 109*d6b6da1fSPeter Maydell } 110*d6b6da1fSPeter Maydell 111*d6b6da1fSPeter Maydell static void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 112*d6b6da1fSPeter Maydell uint64_t value) 113*d6b6da1fSPeter Maydell { 114*d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 115*d6b6da1fSPeter Maydell uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12); 116*d6b6da1fSPeter Maydell 117*d6b6da1fSPeter Maydell tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, 118*d6b6da1fSPeter Maydell ARMMMUIdxBit_E2); 119*d6b6da1fSPeter Maydell } 120*d6b6da1fSPeter 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 139*d6b6da1fSPeter Maydell static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri, 140*d6b6da1fSPeter Maydell uint64_t value) 141*d6b6da1fSPeter Maydell { 142*d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 143*d6b6da1fSPeter Maydell 144*d6b6da1fSPeter Maydell tlb_flush_by_mmuidx(cs, alle1_tlbmask(env)); 145*d6b6da1fSPeter Maydell } 146*d6b6da1fSPeter Maydell 147*d6b6da1fSPeter Maydell static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 148*d6b6da1fSPeter Maydell uint64_t value) 149*d6b6da1fSPeter Maydell { 150*d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 151*d6b6da1fSPeter Maydell 152*d6b6da1fSPeter Maydell tlb_flush_by_mmuidx_all_cpus_synced(cs, alle1_tlbmask(env)); 153*d6b6da1fSPeter Maydell } 154*d6b6da1fSPeter Maydell 155*d6b6da1fSPeter Maydell 156*d6b6da1fSPeter Maydell static void tlbiall_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri, 157*d6b6da1fSPeter Maydell uint64_t value) 158*d6b6da1fSPeter Maydell { 159*d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 160*d6b6da1fSPeter Maydell 161*d6b6da1fSPeter Maydell tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E2); 162*d6b6da1fSPeter Maydell } 163*d6b6da1fSPeter Maydell 164*d6b6da1fSPeter Maydell static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri, 165*d6b6da1fSPeter Maydell uint64_t value) 166*d6b6da1fSPeter Maydell { 167*d6b6da1fSPeter Maydell CPUState *cs = env_cpu(env); 168*d6b6da1fSPeter Maydell 169*d6b6da1fSPeter Maydell tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E2); 170*d6b6da1fSPeter Maydell } 171*d6b6da1fSPeter Maydell 1721e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_not_v7_cp_reginfo[] = { 1731e32ee23SPeter Maydell /* 1741e32ee23SPeter Maydell * MMU TLB control. Note that the wildcarding means we cover not just 1751e32ee23SPeter Maydell * the unified TLB ops but also the dside/iside/inner-shareable variants. 1761e32ee23SPeter Maydell */ 1771e32ee23SPeter Maydell { .name = "TLBIALL", .cp = 15, .crn = 8, .crm = CP_ANY, 1781e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 0, .access = PL1_W, .writefn = tlbiall_write, 1791e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 1801e32ee23SPeter Maydell { .name = "TLBIMVA", .cp = 15, .crn = 8, .crm = CP_ANY, 1811e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 1, .access = PL1_W, .writefn = tlbimva_write, 1821e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 1831e32ee23SPeter Maydell { .name = "TLBIASID", .cp = 15, .crn = 8, .crm = CP_ANY, 1841e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 2, .access = PL1_W, .writefn = tlbiasid_write, 1851e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 1861e32ee23SPeter Maydell { .name = "TLBIMVAA", .cp = 15, .crn = 8, .crm = CP_ANY, 1871e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 3, .access = PL1_W, .writefn = tlbimvaa_write, 1881e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 1891e32ee23SPeter Maydell }; 1901e32ee23SPeter Maydell 1911e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7_cp_reginfo[] = { 1921e32ee23SPeter Maydell /* 32 bit ITLB invalidates */ 1931e32ee23SPeter Maydell { .name = "ITLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 0, 1941e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 1951e32ee23SPeter Maydell .writefn = tlbiall_write }, 1961e32ee23SPeter Maydell { .name = "ITLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1, 1971e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 1981e32ee23SPeter Maydell .writefn = tlbimva_write }, 1991e32ee23SPeter Maydell { .name = "ITLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 2, 2001e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2011e32ee23SPeter Maydell .writefn = tlbiasid_write }, 2021e32ee23SPeter Maydell /* 32 bit DTLB invalidates */ 2031e32ee23SPeter Maydell { .name = "DTLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 0, 2041e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2051e32ee23SPeter Maydell .writefn = tlbiall_write }, 2061e32ee23SPeter Maydell { .name = "DTLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1, 2071e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2081e32ee23SPeter Maydell .writefn = tlbimva_write }, 2091e32ee23SPeter Maydell { .name = "DTLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 2, 2101e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2111e32ee23SPeter Maydell .writefn = tlbiasid_write }, 2121e32ee23SPeter Maydell /* 32 bit TLB invalidates */ 2131e32ee23SPeter Maydell { .name = "TLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0, 2141e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2151e32ee23SPeter Maydell .writefn = tlbiall_write }, 2161e32ee23SPeter Maydell { .name = "TLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1, 2171e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2181e32ee23SPeter Maydell .writefn = tlbimva_write }, 2191e32ee23SPeter Maydell { .name = "TLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2, 2201e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2211e32ee23SPeter Maydell .writefn = tlbiasid_write }, 2221e32ee23SPeter Maydell { .name = "TLBIMVAA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3, 2231e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2241e32ee23SPeter Maydell .writefn = tlbimvaa_write }, 2251e32ee23SPeter Maydell }; 2261e32ee23SPeter Maydell 2271e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7mp_cp_reginfo[] = { 2281e32ee23SPeter Maydell /* 32 bit TLB invalidates, Inner Shareable */ 2291e32ee23SPeter Maydell { .name = "TLBIALLIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0, 2301e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 2311e32ee23SPeter Maydell .writefn = tlbiall_is_write }, 2321e32ee23SPeter Maydell { .name = "TLBIMVAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1, 2331e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 2341e32ee23SPeter Maydell .writefn = tlbimva_is_write }, 2351e32ee23SPeter Maydell { .name = "TLBIASIDIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2, 2361e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 2371e32ee23SPeter Maydell .writefn = tlbiasid_is_write }, 2381e32ee23SPeter Maydell { .name = "TLBIMVAAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3, 2391e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 2401e32ee23SPeter Maydell .writefn = tlbimvaa_is_write }, 2411e32ee23SPeter Maydell }; 2421e32ee23SPeter Maydell 2431e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v8_cp_reginfo[] = { 2441e32ee23SPeter Maydell /* AArch32 TLB invalidate last level of translation table walk */ 2451e32ee23SPeter Maydell { .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5, 2461e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 2471e32ee23SPeter Maydell .writefn = tlbimva_is_write }, 2481e32ee23SPeter Maydell { .name = "TLBIMVAALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7, 2491e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 2501e32ee23SPeter Maydell .writefn = tlbimvaa_is_write }, 2511e32ee23SPeter Maydell { .name = "TLBIMVAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5, 2521e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2531e32ee23SPeter Maydell .writefn = tlbimva_write }, 2541e32ee23SPeter Maydell { .name = "TLBIMVAAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7, 2551e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2561e32ee23SPeter Maydell .writefn = tlbimvaa_write }, 2571e32ee23SPeter Maydell { .name = "TLBIMVALH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5, 2581e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 2591e32ee23SPeter Maydell .writefn = tlbimva_hyp_write }, 2601e32ee23SPeter Maydell { .name = "TLBIMVALHIS", 2611e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5, 2621e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 2631e32ee23SPeter Maydell .writefn = tlbimva_hyp_is_write }, 2641e32ee23SPeter Maydell { .name = "TLBIIPAS2", 2651e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1, 2661e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 2671e32ee23SPeter Maydell .writefn = tlbiipas2_hyp_write }, 2681e32ee23SPeter Maydell { .name = "TLBIIPAS2IS", 2691e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1, 2701e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 2711e32ee23SPeter Maydell .writefn = tlbiipas2is_hyp_write }, 2721e32ee23SPeter Maydell { .name = "TLBIIPAS2L", 2731e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5, 2741e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 2751e32ee23SPeter Maydell .writefn = tlbiipas2_hyp_write }, 2761e32ee23SPeter Maydell { .name = "TLBIIPAS2LIS", 2771e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5, 2781e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 2791e32ee23SPeter Maydell .writefn = tlbiipas2is_hyp_write }, 2801e32ee23SPeter Maydell }; 2811e32ee23SPeter Maydell 282*d6b6da1fSPeter Maydell static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = { 283*d6b6da1fSPeter Maydell { .name = "TLBIALLNSNH", 284*d6b6da1fSPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4, 285*d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 286*d6b6da1fSPeter Maydell .writefn = tlbiall_nsnh_write }, 287*d6b6da1fSPeter Maydell { .name = "TLBIALLNSNHIS", 288*d6b6da1fSPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4, 289*d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 290*d6b6da1fSPeter Maydell .writefn = tlbiall_nsnh_is_write }, 291*d6b6da1fSPeter Maydell { .name = "TLBIALLH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0, 292*d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 293*d6b6da1fSPeter Maydell .writefn = tlbiall_hyp_write }, 294*d6b6da1fSPeter Maydell { .name = "TLBIALLHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0, 295*d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 296*d6b6da1fSPeter Maydell .writefn = tlbiall_hyp_is_write }, 297*d6b6da1fSPeter Maydell { .name = "TLBIMVAH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1, 298*d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 299*d6b6da1fSPeter Maydell .writefn = tlbimva_hyp_write }, 300*d6b6da1fSPeter Maydell { .name = "TLBIMVAHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1, 301*d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 302*d6b6da1fSPeter Maydell .writefn = tlbimva_hyp_is_write }, 303*d6b6da1fSPeter Maydell }; 304*d6b6da1fSPeter Maydell 3051e32ee23SPeter Maydell void define_tlb_insn_regs(ARMCPU *cpu) 3061e32ee23SPeter Maydell { 3071e32ee23SPeter Maydell CPUARMState *env = &cpu->env; 3081e32ee23SPeter Maydell 3091e32ee23SPeter Maydell if (!arm_feature(env, ARM_FEATURE_V7)) { 3101e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_not_v7_cp_reginfo); 3111e32ee23SPeter Maydell } else { 3121e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v7_cp_reginfo); 3131e32ee23SPeter Maydell } 3141e32ee23SPeter Maydell if (arm_feature(env, ARM_FEATURE_V7MP) && 3151e32ee23SPeter Maydell !arm_feature(env, ARM_FEATURE_PMSA)) { 3161e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v7mp_cp_reginfo); 3171e32ee23SPeter Maydell } 3181e32ee23SPeter Maydell if (arm_feature(env, ARM_FEATURE_V8)) { 3191e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v8_cp_reginfo); 3201e32ee23SPeter Maydell } 321*d6b6da1fSPeter Maydell /* 322*d6b6da1fSPeter Maydell * We retain the existing logic for when to register these TLBI 323*d6b6da1fSPeter Maydell * ops (i.e. matching the condition for el2_cp_reginfo[] in 324*d6b6da1fSPeter Maydell * helper.c), but we will be able to simplify this later. 325*d6b6da1fSPeter Maydell */ 326*d6b6da1fSPeter Maydell if (arm_feature(env, ARM_FEATURE_EL2) 327*d6b6da1fSPeter Maydell || (arm_feature(env, ARM_FEATURE_EL3) 328*d6b6da1fSPeter Maydell && arm_feature(env, ARM_FEATURE_V8))) { 329*d6b6da1fSPeter Maydell define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo); 330*d6b6da1fSPeter Maydell } 3311e32ee23SPeter Maydell } 332