Skip to content

Commit

Permalink
Reset debug registers MDCR-EL3/SDCR and MDCR_EL2/HDCR
Browse files Browse the repository at this point in the history
In order to avoid unexpected traps into EL3/MON mode, this patch
resets the debug registers, MDCR_EL3 and MDCR_EL2 for AArch64,
and SDCR and HDCR for AArch32.

MDCR_EL3/SDCR is zero'ed when EL3/MON mode is entered, at the
start of BL1 and BL31/SMP_MIN.

For MDCR_EL2/HDCR, this patch zero's the bits that are
architecturally UNKNOWN values on reset. This is done when
exiting from EL3/MON mode but only on platforms that support
EL2/HYP mode but choose to exit to EL1/SVC mode.

Fixes ARM-software/tf-issues#430

Change-Id: Idb992232163c072faa08892251b5626ae4c3a5b6
Signed-off-by: David Cunado <david.cunado@arm.com>
  • Loading branch information
davidcunado-arm committed Nov 9, 2016
1 parent 90d2956 commit 495f3d3
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 1 deletion.
8 changes: 8 additions & 0 deletions include/common/aarch32/el3_common_macros.S
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,14 @@
orr r0, r0, #SCR_SIF_BIT
stcopr r0, SCR

/* -----------------------------------------------------------------
* Reset those registers that may have architecturally unknown reset
* values
* -----------------------------------------------------------------
*/
mov r0, #0
stcopr r0, SDCR

/* -----------------------------------------------------
* Enable the Asynchronous data abort now that the
* exception vectors have been setup.
Expand Down
7 changes: 7 additions & 0 deletions include/common/aarch64/el3_common_macros.S
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,13 @@
*/
mov x0, #(SCR_RES1_BITS | SCR_EA_BIT | SCR_SIF_BIT)
msr scr_el3, x0

/* ---------------------------------------------------------------------
* Reset registers that may have architecturally unknown reset values
* ---------------------------------------------------------------------
*/
msr mdcr_el3, xzr

/* ---------------------------------------------------------------------
* Enable External Aborts and SError Interrupts now that the exception
* vectors have been setup.
Expand Down
10 changes: 10 additions & 0 deletions include/lib/aarch32/arch.h
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,11 @@

#define MAX_CACHE_LINE_SIZE 0x800 /* 2KB */

/* PMCR definitions */
#define PMCR_N_SHIFT 11
#define PMCR_N_MASK 0x1f
#define PMCR_N_BITS (PMCR_N_MASK << PMCR_N_SHIFT)

/*******************************************************************************
* Definitions of register offsets and fields in the CNTCTLBase Frame of the
* system level implementation of the Generic Timer.
Expand Down Expand Up @@ -375,6 +380,11 @@
#define CSSELR p15, 2, c0, c0, 0
#define CCSIDR p15, 1, c0, c0, 0

/* Debug register defines. The format is: coproc, opt1, CRn, CRm, opt2 */
#define HDCR p15, 4, c1, c1, 1
#define SDCR p15, 0, c1, c3, 1
#define PMCR p15, 0, c9, c12, 0

/* GICv3 CPU Interface system register defines. The format is: coproc, opt1, CRn, CRm, opt2 */
#define ICC_IAR1 p15, 0, c12, c12, 0
#define ICC_IAR0 p15, 0, c12, c8, 0
Expand Down
3 changes: 3 additions & 0 deletions include/lib/aarch32/arch_helpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,9 @@ DEFINE_COPROCR_RW_FUNCS(icc_iar1_el1, ICC_IAR1)
DEFINE_COPROCR_RW_FUNCS(icc_eoir0_el1, ICC_EOIR0)
DEFINE_COPROCR_RW_FUNCS(icc_eoir1_el1, ICC_EOIR1)

DEFINE_COPROCR_RW_FUNCS(hdcr, HDCR)
DEFINE_COPROCR_READ_FUNC(pmcr, PMCR)

/*
* TLBI operation prototypes
*/
Expand Down
5 changes: 5 additions & 0 deletions include/lib/aarch64/arch.h
Original file line number Diff line number Diff line change
Expand Up @@ -411,4 +411,9 @@
#define CNTACR_RWVT_SHIFT 0x4
#define CNTACR_RWPT_SHIFT 0x5

/* PMCR_EL0 definitions */
#define PMCR_EL0_N_SHIFT 11
#define PMCR_EL0_N_MASK 0x1f
#define PMCR_EL0_N_BITS (PMCR_EL0_N_MASK << PMCR_EL0_N_SHIFT)

#endif /* __ARCH_H__ */
3 changes: 3 additions & 0 deletions include/lib/aarch64/arch_helpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,9 @@ DEFINE_SYSREG_READ_FUNC(isr_el1)

DEFINE_SYSREG_READ_FUNC(ctr_el0)

DEFINE_SYSREG_RW_FUNCS(mdcr_el2)
DEFINE_SYSREG_READ_FUNC(pmcr_el0)

DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el1, ICC_SRE_EL1)
DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el2, ICC_SRE_EL2)
DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el3, ICC_SRE_EL3)
Expand Down
14 changes: 13 additions & 1 deletion lib/el3_runtime/aarch32/context_mgmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,10 @@ void cm_prepare_el3_exit(uint32_t security_state)
isb();
} else if (read_id_pfr1() &
(ID_PFR1_VIRTEXT_MASK << ID_PFR1_VIRTEXT_SHIFT)) {
/* Set the NS bit to access HCR, HCPTR, CNTHCTL, VPIDR, VMPIDR */
/*
* Set the NS bit to access NS copies of certain banked
* registers
*/
write_scr(read_scr() | SCR_NS_BIT);
isb();

Expand Down Expand Up @@ -231,6 +234,15 @@ void cm_prepare_el3_exit(uint32_t security_state)
* translation are disabled.
*/
write64_vttbr(0);

/*
* Avoid unexpected debug traps in case where HDCR
* is not completely reset by the hardware - set
* HDCR.HPMN to PMCR.N and zero the remaining bits.
* The HDCR.HPMN and PMCR.N fields are the same size
* (5 bits) and HPMN is at offset zero within HDCR.
*/
write_hdcr((read_pmcr() & PMCR_N_BITS) >> PMCR_N_SHIFT);
isb();

write_scr(read_scr() & ~SCR_NS_BIT);
Expand Down
10 changes: 10 additions & 0 deletions lib/el3_runtime/aarch64/context_mgmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,16 @@ void cm_prepare_el3_exit(uint32_t security_state)
* translation are disabled.
*/
write_vttbr_el2(0);
/*
* Avoid unexpected debug traps in case where MDCR_EL2
* is not completely reset by the hardware - set
* MDCR_EL2.HPMN to PMCR_EL0.N and zero the remaining
* bits.
* MDCR_EL2.HPMN and PMCR_EL0.N fields are the same size
* (5 bits) and HPMN is at offset zero within MDCR_EL2.
*/
write_mdcr_el2((read_pmcr_el0() & PMCR_EL0_N_BITS)
>> PMCR_EL0_N_SHIFT);
}
}

Expand Down

0 comments on commit 495f3d3

Please sign in to comment.