[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH target-arm v2 09/13] target-arm: Add registers f
From: |
Peter Maydell |
Subject: |
Re: [Qemu-devel] [PATCH target-arm v2 09/13] target-arm: Add registers for PMSAv7 |
Date: |
Mon, 15 Jun 2015 15:04:47 +0100 |
On 12 June 2015 at 20:10, Peter Crosthwaite
<address@hidden> wrote:
> Define the arm CP registers for PMSAv7 and their accessor functions.
> RGNR serves as a shared index that indexes into arrays storing the
> DRBAR, DRSR and DRACR registers. DRBAR and friends have to be VMSDd
> separately from the CP interface using a new PMSA specific VMSD
> subsection.
>
> Signed-off-by: Peter Crosthwaite <address@hidden>
> ---
> +static uint64_t pmsav7_read(CPUARMState *env, const ARMCPRegInfo *ri)
> +{
> + uint32_t *u32p = *(uint32_t **)raw_ptr(env, ri);
> +
> + u32p += env->cp15.c6_rgnr;
> + return *u32p;
> +}
> +
> +static void pmsav7_write(CPUARMState *env, const ARMCPRegInfo *ri,
> + uint64_t value)
> +{
> + ARMCPU *cpu = arm_env_get_cpu(env);
> + uint32_t *u32p = *(uint32_t **)raw_ptr(env, ri);
> +
> + u32p += env->cp15.c6_rgnr;
> + tlb_flush(CPU(cpu), 1); /* Mappings may have changed - purge! */
> + *u32p = value;
> +}
> +
> +static void pmsav7_reset(CPUARMState *env, const ARMCPRegInfo *ri)
> +{
> + ARMCPU *cpu = arm_env_get_cpu(env);
> + uint32_t *u32p = *(uint32_t **)raw_ptr(env, ri);
> +
> + memset(u32p, 0, sizeof(*u32p) * cpu->pmsav7_dregion);
> +}
> +
> +static void pmsav7_rgnr_write(CPUARMState *env, const ARMCPRegInfo *ri,
> + uint64_t value)
> +{
> + ARMCPU *cpu = arm_env_get_cpu(env);
> + uint32_t nrgs = cpu->pmsav7_dregion;
> +
> + if (value >= nrgs) {
> + qemu_log_mask(LOG_GUEST_ERROR,
> + "PMSAv7 RGNR write > # supported regions, %" PRIu32
> + " > %" PRIu32 "\n", (uint32_t)value, nrgs);
> + return;
> + }
> +
> + raw_write(env, ri, value);
> +}
I'm not wild about the pointer games going on in these
functions but I don't have a better suggestion.
> +static const ARMCPRegInfo pmsav7_cp_reginfo[] = {
> + { .name = "DRBAR", .cp = 15, .crn = 6, .opc1 = 0, .crm = 1, .opc2 = 0,
> + .access = PL1_RW, .type = ARM_CP_NO_RAW,
> + .fieldoffset = offsetof(CPUARMState, pmsav7.drbar),
> + .readfn = pmsav7_read, .writefn = pmsav7_write, .resetfn =
> pmsav7_reset },
> + { .name = "DRSR", .cp = 15, .crn = 6, .opc1 = 0, .crm = 1, .opc2 = 2,
> + .access = PL1_RW, .type = ARM_CP_NO_RAW,
> + .fieldoffset = offsetof(CPUARMState, pmsav7.drsr),
> + .readfn = pmsav7_read, .writefn = pmsav7_write, .resetfn =
> pmsav7_reset },
> + { .name = "DRACR", .cp = 15, .crn = 6, .opc1 = 0, .crm = 1, .opc2 = 4,
> + .access = PL1_RW, .type = ARM_CP_NO_RAW,
> + .fieldoffset = offsetof(CPUARMState, pmsav7.dracr),
> + .readfn = pmsav7_read, .writefn = pmsav7_write, .resetfn =
> pmsav7_reset },
> + { .name = "RGNR", .cp = 15, .crn = 6, .opc1 = 0, .crm = 2, .opc2 = 0,
> + .access = PL1_RW,
> + .fieldoffset = offsetof(CPUARMState, cp15.c6_rgnr),
> + .writefn = pmsav7_rgnr_write },
> + REGINFO_SENTINEL
> +};
> +
> static const ARMCPRegInfo pmsav5_cp_reginfo[] = {
> { .name = "DATA_AP", .cp = 15, .crn = 5, .crm = 0, .opc1 = 0, .opc2 = 0,
> .access = PL1_RW, .type = ARM_CP_ALIAS,
> @@ -3349,13 +3412,14 @@ void register_cp_regs_for_features(ARMCPU *cpu)
> define_one_arm_cp_reg(cpu, &rvbar);
> }
> if (arm_feature(env, ARM_FEATURE_MPU)) {
> - /* These are the MPU registers prior to PMSAv6. Any new
> - * PMSA core later than the ARM946 will require that we
> - * implement the PMSAv6 or PMSAv7 registers, which are
> - * completely different.
> - */
> - assert(!arm_feature(env, ARM_FEATURE_V6));
> - define_arm_cp_regs(cpu, pmsav5_cp_reginfo);
> + if (arm_feature(env, ARM_FEATURE_V6)) {
> + /* PMSAv6 not implemented */
> + assert(arm_feature(env, ARM_FEATURE_V7));
> + define_arm_cp_regs(cpu, vmsa_pmsa_cp_reginfo);
> + define_arm_cp_regs(cpu, pmsav7_cp_reginfo);
> + } else {
> + define_arm_cp_regs(cpu, pmsav5_cp_reginfo);
> + }
> } else {
> define_arm_cp_regs(cpu, vmsa_pmsa_cp_reginfo);
> define_arm_cp_regs(cpu, vmsa_cp_reginfo);
> diff --git a/target-arm/machine.c b/target-arm/machine.c
> index 9446e5a..ae0f7b1 100644
> --- a/target-arm/machine.c
> +++ b/target-arm/machine.c
> @@ -121,6 +121,38 @@ static const VMStateDescription vmstate_thumb2ee = {
> }
> };
>
> +static bool pmsav7_needed(void *opaque)
> +{
> + ARMCPU *cpu = opaque;
> + CPUARMState *env = &cpu->env;
> +
> + return arm_feature(env, ARM_FEATURE_MPU) &&
> + arm_feature(env, ARM_FEATURE_V7);
> +}
> +
> +static bool pmsav7_rgnr_vmstate_validate(void *opaque, int version_id)
> +{
> + ARMCPU *cpu = opaque;
> +
> + return cpu->env.cp15.c6_rgnr < cpu->pmsav7_dregion;
> +}
> +
> +static const VMStateDescription vmstate_pmsav7 = {
> + .name = "cpu/pmsav7",
> + .version_id = 1,
> + .minimum_version_id = 1,
> + .fields = (VMStateField[]) {
> + VMSTATE_VARRAY_UINT32(env.pmsav7.drbar, ARMCPU, pmsav7_dregion, 0,
> + vmstate_info_uint32, uint32_t),
> + VMSTATE_VARRAY_UINT32(env.pmsav7.drsr, ARMCPU, pmsav7_dregion, 0,
> + vmstate_info_uint32, uint32_t),
> + VMSTATE_VARRAY_UINT32(env.pmsav7.dracr, ARMCPU, pmsav7_dregion, 0,
> + vmstate_info_uint32, uint32_t),
> + VMSTATE_VALIDATE("rgnr is valid", pmsav7_rgnr_vmstate_validate),
> + VMSTATE_END_OF_LIST()
> + }
> +};
> +
> static int get_cpsr(QEMUFile *f, void *opaque, size_t size)
> {
> ARMCPU *cpu = opaque;
> @@ -296,6 +328,9 @@ const VMStateDescription vmstate_arm_cpu = {
> .vmsd = &vmstate_thumb2ee,
> .needed = thumb2ee_needed,
> } , {
> + .vmsd = &vmstate_pmsav7,
> + .needed = pmsav7_needed,
> + } , {
You'll find this has changed as of commit 5cd8cadae8db -- the
needed function goes in the vmstate_pmsav7 VMStateDescription now.
Otherwise
Reviewed-by: Peter Maydell <address@hidden>
thanks
-- PMM
- [Qemu-devel] [PATCH target-arm v2 03/13] arm: helper: Factor out CP regs common to [pv]msa, (continued)
- [Qemu-devel] [PATCH target-arm v2 03/13] arm: helper: Factor out CP regs common to [pv]msa, Peter Crosthwaite, 2015/06/12
- [Qemu-devel] [PATCH target-arm v2 04/13] arm: Refactor get_phys_addr FSR return mechanism, Peter Crosthwaite, 2015/06/12
- [Qemu-devel] [PATCH target-arm v2 05/13] arm: Implement uniprocessor with MP config, Peter Crosthwaite, 2015/06/12
- [Qemu-devel] [PATCH target-arm v2 06/13] arm: Add has-mpu property, Peter Crosthwaite, 2015/06/12
- [Qemu-devel] [PATCH target-arm v2 07/13] target-arm/helper.c: define MPUIR register, Peter Crosthwaite, 2015/06/12
- [Qemu-devel] [PATCH target-arm v2 08/13] arm: helper: rename get_phys_addr_mpu, Peter Crosthwaite, 2015/06/12
- [Qemu-devel] [PATCH target-arm v2 09/13] target-arm: Add registers for PMSAv7, Peter Crosthwaite, 2015/06/12
- Re: [Qemu-devel] [PATCH target-arm v2 09/13] target-arm: Add registers for PMSAv7,
Peter Maydell <=
- [Qemu-devel] [PATCH target-arm v2 11/13] target-arm: Add support for Cortex-R5, Peter Crosthwaite, 2015/06/12
- [Qemu-devel] [PATCH target-arm v2 10/13] target-arm: Implement PMSAv7 MPU, Peter Crosthwaite, 2015/06/12
- [Qemu-devel] [PATCH target-arm v2 12/13] arm: xlnx-zynqmp: Preface CPU variables with "apu", Peter Crosthwaite, 2015/06/12
- [Qemu-devel] [PATCH target-arm v2 13/13] arm: xlnx-zynqmp: Add 2xCortexR5 CPUs, Peter Crosthwaite, 2015/06/12
- Re: [Qemu-devel] [PATCH target-arm v2 00/13] ARM Cortex R5 Support, Peter Maydell, 2015/06/15