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 --- |