Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/loongarch/include/asm/alternative-asm.h
26488 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
#ifndef _ASM_ALTERNATIVE_ASM_H
3
#define _ASM_ALTERNATIVE_ASM_H
4
5
#ifdef __ASSEMBLER__
6
7
#include <asm/asm.h>
8
9
/*
10
* Issue one struct alt_instr descriptor entry (need to put it into
11
* the section .altinstructions, see below). This entry contains
12
* enough information for the alternatives patching code to patch an
13
* instruction. See apply_alternatives().
14
*/
15
.macro altinstruction_entry orig alt feature orig_len alt_len
16
.long \orig - .
17
.long \alt - .
18
.short \feature
19
.byte \orig_len
20
.byte \alt_len
21
.endm
22
23
/*
24
* Define an alternative between two instructions. If @feature is
25
* present, early code in apply_alternatives() replaces @oldinstr with
26
* @newinstr. ".fill" directive takes care of proper instruction padding
27
* in case @newinstr is longer than @oldinstr.
28
*/
29
.macro ALTERNATIVE oldinstr, newinstr, feature
30
140 :
31
\oldinstr
32
141 :
33
.fill - (((144f-143f)-(141b-140b)) > 0) * ((144f-143f)-(141b-140b)) / 4, 4, 0x03400000
34
142 :
35
36
.pushsection .altinstructions, "a"
37
altinstruction_entry 140b, 143f, \feature, 142b-140b, 144f-143f
38
.popsection
39
40
.subsection 1
41
143 :
42
\newinstr
43
144 :
44
.previous
45
.endm
46
47
#define old_len (141b-140b)
48
#define new_len1 (144f-143f)
49
#define new_len2 (145f-144f)
50
51
#define alt_max_short(a, b) ((a) ^ (((a) ^ (b)) & -(-((a) < (b)))))
52
53
/*
54
* Same as ALTERNATIVE macro above but for two alternatives. If CPU
55
* has @feature1, it replaces @oldinstr with @newinstr1. If CPU has
56
* @feature2, it replaces @oldinstr with @feature2.
57
*/
58
.macro ALTERNATIVE_2 oldinstr, newinstr1, feature1, newinstr2, feature2
59
140 :
60
\oldinstr
61
141 :
62
.fill - ((alt_max_short(new_len1, new_len2) - (old_len)) > 0) * \
63
(alt_max_short(new_len1, new_len2) - (old_len)) / 4, 4, 0x03400000
64
142 :
65
66
.pushsection .altinstructions, "a"
67
altinstruction_entry 140b, 143f, \feature1, 142b-140b, 144f-143f, 142b-141b
68
altinstruction_entry 140b, 144f, \feature2, 142b-140b, 145f-144f, 142b-141b
69
.popsection
70
71
.subsection 1
72
143 :
73
\newinstr1
74
144 :
75
\newinstr2
76
145 :
77
.previous
78
.endm
79
80
#endif /* __ASSEMBLER__ */
81
82
#endif /* _ASM_ALTERNATIVE_ASM_H */
83
84