|
@@ -525,6 +525,29 @@ static int __init parse_rodata(char *arg)
|
|
|
}
|
|
|
early_param("rodata", parse_rodata);
|
|
|
|
|
|
+#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);
|
|
|
+
|
|
|
+ /* ...as well as the kernel page table */
|
|
|
+ __set_fixmap(FIX_ENTRY_TRAMP_TEXT, pa_start, prot);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+core_initcall(map_entry_trampoline);
|
|
|
+#endif
|
|
|
+
|
|
|
/*
|
|
|
* Create fine-grained mappings for the kernel.
|
|
|
*/
|