OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 <stdarg.h> | 5 #include <stdarg.h> |
6 #include <stdlib.h> | 6 #include <stdlib.h> |
7 #include <cmath> | 7 #include <cmath> |
8 | 8 |
9 #include "src/v8.h" | 9 #include "src/v8.h" |
10 | 10 |
(...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
787 Simulator::Simulator(Isolate* isolate) : isolate_(isolate) { | 787 Simulator::Simulator(Isolate* isolate) : isolate_(isolate) { |
788 i_cache_ = isolate_->simulator_i_cache(); | 788 i_cache_ = isolate_->simulator_i_cache(); |
789 if (i_cache_ == NULL) { | 789 if (i_cache_ == NULL) { |
790 i_cache_ = new v8::internal::HashMap(&ICacheMatch); | 790 i_cache_ = new v8::internal::HashMap(&ICacheMatch); |
791 isolate_->set_simulator_i_cache(i_cache_); | 791 isolate_->set_simulator_i_cache(i_cache_); |
792 } | 792 } |
793 Initialize(isolate); | 793 Initialize(isolate); |
794 // Set up simulator support first. Some of this information is needed to | 794 // Set up simulator support first. Some of this information is needed to |
795 // setup the architecture state. | 795 // setup the architecture state. |
796 #if V8_TARGET_ARCH_PPC64 | 796 #if V8_TARGET_ARCH_PPC64 |
797 size_t stack_size = 2 * 1024 * 1024; // allocate 2MB for stack | 797 size_t stack_size = FLAG_sim_stack_size * KB; |
798 #else | 798 #else |
799 size_t stack_size = 1 * 1024 * 1024; // allocate 1MB for stack | 799 size_t stack_size = MB; // allocate 1MB for stack |
800 #endif | 800 #endif |
| 801 stack_size += 2 * stack_protection_size_; |
801 stack_ = reinterpret_cast<char*>(malloc(stack_size)); | 802 stack_ = reinterpret_cast<char*>(malloc(stack_size)); |
802 pc_modified_ = false; | 803 pc_modified_ = false; |
803 icount_ = 0; | 804 icount_ = 0; |
804 break_pc_ = NULL; | 805 break_pc_ = NULL; |
805 break_instr_ = 0; | 806 break_instr_ = 0; |
806 | 807 |
807 // Set up architecture state. | 808 // Set up architecture state. |
808 // All registers are initialized to zero to start with. | 809 // All registers are initialized to zero to start with. |
809 for (int i = 0; i < kNumGPRs; i++) { | 810 for (int i = 0; i < kNumGPRs; i++) { |
810 registers_[i] = 0; | 811 registers_[i] = 0; |
811 } | 812 } |
812 condition_reg_ = 0; | 813 condition_reg_ = 0; |
813 fp_condition_reg_ = 0; | 814 fp_condition_reg_ = 0; |
814 special_reg_pc_ = 0; | 815 special_reg_pc_ = 0; |
815 special_reg_lr_ = 0; | 816 special_reg_lr_ = 0; |
816 special_reg_ctr_ = 0; | 817 special_reg_ctr_ = 0; |
817 | 818 |
818 // Initializing FP registers. | 819 // Initializing FP registers. |
819 for (int i = 0; i < kNumFPRs; i++) { | 820 for (int i = 0; i < kNumFPRs; i++) { |
820 fp_registers_[i] = 0.0; | 821 fp_registers_[i] = 0.0; |
821 } | 822 } |
822 | 823 |
823 // The sp is initialized to point to the bottom (high address) of the | 824 // The sp is initialized to point to the bottom (high address) of the |
824 // allocated stack area. To be safe in potential stack underflows we leave | 825 // allocated stack area. To be safe in potential stack underflows we leave |
825 // some buffer below. | 826 // some buffer below. |
826 registers_[sp] = reinterpret_cast<intptr_t>(stack_) + stack_size - 64; | 827 registers_[sp] = |
| 828 reinterpret_cast<intptr_t>(stack_) + stack_size - stack_protection_size_; |
827 InitializeCoverage(); | 829 InitializeCoverage(); |
828 | 830 |
829 last_debugger_input_ = NULL; | 831 last_debugger_input_ = NULL; |
830 } | 832 } |
831 | 833 |
832 | 834 |
833 Simulator::~Simulator() { free(stack_); } | 835 Simulator::~Simulator() { free(stack_); } |
834 | 836 |
835 | 837 |
836 // When the generated code calls an external reference we need to catch that in | 838 // When the generated code calls an external reference we need to catch that in |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1100 | 1102 |
1101 void Simulator::WriteDW(intptr_t addr, int64_t value) { | 1103 void Simulator::WriteDW(intptr_t addr, int64_t value) { |
1102 int64_t* ptr = reinterpret_cast<int64_t*>(addr); | 1104 int64_t* ptr = reinterpret_cast<int64_t*>(addr); |
1103 *ptr = value; | 1105 *ptr = value; |
1104 return; | 1106 return; |
1105 } | 1107 } |
1106 | 1108 |
1107 | 1109 |
1108 // Returns the limit of the stack area to enable checking for stack overflows. | 1110 // Returns the limit of the stack area to enable checking for stack overflows. |
1109 uintptr_t Simulator::StackLimit() const { | 1111 uintptr_t Simulator::StackLimit() const { |
1110 // Leave a safety margin of 1024 bytes to prevent overrunning the stack when | 1112 // Leave a safety margin to prevent overrunning the stack when pushing values. |
1111 // pushing values. | 1113 return reinterpret_cast<uintptr_t>(stack_) + stack_protection_size_; |
1112 return reinterpret_cast<uintptr_t>(stack_) + 1024; | |
1113 } | 1114 } |
1114 | 1115 |
1115 | 1116 |
1116 // Unsupported instructions use Format to print an error and stop execution. | 1117 // Unsupported instructions use Format to print an error and stop execution. |
1117 void Simulator::Format(Instruction* instr, const char* format) { | 1118 void Simulator::Format(Instruction* instr, const char* format) { |
1118 PrintF("Simulator found unsupported instruction:\n 0x%08" V8PRIxPTR ": %s\n", | 1119 PrintF("Simulator found unsupported instruction:\n 0x%08" V8PRIxPTR ": %s\n", |
1119 reinterpret_cast<intptr_t>(instr), format); | 1120 reinterpret_cast<intptr_t>(instr), format); |
1120 UNIMPLEMENTED(); | 1121 UNIMPLEMENTED(); |
1121 } | 1122 } |
1122 | 1123 |
(...skipping 2773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3896 uintptr_t* stack_slot = reinterpret_cast<uintptr_t*>(current_sp); | 3897 uintptr_t* stack_slot = reinterpret_cast<uintptr_t*>(current_sp); |
3897 uintptr_t address = *stack_slot; | 3898 uintptr_t address = *stack_slot; |
3898 set_register(sp, current_sp + sizeof(uintptr_t)); | 3899 set_register(sp, current_sp + sizeof(uintptr_t)); |
3899 return address; | 3900 return address; |
3900 } | 3901 } |
3901 } // namespace internal | 3902 } // namespace internal |
3902 } // namespace v8 | 3903 } // namespace v8 |
3903 | 3904 |
3904 #endif // USE_SIMULATOR | 3905 #endif // USE_SIMULATOR |
3905 #endif // V8_TARGET_ARCH_PPC | 3906 #endif // V8_TARGET_ARCH_PPC |
OLD | NEW |