Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(95)

Side by Side Diff: src/trusted/validator_ragel/validator_x86_64.rl

Issue 11000033: Move validator_x86_XX.rl out of unreviewed. (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client/
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698