Skip to content

Commit cc503ab

Browse files
committed
target/arm: Make dummy debug registers RAZ, not NOP
In debug_helper.c we provide a few dummy versions of debug registers: * DBGVCR (AArch32 only): enable bits for vector-catch debug events * MDCCINT_EL1: interrupt enable bits for the DCC debug communications channel * DBGVCR32_EL2: the AArch64 accessor for the state in DBGVCR We implemented these only to stop Linux crashing on startup, but we chose to implement them as ARM_CP_NOP. This worked for Linux where it only cares about trying to write to these registers, but is very confusing behaviour for anything that wants to read the registers (perhaps for context state switches), because the destination register will be left with whatever random value it happened to have before the read. Model these registers instead as RAZ. Fixes: 5e8b12f ("target-arm: Implement minimal DBGVCR, OSDLR_EL1, MDCCSR_EL0") Fixes: 5dbdc43 ("target-arm: Implement dummy MDCCINT_EL1") Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2708 Signed-off-by: Peter Maydell <[email protected]> Reviewed-by: Richard Henderson <[email protected]> Message-id: [email protected]
1 parent 5be4419 commit cc503ab

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

target/arm/debug_helper.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,7 +1037,7 @@ static const ARMCPRegInfo debug_cp_reginfo[] = {
10371037
{ .name = "DBGVCR",
10381038
.cp = 14, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 0,
10391039
.access = PL1_RW, .accessfn = access_tda,
1040-
.type = ARM_CP_NOP },
1040+
.type = ARM_CP_CONST, .resetvalue = 0 },
10411041
/*
10421042
* Dummy MDCCINT_EL1, since we don't implement the Debug Communications
10431043
* Channel but Linux may try to access this register. The 32-bit
@@ -1046,7 +1046,7 @@ static const ARMCPRegInfo debug_cp_reginfo[] = {
10461046
{ .name = "MDCCINT_EL1", .state = ARM_CP_STATE_BOTH,
10471047
.cp = 14, .opc0 = 2, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 0,
10481048
.access = PL1_RW, .accessfn = access_tdcc,
1049-
.type = ARM_CP_NOP },
1049+
.type = ARM_CP_CONST, .resetvalue = 0 },
10501050
/*
10511051
* Dummy DBGCLAIM registers.
10521052
* "The architecture does not define any functionality for the CLAIM tag bits.",
@@ -1075,7 +1075,8 @@ static const ARMCPRegInfo debug_aa32_el1_reginfo[] = {
10751075
{ .name = "DBGVCR32_EL2", .state = ARM_CP_STATE_AA64,
10761076
.opc0 = 2, .opc1 = 4, .crn = 0, .crm = 7, .opc2 = 0,
10771077
.access = PL2_RW, .accessfn = access_dbgvcr32,
1078-
.type = ARM_CP_NOP | ARM_CP_EL3_NO_EL2_KEEP },
1078+
.type = ARM_CP_CONST | ARM_CP_EL3_NO_EL2_KEEP,
1079+
.resetvalue = 0 },
10791080
};
10801081

10811082
static const ARMCPRegInfo debug_lpae_cp_reginfo[] = {

0 commit comments

Comments
 (0)