|
@@ -1,6 +1,8 @@
|
|
|
#ifndef __ASM_ALTERNATIVE_H
|
|
|
#define __ASM_ALTERNATIVE_H
|
|
|
|
|
|
+#ifndef __ASSEMBLY__
|
|
|
+
|
|
|
#include <linux/types.h>
|
|
|
#include <linux/stddef.h>
|
|
|
#include <linux/stringify.h>
|
|
@@ -41,4 +43,29 @@ void free_alternatives_memory(void);
|
|
|
" .error \"Alternatives instruction length mismatch\"\n\t"\
|
|
|
".endif\n"
|
|
|
|
|
|
+#else
|
|
|
+
|
|
|
+.macro altinstruction_entry orig_offset alt_offset feature orig_len alt_len
|
|
|
+ .word \orig_offset - .
|
|
|
+ .word \alt_offset - .
|
|
|
+ .hword \feature
|
|
|
+ .byte \orig_len
|
|
|
+ .byte \alt_len
|
|
|
+.endm
|
|
|
+
|
|
|
+.macro alternative_insn insn1 insn2 cap
|
|
|
+661: \insn1
|
|
|
+662: .pushsection .altinstructions, "a"
|
|
|
+ altinstruction_entry 661b, 663f, \cap, 662b-661b, 664f-663f
|
|
|
+ .popsection
|
|
|
+ .pushsection .altinstr_replacement, "ax"
|
|
|
+663: \insn2
|
|
|
+664: .popsection
|
|
|
+ .if ((664b-663b) != (662b-661b))
|
|
|
+ .error "Alternatives instruction length mismatch"
|
|
|
+ .endif
|
|
|
+.endm
|
|
|
+
|
|
|
+#endif /* __ASSEMBLY__ */
|
|
|
+
|
|
|
#endif /* __ASM_ALTERNATIVE_H */
|