int put_fp_registers(int pid, unsigned long *regs)
{
	if (have_fpx_regs)
		return restore_fpx_registers(pid, regs);
	else
		return restore_fp_registers(pid, regs);
}
static int copy_sc_from_user(struct pt_regs *regs,
			     struct sigcontext __user *from,
			     struct _fpstate __user *fpp)
{
	struct user_i387_struct fp;
	int err = 0;

#define GETREG(regs, regno, sc, regname)				\
	__get_user((regs)->regs.gp[(regno) / sizeof(unsigned long)],	\
		   &(sc)->regname)

	err |= GETREG(regs, R8, from, r8);
	err |= GETREG(regs, R9, from, r9);
	err |= GETREG(regs, R10, from, r10);
	err |= GETREG(regs, R11, from, r11);
	err |= GETREG(regs, R12, from, r12);
	err |= GETREG(regs, R13, from, r13);
	err |= GETREG(regs, R14, from, r14);
	err |= GETREG(regs, R15, from, r15);
	err |= GETREG(regs, RDI, from, di);
	err |= GETREG(regs, RSI, from, si);
	err |= GETREG(regs, RBP, from, bp);
	err |= GETREG(regs, RBX, from, bx);
	err |= GETREG(regs, RDX, from, dx);
	err |= GETREG(regs, RAX, from, ax);
	err |= GETREG(regs, RCX, from, cx);
	err |= GETREG(regs, RSP, from, sp);
	err |= GETREG(regs, RIP, from, ip);
	err |= GETREG(regs, EFLAGS, from, flags);
	err |= GETREG(regs, CS, from, cs);
	if (err)
		return 1;

#undef GETREG

	err = copy_from_user(&fp, fpp, sizeof(struct user_i387_struct));
	if (err)
		return 1;

	err = restore_fp_registers(userspace_pid[current_thread_info()->cpu],
				   (unsigned long *) &fp);
	if (err < 0) {
		printk(KERN_ERR "copy_sc_from_user - "
		       "restore_fp_registers failed, errno = %d\n",
		       -err);
		return 1;
	}

	return 0;
}
Exemple #3
0
static int copy_sc_from_user_skas(struct pt_regs *regs,
				  struct sigcontext *from)
{
  	struct sigcontext sc;
	unsigned long fpregs[HOST_FP_SIZE];
	int err;

	err = copy_from_user(&sc, from, sizeof(sc));
	err |= copy_from_user(fpregs, sc.fpstate, sizeof(fpregs));
	if(err)
		return(err);

	REGS_GS(regs->regs.skas.regs) = sc.gs;
	REGS_FS(regs->regs.skas.regs) = sc.fs;
	REGS_ES(regs->regs.skas.regs) = sc.es;
	REGS_DS(regs->regs.skas.regs) = sc.ds;
	REGS_EDI(regs->regs.skas.regs) = sc.edi;
	REGS_ESI(regs->regs.skas.regs) = sc.esi;
	REGS_EBP(regs->regs.skas.regs) = sc.ebp;
	REGS_SP(regs->regs.skas.regs) = sc.esp;
	REGS_EBX(regs->regs.skas.regs) = sc.ebx;
	REGS_EDX(regs->regs.skas.regs) = sc.edx;
	REGS_ECX(regs->regs.skas.regs) = sc.ecx;
	REGS_EAX(regs->regs.skas.regs) = sc.eax;
	REGS_IP(regs->regs.skas.regs) = sc.eip;
	REGS_CS(regs->regs.skas.regs) = sc.cs;
	REGS_EFLAGS(regs->regs.skas.regs) = sc.eflags;
	REGS_SS(regs->regs.skas.regs) = sc.ss;

	err = restore_fp_registers(userspace_pid[0], fpregs);
	if(err < 0){
	  	printk("copy_sc_from_user_skas - PTRACE_SETFPREGS failed, "
		       "errno = %d\n", err);
		return(1);
	}

	return(0);
}
Exemple #4
0
static int copy_sc_from_user_skas(struct pt_regs *regs,
				  struct sigcontext __user *from)
{
  	struct sigcontext sc;
	unsigned long fpregs[HOST_FP_SIZE];
	int err;

	err = copy_from_user(&sc, from, sizeof(sc));
	err |= copy_from_user(fpregs, sc.fpstate, sizeof(fpregs));
	if(err)
		return err;

	copy_sc(&regs->regs, &sc);

	err = restore_fp_registers(userspace_pid[0], fpregs);
	if(err < 0) {
	  	printk("copy_sc_from_user_skas - PTRACE_SETFPREGS failed, "
		       "errno = %d\n", -err);
		return err;
	}

	return 0;
}
int put_fp_registers(int pid, unsigned long *regs)
{
	return restore_fp_registers(pid, regs);
}