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 172abbb8264SPeter Maydell static void tlbi_aa64_vmalle1_write(CPUARMState *env, const ARMCPRegInfo *ri, 173abbb8264SPeter Maydell uint64_t value) 174abbb8264SPeter Maydell { 175abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 176abbb8264SPeter Maydell int mask = vae1_tlbmask(env); 177abbb8264SPeter Maydell 178abbb8264SPeter Maydell if (tlb_force_broadcast(env)) { 179abbb8264SPeter Maydell tlb_flush_by_mmuidx_all_cpus_synced(cs, mask); 180abbb8264SPeter Maydell } else { 181abbb8264SPeter Maydell tlb_flush_by_mmuidx(cs, mask); 182abbb8264SPeter Maydell } 183abbb8264SPeter Maydell } 184abbb8264SPeter Maydell 185abbb8264SPeter Maydell static void tlbi_aa64_alle1_write(CPUARMState *env, const ARMCPRegInfo *ri, 186abbb8264SPeter Maydell uint64_t value) 187abbb8264SPeter Maydell { 188abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 189abbb8264SPeter Maydell int mask = alle1_tlbmask(env); 190abbb8264SPeter Maydell 191abbb8264SPeter Maydell tlb_flush_by_mmuidx(cs, mask); 192abbb8264SPeter Maydell } 193abbb8264SPeter Maydell 194*7cadf113SPeter Maydell static void tlbi_aa64_alle2_write(CPUARMState *env, const ARMCPRegInfo *ri, 195*7cadf113SPeter Maydell uint64_t value) 196*7cadf113SPeter Maydell { 197*7cadf113SPeter Maydell CPUState *cs = env_cpu(env); 198*7cadf113SPeter Maydell int mask = e2_tlbmask(env); 199*7cadf113SPeter Maydell 200*7cadf113SPeter Maydell tlb_flush_by_mmuidx(cs, mask); 201*7cadf113SPeter Maydell } 202*7cadf113SPeter Maydell 203*7cadf113SPeter Maydell static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri, 204*7cadf113SPeter Maydell uint64_t value) 205*7cadf113SPeter Maydell { 206*7cadf113SPeter Maydell /* 207*7cadf113SPeter Maydell * Invalidate by VA, EL2 208*7cadf113SPeter Maydell * Currently handles both VAE2 and VALE2, since we don't support 209*7cadf113SPeter Maydell * flush-last-level-only. 210*7cadf113SPeter Maydell */ 211*7cadf113SPeter Maydell CPUState *cs = env_cpu(env); 212*7cadf113SPeter Maydell int mask = vae2_tlbmask(env); 213*7cadf113SPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 214*7cadf113SPeter Maydell int bits = vae2_tlbbits(env, pageaddr); 215*7cadf113SPeter Maydell 216*7cadf113SPeter Maydell tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits); 217*7cadf113SPeter Maydell } 218*7cadf113SPeter Maydell 219abbb8264SPeter Maydell static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri, 220abbb8264SPeter Maydell uint64_t value) 221abbb8264SPeter Maydell { 222abbb8264SPeter Maydell /* 223abbb8264SPeter Maydell * Invalidate by VA, EL1&0 (AArch64 version). 224abbb8264SPeter Maydell * Currently handles all of VAE1, VAAE1, VAALE1 and VALE1, 225abbb8264SPeter Maydell * since we don't support flush-for-specific-ASID-only or 226abbb8264SPeter Maydell * flush-last-level-only. 227abbb8264SPeter Maydell */ 228abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 229abbb8264SPeter Maydell int mask = vae1_tlbmask(env); 230abbb8264SPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 231abbb8264SPeter Maydell int bits = vae1_tlbbits(env, pageaddr); 232abbb8264SPeter Maydell 233abbb8264SPeter Maydell if (tlb_force_broadcast(env)) { 234abbb8264SPeter Maydell tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits); 235abbb8264SPeter Maydell } else { 236abbb8264SPeter Maydell tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits); 237abbb8264SPeter Maydell } 238abbb8264SPeter Maydell } 239abbb8264SPeter Maydell 240abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri, 241abbb8264SPeter Maydell uint64_t value) 242abbb8264SPeter Maydell { 243abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 244abbb8264SPeter Maydell int mask = ipas2e1_tlbmask(env, value); 245abbb8264SPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 246abbb8264SPeter Maydell 247abbb8264SPeter Maydell if (tlb_force_broadcast(env)) { 248abbb8264SPeter Maydell tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask); 249abbb8264SPeter Maydell } else { 250abbb8264SPeter Maydell tlb_flush_page_by_mmuidx(cs, pageaddr, mask); 251abbb8264SPeter Maydell } 252abbb8264SPeter Maydell } 253abbb8264SPeter Maydell 254abbb8264SPeter Maydell static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri, 255abbb8264SPeter Maydell uint64_t value) 256abbb8264SPeter Maydell { 257abbb8264SPeter Maydell CPUState *cs = env_cpu(env); 258abbb8264SPeter Maydell int mask = ipas2e1_tlbmask(env, value); 259abbb8264SPeter Maydell uint64_t pageaddr = sextract64(value << 12, 0, 56); 260abbb8264SPeter Maydell 261abbb8264SPeter Maydell tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask); 262abbb8264SPeter Maydell } 263abbb8264SPeter Maydell 2641e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_not_v7_cp_reginfo[] = { 2651e32ee23SPeter Maydell /* 2661e32ee23SPeter Maydell * MMU TLB control. Note that the wildcarding means we cover not just 2671e32ee23SPeter Maydell * the unified TLB ops but also the dside/iside/inner-shareable variants. 2681e32ee23SPeter Maydell */ 2691e32ee23SPeter Maydell { .name = "TLBIALL", .cp = 15, .crn = 8, .crm = CP_ANY, 2701e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 0, .access = PL1_W, .writefn = tlbiall_write, 2711e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 2721e32ee23SPeter Maydell { .name = "TLBIMVA", .cp = 15, .crn = 8, .crm = CP_ANY, 2731e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 1, .access = PL1_W, .writefn = tlbimva_write, 2741e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 2751e32ee23SPeter Maydell { .name = "TLBIASID", .cp = 15, .crn = 8, .crm = CP_ANY, 2761e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 2, .access = PL1_W, .writefn = tlbiasid_write, 2771e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 2781e32ee23SPeter Maydell { .name = "TLBIMVAA", .cp = 15, .crn = 8, .crm = CP_ANY, 2791e32ee23SPeter Maydell .opc1 = CP_ANY, .opc2 = 3, .access = PL1_W, .writefn = tlbimvaa_write, 2801e32ee23SPeter Maydell .type = ARM_CP_NO_RAW }, 2811e32ee23SPeter Maydell }; 2821e32ee23SPeter Maydell 2831e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7_cp_reginfo[] = { 2841e32ee23SPeter Maydell /* 32 bit ITLB invalidates */ 2851e32ee23SPeter Maydell { .name = "ITLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 0, 2861e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2871e32ee23SPeter Maydell .writefn = tlbiall_write }, 2881e32ee23SPeter Maydell { .name = "ITLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1, 2891e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2901e32ee23SPeter Maydell .writefn = tlbimva_write }, 2911e32ee23SPeter Maydell { .name = "ITLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 2, 2921e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2931e32ee23SPeter Maydell .writefn = tlbiasid_write }, 2941e32ee23SPeter Maydell /* 32 bit DTLB invalidates */ 2951e32ee23SPeter Maydell { .name = "DTLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 0, 2961e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 2971e32ee23SPeter Maydell .writefn = tlbiall_write }, 2981e32ee23SPeter Maydell { .name = "DTLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1, 2991e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3001e32ee23SPeter Maydell .writefn = tlbimva_write }, 3011e32ee23SPeter Maydell { .name = "DTLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 2, 3021e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3031e32ee23SPeter Maydell .writefn = tlbiasid_write }, 3041e32ee23SPeter Maydell /* 32 bit TLB invalidates */ 3051e32ee23SPeter Maydell { .name = "TLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0, 3061e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3071e32ee23SPeter Maydell .writefn = tlbiall_write }, 3081e32ee23SPeter Maydell { .name = "TLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1, 3091e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3101e32ee23SPeter Maydell .writefn = tlbimva_write }, 3111e32ee23SPeter Maydell { .name = "TLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2, 3121e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3131e32ee23SPeter Maydell .writefn = tlbiasid_write }, 3141e32ee23SPeter Maydell { .name = "TLBIMVAA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3, 3151e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3161e32ee23SPeter Maydell .writefn = tlbimvaa_write }, 3171e32ee23SPeter Maydell }; 3181e32ee23SPeter Maydell 3191e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v7mp_cp_reginfo[] = { 3201e32ee23SPeter Maydell /* 32 bit TLB invalidates, Inner Shareable */ 3211e32ee23SPeter Maydell { .name = "TLBIALLIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0, 3221e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3231e32ee23SPeter Maydell .writefn = tlbiall_is_write }, 3241e32ee23SPeter Maydell { .name = "TLBIMVAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1, 3251e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3261e32ee23SPeter Maydell .writefn = tlbimva_is_write }, 3271e32ee23SPeter Maydell { .name = "TLBIASIDIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2, 3281e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3291e32ee23SPeter Maydell .writefn = tlbiasid_is_write }, 3301e32ee23SPeter Maydell { .name = "TLBIMVAAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3, 3311e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3321e32ee23SPeter Maydell .writefn = tlbimvaa_is_write }, 3331e32ee23SPeter Maydell }; 3341e32ee23SPeter Maydell 3351e32ee23SPeter Maydell static const ARMCPRegInfo tlbi_v8_cp_reginfo[] = { 3361e32ee23SPeter Maydell /* AArch32 TLB invalidate last level of translation table walk */ 3371e32ee23SPeter Maydell { .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5, 3381e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3391e32ee23SPeter Maydell .writefn = tlbimva_is_write }, 3401e32ee23SPeter Maydell { .name = "TLBIMVAALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7, 3411e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis, 3421e32ee23SPeter Maydell .writefn = tlbimvaa_is_write }, 3431e32ee23SPeter Maydell { .name = "TLBIMVAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5, 3441e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3451e32ee23SPeter Maydell .writefn = tlbimva_write }, 3461e32ee23SPeter Maydell { .name = "TLBIMVAAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7, 3471e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb, 3481e32ee23SPeter Maydell .writefn = tlbimvaa_write }, 3491e32ee23SPeter Maydell { .name = "TLBIMVALH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5, 3501e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3511e32ee23SPeter Maydell .writefn = tlbimva_hyp_write }, 3521e32ee23SPeter Maydell { .name = "TLBIMVALHIS", 3531e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5, 3541e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3551e32ee23SPeter Maydell .writefn = tlbimva_hyp_is_write }, 3561e32ee23SPeter Maydell { .name = "TLBIIPAS2", 3571e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1, 3581e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3591e32ee23SPeter Maydell .writefn = tlbiipas2_hyp_write }, 3601e32ee23SPeter Maydell { .name = "TLBIIPAS2IS", 3611e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1, 3621e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3631e32ee23SPeter Maydell .writefn = tlbiipas2is_hyp_write }, 3641e32ee23SPeter Maydell { .name = "TLBIIPAS2L", 3651e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5, 3661e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3671e32ee23SPeter Maydell .writefn = tlbiipas2_hyp_write }, 3681e32ee23SPeter Maydell { .name = "TLBIIPAS2LIS", 3691e32ee23SPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5, 3701e32ee23SPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 3711e32ee23SPeter Maydell .writefn = tlbiipas2is_hyp_write }, 372abbb8264SPeter Maydell /* AArch64 TLBI operations */ 373abbb8264SPeter Maydell { .name = "TLBI_VMALLE1IS", .state = ARM_CP_STATE_AA64, 374abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0, 375abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 376abbb8264SPeter Maydell .fgt = FGT_TLBIVMALLE1IS, 377abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1is_write }, 378abbb8264SPeter Maydell { .name = "TLBI_VAE1IS", .state = ARM_CP_STATE_AA64, 379abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1, 380abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 381abbb8264SPeter Maydell .fgt = FGT_TLBIVAE1IS, 382abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 383abbb8264SPeter Maydell { .name = "TLBI_ASIDE1IS", .state = ARM_CP_STATE_AA64, 384abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2, 385abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 386abbb8264SPeter Maydell .fgt = FGT_TLBIASIDE1IS, 387abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1is_write }, 388abbb8264SPeter Maydell { .name = "TLBI_VAAE1IS", .state = ARM_CP_STATE_AA64, 389abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3, 390abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 391abbb8264SPeter Maydell .fgt = FGT_TLBIVAAE1IS, 392abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 393abbb8264SPeter Maydell { .name = "TLBI_VALE1IS", .state = ARM_CP_STATE_AA64, 394abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5, 395abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 396abbb8264SPeter Maydell .fgt = FGT_TLBIVALE1IS, 397abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 398abbb8264SPeter Maydell { .name = "TLBI_VAALE1IS", .state = ARM_CP_STATE_AA64, 399abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7, 400abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW, 401abbb8264SPeter Maydell .fgt = FGT_TLBIVAALE1IS, 402abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1is_write }, 403abbb8264SPeter Maydell { .name = "TLBI_VMALLE1", .state = ARM_CP_STATE_AA64, 404abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0, 405abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 406abbb8264SPeter Maydell .fgt = FGT_TLBIVMALLE1, 407abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1_write }, 408abbb8264SPeter Maydell { .name = "TLBI_VAE1", .state = ARM_CP_STATE_AA64, 409abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1, 410abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 411abbb8264SPeter Maydell .fgt = FGT_TLBIVAE1, 412abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 413abbb8264SPeter Maydell { .name = "TLBI_ASIDE1", .state = ARM_CP_STATE_AA64, 414abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2, 415abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 416abbb8264SPeter Maydell .fgt = FGT_TLBIASIDE1, 417abbb8264SPeter Maydell .writefn = tlbi_aa64_vmalle1_write }, 418abbb8264SPeter Maydell { .name = "TLBI_VAAE1", .state = ARM_CP_STATE_AA64, 419abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3, 420abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 421abbb8264SPeter Maydell .fgt = FGT_TLBIVAAE1, 422abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 423abbb8264SPeter Maydell { .name = "TLBI_VALE1", .state = ARM_CP_STATE_AA64, 424abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5, 425abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 426abbb8264SPeter Maydell .fgt = FGT_TLBIVALE1, 427abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 428abbb8264SPeter Maydell { .name = "TLBI_VAALE1", .state = ARM_CP_STATE_AA64, 429abbb8264SPeter Maydell .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7, 430abbb8264SPeter Maydell .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW, 431abbb8264SPeter Maydell .fgt = FGT_TLBIVAALE1, 432abbb8264SPeter Maydell .writefn = tlbi_aa64_vae1_write }, 433abbb8264SPeter Maydell { .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64, 434abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1, 435abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 436abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1is_write }, 437abbb8264SPeter Maydell { .name = "TLBI_IPAS2LE1IS", .state = ARM_CP_STATE_AA64, 438abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5, 439abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 440abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1is_write }, 441abbb8264SPeter Maydell { .name = "TLBI_ALLE1IS", .state = ARM_CP_STATE_AA64, 442abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4, 443abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 444abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1is_write }, 445abbb8264SPeter Maydell { .name = "TLBI_VMALLS12E1IS", .state = ARM_CP_STATE_AA64, 446abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 6, 447abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 448abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1is_write }, 449abbb8264SPeter Maydell { .name = "TLBI_IPAS2E1", .state = ARM_CP_STATE_AA64, 450abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1, 451abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 452abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1_write }, 453abbb8264SPeter Maydell { .name = "TLBI_IPAS2LE1", .state = ARM_CP_STATE_AA64, 454abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5, 455abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 456abbb8264SPeter Maydell .writefn = tlbi_aa64_ipas2e1_write }, 457abbb8264SPeter Maydell { .name = "TLBI_ALLE1", .state = ARM_CP_STATE_AA64, 458abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4, 459abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 460abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1_write }, 461abbb8264SPeter Maydell { .name = "TLBI_VMALLS12E1", .state = ARM_CP_STATE_AA64, 462abbb8264SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 6, 463abbb8264SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW, 464abbb8264SPeter Maydell .writefn = tlbi_aa64_alle1is_write }, 4651e32ee23SPeter Maydell }; 4661e32ee23SPeter Maydell 467d6b6da1fSPeter Maydell static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = { 468d6b6da1fSPeter Maydell { .name = "TLBIALLNSNH", 469d6b6da1fSPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4, 470d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 471d6b6da1fSPeter Maydell .writefn = tlbiall_nsnh_write }, 472d6b6da1fSPeter Maydell { .name = "TLBIALLNSNHIS", 473d6b6da1fSPeter Maydell .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4, 474d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 475d6b6da1fSPeter Maydell .writefn = tlbiall_nsnh_is_write }, 476d6b6da1fSPeter Maydell { .name = "TLBIALLH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0, 477d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 478d6b6da1fSPeter Maydell .writefn = tlbiall_hyp_write }, 479d6b6da1fSPeter Maydell { .name = "TLBIALLHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0, 480d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 481d6b6da1fSPeter Maydell .writefn = tlbiall_hyp_is_write }, 482d6b6da1fSPeter Maydell { .name = "TLBIMVAH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1, 483d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 484d6b6da1fSPeter Maydell .writefn = tlbimva_hyp_write }, 485d6b6da1fSPeter Maydell { .name = "TLBIMVAHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1, 486d6b6da1fSPeter Maydell .type = ARM_CP_NO_RAW, .access = PL2_W, 487d6b6da1fSPeter Maydell .writefn = tlbimva_hyp_is_write }, 488*7cadf113SPeter Maydell { .name = "TLBI_ALLE2", .state = ARM_CP_STATE_AA64, 489*7cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0, 490*7cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 491*7cadf113SPeter Maydell .writefn = tlbi_aa64_alle2_write }, 492*7cadf113SPeter Maydell { .name = "TLBI_VAE2", .state = ARM_CP_STATE_AA64, 493*7cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1, 494*7cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 495*7cadf113SPeter Maydell .writefn = tlbi_aa64_vae2_write }, 496*7cadf113SPeter Maydell { .name = "TLBI_VALE2", .state = ARM_CP_STATE_AA64, 497*7cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5, 498*7cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 499*7cadf113SPeter Maydell .writefn = tlbi_aa64_vae2_write }, 500*7cadf113SPeter Maydell { .name = "TLBI_ALLE2IS", .state = ARM_CP_STATE_AA64, 501*7cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0, 502*7cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 503*7cadf113SPeter Maydell .writefn = tlbi_aa64_alle2is_write }, 504*7cadf113SPeter Maydell { .name = "TLBI_VAE2IS", .state = ARM_CP_STATE_AA64, 505*7cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1, 506*7cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 507*7cadf113SPeter Maydell .writefn = tlbi_aa64_vae2is_write }, 508*7cadf113SPeter Maydell { .name = "TLBI_VALE2IS", .state = ARM_CP_STATE_AA64, 509*7cadf113SPeter Maydell .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5, 510*7cadf113SPeter Maydell .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF, 511*7cadf113SPeter Maydell .writefn = tlbi_aa64_vae2is_write }, 512d6b6da1fSPeter Maydell }; 513d6b6da1fSPeter Maydell 5141e32ee23SPeter Maydell void define_tlb_insn_regs(ARMCPU *cpu) 5151e32ee23SPeter Maydell { 5161e32ee23SPeter Maydell CPUARMState *env = &cpu->env; 5171e32ee23SPeter Maydell 5181e32ee23SPeter Maydell if (!arm_feature(env, ARM_FEATURE_V7)) { 5191e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_not_v7_cp_reginfo); 5201e32ee23SPeter Maydell } else { 5211e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v7_cp_reginfo); 5221e32ee23SPeter Maydell } 5231e32ee23SPeter Maydell if (arm_feature(env, ARM_FEATURE_V7MP) && 5241e32ee23SPeter Maydell !arm_feature(env, ARM_FEATURE_PMSA)) { 5251e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v7mp_cp_reginfo); 5261e32ee23SPeter Maydell } 5271e32ee23SPeter Maydell if (arm_feature(env, ARM_FEATURE_V8)) { 5281e32ee23SPeter Maydell define_arm_cp_regs(cpu, tlbi_v8_cp_reginfo); 5291e32ee23SPeter Maydell } 530d6b6da1fSPeter Maydell /* 531d6b6da1fSPeter Maydell * We retain the existing logic for when to register these TLBI 532d6b6da1fSPeter Maydell * ops (i.e. matching the condition for el2_cp_reginfo[] in 533d6b6da1fSPeter Maydell * helper.c), but we will be able to simplify this later. 534d6b6da1fSPeter Maydell */ 535d6b6da1fSPeter Maydell if (arm_feature(env, ARM_FEATURE_EL2) 536d6b6da1fSPeter Maydell || (arm_feature(env, ARM_FEATURE_EL3) 537d6b6da1fSPeter Maydell && arm_feature(env, ARM_FEATURE_V8))) { 538d6b6da1fSPeter Maydell define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo); 539d6b6da1fSPeter Maydell } 5401e32ee23SPeter Maydell } 541