diff options
author | Antonio Nino Diaz <antonio.ninodiaz@arm.com> | 2017-10-04 16:52:15 +0100 |
---|---|---|
committer | Antonio Nino Diaz <antonio.ninodiaz@arm.com> | 2017-10-05 14:32:12 +0100 |
commit | 609c91917f95e5c2c0dcccbfbea6ff32539bf738 (patch) | |
tree | 6ac537dd481d17911bf6278a8273272a14f8adba /include/lib | |
parent | b4ae615bd734104cfed5d2534b4c14278415057e (diff) | |
download | platform_external_arm-trusted-firmware-609c91917f95e5c2c0dcccbfbea6ff32539bf738.tar.gz platform_external_arm-trusted-firmware-609c91917f95e5c2c0dcccbfbea6ff32539bf738.tar.bz2 platform_external_arm-trusted-firmware-609c91917f95e5c2c0dcccbfbea6ff32539bf738.zip |
xlat: Add support for EL0 and EL1 mappings
This patch introduces the ability of the xlat tables library to manage
EL0 and EL1 mappings from a higher exception level.
Attributes MT_USER and MT_PRIVILEGED have been added to allow the user
specify the target EL in the translation regime EL1&0.
REGISTER_XLAT_CONTEXT2 macro is introduced to allow creating a
xlat_ctx_t that targets a given translation regime (EL1&0 or EL3).
A new member is added to xlat_ctx_t to represent the translation regime
the xlat_ctx_t manages. The execute_never mask member is removed as it
is computed from existing information.
Change-Id: I95e14abc3371d7a6d6a358cc54c688aa9975c110
Co-authored-by: Douglas Raillard <douglas.raillard@arm.com>
Co-authored-by: Sandrine Bailleux <sandrine.bailleux@arm.com>
Co-authored-by: Antonio Nino Diaz <antonio.ninodiaz@arm.com>
Signed-off-by: Antonio Nino Diaz <antonio.ninodiaz@arm.com>
Diffstat (limited to 'include/lib')
-rw-r--r-- | include/lib/xlat_tables/xlat_tables_defs.h | 17 | ||||
-rw-r--r-- | include/lib/xlat_tables/xlat_tables_v2.h | 36 | ||||
-rw-r--r-- | include/lib/xlat_tables/xlat_tables_v2_helpers.h | 26 |
3 files changed, 68 insertions, 11 deletions
diff --git a/include/lib/xlat_tables/xlat_tables_defs.h b/include/lib/xlat_tables/xlat_tables_defs.h index b0f5a04c9..7cb9d37f1 100644 --- a/include/lib/xlat_tables/xlat_tables_defs.h +++ b/include/lib/xlat_tables/xlat_tables_defs.h @@ -89,9 +89,22 @@ * AP[1] bit is ignored by hardware and is * treated as if it is One in EL2/EL3 */ -#define AP_RO (U(0x1) << 5) -#define AP_RW (U(0x0) << 5) +#define AP2_SHIFT U(0x7) +#define AP2_RO U(0x1) +#define AP2_RW U(0x0) +#define AP1_SHIFT U(0x6) +#define AP1_ACCESS_UNPRIVILEGED U(0x1) +#define AP1_NO_ACCESS_UNPRIVILEGED U(0x0) + +/* + * The following definitions must all be passed to the LOWER_ATTRS() macro to + * get the right bitmask. + */ +#define AP_RO (AP2_RO << 5) +#define AP_RW (AP2_RW << 5) +#define AP_ACCESS_UNPRIVILEGED (AP1_ACCESS_UNPRIVILEGED << 4) +#define AP_NO_ACCESS_UNPRIVILEGED (AP1_NO_ACCESS_UNPRIVILEGED << 4) #define NS (U(0x1) << 3) #define ATTR_NON_CACHEABLE_INDEX U(0x2) #define ATTR_DEVICE_INDEX U(0x1) diff --git a/include/lib/xlat_tables/xlat_tables_v2.h b/include/lib/xlat_tables/xlat_tables_v2.h index 2cc59f6d1..1a55fba77 100644 --- a/include/lib/xlat_tables/xlat_tables_v2.h +++ b/include/lib/xlat_tables/xlat_tables_v2.h @@ -57,6 +57,11 @@ #define MT_SEC_SHIFT U(4) /* Access permissions for instruction execution (EXECUTE/EXECUTE_NEVER) */ #define MT_EXECUTE_SHIFT U(5) +/* + * In the EL1&0 translation regime, mark the region as User (EL0) or + * Privileged (EL1). In the EL3 translation regime this has no effect. + */ +#define MT_USER_SHIFT U(6) /* All other bits are reserved */ /* @@ -89,10 +94,20 @@ typedef enum { */ MT_EXECUTE = U(0) << MT_EXECUTE_SHIFT, MT_EXECUTE_NEVER = U(1) << MT_EXECUTE_SHIFT, + + /* + * When mapping a region at EL0 or EL1, this attribute will be used to + * determine if a User mapping (EL0) will be created or a Privileged + * mapping (EL1). + */ + MT_USER = U(1) << MT_USER_SHIFT, + MT_PRIVILEGED = U(0) << MT_USER_SHIFT, } mmap_attr_t; +/* Compound attributes for most common usages */ #define MT_CODE (MT_MEMORY | MT_RO | MT_EXECUTE) #define MT_RO_DATA (MT_MEMORY | MT_RO | MT_EXECUTE_NEVER) +#define MT_RW_DATA (MT_MEMORY | MT_RW | MT_EXECUTE_NEVER) /* * Structure for specifying a single region of memory. @@ -149,8 +164,25 @@ typedef struct xlat_ctx xlat_ctx_t; */ #define REGISTER_XLAT_CONTEXT(_ctx_name, _mmap_count, _xlat_tables_count, \ _virt_addr_space_size, _phy_addr_space_size) \ - _REGISTER_XLAT_CONTEXT(_ctx_name, _mmap_count, _xlat_tables_count, \ - _virt_addr_space_size, _phy_addr_space_size) + _REGISTER_XLAT_CONTEXT_FULL_SPEC(_ctx_name, _mmap_count, \ + _xlat_tables_count, \ + _virt_addr_space_size, \ + _phy_addr_space_size, \ + IMAGE_XLAT_DEFAULT_REGIME) + +/* + * Same as REGISTER_XLAT_CONTEXT plus the additional parameter _xlat_regime to + * specify the translation regime managed by this xlat_ctx_t instance. The + * values are the one from xlat_regime_t enumeration. + */ +#define REGISTER_XLAT_CONTEXT2(_ctx_name, _mmap_count, _xlat_tables_count, \ + _virt_addr_space_size, _phy_addr_space_size, \ + _xlat_regime) \ + _REGISTER_XLAT_CONTEXT_FULL_SPEC(_ctx_name, _mmap_count, \ + _xlat_tables_count, \ + _virt_addr_space_size, \ + _phy_addr_space_size, \ + _xlat_regime) /****************************************************************************** * Generic translation table APIs. diff --git a/include/lib/xlat_tables/xlat_tables_v2_helpers.h b/include/lib/xlat_tables/xlat_tables_v2_helpers.h index 1ea2fc0ab..0ebdc9307 100644 --- a/include/lib/xlat_tables/xlat_tables_v2_helpers.h +++ b/include/lib/xlat_tables/xlat_tables_v2_helpers.h @@ -99,11 +99,12 @@ struct xlat_ctx { unsigned int initialized; /* - * Bit mask that has to be ORed to the rest of a translation table - * descriptor in order to prohibit execution of code at the exception - * level of this translation context. + * Translation regime managed by this xlat_ctx_t. It takes the values of + * the enumeration xlat_regime_t. The type is "int" to avoid a circular + * dependency on xlat_tables_v2.h, but this member must be treated as + * xlat_regime_t. */ - uint64_t execute_never_mask; + int xlat_regime; }; #if PLAT_XLAT_TABLES_DYNAMIC @@ -120,9 +121,9 @@ struct xlat_ctx { /* do nothing */ #endif /* PLAT_XLAT_TABLES_DYNAMIC */ - -#define _REGISTER_XLAT_CONTEXT(_ctx_name, _mmap_count, _xlat_tables_count, \ - _virt_addr_space_size, _phy_addr_space_size) \ +#define _REGISTER_XLAT_CONTEXT_FULL_SPEC(_ctx_name, _mmap_count, _xlat_tables_count, \ + _virt_addr_space_size, _phy_addr_space_size, \ + _xlat_regime) \ CASSERT(CHECK_VIRT_ADDR_SPACE_SIZE(_virt_addr_space_size), \ assert_invalid_virtual_addr_space_size_for_##_ctx_name); \ \ @@ -154,12 +155,23 @@ struct xlat_ctx { .tables = _ctx_name##_xlat_tables, \ .tables_num = _xlat_tables_count, \ _REGISTER_DYNMAP_STRUCT(_ctx_name) \ + .xlat_regime = (_xlat_regime), \ .max_pa = 0, \ .max_va = 0, \ .next_table = 0, \ .initialized = 0, \ } + +/* This IMAGE_EL macro must not to be used outside the library */ +#if IMAGE_BL1 || IMAGE_BL31 +# define IMAGE_EL 3 +# define IMAGE_XLAT_DEFAULT_REGIME EL3_REGIME +#else +# define IMAGE_EL 1 +# define IMAGE_XLAT_DEFAULT_REGIME EL1_EL0_REGIME +#endif + #endif /*__ASSEMBLY__*/ #endif /* __XLAT_TABLES_V2_HELPERS_H__ */ |