diff options
author | Oleg Nesterov <oleg@redhat.com> | 2014-04-19 10:07:15 -0400 |
---|---|---|
committer | Oleg Nesterov <oleg@redhat.com> | 2014-04-30 13:10:35 -0400 |
commit | 8dbacad93a2a12adebcc717e6055b1bcc1739ab8 (patch) | |
tree | 30304d63a8174762bf68e1dc271390c0eaec39ed /arch | |
parent | ff261964cfcfe49d73690ca29b0ba2853d9497e3 (diff) |
uprobes/x86: Make good_insns_* depend on CONFIG_X86_*
Add the suitable ifdef's around good_insns_* arrays. We do not want
to add the ugly ifdef's into their only user, uprobe_init_insn(), so
the "#else" branch simply defines them as NULL. This doesn't generate
the extra code, gcc is smart enough, although the code is fine even if
it could not detect that (without CONFIG_IA32_EMULATION) is_64bit_mm()
is __builtin_constant_p().
The patch looks more complicated because it also moves good_insns_64
up close to good_insns_32.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Reviewed-by: Jim Keniston <jkenisto@us.ibm.com>
Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kernel/uprobes.c | 56 |
1 files changed, 32 insertions, 24 deletions
diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c index 98d7db50f425..892975b3c99c 100644 --- a/arch/x86/kernel/uprobes.c +++ b/arch/x86/kernel/uprobes.c | |||
@@ -64,6 +64,7 @@ | |||
64 | * to keep gcc from statically optimizing it out, as variable_test_bit makes | 64 | * to keep gcc from statically optimizing it out, as variable_test_bit makes |
65 | * some versions of gcc to think only *(unsigned long*) is used. | 65 | * some versions of gcc to think only *(unsigned long*) is used. |
66 | */ | 66 | */ |
67 | #if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION) | ||
67 | static volatile u32 good_insns_32[256 / 32] = { | 68 | static volatile u32 good_insns_32[256 / 32] = { |
68 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | 69 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ |
69 | /* ---------------------------------------------- */ | 70 | /* ---------------------------------------------- */ |
@@ -86,32 +87,12 @@ static volatile u32 good_insns_32[256 / 32] = { | |||
86 | /* ---------------------------------------------- */ | 87 | /* ---------------------------------------------- */ |
87 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | 88 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ |
88 | }; | 89 | }; |
89 | 90 | #else | |
90 | /* Using this for both 64-bit and 32-bit apps */ | 91 | #define good_insns_32 NULL |
91 | static volatile u32 good_2byte_insns[256 / 32] = { | 92 | #endif |
92 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | ||
93 | /* ---------------------------------------------- */ | ||
94 | W(0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1) | /* 00 */ | ||
95 | W(0x10, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1) , /* 10 */ | ||
96 | W(0x20, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1) | /* 20 */ | ||
97 | W(0x30, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) , /* 30 */ | ||
98 | W(0x40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* 40 */ | ||
99 | W(0x50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* 50 */ | ||
100 | W(0x60, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* 60 */ | ||
101 | W(0x70, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1) , /* 70 */ | ||
102 | W(0x80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* 80 */ | ||
103 | W(0x90, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* 90 */ | ||
104 | W(0xa0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1) | /* a0 */ | ||
105 | W(0xb0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1) , /* b0 */ | ||
106 | W(0xc0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* c0 */ | ||
107 | W(0xd0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* d0 */ | ||
108 | W(0xe0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* e0 */ | ||
109 | W(0xf0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0) /* f0 */ | ||
110 | /* ---------------------------------------------- */ | ||
111 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | ||
112 | }; | ||
113 | 93 | ||
114 | /* Good-instruction tables for 64-bit apps */ | 94 | /* Good-instruction tables for 64-bit apps */ |
95 | #if defined(CONFIG_X86_64) | ||
115 | static volatile u32 good_insns_64[256 / 32] = { | 96 | static volatile u32 good_insns_64[256 / 32] = { |
116 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | 97 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ |
117 | /* ---------------------------------------------- */ | 98 | /* ---------------------------------------------- */ |
@@ -134,6 +115,33 @@ static volatile u32 good_insns_64[256 / 32] = { | |||
134 | /* ---------------------------------------------- */ | 115 | /* ---------------------------------------------- */ |
135 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | 116 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ |
136 | }; | 117 | }; |
118 | #else | ||
119 | #define good_insns_64 NULL | ||
120 | #endif | ||
121 | |||
122 | /* Using this for both 64-bit and 32-bit apps */ | ||
123 | static volatile u32 good_2byte_insns[256 / 32] = { | ||
124 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | ||
125 | /* ---------------------------------------------- */ | ||
126 | W(0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1) | /* 00 */ | ||
127 | W(0x10, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1) , /* 10 */ | ||
128 | W(0x20, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1) | /* 20 */ | ||
129 | W(0x30, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) , /* 30 */ | ||
130 | W(0x40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* 40 */ | ||
131 | W(0x50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* 50 */ | ||
132 | W(0x60, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* 60 */ | ||
133 | W(0x70, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1) , /* 70 */ | ||
134 | W(0x80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* 80 */ | ||
135 | W(0x90, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* 90 */ | ||
136 | W(0xa0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1) | /* a0 */ | ||
137 | W(0xb0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1) , /* b0 */ | ||
138 | W(0xc0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* c0 */ | ||
139 | W(0xd0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* d0 */ | ||
140 | W(0xe0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* e0 */ | ||
141 | W(0xf0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0) /* f0 */ | ||
142 | /* ---------------------------------------------- */ | ||
143 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | ||
144 | }; | ||
137 | #undef W | 145 | #undef W |
138 | 146 | ||
139 | /* | 147 | /* |