aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm64/mm/mmu.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
index 23c2d89a362e..f1eb15e0e864 100644
--- a/arch/arm64/mm/mmu.c
+++ b/arch/arm64/mm/mmu.c
@@ -496,7 +496,7 @@ void mark_rodata_ro(void)
496 496
497static void __init map_kernel_segment(pgd_t *pgd, void *va_start, void *va_end, 497static void __init map_kernel_segment(pgd_t *pgd, void *va_start, void *va_end,
498 pgprot_t prot, struct vm_struct *vma, 498 pgprot_t prot, struct vm_struct *vma,
499 int flags) 499 int flags, unsigned long vm_flags)
500{ 500{
501 phys_addr_t pa_start = __pa_symbol(va_start); 501 phys_addr_t pa_start = __pa_symbol(va_start);
502 unsigned long size = va_end - va_start; 502 unsigned long size = va_end - va_start;
@@ -507,10 +507,13 @@ static void __init map_kernel_segment(pgd_t *pgd, void *va_start, void *va_end,
507 __create_pgd_mapping(pgd, pa_start, (unsigned long)va_start, size, prot, 507 __create_pgd_mapping(pgd, pa_start, (unsigned long)va_start, size, prot,
508 early_pgtable_alloc, flags); 508 early_pgtable_alloc, flags);
509 509
510 if (!(vm_flags & VM_NO_GUARD))
511 size += PAGE_SIZE;
512
510 vma->addr = va_start; 513 vma->addr = va_start;
511 vma->phys_addr = pa_start; 514 vma->phys_addr = pa_start;
512 vma->size = size; 515 vma->size = size;
513 vma->flags = VM_MAP; 516 vma->flags = VM_MAP | vm_flags;
514 vma->caller = __builtin_return_address(0); 517 vma->caller = __builtin_return_address(0);
515 518
516 vm_area_add_early(vma); 519 vm_area_add_early(vma);
@@ -541,14 +544,15 @@ static void __init map_kernel(pgd_t *pgd)
541 * Only rodata will be remapped with different permissions later on, 544 * Only rodata will be remapped with different permissions later on,
542 * all other segments are allowed to use contiguous mappings. 545 * all other segments are allowed to use contiguous mappings.
543 */ 546 */
544 map_kernel_segment(pgd, _text, _etext, text_prot, &vmlinux_text, 0); 547 map_kernel_segment(pgd, _text, _etext, text_prot, &vmlinux_text, 0,
548 VM_NO_GUARD);
545 map_kernel_segment(pgd, __start_rodata, __inittext_begin, PAGE_KERNEL, 549 map_kernel_segment(pgd, __start_rodata, __inittext_begin, PAGE_KERNEL,
546 &vmlinux_rodata, NO_CONT_MAPPINGS); 550 &vmlinux_rodata, NO_CONT_MAPPINGS, VM_NO_GUARD);
547 map_kernel_segment(pgd, __inittext_begin, __inittext_end, text_prot, 551 map_kernel_segment(pgd, __inittext_begin, __inittext_end, text_prot,
548 &vmlinux_inittext, 0); 552 &vmlinux_inittext, 0, VM_NO_GUARD);
549 map_kernel_segment(pgd, __initdata_begin, __initdata_end, PAGE_KERNEL, 553 map_kernel_segment(pgd, __initdata_begin, __initdata_end, PAGE_KERNEL,
550 &vmlinux_initdata, 0); 554 &vmlinux_initdata, 0, VM_NO_GUARD);
551 map_kernel_segment(pgd, _data, _end, PAGE_KERNEL, &vmlinux_data, 0); 555 map_kernel_segment(pgd, _data, _end, PAGE_KERNEL, &vmlinux_data, 0, 0);
552 556
553 if (!pgd_val(*pgd_offset_raw(pgd, FIXADDR_START))) { 557 if (!pgd_val(*pgd_offset_raw(pgd, FIXADDR_START))) {
554 /* 558 /*