2018-04-20 17:49:46 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
# ifndef _ASM_S390_NOSPEC_ASM_H
# define _ASM_S390_NOSPEC_ASM_H
2018-04-25 19:35:26 +03:00
# include <asm/alternative-asm.h>
# include <asm/asm-offsets.h>
2018-04-20 17:49:46 +03:00
# include <asm/dwarf.h>
# ifdef __ASSEMBLY__
2018-06-15 11:22:18 +03:00
# ifdef CC_USING_EXPOLINE
2018-04-20 17:49:46 +03:00
2018-04-25 19:35:26 +03:00
_LC_BR_R1 = __LC_BR_R1
2018-04-20 17:49:46 +03:00
/*
* The expoline macros are used to create thunks in the same format
* as gcc generates them . The ' comdat ' section flag makes sure that
* the various thunks are merged into a single copy .
*/
. macro __THUNK_PROLOG_NAME name
. pushsection . text . \ name , " axG " , @ progbits , \ name , comdat
. globl \ name
. hidden \ name
. type \ name , @ function
\ name :
CFI_STARTPROC
. endm
. macro __THUNK_EPILOG
CFI_ENDPROC
. popsection
. endm
. macro __THUNK_PROLOG_BR r1 , r2
2019-02-01 18:33:37 +03:00
__THUNK_PROLOG_NAME __s390_indirect_jump_r \ r2 \ ( ) use_r \ r1
2018-04-20 17:49:46 +03:00
. endm
2018-04-24 16:32:08 +03:00
. macro __THUNK_PROLOG_BC d0 , r1 , r2
2019-02-01 18:33:37 +03:00
__THUNK_PROLOG_NAME __s390_indirect_branch_ \ d0 \ ( ) _ \ r2 \ ( ) use_ \ r1
2018-04-24 16:32:08 +03:00
. endm
2018-04-20 17:49:46 +03:00
. macro __THUNK_BR r1 , r2
2019-02-01 18:33:37 +03:00
jg __s390_indirect_jump_r \ r2 \ ( ) use_r \ r1
2018-04-20 17:49:46 +03:00
. endm
2018-04-24 16:32:08 +03:00
. macro __THUNK_BC d0 , r1 , r2
2019-02-01 18:33:37 +03:00
jg __s390_indirect_branch_ \ d0 \ ( ) _ \ r2 \ ( ) use_ \ r1
2018-04-24 16:32:08 +03:00
. endm
2018-04-20 17:49:46 +03:00
. macro __THUNK_BRASL r1 , r2 , r3
2019-02-01 18:33:37 +03:00
brasl \ r1 , __s390_indirect_jump_r \ r3 \ ( ) use_r \ r2
2018-04-20 17:49:46 +03:00
. endm
. macro __DECODE_RR expand , reg , ruse
. set __decode_fail , 1
. irp r1 , 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15
. ifc \ reg , % r \ r1
. irp r2 , 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15
. ifc \ ruse , % r \ r2
\ expand \ r1 , \ r2
. set __decode_fail , 0
. endif
. endr
. endif
. endr
. if __decode_fail = = 1
. error " __DECODE_RR failed "
. endif
. endm
. macro __DECODE_RRR expand , rsave , rtarget , ruse
. set __decode_fail , 1
. irp r1 , 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15
. ifc \ rsave , % r \ r1
. irp r2 , 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15
. ifc \ rtarget , % r \ r2
. irp r3 , 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15
. ifc \ ruse , % r \ r3
\ expand \ r1 , \ r2 , \ r3
. set __decode_fail , 0
. endif
. endr
. endif
. endr
. endif
. endr
. if __decode_fail = = 1
. error " __DECODE_RRR failed "
. endif
. endm
2018-04-24 16:32:08 +03:00
. macro __DECODE_DRR expand , disp , reg , ruse
. set __decode_fail , 1
. irp r1 , 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15
. ifc \ reg , % r \ r1
. irp r2 , 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15
. ifc \ ruse , % r \ r2
\ expand \ disp , \ r1 , \ r2
. set __decode_fail , 0
. endif
. endr
. endif
. endr
. if __decode_fail = = 1
. error " __DECODE_DRR failed "
. endif
. endm
2018-04-20 17:49:46 +03:00
. macro __THUNK_EX_BR reg , ruse
2018-04-25 19:35:26 +03:00
# Be very careful when adding instructions to this macro!
# The ALTERNATIVE replacement code has a .+10 which targets
# the "br \reg" after the code has been patched.
2018-04-20 17:49:46 +03:00
# ifdef CONFIG_HAVE_MARCH_Z10_FEATURES
exrl 0 , 555f
j .
# else
2018-04-25 19:35:26 +03:00
. ifc \ reg , % r1
ALTERNATIVE " ex %r0,_LC_BR_R1 " , " .insn ril,0xc60000000000,0,.+10 " , 35
j .
. else
2018-04-20 17:49:46 +03:00
larl \ ruse , 555f
ex 0 , 0 ( \ ruse )
j .
2018-04-25 19:35:26 +03:00
. endif
2018-04-20 17:49:46 +03:00
# endif
555 : br \ reg
. endm
2018-04-24 16:32:08 +03:00
. macro __THUNK_EX_BC disp , reg , ruse
# ifdef CONFIG_HAVE_MARCH_Z10_FEATURES
exrl 0 , 556f
j .
# else
larl \ ruse , 556f
ex 0 , 0 ( \ ruse )
j .
# endif
556 : b \ disp ( \ reg )
. endm
2018-04-20 17:49:46 +03:00
. macro GEN_BR_THUNK reg , ruse = % r1
__DECODE_RR __THUNK_PROLOG_BR , \ reg , \ ruse
__THUNK_EX_BR \ reg , \ ruse
__THUNK_EPILOG
. endm
2018-04-24 16:32:08 +03:00
. macro GEN_B_THUNK disp , reg , ruse = % r1
__DECODE_DRR __THUNK_PROLOG_BC , \ disp , \ reg , \ ruse
__THUNK_EX_BC \ disp , \ reg , \ ruse
__THUNK_EPILOG
. endm
2018-04-20 17:49:46 +03:00
. macro BR_EX reg , ruse = % r1
557 : __DECODE_RR __THUNK_BR , \ reg , \ ruse
. pushsection . s390_indirect_branches , " a " , @ progbits
. long 557 b - .
. popsection
2018-04-24 16:32:08 +03:00
. endm
. macro B_EX disp , reg , ruse = % r1
558 : __DECODE_DRR __THUNK_BC , \ disp , \ reg , \ ruse
. pushsection . s390_indirect_branches , " a " , @ progbits
. long 558 b - .
. popsection
2018-04-20 17:49:46 +03:00
. endm
. macro BASR_EX rsave , rtarget , ruse = % r1
559 : __DECODE_RRR __THUNK_BRASL , \ rsave , \ rtarget , \ ruse
. pushsection . s390_indirect_branches , " a " , @ progbits
. long 559 b - .
. popsection
. endm
# else
. macro GEN_BR_THUNK reg , ruse = % r1
2018-04-24 16:32:08 +03:00
. endm
. macro GEN_B_THUNK disp , reg , ruse = % r1
2018-04-20 17:49:46 +03:00
. endm
. macro BR_EX reg , ruse = % r1
br \ reg
2018-04-24 16:32:08 +03:00
. endm
. macro B_EX disp , reg , ruse = % r1
b \ disp ( \ reg )
2018-04-20 17:49:46 +03:00
. endm
. macro BASR_EX rsave , rtarget , ruse = % r1
basr \ rsave , \ rtarget
. endm
2018-06-15 11:22:18 +03:00
# endif /* CC_USING_EXPOLINE */
2018-04-20 17:49:46 +03:00
# endif /* __ASSEMBLY__ */
# endif /* _ASM_S390_NOSPEC_ASM_H */