arch/powerpc/kernel/module_64.c
Source file repositories/reference/linux-study-clean/arch/powerpc/kernel/module_64.c
File Facts
- System
- Linux kernel
- Corpus path
arch/powerpc/kernel/module_64.c- Extension
.c- Size
- 32241 bytes
- Lines
- 1163
- Domain
- Architecture Layer
- Bucket
- arch/powerpc
- Inferred role
- Architecture Layer: exported/initcall integration point
- Status
- integration 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- 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/module.hlinux/elf.hlinux/moduleloader.hlinux/err.hlinux/vmalloc.hlinux/ftrace.hlinux/bug.hlinux/uaccess.hlinux/kernel.hasm/module.hasm/firmware.hasm/text-patching.hlinux/sort.hasm/setup.hasm/sections.hasm/inst.h
Detected Declarations
struct ppc64_stub_entrystruct ppc64_got_entryfunction Copyrightfunction func_descfunction local_entry_offsetfunction func_descfunction local_entry_offsetfunction func_addrfunction stub_func_addrfunction relocationsfunction relacmpfunction get_stubs_sizefunction count_pcpu_relocsfunction get_got_sizefunction dedotify_versionsfunction dedotify_ext_version_namesfunction definedfunction module_init_sectionfunction module_frob_arch_sectionsfunction pacafunction is_mprofile_ftrace_callfunction create_ftrace_stubfunction is_mprofile_ftrace_callfunction my_r2function create_stubfunction ptrfunction got_for_addrfunction restore_r2function apply_relocate_addfunction module_trampoline_targetfunction setup_ftrace_ool_stubsfunction module_finalize_ftrace
Annotated Snippet
struct ppc64_stub_entry {
/*
* 28 byte jump instruction sequence (7 instructions) that can
* hold ppc64_stub_insns or stub_insns. Must be 8-byte aligned
* with PCREL kernels that use prefix instructions in the stub.
*/
u32 jump[7];
/* Used by ftrace to identify stubs */
u32 magic;
/* Data for the above code */
func_desc_t funcdata;
} __aligned(8);
struct ppc64_got_entry {
u64 addr;
};
/*
* PPC64 uses 24 bit jumps, but we need to jump into other modules or
* the kernel which may be further. So we jump to a stub.
*
* Target address and TOC are loaded from function descriptor in the
* ppc64_stub_entry.
*
* r12 is used to generate the target address, which is required for the
* ELFv2 global entry point calling convention.
*
* TOC handling:
* - PCREL does not have a TOC.
* - ELFv2 non-PCREL just has to save r2, the callee is responsible for
* setting its own TOC pointer at the global entry address.
* - ELFv1 must load the new TOC pointer from the function descriptor.
*/
static u32 ppc64_stub_insns[] = {
#ifdef CONFIG_PPC_KERNEL_PCREL
/* pld r12,addr */
PPC_PREFIX_8LS | __PPC_PRFX_R(1),
PPC_INST_PLD | ___PPC_RT(_R12),
#else
PPC_RAW_ADDIS(_R11, _R2, 0),
PPC_RAW_ADDI(_R11, _R11, 0),
/* Save current r2 value in magic place on the stack. */
PPC_RAW_STD(_R2, _R1, R2_STACK_OFFSET),
PPC_RAW_LD(_R12, _R11, 32),
#ifdef CONFIG_PPC64_ELF_ABI_V1
/* Set up new r2 from function descriptor */
PPC_RAW_LD(_R2, _R11, 40),
#endif
#endif
PPC_RAW_MTCTR(_R12),
PPC_RAW_BCTR(),
};
/*
* Count how many different r_type relocations (different symbol,
* different addend).
*/
static unsigned int count_relocs(const Elf64_Rela *rela, unsigned int num,
unsigned long r_type)
{
unsigned int i, r_info, r_addend, _count_relocs;
/* FIXME: Only count external ones --RR */
_count_relocs = 0;
r_info = 0;
r_addend = 0;
for (i = 0; i < num; i++)
/* Only count r_type relocs, others don't need stubs */
if (ELF64_R_TYPE(rela[i].r_info) == r_type &&
(r_info != ELF64_R_SYM(rela[i].r_info) ||
r_addend != rela[i].r_addend)) {
_count_relocs++;
r_info = ELF64_R_SYM(rela[i].r_info);
r_addend = rela[i].r_addend;
}
return _count_relocs;
}
static int relacmp(const void *_x, const void *_y)
{
const Elf64_Rela *x, *y;
y = (Elf64_Rela *)_x;
x = (Elf64_Rela *)_y;
/* Compare the entire r_info (as opposed to ELF64_R_SYM(r_info) only) to
* make the comparison cheaper/faster. It won't affect the sorting or
* the counting algorithms' performance
*/
Annotation
- Immediate include surface: `linux/module.h`, `linux/elf.h`, `linux/moduleloader.h`, `linux/err.h`, `linux/vmalloc.h`, `linux/ftrace.h`, `linux/bug.h`, `linux/uaccess.h`.
- Detected declarations: `struct ppc64_stub_entry`, `struct ppc64_got_entry`, `function Copyright`, `function func_desc`, `function local_entry_offset`, `function func_desc`, `function local_entry_offset`, `function func_addr`, `function stub_func_addr`, `function relocations`.
- Atlas domain: Architecture Layer / arch/powerpc.
- Implementation status: integration 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.