1 /*
2  * Copyright (c) 2017-2021, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef XLAT_TABLES_PRIVATE_H
8 #define XLAT_TABLES_PRIVATE_H
9 
10 #include <stdbool.h>
11 
12 #include <platform_def.h>
13 
14 #include <lib/xlat_tables/xlat_tables_defs.h>
15 
16 #if PLAT_XLAT_TABLES_DYNAMIC
17 /*
18  * Private shifts and masks to access fields of an mmap attribute
19  */
20 /* Dynamic or static */
21 #define MT_DYN_SHIFT		U(31)
22 
23 /*
24  * Memory mapping private attributes
25  *
26  * Private attributes not exposed in the public header.
27  */
28 
29 /*
30  * Regions mapped before the MMU can't be unmapped dynamically (they are
31  * static) and regions mapped with MMU enabled can be unmapped. This
32  * behaviour can't be overridden.
33  *
34  * Static regions can overlap each other, dynamic regions can't.
35  */
36 #define MT_STATIC	(U(0) << MT_DYN_SHIFT)
37 #define MT_DYNAMIC	(U(1) << MT_DYN_SHIFT)
38 
39 #endif /* PLAT_XLAT_TABLES_DYNAMIC */
40 
41 extern uint64_t mmu_cfg_params[MMU_CFG_PARAM_MAX];
42 
43 /* Determine the physical address space encoded in the 'attr' parameter. */
44 uint32_t xlat_arch_get_pas(uint32_t attr);
45 
46 /*
47  * Return the execute-never mask that will prevent instruction fetch at the
48  * given translation regime.
49  */
50 uint64_t xlat_arch_regime_get_xn_desc(int xlat_regime);
51 
52 /*
53  * Invalidate all TLB entries that match the given virtual address. This
54  * operation applies to all PEs in the same Inner Shareable domain as the PE
55  * that executes this function. This functions must be called for every
56  * translation table entry that is modified. It only affects the specified
57  * translation regime.
58  *
59  * Note, however, that it is architecturally UNDEFINED to invalidate TLB entries
60  * pertaining to a higher exception level, e.g. invalidating EL3 entries from
61  * S-EL1.
62  */
63 void xlat_arch_tlbi_va(uintptr_t va, int xlat_regime);
64 
65 /*
66  * This function has to be called at the end of any code that uses the function
67  * xlat_arch_tlbi_va().
68  */
69 void xlat_arch_tlbi_va_sync(void);
70 
71 /* Print VA, PA, size and attributes of all regions in the mmap array. */
72 void xlat_mmap_print(const mmap_region_t *mmap);
73 
74 /*
75  * Print the current state of the translation tables by reading them from
76  * memory.
77  */
78 void xlat_tables_print(xlat_ctx_t *ctx);
79 
80 /*
81  * Returns a block/page table descriptor for the given level and attributes.
82  */
83 uint64_t xlat_desc(const xlat_ctx_t *ctx, uint32_t attr,
84 		   unsigned long long addr_pa, unsigned int level);
85 
86 /*
87  * Architecture-specific initialization code.
88  */
89 
90 /* Returns the current Exception Level. The returned EL must be 1 or higher. */
91 unsigned int xlat_arch_current_el(void);
92 
93 /*
94  * Return the maximum physical address supported by the hardware.
95  * This value depends on the execution state (AArch32/AArch64).
96  */
97 unsigned long long xlat_arch_get_max_supported_pa(void);
98 
99 /*
100  * Returns true if the MMU of the translation regime managed by the given
101  * xlat_ctx_t is enabled, false otherwise.
102  */
103 bool is_mmu_enabled_ctx(const xlat_ctx_t *ctx);
104 
105 /*
106  * Returns minimum virtual address space size supported by the architecture
107  */
108 uintptr_t xlat_get_min_virt_addr_space_size(void);
109 
110 #endif /* XLAT_TABLES_PRIVATE_H */
111