OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdlib.h> | 5 #include <stdlib.h> |
6 #include <cmath> | 6 #include <cmath> |
7 #include <cstdarg> | 7 #include <cstdarg> |
8 | 8 |
9 #if V8_TARGET_ARCH_ARM64 | 9 #if V8_TARGET_ARCH_ARM64 |
10 | 10 |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 | 455 |
456 // When the generated code calls an external reference we need to catch that in | 456 // When the generated code calls an external reference we need to catch that in |
457 // the simulator. The external reference will be a function compiled for the | 457 // the simulator. The external reference will be a function compiled for the |
458 // host architecture. We need to call that function instead of trying to | 458 // host architecture. We need to call that function instead of trying to |
459 // execute it with the simulator. We do that by redirecting the external | 459 // execute it with the simulator. We do that by redirecting the external |
460 // reference to a svc (Supervisor Call) instruction that is handled by | 460 // reference to a svc (Supervisor Call) instruction that is handled by |
461 // the simulator. We write the original destination of the jump just at a known | 461 // the simulator. We write the original destination of the jump just at a known |
462 // offset from the svc instruction so the simulator knows what to call. | 462 // offset from the svc instruction so the simulator knows what to call. |
463 class Redirection { | 463 class Redirection { |
464 public: | 464 public: |
465 Redirection(void* external_function, ExternalReference::Type type) | 465 Redirection(Isolate* isolate, void* external_function, |
466 : external_function_(external_function), | 466 ExternalReference::Type type) |
467 type_(type), | 467 : external_function_(external_function), type_(type), next_(NULL) { |
468 next_(NULL) { | |
469 redirect_call_.SetInstructionBits( | 468 redirect_call_.SetInstructionBits( |
470 HLT | Assembler::ImmException(kImmExceptionIsRedirectedCall)); | 469 HLT | Assembler::ImmException(kImmExceptionIsRedirectedCall)); |
471 Isolate* isolate = Isolate::Current(); | |
472 next_ = isolate->simulator_redirection(); | 470 next_ = isolate->simulator_redirection(); |
473 // TODO(all): Simulator flush I cache | 471 // TODO(all): Simulator flush I cache |
474 isolate->set_simulator_redirection(this); | 472 isolate->set_simulator_redirection(this); |
475 } | 473 } |
476 | 474 |
477 void* address_of_redirect_call() { | 475 void* address_of_redirect_call() { |
478 return reinterpret_cast<void*>(&redirect_call_); | 476 return reinterpret_cast<void*>(&redirect_call_); |
479 } | 477 } |
480 | 478 |
481 template <typename T> | 479 template <typename T> |
482 T external_function() { return reinterpret_cast<T>(external_function_); } | 480 T external_function() { return reinterpret_cast<T>(external_function_); } |
483 | 481 |
484 ExternalReference::Type type() { return type_; } | 482 ExternalReference::Type type() { return type_; } |
485 | 483 |
486 static Redirection* Get(void* external_function, | 484 static Redirection* Get(Isolate* isolate, void* external_function, |
487 ExternalReference::Type type) { | 485 ExternalReference::Type type) { |
488 Isolate* isolate = Isolate::Current(); | |
489 Redirection* current = isolate->simulator_redirection(); | 486 Redirection* current = isolate->simulator_redirection(); |
490 for (; current != NULL; current = current->next_) { | 487 for (; current != NULL; current = current->next_) { |
491 if (current->external_function_ == external_function) { | 488 if (current->external_function_ == external_function) { |
492 DCHECK_EQ(current->type(), type); | 489 DCHECK_EQ(current->type(), type); |
493 return current; | 490 return current; |
494 } | 491 } |
495 } | 492 } |
496 return new Redirection(external_function, type); | 493 return new Redirection(isolate, external_function, type); |
497 } | 494 } |
498 | 495 |
499 static Redirection* FromHltInstruction(Instruction* redirect_call) { | 496 static Redirection* FromHltInstruction(Instruction* redirect_call) { |
500 char* addr_of_hlt = reinterpret_cast<char*>(redirect_call); | 497 char* addr_of_hlt = reinterpret_cast<char*>(redirect_call); |
501 char* addr_of_redirection = | 498 char* addr_of_redirection = |
502 addr_of_hlt - offsetof(Redirection, redirect_call_); | 499 addr_of_hlt - offsetof(Redirection, redirect_call_); |
503 return reinterpret_cast<Redirection*>(addr_of_redirection); | 500 return reinterpret_cast<Redirection*>(addr_of_redirection); |
504 } | 501 } |
505 | 502 |
506 static void* ReverseRedirection(int64_t reg) { | 503 static void* ReverseRedirection(int64_t reg) { |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
741 #endif | 738 #endif |
742 break; | 739 break; |
743 } | 740 } |
744 } | 741 } |
745 | 742 |
746 set_lr(return_address); | 743 set_lr(return_address); |
747 set_pc(return_address); | 744 set_pc(return_address); |
748 } | 745 } |
749 | 746 |
750 | 747 |
751 void* Simulator::RedirectExternalReference(void* external_function, | 748 void* Simulator::RedirectExternalReference(Isolate* isolate, |
| 749 void* external_function, |
752 ExternalReference::Type type) { | 750 ExternalReference::Type type) { |
753 Redirection* redirection = Redirection::Get(external_function, type); | 751 Redirection* redirection = Redirection::Get(isolate, external_function, type); |
754 return redirection->address_of_redirect_call(); | 752 return redirection->address_of_redirect_call(); |
755 } | 753 } |
756 | 754 |
757 | 755 |
758 const char* Simulator::xreg_names[] = { | 756 const char* Simulator::xreg_names[] = { |
759 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", | 757 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", |
760 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", | 758 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", |
761 "ip0", "ip1", "x18", "x19", "x20", "x21", "x22", "x23", | 759 "ip0", "ip1", "x18", "x19", "x20", "x21", "x22", "x23", |
762 "x24", "x25", "x26", "cp", "jssp", "fp", "lr", "xzr", "csp"}; | 760 "x24", "x25", "x26", "cp", "jssp", "fp", "lr", "xzr", "csp"}; |
763 | 761 |
(...skipping 2739 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3503 } else { | 3501 } else { |
3504 UNREACHABLE(); | 3502 UNREACHABLE(); |
3505 } | 3503 } |
3506 end = cur + words; | 3504 end = cur + words; |
3507 | 3505 |
3508 while (cur < end) { | 3506 while (cur < end) { |
3509 PrintF(" 0x%016" PRIx64 ": 0x%016" PRIx64 " %10" PRId64, | 3507 PrintF(" 0x%016" PRIx64 ": 0x%016" PRIx64 " %10" PRId64, |
3510 reinterpret_cast<uint64_t>(cur), *cur, *cur); | 3508 reinterpret_cast<uint64_t>(cur), *cur, *cur); |
3511 HeapObject* obj = reinterpret_cast<HeapObject*>(*cur); | 3509 HeapObject* obj = reinterpret_cast<HeapObject*>(*cur); |
3512 int64_t value = *cur; | 3510 int64_t value = *cur; |
3513 Heap* current_heap = v8::internal::Isolate::Current()->heap(); | 3511 Heap* current_heap = isolate_->heap(); |
3514 if (((value & 1) == 0) || current_heap->Contains(obj)) { | 3512 if (((value & 1) == 0) || current_heap->Contains(obj)) { |
3515 PrintF(" ("); | 3513 PrintF(" ("); |
3516 if ((value & kSmiTagMask) == 0) { | 3514 if ((value & kSmiTagMask) == 0) { |
3517 STATIC_ASSERT(kSmiValueSize == 32); | 3515 STATIC_ASSERT(kSmiValueSize == 32); |
3518 int32_t untagged = (value >> kSmiShift) & 0xffffffff; | 3516 int32_t untagged = (value >> kSmiShift) & 0xffffffff; |
3519 PrintF("smi %" PRId32, untagged); | 3517 PrintF("smi %" PRId32, untagged); |
3520 } else { | 3518 } else { |
3521 obj->ShortPrint(); | 3519 obj->ShortPrint(); |
3522 } | 3520 } |
3523 PrintF(")"); | 3521 PrintF(")"); |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3838 delete[] format; | 3836 delete[] format; |
3839 } | 3837 } |
3840 | 3838 |
3841 | 3839 |
3842 #endif // USE_SIMULATOR | 3840 #endif // USE_SIMULATOR |
3843 | 3841 |
3844 } // namespace internal | 3842 } // namespace internal |
3845 } // namespace v8 | 3843 } // namespace v8 |
3846 | 3844 |
3847 #endif // V8_TARGET_ARCH_ARM64 | 3845 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |