mmu.c (87a0b2fafc09766d8c55461a18345a1cfb10a7fe) | mmu.c (ee017ee353506fcec58e481673e4331ff198a80e) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Based on arch/arm/mm/mmu.c 4 * 5 * Copyright (C) 1995-2005 Russell King 6 * Copyright (C) 2012 ARM Ltd. 7 */ 8 --- 49 unchanged lines hidden (view full) --- 58unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] __page_aligned_bss; 59EXPORT_SYMBOL(empty_zero_page); 60 61static pte_t bm_pte[PTRS_PER_PTE] __page_aligned_bss; 62static pmd_t bm_pmd[PTRS_PER_PMD] __page_aligned_bss __maybe_unused; 63static pud_t bm_pud[PTRS_PER_PUD] __page_aligned_bss __maybe_unused; 64 65static DEFINE_SPINLOCK(swapper_pgdir_lock); | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Based on arch/arm/mm/mmu.c 4 * 5 * Copyright (C) 1995-2005 Russell King 6 * Copyright (C) 2012 ARM Ltd. 7 */ 8 --- 49 unchanged lines hidden (view full) --- 58unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] __page_aligned_bss; 59EXPORT_SYMBOL(empty_zero_page); 60 61static pte_t bm_pte[PTRS_PER_PTE] __page_aligned_bss; 62static pmd_t bm_pmd[PTRS_PER_PMD] __page_aligned_bss __maybe_unused; 63static pud_t bm_pud[PTRS_PER_PUD] __page_aligned_bss __maybe_unused; 64 65static DEFINE_SPINLOCK(swapper_pgdir_lock); |
66static DEFINE_MUTEX(fixmap_lock); |
|
66 67void set_swapper_pgd(pgd_t *pgdp, pgd_t pgd) 68{ 69 pgd_t *fixmap_pgdp; 70 71 spin_lock(&swapper_pgdir_lock); 72 fixmap_pgdp = pgd_set_fixmap(__pa_symbol(pgdp)); 73 WRITE_ONCE(*fixmap_pgdp, pgd); --- 250 unchanged lines hidden (view full) --- 324 p4dval |= P4D_TABLE_PXN; 325 BUG_ON(!pgtable_alloc); 326 pud_phys = pgtable_alloc(PUD_SHIFT); 327 __p4d_populate(p4dp, pud_phys, p4dval); 328 p4d = READ_ONCE(*p4dp); 329 } 330 BUG_ON(p4d_bad(p4d)); 331 | 67 68void set_swapper_pgd(pgd_t *pgdp, pgd_t pgd) 69{ 70 pgd_t *fixmap_pgdp; 71 72 spin_lock(&swapper_pgdir_lock); 73 fixmap_pgdp = pgd_set_fixmap(__pa_symbol(pgdp)); 74 WRITE_ONCE(*fixmap_pgdp, pgd); --- 250 unchanged lines hidden (view full) --- 325 p4dval |= P4D_TABLE_PXN; 326 BUG_ON(!pgtable_alloc); 327 pud_phys = pgtable_alloc(PUD_SHIFT); 328 __p4d_populate(p4dp, pud_phys, p4dval); 329 p4d = READ_ONCE(*p4dp); 330 } 331 BUG_ON(p4d_bad(p4d)); 332 |
333 /* 334 * No need for locking during early boot. And it doesn't work as 335 * expected with KASLR enabled. 336 */ 337 if (system_state != SYSTEM_BOOTING) 338 mutex_lock(&fixmap_lock); |
|
332 pudp = pud_set_fixmap_offset(p4dp, addr); 333 do { 334 pud_t old_pud = READ_ONCE(*pudp); 335 336 next = pud_addr_end(addr, end); 337 338 /* 339 * For 4K granule only, attempt to put down a 1GB block --- 14 unchanged lines hidden (view full) --- 354 355 BUG_ON(pud_val(old_pud) != 0 && 356 pud_val(old_pud) != READ_ONCE(pud_val(*pudp))); 357 } 358 phys += next - addr; 359 } while (pudp++, addr = next, addr != end); 360 361 pud_clear_fixmap(); | 339 pudp = pud_set_fixmap_offset(p4dp, addr); 340 do { 341 pud_t old_pud = READ_ONCE(*pudp); 342 343 next = pud_addr_end(addr, end); 344 345 /* 346 * For 4K granule only, attempt to put down a 1GB block --- 14 unchanged lines hidden (view full) --- 361 362 BUG_ON(pud_val(old_pud) != 0 && 363 pud_val(old_pud) != READ_ONCE(pud_val(*pudp))); 364 } 365 phys += next - addr; 366 } while (pudp++, addr = next, addr != end); 367 368 pud_clear_fixmap(); |
369 if (system_state != SYSTEM_BOOTING) 370 mutex_unlock(&fixmap_lock); |
|
362} 363 364static void __create_pgd_mapping(pgd_t *pgdir, phys_addr_t phys, 365 unsigned long virt, phys_addr_t size, 366 pgprot_t prot, 367 phys_addr_t (*pgtable_alloc)(int), 368 int flags) 369{ --- 1275 unchanged lines hidden --- | 371} 372 373static void __create_pgd_mapping(pgd_t *pgdir, phys_addr_t phys, 374 unsigned long virt, phys_addr_t size, 375 pgprot_t prot, 376 phys_addr_t (*pgtable_alloc)(int), 377 int flags) 378{ --- 1275 unchanged lines hidden --- |