Commit 679fa9c7 authored by Christophe Leroy (CS GROUP)'s avatar Christophe Leroy (CS GROUP) Committed by Madhavan Srinivasan
Browse files

powerpc/ptrace: Convert gpr32_set_common_user() to scoped user access



Commit 861574d5 ("powerpc/uaccess: Implement masked user access")
provides optimised user access by avoiding the cost of access_ok().

Convert gpr32_set_common_user() to scoped user access to benefit
from masked user access.

Scoped user access also make the code simpler.

Also changes label from Efault to efault to avoid checkpatch
complaining about CamelCase.

Signed-off-by: default avatarChristophe Leroy (CS GROUP) <chleroy@kernel.org>
Signed-off-by: default avatarMadhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/2409643daab08b4bc07004c2b88f42085d1ef45a.1773136838.git.chleroy@kernel.org
parent 40a1b9d0
Loading
Loading
Loading
Loading
+31 −33
Original line number Diff line number Diff line
@@ -758,38 +758,37 @@ static int gpr32_set_common_user(struct task_struct *target,
	const void *kbuf = NULL;
	compat_ulong_t reg;

	if (!user_read_access_begin(u, count))
		return -EFAULT;

	scoped_user_read_access_size(ubuf, count, efault) {
		u = ubuf;
		pos /= sizeof(reg);
		count /= sizeof(reg);

		for (; count > 0 && pos < PT_MSR; --count) {
		unsafe_get_user(reg, u++, Efault);
			unsafe_get_user(reg, u++, efault);
			regs[pos++] = reg;
		}

		if (count > 0 && pos == PT_MSR) {
		unsafe_get_user(reg, u++, Efault);
			unsafe_get_user(reg, u++, efault);
			set_user_msr(target, reg);
			++pos;
			--count;
		}

		for (; count > 0 && pos <= PT_MAX_PUT_REG; --count) {
		unsafe_get_user(reg, u++, Efault);
			unsafe_get_user(reg, u++, efault);
			regs[pos++] = reg;
		}
		for (; count > 0 && pos < PT_TRAP; --count, ++pos)
		unsafe_get_user(reg, u++, Efault);
			unsafe_get_user(reg, u++, efault);

		if (count > 0 && pos == PT_TRAP) {
		unsafe_get_user(reg, u++, Efault);
			unsafe_get_user(reg, u++, efault);
			set_user_trap(target, reg);
			++pos;
			--count;
		}
	user_read_access_end();
	}

	ubuf = u;
	pos *= sizeof(reg);
@@ -798,8 +797,7 @@ static int gpr32_set_common_user(struct task_struct *target,
				  (PT_TRAP + 1) * sizeof(reg), -1);
	return 0;

Efault:
	user_read_access_end();
efault:
	return -EFAULT;
}