mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 20:58:14 -04:00
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 <agordeev@linux.ibm.com> Signed-off-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
This commit is contained in:
committed by
Alexander Gordeev
parent
5b629e64e5
commit
c7474da9fe
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user