提交 d256eb8d 编写于 作者: D David S. Miller

[SPARC32]: Use regsets in arch_ptrace().

Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 9473272a
...@@ -322,54 +322,39 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task) ...@@ -322,54 +322,39 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task)
long arch_ptrace(struct task_struct *child, long request, long addr, long data) long arch_ptrace(struct task_struct *child, long request, long addr, long data)
{ {
unsigned long addr2 = current->thread.kregs->u_regs[UREG_I4]; unsigned long addr2 = current->thread.kregs->u_regs[UREG_I4];
int i, ret; const struct user_regset_view *view;
int ret;
view = task_user_regset_view(child);
switch(request) { switch(request) {
case PTRACE_GETREGS: { case PTRACE_GETREGS: {
struct pt_regs __user *pregs = (struct pt_regs __user *) addr; struct pt_regs __user *pregs = (struct pt_regs __user *) addr;
struct pt_regs *cregs = child->thread.kregs;
ret = -EFAULT;
if (!access_ok(VERIFY_WRITE, pregs, sizeof(struct pt_regs)))
break;
__put_user(cregs->psr, (&pregs->psr)); ret = copy_regset_to_user(child, view, REGSET_GENERAL,
__put_user(cregs->pc, (&pregs->pc)); 32 * sizeof(u32),
__put_user(cregs->npc, (&pregs->npc)); 4 * sizeof(u32),
__put_user(cregs->y, (&pregs->y)); &pregs->psr);
for (i = 1; i < 16; i++) if (!ret)
__put_user(cregs->u_regs[i], &pregs->u_regs[i - 1]); copy_regset_to_user(child, view, REGSET_GENERAL,
ret = 0; 1 * sizeof(u32),
15 * sizeof(u32),
&pregs->u_regs[0]);
break; break;
} }
case PTRACE_SETREGS: { case PTRACE_SETREGS: {
struct pt_regs __user *pregs = (struct pt_regs __user *) addr; struct pt_regs __user *pregs = (struct pt_regs __user *) addr;
struct pt_regs *cregs = child->thread.kregs;
unsigned long psr, pc, npc, y;
/* Must be careful, tracing process can only set certain ret = copy_regset_from_user(child, view, REGSET_GENERAL,
* bits in the psr. 32 * sizeof(u32),
*/ 4 * sizeof(u32),
ret = -EFAULT; &pregs->psr);
if (!access_ok(VERIFY_READ, pregs, sizeof(struct pt_regs))) if (!ret)
break; copy_regset_from_user(child, view, REGSET_GENERAL,
1 * sizeof(u32),
__get_user(psr, (&pregs->psr)); 15 * sizeof(u32),
__get_user(pc, (&pregs->pc)); &pregs->u_regs[0]);
__get_user(npc, (&pregs->npc));
__get_user(y, (&pregs->y));
psr &= PSR_ICC;
cregs->psr &= ~PSR_ICC;
cregs->psr |= psr;
if (!((pc | npc) & 3)) {
cregs->pc = pc;
cregs->npc =npc;
}
cregs->y = y;
for (i = 1; i < 16; i++)
__get_user(cregs->u_regs[i], &pregs->u_regs[i-1]);
ret = 0;
break; break;
} }
...@@ -387,23 +372,23 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) ...@@ -387,23 +372,23 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
}; };
struct fps __user *fps = (struct fps __user *) addr; struct fps __user *fps = (struct fps __user *) addr;
ret = -EFAULT; ret = copy_regset_to_user(child, view, REGSET_FP,
if (!access_ok(VERIFY_WRITE, fps, sizeof(struct fps))) 0 * sizeof(u32),
break; 32 * sizeof(u32),
&fps->regs[0]);
if (!ret)
ret = copy_regset_to_user(child, view, REGSET_FP,
33 * sizeof(u32),
1 * sizeof(u32),
&fps->fsr);
for (i = 0; i < 32; i++) if (!ret) {
__put_user(child->thread.float_regs[i], &fps->regs[i]); if (__put_user(0, &fps->fpqd) ||
__put_user(child->thread.fsr, (&fps->fsr)); __put_user(0, &fps->flags) ||
__put_user(child->thread.fpqdepth, (&fps->fpqd)); __put_user(0, &fps->extra) ||
__put_user(0, (&fps->flags)); clear_user(fps->fpq, sizeof(fps->fpq)))
__put_user(0, (&fps->extra)); ret = -EFAULT;
for (i = 0; i < 16; i++) {
__put_user(child->thread.fpqueue[i].insn_addr,
(&fps->fpq[i].insnaddr));
__put_user(child->thread.fpqueue[i].insn,
&fps->fpq[i].insn);
} }
ret = 0;
break; break;
} }
...@@ -421,21 +406,15 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) ...@@ -421,21 +406,15 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
}; };
struct fps __user *fps = (struct fps __user *) addr; struct fps __user *fps = (struct fps __user *) addr;
ret = -EFAULT; ret = copy_regset_from_user(child, view, REGSET_FP,
if (!access_ok(VERIFY_READ, fps, sizeof(struct fps))) 0 * sizeof(u32),
break; 32 * sizeof(u32),
&fps->regs[0]);
copy_from_user(&child->thread.float_regs[0], &fps->regs[0], if (!ret)
(32 * sizeof(unsigned long))); ret = copy_regset_from_user(child, view, REGSET_FP,
__get_user(child->thread.fsr, (&fps->fsr)); 33 * sizeof(u32),
__get_user(child->thread.fpqdepth, (&fps->fpqd)); 1 * sizeof(u32),
for (i = 0; i < 16; i++) { &fps->fsr);
__get_user(child->thread.fpqueue[i].insn_addr,
(&fps->fpq[i].insnaddr));
__get_user(child->thread.fpqueue[i].insn,
&fps->fpq[i].insn);
}
ret = 0;
break; break;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册