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; }
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); }
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(®s->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); }