2017-03-08 14:40:23 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
|
|
|
|
*
|
2017-05-03 09:38:09 +01:00
|
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
2017-03-08 14:40:23 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __XLAT_TABLES_PRIVATE_H__
|
|
|
|
#define __XLAT_TABLES_PRIVATE_H__
|
|
|
|
|
|
|
|
#include <platform_def.h>
|
2017-05-19 09:59:37 +01:00
|
|
|
#include <xlat_tables_defs.h>
|
2017-03-08 14:40:23 +00:00
|
|
|
|
2017-02-27 17:23:54 +00:00
|
|
|
#if PLAT_XLAT_TABLES_DYNAMIC
|
|
|
|
/*
|
|
|
|
* Shifts and masks to access fields of an mmap_attr_t
|
|
|
|
*/
|
|
|
|
/* Dynamic or static */
|
|
|
|
#define MT_DYN_SHIFT 30 /* 31 would cause undefined behaviours */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Memory mapping private attributes
|
|
|
|
*
|
|
|
|
* Private attributes not exposed in the mmap_attr_t enum.
|
|
|
|
*/
|
|
|
|
typedef enum {
|
|
|
|
/*
|
|
|
|
* Regions mapped before the MMU can't be unmapped dynamically (they are
|
|
|
|
* static) and regions mapped with MMU enabled can be unmapped. This
|
|
|
|
* behaviour can't be overridden.
|
|
|
|
*
|
|
|
|
* Static regions can overlap each other, dynamic regions can't.
|
|
|
|
*/
|
|
|
|
MT_STATIC = 0 << MT_DYN_SHIFT,
|
|
|
|
MT_DYNAMIC = 1 << MT_DYN_SHIFT
|
|
|
|
} mmap_priv_attr_t;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Function used to invalidate all levels of the translation walk for a given
|
|
|
|
* virtual address. It must be called for every translation table entry that is
|
|
|
|
* modified.
|
|
|
|
*/
|
|
|
|
void xlat_arch_tlbi_va(uintptr_t va);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This function has to be called at the end of any code that uses the function
|
|
|
|
* xlat_arch_tlbi_va().
|
|
|
|
*/
|
|
|
|
void xlat_arch_tlbi_va_sync(void);
|
|
|
|
|
|
|
|
#endif /* PLAT_XLAT_TABLES_DYNAMIC */
|
|
|
|
|
2017-03-08 14:40:23 +00:00
|
|
|
/* Print VA, PA, size and attributes of all regions in the mmap array. */
|
|
|
|
void print_mmap(mmap_region_t *const mmap);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Print the current state of the translation tables by reading them from
|
|
|
|
* memory.
|
|
|
|
*/
|
|
|
|
void xlat_tables_print(xlat_ctx_t *ctx);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Architecture-specific initialization code.
|
|
|
|
*/
|
|
|
|
|
Fix execute-never permissions in xlat tables libs
Translation regimes that only support one virtual address space (such as
the ones for EL2 and EL3) can flag memory regions as execute-never by
setting to 1 the XN bit in the Upper Attributes field in the translation
tables descriptors. Translation regimes that support two different
virtual address spaces (such as the one shared by EL1 and EL0) use bits
PXN and UXN instead.
The Trusted Firmware runs at EL3 and EL1, it has to handle translation
tables of both translation regimes, but the previous code handled both
regimes the same way, as if both had only 1 VA range.
When trying to set a descriptor as execute-never it would set the XN
bit correctly in EL3, but it would set the XN bit in EL1 as well. XN is
at the same bit position as UXN, which means that EL0 was being
prevented from executing code at this region, not EL1 as the code
intended. Therefore, the PXN bit was unset to 0 all the time. The result
is that, in AArch64 mode, read-only data sections of BL2 weren't
protected from being executed.
This patch adds support of translation regimes with two virtual address
spaces to both versions of the translation tables library, fixing the
execute-never permissions for translation tables in EL1.
The library currently does not support initializing translation tables
for EL0 software, therefore it does not set/unset the UXN bit. If EL1
software needs to initialize translation tables for EL0 software, it
should use a different library instead.
Change-Id: If27588f9820ff42988851d90dc92801c8ecbe0c9
Signed-off-by: Antonio Nino Diaz <antonio.ninodiaz@arm.com>
2017-04-27 13:30:22 +01:00
|
|
|
/* Returns the current Exception Level. The returned EL must be 1 or higher. */
|
|
|
|
int xlat_arch_current_el(void);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Returns the bit mask that has to be ORed to the rest of a translation table
|
|
|
|
* descriptor so that execution of code is prohibited at the given Exception
|
|
|
|
* Level.
|
|
|
|
*/
|
|
|
|
uint64_t xlat_arch_get_xn_desc(int el);
|
|
|
|
|
2017-03-08 14:40:23 +00:00
|
|
|
/* Execute architecture-specific translation table initialization code. */
|
|
|
|
void init_xlat_tables_arch(unsigned long long max_pa);
|
|
|
|
|
|
|
|
/* Enable MMU and configure it to use the specified translation tables. */
|
|
|
|
void enable_mmu_arch(unsigned int flags, uint64_t *base_table);
|
|
|
|
|
|
|
|
/* Return 1 if the MMU of this Exception Level is enabled, 0 otherwise. */
|
|
|
|
int is_mmu_enabled(void);
|
|
|
|
|
|
|
|
#endif /* __XLAT_TABLES_PRIVATE_H__ */
|