1 #ifndef _ASM_X86_ALTERNATIVE_ASM_H 2 #define _ASM_X86_ALTERNATIVE_ASM_H 3 4 #ifdef __ASSEMBLY__ 5 6 #include <asm/asm.h> 7 8 #ifdef CONFIG_SMP 9 .macro LOCK_PREFIX 10 672: lock 11 .pushsection .smp_locks,"a" 12 .balign 4 13 .long 672b - . 14 .popsection 15 .endm 16 #else 17 .macro LOCK_PREFIX 18 .endm 19 #endif 20 21 .macro altinstruction_entry orig alt feature orig_len alt_len pad_len 22 .long \orig - . 23 .long \alt - . 24 .word \feature 25 .byte \orig_len 26 .byte \alt_len 27 .byte \pad_len 28 .endm 29 30 .macro ALTERNATIVE oldinstr, newinstr, feature 31 140: 32 \oldinstr 33 141: 34 .skip -(((144f-143f)-(141b-140b)) > 0) * ((144f-143f)-(141b-140b)),0x90 35 142: 36 37 .pushsection .altinstructions,"a" 38 altinstruction_entry 140b,143f,\feature,142b-140b,144f-143f,142b-141b 39 .popsection 40 41 .pushsection .altinstr_replacement,"ax" 42 143: 43 \newinstr 44 144: 45 .popsection 46 .endm 47 48 #define old_len 141b-140b 49 #define new_len1 144f-143f 50 #define new_len2 145f-144f 51 52 /* 53 * max without conditionals. Idea adapted from: 54 * http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax 55 */ 56 #define alt_max_short(a, b) ((a) ^ (((a) ^ (b)) & -(-((a) < (b))))) 57 58 .macro ALTERNATIVE_2 oldinstr, newinstr1, feature1, newinstr2, feature2 59 140: 60 \oldinstr 61 141: 62 .skip -((alt_max_short(new_len1, new_len2) - (old_len)) > 0) * \ 63 (alt_max_short(new_len1, new_len2) - (old_len)),0x90 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 .pushsection .altinstr_replacement,"ax" 72 143: 73 \newinstr1 74 144: 75 \newinstr2 76 145: 77 .popsection 78 .endm 79 80 #endif /* __ASSEMBLY__ */ 81 82 #endif /* _ASM_X86_ALTERNATIVE_ASM_H */ 83