| 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 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 | 195 |
| 196 /* | 196 /* |
| 197 * Checks if load and store instructions are preceded by load/store mask. | 197 * Checks if load and store instructions are preceded by load/store mask. |
| 198 */ | 198 */ |
| 199 static PatternMatch CheckLoadStore(const SfiValidator &sfi, | 199 static PatternMatch CheckLoadStore(const SfiValidator &sfi, |
| 200 const DecodedInstruction &first, | 200 const DecodedInstruction &first, |
| 201 const DecodedInstruction &second, | 201 const DecodedInstruction &second, |
| 202 ProblemSink *out) { | 202 ProblemSink *out) { |
| 203 if (second.IsLoadStore()) { | 203 if (second.IsLoadStore()) { |
| 204 Register base_addr_reg = second.BaseAddressRegister(); | 204 Register base_addr_reg = second.BaseAddressRegister(); |
| 205 if (!sfi.data_address_registers().ContainsAll(base_addr_reg)) { | 205 if (!sfi.data_address_registers(). |
| 206 ContainsAll(RegisterList(base_addr_reg))) { |
| 206 if (first.IsMask(base_addr_reg, kRegisterLoadStoreMask)) { | 207 if (first.IsMask(base_addr_reg, kRegisterLoadStoreMask)) { |
| 207 return PATTERN_SAFE; | 208 return PATTERN_SAFE; |
| 208 } | 209 } |
| 209 out->ReportProblem(second.addr(), second.safety(), | 210 out->ReportProblem(second.addr(), second.safety(), |
| 210 kProblemUnsafeLoadStore); | 211 kProblemUnsafeLoadStore); |
| 211 return PATTERN_UNSAFE; | 212 return PATTERN_UNSAFE; |
| 212 } | 213 } |
| 213 } | 214 } |
| 214 return NO_MATCH; | 215 return NO_MATCH; |
| 215 } | 216 } |
| 216 | 217 |
| 217 | 218 |
| 218 /* | 219 /* |
| 219 * Checks if there is jump/branch in the delay slot. | 220 * Checks if there is jump/branch in the delay slot. |
| 220 */ | 221 */ |
| 221 static PatternMatch CheckBranchInDelaySlot(const SfiValidator &sfi, | 222 static PatternMatch CheckBranchInDelaySlot(const SfiValidator &sfi, |
| 222 const DecodedInstruction &first, | 223 const DecodedInstruction &first, |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 complete_success &= ApplyPatterns(prev, inst, critical, out); | 349 complete_success &= ApplyPatterns(prev, inst, critical, out); |
| 349 if (!out->ShouldContinue()) return false; | 350 if (!out->ShouldContinue()) return false; |
| 350 | 351 |
| 351 if (inst.IsDirectJump()) { | 352 if (inst.IsDirectJump()) { |
| 352 branches->Add(inst.addr()); | 353 branches->Add(inst.addr()); |
| 353 branch_targets->Add(inst.DestAddr()); | 354 branch_targets->Add(inst.DestAddr()); |
| 354 } | 355 } |
| 355 | 356 |
| 356 prev = inst; | 357 prev = inst; |
| 357 } | 358 } |
| 359 |
| 360 // Validate the last instruction, paired with a nop. |
| 361 const Instruction nop(nacl_mips_dec::kNop); |
| 362 DecodedInstruction one_past_end(segment.EndAddr(), nop, |
| 363 nacl_mips_dec::decode(nop, decode_state_)); |
| 364 complete_success &= ApplyPatterns(prev, one_past_end, critical, out); |
| 365 |
| 358 return complete_success; | 366 return complete_success; |
| 359 } | 367 } |
| 360 | 368 |
| 361 bool SfiValidator::ValidatePseudos(const SfiValidator &sfi, | 369 bool SfiValidator::ValidatePseudos(const SfiValidator &sfi, |
| 362 const std::vector<CodeSegment> &segments, | 370 const std::vector<CodeSegment> &segments, |
| 363 const AddressSet &branches, | 371 const AddressSet &branches, |
| 364 const AddressSet &branch_targets, | 372 const AddressSet &branch_targets, |
| 365 const AddressSet &critical, | 373 const AddressSet &critical, |
| 366 ProblemSink* out) { | 374 ProblemSink* out) { |
| 367 bool complete_success = true; | 375 bool complete_success = true; |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 DecodedInstruction::DecodedInstruction(uint32_t vaddr, | 509 DecodedInstruction::DecodedInstruction(uint32_t vaddr, |
| 502 Instruction inst, | 510 Instruction inst, |
| 503 const ClassDecoder &decoder) | 511 const ClassDecoder &decoder) |
| 504 : vaddr_(vaddr), | 512 : vaddr_(vaddr), |
| 505 inst_(inst), | 513 inst_(inst), |
| 506 decoder_(&decoder), | 514 decoder_(&decoder), |
| 507 safety_(decoder.safety(inst_)) | 515 safety_(decoder.safety(inst_)) |
| 508 {} | 516 {} |
| 509 | 517 |
| 510 } // namespace | 518 } // namespace |
| OLD | NEW |