Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _ASM_S390_NOSPEC_ASM_H
0003 #define _ASM_S390_NOSPEC_ASM_H
0004 
0005 #include <asm/dwarf.h>
0006 
0007 #ifdef __ASSEMBLY__
0008 
0009 #ifdef CC_USING_EXPOLINE
0010 
0011 /*
0012  * The expoline macros are used to create thunks in the same format
0013  * as gcc generates them. The 'comdat' section flag makes sure that
0014  * the various thunks are merged into a single copy.
0015  */
0016     .macro __THUNK_PROLOG_NAME name
0017 #ifdef CONFIG_EXPOLINE_EXTERN
0018     .pushsection .text,"ax",@progbits
0019     .align 16,0x07
0020 #else
0021     .pushsection .text.\name,"axG",@progbits,\name,comdat
0022 #endif
0023     .globl \name
0024     .hidden \name
0025     .type \name,@function
0026 \name:
0027     CFI_STARTPROC
0028     .endm
0029 
0030     .macro __THUNK_EPILOG_NAME name
0031     CFI_ENDPROC
0032 #ifdef CONFIG_EXPOLINE_EXTERN
0033     .size \name, .-\name
0034 #endif
0035     .popsection
0036     .endm
0037 
0038     .macro __THUNK_PROLOG_BR r1
0039     __THUNK_PROLOG_NAME __s390_indirect_jump_r\r1
0040     .endm
0041 
0042     .macro __THUNK_EPILOG_BR r1
0043     __THUNK_EPILOG_NAME __s390_indirect_jump_r\r1
0044     .endm
0045 
0046     .macro __THUNK_BR r1
0047     jg  __s390_indirect_jump_r\r1
0048     .endm
0049 
0050     .macro __THUNK_BRASL r1,r2
0051     brasl   \r1,__s390_indirect_jump_r\r2
0052     .endm
0053 
0054     .macro  __DECODE_R expand,reg
0055     .set .L__decode_fail,1
0056     .irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
0057     .ifc \reg,%r\r1
0058     \expand \r1
0059     .set .L__decode_fail,0
0060     .endif
0061     .endr
0062     .if .L__decode_fail == 1
0063     .error "__DECODE_R failed"
0064     .endif
0065     .endm
0066 
0067     .macro  __DECODE_RR expand,rsave,rtarget
0068     .set .L__decode_fail,1
0069     .irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
0070     .ifc \rsave,%r\r1
0071     .irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
0072     .ifc \rtarget,%r\r2
0073     \expand \r1,\r2
0074     .set .L__decode_fail,0
0075     .endif
0076     .endr
0077     .endif
0078     .endr
0079     .if .L__decode_fail == 1
0080     .error "__DECODE_RR failed"
0081     .endif
0082     .endm
0083 
0084     .macro __THUNK_EX_BR reg
0085     exrl    0,555f
0086     j   .
0087 555:    br  \reg
0088     .endm
0089 
0090 #ifdef CONFIG_EXPOLINE_EXTERN
0091     .macro GEN_BR_THUNK reg
0092     .endm
0093     .macro GEN_BR_THUNK_EXTERN reg
0094 #else
0095     .macro GEN_BR_THUNK reg
0096 #endif
0097     __DECODE_R __THUNK_PROLOG_BR,\reg
0098     __THUNK_EX_BR \reg
0099     __DECODE_R __THUNK_EPILOG_BR,\reg
0100     .endm
0101 
0102     .macro BR_EX reg
0103 557:    __DECODE_R __THUNK_BR,\reg
0104     .pushsection .s390_indirect_branches,"a",@progbits
0105     .long   557b-.
0106     .popsection
0107     .endm
0108 
0109     .macro BASR_EX rsave,rtarget
0110 559:    __DECODE_RR __THUNK_BRASL,\rsave,\rtarget
0111     .pushsection .s390_indirect_branches,"a",@progbits
0112     .long   559b-.
0113     .popsection
0114     .endm
0115 
0116 #else
0117     .macro GEN_BR_THUNK reg
0118     .endm
0119 
0120      .macro BR_EX reg
0121     br  \reg
0122     .endm
0123 
0124     .macro BASR_EX rsave,rtarget
0125     basr    \rsave,\rtarget
0126     .endm
0127 #endif /* CC_USING_EXPOLINE */
0128 
0129 #endif /* __ASSEMBLY__ */
0130 
0131 #endif /* _ASM_S390_NOSPEC_ASM_H */