target/arm: Move AArch64 EL3 TLBI insns
Move the AArch64 EL3 TLBI insns from el3_cp_reginfo[] across to tlb-insns.c. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20241210160452.2427965-6-peter.maydell@linaro.org
This commit is contained in:
parent
7cadf1139d
commit
5991e5abe3
@ -1161,5 +1161,9 @@ void tlbi_aa64_alle2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
|||||||
uint64_t value);
|
uint64_t value);
|
||||||
void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
uint64_t value);
|
uint64_t value);
|
||||||
|
void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
|
uint64_t value);
|
||||||
|
void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
|
uint64_t value);
|
||||||
|
|
||||||
#endif /* TARGET_ARM_CPREGS_H */
|
#endif /* TARGET_ARM_CPREGS_H */
|
||||||
|
@ -4784,15 +4784,6 @@ int e2_tlbmask(CPUARMState *env)
|
|||||||
ARMMMUIdxBit_E2);
|
ARMMMUIdxBit_E2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tlbi_aa64_alle3_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
|
||||||
uint64_t value)
|
|
||||||
{
|
|
||||||
ARMCPU *cpu = env_archcpu(env);
|
|
||||||
CPUState *cs = CPU(cpu);
|
|
||||||
|
|
||||||
tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E3);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
uint64_t value)
|
uint64_t value)
|
||||||
{
|
{
|
||||||
@ -4811,29 +4802,14 @@ void tlbi_aa64_alle2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
|||||||
tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
|
tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
uint64_t value)
|
uint64_t value)
|
||||||
{
|
{
|
||||||
CPUState *cs = env_cpu(env);
|
CPUState *cs = env_cpu(env);
|
||||||
|
|
||||||
tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E3);
|
tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E3);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
|
||||||
uint64_t value)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Invalidate by VA, EL3
|
|
||||||
* Currently handles both VAE3 and VALE3, since we don't support
|
|
||||||
* flush-last-level-only.
|
|
||||||
*/
|
|
||||||
ARMCPU *cpu = env_archcpu(env);
|
|
||||||
CPUState *cs = CPU(cpu);
|
|
||||||
uint64_t pageaddr = sextract64(value << 12, 0, 56);
|
|
||||||
|
|
||||||
tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E3);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
uint64_t value)
|
uint64_t value)
|
||||||
{
|
{
|
||||||
@ -4856,8 +4832,8 @@ void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
|||||||
tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
|
tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
uint64_t value)
|
uint64_t value)
|
||||||
{
|
{
|
||||||
CPUState *cs = env_cpu(env);
|
CPUState *cs = env_cpu(env);
|
||||||
uint64_t pageaddr = sextract64(value << 12, 0, 56);
|
uint64_t pageaddr = sextract64(value << 12, 0, 56);
|
||||||
@ -6223,30 +6199,6 @@ static const ARMCPRegInfo el3_cp_reginfo[] = {
|
|||||||
.opc0 = 3, .opc1 = 6, .crn = 5, .crm = 1, .opc2 = 1,
|
.opc0 = 3, .opc1 = 6, .crn = 5, .crm = 1, .opc2 = 1,
|
||||||
.access = PL3_RW, .type = ARM_CP_CONST,
|
.access = PL3_RW, .type = ARM_CP_CONST,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "TLBI_ALLE3IS", .state = ARM_CP_STATE_AA64,
|
|
||||||
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 0,
|
|
||||||
.access = PL3_W, .type = ARM_CP_NO_RAW,
|
|
||||||
.writefn = tlbi_aa64_alle3is_write },
|
|
||||||
{ .name = "TLBI_VAE3IS", .state = ARM_CP_STATE_AA64,
|
|
||||||
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 1,
|
|
||||||
.access = PL3_W, .type = ARM_CP_NO_RAW,
|
|
||||||
.writefn = tlbi_aa64_vae3is_write },
|
|
||||||
{ .name = "TLBI_VALE3IS", .state = ARM_CP_STATE_AA64,
|
|
||||||
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 5,
|
|
||||||
.access = PL3_W, .type = ARM_CP_NO_RAW,
|
|
||||||
.writefn = tlbi_aa64_vae3is_write },
|
|
||||||
{ .name = "TLBI_ALLE3", .state = ARM_CP_STATE_AA64,
|
|
||||||
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 0,
|
|
||||||
.access = PL3_W, .type = ARM_CP_NO_RAW,
|
|
||||||
.writefn = tlbi_aa64_alle3_write },
|
|
||||||
{ .name = "TLBI_VAE3", .state = ARM_CP_STATE_AA64,
|
|
||||||
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 1,
|
|
||||||
.access = PL3_W, .type = ARM_CP_NO_RAW,
|
|
||||||
.writefn = tlbi_aa64_vae3_write },
|
|
||||||
{ .name = "TLBI_VALE3", .state = ARM_CP_STATE_AA64,
|
|
||||||
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 5,
|
|
||||||
.access = PL3_W, .type = ARM_CP_NO_RAW,
|
|
||||||
.writefn = tlbi_aa64_vae3_write },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
@ -200,6 +200,15 @@ static void tlbi_aa64_alle2_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
|||||||
tlb_flush_by_mmuidx(cs, mask);
|
tlb_flush_by_mmuidx(cs, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tlbi_aa64_alle3_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
|
uint64_t value)
|
||||||
|
{
|
||||||
|
ARMCPU *cpu = env_archcpu(env);
|
||||||
|
CPUState *cs = CPU(cpu);
|
||||||
|
|
||||||
|
tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E3);
|
||||||
|
}
|
||||||
|
|
||||||
static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
uint64_t value)
|
uint64_t value)
|
||||||
{
|
{
|
||||||
@ -216,6 +225,21 @@ static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
|||||||
tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
|
tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
|
uint64_t value)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Invalidate by VA, EL3
|
||||||
|
* Currently handles both VAE3 and VALE3, since we don't support
|
||||||
|
* flush-last-level-only.
|
||||||
|
*/
|
||||||
|
ARMCPU *cpu = env_archcpu(env);
|
||||||
|
CPUState *cs = CPU(cpu);
|
||||||
|
uint64_t pageaddr = sextract64(value << 12, 0, 56);
|
||||||
|
|
||||||
|
tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E3);
|
||||||
|
}
|
||||||
|
|
||||||
static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
uint64_t value)
|
uint64_t value)
|
||||||
{
|
{
|
||||||
@ -511,6 +535,33 @@ static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = {
|
|||||||
.writefn = tlbi_aa64_vae2is_write },
|
.writefn = tlbi_aa64_vae2is_write },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const ARMCPRegInfo tlbi_el3_cp_reginfo[] = {
|
||||||
|
{ .name = "TLBI_ALLE3IS", .state = ARM_CP_STATE_AA64,
|
||||||
|
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 0,
|
||||||
|
.access = PL3_W, .type = ARM_CP_NO_RAW,
|
||||||
|
.writefn = tlbi_aa64_alle3is_write },
|
||||||
|
{ .name = "TLBI_VAE3IS", .state = ARM_CP_STATE_AA64,
|
||||||
|
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 1,
|
||||||
|
.access = PL3_W, .type = ARM_CP_NO_RAW,
|
||||||
|
.writefn = tlbi_aa64_vae3is_write },
|
||||||
|
{ .name = "TLBI_VALE3IS", .state = ARM_CP_STATE_AA64,
|
||||||
|
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 5,
|
||||||
|
.access = PL3_W, .type = ARM_CP_NO_RAW,
|
||||||
|
.writefn = tlbi_aa64_vae3is_write },
|
||||||
|
{ .name = "TLBI_ALLE3", .state = ARM_CP_STATE_AA64,
|
||||||
|
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 0,
|
||||||
|
.access = PL3_W, .type = ARM_CP_NO_RAW,
|
||||||
|
.writefn = tlbi_aa64_alle3_write },
|
||||||
|
{ .name = "TLBI_VAE3", .state = ARM_CP_STATE_AA64,
|
||||||
|
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 1,
|
||||||
|
.access = PL3_W, .type = ARM_CP_NO_RAW,
|
||||||
|
.writefn = tlbi_aa64_vae3_write },
|
||||||
|
{ .name = "TLBI_VALE3", .state = ARM_CP_STATE_AA64,
|
||||||
|
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 5,
|
||||||
|
.access = PL3_W, .type = ARM_CP_NO_RAW,
|
||||||
|
.writefn = tlbi_aa64_vae3_write },
|
||||||
|
};
|
||||||
|
|
||||||
void define_tlb_insn_regs(ARMCPU *cpu)
|
void define_tlb_insn_regs(ARMCPU *cpu)
|
||||||
{
|
{
|
||||||
CPUARMState *env = &cpu->env;
|
CPUARMState *env = &cpu->env;
|
||||||
@ -537,4 +588,7 @@ void define_tlb_insn_regs(ARMCPU *cpu)
|
|||||||
&& arm_feature(env, ARM_FEATURE_V8))) {
|
&& arm_feature(env, ARM_FEATURE_V8))) {
|
||||||
define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo);
|
define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo);
|
||||||
}
|
}
|
||||||
|
if (arm_feature(env, ARM_FEATURE_EL3)) {
|
||||||
|
define_arm_cp_regs(cpu, tlbi_el3_cp_reginfo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user