Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
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
508a48bb
Commit
508a48bb
authored
5 years ago
by
Paul Beesley
Committed by
TrustedFirmware Code Review
5 years ago
Browse files
Options
Download
Plain Diff
Merge "Add support for Branch Target Identification" into integration
parents
c0e9d433
9fc59639
Changes
22
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
Makefile
+48
-16
Makefile
bl1/bl1.mk
+0
-4
bl1/bl1.mk
bl2/aarch64/bl2_el3_entrypoint.S
+7
-1
bl2/aarch64/bl2_el3_entrypoint.S
bl2/aarch64/bl2_entrypoint.S
+7
-0
bl2/aarch64/bl2_entrypoint.S
bl2/bl2.mk
+0
-4
bl2/bl2.mk
bl31/aarch64/bl31_entrypoint.S
+14
-0
bl31/aarch64/bl31_entrypoint.S
bl31/bl31.mk
+0
-4
bl31/bl31.mk
bl32/tsp/aarch64/tsp_entrypoint.S
+8
-2
bl32/tsp/aarch64/tsp_entrypoint.S
bl32/tsp/tsp.mk
+0
-5
bl32/tsp/tsp.mk
docs/design/firmware-design.rst
+7
-1
docs/design/firmware-design.rst
docs/getting_started/user-guide.rst
+34
-18
docs/getting_started/user-guide.rst
include/arch/aarch64/arch.h
+8
-4
include/arch/aarch64/arch.h
include/arch/aarch64/arch_features.h
+6
-0
include/arch/aarch64/arch_features.h
include/arch/aarch64/asm_macros.S
+27
-1
include/arch/aarch64/asm_macros.S
include/common/asm_macros_common.S
+7
-1
include/common/asm_macros_common.S
include/lib/xlat_tables/xlat_tables_defs.h
+6
-1
include/lib/xlat_tables/xlat_tables_defs.h
lib/aarch64/cache_helpers.S
+7
-1
lib/aarch64/cache_helpers.S
lib/cpus/aarch64/cpuamu_helpers.S
+19
-27
lib/cpus/aarch64/cpuamu_helpers.S
lib/extensions/amu/aarch64/amu_helpers.S
+88
-156
lib/extensions/amu/aarch64/amu_helpers.S
lib/xlat_tables_v2/xlat_tables_core.c
+14
-1
lib/xlat_tables_v2/xlat_tables_core.c
with
307 additions
and
247 deletions
+307
-247
Makefile
View file @
508a48bb
...
...
@@ -117,6 +117,29 @@ ifneq (${GENERATE_COT},0)
FWU_FIP_DEPS
+=
fwu_certificates
endif
# Process BRANCH_PROTECTION value and set
# Pointer Authentication and Branch Target Identification flags
ifeq
(${BRANCH_PROTECTION},0)
# Default value turns off all types of branch protection
BP_OPTION
:=
none
else
ifneq
(${ARCH},aarch64)
$(error
BRANCH_PROTECTION
requires
AArch64)
else
ifeq
(${BRANCH_PROTECTION},1)
# Enables all types of branch protection features
BP_OPTION
:=
standard
ENABLE_BTI
:=
1
ENABLE_PAUTH
:=
1
else
ifeq
(${BRANCH_PROTECTION},2)
# Return address signing to its standard level
BP_OPTION
:=
pac-ret
ENABLE_PAUTH
:=
1
else
ifeq
(${BRANCH_PROTECTION},3)
# Extend the signing to include leaf functions
BP_OPTION
:=
pac-ret+leaf
ENABLE_PAUTH
:=
1
else
$(error
Unknown
BRANCH_PROTECTION
value
${BRANCH_PROTECTION})
endif
################################################################################
# Toolchain
...
...
@@ -189,6 +212,10 @@ endif
TF_CFLAGS_aarch32
+=
-mno-unaligned-access
TF_CFLAGS_aarch64
+=
-mgeneral-regs-only
-mstrict-align
ifneq
(${BP_OPTION},none)
TF_CFLAGS_aarch64
+=
-mbranch-protection
=
${BP_OPTION}
endif
ASFLAGS_aarch32
=
$
(
march32-directive
)
ASFLAGS_aarch64
=
$
(
march64-directive
)
...
...
@@ -451,26 +478,30 @@ ifeq ($(DYN_DISABLE_AUTH), 1)
endif
# If pointer authentication is used in the firmware, make sure that all the
# registers associated to it are also saved and restored.
Not doing it would
# leak the value of the key used by EL3 to EL1 and S-EL1.
# registers associated to it are also saved and restored.
#
Not doing it would
leak the value of the key
s
used by EL3 to EL1 and S-EL1.
ifeq ($(ENABLE_PAUTH),1)
ifneq ($(ARCH),aarch64)
$(error ENABLE_PAUTH=1 requires AArch64)
else ifeq ($(CTX_INCLUDE_PAUTH_REGS),0)
$(error ENABLE_PAUTH=1 requires CTX_INCLUDE_PAUTH_REGS=1)
else
$(info ENABLE_PAUTH and CTX_INCLUDE_PAUTH_REGS are experimental features)
ifeq ($(CTX_INCLUDE_PAUTH_REGS),0)
$(error Pointer Authentication requires CTX_INCLUDE_PAUTH_REGS=1)
endif
e
lse
ifeq ($(CTX_INCLUDE_PAUTH_REGS),1)
if
n
eq ($(
ARCH),aarch64
)
$(error CTX_INCLUDE_PAUTH_REGS=1 requires AA
rch64)
else
$(info CTX_INCLUDE_PAUTH_REGS is an experimental feature)
endif
e
ndif
ifeq ($(
CTX_INCLUDE_PAUTH_REGS),1
)
ifneq (${ARCH},aa
rch64)
$(error CTX_INCLUDE_PAUTH_REGS requires AArch64)
else
$(info CTX_INCLUDE_PAUTH_REGS is an experimental feature)
endif
endif
ifeq ($(ENABLE_PAUTH),1)
$(info Pointer Authentication is an experimental feature)
endif
ifeq ($(ENABLE_BTI),1)
$(info Branch Protection is an experimental feature)
endif
################################################################################
# Process platform overrideable behaviour
################################################################################
...
...
@@ -599,7 +630,6 @@ $(eval $(call assert_boolean,EL3_EXCEPTION_HANDLING))
$(eval $(call assert_boolean,ENABLE_AMU))
$(eval $(call assert_boolean,ENABLE_ASSERTIONS))
$(eval $(call assert_boolean,ENABLE_MPAM_FOR_LOWER_ELS))
$(eval $(call assert_boolean,ENABLE_PAUTH))
$(eval $(call assert_boolean,ENABLE_PIE))
$(eval $(call assert_boolean,ENABLE_PMF))
$(eval $(call assert_boolean,ENABLE_PSCI_STAT))
...
...
@@ -635,6 +665,7 @@ $(eval $(call assert_boolean,BL2_IN_XIP_MEM))
$(eval $(call assert_numeric,ARM_ARCH_MAJOR))
$(eval $(call assert_numeric,ARM_ARCH_MINOR))
$(eval $(call assert_numeric,BRANCH_PROTECTION))
################################################################################
# Add definitions to the cpp preprocessor based on the current build options.
...
...
@@ -651,6 +682,7 @@ $(eval $(call add_define,CTX_INCLUDE_PAUTH_REGS))
$(eval $(call add_define,EL3_EXCEPTION_HANDLING))
$(eval $(call add_define,ENABLE_AMU))
$(eval $(call add_define,ENABLE_ASSERTIONS))
$(eval $(call add_define,ENABLE_BTI))
$(eval $(call add_define,ENABLE_MPAM_FOR_LOWER_ELS))
$(eval $(call add_define,ENABLE_PAUTH))
$(eval $(call add_define,ENABLE_PIE))
...
...
This diff is collapsed.
Click to expand it.
bl1/bl1.mk
View file @
508a48bb
...
...
@@ -21,10 +21,6 @@ BL1_SOURCES += lib/cpus/aarch64/dsu_helpers.S \
lib/el3_runtime/aarch64/context.S
endif
ifeq
(${ENABLE_PAUTH},1)
BL1_CFLAGS
+=
-msign-return-address
=
non-leaf
endif
ifeq
(${TRUSTED_BOARD_BOOT},1)
BL1_SOURCES
+=
bl1/bl1_fwu.c
endif
...
...
This diff is collapsed.
Click to expand it.
bl2/aarch64/bl2_el3_entrypoint.S
View file @
508a48bb
...
...
@@ -10,7 +10,6 @@
#include <el3_common_macros.S>
.
globl
bl2_entrypoint
.
globl
bl2_vector_table
.
globl
bl2_el3_run_image
.
globl
bl2_run_next_image
...
...
@@ -51,6 +50,13 @@ func bl2_entrypoint
#if ENABLE_PAUTH
mrs
x0
,
sctlr_el3
orr
x0
,
x0
,
#
SCTLR_EnIA_BIT
#if ENABLE_BTI
/
*
---------------------------------------------
*
Enable
PAC
branch
type
compatibility
*
---------------------------------------------
*/
bic
x0
,
x0
,
#
SCTLR_BT_BIT
#endif /* ENABLE_BTI */
msr
sctlr_el3
,
x0
isb
#endif /* ENABLE_PAUTH */
...
...
This diff is collapsed.
Click to expand it.
bl2/aarch64/bl2_entrypoint.S
View file @
508a48bb
...
...
@@ -124,6 +124,13 @@ func bl2_entrypoint
#if ENABLE_PAUTH
mrs
x0
,
sctlr_el1
orr
x0
,
x0
,
#
SCTLR_EnIA_BIT
#if ENABLE_BTI
/
*
---------------------------------------------
*
Enable
PAC
branch
type
compatibility
*
---------------------------------------------
*/
bic
x0
,
x0
,
#(
SCTLR_BT0_BIT
|
SCTLR_BT1_BIT
)
#endif /* ENABLE_BTI */
msr
sctlr_el1
,
x0
isb
#endif /* ENABLE_PAUTH */
...
...
This diff is collapsed.
Click to expand it.
bl2/bl2.mk
View file @
508a48bb
...
...
@@ -15,10 +15,6 @@ ifeq (${ARCH},aarch64)
BL2_SOURCES
+=
common/aarch64/early_exceptions.S
endif
ifeq
(${ENABLE_PAUTH},1)
BL2_CFLAGS
+=
-msign-return-address
=
non-leaf
endif
ifeq
(${BL2_AT_EL3},0)
BL2_SOURCES
+=
bl2/
${ARCH}
/bl2_entrypoint.S
BL2_LINKERFILE
:=
bl2/bl2.ld.S
...
...
This diff is collapsed.
Click to expand it.
bl31/aarch64/bl31_entrypoint.S
View file @
508a48bb
...
...
@@ -105,6 +105,13 @@ func bl31_entrypoint
#if ENABLE_PAUTH
mrs
x0
,
sctlr_el3
orr
x0
,
x0
,
#
SCTLR_EnIA_BIT
#if ENABLE_BTI
/
*
--------------------------------------------------------------------
*
Enable
PAC
branch
type
compatibility
*
--------------------------------------------------------------------
*/
bic
x0
,
x0
,
#
SCTLR_BT_BIT
#endif /* ENABLE_BTI */
msr
sctlr_el3
,
x0
isb
#endif /* ENABLE_PAUTH */
...
...
@@ -211,6 +218,13 @@ func bl31_warm_entrypoint
mrs
x0
,
sctlr_el3
orr
x0
,
x0
,
#
SCTLR_EnIA_BIT
#if ENABLE_BTI
/
*
--------------------------------------------------------------------
*
Enable
PAC
branch
type
compatibility
*
--------------------------------------------------------------------
*/
bic
x0
,
x0
,
#
SCTLR_BT_BIT
#endif /* ENABLE_BTI */
msr
sctlr_el3
,
x0
isb
#endif /* ENABLE_PAUTH */
...
...
This diff is collapsed.
Click to expand it.
bl31/bl31.mk
View file @
508a48bb
...
...
@@ -75,10 +75,6 @@ ifeq (${ENABLE_MPAM_FOR_LOWER_ELS},1)
BL31_SOURCES
+=
lib/extensions/mpam/mpam.c
endif
ifeq
(${ENABLE_PAUTH},1)
BL31_CFLAGS
+=
-msign-return-address
=
non-leaf
endif
ifeq
(${WORKAROUND_CVE_2017_5715},1)
BL31_SOURCES
+=
lib/cpus/aarch64/wa_cve_2017_5715_bpiall.S
\
lib/cpus/aarch64/wa_cve_2017_5715_mmu.S
...
...
This diff is collapsed.
Click to expand it.
bl32/tsp/aarch64/tsp_entrypoint.S
View file @
508a48bb
...
...
@@ -136,6 +136,13 @@ func tsp_entrypoint _align=3
#if ENABLE_PAUTH
mrs
x0
,
sctlr_el1
orr
x0
,
x0
,
#
SCTLR_EnIA_BIT
#if ENABLE_BTI
/
*
---------------------------------------------
*
Enable
PAC
branch
type
compatibility
*
---------------------------------------------
*/
bic
x0
,
x0
,
#(
SCTLR_BT0_BIT
|
SCTLR_BT1_BIT
)
#endif /* ENABLE_BTI */
msr
sctlr_el1
,
x0
isb
#endif /* ENABLE_PAUTH */
...
...
@@ -164,7 +171,7 @@ endfunc tsp_entrypoint
*
TSPD
for
the
various
entrypoints
*
-------------------------------------------
*/
func
tsp_vector_table
vector_base
tsp_vector_table
b
tsp_yield_smc_entry
b
tsp_fast_smc_entry
b
tsp_cpu_on_entry
...
...
@@ -175,7 +182,6 @@ func tsp_vector_table
b
tsp_system_off_entry
b
tsp_system_reset_entry
b
tsp_abort_yield_smc_entry
endfunc
tsp_vector_table
/*---------------------------------------------
*
This
entrypoint
is
used
by
the
TSPD
when
this
...
...
This diff is collapsed.
Click to expand it.
bl32/tsp/tsp.mk
View file @
508a48bb
...
...
@@ -17,11 +17,6 @@ BL32_SOURCES += bl32/tsp/tsp_main.c \
BL32_LINKERFILE
:=
bl32/tsp/tsp.ld.S
# This flag determines whether pointer authentication is used in the TSP or not
ifeq
($(ENABLE_PAUTH),1)
BL32_CFLAGS
+=
-msign-return-address
=
non-leaf
endif
# This flag determines if the TSPD initializes BL32 in tspd_init() (synchronous
# method) or configures BL31 to pass control to BL32 instead of BL33
# (asynchronous method).
...
...
This diff is collapsed.
Click to expand it.
docs/design/firmware-design.rst
View file @
508a48bb
...
...
@@ -2564,7 +2564,7 @@ Armv8.3-A
to
the
context
that
is
saved
when
doing
a
world
switch
.
The
TF
-
A
itself
has
support
for
pointer
authentication
at
runtime
that
can
be
enabled
by
setting
both
options
``
ENABLE_PAUTH
``
and
that
can
be
enabled
by
setting
``
BRANCH_PROTECTION
``
option
to
non
-
zero
and
``
CTX_INCLUDE_PAUTH_REGS
``
to
1.
This
enables
pointer
authentication
in
BL1
,
BL2
,
BL31
,
and
the
TSP
if
it
is
used
.
...
...
@@ -2577,6 +2577,12 @@ Armv8.3-A
enabling
PAuth
is
lower
because
the
compiler
will
use
the
optimized
PAuth
instructions
rather
than
the
backwards
-
compatible
ones
.
Armv8
.5
-
A
~~~~~~~~~
-
Branch
Target
Identification
feature
is
selected
by
``
BRANCH_PROTECTION
``
option
set
to
1.
This
option
defaults
to
0
and
this
is
an
experimental
feature
.
Armv7
-
A
~~~~~~~
...
...
This diff is collapsed.
Click to expand it.
docs/getting_started/user-guide.rst
View file @
508a48bb
...
...
@@ -315,6 +315,34 @@ Common build options
file that contains the BL33 private key in PEM format. If ``SAVE_KEYS=1``,
this file name will be used to save the key.
- ``BRANCH_PROTECTION``: Numeric value to enable ARMv8.3 Pointer Authentication
and ARMv8.5 Branch Target Identification support for TF-A BL images themselves.
If enabled, it is needed to use a compiler that supports the option
``-mbranch-protection``. Selects the branch protection features to use:
- 0: Default value turns off all types of branch protection
- 1: Enables all types of branch protection features
- 2: Return address signing to its standard level
- 3: Extend the signing to include leaf functions
The table below summarizes ``BRANCH_PROTECTION`` values, GCC compilation options
and resulting PAuth/BTI features.
+-------+--------------+-------+-----+
| Value | GCC option | PAuth | BTI |
+=======+==============+=======+=====+
| 0 | none | N | N |
+-------+--------------+-------+-----+
| 1 | standard | Y | Y |
+-------+--------------+-------+-----+
| 2 | pac-ret | Y | N |
+-------+--------------+-------+-----+
| 3 | pac-ret+leaf | Y | N |
+-------+--------------+-------+-----+
This option defaults to 0 and this is an experimental feature.
Note that Pointer Authentication is enabled for Non-secure world
irrespective of the value of this option if the CPU supports it.
- ``BUILD_MESSAGE_TIMESTAMP``: String used to identify the time and date of the
compilation of each build. It must be set to a C string (including quotes
where applicable). Defaults to a string that contains the time and date of
...
...
@@ -354,17 +382,12 @@ Common build options
registers
to
be
included
when
saving
and
restoring
the
CPU
context
.
Default
is
0.
-
``
CTX_INCLUDE_PAUTH_REGS
``:
Boolean
option
that
,
when
set
to
1
,
allows
Pointer
Authentication
for
**
Secure
world
**.
This
will
cause
the
Armv8
.3
-
PAuth
registers
to
be
included
when
saving
and
restoring
the
CPU
context
as
part
of
a
world
switch
.
Default
value
is
0.
Pointer
Authentication
is
an
experimental
feature
.
Note
that
,
if
the
CPU
supports
it
,
Pointer
Authentication
is
allowed
for
Non
-
secure
world
irrespectively
of
the
value
of
this
flag
.
"Allowed"
means
that
accesses
to
PAuth
-
related
registers
or
execution
of
PAuth
-
related
instructions
will
not
be
trapped
to
EL3
.
As
such
,
usage
or
not
of
PAuth
in
Non
-
secure
world
images
,
depends
on
those
images
themselves
.
-
``
CTX_INCLUDE_PAUTH_REGS
``:
Boolean
option
that
,
when
set
to
1
,
enables
Pointer
Authentication
for
Secure
world
.
This
will
cause
the
ARMv8
.3
-
PAuth
registers
to
be
included
when
saving
and
restoring
the
CPU
context
as
part
of
world
switch
.
Default
value
is
0
and
this
is
an
experimental
feature
.
Note
that
Pointer
Authentication
is
enabled
for
Non
-
secure
world
irrespective
of
the
value
of
this
flag
if
the
CPU
supports
it
.
-
``
DEBUG
``:
Chooses
between
a
debug
and
release
build
.
It
can
take
either
0
(
release
)
or
1
(
debug
)
as
values
.
0
is
the
default
.
...
...
@@ -417,13 +440,6 @@ Common build options
partitioning
in
EL3
,
however
.
Platform
initialisation
code
should
configure
and
use
partitions
in
EL3
as
required
.
This
option
defaults
to
``
0
``.
-
``
ENABLE_PAUTH
``:
Boolean
option
to
enable
Armv8
.3
Pointer
Authentication
for
**
TF
-
A
BL
images
themselves
**.
If
enabled
,
the
compiler
must
support
the
``-
msign
-
return
-
address
``
option
.
This
flag
defaults
to
0.
Pointer
Authentication
is
an
experimental
feature
.
If
this
flag
is
enabled
,
``
CTX_INCLUDE_PAUTH_REGS
``
must
also
be
enabled
.
-
``
ENABLE_PIE
``:
Boolean
option
to
enable
Position
Independent
Executable
(
PIE
)
support
within
generic
code
in
TF
-
A
.
This
option
is
currently
only
supported
in
BL31
.
Default
is
0.
...
...
This diff is collapsed.
Click to expand it.
include/arch/aarch64/arch.h
View file @
508a48bb
...
...
@@ -163,16 +163,12 @@
/* ID_AA64ISAR1_EL1 definitions */
#define ID_AA64ISAR1_EL1 S3_0_C0_C6_1
#define ID_AA64ISAR1_GPI_SHIFT U(28)
#define ID_AA64ISAR1_GPI_WIDTH U(4)
#define ID_AA64ISAR1_GPI_MASK ULL(0xf)
#define ID_AA64ISAR1_GPA_SHIFT U(24)
#define ID_AA64ISAR1_GPA_WIDTH U(4)
#define ID_AA64ISAR1_GPA_MASK ULL(0xf)
#define ID_AA64ISAR1_API_SHIFT U(8)
#define ID_AA64ISAR1_API_WIDTH U(4)
#define ID_AA64ISAR1_API_MASK ULL(0xf)
#define ID_AA64ISAR1_APA_SHIFT U(4)
#define ID_AA64ISAR1_APA_WIDTH U(4)
#define ID_AA64ISAR1_APA_MASK ULL(0xf)
/* ID_AA64MMFR0_EL1 definitions */
...
...
@@ -217,6 +213,11 @@
#define SSBS_UNAVAILABLE ULL(0)
/* No architectural SSBS support */
#define ID_AA64PFR1_EL1_BT_SHIFT U(0)
#define ID_AA64PFR1_EL1_BT_MASK ULL(0xf)
#define BTI_IMPLEMENTED ULL(1)
/* The BTI mechanism is implemented */
/* ID_PFR1_EL1 definitions */
#define ID_PFR1_VIRTEXT_SHIFT U(12)
#define ID_PFR1_VIRTEXT_MASK U(0xf)
...
...
@@ -260,6 +261,9 @@
#define SCTLR_EE_BIT (ULL(1) << 25)
#define SCTLR_UCI_BIT (ULL(1) << 26)
#define SCTLR_EnIA_BIT (ULL(1) << 31)
#define SCTLR_BT0_BIT (ULL(1) << 35)
#define SCTLR_BT1_BIT (ULL(1) << 36)
#define SCTLR_BT_BIT (ULL(1) << 36)
#define SCTLR_DSSBS_BIT (ULL(1) << 44)
#define SCTLR_RESET_VAL SCTLR_EL3_RES1
...
...
This diff is collapsed.
Click to expand it.
include/arch/aarch64/arch_features.h
View file @
508a48bb
...
...
@@ -48,4 +48,10 @@ static inline bool is_armv8_4_ttst_present(void)
ID_AA64MMFR2_EL1_ST_MASK
)
==
1U
;
}
static
inline
bool
is_armv8_5_bti_present
(
void
)
{
return
((
read_id_aa64pfr1_el1
()
>>
ID_AA64PFR1_EL1_BT_SHIFT
)
&
ID_AA64PFR1_EL1_BT_MASK
)
==
BTI_IMPLEMENTED
;
}
#endif
/* ARCH_FEATURES_H */
This diff is collapsed.
Click to expand it.
include/arch/aarch64/asm_macros.S
View file @
508a48bb
/*
*
Copyright
(
c
)
2013
-
201
8
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
Copyright
(
c
)
2013
-
201
9
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
SPDX
-
License
-
Identifier
:
BSD
-
3
-
Clause
*/
...
...
@@ -10,6 +10,10 @@
#include <common/asm_macros_common.S>
#include <lib/spinlock.h>
#if ENABLE_BTI && !ARM_ARCH_AT_LEAST(8, 5)
#error Branch Target Identification requires ARM_ARCH_MINOR >= 5
#endif
/*
*
TLBI
instruction
with
type
specifier
that
implements
the
workaround
for
*
errata
813419
of
Cortex
-
A57
or
errata
1286807
of
Cortex
-
A76
.
...
...
@@ -192,4 +196,26 @@
.
endm
#endif
/
*
*
Helper
macro
to
read
system
register
value
into
x0
*/
.
macro
read
reg
:
req
#if ENABLE_BTI
bti
j
#endif
mrs
x0
,
\
reg
ret
.
endm
/
*
*
Helper
macro
to
write
value
from
x1
to
system
register
*/
.
macro
write
reg
:
req
#if ENABLE_BTI
bti
j
#endif
msr
\
reg
,
x1
ret
.
endm
#endif /* ASM_MACROS_S */
This diff is collapsed.
Click to expand it.
include/common/asm_macros_common.S
View file @
508a48bb
/*
*
Copyright
(
c
)
2013
-
201
8
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
Copyright
(
c
)
2013
-
201
9
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
SPDX
-
License
-
Identifier
:
BSD
-
3
-
Clause
*/
...
...
@@ -38,6 +38,12 @@
.
cfi_startproc
.
align
\
_align
\
_name
:
#if ENABLE_BTI
/
*
When
Branch
Target
Identification
is
enabled
,
insert
"bti jc"
*
instruction
to
enable
indirect
calls
and
branches
*/
bti
jc
#endif
.
endm
/
*
...
...
This diff is collapsed.
Click to expand it.
include/lib/xlat_tables/xlat_tables_defs.h
View file @
508a48bb
/*
* Copyright (c) 2017-201
8
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2017-201
9
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -62,6 +62,11 @@
#define OSH (U(0x2) << 6)
#define ISH (U(0x3) << 6)
#ifdef AARCH64
/* Guarded Page bit */
#define GP (ULL(1) << 50)
#endif
#define TABLE_ADDR_MASK ULL(0x0000FFFFFFFFF000)
/*
...
...
This diff is collapsed.
Click to expand it.
lib/aarch64/cache_helpers.S
View file @
508a48bb
/*
*
Copyright
(
c
)
2013
-
201
4
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
Copyright
(
c
)
2013
-
201
9
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
SPDX
-
License
-
Identifier
:
BSD
-
3
-
Clause
*/
...
...
@@ -91,6 +91,9 @@ func do_dcsw_op
cbz
x3
,
exit
adr
x14
,
dcsw_loop_table
//
compute
inner
loop
address
add
x14
,
x14
,
x0
,
lsl
#
5
//
inner
loop
is
8
x32
-
bit
instructions
#if ENABLE_BTI
add
x14
,
x14
,
x0
,
lsl
#
2
//
inner
loop
is
+
"bti j"
instruction
#endif
mov
x0
,
x9
mov
w8
,
#
1
loop1
:
...
...
@@ -116,6 +119,9 @@ loop1:
br
x14
//
jump
to
DC
operation
specific
loop
.
macro
dcsw_loop
_op
#if ENABLE_BTI
bti
j
#endif
loop2_
\
_op
:
lsl
w7
,
w6
,
w2
//
w7
=
aligned
max
set
number
...
...
This diff is collapsed.
Click to expand it.
lib/cpus/aarch64/cpuamu_helpers.S
View file @
508a48bb
/*
*
Copyright
(
c
)
2018
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
Copyright
(
c
)
2018
-
2019
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
SPDX
-
License
-
Identifier
:
BSD
-
3
-
Clause
*/
...
...
@@ -23,21 +23,17 @@
*/
func
cpuamu_cnt_read
adr
x1
,
1
f
lsl
x0
,
x0
,
#
3
add
x1
,
x1
,
x0
add
x1
,
x1
,
x0
,
lsl
#
3
/*
each
mrs
/
ret
sequence
is
8
bytes
*/
#if ENABLE_BTI
add
x1
,
x1
,
x0
,
lsl
#
2
/*
+
"bti j"
instruction
*/
#endif
br
x1
1
:
mrs
x0
,
CPUAMEVCNTR0_EL0
ret
mrs
x0
,
CPUAMEVCNTR1_EL0
ret
mrs
x0
,
CPUAMEVCNTR2_EL0
ret
mrs
x0
,
CPUAMEVCNTR3_EL0
ret
mrs
x0
,
CPUAMEVCNTR4_EL0
ret
1
:
read
CPUAMEVCNTR0_EL0
read
CPUAMEVCNTR1_EL0
read
CPUAMEVCNTR2_EL0
read
CPUAMEVCNTR3_EL0
read
CPUAMEVCNTR4_EL0
endfunc
cpuamu_cnt_read
/*
...
...
@@ -47,21 +43,17 @@ endfunc cpuamu_cnt_read
*/
func
cpuamu_cnt_write
adr
x2
,
1
f
lsl
x0
,
x0
,
#
3
add
x2
,
x2
,
x0
add
x2
,
x2
,
x0
,
lsl
#
3
/*
each
msr
/
ret
sequence
is
8
bytes
*/
#if ENABLE_BTI
add
x2
,
x2
,
x0
,
lsl
#
2
/*
+
"bti j"
instruction
*/
#endif
br
x2
1
:
msr
CPUAMEVCNTR0_EL0
,
x0
ret
msr
CPUAMEVCNTR1_EL0
,
x0
ret
msr
CPUAMEVCNTR2_EL0
,
x0
ret
msr
CPUAMEVCNTR3_EL0
,
x0
ret
msr
CPUAMEVCNTR4_EL0
,
x0
ret
1
:
write
CPUAMEVCNTR0_EL0
write
CPUAMEVCNTR1_EL0
write
CPUAMEVCNTR2_EL0
write
CPUAMEVCNTR3_EL0
write
CPUAMEVCNTR4_EL0
endfunc
cpuamu_cnt_write
/*
...
...
This diff is collapsed.
Click to expand it.
lib/extensions/amu/aarch64/amu_helpers.S
View file @
508a48bb
/*
*
Copyright
(
c
)
2017
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
Copyright
(
c
)
2017
-
2019
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
SPDX
-
License
-
Identifier
:
BSD
-
3
-
Clause
*/
...
...
@@ -21,35 +21,29 @@
*
and
return
it
in
`
x0
`
.
*/
func
amu_group0_cnt_read_internal
adr
x1
,
1
f
#if ENABLE_ASSERTIONS
/
*
*
It
can
be
dangerous
to
call
this
function
with
an
*
out
of
bounds
index
.
Ensure
`
idx
`
is
valid
.
*/
mov
x1
,
x0
lsr
x1
,
x1
,
#
2
cmp
x1
,
#
0
tst
x0
,
#
~
3
ASM_ASSERT
(
eq
)
#endif
/
*
*
Given
`
idx
`
calculate
address
of
mrs
/
ret
instruction
pair
*
in
the
table
below
.
*/
adr
x1
,
1
f
lsl
x0
,
x0
,
#
3
/*
each
mrs
/
ret
sequence
is
8
bytes
*/
add
x1
,
x1
,
x0
add
x1
,
x1
,
x0
,
lsl
#
3
/*
each
mrs
/
ret
sequence
is
8
bytes
*/
#if ENABLE_BTI
add
x1
,
x1
,
x0
,
lsl
#
2
/*
+
"bti j"
instruction
*/
#endif
br
x1
1
:
mrs
x0
,
AMEVCNTR00_EL0
/*
index
0
*/
ret
mrs
x0
,
AMEVCNTR01_EL0
/*
index
1
*/
ret
mrs
x0
,
AMEVCNTR02_EL0
/*
index
2
*/
ret
mrs
x0
,
AMEVCNTR03_EL0
/*
index
3
*/
ret
1
:
read
AMEVCNTR00_EL0
/*
index
0
*/
read
AMEVCNTR01_EL0
/*
index
1
*/
read
AMEVCNTR02_EL0
/*
index
2
*/
read
AMEVCNTR03_EL0
/*
index
3
*/
endfunc
amu_group0_cnt_read_internal
/*
...
...
@@ -58,35 +52,29 @@ endfunc amu_group0_cnt_read_internal
*
Given
`
idx
`
,
write
`
val
`
to
the
corresponding
AMU
counter
.
*/
func
amu_group0_cnt_write_internal
adr
x2
,
1
f
#if ENABLE_ASSERTIONS
/
*
*
It
can
be
dangerous
to
call
this
function
with
an
*
out
of
bounds
index
.
Ensure
`
idx
`
is
valid
.
*/
mov
x2
,
x0
lsr
x2
,
x2
,
#
2
cmp
x2
,
#
0
tst
x0
,
#
~
3
ASM_ASSERT
(
eq
)
#endif
/
*
*
Given
`
idx
`
calculate
address
of
mrs
/
ret
instruction
pair
*
in
the
table
below
.
*/
adr
x2
,
1
f
lsl
x0
,
x0
,
#
3
/*
each
msr
/
ret
sequence
is
8
bytes
*/
add
x2
,
x2
,
x0
add
x2
,
x2
,
x0
,
lsl
#
3
/*
each
msr
/
ret
sequence
is
8
bytes
*/
#if ENABLE_BTI
add
x2
,
x2
,
x0
,
lsl
#
2
/*
+
"bti j"
instruction
*/
#endif
br
x2
1
:
msr
AMEVCNTR00_EL0
,
x1
/*
index
0
*/
ret
msr
AMEVCNTR01_EL0
,
x1
/*
index
1
*/
ret
msr
AMEVCNTR02_EL0
,
x1
/*
index
2
*/
ret
msr
AMEVCNTR03_EL0
,
x1
/*
index
3
*/
ret
1
:
write
AMEVCNTR00_EL0
/*
index
0
*/
write
AMEVCNTR01_EL0
/*
index
1
*/
write
AMEVCNTR02_EL0
/*
index
2
*/
write
AMEVCNTR03_EL0
/*
index
3
*/
endfunc
amu_group0_cnt_write_internal
/*
...
...
@@ -96,59 +84,41 @@ endfunc amu_group0_cnt_write_internal
*
and
return
it
in
`
x0
`
.
*/
func
amu_group1_cnt_read_internal
adr
x1
,
1
f
#if ENABLE_ASSERTIONS
/
*
*
It
can
be
dangerous
to
call
this
function
with
an
*
out
of
bounds
index
.
Ensure
`
idx
`
is
valid
.
*/
mov
x1
,
x0
lsr
x1
,
x1
,
#
4
cmp
x1
,
#
0
tst
x0
,
#
~
0xF
ASM_ASSERT
(
eq
)
#endif
/
*
*
Given
`
idx
`
calculate
address
of
mrs
/
ret
instruction
pair
*
in
the
table
below
.
*/
adr
x1
,
1
f
lsl
x0
,
x0
,
#
3
/*
each
mrs
/
ret
sequence
is
8
bytes
*/
add
x1
,
x1
,
x0
add
x1
,
x1
,
x0
,
lsl
#
3
/*
each
mrs
/
ret
sequence
is
8
bytes
*/
#if ENABLE_BTI
add
x1
,
x1
,
x0
,
lsl
#
2
/*
+
"bti j"
instruction
*/
#endif
br
x1
1
:
mrs
x0
,
AMEVCNTR10_EL0
/*
index
0
*/
ret
mrs
x0
,
AMEVCNTR11_EL0
/*
index
1
*/
ret
mrs
x0
,
AMEVCNTR12_EL0
/*
index
2
*/
ret
mrs
x0
,
AMEVCNTR13_EL0
/*
index
3
*/
ret
mrs
x0
,
AMEVCNTR14_EL0
/*
index
4
*/
ret
mrs
x0
,
AMEVCNTR15_EL0
/*
index
5
*/
ret
mrs
x0
,
AMEVCNTR16_EL0
/*
index
6
*/
ret
mrs
x0
,
AMEVCNTR17_EL0
/*
index
7
*/
ret
mrs
x0
,
AMEVCNTR18_EL0
/*
index
8
*/
ret
mrs
x0
,
AMEVCNTR19_EL0
/*
index
9
*/
ret
mrs
x0
,
AMEVCNTR1A_EL0
/*
index
10
*/
ret
mrs
x0
,
AMEVCNTR1B_EL0
/*
index
11
*/
ret
mrs
x0
,
AMEVCNTR1C_EL0
/*
index
12
*/
ret
mrs
x0
,
AMEVCNTR1D_EL0
/*
index
13
*/
ret
mrs
x0
,
AMEVCNTR1E_EL0
/*
index
14
*/
ret
mrs
x0
,
AMEVCNTR1F_EL0
/*
index
15
*/
ret
1
:
read
AMEVCNTR10_EL0
/*
index
0
*/
read
AMEVCNTR11_EL0
/*
index
1
*/
read
AMEVCNTR12_EL0
/*
index
2
*/
read
AMEVCNTR13_EL0
/*
index
3
*/
read
AMEVCNTR14_EL0
/*
index
4
*/
read
AMEVCNTR15_EL0
/*
index
5
*/
read
AMEVCNTR16_EL0
/*
index
6
*/
read
AMEVCNTR17_EL0
/*
index
7
*/
read
AMEVCNTR18_EL0
/*
index
8
*/
read
AMEVCNTR19_EL0
/*
index
9
*/
read
AMEVCNTR1A_EL0
/*
index
10
*/
read
AMEVCNTR1B_EL0
/*
index
11
*/
read
AMEVCNTR1C_EL0
/*
index
12
*/
read
AMEVCNTR1D_EL0
/*
index
13
*/
read
AMEVCNTR1E_EL0
/*
index
14
*/
read
AMEVCNTR1F_EL0
/*
index
15
*/
endfunc
amu_group1_cnt_read_internal
/*
...
...
@@ -157,59 +127,41 @@ endfunc amu_group1_cnt_read_internal
*
Given
`
idx
`
,
write
`
val
`
to
the
corresponding
AMU
counter
.
*/
func
amu_group1_cnt_write_internal
adr
x2
,
1
f
#if ENABLE_ASSERTIONS
/
*
*
It
can
be
dangerous
to
call
this
function
with
an
*
out
of
bounds
index
.
Ensure
`
idx
`
is
valid
.
*/
mov
x2
,
x0
lsr
x2
,
x2
,
#
4
cmp
x2
,
#
0
tst
x0
,
#
~
0xF
ASM_ASSERT
(
eq
)
#endif
/
*
*
Given
`
idx
`
calculate
address
of
mrs
/
ret
instruction
pair
*
in
the
table
below
.
*/
adr
x2
,
1
f
lsl
x0
,
x0
,
#
3
/*
each
msr
/
ret
sequence
is
8
bytes
*/
add
x2
,
x2
,
x0
add
x2
,
x2
,
x0
,
lsl
#
3
/*
each
msr
/
ret
sequence
is
8
bytes
*/
#if ENABLE_BTI
add
x2
,
x2
,
x0
,
lsl
#
2
/*
+
"bti j"
instruction
*/
#endif
br
x2
1
:
msr
AMEVCNTR10_EL0
,
x1
/*
index
0
*/
ret
msr
AMEVCNTR11_EL0
,
x1
/*
index
1
*/
ret
msr
AMEVCNTR12_EL0
,
x1
/*
index
2
*/
ret
msr
AMEVCNTR13_EL0
,
x1
/*
index
3
*/
ret
msr
AMEVCNTR14_EL0
,
x1
/*
index
4
*/
ret
msr
AMEVCNTR15_EL0
,
x1
/*
index
5
*/
ret
msr
AMEVCNTR16_EL0
,
x1
/*
index
6
*/
ret
msr
AMEVCNTR17_EL0
,
x1
/*
index
7
*/
ret
msr
AMEVCNTR18_EL0
,
x1
/*
index
8
*/
ret
msr
AMEVCNTR19_EL0
,
x1
/*
index
9
*/
ret
msr
AMEVCNTR1A_EL0
,
x1
/*
index
10
*/
ret
msr
AMEVCNTR1B_EL0
,
x1
/*
index
11
*/
ret
msr
AMEVCNTR1C_EL0
,
x1
/*
index
12
*/
ret
msr
AMEVCNTR1D_EL0
,
x1
/*
index
13
*/
ret
msr
AMEVCNTR1E_EL0
,
x1
/*
index
14
*/
ret
msr
AMEVCNTR1F_EL0
,
x1
/*
index
15
*/
ret
1
:
write
AMEVCNTR10_EL0
/*
index
0
*/
write
AMEVCNTR11_EL0
/*
index
1
*/
write
AMEVCNTR12_EL0
/*
index
2
*/
write
AMEVCNTR13_EL0
/*
index
3
*/
write
AMEVCNTR14_EL0
/*
index
4
*/
write
AMEVCNTR15_EL0
/*
index
5
*/
write
AMEVCNTR16_EL0
/*
index
6
*/
write
AMEVCNTR17_EL0
/*
index
7
*/
write
AMEVCNTR18_EL0
/*
index
8
*/
write
AMEVCNTR19_EL0
/*
index
9
*/
write
AMEVCNTR1A_EL0
/*
index
10
*/
write
AMEVCNTR1B_EL0
/*
index
11
*/
write
AMEVCNTR1C_EL0
/*
index
12
*/
write
AMEVCNTR1D_EL0
/*
index
13
*/
write
AMEVCNTR1E_EL0
/*
index
14
*/
write
AMEVCNTR1F_EL0
/*
index
15
*/
endfunc
amu_group1_cnt_write_internal
/*
...
...
@@ -219,63 +171,43 @@ endfunc amu_group1_cnt_write_internal
*
with
the
value
`
val
`
.
*/
func
amu_group1_set_evtype_internal
adr
x2
,
1
f
#if ENABLE_ASSERTIONS
/
*
*
It
can
be
dangerous
to
call
this
function
with
an
*
out
of
bounds
index
.
Ensure
`
idx
`
is
valid
.
*/
mov
x2
,
x0
lsr
x2
,
x2
,
#
4
cmp
x2
,
#
0
tst
x0
,
#
~
0xF
ASM_ASSERT
(
eq
)
/
*
val
should
be
between
[
0
,
65535
]
*/
mov
x2
,
x1
lsr
x2
,
x2
,
#
16
cmp
x2
,
#
0
tst
x1
,
#
~
0xFFFF
ASM_ASSERT
(
eq
)
#endif
/
*
*
Given
`
idx
`
calculate
address
of
msr
/
ret
instruction
pair
*
in
the
table
below
.
*/
adr
x2
,
1
f
lsl
x0
,
x0
,
#
3
/*
each
msr
/
ret
sequence
is
8
bytes
*/
add
x2
,
x2
,
x0
add
x2
,
x2
,
x0
,
lsl
#
3
/*
each
msr
/
ret
sequence
is
8
bytes
*/
#if ENABLE_BTI
add
x2
,
x2
,
x0
,
lsl
#
2
/*
+
"bti j"
instruction
*/
#endif
br
x2
1
:
msr
AMEVTYPER10_EL0
,
x1
/*
index
0
*/
ret
msr
AMEVTYPER11_EL0
,
x1
/*
index
1
*/
ret
msr
AMEVTYPER12_EL0
,
x1
/*
index
2
*/
ret
msr
AMEVTYPER13_EL0
,
x1
/*
index
3
*/
ret
msr
AMEVTYPER14_EL0
,
x1
/*
index
4
*/
ret
msr
AMEVTYPER15_EL0
,
x1
/*
index
5
*/
ret
msr
AMEVTYPER16_EL0
,
x1
/*
index
6
*/
ret
msr
AMEVTYPER17_EL0
,
x1
/*
index
7
*/
ret
msr
AMEVTYPER18_EL0
,
x1
/*
index
8
*/
ret
msr
AMEVTYPER19_EL0
,
x1
/*
index
9
*/
ret
msr
AMEVTYPER1A_EL0
,
x1
/*
index
10
*/
ret
msr
AMEVTYPER1B_EL0
,
x1
/*
index
11
*/
ret
msr
AMEVTYPER1C_EL0
,
x1
/*
index
12
*/
ret
msr
AMEVTYPER1D_EL0
,
x1
/*
index
13
*/
ret
msr
AMEVTYPER1E_EL0
,
x1
/*
index
14
*/
ret
msr
AMEVTYPER1F_EL0
,
x1
/*
index
15
*/
ret
1
:
write
AMEVTYPER10_EL0
/*
index
0
*/
write
AMEVTYPER11_EL0
/*
index
1
*/
write
AMEVTYPER12_EL0
/*
index
2
*/
write
AMEVTYPER13_EL0
/*
index
3
*/
write
AMEVTYPER14_EL0
/*
index
4
*/
write
AMEVTYPER15_EL0
/*
index
5
*/
write
AMEVTYPER16_EL0
/*
index
6
*/
write
AMEVTYPER17_EL0
/*
index
7
*/
write
AMEVTYPER18_EL0
/*
index
8
*/
write
AMEVTYPER19_EL0
/*
index
9
*/
write
AMEVTYPER1A_EL0
/*
index
10
*/
write
AMEVTYPER1B_EL0
/*
index
11
*/
write
AMEVTYPER1C_EL0
/*
index
12
*/
write
AMEVTYPER1D_EL0
/*
index
13
*/
write
AMEVTYPER1E_EL0
/*
index
14
*/
write
AMEVTYPER1F_EL0
/*
index
15
*/
endfunc
amu_group1_set_evtype_internal
This diff is collapsed.
Click to expand it.
lib/xlat_tables_v2/xlat_tables_core.c
View file @
508a48bb
/*
* Copyright (c) 2017-201
8
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2017-201
9
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -12,6 +12,7 @@
#include <platform_def.h>
#include <arch_features.h>
#include <arch_helpers.h>
#include <common/debug.h>
#include <lib/utils_def.h>
...
...
@@ -195,6 +196,18 @@ uint64_t xlat_desc(const xlat_ctx_t *ctx, uint32_t attr,
if
(
mem_type
==
MT_MEMORY
)
{
desc
|=
LOWER_ATTRS
(
ATTR_IWBWA_OWBWA_NTR_INDEX
|
ISH
);
/* Check if Branch Target Identification is enabled */
#if ENABLE_BTI
/* Set GP bit for block and page code entries
* if BTI mechanism is implemented.
*/
if
(
is_armv8_5_bti_present
()
&&
((
attr
&
(
MT_TYPE_MASK
|
MT_RW
|
MT_EXECUTE_NEVER
))
==
MT_CODE
))
{
desc
|=
GP
;
}
#endif
}
else
{
assert
(
mem_type
==
MT_NON_CACHEABLE
);
desc
|=
LOWER_ATTRS
(
ATTR_NON_CACHEABLE_INDEX
|
OSH
);
...
...
This diff is collapsed.
Click to expand it.
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
Menu
Projects
Groups
Snippets
Help