mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-18 10:34:19 +00:00
Merge "build(mpam): add new build option CTX_INCLUDE_MPAM_REGS" into integration
This commit is contained in:
commit
e631ac3b21
5 changed files with 68 additions and 16 deletions
2
Makefile
2
Makefile
|
@ -1170,6 +1170,7 @@ $(eval $(call assert_booleans,\
|
||||||
CTX_INCLUDE_AARCH32_REGS \
|
CTX_INCLUDE_AARCH32_REGS \
|
||||||
CTX_INCLUDE_FPREGS \
|
CTX_INCLUDE_FPREGS \
|
||||||
CTX_INCLUDE_EL2_REGS \
|
CTX_INCLUDE_EL2_REGS \
|
||||||
|
CTX_INCLUDE_MPAM_REGS \
|
||||||
DEBUG \
|
DEBUG \
|
||||||
DYN_DISABLE_AUTH \
|
DYN_DISABLE_AUTH \
|
||||||
EL3_EXCEPTION_HANDLING \
|
EL3_EXCEPTION_HANDLING \
|
||||||
|
@ -1320,6 +1321,7 @@ $(eval $(call add_defines,\
|
||||||
CTX_INCLUDE_AARCH32_REGS \
|
CTX_INCLUDE_AARCH32_REGS \
|
||||||
CTX_INCLUDE_FPREGS \
|
CTX_INCLUDE_FPREGS \
|
||||||
CTX_INCLUDE_PAUTH_REGS \
|
CTX_INCLUDE_PAUTH_REGS \
|
||||||
|
CTX_INCLUDE_MPAM_REGS \
|
||||||
EL3_EXCEPTION_HANDLING \
|
EL3_EXCEPTION_HANDLING \
|
||||||
CTX_INCLUDE_MTE_REGS \
|
CTX_INCLUDE_MTE_REGS \
|
||||||
CTX_INCLUDE_EL2_REGS \
|
CTX_INCLUDE_EL2_REGS \
|
||||||
|
|
|
@ -180,6 +180,11 @@ Common build options
|
||||||
registers to be included when saving and restoring the CPU context. Default
|
registers to be included when saving and restoring the CPU context. Default
|
||||||
is 0.
|
is 0.
|
||||||
|
|
||||||
|
- ``CTX_INCLUDE_MPAM_REGS``: Boolean option that, when set to 1, will cause the
|
||||||
|
Memory System Resource Partitioning and Monitoring (MPAM)
|
||||||
|
registers to be included when saving and restoring the CPU context.
|
||||||
|
Default is '0'.
|
||||||
|
|
||||||
- ``CTX_INCLUDE_MTE_REGS``: Numeric value to include Memory Tagging Extension
|
- ``CTX_INCLUDE_MTE_REGS``: Numeric value to include Memory Tagging Extension
|
||||||
registers in cpu context. This must be enabled, if the platform wants to use
|
registers in cpu context. This must be enabled, if the platform wants to use
|
||||||
this feature in the Secure world and MTE is enabled at ELX. This flag can
|
this feature in the Secure world and MTE is enabled at ELX. This flag can
|
||||||
|
|
|
@ -207,18 +207,6 @@
|
||||||
// Only if MTE registers in use
|
// Only if MTE registers in use
|
||||||
#define CTX_TFSR_EL2 U(0x100)
|
#define CTX_TFSR_EL2 U(0x100)
|
||||||
|
|
||||||
#define CTX_MPAM2_EL2 U(0x108)
|
|
||||||
#define CTX_MPAMHCR_EL2 U(0x110)
|
|
||||||
#define CTX_MPAMVPM0_EL2 U(0x118)
|
|
||||||
#define CTX_MPAMVPM1_EL2 U(0x120)
|
|
||||||
#define CTX_MPAMVPM2_EL2 U(0x128)
|
|
||||||
#define CTX_MPAMVPM3_EL2 U(0x130)
|
|
||||||
#define CTX_MPAMVPM4_EL2 U(0x138)
|
|
||||||
#define CTX_MPAMVPM5_EL2 U(0x140)
|
|
||||||
#define CTX_MPAMVPM6_EL2 U(0x148)
|
|
||||||
#define CTX_MPAMVPM7_EL2 U(0x150)
|
|
||||||
#define CTX_MPAMVPMV_EL2 U(0x158)
|
|
||||||
|
|
||||||
// Starting with Armv8.6
|
// Starting with Armv8.6
|
||||||
#define CTX_HDFGRTR_EL2 U(0x160)
|
#define CTX_HDFGRTR_EL2 U(0x160)
|
||||||
#define CTX_HAFGRTR_EL2 U(0x168)
|
#define CTX_HAFGRTR_EL2 U(0x168)
|
||||||
|
@ -337,6 +325,27 @@
|
||||||
#define CTX_PAUTH_REGS_END U(0)
|
#define CTX_PAUTH_REGS_END U(0)
|
||||||
#endif /* CTX_INCLUDE_PAUTH_REGS */
|
#endif /* CTX_INCLUDE_PAUTH_REGS */
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Registers related to ARMv8.2-MPAM.
|
||||||
|
******************************************************************************/
|
||||||
|
#define CTX_MPAM_REGS_OFFSET (CTX_PAUTH_REGS_OFFSET + CTX_PAUTH_REGS_END)
|
||||||
|
#if CTX_INCLUDE_MPAM_REGS
|
||||||
|
#define CTX_MPAM2_EL2 U(0x0)
|
||||||
|
#define CTX_MPAMHCR_EL2 U(0x8)
|
||||||
|
#define CTX_MPAMVPM0_EL2 U(0x10)
|
||||||
|
#define CTX_MPAMVPM1_EL2 U(0x18)
|
||||||
|
#define CTX_MPAMVPM2_EL2 U(0x20)
|
||||||
|
#define CTX_MPAMVPM3_EL2 U(0x28)
|
||||||
|
#define CTX_MPAMVPM4_EL2 U(0x30)
|
||||||
|
#define CTX_MPAMVPM5_EL2 U(0x38)
|
||||||
|
#define CTX_MPAMVPM6_EL2 U(0x40)
|
||||||
|
#define CTX_MPAMVPM7_EL2 U(0x48)
|
||||||
|
#define CTX_MPAMVPMV_EL2 U(0x50)
|
||||||
|
#define CTX_MPAM_REGS_END U(0x60)
|
||||||
|
#else
|
||||||
|
#define CTX_MPAM_REGS_END U(0x0)
|
||||||
|
#endif /* CTX_INCLUDE_MPAM_REGS */
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Registers initialised in a per-world context.
|
* Registers initialised in a per-world context.
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
@ -375,6 +384,9 @@
|
||||||
#if CTX_INCLUDE_PAUTH_REGS
|
#if CTX_INCLUDE_PAUTH_REGS
|
||||||
# define CTX_PAUTH_REGS_ALL (CTX_PAUTH_REGS_END >> DWORD_SHIFT)
|
# define CTX_PAUTH_REGS_ALL (CTX_PAUTH_REGS_END >> DWORD_SHIFT)
|
||||||
#endif
|
#endif
|
||||||
|
#if CTX_INCLUDE_MPAM_REGS
|
||||||
|
# define CTX_MPAM_REGS_ALL (CTX_MPAM_REGS_END >> DWORD_SHIFT)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* AArch64 general purpose register context structure. Usually x0-x18,
|
* AArch64 general purpose register context structure. Usually x0-x18,
|
||||||
|
@ -423,6 +435,11 @@ DEFINE_REG_STRUCT(cve_2018_3639, CTX_CVE_2018_3639_ALL);
|
||||||
DEFINE_REG_STRUCT(pauth, CTX_PAUTH_REGS_ALL);
|
DEFINE_REG_STRUCT(pauth, CTX_PAUTH_REGS_ALL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Registers associated to ARMv8.2 MPAM */
|
||||||
|
#if CTX_INCLUDE_MPAM_REGS
|
||||||
|
DEFINE_REG_STRUCT(mpam, CTX_MPAM_REGS_ALL);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Macros to access members of any of the above structures using their
|
* Macros to access members of any of the above structures using their
|
||||||
* offsets
|
* offsets
|
||||||
|
@ -453,6 +470,9 @@ typedef struct cpu_context {
|
||||||
#if CTX_INCLUDE_PAUTH_REGS
|
#if CTX_INCLUDE_PAUTH_REGS
|
||||||
pauth_t pauth_ctx;
|
pauth_t pauth_ctx;
|
||||||
#endif
|
#endif
|
||||||
|
#if CTX_INCLUDE_MPAM_REGS
|
||||||
|
mpam_t mpam_ctx;
|
||||||
|
#endif
|
||||||
} cpu_context_t;
|
} cpu_context_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -481,6 +501,9 @@ extern per_world_context_t per_world_context[CPU_DATA_CONTEXT_NUM];
|
||||||
#if CTX_INCLUDE_PAUTH_REGS
|
#if CTX_INCLUDE_PAUTH_REGS
|
||||||
# define get_pauth_ctx(h) (&((cpu_context_t *) h)->pauth_ctx)
|
# define get_pauth_ctx(h) (&((cpu_context_t *) h)->pauth_ctx)
|
||||||
#endif
|
#endif
|
||||||
|
#if CTX_INCLUDE_MPAM_REGS
|
||||||
|
# define get_mpam_ctx(h) (&((cpu_context_t *) h)->mpam_ctx)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compile time assertions related to the 'cpu_context' structure to
|
* Compile time assertions related to the 'cpu_context' structure to
|
||||||
|
@ -507,6 +530,10 @@ CASSERT(CTX_CVE_2018_3639_OFFSET == __builtin_offsetof(cpu_context_t, cve_2018_3
|
||||||
CASSERT(CTX_PAUTH_REGS_OFFSET == __builtin_offsetof(cpu_context_t, pauth_ctx),
|
CASSERT(CTX_PAUTH_REGS_OFFSET == __builtin_offsetof(cpu_context_t, pauth_ctx),
|
||||||
assert_core_context_pauth_offset_mismatch);
|
assert_core_context_pauth_offset_mismatch);
|
||||||
#endif
|
#endif
|
||||||
|
#if CTX_INCLUDE_MPAM_REGS
|
||||||
|
CASSERT(CTX_MPAM_REGS_OFFSET == __builtin_offsetof(cpu_context_t, mpam_ctx),
|
||||||
|
assert_core_context_mpam_offset_mismatch);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Helper macro to set the general purpose registers that correspond to
|
* Helper macro to set the general purpose registers that correspond to
|
||||||
|
|
|
@ -1048,7 +1048,9 @@ static void el2_sysregs_context_restore_fgt(el2_sysregs_t *ctx)
|
||||||
write_hfgwtr_el2(read_ctx_reg(ctx, CTX_HFGWTR_EL2));
|
write_hfgwtr_el2(read_ctx_reg(ctx, CTX_HFGWTR_EL2));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void el2_sysregs_context_save_mpam(el2_sysregs_t *ctx)
|
#if CTX_INCLUDE_MPAM_REGS
|
||||||
|
|
||||||
|
static void el2_sysregs_context_save_mpam(mpam_t *ctx)
|
||||||
{
|
{
|
||||||
u_register_t mpam_idr = read_mpamidr_el1();
|
u_register_t mpam_idr = read_mpamidr_el1();
|
||||||
|
|
||||||
|
@ -1099,7 +1101,10 @@ static void el2_sysregs_context_save_mpam(el2_sysregs_t *ctx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void el2_sysregs_context_restore_mpam(el2_sysregs_t *ctx)
|
#endif /* CTX_INCLUDE_MPAM_REGS */
|
||||||
|
|
||||||
|
#if CTX_INCLUDE_MPAM_REGS
|
||||||
|
static void el2_sysregs_context_restore_mpam(mpam_t *ctx)
|
||||||
{
|
{
|
||||||
u_register_t mpam_idr = read_mpamidr_el1();
|
u_register_t mpam_idr = read_mpamidr_el1();
|
||||||
|
|
||||||
|
@ -1137,6 +1142,7 @@ static void el2_sysregs_context_restore_mpam(el2_sysregs_t *ctx)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* CTX_INCLUDE_MPAM_REGS */
|
||||||
|
|
||||||
/* -----------------------------------------------------
|
/* -----------------------------------------------------
|
||||||
* The following registers are not added:
|
* The following registers are not added:
|
||||||
|
@ -1264,9 +1270,13 @@ void cm_el2_sysregs_context_save(uint32_t security_state)
|
||||||
#if CTX_INCLUDE_MTE_REGS
|
#if CTX_INCLUDE_MTE_REGS
|
||||||
write_ctx_reg(el2_sysregs_ctx, CTX_TFSR_EL2, read_tfsr_el2());
|
write_ctx_reg(el2_sysregs_ctx, CTX_TFSR_EL2, read_tfsr_el2());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CTX_INCLUDE_MPAM_REGS
|
||||||
if (is_feat_mpam_supported()) {
|
if (is_feat_mpam_supported()) {
|
||||||
el2_sysregs_context_save_mpam(el2_sysregs_ctx);
|
mpam_t *mpam_ctx = get_mpam_ctx(ctx);
|
||||||
|
el2_sysregs_context_save_mpam(mpam_ctx);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (is_feat_fgt_supported()) {
|
if (is_feat_fgt_supported()) {
|
||||||
el2_sysregs_context_save_fgt(el2_sysregs_ctx);
|
el2_sysregs_context_save_fgt(el2_sysregs_ctx);
|
||||||
|
@ -1337,9 +1347,13 @@ void cm_el2_sysregs_context_restore(uint32_t security_state)
|
||||||
#if CTX_INCLUDE_MTE_REGS
|
#if CTX_INCLUDE_MTE_REGS
|
||||||
write_tfsr_el2(read_ctx_reg(el2_sysregs_ctx, CTX_TFSR_EL2));
|
write_tfsr_el2(read_ctx_reg(el2_sysregs_ctx, CTX_TFSR_EL2));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CTX_INCLUDE_MPAM_REGS
|
||||||
if (is_feat_mpam_supported()) {
|
if (is_feat_mpam_supported()) {
|
||||||
el2_sysregs_context_restore_mpam(el2_sysregs_ctx);
|
mpam_t *mpam_ctx = get_mpam_ctx(ctx);
|
||||||
|
el2_sysregs_context_restore_mpam(mpam_ctx);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (is_feat_fgt_supported()) {
|
if (is_feat_fgt_supported()) {
|
||||||
el2_sysregs_context_restore_fgt(el2_sysregs_ctx);
|
el2_sysregs_context_restore_fgt(el2_sysregs_ctx);
|
||||||
|
|
|
@ -374,3 +374,7 @@ ENABLE_CONSOLE_GETC := 0
|
||||||
# functions must be enabled by platforms if they require it.
|
# functions must be enabled by platforms if they require it.
|
||||||
# Disabled by default.
|
# Disabled by default.
|
||||||
INIT_UNUSED_NS_EL2 := 0
|
INIT_UNUSED_NS_EL2 := 0
|
||||||
|
|
||||||
|
# Disable including MPAM EL2 registers in context by default since currently
|
||||||
|
# it's only enabled for NS world
|
||||||
|
CTX_INCLUDE_MPAM_REGS := 0
|
||||||
|
|
Loading…
Add table
Reference in a new issue