Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d256eb8d authored by David S. Miller's avatar David S. Miller
Browse files

[SPARC32]: Use regsets in arch_ptrace().

parent 9473272a
Loading
Loading
Loading
Loading
+47 −68
Original line number Original line Diff line number Diff line
@@ -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)
		};
		};
		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)
		};
		};
		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;
	}
	}