Re: [RFC PATCH v1 7/9] x86: Add unsafe_copy_from_user()
Usama Arif <[email protected]> Wed, 29 Apr 2026 03:25:19 -0700
| Newsgroups | org.kernel.vger.linux-x25,dev.linux.lists.linux-staging,dev.linux.lists.loongarch,dev.linux.lists.ocfs2-devel,org.freedesktop.lists.amd-gfx,org.freedesktop.lists.dri-devel,org.freedesktop.lists.intel-gfx,org.infradead.lists.linux-riscv,org.infradead.lists.linux-snps-arc,org.infradead.lists.linux-um,org.kernel.vger.bpf,org.kernel.vger.dmaengine,org.kernel.vger.kvm,org.kernel.vger.linux-alpha,org.kernel.vger.linux-arch,org.kernel.vger.linux-csky,org.kernel.vger.linux-efi,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-hexagon,org.kernel.vger.linux-kernel,org.kernel.vger.linux-m68k,org.kernel.vger.linux-media,org.kernel.vger.linux-mips,org.kernel.vger.linux-openrisc,org.kernel.vger.linux-parisc,org.kernel.vger.linux-s390,org.kernel.vger.linux-serial,org.kernel.vger.linux-sh,org.kernel.vger.linux-sound,org.kernel.vger.linux-spi,org.kernel.vger.linux-usb,org.kernel.vger.linux-wireless,org.kernel.vger.linux-wpan,org.kernel.vger.netdev,org.kernel.vger.rust-for-linux,org.kernel.vger.sparclinux,org.kvack.linux-mm,org.ozlabs.lists.linuxppc-dev,org.xenproject.lists.xen-devel |
|---|---|
| Message-ID | <[email protected]> |
On Mon, 27 Apr 2026 19:13:48 +0200 "Christophe Leroy (CS GROUP)" <[email protected]> wrote: > At the time being, x86 and arm64 are missing unsafe_copy_from_user(). > > Add it. > > Signed-off-by: Christophe Leroy (CS GROUP) <[email protected]> > --- > arch/x86/include/asm/uaccess.h | 29 ++++++++++++++++++++++++----- > 1 file changed, 24 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h > index 3a0dd3c2b233..10c458ffa399 100644 > --- a/arch/x86/include/asm/uaccess.h > +++ b/arch/x86/include/asm/uaccess.h > @@ -598,7 +598,7 @@ _label: \ > * We want the unsafe accessors to always be inlined and use > * the error labels - thus the macro games. > */ > -#define unsafe_copy_loop(dst, src, len, type, label) \ > +#define unsafe_put_loop(dst, src, len, type, label) \ > while (len >= sizeof(type)) { \ > unsafe_put_user(*(type *)(src),(type __user *)(dst),label); \ > dst += sizeof(type); \ > @@ -611,10 +611,29 @@ do { \ > char __user *__ucu_dst = (_dst); \ > const char *__ucu_src = (_src); \ > size_t __ucu_len = (_len); \ > - unsafe_copy_loop(__ucu_dst, __ucu_src, __ucu_len, u64, label); \ > - unsafe_copy_loop(__ucu_dst, __ucu_src, __ucu_len, u32, label); \ > - unsafe_copy_loop(__ucu_dst, __ucu_src, __ucu_len, u16, label); \ > - unsafe_copy_loop(__ucu_dst, __ucu_src, __ucu_len, u8, label); \ > + unsafe_put_loop(__ucu_dst, __ucu_src, __ucu_len, u64, label); \ > + unsafe_put_loop(__ucu_dst, __ucu_src, __ucu_len, u32, label); \ > + unsafe_put_loop(__ucu_dst, __ucu_src, __ucu_len, u16, label); \ > + unsafe_put_loop(__ucu_dst, __ucu_src, __ucu_len, u8, label); \ > +} while (0) > + > +#define unsafe_get_loop(dst, src, len, type, label) \ > + while (len >= sizeof(type)) { \ > + unsafe_get_user(*(type __user *)(src),(type *)(dst),label); \ Hi, Just wanted to check if src and dst need to be swapped? Same for arm64 patch. > + dst += sizeof(type); \ > + src += sizeof(type); \ > + len -= sizeof(type); \ > + } > + > +#define unsafe_copy_from_user(_dst,_src,_len,label) \ > +do { \ > + char *__ucu_dst = (_dst); \ > + const char __user *__ucu_src = (_src); \ > + size_t __ucu_len = (_len); \ > + unsafe_get_loop(__ucu_dst, __ucu_src, __ucu_len, u64, label); \ > + unsafe_get_loop(__ucu_dst, __ucu_src, __ucu_len, u32, label); \ > + unsafe_get_loop(__ucu_dst, __ucu_src, __ucu_len, u16, label); \ > + unsafe_get_loop(__ucu_dst, __ucu_src, __ucu_len, u8, label); \ > } while (0) > > #ifdef CONFIG_CC_HAS_ASM_GOTO_OUTPUT > -- > 2.49.0 > >