OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #if V8_TARGET_ARCH_ARM | 9 #if V8_TARGET_ARCH_ARM |
10 | 10 |
(...skipping 1209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1220 *ptr++ = value1; | 1220 *ptr++ = value1; |
1221 *ptr = value2; | 1221 *ptr = value2; |
1222 } else { | 1222 } else { |
1223 PrintF("Unaligned write at 0x%08x\n", addr); | 1223 PrintF("Unaligned write at 0x%08x\n", addr); |
1224 UNIMPLEMENTED(); | 1224 UNIMPLEMENTED(); |
1225 } | 1225 } |
1226 } | 1226 } |
1227 | 1227 |
1228 | 1228 |
1229 // Returns the limit of the stack area to enable checking for stack overflows. | 1229 // Returns the limit of the stack area to enable checking for stack overflows. |
1230 uintptr_t Simulator::StackLimit() const { | 1230 uintptr_t Simulator::StackLimit(uintptr_t c_limit) const { |
1231 // Leave a safety margin of 1024 bytes to prevent overrunning the stack when | 1231 // The simulator uses a separate JS stack. If we have exhausted the C stack, |
1232 // pushing values. | 1232 // we also drop down the JS limit to reflect the exhaustion on the JS stack. |
| 1233 if (GetCurrentStackPosition() < c_limit) { |
| 1234 return reinterpret_cast<uintptr_t>(get_sp()); |
| 1235 } |
| 1236 |
| 1237 // Otherwise the limit is the JS stack. Leave a safety margin of 1024 bytes |
| 1238 // to prevent overrunning the stack when pushing values. |
1233 return reinterpret_cast<uintptr_t>(stack_) + 1024; | 1239 return reinterpret_cast<uintptr_t>(stack_) + 1024; |
1234 } | 1240 } |
1235 | 1241 |
1236 | 1242 |
1237 // Unsupported instructions use Format to print an error and stop execution. | 1243 // Unsupported instructions use Format to print an error and stop execution. |
1238 void Simulator::Format(Instruction* instr, const char* format) { | 1244 void Simulator::Format(Instruction* instr, const char* format) { |
1239 PrintF("Simulator found unsupported instruction:\n 0x%08x: %s\n", | 1245 PrintF("Simulator found unsupported instruction:\n 0x%08x: %s\n", |
1240 reinterpret_cast<intptr_t>(instr), format); | 1246 reinterpret_cast<intptr_t>(instr), format); |
1241 UNIMPLEMENTED(); | 1247 UNIMPLEMENTED(); |
1242 } | 1248 } |
(...skipping 2759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4002 } else { | 4008 } else { |
4003 InstructionDecode(instr); | 4009 InstructionDecode(instr); |
4004 } | 4010 } |
4005 program_counter = get_pc(); | 4011 program_counter = get_pc(); |
4006 } | 4012 } |
4007 } | 4013 } |
4008 } | 4014 } |
4009 | 4015 |
4010 | 4016 |
4011 void Simulator::CallInternal(byte* entry) { | 4017 void Simulator::CallInternal(byte* entry) { |
| 4018 // Adjust JS-based stack limit to C-based stack limit. |
| 4019 isolate_->stack_guard()->AdjustStackLimitForSimulator(); |
| 4020 |
4012 // Prepare to execute the code at entry | 4021 // Prepare to execute the code at entry |
4013 set_register(pc, reinterpret_cast<int32_t>(entry)); | 4022 set_register(pc, reinterpret_cast<int32_t>(entry)); |
4014 // Put down marker for end of simulation. The simulator will stop simulation | 4023 // Put down marker for end of simulation. The simulator will stop simulation |
4015 // when the PC reaches this value. By saving the "end simulation" value into | 4024 // when the PC reaches this value. By saving the "end simulation" value into |
4016 // the LR the simulation stops when returning to this call point. | 4025 // the LR the simulation stops when returning to this call point. |
4017 set_register(lr, end_sim_pc); | 4026 set_register(lr, end_sim_pc); |
4018 | 4027 |
4019 // Remember the values of callee-saved registers. | 4028 // Remember the values of callee-saved registers. |
4020 // The code below assumes that r9 is not used as sb (static base) in | 4029 // The code below assumes that r9 is not used as sb (static base) in |
4021 // simulator code and therefore is regarded as a callee-saved register. | 4030 // simulator code and therefore is regarded as a callee-saved register. |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4148 set_register(sp, current_sp + sizeof(uintptr_t)); | 4157 set_register(sp, current_sp + sizeof(uintptr_t)); |
4149 return address; | 4158 return address; |
4150 } | 4159 } |
4151 | 4160 |
4152 } // namespace internal | 4161 } // namespace internal |
4153 } // namespace v8 | 4162 } // namespace v8 |
4154 | 4163 |
4155 #endif // USE_SIMULATOR | 4164 #endif // USE_SIMULATOR |
4156 | 4165 |
4157 #endif // V8_TARGET_ARCH_ARM | 4166 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |