From c7474da9fef537c0fc89cef552897116456a2e41 Mon Sep 17 00:00:00 2001 From: Heiko Carstens Date: Mon, 13 Jan 2025 13:37:00 +0100 Subject: [PATCH] s390/uaccess: Use asm goto for __mvc_kernel_nofault() 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 Signed-off-by: Heiko Carstens Signed-off-by: Alexander Gordeev --- arch/s390/include/asm/uaccess.h | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/arch/s390/include/asm/uaccess.h b/arch/s390/include/asm/uaccess.h index d598cdcaa9faa..b96bda0f12756 100644 --- a/arch/s390/include/asm/uaccess.h +++ b/arch/s390/include/asm/uaccess.h @@ -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 -- 2.49.0