From nobody Thu Apr 9 07:16:34 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D1D391F0991 for ; Tue, 10 Mar 2026 10:03:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773137026; cv=none; b=o9zRfHvOCSCaODDgqmFTLF2zWX4KGcdob7dKHnwY5VxMvPtYEpgTNK3zFeNRFGbLhIL3TZYfCfgGrCUC6wJ38ksfX7mVhSqdVdH+wthz1yboWHrRngl51mr0qjwEH3PKc5rgBBRzl6a+ALnQh5tm8bkd48pnRzJgiDzXusZLLvM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773137026; c=relaxed/simple; bh=5Jo4rw9rp9F1FaFj6exu2xGJSJZ4VFRZvzDid3Jq5C8=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=YXAVuwX9WYb5cYCV6of2WW5Sz3R7XDSFe3T1YWAEBMa8NYniZnDzYt+ByH4KxF8ESml9sx9li5+1UPtKqleqvqh8VKrCCopjhGjIpHktQ+rSalqph+5naQtD9OPQVDXYCLbLEiG+5g1KKAkV4q4f2d/x38LmjpUwK40xmDSCDYE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GtLReCa3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="GtLReCa3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D9961C2BC9E; Tue, 10 Mar 2026 10:03:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773137026; bh=5Jo4rw9rp9F1FaFj6exu2xGJSJZ4VFRZvzDid3Jq5C8=; h=From:To:Cc:Subject:Date:From; b=GtLReCa3moHvOA00ZRBGgPJtQqbGFKeESZdDI6wZX/bSUzn0HlimvmMyoRzmqDMoJ /MkjUTLOpBGQYUHVUTnZcgaSXyIECabCmust34slWwJj2blJmLrGZckzsCMGuPOpi4 qLfryCrVgsA21jDhdV4mc8LDrcltV+AfvLuA4aYCSM1M+0R1YmRkhqIMTkiNqyMJRB ILvwlvZgpMtud0SClfNedaxfOlHWrw3maAIZiJq9C9klNbz5HU2PJPaaIBKuHr4mUp SHpzYiMgd52atZsbkyAp8Dd1HzWF8cKmVZ35XP36j4kv06g9HIH9Yyd/mlIGqhQ5T3 uAobkQHr63M8A== From: "Christophe Leroy (CS GROUP)" To: Michael Ellerman , Nicholas Piggin , Madhavan Srinivasan Cc: "Christophe Leroy (CS GROUP)" , linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org Subject: [PATCH] powerpc/sstep: Convert to scoped user access Date: Tue, 10 Mar 2026 11:03:41 +0100 Message-ID: <8f2d85bddacff18046096dc255fd94f6a0f8b230.1773137010.git.chleroy@kernel.org> X-Mailer: git-send-email 2.49.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=4625; i=chleroy@kernel.org; h=from:subject:message-id; bh=5Jo4rw9rp9F1FaFj6exu2xGJSJZ4VFRZvzDid3Jq5C8=; b=owGbwMvMwCV2d0KB2p7V54MZT6slMWSuf1PLYiLoMGedcnhEwZWai+dOpduc6f9wzl730Joyo afZm1XjOkpZGMS4GGTFFFmO/+feNaPrS2r+1F36MHNYmUCGMHBxCsBEJp1lZDiTvHrX1Ll3y+T3 bJ3xJNb1Y5/G999Jr20Wc3Y9WXbsbVk2I8OK6knNfYelnBntju9K/rvnw/rSvTrHJh7nvBwiwDZ 5oyInAA== X-Developer-Key: i=chleroy@kernel.org; a=openpgp; fpr=10FFE6F8B390DE17ACC2632368A92FEB01B8DD78 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Commit 861574d51bbd ("powerpc/uaccess: Implement masked user access") provides optimised user access by avoiding the cost of access_ok(). Convert single step emulation functions to scoped user access to benefit from masked user access. Scoped user access also make the code simpler. Signed-off-by: Christophe Leroy (CS GROUP) --- arch/powerpc/lib/sstep.c | 77 +++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 44 deletions(-) diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c index ac3ee19531d8..f0d6aa657c1a 100644 --- a/arch/powerpc/lib/sstep.c +++ b/arch/powerpc/lib/sstep.c @@ -329,20 +329,17 @@ __read_mem_aligned(unsigned long *dest, unsigned long= ea, int nb, struct pt_regs static nokprobe_inline int read_mem_aligned(unsigned long *dest, unsigned long ea, int nb, struct pt_= regs *regs) { - int err; + void __user *uea =3D (void __user *)ea; =20 if (is_kernel_addr(ea)) return __read_mem_aligned(dest, ea, nb, regs); =20 - if (user_read_access_begin((void __user *)ea, nb)) { - err =3D __read_mem_aligned(dest, ea, nb, regs); - user_read_access_end(); - } else { - err =3D -EFAULT; - regs->dar =3D ea; - } + scoped_user_read_access_size(uea, nb, efault) + return __read_mem_aligned(dest, (unsigned long)uea, nb, regs); =20 - return err; +efault: + regs->dar =3D ea; + return -EFAULT; } =20 /* @@ -385,20 +382,17 @@ static __always_inline int __copy_mem_in(u8 *dest, un= signed long ea, int nb, str =20 static nokprobe_inline int copy_mem_in(u8 *dest, unsigned long ea, int nb,= struct pt_regs *regs) { - int err; + void __user *uea =3D (void __user *)ea; =20 if (is_kernel_addr(ea)) return __copy_mem_in(dest, ea, nb, regs); =20 - if (user_read_access_begin((void __user *)ea, nb)) { - err =3D __copy_mem_in(dest, ea, nb, regs); - user_read_access_end(); - } else { - err =3D -EFAULT; - regs->dar =3D ea; - } + scoped_user_read_access_size(uea, nb, efault) + return __copy_mem_in(dest, (unsigned long)uea, nb, regs); =20 - return err; +efault: + regs->dar =3D ea; + return -EFAULT; } =20 static nokprobe_inline int read_mem_unaligned(unsigned long *dest, @@ -465,20 +459,17 @@ __write_mem_aligned(unsigned long val, unsigned long = ea, int nb, struct pt_regs static nokprobe_inline int write_mem_aligned(unsigned long val, unsigned long ea, int nb, struct pt_r= egs *regs) { - int err; + void __user *uea =3D (void __user *)ea; =20 if (is_kernel_addr(ea)) return __write_mem_aligned(val, ea, nb, regs); =20 - if (user_write_access_begin((void __user *)ea, nb)) { - err =3D __write_mem_aligned(val, ea, nb, regs); - user_write_access_end(); - } else { - err =3D -EFAULT; - regs->dar =3D ea; - } + scoped_user_write_access_size(uea, nb, efault) + return __write_mem_aligned(val, (unsigned long)uea, nb, regs); =20 - return err; +efault: + regs->dar =3D ea; + return -EFAULT; } =20 /* @@ -521,20 +512,17 @@ static __always_inline int __copy_mem_out(u8 *dest, u= nsigned long ea, int nb, st =20 static nokprobe_inline int copy_mem_out(u8 *dest, unsigned long ea, int nb= , struct pt_regs *regs) { - int err; + void __user *uea =3D (void __user *)ea; =20 if (is_kernel_addr(ea)) return __copy_mem_out(dest, ea, nb, regs); =20 - if (user_write_access_begin((void __user *)ea, nb)) { - err =3D __copy_mem_out(dest, ea, nb, regs); - user_write_access_end(); - } else { - err =3D -EFAULT; - regs->dar =3D ea; - } + scoped_user_write_access_size(uea, nb, efault) + return __copy_mem_out(dest, (unsigned long)uea, nb, regs); =20 - return err; +efault: + regs->dar =3D ea; + return -EFAULT; } =20 static nokprobe_inline int write_mem_unaligned(unsigned long val, @@ -1065,6 +1053,7 @@ static __always_inline int __emulate_dcbz(unsigned lo= ng ea) =20 int emulate_dcbz(unsigned long ea, struct pt_regs *regs) { + void __user *uea =3D (void __user *)ea; int err; unsigned long size =3D l1_dcache_bytes(); =20 @@ -1073,20 +1062,20 @@ int emulate_dcbz(unsigned long ea, struct pt_regs *= regs) if (!address_ok(regs, ea, size)) return -EFAULT; =20 - if (is_kernel_addr(ea)) { - err =3D __emulate_dcbz(ea); - } else if (user_write_access_begin((void __user *)ea, size)) { + if (is_kernel_addr(ea)) err =3D __emulate_dcbz(ea); - user_write_access_end(); - } else { - err =3D -EFAULT; - } + else + scoped_user_write_access_size(uea, size, efault) + err =3D __emulate_dcbz((unsigned long)uea); =20 if (err) regs->dar =3D ea; =20 - return err; + +efault: + regs->dar =3D ea; + return -EFAULT; } NOKPROBE_SYMBOL(emulate_dcbz); =20 --=20 2.49.0