| 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 "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  Loading... | 
|  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  Loading... | 
|  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  Loading... | 
|  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 | 
| OLD | NEW |