in kernel/ptrace.c [1575:1607]
static void do_fpregs_get(struct unw_frame_info *info, void *arg)
{
struct task_struct *task = info->task;
struct regset_membuf *dst = arg;
struct membuf to = dst->to;
elf_fpreg_t reg;
unsigned int n;
if (unw_unwind_to_user(info) < 0)
return;
/* Skip pos 0 and 1 */
membuf_zero(&to, 2 * sizeof(elf_fpreg_t));
/* fr2-fr31 */
for (n = 2; to.left && n < 32; n++) {
if (unw_get_fr(info, n, ®)) {
dst->ret = -EIO;
return;
}
membuf_write(&to, ®, sizeof(reg));
}
/* fph */
if (!to.left)
return;
ia64_flush_fph(task);
if (task->thread.flags & IA64_THREAD_FPH_VALID)
membuf_write(&to, &task->thread.fph, 96 * sizeof(reg));
else
membuf_zero(&to, 96 * sizeof(reg));
}