Skip to content

Commit a738f9a

Browse files
hansendcZhengShunQian
authored andcommitted
x86/cpufeature: Add helper macro for mask check macros
commit 8eda072 upstream Every time we add a word to our cpu features, we need to add something like this in two places: (((bit)>>5)==16 && (1UL<<((bit)&31) & REQUIRED_MASK16)) The trick is getting the "16" in this case in both places. I've now screwed this up twice, so as pennance, I've come up with this patch to keep me and other poor souls from doing the same. I also commented the logic behind the bit manipulation showcased above. Signed-off-by: Dave Hansen <[email protected]> Cc: Andy Lutomirski <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: Brian Gerst <[email protected]> Cc: Dave Hansen <[email protected]> Cc: Denys Vlasenko <[email protected]> Cc: H. Peter Anvin <[email protected]> Cc: Josh Poimboeuf <[email protected]> Cc: Linus Torvalds <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Thomas Gleixner <[email protected]> Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Ingo Molnar <[email protected]> Signed-off-by: Srivatsa S. Bhat <[email protected]> Reviewed-by: Matt Helsley (VMware) <[email protected]> Reviewed-by: Alexey Makhalov <[email protected]> Reviewed-by: Bo Gan <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent cf06133 commit a738f9a

File tree

1 file changed

+50
-40
lines changed

1 file changed

+50
-40
lines changed

arch/x86/include/asm/cpufeature.h

Lines changed: 50 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -49,48 +49,58 @@ extern const char * const x86_bug_flags[NBUGINTS*32];
4949
#define test_cpu_cap(c, bit) \
5050
test_bit(bit, (unsigned long *)((c)->x86_capability))
5151

52-
#define REQUIRED_MASK_BIT_SET(bit) \
53-
( (((bit)>>5)==0 && (1UL<<((bit)&31) & REQUIRED_MASK0 )) || \
54-
(((bit)>>5)==1 && (1UL<<((bit)&31) & REQUIRED_MASK1 )) || \
55-
(((bit)>>5)==2 && (1UL<<((bit)&31) & REQUIRED_MASK2 )) || \
56-
(((bit)>>5)==3 && (1UL<<((bit)&31) & REQUIRED_MASK3 )) || \
57-
(((bit)>>5)==4 && (1UL<<((bit)&31) & REQUIRED_MASK4 )) || \
58-
(((bit)>>5)==5 && (1UL<<((bit)&31) & REQUIRED_MASK5 )) || \
59-
(((bit)>>5)==6 && (1UL<<((bit)&31) & REQUIRED_MASK6 )) || \
60-
(((bit)>>5)==7 && (1UL<<((bit)&31) & REQUIRED_MASK7 )) || \
61-
(((bit)>>5)==8 && (1UL<<((bit)&31) & REQUIRED_MASK8 )) || \
62-
(((bit)>>5)==9 && (1UL<<((bit)&31) & REQUIRED_MASK9 )) || \
63-
(((bit)>>5)==10 && (1UL<<((bit)&31) & REQUIRED_MASK10)) || \
64-
(((bit)>>5)==11 && (1UL<<((bit)&31) & REQUIRED_MASK11)) || \
65-
(((bit)>>5)==12 && (1UL<<((bit)&31) & REQUIRED_MASK12)) || \
66-
(((bit)>>5)==13 && (1UL<<((bit)&31) & REQUIRED_MASK13)) || \
67-
(((bit)>>5)==14 && (1UL<<((bit)&31) & REQUIRED_MASK14)) || \
68-
(((bit)>>5)==15 && (1UL<<((bit)&31) & REQUIRED_MASK15)) || \
69-
(((bit)>>5)==16 && (1UL<<((bit)&31) & REQUIRED_MASK16)) || \
70-
(((bit)>>5)==17 && (1UL<<((bit)&31) & REQUIRED_MASK17)) || \
71-
REQUIRED_MASK_CHECK || \
52+
/*
53+
* There are 32 bits/features in each mask word. The high bits
54+
* (selected with (bit>>5) give us the word number and the low 5
55+
* bits give us the bit/feature number inside the word.
56+
* (1UL<<((bit)&31) gives us a mask for the feature_bit so we can
57+
* see if it is set in the mask word.
58+
*/
59+
#define CHECK_BIT_IN_MASK_WORD(maskname, word, bit) \
60+
(((bit)>>5)==(word) && (1UL<<((bit)&31) & maskname##word ))
61+
62+
#define REQUIRED_MASK_BIT_SET(feature_bit) \
63+
( CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 0, feature_bit) || \
64+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 1, feature_bit) || \
65+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 2, feature_bit) || \
66+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 3, feature_bit) || \
67+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 4, feature_bit) || \
68+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 5, feature_bit) || \
69+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 6, feature_bit) || \
70+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 7, feature_bit) || \
71+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 8, feature_bit) || \
72+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 9, feature_bit) || \
73+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 10, feature_bit) || \
74+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 11, feature_bit) || \
75+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 12, feature_bit) || \
76+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 13, feature_bit) || \
77+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 14, feature_bit) || \
78+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 15, feature_bit) || \
79+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 16, feature_bit) || \
80+
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 17, feature_bit) || \
81+
REQUIRED_MASK_CHECK || \
7282
BUILD_BUG_ON_ZERO(NCAPINTS != 18))
7383

