target/arm: Fix big-endian host handling of VTCR
We have a bug in our handling of accesses to the AArch32 VTCR register on big-endian hosts: we were not adjusting the part of the uint64_t field within TCR that the generated code would access. That can be done with offsetoflow32(), by using an ARM_CP_STATE_BOTH cpreg struct, or by defining a full set of read/write/reset functions -- the various other TCR cpreg structs used one or another of those strategies, but for VTCR we did not, so on a big-endian host VTCR accesses would touch the wrong half of the register. Use offsetoflow32() in the VTCR register struct. This works even though the field in the CPU struct is currently a struct TCR, because the first field in that struct is the uint64_t raw_tcr. None of the other TCR registers have this bug -- either they are AArch64 only, or else they define resetfn, writefn, etc, and expect to be passed the full struct pointer. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20220714132303.1287193-5-peter.maydell@linaro.org
This commit is contained in:
parent
c1547bba7e
commit
afbb181c2d
@ -5409,7 +5409,7 @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
|
|||||||
.cp = 15, .opc1 = 4, .crn = 2, .crm = 1, .opc2 = 2,
|
.cp = 15, .opc1 = 4, .crn = 2, .crm = 1, .opc2 = 2,
|
||||||
.type = ARM_CP_ALIAS,
|
.type = ARM_CP_ALIAS,
|
||||||
.access = PL2_RW, .accessfn = access_el3_aa32ns,
|
.access = PL2_RW, .accessfn = access_el3_aa32ns,
|
||||||
.fieldoffset = offsetof(CPUARMState, cp15.vtcr_el2) },
|
.fieldoffset = offsetoflow32(CPUARMState, cp15.vtcr_el2) },
|
||||||
{ .name = "VTCR_EL2", .state = ARM_CP_STATE_AA64,
|
{ .name = "VTCR_EL2", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 4, .crn = 2, .crm = 1, .opc2 = 2,
|
.opc0 = 3, .opc1 = 4, .crn = 2, .crm = 1, .opc2 = 2,
|
||||||
.access = PL2_RW,
|
.access = PL2_RW,
|
||||||
|
Loading…
Reference in New Issue
Block a user