• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2017-2020, 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 /*
44  * Return the execute-never mask that will prevent instruction fetch at the
45  * given translation regime.
46  */
47 uint64_t xlat_arch_regime_get_xn_desc(int xlat_regime);
48 
49 /*
50  * Invalidate all TLB entries that match the given virtual address. This
51  * operation applies to all PEs in the same Inner Shareable domain as the PE
52  * that executes this function. This functions must be called for every
53  * translation table entry that is modified. It only affects the specified
54  * translation regime.
55  *
56  * Note, however, that it is architecturally UNDEFINED to invalidate TLB entries
57  * pertaining to a higher exception level, e.g. invalidating EL3 entries from
58  * S-EL1.
59  */
60 void xlat_arch_tlbi_va(uintptr_t va, int xlat_regime);
61 
62 /*
63  * This function has to be called at the end of any code that uses the function
64  * xlat_arch_tlbi_va().
65  */
66 void xlat_arch_tlbi_va_sync(void);
67 
68 /* Print VA, PA, size and attributes of all regions in the mmap array. */
69 void xlat_mmap_print(const mmap_region_t *mmap);
70 
71 /*
72  * Print the current state of the translation tables by reading them from
73  * memory.
74  */
75 void xlat_tables_print(xlat_ctx_t *ctx);
76 
77 /*
78  * Returns a block/page table descriptor for the given level and attributes.
79  */
80 uint64_t xlat_desc(const xlat_ctx_t *ctx, uint32_t attr,
81 		   unsigned long long addr_pa, unsigned int level);
82 
83 /*
84  * Architecture-specific initialization code.
85  */
86 
87 /* Returns the current Exception Level. The returned EL must be 1 or higher. */
88 unsigned int xlat_arch_current_el(void);
89 
90 /*
91  * Return the maximum physical address supported by the hardware.
92  * This value depends on the execution state (AArch32/AArch64).
93  */
94 unsigned long long xlat_arch_get_max_supported_pa(void);
95 
96 /*
97  * Returns true if the MMU of the translation regime managed by the given
98  * xlat_ctx_t is enabled, false otherwise.
99  */
100 bool is_mmu_enabled_ctx(const xlat_ctx_t *ctx);
101 
102 /*
103  * Returns minimum virtual address space size supported by the architecture
104  */
105 uintptr_t xlat_get_min_virt_addr_space_size(void);
106 
107 #endif /* XLAT_TABLES_PRIVATE_H */
108