Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. | 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. |
| 3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
| 4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
| 5 */ | 5 */ |
| 6 | 6 |
| 7 #include <assert.h> | 7 #include <assert.h> |
| 8 #include <errno.h> | 8 #include <errno.h> |
| 9 #include <stddef.h> | 9 #include <stddef.h> |
| 10 #include <stdio.h> | 10 #include <stdio.h> |
| 11 #include <stdlib.h> | 11 #include <stdlib.h> |
| 12 #include <string.h> | 12 #include <string.h> |
| 13 | 13 |
| 14 #include "native_client/src/trusted/validator_ragel/unreviewed/validator_interna l.h" | 14 #include "native_client/src/trusted/validator_ragel/validator_internal.h" |
| 15 | 15 |
| 16 %%{ | 16 %%{ |
| 17 machine x86_64_validator; | 17 machine x86_64_validator; |
| 18 alphtype unsigned char; | 18 alphtype unsigned char; |
| 19 variable p current_position; | 19 variable p current_position; |
| 20 variable pe end_of_bundle; | 20 variable pe end_of_bundle; |
| 21 variable eof end_of_bundle; | 21 variable eof end_of_bundle; |
| 22 variable cs current_state; | 22 variable cs current_state; |
| 23 | 23 |
| 24 include byte_machine "byte_machines.rl"; | 24 include byte_machine "byte_machines.rl"; |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 117 rbp_sandboxing = | 117 rbp_sandboxing = |
| 118 (b_0100_11x0 0x01 0xfd | # add %r15,%rbp | 118 (b_0100_11x0 0x01 0xfd | # add %r15,%rbp |
| 119 b_0100_10x1 0x03 0xef | # add %r15,%rbp | 119 b_0100_10x1 0x03 0xef | # add %r15,%rbp |
| 120 0x49 0x8d 0x2c 0x2f | # lea (%r15,%rbp,1),%rbp | 120 0x49 0x8d 0x2c 0x2f | # lea (%r15,%rbp,1),%rbp |
| 121 0x4a 0x8d 0x6c 0x3d 0x00) # lea 0x0(%rbp,%r15,1),%rbp | 121 0x4a 0x8d 0x6c 0x3d 0x00) # lea 0x0(%rbp,%r15,1),%rbp |
| 122 @{ if (restricted_register == REG_RBP) | 122 @{ if (restricted_register == REG_RBP) |
| 123 instruction_info_collected |= RESTRICTED_REGISTER_USED; | 123 instruction_info_collected |= RESTRICTED_REGISTER_USED; |
| 124 else | 124 else |
| 125 instruction_info_collected |= UNRESTRICTED_RBP_PROCESSED; | 125 instruction_info_collected |= UNRESTRICTED_RBP_PROCESSED; |
| 126 restricted_register = NO_REG; | 126 restricted_register = NO_REG; |
| 127 BitmapClearBit(valid_targets, (instruction_start - data)); | 127 MakeJumpTargetInvalid((instruction_start - data), valid_targets); |
| 128 }; | 128 }; |
| 129 | 129 |
| 130 # Special %rbp modifications without required sandboxing | 130 # Special %rbp modifications without required sandboxing |
| 131 rsp_modifications = | 131 rsp_modifications = |
| 132 (b_0100_10x0 0x89 0xec) | # mov %rbp,%rsp | 132 (b_0100_10x0 0x89 0xec) | # mov %rbp,%rsp |
| 133 (b_0100_10x0 0x8b 0xe5) | # mov %rbp,%rsp | 133 (b_0100_10x0 0x8b 0xe5) | # mov %rbp,%rsp |
| 134 #(b_0100_1xx0 0x81 0xe4 any{3} (0x80 .. 0xff)) | # and $XXX,%rsp | 134 #(b_0100_1xx0 0x81 0xe4 any{3} (0x80 .. 0xff)) | # and $XXX,%rsp |
| 135 #Superfluous bits are not supported: | 135 #Superfluous bits are not supported: |
| 136 # http://code.google.com/p/nativeclient/issues/detail?id=3012 | 136 # http://code.google.com/p/nativeclient/issues/detail?id=3012 |
| 137 (b_0100_1000 0x83 0xe4 (0x80 .. 0xff)) # and $XXX,%rsp | 137 (b_0100_1000 0x83 0xe4 (0x80 .. 0xff)) # and $XXX,%rsp |
| 138 @process_0_operands; | 138 @process_0_operands; |
| 139 | 139 |
| 140 # Special instructions used for %rbp sandboxing | 140 # Special instructions used for %rbp sandboxing |
| 141 rsp_sandboxing = | 141 rsp_sandboxing = |
| 142 (b_0100_11x0 0x01 0xfc | # add %r15,%rsp | 142 (b_0100_11x0 0x01 0xfc | # add %r15,%rsp |
| 143 b_0100_10x1 0x03 0xe7 | # add %r15,%rbp | 143 b_0100_10x1 0x03 0xe7 | # add %r15,%rbp |
| 144 0x4a 0x8d 0x24 0x3c) # lea (%rsp,%r15,1),%rsp | 144 0x4a 0x8d 0x24 0x3c) # lea (%rsp,%r15,1),%rsp |
| 145 @{ if (restricted_register == REG_RSP) | 145 @{ if (restricted_register == REG_RSP) |
| 146 instruction_info_collected |= RESTRICTED_REGISTER_USED; | 146 instruction_info_collected |= RESTRICTED_REGISTER_USED; |
| 147 else | 147 else |
| 148 instruction_info_collected |= UNRESTRICTED_RSP_PROCESSED; | 148 instruction_info_collected |= UNRESTRICTED_RSP_PROCESSED; |
| 149 restricted_register = NO_REG; | 149 restricted_register = NO_REG; |
| 150 BitmapClearBit(valid_targets, (instruction_start - data)); | 150 MakeJumpTargetInvalid((instruction_start - data), valid_targets); |
| 151 }; | 151 }; |
| 152 | 152 |
| 153 # naclcall or nacljmp. Note: first "and $~0x1f, %eXX" is a normal instruction | 153 # naclcall or nacljmp. Note: first "and $~0x1f, %eXX" is a normal instruction |
| 154 # and as such will detect case where %rbp/%rsp is illegally modified. | 154 # and as such will detect case where %rbp/%rsp is illegally modified. |
|
Brad Chen
2012/09/29 00:06:00
Suggestion for comment:
## REGISTER USAGE ABBREVIA
khim
2012/10/03 22:30:10
Done.
| |
| 155 naclcall_or_nacljmp = | 155 naclcall_or_nacljmp = |
| 156 # and $~0x1f, %eax/%ecx/%edx/%ebx/%esp/%ebp/%esi/%edi | 156 # and $~0x1f, %eax/%ecx/%edx/%ebx/%esp/%ebp/%esi/%edi |
| 157 (0x83 (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7) 0xe0 | 157 (0x83 (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7) 0xe0 |
| 158 # add %r15,%rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi | 158 # add %r15,%rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi |
| 159 b_0100_11x0 0x01 (0xf8|0xf9|0xfa|0xfb|0xfc|0xfd|0xfe|0xff) | 159 b_0100_11x0 0x01 (0xf8|0xf9|0xfa|0xfb|0xfc|0xfd|0xfe|0xff) |
| 160 # callq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi | 160 # callq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi |
| 161 ((REX_WRX? 0xff (0xd0|0xd1|0xd2|0xd3|0xd4|0xd5|0xd6|0xd7)) | | 161 ((REX_WRX? 0xff (0xd0|0xd1|0xd2|0xd3|0xd4|0xd5|0xd6|0xd7)) | |
| 162 # jmpq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi | 162 # jmpq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi |
| 163 (REX_WRX? 0xff (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7)))) | 163 (REX_WRX? 0xff (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7)))) |
| 164 @{ | 164 @{ |
| 165 instruction_start -= 6; | 165 instruction_start -= 6; |
| 166 if (RMFromModRM(instruction_start[1]) != | 166 if (RMFromModRM(instruction_start[1]) != |
| 167 RMFromModRM(instruction_start[5]) || | 167 RMFromModRM(instruction_start[5]) || |
| 168 RMFromModRM(instruction_start[1]) != RMFromModRM(*current_position)) | 168 RMFromModRM(instruction_start[1]) != RMFromModRM(*current_position)) |
| 169 instruction_info_collected |= UNRECOGNIZED_INSTRUCTION; | 169 instruction_info_collected |= UNRECOGNIZED_INSTRUCTION; |
| 170 BitmapClearBit(valid_targets, (instruction_start - data) + 3); | 170 MakeJumpTargetInvalid((instruction_start - data) + 3, valid_targets); |
| 171 BitmapClearBit(valid_targets, (instruction_start - data) + 6); | 171 MakeJumpTargetInvalid((instruction_start - data) + 6, valid_targets); |
| 172 restricted_register = NO_REG; | 172 restricted_register = NO_REG; |
| 173 } | | 173 } | |
| 174 | 174 |
| 175 # and $~0x1f, %eax/%ecx/%edx/%ebx/%esp/%ebp/%esi/%edi | 175 # and $~0x1f, %eax/%ecx/%edx/%ebx/%esp/%ebp/%esi/%edi |
| 176 (0x83 (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7) 0xe0 | 176 (0x83 (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7) 0xe0 |
| 177 # add %r15,%rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi | 177 # add %r15,%rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi |
| 178 b_0100_10x1 0x03 (0xc7|0xcf|0xd7|0xdf|0xe7|0xef|0xf7|0xff) | 178 b_0100_10x1 0x03 (0xc7|0xcf|0xd7|0xdf|0xe7|0xef|0xf7|0xff) |
| 179 # callq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi | 179 # callq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi |
| 180 ((REX_WRX? 0xff (0xd0|0xd1|0xd2|0xd3|0xd4|0xd5|0xd6|0xd7)) | | 180 ((REX_WRX? 0xff (0xd0|0xd1|0xd2|0xd3|0xd4|0xd5|0xd6|0xd7)) | |
| 181 # jmpq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi | 181 # jmpq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi |
| 182 (REX_WRX? 0xff (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7)))) | 182 (REX_WRX? 0xff (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7)))) |
| 183 @{ | 183 @{ |
| 184 instruction_start -= 6; | 184 instruction_start -= 6; |
| 185 if (RMFromModRM(instruction_start[1]) != | 185 if (RMFromModRM(instruction_start[1]) != |
| 186 RegFromModRM(instruction_start[5]) || | 186 RegFromModRM(instruction_start[5]) || |
| 187 RMFromModRM(instruction_start[1]) != RMFromModRM(*current_position)) | 187 RMFromModRM(instruction_start[1]) != RMFromModRM(*current_position)) |
| 188 instruction_info_collected |= UNRECOGNIZED_INSTRUCTION; | 188 instruction_info_collected |= UNRECOGNIZED_INSTRUCTION; |
| 189 BitmapClearBit(valid_targets, (instruction_start - data) + 3); | 189 MakeJumpTargetInvalid((instruction_start - data) + 3, valid_targets); |
| 190 BitmapClearBit(valid_targets, (instruction_start - data) + 6); | 190 MakeJumpTargetInvalid((instruction_start - data) + 6, valid_targets); |
| 191 restricted_register = NO_REG; | 191 restricted_register = NO_REG; |
| 192 } | | 192 } | |
| 193 | 193 |
| 194 # rex.R?X? and $~0x1f, %eax/%ecx/%edx/%ebx/%esp/%ebp/%esi/%edi | 194 # rex.R?X? and $~0x1f, %eax/%ecx/%edx/%ebx/%esp/%ebp/%esi/%edi |
| 195 ((REX_RX 0x83 (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7) 0xe0 | 195 ((REX_RX 0x83 (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7) 0xe0 |
| 196 # add %r15,%rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi | 196 # add %r15,%rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi |
| 197 b_0100_11x0 0x01 (0xf8|0xf9|0xfa|0xfb|0xfc|0xfd|0xfe|0xff) | 197 b_0100_11x0 0x01 (0xf8|0xf9|0xfa|0xfb|0xfc|0xfd|0xfe|0xff) |
| 198 # callq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi | 198 # callq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi |
| 199 ((REX_WRX? 0xff (0xd0|0xd1|0xd2|0xd3|0xd4|0xd5|0xd6|0xd7)) | | 199 ((REX_WRX? 0xff (0xd0|0xd1|0xd2|0xd3|0xd4|0xd5|0xd6|0xd7)) | |
| 200 # jmpq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi | 200 # jmpq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi |
| 201 (REX_WRX? 0xff (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7)))) | | 201 (REX_WRX? 0xff (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7)))) | |
| 202 | 202 |
| 203 # and $~0x1f, %r8d/%r9d/%r10d/%r11d/%r12d/%r13d/%r14d | 203 # and $~0x1f, %r8d/%r9d/%r10d/%r11d/%r12d/%r13d/%r14d |
| 204 (b_0100_0xx1 0x83 (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6) 0xe0 | 204 (b_0100_0xx1 0x83 (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6) 0xe0 |
| 205 # add %r15, %r8d/%r9d/%r10d/%r11d/%r12d/%r13d/%r14d | 205 # add %r15, %r8d/%r9d/%r10d/%r11d/%r12d/%r13d/%r14d |
| 206 b_0100_11x1 0x01 (0xf8|0xf9|0xfa|0xfb|0xfc|0xfd|0xfe) | 206 b_0100_11x1 0x01 (0xf8|0xf9|0xfa|0xfb|0xfc|0xfd|0xfe) |
| 207 # callq %r8/%r9/%r10/%r11/%r12/%r13/%r14 | 207 # callq %r8/%r9/%r10/%r11/%r12/%r13/%r14 |
| 208 ((b_0100_xxx1 0xff (0xd0|0xd1|0xd2|0xd3|0xd4|0xd5|0xd6)) | | 208 ((b_0100_xxx1 0xff (0xd0|0xd1|0xd2|0xd3|0xd4|0xd5|0xd6)) | |
| 209 # jmpq %r8/%r9/%r10/%r11/%r12/%r13/%r14 | 209 # jmpq %r8/%r9/%r10/%r11/%r12/%r13/%r14 |
| 210 (b_0100_xxx1 0xff (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6))))) | 210 (b_0100_xxx1 0xff (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6))))) |
| 211 @{ | 211 @{ |
| 212 instruction_start -= 7; | 212 instruction_start -= 7; |
| 213 if (RMFromModRM(instruction_start[2]) != | 213 if (RMFromModRM(instruction_start[2]) != |
| 214 RMFromModRM(instruction_start[6]) || | 214 RMFromModRM(instruction_start[6]) || |
| 215 RMFromModRM(instruction_start[2]) != RMFromModRM(*current_position)) | 215 RMFromModRM(instruction_start[2]) != RMFromModRM(*current_position)) |
| 216 instruction_info_collected |= UNRECOGNIZED_INSTRUCTION; | 216 instruction_info_collected |= UNRECOGNIZED_INSTRUCTION; |
| 217 BitmapClearBit(valid_targets, (instruction_start - data) + 4); | 217 MakeJumpTargetInvalid((instruction_start - data) + 4, valid_targets); |
| 218 BitmapClearBit(valid_targets, (instruction_start - data) + 7); | 218 MakeJumpTargetInvalid((instruction_start - data) + 7, valid_targets); |
| 219 restricted_register = NO_REG; | 219 restricted_register = NO_REG; |
| 220 } | | 220 } | |
| 221 | 221 |
| 222 # rex.R?X? and $~0x1f, %eax/%ecx/%edx/%ebx/%esp/%ebp/%esi/%edi | 222 # rex.R?X? and $~0x1f, %eax/%ecx/%edx/%ebx/%esp/%ebp/%esi/%edi |
| 223 ((REX_RX 0x83 (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7) 0xe0 | 223 ((REX_RX 0x83 (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7) 0xe0 |
| 224 # add %r15,%rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi | 224 # add %r15,%rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi |
| 225 b_0100_10x1 0x03 (0xc7|0xcf|0xd7|0xdf|0xe7|0xef|0xf7|0xff) | 225 b_0100_10x1 0x03 (0xc7|0xcf|0xd7|0xdf|0xe7|0xef|0xf7|0xff) |
| 226 # callq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi | 226 # callq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi |
| 227 ((REX_WRX? 0xff (0xd0|0xd1|0xd2|0xd3|0xd4|0xd5|0xd6|0xd7)) | | 227 ((REX_WRX? 0xff (0xd0|0xd1|0xd2|0xd3|0xd4|0xd5|0xd6|0xd7)) | |
| 228 # jmpq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi | 228 # jmpq %rax/%rcx/%rdx/%rbx/%rsp/%rbp/%rsi/%rdi |
| 229 (REX_WRX? 0xff (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7)))) | | 229 (REX_WRX? 0xff (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6|0xe7)))) | |
| 230 | 230 |
| 231 # and $~0x1f, %r8d/%r9d/%r10d/%r11d/%r12d/%r13d/%r14d | 231 # and $~0x1f, %r8d/%r9d/%r10d/%r11d/%r12d/%r13d/%r14d |
| 232 (b_0100_0xx1 0x83 (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6) 0xe0 | 232 (b_0100_0xx1 0x83 (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6) 0xe0 |
| 233 # add %r15, %r8d/%r9d/%r10d/%r11d/%r12d/%r13d/%r14d | 233 # add %r15, %r8d/%r9d/%r10d/%r11d/%r12d/%r13d/%r14d |
| 234 b_0100_11x1 0x03 (0xc7|0xcf|0xd7|0xdf|0xe7|0xef|0xf7) | 234 b_0100_11x1 0x03 (0xc7|0xcf|0xd7|0xdf|0xe7|0xef|0xf7) |
| 235 # callq %r8/%r9/%r10/%r11/%r12/%r13/%r14 | 235 # callq %r8/%r9/%r10/%r11/%r12/%r13/%r14 |
| 236 ((b_0100_xxx1 0xff (0xd0|0xd1|0xd2|0xd3|0xd4|0xd5|0xd6)) | | 236 ((b_0100_xxx1 0xff (0xd0|0xd1|0xd2|0xd3|0xd4|0xd5|0xd6)) | |
| 237 # jmpq %r8/%r9/%r10/%r11/%r12/%r13/%r14 | 237 # jmpq %r8/%r9/%r10/%r11/%r12/%r13/%r14 |
| 238 (b_0100_xxx1 0xff (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6))))) | 238 (b_0100_xxx1 0xff (0xe0|0xe1|0xe2|0xe3|0xe4|0xe5|0xe6))))) |
| 239 @{ | 239 @{ |
| 240 instruction_start -= 7; | 240 instruction_start -= 7; |
| 241 if (RMFromModRM(instruction_start[2]) != | 241 if (RMFromModRM(instruction_start[2]) != |
| 242 RegFromModRM(instruction_start[6]) || | 242 RegFromModRM(instruction_start[6]) || |
| 243 RMFromModRM(instruction_start[2]) != RMFromModRM(*current_position)) | 243 RMFromModRM(instruction_start[2]) != RMFromModRM(*current_position)) |
| 244 instruction_info_collected |= UNRECOGNIZED_INSTRUCTION; | 244 instruction_info_collected |= UNRECOGNIZED_INSTRUCTION; |
| 245 BitmapClearBit(valid_targets, (instruction_start - data) + 4); | 245 MakeJumpTargetInvalid((instruction_start - data) + 4, valid_targets); |
| 246 BitmapClearBit(valid_targets, (instruction_start - data) + 7); | 246 MakeJumpTargetInvalid((instruction_start - data) + 7, valid_targets); |
| 247 restricted_register = NO_REG; | 247 restricted_register = NO_REG; |
| 248 }; | 248 }; |
| 249 | 249 |
| 250 # EMMS/SSE2/AVX instructions which have implicit %ds:(%rsi) operand | 250 # EMMS/SSE2/AVX instructions which have implicit %ds:(%rsi) operand |
| 251 # maskmovq %mmX,%mmY | 251 # maskmovq %mmX,%mmY |
| 252 maskmovq = | 252 maskmovq = |
| 253 REX_WRXB? (0x0f 0xf7) | 253 REX_WRXB? (0x0f 0xf7) |
| 254 @CPUFeature_EMMX modrm_registers; | 254 @CPUFeature_EMMX modrm_registers; |
| 255 # maskmovdqu %xmmX, %xmmY | 255 # maskmovdqu %xmmX, %xmmY |
| 256 maskmovdqu = | 256 maskmovdqu = |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 286 condrep? REXW_NONE? 0xa7 | # cmps[lq] %es:(%rdi),%ds:(%rsi) | 286 condrep? REXW_NONE? 0xa7 | # cmps[lq] %es:(%rdi),%ds:(%rsi) |
| 287 | 287 |
| 288 rep? 0xa4 | # movsb %es:(%rdi),%ds:(%rsi) | 288 rep? 0xa4 | # movsb %es:(%rdi),%ds:(%rsi) |
| 289 data16rep 0xa5 | # movsw %es:(%rdi),%ds:(%rsi) | 289 data16rep 0xa5 | # movsw %es:(%rdi),%ds:(%rsi) |
| 290 rep? REXW_NONE? 0xa5 ; # movs[lq] %es:(%rdi),%ds:(%rsi) | 290 rep? REXW_NONE? 0xa5 ; # movs[lq] %es:(%rdi),%ds:(%rsi) |
| 291 | 291 |
| 292 sandbox_instruction_rsi_no_rdi = | 292 sandbox_instruction_rsi_no_rdi = |
| 293 (0x89 | 0x8b) 0xf6 . # mov %esi,%esi | 293 (0x89 | 0x8b) 0xf6 . # mov %esi,%esi |
| 294 0x49 0x8d 0x34 0x37 . # lea (%r15,%rsi,1),%rsi | 294 0x49 0x8d 0x34 0x37 . # lea (%r15,%rsi,1),%rsi |
| 295 string_instruction_rsi_no_rdi | 295 string_instruction_rsi_no_rdi |
| 296 @{ | 296 @{ |
|
Brad Chen
2012/09/29 00:06:00
Please comment every action.
# This action redefin
khim
2012/10/03 22:30:10
Done.
Functions make absolutely no sense here: we
| |
| 297 instruction_start -= 6; | 297 instruction_start -= 6; |
| 298 BitmapClearBit(valid_targets, (instruction_start - data) + 2); | 298 MakeJumpTargetInvalid((instruction_start - data) + 2, valid_targets); |
| 299 BitmapClearBit(valid_targets, (instruction_start - data) + 6); | 299 MakeJumpTargetInvalid((instruction_start - data) + 6, valid_targets); |
| 300 restricted_register = NO_REG; | 300 restricted_register = NO_REG; |
| 301 } | | 301 } | |
| 302 | 302 |
| 303 REX_X (0x89 | 0x8b) 0xf6 . # mov %esi,%esi | 303 REX_X (0x89 | 0x8b) 0xf6 . # mov %esi,%esi |
| 304 0x49 0x8d 0x34 0x37 . # lea (%r15,%rsi,1),%rsi | 304 0x49 0x8d 0x34 0x37 . # lea (%r15,%rsi,1),%rsi |
| 305 string_instruction_rsi_no_rdi | 305 string_instruction_rsi_no_rdi |
| 306 @{ | 306 @{ |
| 307 instruction_start -= 7; | 307 instruction_start -= 7; |
| 308 BitmapClearBit(valid_targets, (instruction_start - data) + 3); | 308 MakeJumpTargetInvalid((instruction_start - data) + 3, valid_targets); |
| 309 BitmapClearBit(valid_targets, (instruction_start - data) + 7); | 309 MakeJumpTargetInvalid((instruction_start - data) + 7, valid_targets); |
| 310 restricted_register = NO_REG; | 310 restricted_register = NO_REG; |
| 311 }; | 311 }; |
| 312 | 312 |
| 313 sandbox_instruction_rdi_no_rsi = | 313 sandbox_instruction_rdi_no_rsi = |
| 314 (0x89 | 0x8b) 0xff . # mov %edi,%edi | 314 (0x89 | 0x8b) 0xff . # mov %edi,%edi |
| 315 0x49 0x8d 0x3c 0x3f . # lea (%r15,%rdi,1),%rdi | 315 0x49 0x8d 0x3c 0x3f . # lea (%r15,%rdi,1),%rdi |
| 316 (string_instruction_rdi_no_rsi | mmx_sse_rdi_instruction) | 316 (string_instruction_rdi_no_rsi | mmx_sse_rdi_instruction) |
| 317 @{ | 317 @{ |
| 318 instruction_start -= 6; | 318 instruction_start -= 6; |
| 319 BitmapClearBit(valid_targets, (instruction_start - data) + 2); | 319 MakeJumpTargetInvalid((instruction_start - data) + 2, valid_targets); |
| 320 BitmapClearBit(valid_targets, (instruction_start - data) + 6); | 320 MakeJumpTargetInvalid((instruction_start - data) + 6, valid_targets); |
| 321 restricted_register = NO_REG; | 321 restricted_register = NO_REG; |
| 322 } | | 322 } | |
| 323 | 323 |
| 324 REX_X (0x89 | 0x8b) 0xff . # mov %edi,%edi | 324 REX_X (0x89 | 0x8b) 0xff . # mov %edi,%edi |
| 325 0x49 0x8d 0x3c 0x3f . # lea (%r15,%rdi,1),%rdi | 325 0x49 0x8d 0x3c 0x3f . # lea (%r15,%rdi,1),%rdi |
| 326 (string_instruction_rdi_no_rsi | mmx_sse_rdi_instruction) | 326 (string_instruction_rdi_no_rsi | mmx_sse_rdi_instruction) |
| 327 @{ | 327 @{ |
| 328 instruction_start -= 7; | 328 instruction_start -= 7; |
| 329 BitmapClearBit(valid_targets, (instruction_start - data) + 3); | 329 MakeJumpTargetInvalid((instruction_start - data) + 3, valid_targets); |
| 330 BitmapClearBit(valid_targets, (instruction_start - data) + 7); | 330 MakeJumpTargetInvalid((instruction_start - data) + 7, valid_targets); |
| 331 restricted_register = NO_REG; | 331 restricted_register = NO_REG; |
| 332 }; | 332 }; |
| 333 | 333 |
| 334 | 334 |
| 335 # String instructions which use both %ds:(%rsi) and %ds:(%rdi) | 335 # String instructions which use both %ds:(%rsi) and %ds:(%rdi) |
| 336 sandbox_instruction_rsi_rdi = | 336 sandbox_instruction_rsi_rdi = |
| 337 (0x89 | 0x8b) 0xf6 . # mov %esi,%esi | 337 (0x89 | 0x8b) 0xf6 . # mov %esi,%esi |
|
Brad Chen
2012/09/29 00:06:00
# Note that 0x89 0xf6 and 0x8b 0xf6 both encode "m
khim
2012/10/03 22:30:10
Done.
| |
| 338 0x49 0x8d 0x34 0x37 . # lea (%r15,%rsi,1),%rsi | 338 0x49 0x8d 0x34 0x37 . # lea (%r15,%rsi,1),%rsi |
| 339 (0x89 | 0x8b) 0xff . # mov %edi,%edi | 339 (0x89 | 0x8b) 0xff . # mov %edi,%edi |
| 340 0x49 0x8d 0x3c 0x3f . # lea (%r15,%rdi,1),%rdi | 340 0x49 0x8d 0x3c 0x3f . # lea (%r15,%rdi,1),%rdi |
| 341 string_instruction_rsi_rdi | 341 string_instruction_rsi_rdi |
| 342 @{ | 342 @{ |
| 343 instruction_start -= 12; | 343 instruction_start -= 12; |
| 344 BitmapClearBit(valid_targets, (instruction_start - data) + 2); | 344 MakeJumpTargetInvalid((instruction_start - data) + 2, valid_targets); |
| 345 BitmapClearBit(valid_targets, (instruction_start - data) + 6); | 345 MakeJumpTargetInvalid((instruction_start - data) + 6, valid_targets); |
| 346 BitmapClearBit(valid_targets, (instruction_start - data) + 8); | 346 MakeJumpTargetInvalid((instruction_start - data) + 8, valid_targets); |
| 347 BitmapClearBit(valid_targets, (instruction_start - data) + 12); | 347 MakeJumpTargetInvalid((instruction_start - data) + 12, valid_targets); |
| 348 restricted_register = NO_REG; | 348 restricted_register = NO_REG; |
| 349 } | | 349 } | |
| 350 | 350 |
| 351 (0x89 | 0x8b) 0xf6 . # mov %esi,%esi | 351 (0x89 | 0x8b) 0xf6 . # mov %esi,%esi |
| 352 0x49 0x8d 0x34 0x37 . # lea (%r15,%rsi,1),%rsi | 352 0x49 0x8d 0x34 0x37 . # lea (%r15,%rsi,1),%rsi |
| 353 REX_X (0x89 | 0x8b) 0xff . # mov %edi,%edi | 353 REX_X (0x89 | 0x8b) 0xff . # mov %edi,%edi |
| 354 0x49 0x8d 0x3c 0x3f . # lea (%r15,%rdi,1),%rdi | 354 0x49 0x8d 0x3c 0x3f . # lea (%r15,%rdi,1),%rdi |
| 355 string_instruction_rsi_rdi | 355 string_instruction_rsi_rdi |
| 356 @{ | 356 @{ |
| 357 instruction_start -= 13; | 357 instruction_start -= 13; |
| 358 BitmapClearBit(valid_targets, (instruction_start - data) + 2); | 358 MakeJumpTargetInvalid((instruction_start - data) + 2, valid_targets); |
| 359 BitmapClearBit(valid_targets, (instruction_start - data) + 6); | 359 MakeJumpTargetInvalid((instruction_start - data) + 6, valid_targets); |
| 360 BitmapClearBit(valid_targets, (instruction_start - data) + 9); | 360 MakeJumpTargetInvalid((instruction_start - data) + 9, valid_targets); |
| 361 BitmapClearBit(valid_targets, (instruction_start - data) + 13); | 361 MakeJumpTargetInvalid((instruction_start - data) + 13, valid_targets); |
| 362 restricted_register = NO_REG; | 362 restricted_register = NO_REG; |
| 363 } | | 363 } | |
| 364 | 364 |
| 365 REX_X (0x89 | 0x8b) 0xf6 . # mov %esi,%esi | 365 REX_X (0x89 | 0x8b) 0xf6 . # mov %esi,%esi |
| 366 0x49 0x8d 0x34 0x37 . # lea (%r15,%rsi,1),%rsi | 366 0x49 0x8d 0x34 0x37 . # lea (%r15,%rsi,1),%rsi |
| 367 (0x89 | 0x8b) 0xff . # mov %edi,%edi | 367 (0x89 | 0x8b) 0xff . # mov %edi,%edi |
| 368 0x49 0x8d 0x3c 0x3f . # lea (%r15,%rdi,1),%rdi | 368 0x49 0x8d 0x3c 0x3f . # lea (%r15,%rdi,1),%rdi |
| 369 string_instruction_rsi_rdi | 369 string_instruction_rsi_rdi |
| 370 @{ | 370 @{ |
| 371 instruction_start -= 13; | 371 instruction_start -= 13; |
| 372 BitmapClearBit(valid_targets, (instruction_start - data) + 3); | 372 MakeJumpTargetInvalid((instruction_start - data) + 3, valid_targets); |
| 373 BitmapClearBit(valid_targets, (instruction_start - data) + 7); | 373 MakeJumpTargetInvalid((instruction_start - data) + 7, valid_targets); |
| 374 BitmapClearBit(valid_targets, (instruction_start - data) + 9); | 374 MakeJumpTargetInvalid((instruction_start - data) + 9, valid_targets); |
| 375 BitmapClearBit(valid_targets, (instruction_start - data) + 13); | 375 MakeJumpTargetInvalid((instruction_start - data) + 13, valid_targets); |
| 376 restricted_register = NO_REG; | 376 restricted_register = NO_REG; |
| 377 } | | 377 } | |
| 378 | 378 |
| 379 REX_X (0x89 | 0x8b) 0xf6 . # mov %esi,%esi | 379 REX_X (0x89 | 0x8b) 0xf6 . # mov %esi,%esi |
| 380 0x49 0x8d 0x34 0x37 . # lea (%r15,%rsi,1),%rsi | 380 0x49 0x8d 0x34 0x37 . # lea (%r15,%rsi,1),%rsi |
| 381 REX_X (0x89 | 0x8b) 0xff . # mov %edi,%edi | 381 REX_X (0x89 | 0x8b) 0xff . # mov %edi,%edi |
| 382 0x49 0x8d 0x3c 0x3f . # lea (%r15,%rdi,1),%rdi | 382 0x49 0x8d 0x3c 0x3f . # lea (%r15,%rdi,1),%rdi |
| 383 string_instruction_rsi_rdi | 383 string_instruction_rsi_rdi |
| 384 @{ | 384 @{ |
| 385 instruction_start -= 14; | 385 instruction_start -= 14; |
| 386 BitmapClearBit(valid_targets, (instruction_start - data) + 3); | 386 MakeJumpTargetInvalid((instruction_start - data) + 3, valid_targets); |
| 387 BitmapClearBit(valid_targets, (instruction_start - data) + 7); | 387 MakeJumpTargetInvalid((instruction_start - data) + 7, valid_targets); |
| 388 BitmapClearBit(valid_targets, (instruction_start - data) + 10); | 388 MakeJumpTargetInvalid((instruction_start - data) + 10, valid_targets); |
| 389 BitmapClearBit(valid_targets, (instruction_start - data) + 14); | 389 MakeJumpTargetInvalid((instruction_start - data) + 14, valid_targets); |
| 390 restricted_register = NO_REG; | 390 restricted_register = NO_REG; |
| 391 }; | 391 }; |
| 392 | 392 |
| 393 special_instruction = | 393 special_instruction = |
| 394 (rbp_modifications | | 394 (rbp_modifications | |
| 395 rsp_modifications | | 395 rsp_modifications | |
| 396 rbp_sandboxing | | 396 rbp_sandboxing | |
| 397 rsp_sandboxing | | 397 rsp_sandboxing | |
| 398 naclcall_or_nacljmp | | 398 naclcall_or_nacljmp | |
| 399 sandbox_instruction_rsi_no_rdi | | 399 sandbox_instruction_rsi_no_rdi | |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 418 (any* data16? REX_WRXB? 0xff ((opcode_2 | opcode_3) any* & | 418 (any* data16? REX_WRXB? 0xff ((opcode_2 | opcode_3) any* & |
| 419 (modrm_memory | modrm_registers))))) | 419 (modrm_memory | modrm_registers))))) |
| 420 @{ | 420 @{ |
| 421 if (((current_position - data) & kBundleMask) != kBundleMask) | 421 if (((current_position - data) & kBundleMask) != kBundleMask) |
| 422 instruction_info_collected |= BAD_CALL_ALIGNMENT; | 422 instruction_info_collected |= BAD_CALL_ALIGNMENT; |
| 423 }; | 423 }; |
| 424 | 424 |
| 425 | 425 |
| 426 main := ((call_alignment | normal_instruction | special_instruction) | 426 main := ((call_alignment | normal_instruction | special_instruction) |
| 427 >{ | 427 >{ |
| 428 BitmapSetBit(valid_targets, current_position - data); | 428 MakeJumpTargetValid(current_position - data, valid_targets); |
| 429 } | 429 } |
| 430 @{ | 430 @{ |
| 431 if ((instruction_info_collected & | 431 if ((instruction_info_collected & |
| 432 (VALIDATION_ERRORS_MASK | BAD_CALL_ALIGNMENT)) || | 432 (VALIDATION_ERRORS_MASK | BAD_CALL_ALIGNMENT)) || |
| 433 (options & CALL_USER_CALLBACK_ON_EACH_INSTRUCTION)) { | 433 (options & CALL_USER_CALLBACK_ON_EACH_INSTRUCTION)) { |
| 434 result &= user_callback( | 434 result &= user_callback( |
| 435 instruction_start, current_position, | 435 instruction_start, current_position, |
| 436 instruction_info_collected | | 436 instruction_info_collected | |
| 437 ((restricted_register << RESTRICTED_REGISTER_SHIFT) & | 437 ((restricted_register << RESTRICTED_REGISTER_SHIFT) & |
| 438 RESTRICTED_REGISTER_MASK), callback_data); | 438 RESTRICTED_REGISTER_MASK), callback_data); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 533 user_callback, callback_data); | 533 user_callback, callback_data); |
| 534 | 534 |
| 535 /* We only use malloc for a large code sequences */ | 535 /* We only use malloc for a large code sequences */ |
| 536 if (size > sizeof valid_targets_small) { | 536 if (size > sizeof valid_targets_small) { |
| 537 free(jump_dests); | 537 free(jump_dests); |
| 538 free(valid_targets); | 538 free(valid_targets); |
| 539 } | 539 } |
| 540 if (!result) errno = EINVAL; | 540 if (!result) errno = EINVAL; |
| 541 return result; | 541 return result; |
| 542 } | 542 } |
| OLD | NEW |