arch/powerpc/include/asm/kfence.h

Source file repositories/reference/linux-study-clean/arch/powerpc/include/asm/kfence.h

File Facts

System
Linux kernel
Corpus path
arch/powerpc/include/asm/kfence.h
Extension
.h
Size
1188 bytes
Lines
62
Domain
Architecture Layer
Bucket
arch/powerpc
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.

Dependency Surface

Detected Declarations

Annotated Snippet

#ifndef __ASM_POWERPC_KFENCE_H
#define __ASM_POWERPC_KFENCE_H

#include <linux/mm.h>
#include <asm/pgtable.h>

#ifdef CONFIG_PPC64_ELF_ABI_V1
#define ARCH_FUNC_PREFIX "."
#endif

extern bool kfence_early_init;
extern bool kfence_disabled;

static inline void disable_kfence(void)
{
	kfence_disabled = true;
}

static inline bool arch_kfence_init_pool(void)
{
	return !kfence_disabled;
}

static inline bool kfence_early_init_enabled(void)
{
	return IS_ENABLED(CONFIG_KFENCE) && kfence_early_init;
}

#ifdef CONFIG_PPC64
static inline bool kfence_protect_page(unsigned long addr, bool protect)
{
	struct page *page = virt_to_page((void *)addr);

	__kernel_map_pages(page, 1, !protect);

	return true;
}
#else
static inline bool kfence_protect_page(unsigned long addr, bool protect)
{
	pte_t *kpte = virt_to_kpte(addr);

	if (protect) {
		pte_update(&init_mm, addr, kpte, _PAGE_PRESENT, 0, 0);
		flush_tlb_kernel_range(addr, addr + PAGE_SIZE);
	} else {
		pte_update(&init_mm, addr, kpte, 0, _PAGE_PRESENT, 0);
	}

	return true;
}
#endif

#endif /* __ASM_POWERPC_KFENCE_H */

Annotation

Implementation Notes