X87: Interrupts must not mask stack overflow.

port r21874

original commit message:
   Interrupts must not mask stack overflow.
   BUG=385002
R=weiliang.lin@intel.com

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

Patch from Chunyang Dai <chunyang.dai@intel.com>.

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21881 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 464143ad
......@@ -78,27 +78,6 @@ class JumpPatchSite BASE_EMBEDDED {
};
static void EmitStackCheck(MacroAssembler* masm_,
int pointers = 0,
Register scratch = esp) {
Label ok;
Isolate* isolate = masm_->isolate();
ASSERT(scratch.is(esp) == (pointers == 0));
ExternalReference stack_limit;
if (pointers != 0) {
__ mov(scratch, esp);
__ sub(scratch, Immediate(pointers * kPointerSize));
stack_limit = ExternalReference::address_of_real_stack_limit(isolate);
} else {
stack_limit = ExternalReference::address_of_stack_limit(isolate);
}
__ cmp(scratch, Operand::StaticVariable(stack_limit));
__ j(above_equal, &ok, Label::kNear);
__ call(isolate->builtins()->StackCheck(), RelocInfo::CODE_TARGET);
__ bind(&ok);
}
// Generate code for a JS function. On entry to the function the receiver
// and arguments have been pushed on the stack left to right, with the
// return address on top of them. The actual argument count matches the
......@@ -168,7 +147,15 @@ void FullCodeGenerator::Generate() {
__ push(Immediate(isolate()->factory()->undefined_value()));
} else if (locals_count > 1) {
if (locals_count >= 128) {
EmitStackCheck(masm_, locals_count, ecx);
Label ok;
__ mov(ecx, esp);
__ sub(ecx, Immediate(locals_count * kPointerSize));
ExternalReference stack_limit =
ExternalReference::address_of_real_stack_limit(isolate());
__ cmp(ecx, Operand::StaticVariable(stack_limit));
__ j(above_equal, &ok, Label::kNear);
__ InvokeBuiltin(Builtins::STACK_OVERFLOW, CALL_FUNCTION);
__ bind(&ok);
}
__ mov(eax, Immediate(isolate()->factory()->undefined_value()));
const int kMaxPushes = 32;
......@@ -308,7 +295,13 @@ void FullCodeGenerator::Generate() {
{ Comment cmnt(masm_, "[ Stack check");
PrepareForBailoutForId(BailoutId::Declarations(), NO_REGISTERS);
EmitStackCheck(masm_);
Label ok;
ExternalReference stack_limit
= ExternalReference::address_of_stack_limit(isolate());
__ cmp(esp, Operand::StaticVariable(stack_limit));
__ j(above_equal, &ok, Label::kNear);
__ call(isolate()->builtins()->StackCheck(), RelocInfo::CODE_TARGET);
__ bind(&ok);
}
{ Comment cmnt(masm_, "[ Body");
......
......@@ -1076,7 +1076,8 @@ int RegExpMacroAssemblerX87::CheckStackGuardState(Address* return_address,
Code* re_code,
Address re_frame) {
Isolate* isolate = frame_entry<Isolate*>(re_frame, kIsolate);
if (isolate->stack_guard()->IsStackOverflow()) {
StackLimitCheck check(isolate);
if (check.JsHasOverflowed()) {
isolate->StackOverflow();
return EXCEPTION;
}
......
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