Commit bcc9df92 authored by mbrandy's avatar mbrandy Committed by Commit bot

PPC: Make Simulator respect C stack limits as well.

Port 7fb31bdb

Original commit message:
    The simulator uses a separate JS stack, exhaustion of the C stack
    however is not caught by JS limit checks. This change now lowers the
    limit of the JS stack accordingly on function calls.

R=mstarzinger@chromium.org, jyan@ca.ibm.com, dstence@us.ibm.com, joransiu@ca.ibm.com
BUG=chromium:522380
LOG=n

Review URL: https://codereview.chromium.org/1309303005

Cr-Commit-Position: refs/heads/master@{#30413}
parent e276f5d8
...@@ -1106,8 +1106,15 @@ void Simulator::WriteDW(intptr_t addr, int64_t value) { ...@@ -1106,8 +1106,15 @@ void Simulator::WriteDW(intptr_t addr, int64_t value) {
// Returns the limit of the stack area to enable checking for stack overflows. // Returns the limit of the stack area to enable checking for stack overflows.
uintptr_t Simulator::StackLimit() const { uintptr_t Simulator::StackLimit(uintptr_t c_limit) const {
// Leave a safety margin to prevent overrunning the stack when pushing values. // The simulator uses a separate JS stack. If we have exhausted the C stack,
// we also drop down the JS limit to reflect the exhaustion on the JS stack.
if (GetCurrentStackPosition() < c_limit) {
return reinterpret_cast<uintptr_t>(get_sp());
}
// Otherwise the limit is the JS stack. Leave a safety margin to prevent
// overrunning the stack when pushing values.
return reinterpret_cast<uintptr_t>(stack_) + stack_protection_size_; return reinterpret_cast<uintptr_t>(stack_) + stack_protection_size_;
} }
...@@ -3698,6 +3705,9 @@ void Simulator::Execute() { ...@@ -3698,6 +3705,9 @@ void Simulator::Execute() {
void Simulator::CallInternal(byte* entry) { void Simulator::CallInternal(byte* entry) {
// Adjust JS-based stack limit to C-based stack limit.
isolate_->stack_guard()->AdjustStackLimitForSimulator();
// Prepare to execute the code at entry // Prepare to execute the code at entry
#if ABI_USES_FUNCTION_DESCRIPTORS #if ABI_USES_FUNCTION_DESCRIPTORS
// entry is the function descriptor // entry is the function descriptor
......
...@@ -199,12 +199,12 @@ class Simulator { ...@@ -199,12 +199,12 @@ class Simulator {
void set_pc(intptr_t value); void set_pc(intptr_t value);
intptr_t get_pc() const; intptr_t get_pc() const;
Address get_sp() { Address get_sp() const {
return reinterpret_cast<Address>(static_cast<intptr_t>(get_register(sp))); return reinterpret_cast<Address>(static_cast<intptr_t>(get_register(sp)));
} }
// Accessor to the internal simulator stack area. // Accessor to the internal simulator stack area.
uintptr_t StackLimit() const; uintptr_t StackLimit(uintptr_t c_limit) const;
// Executes PPC instructions until the PC reaches end_sim_pc. // Executes PPC instructions until the PC reaches end_sim_pc.
void Execute(); void Execute();
...@@ -403,15 +403,14 @@ class Simulator { ...@@ -403,15 +403,14 @@ class Simulator {
// The simulator has its own stack. Thus it has a different stack limit from // The simulator has its own stack. Thus it has a different stack limit from
// the C-based native code. Setting the c_limit to indicate a very small // the C-based native code. The JS-based limit normally points near the end of
// stack cause stack overflow errors, since the simulator ignores the input. // the simulator stack. When the C-based limit is exhausted we reflect that by
// This is unlikely to be an issue in practice, though it might cause testing // lowering the JS-based limit as well, to make stack checks trigger.
// trouble down the line.
class SimulatorStack : public v8::internal::AllStatic { class SimulatorStack : public v8::internal::AllStatic {
public: public:
static inline uintptr_t JsLimitFromCLimit(v8::internal::Isolate* isolate, static inline uintptr_t JsLimitFromCLimit(v8::internal::Isolate* isolate,
uintptr_t c_limit) { uintptr_t c_limit) {
return Simulator::current(isolate)->StackLimit(); return Simulator::current(isolate)->StackLimit(c_limit);
} }
static inline uintptr_t RegisterCTryCatch(uintptr_t try_catch_address) { static inline uintptr_t RegisterCTryCatch(uintptr_t try_catch_address) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment