1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _ASM_S390_NOSPEC_ASM_H 3*4882a593Smuzhiyun #define _ASM_S390_NOSPEC_ASM_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <asm/alternative-asm.h> 6*4882a593Smuzhiyun #include <asm/asm-offsets.h> 7*4882a593Smuzhiyun #include <asm/dwarf.h> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifdef __ASSEMBLY__ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifdef CC_USING_EXPOLINE 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun _LC_BR_R1 = __LC_BR_R1 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* 16*4882a593Smuzhiyun * The expoline macros are used to create thunks in the same format 17*4882a593Smuzhiyun * as gcc generates them. The 'comdat' section flag makes sure that 18*4882a593Smuzhiyun * the various thunks are merged into a single copy. 19*4882a593Smuzhiyun */ 20*4882a593Smuzhiyun .macro __THUNK_PROLOG_NAME name 21*4882a593Smuzhiyun .pushsection .text.\name,"axG",@progbits,\name,comdat 22*4882a593Smuzhiyun .globl \name 23*4882a593Smuzhiyun .hidden \name 24*4882a593Smuzhiyun .type \name,@function 25*4882a593Smuzhiyun \name: 26*4882a593Smuzhiyun CFI_STARTPROC 27*4882a593Smuzhiyun .endm 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun .macro __THUNK_EPILOG 30*4882a593Smuzhiyun CFI_ENDPROC 31*4882a593Smuzhiyun .popsection 32*4882a593Smuzhiyun .endm 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun .macro __THUNK_PROLOG_BR r1,r2 35*4882a593Smuzhiyun __THUNK_PROLOG_NAME __s390_indirect_jump_r\r2\()use_r\r1 36*4882a593Smuzhiyun .endm 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun .macro __THUNK_PROLOG_BC d0,r1,r2 39*4882a593Smuzhiyun __THUNK_PROLOG_NAME __s390_indirect_branch_\d0\()_\r2\()use_\r1 40*4882a593Smuzhiyun .endm 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun .macro __THUNK_BR r1,r2 43*4882a593Smuzhiyun jg __s390_indirect_jump_r\r2\()use_r\r1 44*4882a593Smuzhiyun .endm 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun .macro __THUNK_BC d0,r1,r2 47*4882a593Smuzhiyun jg __s390_indirect_branch_\d0\()_\r2\()use_\r1 48*4882a593Smuzhiyun .endm 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun .macro __THUNK_BRASL r1,r2,r3 51*4882a593Smuzhiyun brasl \r1,__s390_indirect_jump_r\r3\()use_r\r2 52*4882a593Smuzhiyun .endm 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun .macro __DECODE_RR expand,reg,ruse 55*4882a593Smuzhiyun .set __decode_fail,1 56*4882a593Smuzhiyun .irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 57*4882a593Smuzhiyun .ifc \reg,%r\r1 58*4882a593Smuzhiyun .irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 59*4882a593Smuzhiyun .ifc \ruse,%r\r2 60*4882a593Smuzhiyun \expand \r1,\r2 61*4882a593Smuzhiyun .set __decode_fail,0 62*4882a593Smuzhiyun .endif 63*4882a593Smuzhiyun .endr 64*4882a593Smuzhiyun .endif 65*4882a593Smuzhiyun .endr 66*4882a593Smuzhiyun .if __decode_fail == 1 67*4882a593Smuzhiyun .error "__DECODE_RR failed" 68*4882a593Smuzhiyun .endif 69*4882a593Smuzhiyun .endm 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun .macro __DECODE_RRR expand,rsave,rtarget,ruse 72*4882a593Smuzhiyun .set __decode_fail,1 73*4882a593Smuzhiyun .irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 74*4882a593Smuzhiyun .ifc \rsave,%r\r1 75*4882a593Smuzhiyun .irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 76*4882a593Smuzhiyun .ifc \rtarget,%r\r2 77*4882a593Smuzhiyun .irp r3,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 78*4882a593Smuzhiyun .ifc \ruse,%r\r3 79*4882a593Smuzhiyun \expand \r1,\r2,\r3 80*4882a593Smuzhiyun .set __decode_fail,0 81*4882a593Smuzhiyun .endif 82*4882a593Smuzhiyun .endr 83*4882a593Smuzhiyun .endif 84*4882a593Smuzhiyun .endr 85*4882a593Smuzhiyun .endif 86*4882a593Smuzhiyun .endr 87*4882a593Smuzhiyun .if __decode_fail == 1 88*4882a593Smuzhiyun .error "__DECODE_RRR failed" 89*4882a593Smuzhiyun .endif 90*4882a593Smuzhiyun .endm 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun .macro __DECODE_DRR expand,disp,reg,ruse 93*4882a593Smuzhiyun .set __decode_fail,1 94*4882a593Smuzhiyun .irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 95*4882a593Smuzhiyun .ifc \reg,%r\r1 96*4882a593Smuzhiyun .irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 97*4882a593Smuzhiyun .ifc \ruse,%r\r2 98*4882a593Smuzhiyun \expand \disp,\r1,\r2 99*4882a593Smuzhiyun .set __decode_fail,0 100*4882a593Smuzhiyun .endif 101*4882a593Smuzhiyun .endr 102*4882a593Smuzhiyun .endif 103*4882a593Smuzhiyun .endr 104*4882a593Smuzhiyun .if __decode_fail == 1 105*4882a593Smuzhiyun .error "__DECODE_DRR failed" 106*4882a593Smuzhiyun .endif 107*4882a593Smuzhiyun .endm 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun .macro __THUNK_EX_BR reg,ruse 110*4882a593Smuzhiyun # Be very careful when adding instructions to this macro! 111*4882a593Smuzhiyun # The ALTERNATIVE replacement code has a .+10 which targets 112*4882a593Smuzhiyun # the "br \reg" after the code has been patched. 113*4882a593Smuzhiyun #ifdef CONFIG_HAVE_MARCH_Z10_FEATURES 114*4882a593Smuzhiyun exrl 0,555f 115*4882a593Smuzhiyun j . 116*4882a593Smuzhiyun #else 117*4882a593Smuzhiyun .ifc \reg,%r1 118*4882a593Smuzhiyun ALTERNATIVE "ex %r0,_LC_BR_R1", ".insn ril,0xc60000000000,0,.+10", 35 119*4882a593Smuzhiyun j . 120*4882a593Smuzhiyun .else 121*4882a593Smuzhiyun larl \ruse,555f 122*4882a593Smuzhiyun ex 0,0(\ruse) 123*4882a593Smuzhiyun j . 124*4882a593Smuzhiyun .endif 125*4882a593Smuzhiyun #endif 126*4882a593Smuzhiyun 555: br \reg 127*4882a593Smuzhiyun .endm 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun .macro __THUNK_EX_BC disp,reg,ruse 130*4882a593Smuzhiyun #ifdef CONFIG_HAVE_MARCH_Z10_FEATURES 131*4882a593Smuzhiyun exrl 0,556f 132*4882a593Smuzhiyun j . 133*4882a593Smuzhiyun #else 134*4882a593Smuzhiyun larl \ruse,556f 135*4882a593Smuzhiyun ex 0,0(\ruse) 136*4882a593Smuzhiyun j . 137*4882a593Smuzhiyun #endif 138*4882a593Smuzhiyun 556: b \disp(\reg) 139*4882a593Smuzhiyun .endm 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun .macro GEN_BR_THUNK reg,ruse=%r1 142*4882a593Smuzhiyun __DECODE_RR __THUNK_PROLOG_BR,\reg,\ruse 143*4882a593Smuzhiyun __THUNK_EX_BR \reg,\ruse 144*4882a593Smuzhiyun __THUNK_EPILOG 145*4882a593Smuzhiyun .endm 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun .macro GEN_B_THUNK disp,reg,ruse=%r1 148*4882a593Smuzhiyun __DECODE_DRR __THUNK_PROLOG_BC,\disp,\reg,\ruse 149*4882a593Smuzhiyun __THUNK_EX_BC \disp,\reg,\ruse 150*4882a593Smuzhiyun __THUNK_EPILOG 151*4882a593Smuzhiyun .endm 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun .macro BR_EX reg,ruse=%r1 154*4882a593Smuzhiyun 557: __DECODE_RR __THUNK_BR,\reg,\ruse 155*4882a593Smuzhiyun .pushsection .s390_indirect_branches,"a",@progbits 156*4882a593Smuzhiyun .long 557b-. 157*4882a593Smuzhiyun .popsection 158*4882a593Smuzhiyun .endm 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun .macro B_EX disp,reg,ruse=%r1 161*4882a593Smuzhiyun 558: __DECODE_DRR __THUNK_BC,\disp,\reg,\ruse 162*4882a593Smuzhiyun .pushsection .s390_indirect_branches,"a",@progbits 163*4882a593Smuzhiyun .long 558b-. 164*4882a593Smuzhiyun .popsection 165*4882a593Smuzhiyun .endm 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun .macro BASR_EX rsave,rtarget,ruse=%r1 168*4882a593Smuzhiyun 559: __DECODE_RRR __THUNK_BRASL,\rsave,\rtarget,\ruse 169*4882a593Smuzhiyun .pushsection .s390_indirect_branches,"a",@progbits 170*4882a593Smuzhiyun .long 559b-. 171*4882a593Smuzhiyun .popsection 172*4882a593Smuzhiyun .endm 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun #else 175*4882a593Smuzhiyun .macro GEN_BR_THUNK reg,ruse=%r1 176*4882a593Smuzhiyun .endm 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun .macro GEN_B_THUNK disp,reg,ruse=%r1 179*4882a593Smuzhiyun .endm 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun .macro BR_EX reg,ruse=%r1 182*4882a593Smuzhiyun br \reg 183*4882a593Smuzhiyun .endm 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun .macro B_EX disp,reg,ruse=%r1 186*4882a593Smuzhiyun b \disp(\reg) 187*4882a593Smuzhiyun .endm 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun .macro BASR_EX rsave,rtarget,ruse=%r1 190*4882a593Smuzhiyun basr \rsave,\rtarget 191*4882a593Smuzhiyun .endm 192*4882a593Smuzhiyun #endif /* CC_USING_EXPOLINE */ 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */ 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun #endif /* _ASM_S390_NOSPEC_ASM_H */ 197