diff options
author | Srikar Dronamraju <srikar@linux.vnet.ibm.com> | 2012-02-22 04:15:35 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2012-02-22 05:26:07 -0500 |
commit | 04a3d984d32e47983770d314cdb4e4d8f38fccb7 (patch) | |
tree | 745009e7dea5cdf57a1c8e82d050478fab3f3da5 /arch/x86/kernel/uprobes.c | |
parent | a5f4374a9610fd7286c2164d4e680436727eff71 (diff) |
uprobes/core: Make instruction tables volatile
Some versions of gcc spits a warning about the asm operand for
test_bit and also causes the first long of the instruction table
to be output.
Fix is similar to 7115e3fc on arch/x86/kernel/kprobes.c
Signed-off-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Anton Arapov <anton@redhat.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: Jim Keniston <jkenisto@linux.vnet.ibm.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Josh Stone <jistone@redhat.com>
Link: http://lkml.kernel.org/r/20120222091535.15880.12502.sendpatchset@srdronam.in.ibm.com
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/uprobes.c')
-rw-r--r-- | arch/x86/kernel/uprobes.c | 61 |
1 files changed, 32 insertions, 29 deletions
diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c index cf2a18498425..13d616d6519b 100644 --- a/arch/x86/kernel/uprobes.c +++ b/arch/x86/kernel/uprobes.c | |||
@@ -53,34 +53,12 @@ | |||
53 | (bc##UL << 0xc)|(bd##UL << 0xd)|(be##UL << 0xe)|(bf##UL << 0xf)) \ | 53 | (bc##UL << 0xc)|(bd##UL << 0xd)|(be##UL << 0xe)|(bf##UL << 0xf)) \ |
54 | << (row % 32)) | 54 | << (row % 32)) |
55 | 55 | ||
56 | #ifdef CONFIG_X86_64 | 56 | /* |
57 | static u32 good_insns_64[256 / 32] = { | 57 | * Good-instruction tables for 32-bit apps. This is non-const and volatile |
58 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | 58 | * to keep gcc from statically optimizing it out, as variable_test_bit makes |
59 | /* ---------------------------------------------- */ | 59 | * some versions of gcc to think only *(unsigned long*) is used. |
60 | W(0x00, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0) | /* 00 */ | 60 | */ |
61 | W(0x10, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0) , /* 10 */ | 61 | static volatile u32 good_insns_32[256 / 32] = { |
62 | W(0x20, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0) | /* 20 */ | ||
63 | W(0x30, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0) , /* 30 */ | ||
64 | W(0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) | /* 40 */ | ||
65 | W(0x50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* 50 */ | ||
66 | W(0x60, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0) | /* 60 */ | ||
67 | W(0x70, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* 70 */ | ||
68 | W(0x80, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* 80 */ | ||
69 | W(0x90, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* 90 */ | ||
70 | W(0xa0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* a0 */ | ||
71 | W(0xb0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* b0 */ | ||
72 | W(0xc0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0) | /* c0 */ | ||
73 | W(0xd0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* d0 */ | ||
74 | W(0xe0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0) | /* e0 */ | ||
75 | W(0xf0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1) /* f0 */ | ||
76 | /* ---------------------------------------------- */ | ||
77 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | ||
78 | }; | ||
79 | #endif | ||
80 | |||
81 | /* Good-instruction tables for 32-bit apps */ | ||
82 | |||
83 | static u32 good_insns_32[256 / 32] = { | ||
84 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | 62 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ |
85 | /* ---------------------------------------------- */ | 63 | /* ---------------------------------------------- */ |
86 | W(0x00, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0) | /* 00 */ | 64 | W(0x00, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0) | /* 00 */ |
@@ -104,7 +82,7 @@ static u32 good_insns_32[256 / 32] = { | |||
104 | }; | 82 | }; |
105 | 83 | ||
106 | /* Using this for both 64-bit and 32-bit apps */ | 84 | /* Using this for both 64-bit and 32-bit apps */ |
107 | static u32 good_2byte_insns[256 / 32] = { | 85 | static volatile u32 good_2byte_insns[256 / 32] = { |
108 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | 86 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ |
109 | /* ---------------------------------------------- */ | 87 | /* ---------------------------------------------- */ |
110 | W(0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1) | /* 00 */ | 88 | W(0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1) | /* 00 */ |
@@ -127,6 +105,31 @@ static u32 good_2byte_insns[256 / 32] = { | |||
127 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | 105 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ |
128 | }; | 106 | }; |
129 | 107 | ||
108 | #ifdef CONFIG_X86_64 | ||
109 | /* Good-instruction tables for 64-bit apps */ | ||
110 | static volatile u32 good_insns_64[256 / 32] = { | ||
111 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | ||
112 | /* ---------------------------------------------- */ | ||
113 | W(0x00, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0) | /* 00 */ | ||
114 | W(0x10, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0) , /* 10 */ | ||
115 | W(0x20, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0) | /* 20 */ | ||
116 | W(0x30, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0) , /* 30 */ | ||
117 | W(0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) | /* 40 */ | ||
118 | W(0x50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* 50 */ | ||
119 | W(0x60, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0) | /* 60 */ | ||
120 | W(0x70, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* 70 */ | ||
121 | W(0x80, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* 80 */ | ||
122 | W(0x90, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* 90 */ | ||
123 | W(0xa0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* a0 */ | ||
124 | W(0xb0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* b0 */ | ||
125 | W(0xc0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0) | /* c0 */ | ||
126 | W(0xd0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* d0 */ | ||
127 | W(0xe0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0) | /* e0 */ | ||
128 | W(0xf0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1) /* f0 */ | ||
129 | /* ---------------------------------------------- */ | ||
130 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | ||
131 | }; | ||
132 | #endif | ||
130 | #undef W | 133 | #undef W |
131 | 134 | ||
132 | /* | 135 | /* |