mmu.c (4ccb6aea4b3eb97c94575d1ed4bf10744169f082) mmu.c (aa8c09be7a6f58e1b0dd19413d872fffdb054677)
1/*
2 * Based on arch/arm/mm/mmu.c
3 *
4 * Copyright (C) 1995-2005 Russell King
5 * Copyright (C) 2012 ARM Ltd.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as

--- 305 unchanged lines hidden (view full) ---

314 pgprot_t prot, bool page_mappings_only)
315{
316 BUG_ON(mm == &init_mm);
317
318 __create_pgd_mapping(mm->pgd, phys, virt, size, prot,
319 pgd_pgtable_alloc, page_mappings_only);
320}
321
1/*
2 * Based on arch/arm/mm/mmu.c
3 *
4 * Copyright (C) 1995-2005 Russell King
5 * Copyright (C) 2012 ARM Ltd.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as

--- 305 unchanged lines hidden (view full) ---

314 pgprot_t prot, bool page_mappings_only)
315{
316 BUG_ON(mm == &init_mm);
317
318 __create_pgd_mapping(mm->pgd, phys, virt, size, prot,
319 pgd_pgtable_alloc, page_mappings_only);
320}
321
322static void create_mapping_late(phys_addr_t phys, unsigned long virt,
323 phys_addr_t size, pgprot_t prot)
322static void update_mapping_prot(phys_addr_t phys, unsigned long virt,
323 phys_addr_t size, pgprot_t prot)
324{
325 if (virt < VMALLOC_START) {
324{
325 if (virt < VMALLOC_START) {
326 pr_warn("BUG: not creating mapping for %pa at 0x%016lx - outside kernel range\n",
326 pr_warn("BUG: not updating mapping for %pa at 0x%016lx - outside kernel range\n",
327 &phys, virt);
328 return;
329 }
330
331 __create_pgd_mapping(init_mm.pgd, phys, virt, size, prot,
332 NULL, debug_pagealloc_enabled());
327 &phys, virt);
328 return;
329 }
330
331 __create_pgd_mapping(init_mm.pgd, phys, virt, size, prot,
332 NULL, debug_pagealloc_enabled());
333
334 /* flush the TLBs after updating live kernel mappings */
335 flush_tlb_kernel_range(virt, virt + size);
333}
334
335static void __init __map_memblock(pgd_t *pgd, phys_addr_t start, phys_addr_t end)
336{
337 phys_addr_t kernel_start = __pa_symbol(_text);
338 phys_addr_t kernel_end = __pa_symbol(__init_begin);
339
340 /*

--- 56 unchanged lines hidden (view full) ---

397 }
398}
399
400void mark_rodata_ro(void)
401{
402 unsigned long section_size;
403
404 section_size = (unsigned long)_etext - (unsigned long)_text;
336}
337
338static void __init __map_memblock(pgd_t *pgd, phys_addr_t start, phys_addr_t end)
339{
340 phys_addr_t kernel_start = __pa_symbol(_text);
341 phys_addr_t kernel_end = __pa_symbol(__init_begin);
342
343 /*

--- 56 unchanged lines hidden (view full) ---

400 }
401}
402
403void mark_rodata_ro(void)
404{
405 unsigned long section_size;
406
407 section_size = (unsigned long)_etext - (unsigned long)_text;
405 create_mapping_late(__pa_symbol(_text), (unsigned long)_text,
408 update_mapping_prot(__pa_symbol(_text), (unsigned long)_text,
406 section_size, PAGE_KERNEL_ROX);
407 /*
408 * mark .rodata as read only. Use __init_begin rather than __end_rodata
409 * to cover NOTES and EXCEPTION_TABLE.
410 */
411 section_size = (unsigned long)__init_begin - (unsigned long)__start_rodata;
409 section_size, PAGE_KERNEL_ROX);
410 /*
411 * mark .rodata as read only. Use __init_begin rather than __end_rodata
412 * to cover NOTES and EXCEPTION_TABLE.
413 */
414 section_size = (unsigned long)__init_begin - (unsigned long)__start_rodata;
412 create_mapping_late(__pa_symbol(__start_rodata), (unsigned long)__start_rodata,
415 update_mapping_prot(__pa_symbol(__start_rodata), (unsigned long)__start_rodata,
413 section_size, PAGE_KERNEL_RO);
414
416 section_size, PAGE_KERNEL_RO);
417
415 /* flush the TLBs after updating live kernel mappings */
416 flush_tlb_all();
417
418 debug_checkwx();
419}
420
421static void __init map_kernel_segment(pgd_t *pgd, void *va_start, void *va_end,
422 pgprot_t prot, struct vm_struct *vma)
423{
424 phys_addr_t pa_start = __pa_symbol(va_start);
425 unsigned long size = va_end - va_start;

--- 377 unchanged lines hidden ---
418 debug_checkwx();
419}
420
421static void __init map_kernel_segment(pgd_t *pgd, void *va_start, void *va_end,
422 pgprot_t prot, struct vm_struct *vma)
423{
424 phys_addr_t pa_start = __pa_symbol(va_start);
425 unsigned long size = va_end - va_start;

--- 377 unchanged lines hidden ---