s390/uaccess: Use asm goto for __mvc_kernel_nofault()
authorHeiko Carstens <hca@linux.ibm.com>
Mon, 13 Jan 2025 12:37:00 +0000 (13:37 +0100)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Sun, 26 Jan 2025 16:24:05 +0000 (17:24 +0100)
Use asm goto for __mvc_kernel_nofault() if available. This generates
slightly better code, since the error checking happens implicitly with
the goto (aka exception) and the good path comes without any checks and
branches.

Acked-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/include/asm/uaccess.h

index d598cdcaa9faa5197b2544da8bc3875e5c8f30e9..b96bda0f1275613164313369fa0d469e4786b91b 100644 (file)
@@ -343,29 +343,25 @@ static inline void *s390_kernel_write(void *dst, const void *src, size_t size)
 
 void __noreturn __mvc_kernel_nofault_bad(void);
 
-#ifdef CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS
+#if defined(CONFIG_CC_HAS_ASM_GOTO_OUTPUT) && defined(CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS)
 
 #define __mvc_kernel_nofault(dst, src, type, err_label)                        \
 do {                                                                   \
-       int __rc;                                                       \
-                                                                       \
        switch (sizeof(type)) {                                         \
        case 1:                                                         \
        case 2:                                                         \
        case 4:                                                         \
        case 8:                                                         \
-               asm_inline volatile(                                    \
+               asm goto(                                               \
                        "0:     mvc     %O[_dst](%[_len],%R[_dst]),%[_src]\n" \
-                       "1:     lhi     %[_rc],0\n"                     \
-                       "2:\n"                                          \
-                       EX_TABLE_UA_FAULT(0b, 2b, %[_rc])               \
-                       EX_TABLE_UA_FAULT(1b, 2b, %[_rc])               \
-                       : [_rc] "=d" (__rc),                            \
-                         [_dst] "=Q" (*(type *)dst)                    \
+                       "1:     nopr    %%r7\n"                         \
+                       EX_TABLE(0b, %l[err_label])                     \
+                       EX_TABLE(1b, %l[err_label])                     \
+                       : [_dst] "=Q" (*(type *)dst)                    \
                        : [_src] "Q" (*(type *)(src)),                  \
-                         [_len] "I" (sizeof(type)));                   \
-               if (__rc)                                               \
-                       goto err_label;                                 \
+                         [_len] "I" (sizeof(type))                     \
+                       :                                               \
+                       : err_label);                                   \
                break;                                                  \
        default:                                                        \
                __mvc_kernel_nofault_bad();                             \
@@ -373,7 +369,7 @@ do {                                                                        \
        }                                                               \
 } while (0)
 
-#else /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
+#else /* CONFIG_CC_HAS_ASM_GOTO_OUTPUT) && CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
 
 #define __mvc_kernel_nofault(dst, src, type, err_label)                        \
 do {                                                                   \
@@ -405,7 +401,7 @@ do {                                                                        \
        }                                                               \
 } while (0)
 
-#endif /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
+#endif /* CONFIG_CC_HAS_ASM_GOTO_OUTPUT && CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
 
 #define __get_kernel_nofault __mvc_kernel_nofault
 #define __put_kernel_nofault __mvc_kernel_nofault