From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) (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 0BD402586EA; Tue, 17 Jun 2025 22:51:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=216.40.44.13 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750200679; cv=none; b=U0WHXmKbHeB1ofvuTE6Ab9BEm9H0j5YpQGmpMAXl6b35YwdzvotsT6SCMy3WcK9qUROLbbdXVjH4pYzwhal3olQbgE+LanZCbMyLCxDkarHw/l+HhRaN8F5TgtLbS/W44TyDRzNy33QsIMlfZ1S2wcLrSKPWG62RSjq4m2oaMxI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750200679; c=relaxed/simple; bh=ckTATXCHrvGOC+WZsqQof/3QKuBCz763BBzol3sDKjI=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=dl2VvDAEInepNCjG7xHMxOFYinm8b2qBSB4ZR6mz7pNaZx8Se5d0xwtdUHoVQJQpmKtI89+Gx28U/51I7/gyOuKMr/Cb5mzccI3WDvzUmhu9s6oWfgl4LkJBBPpjDDdZkemDUovbr8F2uFw+NW2e703aFN05JfMbX9D4lsyJFaU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=goodmis.org; spf=pass smtp.mailfrom=goodmis.org; arc=none smtp.client-ip=216.40.44.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=goodmis.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=goodmis.org Received: from omf06.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id CDEC2101690; Tue, 17 Jun 2025 22:51:13 +0000 (UTC) Received: from [HIDDEN] (Authenticated sender: nevets@goodmis.org) by omf06.hostedemail.com (Postfix) with ESMTPA id D1A052000E; Tue, 17 Jun 2025 22:51:10 +0000 (UTC) Received: from rostedt by gandalf with local (Exim 4.98.2) (envelope-from ) id 1uRf9B-00000002L4R-2mju; Tue, 17 Jun 2025 18:51:17 -0400 Message-ID: <20250617225117.521934161@goodmis.org> User-Agent: quilt/0.68 Date: Tue, 17 Jun 2025 18:50:12 -0400 From: Steven Rostedt To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org Cc: Masami Hiramatsu , Mathieu Desnoyers , Josh Poimboeuf , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Jens Remus , Linus Torvalds , Andrew Morton Subject: [PATCH v6 03/12] x86/uaccess: Add unsafe_copy_from_user() implementation References: <20250617225009.233007152@goodmis.org> Precedence: bulk X-Mailing-List: linux-trace-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-Stat-Signature: c4u68qseupyka3awfrbwrehr3ftdr9ui X-Rspamd-Server: rspamout04 X-Rspamd-Queue-Id: D1A052000E X-Session-Marker: 6E657665747340676F6F646D69732E6F7267 X-Session-ID: U2FsdGVkX1/oAxhXICj0gAqryk3TcBTfIAKkyNiZuKc= X-HE-Tag: 1750200670-20429 X-HE-Meta: U2FsdGVkX1+MfqoTmdWkSaZ4HpmgLvP6mzrILsx+bzwlspqLeyZvb8XeWKtfGTRS5UgjIYU4I2NHVzG7JVwkDKi+L3vZL2/0RYTx8OzA4y0zE9cKUk7yhtH8fGN5ybhyU7ZVXZ73qrCVCQuTcGajdMnIxK7treZmSVGqKhm08+4Pn7qhZyQNO0S1z4UdoIGvMvdKuLuQw7/IWJo25PBAEvukG8s30FrZVLfXKvrsWeEGm0M3N64twou6YQZ1GSA8CsKlbCekCzBT94CoRUe2cRaJ2wrbBZy+9VDPtjkCI2b7Tkb1AYyGQx54q0/4oaUO4CsdcddOFZUsZuuySrVGCddYc33Lgnwu25FkeX3L/8K0rDD9I7RnasU0lGuyiraNfQm7pADuW2tjCWL/IrJGH9RaQDIZeXOb4rQ0LyKkWvI= From: Josh Poimboeuf Add an x86 implementation of unsafe_copy_from_user() similar to the existing unsafe_copy_to_user(). Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) --- arch/x86/include/asm/uaccess.h | 39 +++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h index 3a7755c1a441..3caf02d0503e 100644 --- a/arch/x86/include/asm/uaccess.h +++ b/arch/x86/include/asm/uaccess.h @@ -599,7 +599,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_copy_to_user_loop(dst, src, len, type, label) \ while (len >= sizeof(type)) { \ unsafe_put_user(*(type *)(src),(type __user *)(dst),label); \ dst += sizeof(type); \ @@ -607,15 +607,34 @@ _label: \ len -= sizeof(type); \ } -#define unsafe_copy_to_user(_dst,_src,_len,label) \ -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); \ +#define unsafe_copy_to_user(_dst, _src, _len, label) \ +do { \ + void __user *__dst = (_dst); \ + const void *__src = (_src); \ + size_t __len = (_len); \ + unsafe_copy_to_user_loop(__dst, __src, __len, u64, label); \ + unsafe_copy_to_user_loop(__dst, __src, __len, u32, label); \ + unsafe_copy_to_user_loop(__dst, __src, __len, u16, label); \ + unsafe_copy_to_user_loop(__dst, __src, __len, u8, label); \ +} while (0) + +#define unsafe_copy_from_user_loop(dst, src, len, type, label) \ + while (len >= sizeof(type)) { \ + unsafe_get_user(*(type *)(dst), (type __user *)(src), label); \ + dst += sizeof(type); \ + src += sizeof(type); \ + len -= sizeof(type); \ + } + +#define unsafe_copy_from_user(_dst, _src, _len, label) \ +do { \ + void *__dst = (_dst); \ + void __user *__src = (_src); \ + size_t __len = (_len); \ + unsafe_copy_from_user_loop(__dst, __src, __len, u64, label); \ + unsafe_copy_from_user_loop(__dst, __src, __len, u32, label); \ + unsafe_copy_from_user_loop(__dst, __src, __len, u16, label); \ + unsafe_copy_from_user_loop(__dst, __src, __len, u8, label); \ } while (0) #ifdef CONFIG_CC_HAS_ASM_GOTO_OUTPUT -- 2.47.2