74-
#define DISABLED_MASK_BIT_SET(bit) \
75-
( (((bit)>>5)==0 && (1UL<<((bit)&31) & DISABLED_MASK0 )) || \
76-
(((bit)>>5)==1 && (1UL<<((bit)&31) & DISABLED_MASK1 )) || \
77-
(((bit)>>5)==2 && (1UL<<((bit)&31) & DISABLED_MASK2 )) || \
78-
(((bit)>>5)==3 && (1UL<<((bit)&31) & DISABLED_MASK3 )) || \
79-
(((bit)>>5)==4 && (1UL<<((bit)&31) & DISABLED_MASK4 )) || \
80-
(((bit)>>5)==5 && (1UL<<((bit)&31) & DISABLED_MASK5 )) || \
81-
(((bit)>>5)==6 && (1UL<<((bit)&31) & DISABLED_MASK6 )) || \
82-
(((bit)>>5)==7 && (1UL<<((bit)&31) & DISABLED_MASK7 )) || \
83-
(((bit)>>5)==8 && (1UL<<((bit)&31) & DISABLED_MASK8 )) || \
84-
(((bit)>>5)==9 && (1UL<<((bit)&31) & DISABLED_MASK9 )) || \
85-
(((bit)>>5)==10 && (1UL<<((bit)&31) & DISABLED_MASK10)) || \
86-
(((bit)>>5)==11 && (1UL<<((bit)&31) & DISABLED_MASK11)) || \
87-
(((bit)>>5)==12 && (1UL<<((bit)&31) & DISABLED_MASK12)) || \
88-
(((bit)>>5)==13 && (1UL<<((bit)&31) & DISABLED_MASK13)) || \
89-
(((bit)>>5)==14 && (1UL<<((bit)&31) & DISABLED_MASK14)) || \
90-
(((bit)>>5)==15 && (1UL<<((bit)&31) & DISABLED_MASK15)) || \
91-
(((bit)>>5)==16 && (1UL<<((bit)&31) & DISABLED_MASK16)) || \
92-
(((bit)>>5)==17 && (1UL<<((bit)&31) & DISABLED_MASK17)) || \
93-
DISABLED_MASK_CHECK || \
84+
#define DISABLED_MASK_BIT_SET(feature_bit) \
85+
( CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 0, feature_bit) || \
86+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 1, feature_bit) || \
87+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 2, feature_bit) || \
88+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 3, feature_bit) || \
89+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 4, feature_bit) || \
90+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 5, feature_bit) || \
91+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 6, feature_bit) || \
92+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 7, feature_bit) || \
93+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 8, feature_bit) || \
94+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 9, feature_bit) || \
95+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 10, feature_bit) || \
96+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 11, feature_bit) || \
97+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 12, feature_bit) || \
98+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 13, feature_bit) || \
99+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 14, feature_bit) || \
100+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 15, feature_bit) || \
101+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 16, feature_bit) || \
102+
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 17, feature_bit) || \
103+
DISABLED_MASK_CHECK || \
94104
BUILD_BUG_ON_ZERO(NCAPINTS != 18))
95105

96106
#define cpu_has(c, bit) \

0 commit comments

Comments
 (0)