arch/powerpc/include/asm/nohash/32/kup-8xx.h
Source file repositories/reference/linux-study-clean/arch/powerpc/include/asm/nohash/32/kup-8xx.h
File Facts
- System
- Linux kernel
- Corpus path
arch/powerpc/include/asm/nohash/32/kup-8xx.h- Extension
.h- Size
- 1957 bytes
- Lines
- 89
- 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.hasm/reg.h
Detected Declarations
function __kuap_save_and_lockfunction kuap_user_restorefunction __kuap_get_and_assert_lockedfunction uaccess_begin_8xxfunction uaccess_end_8xxfunction allow_user_accessfunction prevent_user_accessfunction prevent_user_access_returnfunction restore_user_accessfunction __bad_kuap_fault
Annotated Snippet
#ifndef _ASM_POWERPC_KUP_8XX_H_
#define _ASM_POWERPC_KUP_8XX_H_
#include <asm/bug.h>
#include <asm/mmu.h>
#ifdef CONFIG_PPC_KUAP
#ifndef __ASSEMBLER__
#include <asm/reg.h>
static __always_inline void __kuap_save_and_lock(struct pt_regs *regs)
{
regs->kuap = mfspr(SPRN_MD_AP);
mtspr(SPRN_MD_AP, MD_APG_KUAP);
}
#define __kuap_save_and_lock __kuap_save_and_lock
static __always_inline void kuap_user_restore(struct pt_regs *regs)
{
}
static __always_inline void __kuap_kernel_restore(struct pt_regs *regs, unsigned long kuap)
{
mtspr(SPRN_MD_AP, regs->kuap);
}
#ifdef CONFIG_PPC_KUAP_DEBUG
static __always_inline unsigned long __kuap_get_and_assert_locked(void)
{
WARN_ON_ONCE(mfspr(SPRN_MD_AP) >> 16 != MD_APG_KUAP >> 16);
return 0;
}
#define __kuap_get_and_assert_locked __kuap_get_and_assert_locked
#endif
static __always_inline void uaccess_begin_8xx(unsigned long val)
{
asm(ASM_MMU_FTR_IFSET("mtspr %0, %1", "", %2) : :
"i"(SPRN_MD_AP), "r"(val), "i"(MMU_FTR_KUAP) : "memory");
}
static __always_inline void uaccess_end_8xx(void)
{
asm(ASM_MMU_FTR_IFSET("mtspr %0, %1", "", %2) : :
"i"(SPRN_MD_AP), "r"(MD_APG_KUAP), "i"(MMU_FTR_KUAP) : "memory");
}
static __always_inline void allow_user_access(void __user *to, unsigned long dir)
{
uaccess_begin_8xx(MD_APG_INIT);
}
static __always_inline void prevent_user_access(unsigned long dir)
{
uaccess_end_8xx();
}
static __always_inline unsigned long prevent_user_access_return(void)
{
unsigned long flags;
flags = mfspr(SPRN_MD_AP);
uaccess_end_8xx();
return flags;
}
static __always_inline void restore_user_access(unsigned long flags)
{
uaccess_begin_8xx(flags);
}
static __always_inline bool
__bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write)
{
return !((regs->kuap ^ MD_APG_KUAP) & 0xff000000);
}
#endif /* !__ASSEMBLER__ */
#endif /* CONFIG_PPC_KUAP */
#endif /* _ASM_POWERPC_KUP_8XX_H_ */
Annotation
- Immediate include surface: `asm/bug.h`, `asm/mmu.h`, `asm/reg.h`.
- Detected declarations: `function __kuap_save_and_lock`, `function kuap_user_restore`, `function __kuap_get_and_assert_locked`, `function uaccess_begin_8xx`, `function uaccess_end_8xx`, `function allow_user_access`, `function prevent_user_access`, `function prevent_user_access_return`, `function restore_user_access`, `function __bad_kuap_fault`.
- 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.