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 05/25] x86/uaccess: Move copy_user_handle_tail into asm
Date: Mon, 18 Mar 2019 16:38:45 +0100	[thread overview]
Message-ID: <20190318155140.346218947@infradead.org> (raw)
In-Reply-To: 20190318153840.906404905@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-18 15:54 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-18 15:38 [PATCH 00/25] objtool: UACCESS validation v4 Peter Zijlstra
2019-03-18 15:38 ` [PATCH 01/25] x86: Make SMAP 64-bit only Peter Zijlstra
2019-03-18 16:58   ` Linus Torvalds
2019-03-18 17:36     ` Peter Zijlstra
2019-03-18 17:51       ` Peter Zijlstra
2019-03-18 18:10         ` Linus Torvalds
2019-03-21 17:12           ` hpa
2019-03-21 17:25           ` Denys Vlasenko
2019-03-21 18:18             ` hpa
2019-03-21 21:03               ` Peter Zijlstra
2019-03-21 18:21             ` Linus Torvalds
2019-03-19 11:16   ` [PATCH 01/25] sched/x86: Save [ER]FLAGS on context switch Peter Zijlstra
2019-03-18 15:38 ` [PATCH 02/25] tracing: Improve "if" macro code generation Peter Zijlstra
2019-03-18 17:41   ` Steven Rostedt
2019-03-18 23:37   ` Josh Poimboeuf
2019-03-19 10:11     ` Peter Zijlstra
2019-03-20 11:18   ` David Laight
2019-03-20 17:26     ` Linus Torvalds
2019-03-20 17:37       ` David Laight
2019-03-20 17:38         ` Linus Torvalds
2019-03-20 18:18       ` Steven Rostedt
2019-05-09 13:00       ` Steven Rostedt
2019-05-09 16:51         ` Linus Torvalds
2019-05-09 18:29           ` Steven Rostedt
2019-05-09 18:45             ` Josh Poimboeuf
2019-05-09 18:47               ` Josh Poimboeuf
2019-05-09 18:48                 ` Randy Dunlap
2019-05-09 18:57                   ` Josh Poimboeuf
2019-05-09 19:06               ` Steven Rostedt
2019-05-09 19:28                 ` Steven Rostedt
2019-05-09 19:44                   ` Linus Torvalds
2019-03-18 15:38 ` [PATCH 03/25] x86/ia32: Fix ia32_restore_sigcontext AC leak Peter Zijlstra
2019-03-18 15:38 ` [PATCH 04/25] i915,uaccess: Fix redundant CLAC Peter Zijlstra
2019-03-18 15:38 ` Peter Zijlstra [this message]
2019-03-18 15:38 ` [PATCH 06/25] x86/uaccess: Fix up the fixup Peter Zijlstra
2019-03-18 15:38 ` [PATCH 07/25] x86/nospec,objtool: Introduce ANNOTATE_IGNORE_ALTERNATIVE Peter Zijlstra
2019-03-18 15:38 ` [PATCH 08/25] x86/uaccess,xen: Suppress SMAP warnings Peter Zijlstra
2019-03-18 15:38 ` [PATCH 09/25] x86/uaccess: Always inline user_access_begin() Peter Zijlstra
2019-03-18 15:38 ` [PATCH 10/25] x86/uaccess,signal: Fix AC=1 bloat Peter Zijlstra
2019-03-18 15:38 ` [PATCH 11/25] x86/uaccess: Introduce user_access_{save,restore}() Peter Zijlstra
2019-03-18 15:38 ` [PATCH 12/25] x86/smap: Ditch __stringify() Peter Zijlstra
2019-03-18 15:38 ` [PATCH 13/25] x86/uaccess,kasan: Fix KASAN vs SMAP Peter Zijlstra
2019-03-18 15:38 ` [PATCH 14/25] x86/uaccess,ubsan: Fix UBSAN " Peter Zijlstra
2019-03-18 15:38 ` [PATCH 15/25] x86/uaccess,ftrace: Fix ftrace_likely_update() " Peter Zijlstra
2019-03-18 15:38 ` [PATCH 16/25] x86/uaccess,kcov: Disable stack protector Peter Zijlstra
2019-03-18 15:38 ` [PATCH 17/25] objtool: Set insn->func for alternatives Peter Zijlstra
2019-03-18 15:38 ` [PATCH 18/25] objtool: Handle function aliases Peter Zijlstra
2019-03-18 15:38 ` [PATCH 19/25] objtool: Rewrite add_ignores() Peter Zijlstra
2019-03-18 15:39 ` [PATCH 20/25] objtool: Add --backtrace support Peter Zijlstra
2019-03-18 15:39 ` [PATCH 21/25] objtool: Rewrite alt->skip_orig Peter Zijlstra
2019-03-18 15:39 ` [PATCH 22/25] objtool: Fix sibling call detection Peter Zijlstra
2019-03-18 15:39 ` [PATCH 23/25] objtool: Add UACCESS validation Peter Zijlstra
2019-03-18 23:51   ` Josh Poimboeuf
2019-05-07 11:52   ` Peter Zijlstra
2019-03-18 15:39 ` [PATCH 24/25] objtool: uaccess PUSHF/POPF support Peter Zijlstra
2019-03-18 15:39 ` [PATCH 25/25] objtool: Add Direction Flag validation Peter Zijlstra
2019-03-18 23:57 ` [PATCH 00/25] objtool: UACCESS validation v4 Josh Poimboeuf
2019-03-19 11:20   ` Peter Zijlstra
2019-03-19 11:17 ` [PATCH 26/25] sched/x86_64: Don't save flags on context switch Peter Zijlstra

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=20190318155140.346218947@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.