diff options
author | Soby Mathew <soby.mathew@arm.com> | 2016-08-31 12:34:33 +0100 |
---|---|---|
committer | Soby Mathew <soby.mathew@arm.com> | 2016-08-31 18:14:07 +0100 |
commit | 9e3b4cbbade36bb38a4a96381f0aca1b48ccaa0c (patch) | |
tree | 6b91319c2ac499b1a66b1b14bc36003255066cab | |
parent | 51c79b7351ba99f8d6ad6c3045cc8fb10b413b4a (diff) |
AArch32: Fix SCTLR context initialization
This patch fixes a bug in context management library when writing
SCTLR register during context initialization. The write happened
prior to initialization of the register context pointer. This
resulted in the compiler optimizing the write sequence from the
final binary and hence SCTLR remains uninitialized when
entering normal world. The bug is fixed by doing the
initialization of the register context pointer earlier in the
sequence.
Change-Id: Ic7465593a74534046b79f40446ffa1165c52ed76
-rw-r--r-- | lib/el3_runtime/aarch32/context_mgmt.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/el3_runtime/aarch32/context_mgmt.c b/lib/el3_runtime/aarch32/context_mgmt.c index 6915ded7..bc5f9c42 100644 --- a/lib/el3_runtime/aarch32/context_mgmt.c +++ b/lib/el3_runtime/aarch32/context_mgmt.c @@ -86,6 +86,8 @@ static void cm_init_context_common(cpu_context_t *ctx, const entry_point_info_t /* Clear any residual register values from the context */ memset(ctx, 0, sizeof(*ctx)); + reg_ctx = get_regs_ctx(ctx); + /* * Base the context SCR on the current value, adjust for entry point * specific requirements @@ -121,8 +123,6 @@ static void cm_init_context_common(cpu_context_t *ctx, const entry_point_info_t if (GET_M32(ep->spsr) == MODE32_hyp) scr |= SCR_HCE_BIT; - reg_ctx = get_regs_ctx(ctx); - write_ctx_reg(reg_ctx, CTX_SCR, scr); write_ctx_reg(reg_ctx, CTX_LR, ep->pc); write_ctx_reg(reg_ctx, CTX_SPSR, ep->spsr); |