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