diff options
| -rw-r--r-- | arch/arm64/mm/mmu.c | 18 |
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 | ||
| 497 | static void __init map_kernel_segment(pgd_t *pgd, void *va_start, void *va_end, | 497 | static 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 | /* |
