Re: [PATCH v4 1/2] powerpc/uaccess: Implement unsafe_put_user() using 'asm goto'
From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2020-05-06 00:58:42
Also in:
lkml
Subsystem:
linux for powerpc (32-bit and 64-bit), the rest · Maintainers:
Madhavan Srinivasan, Michael Ellerman, Linus Torvalds
Segher Boessenkool [off-list ref] writes:
Hi! On Wed, May 06, 2020 at 12:27:58AM +1000, Michael Ellerman wrote:quoted
Christophe Leroy [off-list ref] writes:quoted
unsafe_put_user() is designed to take benefit of 'asm goto'. Instead of using the standard __put_user() approach and branch based on the returned error, use 'asm goto' and make the exception code branch directly to the error label. There is no code anymore in the fixup section. This change significantly simplifies functions using unsafe_put_user()...quoted
Signed-off-by: Christophe Leroy <redacted> --- arch/powerpc/include/asm/uaccess.h | 61 +++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 9 deletions(-)diff --git a/arch/powerpc/include/asm/uaccess.h b/arch/powerpc/include/asm/uaccess.h index 9cc9c106ae2a..9365b59495a2 100644 --- a/arch/powerpc/include/asm/uaccess.h +++ b/arch/powerpc/include/asm/uaccess.h@@ -196,6 +193,52 @@ do { \ }) +#define __put_user_asm_goto(x, addr, label, op) \ + asm volatile goto( \ + "1: " op "%U1%X1 %0,%1 # put_user\n" \ + EX_TABLE(1b, %l2) \ + : \ + : "r" (x), "m<>" (*addr) \The "m<>" here is breaking GCC 4.6.3, which we allegedly still support.[ You shouldn't use 4.6.3, there has been 4.6.4 since a while. And 4.6 is nine years old now. Most projects do not support < 4.8 anymore, on any architecture. ]
Moving up to 4.6.4 wouldn't actually help with this though would it? Also I have 4.6.3 compilers already built, I don't really have time to rebuild them for 4.6.4. The kernel has a top-level minimum version, which I'm not in charge of, see: https://www.kernel.org/doc/html/latest/process/changes.html?highlight=gcc There were discussions about making 4.8 the minimum, but I'm not sure where they got to.
quoted
Plain "m" works, how much does the "<>" affect code gen in practice? A quick diff here shows no difference from removing "<>".It will make it impossible to use update-form instructions here. That probably does not matter much at all, in this case. If you remove the "<>" constraints, also remove the "%Un" output modifier?
So like this?
diff --git a/arch/powerpc/include/asm/uaccess.h b/arch/powerpc/include/asm/uaccess.h
index 62cc8d7640ec..ca847aed8e45 100644
--- a/arch/powerpc/include/asm/uaccess.h
+++ b/arch/powerpc/include/asm/uaccess.h@@ -207,10 +207,10 @@ do { \ #define __put_user_asm_goto(x, addr, label, op) \ asm volatile goto( \ - "1: " op "%U1%X1 %0,%1 # put_user\n" \ + "1: " op "%X1 %0,%1 # put_user\n" \ EX_TABLE(1b, %l2) \ : \ - : "r" (x), "m<>" (*addr) \ + : "r" (x), "m" (*addr) \ : \ : label)
cheers