static void do_fpregs_get()

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, &reg)) {
			dst->ret = -EIO;
			return;
		}
		membuf_write(&to, &reg, 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));
}