arch/x86/mm/kasan_init_64.c
Source file repositories/reference/linux-study-clean/arch/x86/mm/kasan_init_64.c
File Facts
- System
- Linux kernel
- Corpus path
arch/x86/mm/kasan_init_64.c- Extension
.c- Size
- 12194 bytes
- Lines
- 456
- Domain
- Architecture Layer
- Bucket
- arch/x86
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/memblock.hlinux/kasan.hlinux/kdebug.hlinux/mm.hlinux/sched.hlinux/sched/task.hlinux/vmalloc.hasm/e820/types.hasm/pgalloc.hasm/tlbflush.hasm/sections.hasm/cpu_entry_area.h
Detected Declarations
function kasan_populate_pmdfunction kasan_populate_pudfunction kasan_populate_p4dfunction kasan_populate_pgdfunction kasan_populate_shadowfunction map_rangefunction clear_pgdsfunction kasan_early_p4d_populatefunction kasan_map_early_shadowfunction kasan_shallow_populate_p4dsfunction kasan_shallow_populate_pgdsfunction kasan_early_initfunction kasan_mem_to_shadow_align_downfunction kasan_mem_to_shadow_align_upfunction kasan_populate_shadow_for_vaddrfunction kasan_init
Annotated Snippet
IS_ALIGNED(addr, PMD_SIZE)) {
p = early_alloc(PMD_SIZE, nid, false);
if (p && pmd_set_huge(pmd, __pa(p), PAGE_KERNEL))
return;
memblock_free(p, PMD_SIZE);
}
p = early_alloc(PAGE_SIZE, nid, true);
pmd_populate_kernel(&init_mm, pmd, p);
}
pte = pte_offset_kernel(pmd, addr);
do {
pte_t entry;
void *p;
if (!pte_none(*pte))
continue;
p = early_alloc(PAGE_SIZE, nid, true);
entry = pfn_pte(PFN_DOWN(__pa(p)), PAGE_KERNEL);
set_pte_at(&init_mm, addr, pte, entry);
} while (pte++, addr += PAGE_SIZE, addr != end);
}
static void __init kasan_populate_pud(pud_t *pud, unsigned long addr,
unsigned long end, int nid)
{
pmd_t *pmd;
unsigned long next;
if (pud_none(*pud)) {
void *p;
if (boot_cpu_has(X86_FEATURE_GBPAGES) &&
((end - addr) == PUD_SIZE) &&
IS_ALIGNED(addr, PUD_SIZE)) {
p = early_alloc(PUD_SIZE, nid, false);
if (p && pud_set_huge(pud, __pa(p), PAGE_KERNEL))
return;
memblock_free(p, PUD_SIZE);
}
p = early_alloc(PAGE_SIZE, nid, true);
pud_populate(&init_mm, pud, p);
}
pmd = pmd_offset(pud, addr);
do {
next = pmd_addr_end(addr, end);
if (!pmd_leaf(*pmd))
kasan_populate_pmd(pmd, addr, next, nid);
} while (pmd++, addr = next, addr != end);
}
static void __init kasan_populate_p4d(p4d_t *p4d, unsigned long addr,
unsigned long end, int nid)
{
pud_t *pud;
unsigned long next;
if (p4d_none(*p4d)) {
void *p = early_alloc(PAGE_SIZE, nid, true);
p4d_populate(&init_mm, p4d, p);
}
pud = pud_offset(p4d, addr);
do {
next = pud_addr_end(addr, end);
if (!pud_leaf(*pud))
kasan_populate_pud(pud, addr, next, nid);
} while (pud++, addr = next, addr != end);
}
static void __init kasan_populate_pgd(pgd_t *pgd, unsigned long addr,
unsigned long end, int nid)
{
void *p;
p4d_t *p4d;
unsigned long next;
if (pgd_none(*pgd)) {
p = early_alloc(PAGE_SIZE, nid, true);
pgd_populate(&init_mm, pgd, p);
}
p4d = p4d_offset(pgd, addr);
do {
next = p4d_addr_end(addr, end);
Annotation
- Immediate include surface: `linux/memblock.h`, `linux/kasan.h`, `linux/kdebug.h`, `linux/mm.h`, `linux/sched.h`, `linux/sched/task.h`, `linux/vmalloc.h`, `asm/e820/types.h`.
- Detected declarations: `function kasan_populate_pmd`, `function kasan_populate_pud`, `function kasan_populate_p4d`, `function kasan_populate_pgd`, `function kasan_populate_shadow`, `function map_range`, `function clear_pgds`, `function kasan_early_p4d_populate`, `function kasan_map_early_shadow`, `function kasan_shallow_populate_p4ds`.
- Atlas domain: Architecture Layer / arch/x86.
- 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.