xref: /openbmc/linux/arch/s390/include/asm/alternative-asm.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1fba9eb79SMartin Schwidefsky /* SPDX-License-Identifier: GPL-2.0 */
2fba9eb79SMartin Schwidefsky #ifndef _ASM_S390_ALTERNATIVE_ASM_H
3fba9eb79SMartin Schwidefsky #define _ASM_S390_ALTERNATIVE_ASM_H
4fba9eb79SMartin Schwidefsky 
5fba9eb79SMartin Schwidefsky #ifdef __ASSEMBLY__
6fba9eb79SMartin Schwidefsky 
7fba9eb79SMartin Schwidefsky /*
8fba9eb79SMartin Schwidefsky  * Issue one struct alt_instr descriptor entry (need to put it into
9fba9eb79SMartin Schwidefsky  * the section .altinstructions, see below). This entry contains
10fba9eb79SMartin Schwidefsky  * enough information for the alternatives patching code to patch an
11fba9eb79SMartin Schwidefsky  * instruction. See apply_alternatives().
12fba9eb79SMartin Schwidefsky  */
13fba9eb79SMartin Schwidefsky .macro alt_entry orig_start, orig_end, alt_start, alt_end, feature
14fba9eb79SMartin Schwidefsky 	.long	\orig_start - .
15fba9eb79SMartin Schwidefsky 	.long	\alt_start - .
16fba9eb79SMartin Schwidefsky 	.word	\feature
17fba9eb79SMartin Schwidefsky 	.byte	\orig_end - \orig_start
18*e6ed91fdSHeiko Carstens 	.org	. - ( \orig_end - \orig_start ) + ( \alt_end - \alt_start )
19*e6ed91fdSHeiko Carstens 	.org	. - ( \alt_end - \alt_start ) + ( \orig_end - \orig_start )
20fba9eb79SMartin Schwidefsky .endm
21fba9eb79SMartin Schwidefsky 
22fba9eb79SMartin Schwidefsky /*
23fba9eb79SMartin Schwidefsky  * Define an alternative between two instructions. If @feature is
24fba9eb79SMartin Schwidefsky  * present, early code in apply_alternatives() replaces @oldinstr with
25*e6ed91fdSHeiko Carstens  * @newinstr.
26fba9eb79SMartin Schwidefsky  */
27fba9eb79SMartin Schwidefsky .macro ALTERNATIVE oldinstr, newinstr, feature
28fba9eb79SMartin Schwidefsky 	.pushsection .altinstr_replacement,"ax"
29fba9eb79SMartin Schwidefsky 770:	\newinstr
30fba9eb79SMartin Schwidefsky 771:	.popsection
31fba9eb79SMartin Schwidefsky 772:	\oldinstr
32*e6ed91fdSHeiko Carstens 773:	.pushsection .altinstructions,"a"
33*e6ed91fdSHeiko Carstens 	alt_entry 772b, 773b, 770b, 771b, \feature
34fba9eb79SMartin Schwidefsky 	.popsection
35fba9eb79SMartin Schwidefsky .endm
36fba9eb79SMartin Schwidefsky 
37fba9eb79SMartin Schwidefsky /*
38fba9eb79SMartin Schwidefsky  * Define an alternative between two instructions. If @feature is
39fba9eb79SMartin Schwidefsky  * present, early code in apply_alternatives() replaces @oldinstr with
40*e6ed91fdSHeiko Carstens  * @newinstr.
41fba9eb79SMartin Schwidefsky  */
42fba9eb79SMartin Schwidefsky .macro ALTERNATIVE_2 oldinstr, newinstr1, feature1, newinstr2, feature2
43fba9eb79SMartin Schwidefsky 	.pushsection .altinstr_replacement,"ax"
44fba9eb79SMartin Schwidefsky 770:	\newinstr1
45fba9eb79SMartin Schwidefsky 771:	\newinstr2
46fba9eb79SMartin Schwidefsky 772:	.popsection
47fba9eb79SMartin Schwidefsky 773:	\oldinstr
48*e6ed91fdSHeiko Carstens 774:	.pushsection .altinstructions,"a"
49*e6ed91fdSHeiko Carstens 	alt_entry 773b, 774b, 770b, 771b,\feature1
50*e6ed91fdSHeiko Carstens 	alt_entry 773b, 774b, 771b, 772b,\feature2
51fba9eb79SMartin Schwidefsky 	.popsection
52fba9eb79SMartin Schwidefsky .endm
53fba9eb79SMartin Schwidefsky 
54fba9eb79SMartin Schwidefsky #endif	/*  __ASSEMBLY__  */
55fba9eb79SMartin Schwidefsky 
56fba9eb79SMartin Schwidefsky #endif /* _ASM_S390_ALTERNATIVE_ASM_H */
57