Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
81602a97
Commit
81602a97
authored
May 22, 2017
by
danh-arm
Committed by
GitHub
May 22, 2017
Browse files
Merge pull request #939 from dp-arm/dp/AArch32_tbbr
Add TBBR and FWU support for AArch32
parents
ac7b0da6
6ba71d65
Changes
29
Show whitespace changes
Inline
Side-by-side
Makefile
View file @
81602a97
...
@@ -51,6 +51,7 @@ INC_DIRS_TO_CHECK := $(sort $(filter-out \
...
@@ -51,6 +51,7 @@ INC_DIRS_TO_CHECK := $(sort $(filter-out \
include/lib,
\
include/lib,
\
$(
wildcard
include/
*
)))
$(
wildcard
include/
*
)))
LIB_DIRS_TO_CHECK
:=
$(
sort
$(
filter-out
\
LIB_DIRS_TO_CHECK
:=
$(
sort
$(
filter-out
\
lib/compiler-rt
\
lib/libfdt%
\
lib/libfdt%
\
lib/stdlib,
\
lib/stdlib,
\
$(
wildcard
lib/
*
)))
$(
wildcard
lib/
*
)))
...
@@ -144,6 +145,7 @@ LDFLAGS += --gc-sections
...
@@ -144,6 +145,7 @@ LDFLAGS += --gc-sections
################################################################################
################################################################################
# Common sources and include directories
# Common sources and include directories
################################################################################
################################################################################
include
lib/compiler-rt/compiler-rt.mk
include
lib/stdlib/stdlib.mk
include
lib/stdlib/stdlib.mk
BL_COMMON_SOURCES
+=
common/bl_common.c
\
BL_COMMON_SOURCES
+=
common/bl_common.c
\
...
@@ -153,6 +155,7 @@ BL_COMMON_SOURCES += common/bl_common.c \
...
@@ -153,6 +155,7 @@ BL_COMMON_SOURCES += common/bl_common.c \
lib/
${ARCH}
/misc_helpers.S
\
lib/
${ARCH}
/misc_helpers.S
\
plat/common/
${ARCH}
/plat_common.c
\
plat/common/
${ARCH}
/plat_common.c
\
plat/common/
${ARCH}
/platform_helpers.S
\
plat/common/
${ARCH}
/platform_helpers.S
\
${COMPILER_RT_SRCS}
\
${STDLIB_SRCS}
${STDLIB_SRCS}
INCLUDES
+=
-Iinclude
/bl1
\
INCLUDES
+=
-Iinclude
/bl1
\
...
@@ -258,6 +261,25 @@ endif
...
@@ -258,6 +261,25 @@ endif
# This can be overridden by the platform.
# This can be overridden by the platform.
include
lib/cpus/cpu-ops.mk
include
lib/cpus/cpu-ops.mk
ifeq
(${ARCH},aarch32)
NEED_BL32
:=
yes
################################################################################
# Build `AARCH32_SP` as BL32 image for AArch32
################################################################################
ifneq
(${AARCH32_SP},none)
# We expect to locate an sp.mk under the specified AARCH32_SP directory
AARCH32_SP_MAKE
:=
$(
wildcard
bl32/
${AARCH32_SP}
/
${AARCH32_SP}
.mk
)
ifeq
(${AARCH32_SP_MAKE},)
$(error Error
:
No bl32/${AARCH32_SP}/${AARCH32_SP}.mk located)
endif
$(info
Including
${AARCH32_SP_MAKE})
include
${AARCH32_SP_MAKE}
endif
endif
################################################################################
################################################################################
# Check incompatible options
# Check incompatible options
...
@@ -282,15 +304,11 @@ ifeq (${NEED_BL33},yes)
...
@@ -282,15 +304,11 @@ ifeq (${NEED_BL33},yes)
endif
endif
endif
endif
# For AArch32, LOAD_IMAGE_V2 must be enabled.
ifeq (${ARCH},aarch32)
ifeq (${ARCH},aarch32)
# For AArch32, LOAD_IMAGE_V2 must be enabled.
ifeq (${LOAD_IMAGE_V2}, 0)
ifeq (${LOAD_IMAGE_V2}, 0)
$(error "
For
AArch32,
LOAD_IMAGE_V2
must
be
enabled.
")
$(error "
For
AArch32,
LOAD_IMAGE_V2
must
be
enabled.
")
endif
endif
# TRUSTED_BOARD_BOOT is currently not supported for AArch32.
ifeq (${TRUSTED_BOARD_BOOT},1)
$(error "
TRUSTED_BOARD_BOOT
is
currently
not
supported
for
AArch32
")
endif
endif
endif
# When building for systems with hardware-assisted coherency, there's no need to
# When building for systems with hardware-assisted coherency, there's no need to
...
@@ -378,13 +396,13 @@ NEED_BL2 := yes
...
@@ -378,13 +396,13 @@ NEED_BL2 := yes
include bl2/bl2.mk
include bl2/bl2.mk
endif
endif
# For AArch32, BL31 is not applicable, and BL2U is not supported at present.
ifneq (${ARCH},aarch32)
ifdef BL2U_SOURCES
ifdef BL2U_SOURCES
NEED_BL2U := yes
NEED_BL2U := yes
include bl2u/bl2u.mk
include bl2u/bl2u.mk
endif
endif
# For AArch32, BL31 is not currently supported.
ifneq (${ARCH},aarch32)
ifdef BL31_SOURCES
ifdef BL31_SOURCES
# When booting an EL3 payload, there is no need to compile the BL31 image nor
# When booting an EL3 payload, there is no need to compile the BL31 image nor
# put it in the FIP.
# put it in the FIP.
...
@@ -395,26 +413,6 @@ endif
...
@@ -395,26 +413,6 @@ endif
endif
endif
endif
endif
ifeq (${ARCH},aarch32)
NEED_BL32 := yes
################################################################################
# Build `AARCH32_SP` as BL32 image for AArch32
################################################################################
ifneq (${AARCH32_SP},none)
# We expect to locate an sp.mk under the specified AARCH32_SP directory
AARCH32_SP_MAKE := $(wildcard bl32/${AARCH32_SP}/${AARCH32_SP}.mk)
ifeq (${AARCH32_SP_MAKE},)
$(error Error: No bl32/${AARCH32_SP}/${AARCH32_SP}.mk located)
endif
$(info Including ${AARCH32_SP_MAKE})
include ${AARCH32_SP_MAKE}
endif
endif
################################################################################
################################################################################
# Build options checks
# Build options checks
################################################################################
################################################################################
...
...
bl1/aarch32/bl1_context_mgmt.c
View file @
81602a97
...
@@ -74,6 +74,7 @@ static void copy_cpu_ctx_to_smc_ctx(const regs_t *cpu_reg_ctx,
...
@@ -74,6 +74,7 @@ static void copy_cpu_ctx_to_smc_ctx(const regs_t *cpu_reg_ctx,
next_smc_ctx
->
r3
=
read_ctx_reg
(
cpu_reg_ctx
,
CTX_GPREG_R3
);
next_smc_ctx
->
r3
=
read_ctx_reg
(
cpu_reg_ctx
,
CTX_GPREG_R3
);
next_smc_ctx
->
lr_mon
=
read_ctx_reg
(
cpu_reg_ctx
,
CTX_LR
);
next_smc_ctx
->
lr_mon
=
read_ctx_reg
(
cpu_reg_ctx
,
CTX_LR
);
next_smc_ctx
->
spsr_mon
=
read_ctx_reg
(
cpu_reg_ctx
,
CTX_SPSR
);
next_smc_ctx
->
spsr_mon
=
read_ctx_reg
(
cpu_reg_ctx
,
CTX_SPSR
);
next_smc_ctx
->
scr
=
read_ctx_reg
(
cpu_reg_ctx
,
CTX_SCR
);
}
}
/*******************************************************************************
/*******************************************************************************
...
@@ -140,6 +141,28 @@ void bl1_prepare_next_image(unsigned int image_id)
...
@@ -140,6 +141,28 @@ void bl1_prepare_next_image(unsigned int image_id)
copy_cpu_ctx_to_smc_ctx
(
get_regs_ctx
(
cm_get_next_context
()),
copy_cpu_ctx_to_smc_ctx
(
get_regs_ctx
(
cm_get_next_context
()),
smc_get_next_ctx
());
smc_get_next_ctx
());
/*
* If the next image is non-secure, then we need to program the banked
* non secure sctlr. This is not required when the next image is secure
* because in AArch32, we expect the secure world to have the same
* SCTLR settings.
*/
if
(
security_state
==
NON_SECURE
)
{
cpu_context_t
*
ctx
=
cm_get_context
(
security_state
);
u_register_t
ns_sctlr
;
/* Temporarily set the NS bit to access NS SCTLR */
write_scr
(
read_scr
()
|
SCR_NS_BIT
);
isb
();
ns_sctlr
=
read_ctx_reg
(
get_regs_ctx
(
ctx
),
CTX_NS_SCTLR
);
write_sctlr
(
ns_sctlr
);
isb
();
write_scr
(
read_scr
()
&
~
SCR_NS_BIT
);
isb
();
}
/*
/*
* Flush the SMC & CPU context and the (next)pointers,
* Flush the SMC & CPU context and the (next)pointers,
* to access them after caches are disabled.
* to access them after caches are disabled.
...
...
bl1/aarch32/bl1_entrypoint.S
View file @
81602a97
...
@@ -71,9 +71,21 @@ func bl1_entrypoint
...
@@ -71,9 +71,21 @@ func bl1_entrypoint
*/
*/
/
*
/
*
*
MMU
needs
to
be
disabled
because
both
BL1
and
BL2
execute
*
Get
the
smc_context
for
next
BL
image
,
*
program
the
gp
/
system
registers
and
save
it
in
`
r4
`
.
*/
bl
smc_get_next_ctx
mov
r4
,
r0
/
*
Only
turn
-
off
MMU
if
going
to
secure
world
*/
ldr
r5
,
[
r4
,
#
SMC_CTX_SCR
]
tst
r5
,
#
SCR_NS_BIT
bne
skip_mmu_off
/
*
*
MMU
needs
to
be
disabled
because
both
BL1
and
BL2
/
BL2U
execute
*
in
PL1
,
and
therefore
share
the
same
address
space
.
*
in
PL1
,
and
therefore
share
the
same
address
space
.
*
BL2
will
initialize
the
address
space
according
to
its
*
BL2
/
BL2U
will
initialize
the
address
space
according
to
its
*
own
requirement
.
*
own
requirement
.
*/
*/
bl
disable_mmu_icache_secure
bl
disable_mmu_icache_secure
...
@@ -81,20 +93,8 @@ func bl1_entrypoint
...
@@ -81,20 +93,8 @@ func bl1_entrypoint
dsb
sy
dsb
sy
isb
isb
/
*
Get
the
cpu_context
for
next
BL
image
*/
skip_mmu_off
:
bl
cm_get_next_context
/
*
Restore
smc_context
from
`
r4
`
and
exit
secure
monitor
mode
.
*/
mov
r0
,
r4
/
*
Restore
the
SCR
*/
monitor_exit
ldr
r2
,
[
r0
,
#
CTX_REGS_OFFSET
+
CTX_SCR
]
stcopr
r2
,
SCR
isb
/
*
*
Get
the
smc_context
for
next
BL
image
,
*
program
the
gp
/
system
registers
and
exit
*
secure
monitor
mode
*/
bl
smc_get_next_ctx
smcc_restore_gp_mode_regs
eret
endfunc
bl1_entrypoint
endfunc
bl1_entrypoint
bl1/aarch32/bl1_exceptions.S
View file @
81602a97
...
@@ -8,11 +8,18 @@
...
@@ -8,11 +8,18 @@
#include <asm_macros.S>
#include <asm_macros.S>
#include <bl1.h>
#include <bl1.h>
#include <bl_common.h>
#include <bl_common.h>
#include <context.h>
#include <smcc_helpers.h>
#include <smcc_macros.S>
#include <xlat_tables.h>
.
globl
bl1_aarch32_smc_handler
.
globl
bl1_aarch32_smc_handler
func
bl1_aarch32_smc_handler
func
bl1_aarch32_smc_handler
/
*
On
SMC
entry
,
`
sp
`
points
to
`
smc_ctx_t
`
.
Save
`
lr
`
.
*/
str
lr
,
[
sp
,
#
SMC_CTX_LR_MON
]
/
*
------------------------------------------------
/
*
------------------------------------------------
*
SMC
in
BL1
is
handled
assuming
that
the
MMU
is
*
SMC
in
BL1
is
handled
assuming
that
the
MMU
is
*
turned
off
by
BL2
.
*
turned
off
by
BL2
.
...
@@ -20,12 +27,12 @@ func bl1_aarch32_smc_handler
...
@@ -20,12 +27,12 @@ func bl1_aarch32_smc_handler
*/
*/
/
*
----------------------------------------------
/
*
----------------------------------------------
*
Only
RUN_IMAGE
SMC
is
supported
.
*
Detect
if
this
is
a
RUN_IMAGE
or
other
SMC
.
*
----------------------------------------------
*
----------------------------------------------
*/
*/
mov
r
8
,
#
BL1_SMC_RUN_IMAGE
mov
l
r
,
#
BL1_SMC_RUN_IMAGE
cmp
r
8
,
r0
cmp
l
r
,
r0
b
l
ne
report_exception
bne
smc_handler
/
*
------------------------------------------------
/
*
------------------------------------------------
*
Make
sure
only
Secure
world
reaches
here
.
*
Make
sure
only
Secure
world
reaches
here
.
...
@@ -70,3 +77,76 @@ debug_loop:
...
@@ -70,3 +77,76 @@ debug_loop:
ldm
r8
,
{
r0
,
r1
,
r2
,
r3
}
ldm
r8
,
{
r0
,
r1
,
r2
,
r3
}
eret
eret
endfunc
bl1_aarch32_smc_handler
endfunc
bl1_aarch32_smc_handler
/
*
-----------------------------------------------------
*
Save
Secure
/
Normal
world
context
and
jump
to
*
BL1
SMC
handler
.
*
-----------------------------------------------------
*/
func
smc_handler
/
*
-----------------------------------------------------
*
Save
the
GP
registers
.
*
-----------------------------------------------------
*/
smcc_save_gp_mode_regs
/
*
*
`
sp
`
still
points
to
`
smc_ctx_t
`
.
Save
it
to
a
register
*
and
restore
the
C
runtime
stack
pointer
to
`
sp
`
.
*/
mov
r6
,
sp
ldr
sp
,
[
r6
,
#
SMC_CTX_SP_MON
]
ldr
r0
,
[
r6
,
#
SMC_CTX_SCR
]
and
r7
,
r0
,
#
SCR_NS_BIT
/*
flags
*/
/
*
Switch
to
Secure
Mode
*/
bic
r0
,
#
SCR_NS_BIT
stcopr
r0
,
SCR
isb
/
*
If
caller
is
from
Secure
world
then
turn
on
the
MMU
*/
tst
r7
,
#
SCR_NS_BIT
bne
skip_mmu_on
/
*
Turn
on
the
MMU
*/
mov
r0
,
#
DISABLE_DCACHE
bl
enable_mmu_secure
/
*
Enable
the
data
cache
.
*/
ldcopr
r9
,
SCTLR
orr
r9
,
r9
,
#
SCTLR_C_BIT
stcopr
r9
,
SCTLR
isb
skip_mmu_on
:
/
*
Prepare
arguments
for
BL1
SMC
wrapper
.
*/
ldr
r0
,
[
r6
,
#
SMC_CTX_GPREG_R0
]
/*
smc_fid
*/
mov
r1
,
#
0
/*
cookie
*/
mov
r2
,
r6
/*
handle
*/
mov
r3
,
r7
/*
flags
*/
bl
bl1_smc_wrapper
/
*
Get
the
smc_context
for
next
BL
image
*/
bl
smc_get_next_ctx
mov
r4
,
r0
/
*
Only
turn
-
off
MMU
if
going
to
secure
world
*/
ldr
r5
,
[
r4
,
#
SMC_CTX_SCR
]
tst
r5
,
#
SCR_NS_BIT
bne
skip_mmu_off
/
*
Disable
the
MMU
*/
bl
disable_mmu_icache_secure
stcopr
r0
,
TLBIALL
dsb
sy
isb
skip_mmu_off
:
/
*
-----------------------------------------------------
*
Do
the
transition
to
next
BL
image
.
*
-----------------------------------------------------
*/
mov
r0
,
r4
monitor_exit
endfunc
smc_handler
bl1/bl1_fwu.c
View file @
81602a97
...
@@ -47,6 +47,8 @@ __dead2 static void bl1_fwu_done(void *client_cookie, void *reserved);
...
@@ -47,6 +47,8 @@ __dead2 static void bl1_fwu_done(void *client_cookie, void *reserved);
*/
*/
static
unsigned
int
sec_exec_image_id
=
INVALID_IMAGE_ID
;
static
unsigned
int
sec_exec_image_id
=
INVALID_IMAGE_ID
;
void
cm_set_next_context
(
void
*
cpu_context
);
/*******************************************************************************
/*******************************************************************************
* Top level handler for servicing FWU SMCs.
* Top level handler for servicing FWU SMCs.
******************************************************************************/
******************************************************************************/
...
@@ -364,8 +366,10 @@ static int bl1_fwu_image_execute(unsigned int image_id,
...
@@ -364,8 +366,10 @@ static int bl1_fwu_image_execute(unsigned int image_id,
INFO
(
"BL1-FWU: Executing Secure image
\n
"
);
INFO
(
"BL1-FWU: Executing Secure image
\n
"
);
#ifdef AARCH64
/* Save NS-EL1 system registers. */
/* Save NS-EL1 system registers. */
cm_el1_sysregs_context_save
(
NON_SECURE
);
cm_el1_sysregs_context_save
(
NON_SECURE
);
#endif
/* Prepare the image for execution. */
/* Prepare the image for execution. */
bl1_prepare_next_image
(
image_id
);
bl1_prepare_next_image
(
image_id
);
...
@@ -373,7 +377,11 @@ static int bl1_fwu_image_execute(unsigned int image_id,
...
@@ -373,7 +377,11 @@ static int bl1_fwu_image_execute(unsigned int image_id,
/* Update the secure image id. */
/* Update the secure image id. */
sec_exec_image_id
=
image_id
;
sec_exec_image_id
=
image_id
;
#ifdef AARCH64
*
handle
=
cm_get_context
(
SECURE
);
*
handle
=
cm_get_context
(
SECURE
);
#else
*
handle
=
smc_get_ctx
(
SECURE
);
#endif
return
0
;
return
0
;
}
}
...
@@ -419,6 +427,10 @@ static register_t bl1_fwu_image_resume(register_t image_param,
...
@@ -419,6 +427,10 @@ static register_t bl1_fwu_image_resume(register_t image_param,
resume_sec_state
=
SECURE
;
resume_sec_state
=
SECURE
;
}
}
INFO
(
"BL1-FWU: Resuming %s world context
\n
"
,
(
resume_sec_state
==
SECURE
)
?
"secure"
:
"normal"
);
#ifdef AARCH64
/* Save the EL1 system registers of calling world. */
/* Save the EL1 system registers of calling world. */
cm_el1_sysregs_context_save
(
caller_sec_state
);
cm_el1_sysregs_context_save
(
caller_sec_state
);
...
@@ -428,10 +440,16 @@ static register_t bl1_fwu_image_resume(register_t image_param,
...
@@ -428,10 +440,16 @@ static register_t bl1_fwu_image_resume(register_t image_param,
/* Update the next context. */
/* Update the next context. */
cm_set_next_eret_context
(
resume_sec_state
);
cm_set_next_eret_context
(
resume_sec_state
);
INFO
(
"BL1-FWU: Resuming %s world context
\n
"
,
(
resume_sec_state
==
SECURE
)
?
"secure"
:
"normal"
);
*
handle
=
cm_get_context
(
resume_sec_state
);
*
handle
=
cm_get_context
(
resume_sec_state
);
#else
/* Update the next context. */
cm_set_next_context
(
cm_get_context
(
resume_sec_state
));
/* Prepare the smc context for the next BL image. */
smc_set_next_ctx
(
resume_sec_state
);
*
handle
=
smc_get_ctx
(
resume_sec_state
);
#endif
return
image_param
;
return
image_param
;
}
}
...
@@ -461,6 +479,8 @@ static int bl1_fwu_sec_image_done(void **handle, unsigned int flags)
...
@@ -461,6 +479,8 @@ static int bl1_fwu_sec_image_done(void **handle, unsigned int flags)
image_desc
->
state
=
IMAGE_STATE_RESET
;
image_desc
->
state
=
IMAGE_STATE_RESET
;
sec_exec_image_id
=
INVALID_IMAGE_ID
;
sec_exec_image_id
=
INVALID_IMAGE_ID
;
INFO
(
"BL1-FWU: Resuming Normal world context
\n
"
);
#ifdef AARCH64
/*
/*
* Secure world is done so no need to save the context.
* Secure world is done so no need to save the context.
* Just restore the Non-Secure context.
* Just restore the Non-Secure context.
...
@@ -470,9 +490,16 @@ static int bl1_fwu_sec_image_done(void **handle, unsigned int flags)
...
@@ -470,9 +490,16 @@ static int bl1_fwu_sec_image_done(void **handle, unsigned int flags)
/* Update the next context. */
/* Update the next context. */
cm_set_next_eret_context
(
NON_SECURE
);
cm_set_next_eret_context
(
NON_SECURE
);
INFO
(
"BL1-FWU: Resuming Normal world context
\n
"
);
*
handle
=
cm_get_context
(
NON_SECURE
);
*
handle
=
cm_get_context
(
NON_SECURE
);
#else
/* Update the next context. */
cm_set_next_context
(
cm_get_context
(
NON_SECURE
));
/* Prepare the smc context for the next BL image. */
smc_set_next_ctx
(
NON_SECURE
);
*
handle
=
smc_get_ctx
(
NON_SECURE
);
#endif
return
0
;
return
0
;
}
}
...
...
bl1/bl1_main.c
View file @
81602a97
...
@@ -279,3 +279,20 @@ register_t bl1_smc_handler(unsigned int smc_fid,
...
@@ -279,3 +279,20 @@ register_t bl1_smc_handler(unsigned int smc_fid,
WARN
(
"Unimplemented BL1 SMC Call: 0x%x
\n
"
,
smc_fid
);
WARN
(
"Unimplemented BL1 SMC Call: 0x%x
\n
"
,
smc_fid
);
SMC_RET1
(
handle
,
SMC_UNK
);
SMC_RET1
(
handle
,
SMC_UNK
);
}
}
/*******************************************************************************
* BL1 SMC wrapper. This function is only used in AArch32 mode to ensure ABI
* compliance when invoking bl1_smc_handler.
******************************************************************************/
register_t
bl1_smc_wrapper
(
uint32_t
smc_fid
,
void
*
cookie
,
void
*
handle
,
unsigned
int
flags
)
{
register_t
x1
,
x2
,
x3
,
x4
;
assert
(
handle
);
get_smc_params_from_ctx
(
handle
,
x1
,
x2
,
x3
,
x4
);
return
bl1_smc_handler
(
smc_fid
,
x1
,
x2
,
x3
,
x4
,
cookie
,
handle
,
flags
);
}
bl2u/aarch32/bl2u_entrypoint.S
0 → 100644
View file @
81602a97
/*
*
Copyright
(
c
)
2016
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
SPDX
-
License
-
Identifier
:
BSD
-
3
-
Clause
*/
#include <arch.h>
#include <asm_macros.S>
#include <bl_common.h>
.
globl
bl2u_vector_table
.
globl
bl2u_entrypoint
vector_base
bl2u_vector_table
b
bl2u_entrypoint
b
report_exception
/*
Undef
*/
b
report_exception
/*
SVC
call
*/
b
report_exception
/*
Prefetch
abort
*/
b
report_exception
/*
Data
abort
*/
b
report_exception
/*
Reserved
*/
b
report_exception
/*
IRQ
*/
b
report_exception
/*
FIQ
*/
func
bl2u_entrypoint
/*---------------------------------------------
*
Save
from
r1
the
extents
of
the
trusted
ram
*
available
to
BL2U
for
future
use
.
*
r0
is
not
currently
used
.
*
---------------------------------------------
*/
mov
r11
,
r1
mov
r12
,
r2
/
*
---------------------------------------------
*
Set
the
exception
vector
to
something
sane
.
*
---------------------------------------------
*/
ldr
r0
,
=
bl2u_vector_table
stcopr
r0
,
VBAR
isb
/
*
-----------------------------------------------------
*
Enable
the
instruction
cache
*
-----------------------------------------------------
*/
ldcopr
r0
,
SCTLR
orr
r0
,
r0
,
#
SCTLR_I_BIT
stcopr
r0
,
SCTLR
isb
/
*
---------------------------------------------
*
Since
BL2U
executes
after
BL1
,
it
is
assumed
*
here
that
BL1
has
already
has
done
the
*
necessary
register
initializations
.
*
---------------------------------------------
*/
/
*
---------------------------------------------
*
Invalidate
the
RW
memory
used
by
the
BL2U
*
image
.
This
includes
the
data
and
NOBITS
*
sections
.
This
is
done
to
safeguard
against
*
possible
corruption
of
this
memory
by
dirty
*
cache
lines
in
a
system
cache
as
a
result
of
*
use
by
an
earlier
boot
loader
stage
.
*
---------------------------------------------
*/
ldr
r0
,
=
__RW_START__
ldr
r1
,
=
__RW_END__
sub
r1
,
r1
,
r0
bl
inv_dcache_range
/
*
---------------------------------------------
*
Zero
out
NOBITS
sections
.
There
are
2
of
them
:
*
-
the
.
bss
section
;
*
-
the
coherent
memory
section
.
*
---------------------------------------------
*/
ldr
r0
,
=
__BSS_START__
ldr
r1
,
=
__BSS_SIZE__
bl
zeromem
/
*
--------------------------------------------
*
Allocate
a
stack
whose
memory
will
be
marked
*
as
Normal
-
IS
-
WBWA
when
the
MMU
is
enabled
.
*
There
is
no
risk
of
reading
stale
stack
*
memory
after
enabling
the
MMU
as
only
the
*
primary
cpu
is
running
at
the
moment
.
*
--------------------------------------------
*/
bl
plat_set_my_stack
/
*
---------------------------------------------
*
Initialize
the
stack
protector
canary
before
*
any
C
code
is
called
.
*
---------------------------------------------
*/
#if STACK_PROTECTOR_ENABLED
bl
update_stack_protector_canary
#endif
/
*
---------------------------------------------
*
Perform
early
platform
setup
&
platform
*
specific
early
arch
.
setup
e
.
g
.
mmu
setup
*
---------------------------------------------
*/
mov
r0
,
r11
mov
r1
,
r12
bl
bl2u_early_platform_setup
bl
bl2u_plat_arch_setup
/
*
---------------------------------------------
*
Jump
to
main
function
.
*
---------------------------------------------
*/
bl
bl2u_main
/
*
---------------------------------------------
*
Should
never
reach
this
point
.
*
---------------------------------------------
*/
no_ret
plat_panic_handler
endfunc
bl2u_entrypoint
bl2u/bl2u.mk
View file @
81602a97
...
@@ -5,8 +5,11 @@
...
@@ -5,8 +5,11 @@
#
#
BL2U_SOURCES
+=
bl2u/bl2u_main.c
\
BL2U_SOURCES
+=
bl2u/bl2u_main.c
\
bl2u/aarch64/bl2u_entrypoint.S
\
bl2u/
${ARCH}
/bl2u_entrypoint.S
\
common/aarch64/early_exceptions.S
\
plat/common/
${ARCH}
/platform_up_stack.S
plat/common/aarch64/platform_up_stack.S
ifeq
(${ARCH},aarch64)
BL2U_SOURCES
+=
common/aarch64/early_exceptions.S
endif
BL2U_LINKERFILE
:=
bl2u/bl2u.ld.S
BL2U_LINKERFILE
:=
bl2u/bl2u.ld.S
bl2u/bl2u_main.c
View file @
81602a97
...
@@ -42,6 +42,15 @@ void bl2u_main(void)
...
@@ -42,6 +42,15 @@ void bl2u_main(void)
console_flush
();
console_flush
();
#ifdef AARCH32
/*
* For AArch32 state BL1 and BL2U share the MMU setup.
* Given that BL2U does not map BL1 regions, MMU needs
* to be disabled in order to go back to BL1.
*/
disable_mmu_icache_secure
();
#endif
/* AARCH32 */
/*
/*
* Indicate that BL2U is done and resume back to
* Indicate that BL2U is done and resume back to
* normal world via an SMC to BL1.
* normal world via an SMC to BL1.
...
...
bl32/sp_min/aarch32/entrypoint.S
View file @
81602a97
...
@@ -115,21 +115,10 @@ func sp_min_entrypoint
...
@@ -115,21 +115,10 @@ func sp_min_entrypoint
sub
r1
,
r1
,
r0
sub
r1
,
r1
,
r0
bl
clean_dcache_range
bl
clean_dcache_range
/
*
Program
the
registers
in
cpu_context
and
exit
monitor
mode
*/
mov
r0
,
#
NON_SECURE
bl
cm_get_context
/
*
Restore
the
SCR
*/
ldr
r2
,
[
r0
,
#
CTX_REGS_OFFSET
+
CTX_SCR
]
stcopr
r2
,
SCR
isb
/
*
Restore
the
SCTLR
*/
ldr
r2
,
[
r0
,
#
CTX_REGS_OFFSET
+
CTX_NS_SCTLR
]
stcopr
r2
,
SCTLR
bl
smc_get_next_ctx
bl
smc_get_next_ctx
/
*
The
other
cpu_context
registers
have
been
copied
to
smc
context
*/
/
*
r0
points
to
`
smc_ctx_t
`
*/
/
*
The
PSCI
cpu_context
registers
have
been
copied
to
`
smc_ctx_t
`
*/
b
sp_min_exit
b
sp_min_exit
endfunc
sp_min_entrypoint
endfunc
sp_min_entrypoint
...
@@ -138,46 +127,44 @@ endfunc sp_min_entrypoint
...
@@ -138,46 +127,44 @@ endfunc sp_min_entrypoint
*
SMC
handling
function
for
SP_MIN
.
*
SMC
handling
function
for
SP_MIN
.
*/
*/
func
handle_smc
func
handle_smc
smcc_save_gp_mode_regs
/
*
On
SMC
entry
,
`
sp
`
points
to
`
smc_ctx_t
`
.
Save
`
lr
`
.
*/
str
lr
,
[
sp
,
#
SMC_CTX_LR_MON
]
/
*
r0
points
to
smc_context
*/
smcc_save_gp_mode_regs
mov
r2
,
r0
/*
handle
*/
ldcopr
r0
,
SCR
/
*
/
*
*
Save
SCR
in
stack
.
r1
is
pushed
to
meet
the
8
by
te
*
`
sp
`
still
points
to
`
smc_ctx_t
`
.
Save
it
to
a
regis
te
r
*
stack
alignment
requirement
.
*
and
restore
the
C
runtime
stack
pointer
to
`
sp
`
.
*/
*/
push
{
r0
,
r1
}
mov
r2
,
sp
/*
handle
*/
ldr
sp
,
[
r2
,
#
SMC_CTX_SP_MON
]
ldr
r0
,
[
r2
,
#
SMC_CTX_SCR
]
and
r3
,
r0
,
#
SCR_NS_BIT
/*
flags
*/
and
r3
,
r0
,
#
SCR_NS_BIT
/*
flags
*/
/
*
Switch
to
Secure
Mode
*/
/
*
Switch
to
Secure
Mode
*/
bic
r0
,
#
SCR_NS_BIT
bic
r0
,
#
SCR_NS_BIT
stcopr
r0
,
SCR
stcopr
r0
,
SCR
isb
isb
ldr
r0
,
[
r2
,
#
SMC_CTX_GPREG_R0
]
/*
smc_fid
*/
ldr
r0
,
[
r2
,
#
SMC_CTX_GPREG_R0
]
/*
smc_fid
*/
/
*
Check
whether
an
SMC64
is
issued
*/
/
*
Check
whether
an
SMC64
is
issued
*/
tst
r0
,
#(
FUNCID_CC_MASK
<<
FUNCID_CC_SHIFT
)
tst
r0
,
#(
FUNCID_CC_MASK
<<
FUNCID_CC_SHIFT
)
beq
1
f
/*
SMC32
is
detected
*/
beq
1
f
/
*
SMC32
is
not
detected
.
Return
error
back
to
caller
*/
mov
r0
,
#
SMC_UNK
mov
r0
,
#
SMC_UNK
str
r0
,
[
r2
,
#
SMC_CTX_GPREG_R0
]
str
r0
,
[
r2
,
#
SMC_CTX_GPREG_R0
]
mov
r0
,
r2
mov
r0
,
r2
b
2
f
/*
Skip
handling
the
SMC
*/
b
sp_min_exit
1
:
1
:
/
*
SMC32
is
detected
*/
mov
r1
,
#
0
/*
cookie
*/
mov
r1
,
#
0
/*
cookie
*/
bl
handle_runtime_svc
bl
handle_runtime_svc
2
:
/
*
r0
points
to
smc
context
*/
/
*
Restore
SCR
from
stack
*/
pop
{
r1
,
r2
}
stcopr
r1
,
SCR
isb
/
*
`
r0
`
points
to
`
smc_ctx_t
`
*/
b
sp_min_exit
b
sp_min_exit
endfunc
handle_smc
endfunc
handle_smc
/*
/*
*
The
Warm
boot
entrypoint
for
SP_MIN
.
*
The
Warm
boot
entrypoint
for
SP_MIN
.
*/
*/
...
@@ -234,23 +221,9 @@ func sp_min_warm_entrypoint
...
@@ -234,23 +221,9 @@ func sp_min_warm_entrypoint
#endif
#endif
bl
sp_min_warm_boot
bl
sp_min_warm_boot
/
*
Program
the
registers
in
cpu_context
and
exit
monitor
mode
*/
mov
r0
,
#
NON_SECURE
bl
cm_get_context
/
*
Restore
the
SCR
*/
ldr
r2
,
[
r0
,
#
CTX_REGS_OFFSET
+
CTX_SCR
]
stcopr
r2
,
SCR
isb
/
*
Restore
the
SCTLR
*/
ldr
r2
,
[
r0
,
#
CTX_REGS_OFFSET
+
CTX_NS_SCTLR
]
stcopr
r2
,
SCTLR
bl
smc_get_next_ctx
bl
smc_get_next_ctx
/
*
r0
points
to
`
smc_ctx_t
`
*/
/
*
The
other
cpu_context
registers
have
been
copied
to
smc
context
*/
/
*
The
PSCI
cpu_context
registers
have
been
copied
to
`
smc
_ctx_t
`
*/
b
sp_min_exit
b
sp_min_exit
endfunc
sp_min_warm_entrypoint
endfunc
sp_min_warm_entrypoint
...
@@ -261,6 +234,5 @@ endfunc sp_min_warm_entrypoint
...
@@ -261,6 +234,5 @@ endfunc sp_min_warm_entrypoint
*
Arguments
:
r0
must
point
to
the
SMC
context
to
restore
from
.
*
Arguments
:
r0
must
point
to
the
SMC
context
to
restore
from
.
*/
*/
func
sp_min_exit
func
sp_min_exit
smcc_restore_gp_mode_regs
monitor_exit
eret
endfunc
sp_min_exit
endfunc
sp_min_exit
bl32/sp_min/sp_min_main.c
View file @
81602a97
...
@@ -101,6 +101,7 @@ static void copy_cpu_ctx_to_smc_stx(const regs_t *cpu_reg_ctx,
...
@@ -101,6 +101,7 @@ static void copy_cpu_ctx_to_smc_stx(const regs_t *cpu_reg_ctx,
next_smc_ctx
->
r0
=
read_ctx_reg
(
cpu_reg_ctx
,
CTX_GPREG_R0
);
next_smc_ctx
->
r0
=
read_ctx_reg
(
cpu_reg_ctx
,
CTX_GPREG_R0
);
next_smc_ctx
->
lr_mon
=
read_ctx_reg
(
cpu_reg_ctx
,
CTX_LR
);
next_smc_ctx
->
lr_mon
=
read_ctx_reg
(
cpu_reg_ctx
,
CTX_LR
);
next_smc_ctx
->
spsr_mon
=
read_ctx_reg
(
cpu_reg_ctx
,
CTX_SPSR
);
next_smc_ctx
->
spsr_mon
=
read_ctx_reg
(
cpu_reg_ctx
,
CTX_SPSR
);
next_smc_ctx
->
scr
=
read_ctx_reg
(
cpu_reg_ctx
,
CTX_SCR
);
}
}
/*******************************************************************************
/*******************************************************************************
...
@@ -111,6 +112,8 @@ static void copy_cpu_ctx_to_smc_stx(const regs_t *cpu_reg_ctx,
...
@@ -111,6 +112,8 @@ static void copy_cpu_ctx_to_smc_stx(const regs_t *cpu_reg_ctx,
static
void
sp_min_prepare_next_image_entry
(
void
)
static
void
sp_min_prepare_next_image_entry
(
void
)
{
{
entry_point_info_t
*
next_image_info
;
entry_point_info_t
*
next_image_info
;
cpu_context_t
*
ctx
=
cm_get_context
(
NON_SECURE
);
u_register_t
ns_sctlr
;
/* Program system registers to proceed to non-secure */
/* Program system registers to proceed to non-secure */
next_image_info
=
sp_min_plat_get_bl33_ep_info
();
next_image_info
=
sp_min_plat_get_bl33_ep_info
();
...
@@ -125,6 +128,16 @@ static void sp_min_prepare_next_image_entry(void)
...
@@ -125,6 +128,16 @@ static void sp_min_prepare_next_image_entry(void)
/* Copy r0, lr and spsr from cpu context to SMC context */
/* Copy r0, lr and spsr from cpu context to SMC context */
copy_cpu_ctx_to_smc_stx
(
get_regs_ctx
(
cm_get_context
(
NON_SECURE
)),
copy_cpu_ctx_to_smc_stx
(
get_regs_ctx
(
cm_get_context
(
NON_SECURE
)),
smc_get_next_ctx
());
smc_get_next_ctx
());
/* Temporarily set the NS bit to access NS SCTLR */
write_scr
(
read_scr
()
|
SCR_NS_BIT
);
isb
();
ns_sctlr
=
read_ctx_reg
(
get_regs_ctx
(
ctx
),
CTX_NS_SCTLR
);
write_sctlr
(
ns_sctlr
);
isb
();
write_scr
(
read_scr
()
&
~
SCR_NS_BIT
);
isb
();
}
}
/******************************************************************************
/******************************************************************************
...
...
common/tf_printf.c
View file @
81602a97
...
@@ -29,85 +29,6 @@ static void string_print(const char *str)
...
@@ -29,85 +29,6 @@ static void string_print(const char *str)
putchar
(
*
str
++
);
putchar
(
*
str
++
);
}
}
#ifdef AARCH32
#define unsigned_num_print(unum, radix) \
do { \
if ((radix) == 16) \
unsigned_hex_print(unum); \
else if ((radix) == 10) \
unsigned_dec_print(unum); \
else \
string_print("tf_printf : Unsupported radix");\
} while (0);
/*
* Utility function to print an unsigned number in decimal format for AArch32.
* The function doesn't support printing decimal integers higher than 32 bits
* to avoid having to implement 64-bit integer compiler library functions.
*/
static
void
unsigned_dec_print
(
unsigned
long
long
int
unum
)
{
unsigned
int
local_num
;
/* Just need enough space to store 32 bit decimal integer */
unsigned
char
num_buf
[
10
];
int
i
=
0
,
rem
;
if
(
unum
>
UINT_MAX
)
{
string_print
(
"tf_printf : decimal numbers higher than 32 bits"
" not supported
\n
"
);
return
;
}
local_num
=
(
unsigned
int
)
unum
;
do
{
rem
=
local_num
%
10
;
num_buf
[
i
++
]
=
'0'
+
rem
;
}
while
(
local_num
/=
10
);
while
(
--
i
>=
0
)
putchar
(
num_buf
[
i
]);
}
/*
* Utility function to print an unsigned number in hexadecimal format for
* AArch32. The function doesn't use 64-bit integer arithmetic to avoid
* having to implement 64-bit compiler library functions. It splits the
* 64 bit number into two 32 bit numbers and converts them into equivalent
* ASCII characters.
*/
static
void
unsigned_hex_print
(
unsigned
long
long
int
unum
)
{
/* Just need enough space to store 16 characters */
unsigned
char
num_buf
[
16
];
int
i
=
0
,
rem
;
uint32_t
num_local
=
0
,
num_msb
=
0
;
/* Get the LSB of 64 bit unum */
num_local
=
(
uint32_t
)
unum
;
/* Get the MSB of 64 bit unum. This works only on Little Endian */
assert
((
read_sctlr
()
&
SCTLR_EE_BIT
)
==
0
);
num_msb
=
*
(((
uint32_t
*
)
&
unum
)
+
1
);
do
{
do
{
rem
=
(
num_local
&
0xf
);
if
(
rem
<
0xa
)
num_buf
[
i
++
]
=
'0'
+
rem
;
else
num_buf
[
i
++
]
=
'a'
+
(
rem
-
0xa
);
}
while
(
num_local
>>=
4
);
num_local
=
num_msb
;
num_msb
=
0
;
}
while
(
num_local
);
while
(
--
i
>=
0
)
putchar
(
num_buf
[
i
]);
}
#else
static
void
unsigned_num_print
(
unsigned
long
long
int
unum
,
unsigned
int
radix
)
static
void
unsigned_num_print
(
unsigned
long
long
int
unum
,
unsigned
int
radix
)
{
{
/* Just need enough space to store 64 bit decimal integer */
/* Just need enough space to store 64 bit decimal integer */
...
@@ -125,7 +46,6 @@ static void unsigned_num_print(unsigned long long int unum, unsigned int radix)
...
@@ -125,7 +46,6 @@ static void unsigned_num_print(unsigned long long int unum, unsigned int radix)
while
(
--
i
>=
0
)
while
(
--
i
>=
0
)
putchar
(
num_buf
[
i
]);
putchar
(
num_buf
[
i
]);
}
}
#endif
/* AARCH32 */
/*******************************************************************
/*******************************************************************
* Reduced format print for Trusted firmware.
* Reduced format print for Trusted firmware.
...
...
include/lib/aarch32/smcc_helpers.h
View file @
81602a97
...
@@ -18,8 +18,10 @@
...
@@ -18,8 +18,10 @@
#define SMC_CTX_GPREG_R5 0x14
#define SMC_CTX_GPREG_R5 0x14
#define SMC_CTX_SP_USR 0x34
#define SMC_CTX_SP_USR 0x34
#define SMC_CTX_SPSR_MON 0x78
#define SMC_CTX_SPSR_MON 0x78
#define SMC_CTX_LR_MON 0x7C
#define SMC_CTX_SP_MON 0x7C
#define SMC_CTX_SIZE 0x80
#define SMC_CTX_LR_MON 0x80
#define SMC_CTX_SCR 0x84
#define SMC_CTX_SIZE 0x88
#ifndef __ASSEMBLY__
#ifndef __ASSEMBLY__
#include <cassert.h>
#include <cassert.h>
...
@@ -63,8 +65,14 @@ typedef struct smc_ctx {
...
@@ -63,8 +65,14 @@ typedef struct smc_ctx {
u_register_t
sp_und
;
u_register_t
sp_und
;
u_register_t
lr_und
;
u_register_t
lr_und
;
u_register_t
spsr_mon
;
u_register_t
spsr_mon
;
/* No need to save 'sp_mon' because we are already in monitor mode */
/*
* `sp_mon` will point to the C runtime stack in monitor mode. But prior
* to exit from SMC, this will point to the `smc_ctx_t` so that
* on next entry due to SMC, the `smc_ctx_t` can be easily accessed.
*/
u_register_t
sp_mon
;
u_register_t
lr_mon
;
u_register_t
lr_mon
;
u_register_t
scr
;
}
smc_ctx_t
;
}
smc_ctx_t
;
/*
/*
...
...
include/lib/aarch32/smcc_macros.S
View file @
81602a97
...
@@ -9,27 +9,16 @@
...
@@ -9,27 +9,16 @@
#include <arch.h>
#include <arch.h>
/*
/*
*
Macro
to
save
the
General
purpose
registers
including
the
banked
*
Macro
to
save
the
General
purpose
registers
(
r0
-
r12
),
the
banked
*
registers
to
the
SMC
context
on
entry
due
a
SMC
call
.
On
return
,
r0
*
spsr
,
lr
,
sp
registers
and
the
`
scr
`
register
to
the
SMC
context
on
entry
*
contains
the
pointer
to
the
`
smc_context_t
`
.
*
due
a
SMC
call
.
The
`
lr
`
of
the
current
mode
(
monitor
)
is
expected
to
be
*
already
saved
.
The
`
sp
`
must
point
to
the
`
smc_ctx_t
`
to
save
to
.
*/
*/
.
macro
smcc_save_gp_mode_regs
.
macro
smcc_save_gp_mode_regs
push
{
r0
-
r4
,
lr
}
/
*
Save
r0
-
r12
in
the
SMC
context
*/
stm
sp
,
{
r0
-
r12
}
ldcopr
r0
,
SCR
mov
r0
,
sp
and
r0
,
r0
,
#
SCR_NS_BIT
add
r0
,
r0
,
#
SMC_CTX_SP_USR
bl
smc_get_ctx
/
*
Save
r5
-
r12
in
the
SMC
context
*/
add
r1
,
r0
,
#
SMC_CTX_GPREG_R5
stm
r1
!,
{
r5
-
r12
}
/
*
*
Pop
r0
-
r4
,
lr
to
r4
-
r8
,
lr
from
stack
and
then
save
*
it
to
SMC
context
.
*/
pop
{
r4
-
r8
,
lr
}
stm
r0
,
{
r4
-
r8
}
/
*
Save
the
banked
registers
including
the
current
SPSR
and
LR
*/
/
*
Save
the
banked
registers
including
the
current
SPSR
and
LR
*/
mrs
r4
,
sp_usr
mrs
r4
,
sp_usr
...
@@ -41,7 +30,7 @@
...
@@ -41,7 +30,7 @@
mrs
r10
,
sp_fiq
mrs
r10
,
sp_fiq
mrs
r11
,
lr_fiq
mrs
r11
,
lr_fiq
mrs
r12
,
spsr_svc
mrs
r12
,
spsr_svc
stm
r
1
!,
{
r4
-
r12
}
stm
r
0
!,
{
r4
-
r12
}
mrs
r4
,
sp_svc
mrs
r4
,
sp_svc
mrs
r5
,
lr_svc
mrs
r5
,
lr_svc
...
@@ -52,18 +41,36 @@
...
@@ -52,18 +41,36 @@
mrs
r10
,
sp_und
mrs
r10
,
sp_und
mrs
r11
,
lr_und
mrs
r11
,
lr_und
mrs
r12
,
spsr
mrs
r12
,
spsr
stm
r
1
!,
{
r4
-
r12
,
lr
}
stm
r
0
!,
{
r4
-
r12
}
/
*
lr_mon
is
already
saved
by
caller
*/
ldcopr
r4
,
SCR
str
r4
,
[
sp
,
#
SMC_CTX_SCR
]
.
endm
.
endm
/*
/*
*
Macro
to
restore
the
General
purpose
registers
including
the
banked
*
Macro
to
restore
the
`
smc_ctx_t
`
,
which
includes
the
General
purpose
*
registers
from
the
SMC
context
prior
to
exit
from
the
SMC
call
.
*
registers
and
banked
mode
registers
,
and
exit
from
the
monitor
mode
.
*
r0
must
point
to
the
`
smc_context_t
`
to
restore
from
.
*
r0
must
point
to
the
`
smc_ctx_t
`
to
restore
from
.
*/
.
macro
monitor_exit
/
*
*
Save
the
current
sp
and
restore
the
smc
context
*
pointer
to
sp
which
will
be
used
for
handling
the
*
next
SMC
.
*/
str
sp
,
[
r0
,
#
SMC_CTX_SP_MON
]
mov
sp
,
r0
/
*
*
Restore
SCR
first
so
that
we
access
the
right
banked
register
*
when
the
other
mode
registers
are
restored
.
*/
*/
.
macro
smcc_restore_gp_mode_regs
ldr
r1
,
[
r0
,
#
SMC_CTX_SCR
]
stcopr
r1
,
SCR
isb
/
*
Restore
the
banked
registers
including
the
current
SPSR
and
LR
*/
/
*
Restore
the
banked
registers
including
the
current
SPSR
*/
add
r1
,
r0
,
#
SMC_CTX_SP_USR
add
r1
,
r0
,
#
SMC_CTX_SP_USR
ldm
r1
!,
{
r4
-
r12
}
ldm
r1
!,
{
r4
-
r12
}
msr
sp_usr
,
r4
msr
sp_usr
,
r4
...
@@ -76,7 +83,7 @@
...
@@ -76,7 +83,7 @@
msr
lr_fiq
,
r11
msr
lr_fiq
,
r11
msr
spsr_svc
,
r12
msr
spsr_svc
,
r12
ldm
r1
!,
{
r4
-
r12
,
lr
}
ldm
r1
!,
{
r4
-
r12
}
msr
sp_svc
,
r4
msr
sp_svc
,
r4
msr
lr_svc
,
r5
msr
lr_svc
,
r5
msr
spsr_abt
,
r6
msr
spsr_abt
,
r6
...
@@ -93,8 +100,12 @@
...
@@ -93,8 +100,12 @@
*/
*/
msr
spsr_fsxc
,
r12
msr
spsr_fsxc
,
r12
/
*
Restore
the
LR
*/
ldr
lr
,
[
r0
,
#
SMC_CTX_LR_MON
]
/
*
Restore
the
rest
of
the
general
purpose
registers
*/
/
*
Restore
the
rest
of
the
general
purpose
registers
*/
ldm
r0
,
{
r0
-
r12
}
ldm
r0
,
{
r0
-
r12
}
eret
.
endm
.
endm
#endif /* __SMCC_MACROS_S__ */
#endif /* __SMCC_MACROS_S__ */
include/plat/arm/common/arm_def.h
View file @
81602a97
...
@@ -224,9 +224,10 @@
...
@@ -224,9 +224,10 @@
/*******************************************************************************
/*******************************************************************************
* BL2 specific defines.
* BL2 specific defines.
******************************************************************************/
******************************************************************************/
#if ARM_BL31_IN_DRAM
#if ARM_BL31_IN_DRAM
|| defined(AARCH32)
/*
/*
* BL31 is loaded in the DRAM.
* For AArch32 BL31 is not applicable.
* For AArch64 BL31 is loaded in the DRAM.
* Put BL2 just below BL1.
* Put BL2 just below BL1.
*/
*/
#define BL2_BASE (BL1_RW_BASE - PLAT_ARM_MAX_BL2_SIZE)
#define BL2_BASE (BL1_RW_BASE - PLAT_ARM_MAX_BL2_SIZE)
...
@@ -310,9 +311,15 @@
...
@@ -310,9 +311,15 @@
* FWU Images: NS_BL1U, BL2U & NS_BL2U defines.
* FWU Images: NS_BL1U, BL2U & NS_BL2U defines.
******************************************************************************/
******************************************************************************/
#define BL2U_BASE BL2_BASE
#define BL2U_BASE BL2_BASE
#if ARM_BL31_IN_DRAM
#if ARM_BL31_IN_DRAM || defined(AARCH32)
/*
* For AArch32 BL31 is not applicable.
* For AArch64 BL31 is loaded in the DRAM.
* BL2U extends up to BL1.
*/
#define BL2U_LIMIT BL1_RW_BASE
#define BL2U_LIMIT BL1_RW_BASE
#else
#else
/* BL2U extends up to BL31. */
#define BL2U_LIMIT BL31_BASE
#define BL2U_LIMIT BL31_BASE
#endif
#endif
#define NS_BL2U_BASE ARM_NS_DRAM1_BASE
#define NS_BL2U_BASE ARM_NS_DRAM1_BASE
...
...
lib/compiler-rt/LICENSE.TXT
0 → 100644
View file @
81602a97
==============================================================================
compiler_rt License
==============================================================================
The compiler_rt library is dual licensed under both the University of Illinois
"BSD-Like" license and the MIT license. As a user of this code you may choose
to use it under either license. As a contributor, you agree to allow your code
to be used under both.
Full text of the relevant licenses is included below.
==============================================================================
University of Illinois/NCSA
Open Source License
Copyright (c) 2009-2016 by the contributors listed in CREDITS.TXT
All rights reserved.
Developed by:
LLVM Team
University of Illinois at Urbana-Champaign
http://llvm.org
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal with
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimers.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimers in the
documentation and/or other materials provided with the distribution.
* Neither the names of the LLVM Team, University of Illinois at
Urbana-Champaign, nor the names of its contributors may be used to
endorse or promote products derived from this Software without specific
prior written permission.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
SOFTWARE.
==============================================================================
Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
==============================================================================
Copyrights and Licenses for Third Party Software Distributed with LLVM:
==============================================================================
The LLVM software contains code written by third parties. Such software will
have its own individual LICENSE.TXT file in the directory in which it appears.
This file will describe the copyrights, license, and restrictions which apply
to that code.
The disclaimer of warranty in the University of Illinois Open Source License
applies to all code in the LLVM Distribution, and nothing in any of the
other licenses gives permission to use the names of the LLVM Team or the
University of Illinois to endorse or promote products derived from this
Software.
lib/compiler-rt/builtins/arm/aeabi_uldivmod.S
0 → 100644
View file @
81602a97
//===--
aeabi_uldivmod
.
S
-
EABI
uldivmod
implementation
-------------------===//
//
//
The
LLVM
Compiler
Infrastructure
//
//
This
file
is
dual
licensed
under
the
MIT
and
the
University
of
Illinois
Open
//
Source
Licenses
.
See
LICENSE
.
TXT
for
details
.
//
//===----------------------------------------------------------------------===//
#include "../assembly.h"
//
struct
{
uint64_t
quot
,
uint64_t
rem
}
//
__aeabi_uldivmod
(
uint64_t
numerator
,
uint64_t
denominator
)
{
//
uint64_t
rem
,
quot
;
//
quot
=
__udivmoddi4
(
numerator
,
denominator
,
&
rem
)
;
//
return
{
quot
,
rem
}
;
//
}
#if defined(__MINGW32__)
#define __aeabi_uldivmod __rt_udiv64
#endif
.
syntax
unified
.
p2align
2
DEFINE_COMPILERRT_FUNCTION
(
__aeabi_uldivmod
)
push
{
r6
,
lr
}
sub
sp
,
sp
,
#
16
add
r6
,
sp
,
#
8
str
r6
,
[
sp
]
#if defined(__MINGW32__)
movs
r6
,
r0
movs
r0
,
r2
movs
r2
,
r6
movs
r6
,
r1
movs
r1
,
r3
movs
r3
,
r6
#endif
bl
SYMBOL_NAME
(
__udivmoddi4
)
ldr
r2
,
[
sp
,
#
8
]
ldr
r3
,
[
sp
,
#
12
]
add
sp
,
sp
,
#
16
pop
{
r6
,
pc
}
END_COMPILERRT_FUNCTION
(
__aeabi_uldivmod
)
NO_EXEC_STACK_DIRECTIVE
lib/compiler-rt/builtins/assembly.h
0 → 100644
View file @
81602a97
/* ===-- assembly.h - compiler-rt assembler support macros -----------------===
*
* The LLVM Compiler Infrastructure
*
* This file is dual licensed under the MIT and the University of Illinois Open
* Source Licenses. See LICENSE.TXT for details.
*
* ===----------------------------------------------------------------------===
*
* This file defines macros for use in compiler-rt assembler source.
* This file is not part of the interface of this library.
*
* ===----------------------------------------------------------------------===
*/
#ifndef COMPILERRT_ASSEMBLY_H
#define COMPILERRT_ASSEMBLY_H
#if defined(__POWERPC__) || defined(__powerpc__) || defined(__ppc__)
#define SEPARATOR @
#else
#define SEPARATOR ;
#endif
#if defined(__APPLE__)
#define HIDDEN(name) .private_extern name
#define LOCAL_LABEL(name) L_##name
// tell linker it can break up file at label boundaries
#define FILE_LEVEL_DIRECTIVE .subsections_via_symbols
#define SYMBOL_IS_FUNC(name)
#define CONST_SECTION .const
#define NO_EXEC_STACK_DIRECTIVE
#elif defined(__ELF__)
#define HIDDEN(name) .hidden name
#define LOCAL_LABEL(name) .L_##name
#define FILE_LEVEL_DIRECTIVE
#if defined(__arm__)
#define SYMBOL_IS_FUNC(name) .type name,%function
#else
#define SYMBOL_IS_FUNC(name) .type name,@function
#endif
#define CONST_SECTION .section .rodata
#if defined(__GNU__) || defined(__ANDROID__) || defined(__FreeBSD__)
#define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits
#else
#define NO_EXEC_STACK_DIRECTIVE
#endif
#else // !__APPLE__ && !__ELF__
#define HIDDEN(name)
#define LOCAL_LABEL(name) .L ## name
#define FILE_LEVEL_DIRECTIVE
#define SYMBOL_IS_FUNC(name) \
.def name SEPARATOR \
.scl 2 SEPARATOR \
.type 32 SEPARATOR \
.endef
#define CONST_SECTION .section .rdata,"rd"
#define NO_EXEC_STACK_DIRECTIVE
#endif
#if defined(__arm__)
#if defined(__ARM_ARCH_4T__) || __ARM_ARCH >= 5
#define ARM_HAS_BX
#endif
#if !defined(__ARM_FEATURE_CLZ) && __ARM_ARCH_ISA_THUMB != 1 && \
(__ARM_ARCH >= 6 || (__ARM_ARCH == 5 && !defined(__ARM_ARCH_5__)))
#define __ARM_FEATURE_CLZ
#endif
#ifdef ARM_HAS_BX
#define JMP(r) bx r
#define JMPc(r, c) bx##c r
#else
#define JMP(r) mov pc, r
#define JMPc(r, c) mov##c pc, r
#endif
// pop {pc} can't switch Thumb mode on ARMv4T
#if __ARM_ARCH >= 5
#define POP_PC() pop {pc}
#else
#define POP_PC() \
pop {ip}; \
JMP(ip)
#endif
#if __ARM_ARCH_ISA_THUMB == 2
#define IT(cond) it cond
#define ITT(cond) itt cond
#else
#define IT(cond)
#define ITT(cond)
#endif
#if __ARM_ARCH_ISA_THUMB == 2
#define WIDE(op) op.w
#else
#define WIDE(op) op
#endif
#endif
#define GLUE2(a, b) a##b
#define GLUE(a, b) GLUE2(a, b)
#define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name)
#ifdef VISIBILITY_HIDDEN
#define DECLARE_SYMBOL_VISIBILITY(name) \
HIDDEN(SYMBOL_NAME(name)) SEPARATOR
#else
#define DECLARE_SYMBOL_VISIBILITY(name)
#endif
#define DEFINE_COMPILERRT_FUNCTION(name) \
FILE_LEVEL_DIRECTIVE SEPARATOR \
.globl SYMBOL_NAME(name) SEPARATOR \
SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \
DECLARE_SYMBOL_VISIBILITY(name) \
SYMBOL_NAME(name):
#define DEFINE_COMPILERRT_THUMB_FUNCTION(name) \
FILE_LEVEL_DIRECTIVE SEPARATOR \
.globl SYMBOL_NAME(name) SEPARATOR \
SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \
DECLARE_SYMBOL_VISIBILITY(name) SEPARATOR \
.thumb_func SEPARATOR \
SYMBOL_NAME(name):
#define DEFINE_COMPILERRT_PRIVATE_FUNCTION(name) \
FILE_LEVEL_DIRECTIVE SEPARATOR \
.globl SYMBOL_NAME(name) SEPARATOR \
SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \
HIDDEN(SYMBOL_NAME(name)) SEPARATOR \
SYMBOL_NAME(name):
#define DEFINE_COMPILERRT_PRIVATE_FUNCTION_UNMANGLED(name) \
.globl name SEPARATOR \
SYMBOL_IS_FUNC(name) SEPARATOR \
HIDDEN(name) SEPARATOR \
name:
#define DEFINE_COMPILERRT_FUNCTION_ALIAS(name, target) \
.globl SYMBOL_NAME(name) SEPARATOR \
SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \
DECLARE_SYMBOL_VISIBILITY(SYMBOL_NAME(name)) SEPARATOR \
.set SYMBOL_NAME(name), SYMBOL_NAME(target) SEPARATOR
#if defined(__ARM_EABI__)
#define DEFINE_AEABI_FUNCTION_ALIAS(aeabi_name, name) \
DEFINE_COMPILERRT_FUNCTION_ALIAS(aeabi_name, name)
#else
#define DEFINE_AEABI_FUNCTION_ALIAS(aeabi_name, name)
#endif
#ifdef __ELF__
#define END_COMPILERRT_FUNCTION(name) \
.size SYMBOL_NAME(name), . - SYMBOL_NAME(name)
#else
#define END_COMPILERRT_FUNCTION(name)
#endif
#endif
/* COMPILERRT_ASSEMBLY_H */
lib/compiler-rt/builtins/int_endianness.h
0 → 100644
View file @
81602a97
/* ===-- int_endianness.h - configuration header for compiler-rt ------------===
*
* The LLVM Compiler Infrastructure
*
* This file is dual licensed under the MIT and the University of Illinois Open
* Source Licenses. See LICENSE.TXT for details.
*
* ===----------------------------------------------------------------------===
*
* This file is a configuration header for compiler-rt.
* This file is not part of the interface of this library.
*
* ===----------------------------------------------------------------------===
*/
#ifndef INT_ENDIANNESS_H
#define INT_ENDIANNESS_H
#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \
defined(__ORDER_LITTLE_ENDIAN__)
/* Clang and GCC provide built-in endianness definitions. */
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
#define _YUGA_LITTLE_ENDIAN 0
#define _YUGA_BIG_ENDIAN 1
#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
#define _YUGA_LITTLE_ENDIAN 1
#define _YUGA_BIG_ENDIAN 0
#endif
/* __BYTE_ORDER__ */
#else
/* Compilers other than Clang or GCC. */
#if defined(__SVR4) && defined(__sun)
#include <sys/byteorder.h>
#if defined(_BIG_ENDIAN)
#define _YUGA_LITTLE_ENDIAN 0
#define _YUGA_BIG_ENDIAN 1
#elif defined(_LITTLE_ENDIAN)
#define _YUGA_LITTLE_ENDIAN 1
#define _YUGA_BIG_ENDIAN 0
#else
/* !_LITTLE_ENDIAN */
#error "unknown endianness"
#endif
/* !_LITTLE_ENDIAN */
#endif
/* Solaris and AuroraUX. */
/* .. */
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \
defined(__minix)
#include <sys/endian.h>
#if _BYTE_ORDER == _BIG_ENDIAN
#define _YUGA_LITTLE_ENDIAN 0
#define _YUGA_BIG_ENDIAN 1
#elif _BYTE_ORDER == _LITTLE_ENDIAN
#define _YUGA_LITTLE_ENDIAN 1
#define _YUGA_BIG_ENDIAN 0
#endif
/* _BYTE_ORDER */
#endif
/* *BSD */
#if defined(__OpenBSD__) || defined(__Bitrig__)
#include <machine/endian.h>
#if _BYTE_ORDER == _BIG_ENDIAN
#define _YUGA_LITTLE_ENDIAN 0
#define _YUGA_BIG_ENDIAN 1
#elif _BYTE_ORDER == _LITTLE_ENDIAN
#define _YUGA_LITTLE_ENDIAN 1
#define _YUGA_BIG_ENDIAN 0
#endif
/* _BYTE_ORDER */
#endif
/* OpenBSD and Bitrig. */
/* .. */
/* Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the
* compiler (at least with GCC) */
#if defined(__APPLE__) || defined(__ellcc__ )
#ifdef __BIG_ENDIAN__
#if __BIG_ENDIAN__
#define _YUGA_LITTLE_ENDIAN 0
#define _YUGA_BIG_ENDIAN 1
#endif
#endif
/* __BIG_ENDIAN__ */
#ifdef __LITTLE_ENDIAN__
#if __LITTLE_ENDIAN__
#define _YUGA_LITTLE_ENDIAN 1
#define _YUGA_BIG_ENDIAN 0
#endif
#endif
/* __LITTLE_ENDIAN__ */
#endif
/* Mac OSX */
/* .. */
#if defined(_WIN32)
#define _YUGA_LITTLE_ENDIAN 1
#define _YUGA_BIG_ENDIAN 0
#endif
/* Windows */
#endif
/* Clang or GCC. */
/* . */
#if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN)
#error Unable to determine endian
#endif
/* Check we found an endianness correctly. */
#endif
/* INT_ENDIANNESS_H */
lib/compiler-rt/builtins/int_lib.h
0 → 100644
View file @
81602a97
/* ===-- int_lib.h - configuration header for compiler-rt -----------------===
*
* The LLVM Compiler Infrastructure
*
* This file is dual licensed under the MIT and the University of Illinois Open
* Source Licenses. See LICENSE.TXT for details.
*
* ===----------------------------------------------------------------------===
*
* This file is a configuration header for compiler-rt.
* This file is not part of the interface of this library.
*
* ===----------------------------------------------------------------------===
*/
/*
* Portions copyright (c) 2017, ARM Limited and Contributors.
* All rights reserved.
*/
#ifndef INT_LIB_H
#define INT_LIB_H
/* Assumption: Signed integral is 2's complement. */
/* Assumption: Right shift of signed negative is arithmetic shift. */
/* Assumption: Endianness is little or big (not mixed). */
#if defined(__ELF__)
#define FNALIAS(alias_name, original_name) \
void alias_name() __attribute__((alias(#original_name)))
#else
#define FNALIAS(alias, name) _Pragma("GCC error(\"alias unsupported on this file format\")")
#endif
/* ABI macro definitions */
#if __ARM_EABI__
# define ARM_EABI_FNALIAS(aeabi_name, name) \
void __aeabi_##aeabi_name() __attribute__((alias("__" #name)));
# ifdef COMPILER_RT_ARMHF_TARGET
# define COMPILER_RT_ABI
# else
# define COMPILER_RT_ABI __attribute__((pcs("aapcs")))
# endif
#else
# define ARM_EABI_FNALIAS(aeabi_name, name)
# define COMPILER_RT_ABI
#endif
#ifdef _MSC_VER
#define ALWAYS_INLINE __forceinline
#define NOINLINE __declspec(noinline)
#define NORETURN __declspec(noreturn)
#define UNUSED
#else
#define ALWAYS_INLINE __attribute__((always_inline))
#define NOINLINE __attribute__((noinline))
#define NORETURN __attribute__((noreturn))
#define UNUSED __attribute__((unused))
#endif
/*
* Kernel and boot environment can't use normal headers,
* so use the equivalent system headers.
*/
# include <sys/limits.h>
# include <sys/stdint.h>
# include <sys/types.h>
/* Include the commonly used internal type definitions. */
#include "int_types.h"
/* Include internal utility function declarations. */
#include "int_util.h"
COMPILER_RT_ABI
si_int
__paritysi2
(
si_int
a
);
COMPILER_RT_ABI
si_int
__paritydi2
(
di_int
a
);
COMPILER_RT_ABI
di_int
__divdi3
(
di_int
a
,
di_int
b
);
COMPILER_RT_ABI
si_int
__divsi3
(
si_int
a
,
si_int
b
);
COMPILER_RT_ABI
su_int
__udivsi3
(
su_int
n
,
su_int
d
);
COMPILER_RT_ABI
su_int
__udivmodsi4
(
su_int
a
,
su_int
b
,
su_int
*
rem
);
COMPILER_RT_ABI
du_int
__udivmoddi4
(
du_int
a
,
du_int
b
,
du_int
*
rem
);
#ifdef CRT_HAS_128BIT
COMPILER_RT_ABI
si_int
__clzti2
(
ti_int
a
);
COMPILER_RT_ABI
tu_int
__udivmodti4
(
tu_int
a
,
tu_int
b
,
tu_int
*
rem
);
#endif
/* Definitions for builtins unavailable on MSVC */
#if defined(_MSC_VER) && !defined(__clang__)
#include <intrin.h>
uint32_t
__inline
__builtin_ctz
(
uint32_t
value
)
{
unsigned
long
trailing_zero
=
0
;
if
(
_BitScanForward
(
&
trailing_zero
,
value
))
return
trailing_zero
;
return
32
;
}
uint32_t
__inline
__builtin_clz
(
uint32_t
value
)
{
unsigned
long
leading_zero
=
0
;
if
(
_BitScanReverse
(
&
leading_zero
,
value
))
return
31
-
leading_zero
;
return
32
;
}
#if defined(_M_ARM) || defined(_M_X64)
uint32_t
__inline
__builtin_clzll
(
uint64_t
value
)
{
unsigned
long
leading_zero
=
0
;
if
(
_BitScanReverse64
(
&
leading_zero
,
value
))
return
63
-
leading_zero
;
return
64
;
}
#else
uint32_t
__inline
__builtin_clzll
(
uint64_t
value
)
{
if
(
value
==
0
)
return
64
;
uint32_t
msh
=
(
uint32_t
)(
value
>>
32
);
uint32_t
lsh
=
(
uint32_t
)(
value
&
0xFFFFFFFF
);
if
(
msh
!=
0
)
return
__builtin_clz
(
msh
);
return
32
+
__builtin_clz
(
lsh
);
}
#endif
#define __builtin_clzl __builtin_clzll
#endif
/* defined(_MSC_VER) && !defined(__clang__) */
#endif
/* INT_LIB_H */
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment