diff options
author | Mark Brown <broonie@kernel.org> | 2018-04-13 11:26:07 +0100 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2018-04-13 11:26:07 +0100 |
commit | 36e3dd72fb0d2c32f1ba1313d4da22fbb27b5bd4 (patch) | |
tree | 4db51d38820eb6883921fa88ff692bc4ca711300 /arch/arm64/mm/mmu.c | |
parent | 5e9e8b891fe489c9ac2270b6e4f2da961ae3c80c (diff) | |
parent | d32da5bd9fd2e6eafa25c82318b55124c54d3a66 (diff) |
Merge tag 'v4.9.93' into linux-linaro-lsk-v4.9
This is the 4.9.93 stable release
Diffstat (limited to 'arch/arm64/mm/mmu.c')
-rw-r--r-- | arch/arm64/mm/mmu.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index c6ae09f01e23..5b1184c369d5 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -422,6 +422,37 @@ static void __init map_kernel_segment(pgd_t *pgd, void *va_start, void *va_end, vm_area_add_early(vma); } +#ifdef CONFIG_UNMAP_KERNEL_AT_EL0 +static int __init map_entry_trampoline(void) +{ + extern char __entry_tramp_text_start[]; + + pgprot_t prot = rodata_enabled ? PAGE_KERNEL_ROX : PAGE_KERNEL_EXEC; + phys_addr_t pa_start = __pa_symbol(__entry_tramp_text_start); + + /* The trampoline is always mapped and can therefore be global */ + pgprot_val(prot) &= ~PTE_NG; + + /* Map only the text into the trampoline page table */ + memset(tramp_pg_dir, 0, PGD_SIZE); + __create_pgd_mapping(tramp_pg_dir, pa_start, TRAMP_VALIAS, PAGE_SIZE, + prot, pgd_pgtable_alloc, 0); + + /* Map both the text and data into the kernel page table */ + __set_fixmap(FIX_ENTRY_TRAMP_TEXT, pa_start, prot); + if (IS_ENABLED(CONFIG_RANDOMIZE_BASE)) { + extern char __entry_tramp_data_start[]; + + __set_fixmap(FIX_ENTRY_TRAMP_DATA, + __pa_symbol(__entry_tramp_data_start), + PAGE_KERNEL_RO); + } + + return 0; +} +core_initcall(map_entry_trampoline); +#endif + /* * Create fine-grained mappings for the kernel. */ |