mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 04:31:50 +00:00
91a0117dce
Use __ALIGN instead of open coded .align statement to make sure that external expoline thunks follow global function alignment rules. Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
133 lines
2.4 KiB
C
133 lines
2.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _ASM_S390_NOSPEC_ASM_H
|
|
#define _ASM_S390_NOSPEC_ASM_H
|
|
|
|
#include <linux/linkage.h>
|
|
#include <asm/dwarf.h>
|
|
|
|
#ifdef __ASSEMBLY__
|
|
|
|
#ifdef CC_USING_EXPOLINE
|
|
|
|
/*
|
|
* 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
|
|
#ifdef CONFIG_EXPOLINE_EXTERN
|
|
.pushsection .text,"ax",@progbits
|
|
__ALIGN
|
|
#else
|
|
.pushsection .text.\name,"axG",@progbits,\name,comdat
|
|
#endif
|
|
.globl \name
|
|
.hidden \name
|
|
.type \name,@function
|
|
\name:
|
|
CFI_STARTPROC
|
|
.endm
|
|
|
|
.macro __THUNK_EPILOG_NAME name
|
|
CFI_ENDPROC
|
|
#ifdef CONFIG_EXPOLINE_EXTERN
|
|
.size \name, .-\name
|
|
#endif
|
|
.popsection
|
|
.endm
|
|
|
|
.macro __THUNK_PROLOG_BR r1
|
|
__THUNK_PROLOG_NAME __s390_indirect_jump_r\r1
|
|
.endm
|
|
|
|
.macro __THUNK_EPILOG_BR r1
|
|
__THUNK_EPILOG_NAME __s390_indirect_jump_r\r1
|
|
.endm
|
|
|
|
.macro __THUNK_BR r1
|
|
jg __s390_indirect_jump_r\r1
|
|
.endm
|
|
|
|
.macro __THUNK_BRASL r1,r2
|
|
brasl \r1,__s390_indirect_jump_r\r2
|
|
.endm
|
|
|
|
.macro __DECODE_R expand,reg
|
|
.set .L__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
|
|
\expand \r1
|
|
.set .L__decode_fail,0
|
|
.endif
|
|
.endr
|
|
.if .L__decode_fail == 1
|
|
.error "__DECODE_R failed"
|
|
.endif
|
|
.endm
|
|
|
|
.macro __DECODE_RR expand,rsave,rtarget
|
|
.set .L__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
|
|
\expand \r1,\r2
|
|
.set .L__decode_fail,0
|
|
.endif
|
|
.endr
|
|
.endif
|
|
.endr
|
|
.if .L__decode_fail == 1
|
|
.error "__DECODE_RR failed"
|
|
.endif
|
|
.endm
|
|
|
|
.macro __THUNK_EX_BR reg
|
|
exrl 0,555f
|
|
j .
|
|
555: br \reg
|
|
.endm
|
|
|
|
#ifdef CONFIG_EXPOLINE_EXTERN
|
|
.macro GEN_BR_THUNK reg
|
|
.endm
|
|
.macro GEN_BR_THUNK_EXTERN reg
|
|
#else
|
|
.macro GEN_BR_THUNK reg
|
|
#endif
|
|
__DECODE_R __THUNK_PROLOG_BR,\reg
|
|
__THUNK_EX_BR \reg
|
|
__DECODE_R __THUNK_EPILOG_BR,\reg
|
|
.endm
|
|
|
|
.macro BR_EX reg
|
|
557: __DECODE_R __THUNK_BR,\reg
|
|
.pushsection .s390_indirect_branches,"a",@progbits
|
|
.long 557b-.
|
|
.popsection
|
|
.endm
|
|
|
|
.macro BASR_EX rsave,rtarget
|
|
559: __DECODE_RR __THUNK_BRASL,\rsave,\rtarget
|
|
.pushsection .s390_indirect_branches,"a",@progbits
|
|
.long 559b-.
|
|
.popsection
|
|
.endm
|
|
|
|
#else
|
|
.macro GEN_BR_THUNK reg
|
|
.endm
|
|
|
|
.macro BR_EX reg
|
|
br \reg
|
|
.endm
|
|
|
|
.macro BASR_EX rsave,rtarget
|
|
basr \rsave,\rtarget
|
|
.endm
|
|
#endif /* CC_USING_EXPOLINE */
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif /* _ASM_S390_NOSPEC_ASM_H */
|