arch/powerpc/include/asm/nohash/kup-booke.h
Source file repositories/reference/linux-study-clean/arch/powerpc/include/asm/nohash/kup-booke.h
File Facts
- System
- Linux kernel
- Corpus path
arch/powerpc/include/asm/nohash/kup-booke.h- Extension
.h- Size
- 2325 bytes
- Lines
- 112
- 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.
- CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
asm/bug.hasm/mmu.hlinux/sched.hasm/reg.h
Detected Declarations
function __kuap_lockfunction __kuap_save_and_lockfunction kuap_user_restorefunction __kuap_kernel_restorefunction __kuap_get_and_assert_lockedfunction uaccess_begin_bookefunction uaccess_end_bookefunction allow_user_accessfunction prevent_user_accessfunction prevent_user_access_returnfunction restore_user_accessfunction __bad_kuap_fault
Annotated Snippet
#ifndef _ASM_POWERPC_KUP_BOOKE_H_
#define _ASM_POWERPC_KUP_BOOKE_H_
#include <asm/bug.h>
#include <asm/mmu.h>
#ifdef CONFIG_PPC_KUAP
#ifdef __ASSEMBLER__
.macro kuap_check_amr gpr1, gpr2
.endm
#else
#include <linux/sched.h>
#include <asm/reg.h>
static __always_inline void __kuap_lock(void)
{
mtspr(SPRN_PID, 0);
isync();
}
#define __kuap_lock __kuap_lock
static __always_inline void __kuap_save_and_lock(struct pt_regs *regs)
{
regs->kuap = mfspr(SPRN_PID);
mtspr(SPRN_PID, 0);
isync();
}
#define __kuap_save_and_lock __kuap_save_and_lock
static __always_inline void kuap_user_restore(struct pt_regs *regs)
{
if (kuap_is_disabled())
return;
mtspr(SPRN_PID, current->thread.pid);
/* Context synchronisation is performed by rfi */
}
static __always_inline void __kuap_kernel_restore(struct pt_regs *regs, unsigned long kuap)
{
if (regs->kuap)
mtspr(SPRN_PID, current->thread.pid);
/* Context synchronisation is performed by rfi */
}
#ifdef CONFIG_PPC_KUAP_DEBUG
static __always_inline unsigned long __kuap_get_and_assert_locked(void)
{
WARN_ON_ONCE(mfspr(SPRN_PID));
return 0;
}
#define __kuap_get_and_assert_locked __kuap_get_and_assert_locked
#endif
static __always_inline void uaccess_begin_booke(unsigned long val)
{
asm(ASM_MMU_FTR_IFSET("mtspr %0, %1; isync", "", %2) : :
"i"(SPRN_PID), "r"(val), "i"(MMU_FTR_KUAP) : "memory");
}
static __always_inline void uaccess_end_booke(void)
{
asm(ASM_MMU_FTR_IFSET("mtspr %0, %1; isync", "", %2) : :
"i"(SPRN_PID), "r"(0), "i"(MMU_FTR_KUAP) : "memory");
}
static __always_inline void allow_user_access(void __user *to, unsigned long dir)
{
uaccess_begin_booke(current->thread.pid);
}
static __always_inline void prevent_user_access(unsigned long dir)
{
uaccess_end_booke();
}
static __always_inline unsigned long prevent_user_access_return(void)
{
unsigned long flags = mfspr(SPRN_PID);
uaccess_end_booke();
Annotation
- Immediate include surface: `asm/bug.h`, `asm/mmu.h`, `linux/sched.h`, `asm/reg.h`.
- Detected declarations: `function __kuap_lock`, `function __kuap_save_and_lock`, `function kuap_user_restore`, `function __kuap_kernel_restore`, `function __kuap_get_and_assert_locked`, `function uaccess_begin_booke`, `function uaccess_end_booke`, `function allow_user_access`, `function prevent_user_access`, `function prevent_user_access_return`.
- Atlas domain: Architecture Layer / arch/powerpc.
- 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.