in kernel/ptrace.c [47:88]
static int genregs_set(struct task_struct *target,
const struct user_regset *regset,
unsigned int pos, unsigned int count,
const void *kbuf, const void __user *ubuf)
{
struct pt_regs *regs = task_pt_regs(target);
const struct switch_stack *sw = (struct switch_stack *)regs - 1;
int ret = 0;
#define REG_IGNORE_RANGE(START, END) \
if (!ret) \
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, \
START * 4, (END * 4) + 4);
#define REG_IN_ONE(PTR, LOC) \
if (!ret) \
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, \
(void *)(PTR), LOC * 4, (LOC * 4) + 4);
#define REG_IN_RANGE(PTR, START, END) \
if (!ret) \
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, \
(void *)(PTR), START * 4, (END * 4) + 4);
REG_IGNORE_RANGE(PTR_R0, PTR_R0);
REG_IN_RANGE(®s->r1, PTR_R1, PTR_R7);
REG_IN_RANGE(®s->r8, PTR_R8, PTR_R15);
REG_IN_RANGE(sw, PTR_R16, PTR_R23);
REG_IGNORE_RANGE(PTR_R24, PTR_R25); /* et and bt */
REG_IN_ONE(®s->gp, PTR_GP);
REG_IN_ONE(®s->sp, PTR_SP);
REG_IN_ONE(®s->fp, PTR_FP);
REG_IN_ONE(®s->ea, PTR_EA);
REG_IGNORE_RANGE(PTR_BA, PTR_BA);
REG_IN_ONE(®s->ra, PTR_RA);
REG_IN_ONE(®s->ea, PTR_PC); /* use ea for PC */
if (!ret)
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
PTR_STATUS * 4, -1);
return ret;
}