mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
target/arm: Move cortex sysregs into a separate file
The file cpu_tcg.c is about to be moved into the tcg/ directory, so move the register definitions into a new file. Also move the function declaration to the more appropriate cpregs.h. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Fabiano Rosas <farosas@suse.de> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-id: 20230426180013.14814-2-farosas@suse.de Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
7c18f2d663
commit
34bfe46732
6 changed files with 77 additions and 65 deletions
69
target/arm/cortex-regs.c
Normal file
69
target/arm/cortex-regs.c
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
* ARM Cortex-A registers
|
||||||
|
*
|
||||||
|
* This code is licensed under the GNU GPL v2 or later.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
|
#include "cpu.h"
|
||||||
|
#include "cpregs.h"
|
||||||
|
|
||||||
|
|
||||||
|
static uint64_t l2ctlr_read(CPUARMState *env, const ARMCPRegInfo *ri)
|
||||||
|
{
|
||||||
|
ARMCPU *cpu = env_archcpu(env);
|
||||||
|
|
||||||
|
/* Number of cores is in [25:24]; otherwise we RAZ */
|
||||||
|
return (cpu->core_count - 1) << 24;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const ARMCPRegInfo cortex_a72_a57_a53_cp_reginfo[] = {
|
||||||
|
{ .name = "L2CTLR_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
|
.opc0 = 3, .opc1 = 1, .crn = 11, .crm = 0, .opc2 = 2,
|
||||||
|
.access = PL1_RW, .readfn = l2ctlr_read,
|
||||||
|
.writefn = arm_cp_write_ignore },
|
||||||
|
{ .name = "L2CTLR",
|
||||||
|
.cp = 15, .opc1 = 1, .crn = 9, .crm = 0, .opc2 = 2,
|
||||||
|
.access = PL1_RW, .readfn = l2ctlr_read,
|
||||||
|
.writefn = arm_cp_write_ignore },
|
||||||
|
{ .name = "L2ECTLR_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
|
.opc0 = 3, .opc1 = 1, .crn = 11, .crm = 0, .opc2 = 3,
|
||||||
|
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
||||||
|
{ .name = "L2ECTLR",
|
||||||
|
.cp = 15, .opc1 = 1, .crn = 9, .crm = 0, .opc2 = 3,
|
||||||
|
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
||||||
|
{ .name = "L2ACTLR", .state = ARM_CP_STATE_BOTH,
|
||||||
|
.opc0 = 3, .opc1 = 1, .crn = 15, .crm = 0, .opc2 = 0,
|
||||||
|
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
||||||
|
{ .name = "CPUACTLR_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
|
.opc0 = 3, .opc1 = 1, .crn = 15, .crm = 2, .opc2 = 0,
|
||||||
|
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
||||||
|
{ .name = "CPUACTLR",
|
||||||
|
.cp = 15, .opc1 = 0, .crm = 15,
|
||||||
|
.access = PL1_RW, .type = ARM_CP_CONST | ARM_CP_64BIT, .resetvalue = 0 },
|
||||||
|
{ .name = "CPUECTLR_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
|
.opc0 = 3, .opc1 = 1, .crn = 15, .crm = 2, .opc2 = 1,
|
||||||
|
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
||||||
|
{ .name = "CPUECTLR",
|
||||||
|
.cp = 15, .opc1 = 1, .crm = 15,
|
||||||
|
.access = PL1_RW, .type = ARM_CP_CONST | ARM_CP_64BIT, .resetvalue = 0 },
|
||||||
|
{ .name = "CPUMERRSR_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
|
.opc0 = 3, .opc1 = 1, .crn = 15, .crm = 2, .opc2 = 2,
|
||||||
|
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
||||||
|
{ .name = "CPUMERRSR",
|
||||||
|
.cp = 15, .opc1 = 2, .crm = 15,
|
||||||
|
.access = PL1_RW, .type = ARM_CP_CONST | ARM_CP_64BIT, .resetvalue = 0 },
|
||||||
|
{ .name = "L2MERRSR_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
|
.opc0 = 3, .opc1 = 1, .crn = 15, .crm = 2, .opc2 = 3,
|
||||||
|
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
||||||
|
{ .name = "L2MERRSR",
|
||||||
|
.cp = 15, .opc1 = 3, .crm = 15,
|
||||||
|
.access = PL1_RW, .type = ARM_CP_CONST | ARM_CP_64BIT, .resetvalue = 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
void define_cortex_a72_a57_a53_cp_reginfo(ARMCPU *cpu)
|
||||||
|
{
|
||||||
|
define_arm_cp_regs(cpu, cortex_a72_a57_a53_cp_reginfo);
|
||||||
|
}
|
|
@ -1071,4 +1071,10 @@ static inline bool arm_cpreg_in_idspace(const ARMCPRegInfo *ri)
|
||||||
ri->crn, ri->crm);
|
ri->crn, ri->crm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_USER_ONLY
|
||||||
|
static inline void define_cortex_a72_a57_a53_cp_reginfo(ARMCPU *cpu) { }
|
||||||
|
#else
|
||||||
|
void define_cortex_a72_a57_a53_cp_reginfo(ARMCPU *cpu);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* TARGET_ARM_CPREGS_H */
|
#endif /* TARGET_ARM_CPREGS_H */
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "qapi/visitor.h"
|
#include "qapi/visitor.h"
|
||||||
#include "hw/qdev-properties.h"
|
#include "hw/qdev-properties.h"
|
||||||
#include "internals.h"
|
#include "internals.h"
|
||||||
|
#include "cpregs.h"
|
||||||
|
|
||||||
static void aarch64_a35_initfn(Object *obj)
|
static void aarch64_a35_initfn(Object *obj)
|
||||||
{
|
{
|
||||||
|
|
|
@ -93,65 +93,6 @@ void aa32_max_features(ARMCPU *cpu)
|
||||||
cpu->isar.id_dfr0 = t;
|
cpu->isar.id_dfr0 = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
|
||||||
static uint64_t l2ctlr_read(CPUARMState *env, const ARMCPRegInfo *ri)
|
|
||||||
{
|
|
||||||
ARMCPU *cpu = env_archcpu(env);
|
|
||||||
|
|
||||||
/* Number of cores is in [25:24]; otherwise we RAZ */
|
|
||||||
return (cpu->core_count - 1) << 24;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const ARMCPRegInfo cortex_a72_a57_a53_cp_reginfo[] = {
|
|
||||||
{ .name = "L2CTLR_EL1", .state = ARM_CP_STATE_AA64,
|
|
||||||
.opc0 = 3, .opc1 = 1, .crn = 11, .crm = 0, .opc2 = 2,
|
|
||||||
.access = PL1_RW, .readfn = l2ctlr_read,
|
|
||||||
.writefn = arm_cp_write_ignore },
|
|
||||||
{ .name = "L2CTLR",
|
|
||||||
.cp = 15, .opc1 = 1, .crn = 9, .crm = 0, .opc2 = 2,
|
|
||||||
.access = PL1_RW, .readfn = l2ctlr_read,
|
|
||||||
.writefn = arm_cp_write_ignore },
|
|
||||||
{ .name = "L2ECTLR_EL1", .state = ARM_CP_STATE_AA64,
|
|
||||||
.opc0 = 3, .opc1 = 1, .crn = 11, .crm = 0, .opc2 = 3,
|
|
||||||
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
|
||||||
{ .name = "L2ECTLR",
|
|
||||||
.cp = 15, .opc1 = 1, .crn = 9, .crm = 0, .opc2 = 3,
|
|
||||||
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
|
||||||
{ .name = "L2ACTLR", .state = ARM_CP_STATE_BOTH,
|
|
||||||
.opc0 = 3, .opc1 = 1, .crn = 15, .crm = 0, .opc2 = 0,
|
|
||||||
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
|
||||||
{ .name = "CPUACTLR_EL1", .state = ARM_CP_STATE_AA64,
|
|
||||||
.opc0 = 3, .opc1 = 1, .crn = 15, .crm = 2, .opc2 = 0,
|
|
||||||
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
|
||||||
{ .name = "CPUACTLR",
|
|
||||||
.cp = 15, .opc1 = 0, .crm = 15,
|
|
||||||
.access = PL1_RW, .type = ARM_CP_CONST | ARM_CP_64BIT, .resetvalue = 0 },
|
|
||||||
{ .name = "CPUECTLR_EL1", .state = ARM_CP_STATE_AA64,
|
|
||||||
.opc0 = 3, .opc1 = 1, .crn = 15, .crm = 2, .opc2 = 1,
|
|
||||||
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
|
||||||
{ .name = "CPUECTLR",
|
|
||||||
.cp = 15, .opc1 = 1, .crm = 15,
|
|
||||||
.access = PL1_RW, .type = ARM_CP_CONST | ARM_CP_64BIT, .resetvalue = 0 },
|
|
||||||
{ .name = "CPUMERRSR_EL1", .state = ARM_CP_STATE_AA64,
|
|
||||||
.opc0 = 3, .opc1 = 1, .crn = 15, .crm = 2, .opc2 = 2,
|
|
||||||
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
|
||||||
{ .name = "CPUMERRSR",
|
|
||||||
.cp = 15, .opc1 = 2, .crm = 15,
|
|
||||||
.access = PL1_RW, .type = ARM_CP_CONST | ARM_CP_64BIT, .resetvalue = 0 },
|
|
||||||
{ .name = "L2MERRSR_EL1", .state = ARM_CP_STATE_AA64,
|
|
||||||
.opc0 = 3, .opc1 = 1, .crn = 15, .crm = 2, .opc2 = 3,
|
|
||||||
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
|
||||||
{ .name = "L2MERRSR",
|
|
||||||
.cp = 15, .opc1 = 3, .crm = 15,
|
|
||||||
.access = PL1_RW, .type = ARM_CP_CONST | ARM_CP_64BIT, .resetvalue = 0 },
|
|
||||||
};
|
|
||||||
|
|
||||||
void define_cortex_a72_a57_a53_cp_reginfo(ARMCPU *cpu)
|
|
||||||
{
|
|
||||||
define_arm_cp_regs(cpu, cortex_a72_a57_a53_cp_reginfo);
|
|
||||||
}
|
|
||||||
#endif /* !CONFIG_USER_ONLY */
|
|
||||||
|
|
||||||
/* CPU models. These are not needed for the AArch64 linux-user build. */
|
/* CPU models. These are not needed for the AArch64 linux-user build. */
|
||||||
#if !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64)
|
#if !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64)
|
||||||
|
|
||||||
|
|
|
@ -1376,12 +1376,6 @@ uint32_t arm_v7m_mrs_control(CPUARMState *env, uint32_t secure);
|
||||||
uint32_t *arm_v7m_get_sp_ptr(CPUARMState *env, bool secure,
|
uint32_t *arm_v7m_get_sp_ptr(CPUARMState *env, bool secure,
|
||||||
bool threadmode, bool spsel);
|
bool threadmode, bool spsel);
|
||||||
|
|
||||||
#ifdef CONFIG_USER_ONLY
|
|
||||||
static inline void define_cortex_a72_a57_a53_cp_reginfo(ARMCPU *cpu) { }
|
|
||||||
#else
|
|
||||||
void define_cortex_a72_a57_a53_cp_reginfo(ARMCPU *cpu);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool el_is_in_host(CPUARMState *env, int el);
|
bool el_is_in_host(CPUARMState *env, int el);
|
||||||
|
|
||||||
void aa32_max_features(ARMCPU *cpu);
|
void aa32_max_features(ARMCPU *cpu);
|
||||||
|
|
|
@ -21,6 +21,7 @@ arm_softmmu_ss.add(files(
|
||||||
'arch_dump.c',
|
'arch_dump.c',
|
||||||
'arm-powerctl.c',
|
'arm-powerctl.c',
|
||||||
'arm-qmp-cmds.c',
|
'arm-qmp-cmds.c',
|
||||||
|
'cortex-regs.c',
|
||||||
'machine.c',
|
'machine.c',
|
||||||
'ptw.c',
|
'ptw.c',
|
||||||
))
|
))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue