From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Thomas Gleixner <tglx@linutronix.de>,
LKML <linux-kernel@vger.kernel.org>
Cc: "kernel test robot" <lkp@intel.com>,
"Russell King" <linux@armlinux.org.uk>,
linux-arm-kernel@lists.infradead.org,
"Linus Torvalds" <torvalds@linux-foundation.org>,
x86@kernel.org, "Madhavan Srinivasan" <maddy@linux.ibm.com>,
"Michael Ellerman" <mpe@ellerman.id.au>,
"Nicholas Piggin" <npiggin@gmail.com>,
"Christophe Leroy" <christophe.leroy@csgroup.eu>,
linuxppc-dev@lists.ozlabs.org, "Paul Walmsley" <pjw@kernel.org>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
linux-riscv@lists.infradead.org,
"Heiko Carstens" <hca@linux.ibm.com>,
"Christian Borntraeger" <borntraeger@linux.ibm.com>,
"Sven Schnelle" <svens@linux.ibm.com>,
linux-s390@vger.kernel.org,
"Andrew Cooper" <andrew.cooper3@citrix.com>,
"Julia Lawall" <Julia.Lawall@inria.fr>,
"Nicolas Palix" <nicolas.palix@imag.fr>,
"Peter Zijlstra" <peterz@infradead.org>,
"Darren Hart" <dvhart@infradead.org>,
"Davidlohr Bueso" <dave@stgolabs.net>,
"André Almeida" <andrealmeid@igalia.com>,
"Alexander Viro" <viro@zeniv.linux.org.uk>,
"Christian Brauner" <brauner@kernel.org>,
"Jan Kara" <jack@suse.cz>,
linux-fsdevel@vger.kernel.org
Subject: Re: [patch V3 01/12] ARM: uaccess: Implement missing __get_user_asm_dword()
Date: Fri, 17 Oct 2025 08:36:50 -0400 [thread overview]
Message-ID: <8669c9f6-74c3-4bd6-833c-1d73158dfc97@efficios.com> (raw)
In-Reply-To: <20251017093029.874834505@linutronix.de>
On 2025-10-17 06:08, Thomas Gleixner wrote:
> When CONFIG_CPU_SPECTRE=n then get_user() is missing the 8 byte ASM variant
> for no real good reason. This prevents using get_user(u64) in generic code.
>
> Implement it as a sequence of two 4-byte reads with LE/BE awareness and
> make the unsigned long (or long long) type for the intermediate variable to
> read into dependend on the the target type.
>
> The __long_type() macro and idea was lifted from PowerPC. Thanks to
> Christophe for pointing it out.
>
> Reported-by: kernel test robot <lkp@intel.com>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Cc: Russell King <linux@armlinux.org.uk>
> Cc: linux-arm-kernel@lists.infradead.org
> Closes: https://lore.kernel.org/oe-kbuild-all/202509120155.pFgwfeUD-lkp@intel.com/
> ---
> V2a: Solve the *ptr issue vs. unsigned long long - Russell/Christophe
> V2: New patch to fix the 0-day fallout
> ---
> arch/arm/include/asm/uaccess.h | 26 +++++++++++++++++++++++++-
> 1 file changed, 25 insertions(+), 1 deletion(-)
>
> --- a/arch/arm/include/asm/uaccess.h
> +++ b/arch/arm/include/asm/uaccess.h
> @@ -283,10 +283,17 @@ extern int __put_user_8(void *, unsigned
> __gu_err; \
> })
>
> +/*
> + * This is a type: either unsigned long, if the argument fits into
> + * that type, or otherwise unsigned long long.
> + */
> +#define __long_type(x) \
> + __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL))
> +
> #define __get_user_err(x, ptr, err, __t) \
> do { \
> unsigned long __gu_addr = (unsigned long)(ptr); \
> - unsigned long __gu_val; \
> + __long_type(x) __gu_val; \
> unsigned int __ua_flags; \
> __chk_user_ptr(ptr); \
> might_fault(); \
> @@ -295,6 +302,7 @@ do { \
> case 1: __get_user_asm_byte(__gu_val, __gu_addr, err, __t); break; \
> case 2: __get_user_asm_half(__gu_val, __gu_addr, err, __t); break; \
> case 4: __get_user_asm_word(__gu_val, __gu_addr, err, __t); break; \
> + case 8: __get_user_asm_dword(__gu_val, __gu_addr, err, __t); break; \
> default: (__gu_val) = __get_user_bad(); \
> } \
> uaccess_restore(__ua_flags); \
> @@ -353,6 +361,22 @@ do { \
> #define __get_user_asm_word(x, addr, err, __t) \
> __get_user_asm(x, addr, err, "ldr" __t)
>
> +#ifdef __ARMEB__
> +#define __WORD0_OFFS 4
> +#define __WORD1_OFFS 0
> +#else
> +#define __WORD0_OFFS 0
> +#define __WORD1_OFFS 4
> +#endif
> +
> +#define __get_user_asm_dword(x, addr, err, __t) \
> + ({ \
> + unsigned long __w0, __w1; \
> + __get_user_asm(__w0, addr + __WORD0_OFFS, err, "ldr" __t); \
> + __get_user_asm(__w1, addr + __WORD1_OFFS, err, "ldr" __t); \
> + (x) = ((u64)__w1 << 32) | (u64) __w0; \
> +})
If we look at __get_user_asm_half, it always loads the lower addresses
first (__gu_addr), and then loads the following address (__gu_addr + 1).
This new code for dword flips the order of word accesses between BE and
LE, which means that on BE we're reading the second word and then moving
back one word.
I'm not sure whether it matters or not, but I'm pointing it out in case
it matters in terms of hardware memory access pattern.
Also we end up with __get_user_asm_{half,dword} that effectively do the
same tricks in very different ways, so it would be good to come up with
a unified pattern.
Thanks,
Mathieu
> +
> #define __put_user_switch(x, ptr, __err, __fn) \
> do { \
> const __typeof__(*(ptr)) __user *__pu_ptr = (ptr); \
>
--
Mathieu Desnoyers
EfficiOS Inc.
https://www.efficios.com
next prev parent reply other threads:[~2025-10-17 12:36 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-17 10:08 [patch V3 00/12] uaccess: Provide and use scopes for user masked access Thomas Gleixner
2025-10-17 10:08 ` [patch V3 01/12] ARM: uaccess: Implement missing __get_user_asm_dword() Thomas Gleixner
2025-10-17 12:36 ` Mathieu Desnoyers [this message]
2025-10-17 10:08 ` [patch V3 02/12] uaccess: Provide ASM GOTO safe wrappers for unsafe_*_user() Thomas Gleixner
2025-10-17 12:43 ` Mathieu Desnoyers
2025-10-17 12:48 ` Mathieu Desnoyers
2025-10-17 10:09 ` [patch V3 03/12] x86/uaccess: Use unsafe wrappers for ASM GOTO Thomas Gleixner
2025-10-17 10:09 ` [patch V3 04/12] powerpc/uaccess: " Thomas Gleixner
2025-10-17 10:09 ` [patch V3 05/12] riscv/uaccess: " Thomas Gleixner
2025-10-17 10:09 ` [patch V3 06/12] s390/uaccess: " Thomas Gleixner
2025-10-17 10:09 ` [patch V3 07/12] uaccess: Provide scoped masked user access regions Thomas Gleixner
2025-10-17 11:08 ` Andrew Cooper
2025-10-17 11:21 ` Thomas Gleixner
2025-10-17 11:29 ` Andrew Cooper
2025-10-17 11:25 ` Peter Zijlstra
2025-10-17 13:23 ` Mathieu Desnoyers
2025-10-20 18:28 ` David Laight
2025-10-21 14:29 ` Thomas Gleixner
2025-10-21 14:42 ` Thomas Gleixner
2025-10-21 20:52 ` David Laight
2025-10-21 14:44 ` Peter Zijlstra
2025-10-21 15:06 ` Linus Torvalds
2025-10-21 15:45 ` Thomas Gleixner
2025-10-21 15:51 ` Linus Torvalds
2025-10-21 18:55 ` David Laight
2025-10-17 10:09 ` [patch V3 08/12] uaccess: Provide put/get_user_masked() Thomas Gleixner
2025-10-17 13:41 ` Mathieu Desnoyers
2025-10-17 13:45 ` Mathieu Desnoyers
2025-10-20 6:50 ` Thomas Gleixner
2025-10-17 10:09 ` [patch V3 09/12] [RFC] coccinelle: misc: Add scoped_masked_$MODE_access() checker script Thomas Gleixner
2025-10-17 10:51 ` Julia Lawall
2025-10-17 10:09 ` [patch V3 10/12] futex: Convert to scoped masked user access Thomas Gleixner
2025-10-17 10:09 ` [patch V3 11/12] x86/futex: " Thomas Gleixner
2025-10-17 13:37 ` Andrew Cooper
2025-10-17 10:09 ` [patch V3 12/12] select: " Thomas Gleixner
2025-10-17 10:35 ` Peter Zijlstra
2025-10-17 11:12 ` Thomas Gleixner
2025-10-17 10:37 ` [patch V3 00/12] uaccess: Provide and use scopes for user masked access Peter Zijlstra
2025-10-17 10:50 ` Andrew Cooper
2025-10-17 12:25 ` Mathieu Desnoyers
2025-12-19 8:10 ` patchwork-bot+linux-riscv
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8669c9f6-74c3-4bd6-833c-1d73158dfc97@efficios.com \
--to=mathieu.desnoyers@efficios.com \
--cc=Julia.Lawall@inria.fr \
--cc=andrealmeid@igalia.com \
--cc=andrew.cooper3@citrix.com \
--cc=borntraeger@linux.ibm.com \
--cc=brauner@kernel.org \
--cc=christophe.leroy@csgroup.eu \
--cc=dave@stgolabs.net \
--cc=dvhart@infradead.org \
--cc=hca@linux.ibm.com \
--cc=jack@suse.cz \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=linux-s390@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=lkp@intel.com \
--cc=maddy@linux.ibm.com \
--cc=mpe@ellerman.id.au \
--cc=nicolas.palix@imag.fr \
--cc=npiggin@gmail.com \
--cc=palmer@dabbelt.com \
--cc=peterz@infradead.org \
--cc=pjw@kernel.org \
--cc=svens@linux.ibm.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome