target-arm: Fix handling of SDCR for 32-bit code
Fix two issues with our implementation of the SDCR: * it is only present from ARMv8 onwards * it does not contain several of the trap bits present in its 64-bit counterpart the MDCR_EL3 Put the register description in the right place so that it does not get enabled for ARMv7 and earlier, and give it a write function so that we can mask out the bits which should not be allowed to have an effect if EL3 is 32-bit. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 1455892784-11328-2-git-send-email-peter.maydell@linaro.org Reviewed-by: Sergey Fedorov <serge.fdrv@gmail.com> Acked-by: Alistair Francis <alistair.francis@xilinx.com>
This commit is contained in:
parent
10eacda787
commit
a8d64e7351
@ -598,6 +598,7 @@ void pmccntr_sync(CPUARMState *env);
|
|||||||
#define MDCR_EDAD (1U << 20)
|
#define MDCR_EDAD (1U << 20)
|
||||||
#define MDCR_SPME (1U << 17)
|
#define MDCR_SPME (1U << 17)
|
||||||
#define MDCR_SDD (1U << 16)
|
#define MDCR_SDD (1U << 16)
|
||||||
|
#define MDCR_SPD (3U << 14)
|
||||||
#define MDCR_TDRA (1U << 11)
|
#define MDCR_TDRA (1U << 11)
|
||||||
#define MDCR_TDOSA (1U << 10)
|
#define MDCR_TDOSA (1U << 10)
|
||||||
#define MDCR_TDA (1U << 9)
|
#define MDCR_TDA (1U << 9)
|
||||||
@ -606,6 +607,9 @@ void pmccntr_sync(CPUARMState *env);
|
|||||||
#define MDCR_TPM (1U << 6)
|
#define MDCR_TPM (1U << 6)
|
||||||
#define MDCR_TPMCR (1U << 5)
|
#define MDCR_TPMCR (1U << 5)
|
||||||
|
|
||||||
|
/* Not all of the MDCR_EL3 bits are present in the 32-bit SDCR */
|
||||||
|
#define SDCR_VALID_MASK (MDCR_EPMAD | MDCR_EDAD | MDCR_SPME | MDCR_SPD)
|
||||||
|
|
||||||
#define CPSR_M (0x1fU)
|
#define CPSR_M (0x1fU)
|
||||||
#define CPSR_T (1U << 5)
|
#define CPSR_T (1U << 5)
|
||||||
#define CPSR_F (1U << 6)
|
#define CPSR_F (1U << 6)
|
||||||
|
@ -3037,6 +3037,12 @@ static CPAccessResult fpexc32_access(CPUARMState *env, const ARMCPRegInfo *ri,
|
|||||||
return CP_ACCESS_OK;
|
return CP_ACCESS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sdcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
|
uint64_t value)
|
||||||
|
{
|
||||||
|
env->cp15.mdcr_el3 = value & SDCR_VALID_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
static const ARMCPRegInfo v8_cp_reginfo[] = {
|
static const ARMCPRegInfo v8_cp_reginfo[] = {
|
||||||
/* Minimal set of EL0-visible registers. This will need to be expanded
|
/* Minimal set of EL0-visible registers. This will need to be expanded
|
||||||
* significantly for system emulation of AArch64 CPUs.
|
* significantly for system emulation of AArch64 CPUs.
|
||||||
@ -3331,6 +3337,15 @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
|
|||||||
.opc0 = 3, .opc1 = 4, .crn = 4, .crm = 3, .opc2 = 3,
|
.opc0 = 3, .opc1 = 4, .crn = 4, .crm = 3, .opc2 = 3,
|
||||||
.access = PL2_RW,
|
.access = PL2_RW,
|
||||||
.fieldoffset = offsetof(CPUARMState, banked_spsr[BANK_FIQ]) },
|
.fieldoffset = offsetof(CPUARMState, banked_spsr[BANK_FIQ]) },
|
||||||
|
{ .name = "MDCR_EL3", .state = ARM_CP_STATE_AA64,
|
||||||
|
.opc0 = 3, .opc1 = 6, .crn = 1, .crm = 3, .opc2 = 1,
|
||||||
|
.resetvalue = 0,
|
||||||
|
.access = PL3_RW, .fieldoffset = offsetof(CPUARMState, cp15.mdcr_el3) },
|
||||||
|
{ .name = "SDCR", .type = ARM_CP_ALIAS,
|
||||||
|
.cp = 15, .opc1 = 0, .crn = 1, .crm = 3, .opc2 = 1,
|
||||||
|
.access = PL1_RW, .accessfn = access_trap_aa32s_el1,
|
||||||
|
.writefn = sdcr_write,
|
||||||
|
.fieldoffset = offsetoflow32(CPUARMState, cp15.mdcr_el3) },
|
||||||
REGINFO_SENTINEL
|
REGINFO_SENTINEL
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3688,14 +3703,6 @@ static const ARMCPRegInfo el3_cp_reginfo[] = {
|
|||||||
.access = PL1_RW, .accessfn = access_trap_aa32s_el1,
|
.access = PL1_RW, .accessfn = access_trap_aa32s_el1,
|
||||||
.fieldoffset = offsetoflow32(CPUARMState, cp15.scr_el3),
|
.fieldoffset = offsetoflow32(CPUARMState, cp15.scr_el3),
|
||||||
.writefn = scr_write },
|
.writefn = scr_write },
|
||||||
{ .name = "MDCR_EL3", .state = ARM_CP_STATE_AA64,
|
|
||||||
.opc0 = 3, .opc1 = 6, .crn = 1, .crm = 3, .opc2 = 1,
|
|
||||||
.resetvalue = 0,
|
|
||||||
.access = PL3_RW, .fieldoffset = offsetof(CPUARMState, cp15.mdcr_el3) },
|
|
||||||
{ .name = "SDCR", .type = ARM_CP_ALIAS,
|
|
||||||
.cp = 15, .opc1 = 0, .crn = 1, .crm = 3, .opc2 = 1,
|
|
||||||
.access = PL1_RW, .accessfn = access_trap_aa32s_el1,
|
|
||||||
.fieldoffset = offsetoflow32(CPUARMState, cp15.mdcr_el3) },
|
|
||||||
{ .name = "SDER32_EL3", .state = ARM_CP_STATE_AA64,
|
{ .name = "SDER32_EL3", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 6, .crn = 1, .crm = 1, .opc2 = 1,
|
.opc0 = 3, .opc1 = 6, .crn = 1, .crm = 1, .opc2 = 1,
|
||||||
.access = PL3_RW, .resetvalue = 0,
|
.access = PL3_RW, .resetvalue = 0,
|
||||||
|
Loading…
Reference in New Issue
Block a user