1 /* 2 * SPDX-License-Identifier: BSD-3-Clause 3 * SPDX-FileCopyrightText: Copyright TF-RMM Contributors. 4 * SPDX-FileCopyrightText: Copyright Arm Limited and Contributors. 5 */ 6 7 /* This file is derived from xlat_table_v2 library in TF-A project */ 8 9 #ifndef XLAT_TABLES_PRIVATE_H 10 #define XLAT_TABLES_PRIVATE_H 11 12 #include <stdbool.h> 13 #include <xlat_contexts.h> 14 15 /* Determine the physical address space encoded in the 'attr' parameter. */ 16 uint64_t xlat_arch_get_pas(uint64_t attr); 17 18 /* 19 * Invalidate all TLB entries that match the given virtual address. This 20 * operation applies to all PEs in the same Inner Shareable domain as the PE 21 * that executes this function. This functions must be called for every 22 * translation table entry that is modified. It only affects the EL2 23 * Translate regime 24 */ 25 void xlat_arch_tlbi_va(uintptr_t va); 26 27 /* 28 * This function has to be called at the end of any code that uses the function 29 * xlat_arch_tlbi_va(). 30 */ 31 void xlat_arch_tlbi_va_sync(void); 32 33 /* Print VA, PA, size and attributes of all regions in the mmap array. */ 34 void xlat_mmap_print(const struct xlat_ctx *ctx); 35 36 /* 37 * Print the current state of the translation tables by reading them from 38 * memory. 39 */ 40 void xlat_tables_print(struct xlat_ctx *ctx); 41 42 /* 43 * Returns a block/page table descriptor for the given level and attributes. 44 */ 45 uintptr_t xlat_desc(uint64_t attr, uintptr_t addr_pa, unsigned int level); 46 47 /* 48 * Return the maximum physical address supported by the hardware. 49 */ 50 uintptr_t xlat_arch_get_max_supported_pa(void); 51 52 /* 53 * Return the unpriviledged execute-never mask that will prevent instruction 54 * fetch by EL0 at the EL2&0 translation regime. 55 */ 56 #define XLAT_GET_UXN_DESC() (UPPER_ATTRS(UXN)) 57 58 /* 59 * Return the priviledged execute-never mask that will prevent instruction 60 * fetch by EL2 at the EL2&0 translation regime. 61 */ 62 #define XLAT_GET_PXN_DESC() (UPPER_ATTRS(PXN)) 63 64 /* 65 * Return the contiguous mask for a page or block descriptor 66 */ 67 #define XLAT_GET_CONT_HINT() (UPPER_ATTRS(CONT_HINT)) 68 69 /* 70 * Return the NG flag for a page or block descriptor 71 */ 72 #define XLAT_GET_NG_HINT() (LOWER_ATTRS(NG_HINT)) 73 74 /* 75 * Set up the xlat_ctx_cfg field of a given context. 76 * This macro doesn't check parameters. 77 * 78 * _ctx: 79 * Pointer to xlat_ctx. 80 * 81 * _cfg: 82 * reference to xlat_ctx_cfg that needs to be set to _ctx. 83 */ 84 #define XLAT_SETUP_CTX_CFG(_ctx, _cfg) (_ctx)->cfg = (_cfg) 85 86 /* 87 * Set up the xlat_ctx_tbls field of a given context. 88 * This macro doesn't check parameters. 89 * 90 * _ctx: 91 * Context where to add the configuration strucutre. 92 * 93 * _tlbs: 94 * Reference to the xlat_ctx_tlbs structure where to add to the context. 95 */ 96 #define XLAT_SETUP_CTX_TBLS(_ctx, _tbls) (_ctx)->tbls = (_tbls) 97 98 /* 99 * Initialize an existing xlat_ctx_tbls structure with the given parameters 100 * This macro doesn't check parameters. 101 * 102 * _tlbs: 103 * Pointer to xlat_ctx. 104 * 105 * _tables: 106 * pointer to non-base xlat_ctx_tbls. 107 * 108 * _tnum: 109 * Maximum number of intermediate tables that can fit in the _tables area. 110 * 111 * _btables: 112 * pointer to base xlat_ctx_tbls. 113 * 114 * _bt_entries: 115 * Maximum number of entries available on the base table. 116 */ 117 #define XLAT_INIT_CTX_TBLS(_tbls, _tables, _tnum, \ 118 _btables, _bt_entries) \ 119 { \ 120 (_tbls)->tables = (_tables); \ 121 (_tbls)->tables_num = (_tnum); \ 122 (_tbls)->base_table = (_btables); \ 123 (_tbls)->max_base_table_entries = (_bt_entries); \ 124 (_tbls)->next_table = 0U; \ 125 (_tbls)->initialized = false; \ 126 } 127 128 #endif /* XLAT_TABLES_PRIVATE_H */ 129