Commit 98a7fbf3 authored by Al Viro's avatar Al Viro

sparc32: get rid of odd callers of copy_regset_from_user()

[a couple of unused variables left behind by the previous version
spotted by kernel test robot <lkp@intel.com>]
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 8f032921
...@@ -137,19 +137,18 @@ static int genregs32_set(struct task_struct *target, ...@@ -137,19 +137,18 @@ static int genregs32_set(struct task_struct *target,
if (ret || !count) if (ret || !count)
return ret; return ret;
if (pos < 32 * sizeof(u32)) { if (regwindow32_get(target, regs, uregs))
if (regwindow32_get(target, regs, uregs)) return -EFAULT;
return -EFAULT; ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, uregs,
uregs, 16 * sizeof(u32), 32 * sizeof(u32));
16 * sizeof(u32), 32 * sizeof(u32)); if (ret)
if (ret) return ret;
return ret; if (regwindow32_set(target, regs, uregs))
if (regwindow32_set(target, regs, uregs)) return -EFAULT;
return -EFAULT; if (!count)
if (!count) return 0;
return 0;
}
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
&psr, &psr,
32 * sizeof(u32), 33 * sizeof(u32)); 32 * sizeof(u32), 33 * sizeof(u32));
...@@ -241,13 +240,11 @@ static int fpregs32_set(struct task_struct *target, ...@@ -241,13 +240,11 @@ static int fpregs32_set(struct task_struct *target,
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
32 * sizeof(u32), 32 * sizeof(u32),
33 * sizeof(u32)); 33 * sizeof(u32));
if (!ret && count > 0) { if (!ret)
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
&target->thread.fsr, &target->thread.fsr,
33 * sizeof(u32), 33 * sizeof(u32),
34 * sizeof(u32)); 34 * sizeof(u32));
}
if (!ret) if (!ret)
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
34 * sizeof(u32), -1); 34 * sizeof(u32), -1);
...@@ -313,6 +310,33 @@ static int getregs_get(struct task_struct *target, ...@@ -313,6 +310,33 @@ static int getregs_get(struct task_struct *target,
4 * sizeof(u32), 19 * sizeof(u32)); 4 * sizeof(u32), 19 * sizeof(u32));
} }
static int setregs_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 = target->thread.kregs;
u32 v[4];
int ret;
if (target == current)
flush_user_windows();
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
v,
0, 4 * sizeof(u32));
if (ret)
return ret;
regs->psr = (regs->psr & ~(PSR_ICC | PSR_SYSCALL)) |
(v[0] & (PSR_ICC | PSR_SYSCALL));
regs->pc = v[1];
regs->npc = v[2];
regs->y = v[3];
return user_regset_copyin(&pos, &count, &kbuf, &ubuf,
regs->u_regs + 1,
4 * sizeof(u32) , 19 * sizeof(u32));
}
static int getfpregs_get(struct task_struct *target, static int getfpregs_get(struct task_struct *target,
const struct user_regset *regset, const struct user_regset *regset,
unsigned int pos, unsigned int count, unsigned int pos, unsigned int count,
...@@ -340,12 +364,37 @@ static int getfpregs_get(struct task_struct *target, ...@@ -340,12 +364,37 @@ static int getfpregs_get(struct task_struct *target,
33 * sizeof(u32), 68 * sizeof(u32)); 33 * sizeof(u32), 68 * sizeof(u32));
} }
static int setfpregs_set(struct task_struct *target,
const struct user_regset *regset,
unsigned int pos, unsigned int count,
const void *kbuf, const void __user *ubuf)
{
unsigned long *fpregs = target->thread.float_regs;
int ret;
#if 0
if (target == current)
save_and_clear_fpu();
#endif
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
fpregs,
0, 32 * sizeof(u32));
if (ret)
return ret;
return user_regset_copyin(&pos, &count, &kbuf, &ubuf,
&target->thread.fsr,
32 * sizeof(u32),
33 * sizeof(u32));
}
static const struct user_regset ptrace32_regsets[] = { static const struct user_regset ptrace32_regsets[] = {
[REGSET_GENERAL] = { [REGSET_GENERAL] = {
.n = 19, .size = sizeof(u32), .get = getregs_get, .n = 19, .size = sizeof(u32),
.get = getregs_get, .set = setregs_set,
}, },
[REGSET_FP] = { [REGSET_FP] = {
.n = 68, .size = sizeof(u32), .get = getfpregs_get, .n = 68, .size = sizeof(u32),
.get = getfpregs_get, .set = setfpregs_set,
}, },
}; };
...@@ -380,12 +429,10 @@ long arch_ptrace(struct task_struct *child, long request, ...@@ -380,12 +429,10 @@ long arch_ptrace(struct task_struct *child, long request,
{ {
unsigned long addr2 = current->thread.kregs->u_regs[UREG_I4]; unsigned long addr2 = current->thread.kregs->u_regs[UREG_I4];
void __user *addr2p; void __user *addr2p;
const struct user_regset_view *view;
struct pt_regs __user *pregs; struct pt_regs __user *pregs;
struct fps __user *fps; struct fps __user *fps;
int ret; int ret;
view = task_user_regset_view(current);
addr2p = (void __user *) addr2; addr2p = (void __user *) addr2;
pregs = (struct pt_regs __user *) addr; pregs = (struct pt_regs __user *) addr;
fps = (struct fps __user *) addr; fps = (struct fps __user *) addr;
...@@ -400,15 +447,10 @@ long arch_ptrace(struct task_struct *child, long request, ...@@ -400,15 +447,10 @@ long arch_ptrace(struct task_struct *child, long request,
} }
case PTRACE_SETREGS: { case PTRACE_SETREGS: {
ret = copy_regset_from_user(child, view, REGSET_GENERAL, ret = copy_regset_from_user(child, &ptrace32_view,
32 * sizeof(u32), REGSET_GENERAL, 0,
4 * sizeof(u32), 19 * sizeof(u32),
&pregs->psr); pregs);
if (!ret)
copy_regset_from_user(child, view, REGSET_GENERAL,
1 * sizeof(u32),
15 * sizeof(u32),
&pregs->u_regs[0]);
break; break;
} }
...@@ -421,15 +463,10 @@ long arch_ptrace(struct task_struct *child, long request, ...@@ -421,15 +463,10 @@ long arch_ptrace(struct task_struct *child, long request,
} }
case PTRACE_SETFPREGS: { case PTRACE_SETFPREGS: {
ret = copy_regset_from_user(child, view, REGSET_FP, ret = copy_regset_from_user(child, &ptrace32_view,
0 * sizeof(u32), REGSET_FP, 0,
32 * sizeof(u32), 33 * sizeof(u32),
&fps->regs[0]); fps);
if (!ret)
ret = copy_regset_from_user(child, view, REGSET_FP,
33 * sizeof(u32),
1 * sizeof(u32),
&fps->fsr);
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment