diff options
| -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 | /* |
