target-arm: Allow STATE_BOTH reginfo descriptions for more than cp14

Currently the STATE_BOTH shorthand for allowing a single reginfo struct
to define handling for both AArch32 and AArch64 views of a register
only permits this where the AArch32 view is in cp15. It turns out that
the debug registers in cp14 also have neatly lined up encodings;
allow these also to share reginfo structs by permitting a STATE_BOTH
reginfo to specify the .cp field (and continue to default to 15 if
it is not specified).

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
This commit is contained in:
Peter Maydell 2014-08-19 18:56:25 +01:00
parent 503006983a
commit 58a1d8ceab

View File

@ -2800,9 +2800,11 @@ static void add_cpreg_to_hashtable(ARMCPU *cpu, const ARMCPRegInfo *r,
/* The AArch32 view of a shared register sees the lower 32 bits /* The AArch32 view of a shared register sees the lower 32 bits
* of a 64 bit backing field. It is not migratable as the AArch64 * of a 64 bit backing field. It is not migratable as the AArch64
* view handles that. AArch64 also handles reset. * view handles that. AArch64 also handles reset.
* We assume it is a cp15 register. * We assume it is a cp15 register if the .cp field is left unset.
*/ */
r2->cp = 15; if (r2->cp == 0) {
r2->cp = 15;
}
r2->type |= ARM_CP_NO_MIGRATE; r2->type |= ARM_CP_NO_MIGRATE;
r2->resetfn = arm_cp_reset_ignore; r2->resetfn = arm_cp_reset_ignore;
#ifdef HOST_WORDS_BIGENDIAN #ifdef HOST_WORDS_BIGENDIAN
@ -2815,8 +2817,11 @@ static void add_cpreg_to_hashtable(ARMCPU *cpu, const ARMCPRegInfo *r,
/* To allow abbreviation of ARMCPRegInfo /* To allow abbreviation of ARMCPRegInfo
* definitions, we treat cp == 0 as equivalent to * definitions, we treat cp == 0 as equivalent to
* the value for "standard guest-visible sysreg". * the value for "standard guest-visible sysreg".
* STATE_BOTH definitions are also always "standard
* sysreg" in their AArch64 view (the .cp value may
* be non-zero for the benefit of the AArch32 view).
*/ */
if (r->cp == 0) { if (r->cp == 0 || r->state == ARM_CP_STATE_BOTH) {
r2->cp = CP_REG_ARM64_SYSREG_CP; r2->cp = CP_REG_ARM64_SYSREG_CP;
} }
*key = ENCODE_AA64_CP_REG(r2->cp, r2->crn, crm, *key = ENCODE_AA64_CP_REG(r2->cp, r2->crn, crm,