arch/loongarch/kernel/ptrace.c
Source file repositories/reference/linux-study-clean/arch/loongarch/kernel/ptrace.c
File Facts
- System
- Linux kernel
- Corpus path
arch/loongarch/kernel/ptrace.c- Extension
.c- Size
- 26497 bytes
- Lines
- 1096
- Domain
- Architecture Layer
- Bucket
- arch/loongarch
- 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.
- Touches user memory; correctness depends on fault-safe copying and privilege boundary handling.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/kernel.hlinux/audit.hlinux/compiler.hlinux/context_tracking.hlinux/elf.hlinux/errno.hlinux/hw_breakpoint.hlinux/mm.hlinux/nospec.hlinux/ptrace.hlinux/regset.hlinux/sched.hlinux/sched/task_stack.hlinux/security.hlinux/smp.hlinux/stddef.hlinux/seccomp.hlinux/thread_info.hlinux/uaccess.hasm/byteorder.hasm/cpu.hasm/cpu-info.hasm/fpu.hasm/lbt.hasm/loongarch.hasm/page.hasm/pgtable.hasm/processor.hasm/ptrace.hasm/reg.hasm/syscall.h
Detected Declarations
struct pt_regs_offsetenum loongarch_regsetfunction Copyrightfunction ptrace_disablefunction gpr_getfunction gpr_setfunction gfpr_getfunction gfpr_get_simdfunction fpr_getfunction gfpr_setfunction gfpr_set_simdfunction fpr_setfunction cfg_getfunction cfg_setfunction copy_pad_fprsfunction simd_getfunction simd_setfunction lbt_getfunction lbt_setfunction ptrace_hbptriggeredfunction ptrace_hbp_set_eventfunction ptrace_hbp_fill_attr_ctrlfunction ptrace_hbp_get_resource_infofunction ptrace_hbp_get_ctrlfunction ptrace_hbp_get_maskfunction ptrace_hbp_get_addrfunction ptrace_hbp_set_ctrlfunction ptrace_hbp_set_maskfunction ptrace_hbp_set_addrfunction hw_break_getfunction hw_break_setfunction regs_query_register_offsetfunction read_userfunction write_userfunction arch_ptracefunction ptrace_triggeredfunction set_single_stepfunction user_enable_single_stepfunction user_disable_single_step
Annotated Snippet
struct pt_regs_offset {
const char *name;
int offset;
};
#define REG_OFFSET_NAME(n, r) {.name = #n, .offset = offsetof(struct pt_regs, r)}
#define REG_OFFSET_END {.name = NULL, .offset = 0}
static const struct pt_regs_offset regoffset_table[] = {
REG_OFFSET_NAME(r0, regs[0]),
REG_OFFSET_NAME(r1, regs[1]),
REG_OFFSET_NAME(r2, regs[2]),
REG_OFFSET_NAME(r3, regs[3]),
REG_OFFSET_NAME(r4, regs[4]),
REG_OFFSET_NAME(r5, regs[5]),
REG_OFFSET_NAME(r6, regs[6]),
REG_OFFSET_NAME(r7, regs[7]),
REG_OFFSET_NAME(r8, regs[8]),
REG_OFFSET_NAME(r9, regs[9]),
REG_OFFSET_NAME(r10, regs[10]),
REG_OFFSET_NAME(r11, regs[11]),
REG_OFFSET_NAME(r12, regs[12]),
REG_OFFSET_NAME(r13, regs[13]),
REG_OFFSET_NAME(r14, regs[14]),
REG_OFFSET_NAME(r15, regs[15]),
REG_OFFSET_NAME(r16, regs[16]),
REG_OFFSET_NAME(r17, regs[17]),
REG_OFFSET_NAME(r18, regs[18]),
REG_OFFSET_NAME(r19, regs[19]),
REG_OFFSET_NAME(r20, regs[20]),
REG_OFFSET_NAME(r21, regs[21]),
REG_OFFSET_NAME(r22, regs[22]),
REG_OFFSET_NAME(r23, regs[23]),
REG_OFFSET_NAME(r24, regs[24]),
REG_OFFSET_NAME(r25, regs[25]),
REG_OFFSET_NAME(r26, regs[26]),
REG_OFFSET_NAME(r27, regs[27]),
REG_OFFSET_NAME(r28, regs[28]),
REG_OFFSET_NAME(r29, regs[29]),
REG_OFFSET_NAME(r30, regs[30]),
REG_OFFSET_NAME(r31, regs[31]),
REG_OFFSET_NAME(orig_a0, orig_a0),
REG_OFFSET_NAME(csr_era, csr_era),
REG_OFFSET_NAME(csr_badvaddr, csr_badvaddr),
REG_OFFSET_NAME(csr_crmd, csr_crmd),
REG_OFFSET_NAME(csr_prmd, csr_prmd),
REG_OFFSET_NAME(csr_euen, csr_euen),
REG_OFFSET_NAME(csr_ecfg, csr_ecfg),
REG_OFFSET_NAME(csr_estat, csr_estat),
REG_OFFSET_END,
};
/**
* regs_query_register_offset() - query register offset from its name
* @name: the name of a register
*
* regs_query_register_offset() returns the offset of a register in struct
* pt_regs from its name. If the name is invalid, this returns -EINVAL;
*/
int regs_query_register_offset(const char *name)
{
const struct pt_regs_offset *roff;
for (roff = regoffset_table; roff->name != NULL; roff++)
if (!strcmp(roff->name, name))
return roff->offset;
return -EINVAL;
}
enum loongarch_regset {
REGSET_GPR,
REGSET_FPR,
REGSET_CPUCFG,
#ifdef CONFIG_CPU_HAS_LSX
REGSET_LSX,
#endif
#ifdef CONFIG_CPU_HAS_LASX
REGSET_LASX,
#endif
#ifdef CONFIG_CPU_HAS_LBT
REGSET_LBT,
#endif
#ifdef CONFIG_HAVE_HW_BREAKPOINT
REGSET_HW_BREAK,
REGSET_HW_WATCH,
#endif
};
static const struct user_regset loongarch64_regsets[] = {
[REGSET_GPR] = {
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/audit.h`, `linux/compiler.h`, `linux/context_tracking.h`, `linux/elf.h`, `linux/errno.h`, `linux/hw_breakpoint.h`, `linux/mm.h`.
- Detected declarations: `struct pt_regs_offset`, `enum loongarch_regset`, `function Copyright`, `function ptrace_disable`, `function gpr_get`, `function gpr_set`, `function gfpr_get`, `function gfpr_get_simd`, `function fpr_get`, `function gfpr_set`.
- Atlas domain: Architecture Layer / arch/loongarch.
- Implementation status: source implementation candidate.
- This snippet crosses the user/kernel memory boundary; validate fault handling and access checks before translating the pattern.
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.