All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: torvalds@linux-foundation.org, tglx@linutronix.de, hpa@zytor.com,
	julien.thierry@arm.com, will.deacon@arm.com, luto@amacapital.net,
	mingo@kernel.org, catalin.marinas@arm.com, james.morse@arm.com,
	valentin.schneider@arm.com, brgerst@gmail.com,
	jpoimboe@redhat.com, luto@kernel.org, bp@alien8.de,
	dvlasenk@redhat.com
Cc: linux-kernel@vger.kernel.org, peterz@infradead.org,
	dvyukov@google.com, rostedt@goodmis.org
Subject: [PATCH 03/20] x86/uaccess: Move copy_user_handle_tail into asm
Date: Thu, 07 Mar 2019 12:45:14 +0100	[thread overview]
Message-ID: <20190307115159.349746915@infradead.org> (raw)
In-Reply-To: 20190307114511.870090179@infradead.org

By writing the function in asm we avoid cross object code flow and
objtool no longer gets confused about a 'stray' CLAC.

Also; the asm version is actually _simpler_.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/x86/include/asm/asm.h        |   24 -------------------
 arch/x86/include/asm/uaccess_64.h |    3 --
 arch/x86/lib/copy_user_64.S       |   48 ++++++++++++++++++++++++++++++++++++++
 arch/x86/lib/usercopy_64.c        |   20 ---------------
 4 files changed, 48 insertions(+), 47 deletions(-)

--- a/arch/x86/include/asm/asm.h
+++ b/arch/x86/include/asm/asm.h
@@ -148,30 +148,6 @@
 	_ASM_PTR (entry);					\
 	.popsection
 
-.macro ALIGN_DESTINATION
-	/* check for bad alignment of destination */
-	movl %edi,%ecx
-	andl $7,%ecx
-	jz 102f				/* already aligned */
-	subl $8,%ecx
-	negl %ecx
-	subl %ecx,%edx
-100:	movb (%rsi),%al
-101:	movb %al,(%rdi)
-	incq %rsi
-	incq %rdi
-	decl %ecx
-	jnz 100b
-102:
-	.section .fixup,"ax"
-103:	addl %ecx,%edx			/* ecx is zerorest also */
-	jmp copy_user_handle_tail
-	.previous
-
-	_ASM_EXTABLE_UA(100b, 103b)
-	_ASM_EXTABLE_UA(101b, 103b)
-	.endm
-
 #else
 # define _EXPAND_EXTABLE_HANDLE(x) #x
 # define _ASM_EXTABLE_HANDLE(from, to, handler)			\
--- a/arch/x86/include/asm/uaccess_64.h
+++ b/arch/x86/include/asm/uaccess_64.h
@@ -208,9 +208,6 @@ __copy_from_user_flushcache(void *dst, c
 }
 
 unsigned long
-copy_user_handle_tail(char *to, char *from, unsigned len);
-
-unsigned long
 mcsafe_handle_tail(char *to, char *from, unsigned len);
 
 #endif /* _ASM_X86_UACCESS_64_H */
--- a/arch/x86/lib/copy_user_64.S
+++ b/arch/x86/lib/copy_user_64.S
@@ -16,6 +16,30 @@
 #include <asm/smap.h>
 #include <asm/export.h>
 
