mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-17 01:54:22 +00:00

At present, the function provided by the translation library to enable MMU constructs appropriate values for translation library, and programs them to the right registers. The construction of initial values, however, is only required once as both the primary and secondaries program the same values. Additionally, the MMU-enabling function is written in C, which means there's an active stack at the time of enabling MMU. On some systems, like Arm DynamIQ, having active stack while enabling MMU during warm boot might lead to coherency problems. This patch addresses both the above problems by: - Splitting the MMU-enabling function into two: one that sets up values to be programmed into the registers, and another one that takes the pre-computed values and writes to the appropriate registers. With this, the primary effectively calls both functions to have the MMU enabled, but secondaries only need to call the latter. - Rewriting the function that enables MMU in assembly so that it doesn't use stack. This patch fixes a bunch of MISRA issues on the way. Change-Id: I0faca97263a970ffe765f0e731a1417e43fbfc45 Signed-off-by: Jeenu Viswambharan <jeenu.viswambharan@arm.com>
93 lines
2.7 KiB
C
93 lines
2.7 KiB
C
/*
|
|
* Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#ifndef __XLAT_TABLES_PRIVATE_H__
|
|
#define __XLAT_TABLES_PRIVATE_H__
|
|
|
|
#include <platform_def.h>
|
|
#include <xlat_tables_defs.h>
|
|
|
|
#if PLAT_XLAT_TABLES_DYNAMIC
|
|
/*
|
|
* Private shifts and masks to access fields of an mmap attribute
|
|
*/
|
|
/* Dynamic or static */
|
|
#define MT_DYN_SHIFT U(31)
|
|
|
|
/*
|
|
* Memory mapping private attributes
|
|
*
|
|
* Private attributes not exposed in the public header.
|
|
*/
|
|
|
|
/*
|
|
* 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.
|
|
*/
|
|
#define MT_STATIC (U(0) << MT_DYN_SHIFT)
|
|
#define MT_DYNAMIC (U(1) << MT_DYN_SHIFT)
|
|
|
|
#endif /* PLAT_XLAT_TABLES_DYNAMIC */
|
|
|
|
/*
|
|
* Invalidate all TLB entries that match the given virtual address. This
|
|
* operation applies to all PEs in the same Inner Shareable domain as the PE
|
|
* that executes this function. This functions must be called for every
|
|
* translation table entry that is modified.
|
|
*
|
|
* xlat_arch_tlbi_va() applies the invalidation to the exception level of the
|
|
* current translation regime, whereas xlat_arch_tlbi_va_regime() applies it to
|
|
* the given translation regime.
|
|
*
|
|
* Note, however, that it is architecturally UNDEFINED to invalidate TLB entries
|
|
* pertaining to a higher exception level, e.g. invalidating EL3 entries from
|
|
* S-EL1.
|
|
*/
|
|
void xlat_arch_tlbi_va(uintptr_t va);
|
|
void xlat_arch_tlbi_va_regime(uintptr_t va, xlat_regime_t xlat_regime);
|
|
|
|
/*
|
|
* 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);
|
|
|
|
/* 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.
|
|
*/
|
|
|
|
/* Returns the current Exception Level. The returned EL must be 1 or higher. */
|
|
int xlat_arch_current_el(void);
|
|
|
|
/*
|
|
* Return the maximum physical address supported by the hardware.
|
|
* This value depends on the execution state (AArch32/AArch64).
|
|
*/
|
|
unsigned long long xlat_arch_get_max_supported_pa(void);
|
|
|
|
/* Enable MMU and configure it to use the specified translation tables. */
|
|
void setup_mmu_cfg(unsigned int flags, const uint64_t *base_table,
|
|
unsigned long long max_pa, uintptr_t max_va);
|
|
|
|
/*
|
|
* Return 1 if the MMU of the translation regime managed by the given xlat_ctx_t
|
|
* is enabled, 0 otherwise.
|
|
*/
|
|
int is_mmu_enabled_ctx(const xlat_ctx_t *ctx);
|
|
|
|
#endif /* __XLAT_TABLES_PRIVATE_H__ */
|