Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Disable secure self-hosted debug #841

Merged
merged 2 commits into from Feb 20, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions include/common/aarch32/el3_common_macros.S
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,11 @@
orr r0, r0, #FPEXC_EN_BIT
vmsr FPEXC, r0
isb

/* Disable secure self-hosted invasive debug. */
ldr r0, =SDCR_DEF_VAL
stcopr r0, SDCR

.endm

/* -----------------------------------------------------------------------------
Expand Down
5 changes: 3 additions & 2 deletions include/common/aarch64/el3_common_macros.S
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,11 @@
msr scr_el3, x0

/* ---------------------------------------------------------------------
* Reset registers that may have architecturally unknown reset values
* Disable secure self-hosted invasive debug.
* ---------------------------------------------------------------------
*/
msr mdcr_el3, xzr
mov_imm x0, MDCR_DEF_VAL
msr mdcr_el3, x0

/* ---------------------------------------------------------------------
* Enable External Aborts and SError Interrupts now that the exception
Expand Down
9 changes: 9 additions & 0 deletions include/lib/aarch32/arch.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,14 @@
#define SCTLR_AFE_BIT (1 << 29)
#define SCTLR_TE_BIT (1 << 30)

/* SDCR definitions */
#define SDCR_SPD(x) ((x) << 14)
#define SDCR_SPD_LEGACY 0x0
#define SDCR_SPD_DISABLE 0x2
#define SDCR_SPD_ENABLE 0x3

#define SDCR_DEF_VAL SDCR_SPD(SDCR_SPD_DISABLE)

/* HSCTLR definitions */
#define HSCTLR_RES1 ((1 << 29) | (1 << 28) | (1 << 23) | (1 << 22) \
| (1 << 18) | (1 << 16) | (1 << 11) | (1 << 4) \
Expand Down Expand Up @@ -345,6 +353,7 @@
/* System register defines The format is: coproc, opt1, CRn, CRm, opt2 */
#define SCR p15, 0, c1, c1, 0
#define SCTLR p15, 0, c1, c0, 0
#define SDCR p15, 0, c1, c3, 1
#define MPIDR p15, 0, c0, c0, 5
#define MIDR p15, 0, c0, c0, 0
#define VBAR p15, 0, c12, c0, 0
Expand Down
9 changes: 9 additions & 0 deletions include/lib/aarch64/arch.h
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,15 @@
#define SCR_NS_BIT (1 << 0)
#define SCR_VALID_BIT_MASK 0x2f8f

/* MDCR definitions */
#define MDCR_SPD32(x) ((x) << 14)
#define MDCR_SPD32_LEGACY 0x0
#define MDCR_SPD32_DISABLE 0x2
#define MDCR_SPD32_ENABLE 0x3
#define MDCR_SDD_BIT (1 << 16)

#define MDCR_DEF_VAL (MDCR_SDD_BIT | MDCR_SPD32(MDCR_SPD32_DISABLE))

/* HCR definitions */
#define HCR_RW_BIT (1ull << 31)
#define HCR_AMO_BIT (1 << 5)
Expand Down
7 changes: 7 additions & 0 deletions include/plat/arm/css/common/css_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,13 @@
#define SSC_VERSION_DESIGNER_ID_MASK 0xff
#define SSC_VERSION_PART_NUM_MASK 0xfff

/* SSC debug configuration registers */
#define SSC_DBGCFG_SET 0x14
#define SSC_DBGCFG_CLR 0x18

#define SPIDEN_INT_CLR_SHIFT 6
#define SPIDEN_SEL_SET_SHIFT 7

#ifndef __ASSEMBLY__

/* SSC_VERSION related accessors */
Expand Down
20 changes: 19 additions & 1 deletion plat/arm/board/juno/juno_security.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,17 +59,35 @@ static void css_init_nic400(void)
~0);
}

/*******************************************************************************
* Initialize debug configuration.
******************************************************************************/
static void init_debug_cfg(void)
{
#if !DEBUG
/* Set internal drive selection for SPIDEN. */
mmio_write_32(SSC_REG_BASE + SSC_DBGCFG_SET,
1U << SPIDEN_SEL_SET_SHIFT);

/* Drive SPIDEN LOW to disable invasive debug of secure state. */
mmio_write_32(SSC_REG_BASE + SSC_DBGCFG_CLR,
1U << SPIDEN_INT_CLR_SHIFT);
#endif
}

/*******************************************************************************
* Initialize the secure environment.
******************************************************************************/
void plat_arm_security_setup(void)
{
/* Initialize debug configuration */
init_debug_cfg();
/* Initialize the TrustZone Controller */
arm_tzc400_setup();
/* Do ARM CSS internal NIC setup */
css_init_nic400();
/* Do ARM CSS SoC security setup */
soc_css_security_setup();
/* Initialize the SMMU SSD tables*/
/* Initialize the SMMU SSD tables */
init_mmu401();
}