arch/riscv/mm/kasan_init.c
Source file repositories/reference/linux-study-clean/arch/riscv/mm/kasan_init.c
File Facts
- System
- Linux kernel
- Corpus path
arch/riscv/mm/kasan_init.c- Extension
.c- Size
- 14485 bytes
- Lines
- 538
- Domain
- Architecture Layer
- Bucket
- arch/riscv
- Inferred role
- Architecture Layer: implementation source
- Status
- source implementation candidate
Why This File Exists
CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
Dependency Surface
linux/pfn.hlinux/init_task.hlinux/kasan.hlinux/kernel.hlinux/memblock.hlinux/pgtable.hasm/tlbflush.hasm/fixmap.hasm/pgalloc.h
Detected Declarations
function kasan_populate_ptefunction kasan_populate_pmdfunction kasan_populate_pudfunction kasan_populate_p4dfunction kasan_populate_pgdfunction kasan_early_clear_pudfunction kasan_early_clear_p4dfunction kasan_early_clear_pgdfunction kasan_early_populate_pudfunction kasan_early_populate_p4dfunction kasan_early_populate_pgdfunction kasan_early_initfunction kasan_swapper_initfunction kasan_populatefunction kasan_shallow_populate_pudfunction kasan_shallow_populate_p4dfunction kasan_shallow_populate_pgdfunction kasan_shallow_populatefunction kasan_populate_early_vm_area_shadowfunction create_tmp_mappingfunction kasan_init
Annotated Snippet
if (pte_none(ptep_get(ptep))) {
phys_addr = memblock_phys_alloc(PAGE_SIZE, PAGE_SIZE);
set_pte(ptep, pfn_pte(PFN_DOWN(phys_addr), PAGE_KERNEL));
memset(__va(phys_addr), KASAN_SHADOW_INIT, PAGE_SIZE);
}
} while (ptep++, vaddr += PAGE_SIZE, vaddr != end);
}
static void __init kasan_populate_pmd(pud_t *pud, unsigned long vaddr, unsigned long end)
{
phys_addr_t phys_addr;
pmd_t *pmdp, *p;
unsigned long next;
if (pud_none(pudp_get(pud))) {
p = memblock_alloc_or_panic(PTRS_PER_PMD * sizeof(pmd_t), PAGE_SIZE);
set_pud(pud, pfn_pud(PFN_DOWN(__pa(p)), PAGE_TABLE));
}
pmdp = pmd_offset(pud, vaddr);
do {
next = pmd_addr_end(vaddr, end);
if (pmd_none(pmdp_get(pmdp)) && IS_ALIGNED(vaddr, PMD_SIZE) &&
(next - vaddr) >= PMD_SIZE) {
phys_addr = memblock_phys_alloc(PMD_SIZE, PMD_SIZE);
if (phys_addr) {
set_pmd(pmdp, pfn_pmd(PFN_DOWN(phys_addr), PAGE_KERNEL));
memset(__va(phys_addr), KASAN_SHADOW_INIT, PMD_SIZE);
continue;
}
}
kasan_populate_pte(pmdp, vaddr, next);
} while (pmdp++, vaddr = next, vaddr != end);
}
static void __init kasan_populate_pud(p4d_t *p4d,
unsigned long vaddr, unsigned long end)
{
phys_addr_t phys_addr;
pud_t *pudp, *p;
unsigned long next;
if (p4d_none(p4dp_get(p4d))) {
p = memblock_alloc_or_panic(PTRS_PER_PUD * sizeof(pud_t), PAGE_SIZE);
set_p4d(p4d, pfn_p4d(PFN_DOWN(__pa(p)), PAGE_TABLE));
}
pudp = pud_offset(p4d, vaddr);
do {
next = pud_addr_end(vaddr, end);
if (pud_none(pudp_get(pudp)) && IS_ALIGNED(vaddr, PUD_SIZE) &&
(next - vaddr) >= PUD_SIZE) {
phys_addr = memblock_phys_alloc(PUD_SIZE, PUD_SIZE);
if (phys_addr) {
set_pud(pudp, pfn_pud(PFN_DOWN(phys_addr), PAGE_KERNEL));
memset(__va(phys_addr), KASAN_SHADOW_INIT, PUD_SIZE);
continue;
}
}
kasan_populate_pmd(pudp, vaddr, next);
} while (pudp++, vaddr = next, vaddr != end);
}
static void __init kasan_populate_p4d(pgd_t *pgd,
unsigned long vaddr, unsigned long end)
{
phys_addr_t phys_addr;
p4d_t *p4dp, *p;
unsigned long next;
if (pgd_none(pgdp_get(pgd))) {
p = memblock_alloc_or_panic(PTRS_PER_P4D * sizeof(p4d_t), PAGE_SIZE);
set_pgd(pgd, pfn_pgd(PFN_DOWN(__pa(p)), PAGE_TABLE));
}
p4dp = p4d_offset(pgd, vaddr);
do {
next = p4d_addr_end(vaddr, end);
if (p4d_none(p4dp_get(p4dp)) && IS_ALIGNED(vaddr, P4D_SIZE) &&
(next - vaddr) >= P4D_SIZE) {
phys_addr = memblock_phys_alloc(P4D_SIZE, P4D_SIZE);
if (phys_addr) {
Annotation
- Immediate include surface: `linux/pfn.h`, `linux/init_task.h`, `linux/kasan.h`, `linux/kernel.h`, `linux/memblock.h`, `linux/pgtable.h`, `asm/tlbflush.h`, `asm/fixmap.h`.
- Detected declarations: `function kasan_populate_pte`, `function kasan_populate_pmd`, `function kasan_populate_pud`, `function kasan_populate_p4d`, `function kasan_populate_pgd`, `function kasan_early_clear_pud`, `function kasan_early_clear_p4d`, `function kasan_early_clear_pgd`, `function kasan_early_populate_pud`, `function kasan_early_populate_p4d`.
- Atlas domain: Architecture Layer / arch/riscv.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.