On Fri, Apr 11, 2014 at 2:15 AM, Peter Maydell <peter.mayd...@linaro.org> wrote:
> In ARMv8 the 32 bit coprocessor ID register space is tidied up to
> remove the wildcarded aliases of the MIDR and the RAZ behaviour
> for the unassigned space where crm = 3..7. Make sure we don't
> expose thes wildcards for v8 cores. This means we need to have
> a specific implementation for REVIDR, an IMPDEF register which
> may be the same as the MIDR (and which we always implement as such).
>
> Signed-off-by: Peter Maydell <peter.mayd...@linaro.org>
> ---
>  target-arm/helper.c | 60 
> +++++++++++++++++++++++++++++++++++++----------------
>  1 file changed, 42 insertions(+), 18 deletions(-)
>
> diff --git a/target-arm/helper.c b/target-arm/helper.c
> index 398c8f5..20952c3 100644
> --- a/target-arm/helper.c
> +++ b/target-arm/helper.c
> @@ -2258,8 +2258,9 @@ void register_cp_regs_for_features(ARMCPU *cpu)
>       * be read-only (ie write causes UNDEF exception).
>       */
>      {
> -        ARMCPRegInfo id_cp_reginfo[] = {
> -            /* Note that the MIDR isn't a simple constant register because
> +        ARMCPRegInfo id_old_midr_cp_reginfo[] = {

"old" is fairly ambiguous and tends to change definition quickly. Can
you be more specific with:

id_pre_v8_midr_cp_reginfo

> +            /* Pre-v8 MIDR space.

And then this is self documented.

Otherwise,

Reviewed-by: Peter Crosthwaite <peter.crosthwa...@xilinx.com>

> +             * Note that the MIDR isn't a simple constant register because
>               * of the TI925 behaviour where writes to another register can
>               * cause the MIDR value to change.
>               *
> @@ -2273,22 +2274,6 @@ void register_cp_regs_for_features(ARMCPU *cpu)
>                .writefn = arm_cp_write_ignore, .raw_writefn = raw_write,
>                .fieldoffset = offsetof(CPUARMState, cp15.c0_cpuid),
>                .type = ARM_CP_OVERRIDE },
> -            { .name = "MIDR_EL1", .state = ARM_CP_STATE_AA64,
> -              .opc0 = 3, .opc1 = 0, .opc2 = 0, .crn = 0, .crm = 0,
> -              .access = PL1_R, .resetvalue = cpu->midr, .type = ARM_CP_CONST 
> },
> -            { .name = "CTR",
> -              .cp = 15, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 1,
> -              .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = cpu->ctr 
> },
> -            { .name = "CTR_EL0", .state = ARM_CP_STATE_AA64,
> -              .opc0 = 3, .opc1 = 3, .opc2 = 1, .crn = 0, .crm = 0,
> -              .access = PL0_R, .accessfn = ctr_el0_access,
> -              .type = ARM_CP_CONST, .resetvalue = cpu->ctr },
> -            { .name = "TCMTR",
> -              .cp = 15, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 2,
> -              .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = 0 },
> -            { .name = "TLBTR",
> -              .cp = 15, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 3,
> -              .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = 0 },
>              /* crn = 0 op1 = 0 crm = 3..7 : currently unassigned; we RAZ. */
>              { .name = "DUMMY",
>                .cp = 15, .crn = 0, .crm = 3, .opc1 = 0, .opc2 = CP_ANY,
> @@ -2307,6 +2292,37 @@ void register_cp_regs_for_features(ARMCPU *cpu)
>                .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = 0 },
>              REGINFO_SENTINEL
>          };
> +        ARMCPRegInfo id_v8_midr_cp_reginfo[] = {
> +            /* v8 MIDR -- the wildcard isn't necessary, and nor is the
> +             * variable-MIDR TI925 behaviour. Instead we have a single
> +             * (strictly speaking IMPDEF) alias of the MIDR, REVIDR.
> +             */
> +            { .name = "MIDR_EL1", .state = ARM_CP_STATE_BOTH,
> +              .opc0 = 3, .opc1 = 0, .crn = 0, .crm = 0, .opc2 = 0,
> +              .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = cpu->midr 
> },
> +            { .name = "REVIDR_EL1", .state = ARM_CP_STATE_BOTH,
> +              .opc0 = 3, .opc1 = 0, .crn = 0, .crm = 0, .opc2 = 6,
> +              .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = cpu->midr 
> },
> +            REGINFO_SENTINEL
> +        };
> +        ARMCPRegInfo id_cp_reginfo[] = {
> +            /* These are common to v8 and pre-v8 */
> +            { .name = "CTR",
> +              .cp = 15, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 1,
> +              .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = cpu->ctr 
> },
> +            { .name = "CTR_EL0", .state = ARM_CP_STATE_AA64,
> +              .opc0 = 3, .opc1 = 3, .opc2 = 1, .crn = 0, .crm = 0,
> +              .access = PL0_R, .accessfn = ctr_el0_access,
> +              .type = ARM_CP_CONST, .resetvalue = cpu->ctr },
> +            /* TCMTR and TLBTR exist in v8 but have no 64-bit versions */
> +            { .name = "TCMTR",
> +              .cp = 15, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 2,
> +              .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = 0 },
> +            { .name = "TLBTR",
> +              .cp = 15, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 3,
> +              .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = 0 },
> +            REGINFO_SENTINEL
> +        };
>          ARMCPRegInfo crn0_wi_reginfo = {
>              .name = "CRN0_WI", .cp = 15, .crn = 0, .crm = CP_ANY,
>              .opc1 = CP_ANY, .opc2 = CP_ANY, .access = PL1_W,
> @@ -2321,10 +2337,18 @@ void register_cp_regs_for_features(ARMCPU *cpu)
>               * UNDEF.
>               */
>              define_one_arm_cp_reg(cpu, &crn0_wi_reginfo);
> +            for (r = id_old_midr_cp_reginfo; r->type != ARM_CP_SENTINEL; 
> r++) {
> +                r->access = PL1_RW;
> +            }
>              for (r = id_cp_reginfo; r->type != ARM_CP_SENTINEL; r++) {
>                  r->access = PL1_RW;
>              }
>          }
> +        if (arm_feature(env, ARM_FEATURE_V8)) {
> +            define_arm_cp_regs(cpu, id_v8_midr_cp_reginfo);
> +        } else {
> +            define_arm_cp_regs(cpu, id_old_midr_cp_reginfo);
> +        }
>          define_arm_cp_regs(cpu, id_cp_reginfo);
>      }
>
> --
> 1.9.1
>
>

Reply via email to