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

Side by Side Diff: src/trusted/validator_mips/validator.cc

Issue 11090024: [MIPS] New pattern in validator to detect jumps/branches in delay slots. (Closed) Base URL: http://git.chromium.org/native_client/src/native_client.git@master
Patch Set: Two more test cases added. 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
« no previous file with comments | « src/trusted/validator_mips/validator.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "native_client/src/trusted/service_runtime/nacl_config.h" 8 #include "native_client/src/trusted/service_runtime/nacl_config.h"
9 #include "native_client/src/trusted/validator_mips/validator.h" 9 #include "native_client/src/trusted/validator_mips/validator.h"
10 #include "native_client/src/include/nacl_macros.h" 10 #include "native_client/src/include/nacl_macros.h"
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 } 208 }
209 out->ReportProblem(second.addr(), second.safety(), 209 out->ReportProblem(second.addr(), second.safety(),
210 kProblemUnsafeLoadStore); 210 kProblemUnsafeLoadStore);
211 return PATTERN_UNSAFE; 211 return PATTERN_UNSAFE;
212 } 212 }
213 } 213 }
214 return NO_MATCH; 214 return NO_MATCH;
215 } 215 }
216 216
217 217
218 /*
219 * Checks if there is jump/branch in the delay slot.
220 */
221 static PatternMatch CheckBranchInDelaySlot(const SfiValidator &sfi,
222 const DecodedInstruction &first,
223 const DecodedInstruction &second,
224 ProblemSink *out) {
225 UNREFERENCED_PARAMETER(sfi);
226 if (first.HasDelaySlot() && second.HasDelaySlot()) {
227 out->ReportProblem(second.addr(), second.safety(),
228 kProblemBranchInDelaySlot);
229 return PATTERN_UNSAFE;
230 }
231 return NO_MATCH;
232 }
233
234
218 /********************************************************* 235 /*********************************************************
219 * Pseudo-instruction patterns. 236 * Pseudo-instruction patterns.
220 *********************************************************/ 237 *********************************************************/
221 238
222 /* 239 /*
223 * Checks if a pseudo-instruction that starts with instr will cross bundle 240 * Checks if a pseudo-instruction that starts with instr will cross bundle
224 * border (i.e. if it starts in one and ends in second). 241 * border (i.e. if it starts in one and ends in second).
225 * The exception to this rule are pseudo-instructions altering the data register 242 * The exception to this rule are pseudo-instructions altering the data register
226 * value (because mask is the second instruction). 243 * value (because mask is the second instruction).
227 */ 244 */
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 // Type for two-instruction pattern functions. 428 // Type for two-instruction pattern functions.
412 typedef PatternMatch (*TwoInstPattern)(const SfiValidator &, 429 typedef PatternMatch (*TwoInstPattern)(const SfiValidator &,
413 const DecodedInstruction &first, 430 const DecodedInstruction &first,
414 const DecodedInstruction &second, 431 const DecodedInstruction &second,
415 ProblemSink *out); 432 ProblemSink *out);
416 // The list of patterns -- defined in static functions up top. 433 // The list of patterns -- defined in static functions up top.
417 static const TwoInstPattern two_inst_patterns[] = { 434 static const TwoInstPattern two_inst_patterns[] = {
418 &CheckJmpReg, 435 &CheckJmpReg,
419 &CheckDataRegisterUpdate, 436 &CheckDataRegisterUpdate,
420 &CheckDataRegisterDslot, 437 &CheckDataRegisterDslot,
421 &CheckLoadStore 438 &CheckLoadStore,
439 &CheckBranchInDelaySlot
422 }; 440 };
423 441
424 bool complete_success = true; 442 bool complete_success = true;
425 443
426 for (uint32_t i = 0; i < NACL_ARRAY_SIZE(two_inst_patterns); i++) { 444 for (uint32_t i = 0; i < NACL_ARRAY_SIZE(two_inst_patterns); i++) {
427 PatternMatch r = two_inst_patterns[i](*this, first, second, out); 445 PatternMatch r = two_inst_patterns[i](*this, first, second, out);
428 switch (r) { 446 switch (r) {
429 case NO_MATCH: 447 case NO_MATCH:
430 break; 448 break;
431 case PATTERN_UNSAFE: 449 case PATTERN_UNSAFE:
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 DecodedInstruction::DecodedInstruction(uint32_t vaddr, 501 DecodedInstruction::DecodedInstruction(uint32_t vaddr,
484 Instruction inst, 502 Instruction inst,
485 const ClassDecoder &decoder) 503 const ClassDecoder &decoder)
486 : vaddr_(vaddr), 504 : vaddr_(vaddr),
487 inst_(inst), 505 inst_(inst),
488 decoder_(&decoder), 506 decoder_(&decoder),
489 safety_(decoder.safety(inst_)) 507 safety_(decoder.safety(inst_))
490 {} 508 {}
491 509
492 } // namespace 510 } // namespace
OLDNEW
« no previous file with comments | « src/trusted/validator_mips/validator.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698