+.macro ALIGN_DESTINATION
+	/* check for bad alignment of destination */
+	movl %edi,%ecx
+	andl $7,%ecx
+	jz 102f				/* already aligned */
+	subl $8,%ecx
+	negl %ecx
+	subl %ecx,%edx
+100:	movb (%rsi),%al
+101:	movb %al,(%rdi)
+	incq %rsi
+	incq %rdi
+	decl %ecx
+	jnz 100b
+102:
+	.section .fixup,"ax"
+103:	addl %ecx,%edx			/* ecx is zerorest also */
+	jmp copy_user_handle_tail
+	.previous
+
+	_ASM_EXTABLE_UA(100b, 103b)
+	_ASM_EXTABLE_UA(101b, 103b)
+	.endm
+
 /*
  * copy_user_generic_unrolled - memory copy with exception handling.
  * This version is for CPUs like P4 that don't have efficient micro
@@ -194,6 +218,30 @@ ENDPROC(copy_user_enhanced_fast_string)
 EXPORT_SYMBOL(copy_user_enhanced_fast_string)
 
 /*
+ * Try to copy last bytes and clear the rest if needed.
+ * Since protection fault in copy_from/to_user is not a normal situation,
+ * it is not necessary to optimize tail handling.
+ *
+ * Input:
+ * rdi destination
+ * rsi source
+ * rdx count
+ *
+ * Output:
+ * eax uncopied bytes or 0 if successful.
+ */
+ALIGN;
+copy_user_handle_tail:
+	movl %edx,%ecx
+1:	rep movsb
+2:	mov %ecx,%eax
+	ASM_CLAC
+	ret
+
+	_ASM_EXTABLE_UA(1b, 2b)
+ENDPROC(copy_user_handle_tail)
+
+/*
  * copy_user_nocache - Uncached memory copy with exception handling
  * This will force destination out of cache for more performance.
  *
--- a/arch/x86/lib/usercopy_64.c
+++ b/arch/x86/lib/usercopy_64.c
@@ -55,26 +55,6 @@ unsigned long clear_user(void __user *to
 EXPORT_SYMBOL(clear_user);
 
 /*
- * Try to copy last bytes and clear the rest if needed.
- * Since protection fault in copy_from/to_user is not a normal situation,
- * it is not necessary to optimize tail handling.
- */
-__visible unsigned long
-copy_user_handle_tail(char *to, char *from, unsigned len)
-{
-	for (; len; --len, to++) {
-		char c;
-
-		if (__get_user_nocheck(c, from++, sizeof(char)))
-			break;
-		if (__put_user_nocheck(c, to, sizeof(char)))
-			break;
-	}
-	clac();
-	return len;
-}
-
-/*
  * Similar to copy_user_handle_tail, probe for the write fault point,
  * but reuse __memcpy_mcsafe in case a new read error is encountered.
  * clac() is handled in _copy_to_iter_mcsafe().



  parent reply	other threads:[~2019-03-07 11:54 UTC|newest]

Thread overview: 100+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-07 11:45 [PATCH 00/20] objtool: UACCESS validation v3 Peter Zijlstra
2019-03-07 11:45 ` [PATCH 01/20] x86/ia32: Fix ia32_restore_sigcontext AC leak Peter Zijlstra
2019-03-07 11:45 ` [PATCH 02/20] i915,uaccess: Fix redundant CLAC Peter Zijlstra
2019-03-07 11:45 ` Peter Zijlstra [this message]
2019-03-08 18:53   ` [PATCH 03/20] x86/uaccess: Move copy_user_handle_tail into asm Josh Poimboeuf
2019-03-08 19:48     ` Peter Zijlstra
2019-03-08 19:53       ` Josh Poimboeuf
2019-03-10 13:22         ` Peter Zijlstra
2019-03-07 11:45 ` [PATCH 04/20] x86/uaccess: Fix up the fixup Peter Zijlstra
2019-03-07 11:45 ` [PATCH 05/20] x86/uaccess/xen: Suppress SMAP warnings Peter Zijlstra
2019-03-07 12:22   ` Juergen Gross
2019-03-07 12:32     ` Peter Zijlstra
2019-03-07 12:36       ` Juergen Gross
2019-03-08 19:00   ` Josh Poimboeuf
2019-03-08 19:03     ` Josh Poimboeuf
2019-03-10 13:19       ` Peter Zijlstra
2019-03-11 17:59         ` Josh Poimboeuf
2019-03-08 19:50     ` Peter Zijlstra
2019-03-07 11:45 ` [PATCH 06/20] x86/uaccess: Always inline user_access_begin() Peter Zijlstra
2019-03-07 11:45 ` [PATCH 07/20] x86/uaccess: Always inline force_valid_ss() Peter Zijlstra
2019-03-07 13:50   ` Peter Zijlstra
2019-03-07 18:05   ` Andy Lutomirski
2019-03-07 18:59     ` Peter Zijlstra
2019-03-07 19:06       ` Andy Lutomirski
2019-03-07 11:45 ` [PATCH 08/20] x86/uaccess: Introduce user_access_{save,restore}() Peter Zijlstra
2019-03-07 11:45 ` [PATCH 09/20] x86/uaccess,kasan: Fix KASAN vs SMAP Peter Zijlstra
2019-03-07 11:45 ` [PATCH 10/20] x86/uaccess,ubsan: Fix UBSAN " Peter Zijlstra
2019-03-07 11:45 ` [PATCH 11/20] x86/uaccess,ftrace: Fix ftrace_likely_update() " Peter Zijlstra
2019-03-07 11:45 ` [PATCH 12/20] objtool: Set insn->func for alternatives Peter Zijlstra
2019-03-08 19:16   ` Josh Poimboeuf
2019-03-08 19:51     ` Peter Zijlstra
2019-03-07 11:45 ` [PATCH 13/20] objtool: Hande function aliases Peter Zijlstra
2019-03-08 19:23   ` Josh Poimboeuf
2019-03-08 19:52     ` Peter Zijlstra
2019-03-08 20:00       ` Josh Poimboeuf
2019-03-07 11:45 ` [PATCH 14/20] objtool: Rewrite add_ignores() Peter Zijlstra
2019-03-08 19:29   ` Josh Poimboeuf
2019-03-07 11:45 ` [PATCH 15/20] objtool: Add --backtrace support Peter Zijlstra
2019-03-08 19:33   ` Josh Poimboeuf
2019-03-07 11:45 ` [PATCH 16/20] objtool: Rewrite alt->skip_orig Peter Zijlstra
2019-03-08 20:15   ` Josh Poimboeuf
2019-03-08 21:34     ` Peter Zijlstra
2019-03-08 22:27       ` Josh Poimboeuf
2019-03-07 11:45 ` [PATCH 17/20] objtool: Fix sibling call detection Peter Zijlstra
2019-03-08 20:22   ` Josh Poimboeuf
2019-03-07 11:45 ` [PATCH 18/20] objtool: Add UACCESS validation Peter Zijlstra
2019-03-07 16:33   ` Linus Torvalds
2019-03-07 17:10     ` hpa
2019-03-07 17:41     ` Peter Zijlstra
2019-03-07 17:54       ` Linus Torvalds
2019-03-07 18:48         ` Peter Zijlstra
2019-03-07 18:51           ` hpa
2019-03-07 19:03           ` Peter Zijlstra
2019-03-08 15:01             ` Josh Poimboeuf
2019-03-08 15:07               ` Peter Zijlstra
2019-03-07 20:23           ` Peter Zijlstra
2019-03-07 20:40             ` Peter Zijlstra
2019-03-08 15:07               ` Josh Poimboeuf
2019-03-08 15:23                 ` Peter Zijlstra
2019-03-07 20:15       ` Andrey Ryabinin
2019-03-07 20:33         ` Peter Zijlstra
2019-03-07 20:40           ` Andrey Ryabinin
2019-03-07 20:42           ` Peter Zijlstra
2019-03-08 21:02   ` Josh Poimboeuf
2019-03-08 21:31     ` Peter Zijlstra
2019-03-08 21:54       ` Josh Poimboeuf
2019-03-10 13:10     ` Peter Zijlstra
2019-03-11 18:01       ` Josh Poimboeuf
2019-03-07 11:45 ` [PATCH 19/20] objtool: uaccess PUSHF/POPF support Peter Zijlstra
2019-03-08 21:11   ` Josh Poimboeuf
2019-03-10 13:12     ` Peter Zijlstra
2019-03-07 11:45 ` [PATCH 20/20] objtool: Add Direction Flag validation Peter Zijlstra
2019-03-08 21:16   ` Josh Poimboeuf
2019-03-08 21:33     ` Peter Zijlstra
2019-03-08 21:56       ` Josh Poimboeuf
2019-03-10 13:13         ` Peter Zijlstra
2019-03-11 18:00           ` Josh Poimboeuf
2019-03-07 12:03 ` [PATCH 00/20] objtool: UACCESS validation v3 Peter Zijlstra
2019-03-07 12:55   ` Peter Zijlstra
2019-03-07 13:13     ` Peter Zijlstra
2019-03-07 16:47       ` Josh Poimboeuf
2019-03-07 16:50         ` Josh Poimboeuf
2019-03-07 17:00         ` Linus Torvalds
2019-03-07 17:17           ` Josh Poimboeuf
2019-03-07 17:38             ` Peter Zijlstra
2019-03-07 17:45               ` Linus Torvalds
2019-03-07 18:18                 ` Steven Rostedt
2019-03-10 13:16                   ` Peter Zijlstra
2019-04-19 10:08                     ` [PATCH] compiler.h, tracing: Remove CONFIG_PROFILE_ALL_BRANCHES Ingo Molnar
2019-04-19 13:04                       ` Steven Rostedt
2019-03-07 17:04         ` [PATCH 00/20] objtool: UACCESS validation v3 hpa
2019-03-07 17:18           ` Josh Poimboeuf
2019-03-07 17:29             ` hpa
2019-03-07 17:45               ` Josh Poimboeuf
2019-03-07 17:48                 ` Linus Torvalds
2019-03-07 17:43         ` Peter Zijlstra
2019-03-07 17:48           ` Josh Poimboeuf
2019-04-03  8:21             ` [tip:core/objtool] tracing: Improve "if" macro code generation tip-bot for Josh Poimboeuf
2019-03-07 16:31   ` [PATCH 00/20] objtool: UACCESS validation v3 Linus Torvalds
2019-03-07 17:14 ` hpa

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=20190307115159.349746915@infradead.org \
    --to=peterz@infradead.org \
    --cc=bp@alien8.de \
    --cc=brgerst@gmail.com \
    --cc=catalin.marinas@arm.com \
    --cc=dvlasenk@redhat.com \
    --cc=dvyukov@google.com \
    --cc=hpa@zytor.com \
    --cc=james.morse@arm.com \
    --cc=jpoimboe@redhat.com \
    --cc=julien.thierry@arm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=luto@kernel.org \
    --cc=mingo@kernel.org \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=valentin.schneider@arm.com \
    --cc=will.deacon@arm.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.