Reviewers: Sven Panne,
Description:
Reserve a page at the beginning of the code range on Win64 for SEH
BUG=v8:3597
[email protected]
LOG=n
Please review this at https://codereview.chromium.org/621743002/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+30, -4 lines):
M src/globals.h
M src/heap/spaces.cc
Index: src/globals.h
diff --git a/src/globals.h b/src/globals.h
index
3d8f57aadde42aa8a4eb06429b0b3911af3707f8..dc7568f3bc4249e57e9b1e8dc445a07e7f0be5b0
100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -147,6 +147,13 @@ const intptr_t kIntptrSignBit =
V8_INT64_C(0x8000000000000000);
const uintptr_t kUintptrAllBitsSet = V8_UINT64_C(0xFFFFFFFFFFFFFFFF);
const bool kRequiresCodeRange = true;
const size_t kMaximalCodeRangeSize = 512 * MB;
+#if V8_OS_WIN
+const size_t kMinimumCodeRangeSize = 2 * MB;
+const size_t kReservedCodeRangePages = 1;
+#else
+const size_t kMinimumCodeRangeSize = 1 * MB;
+const size_t kReservedCodeRangePages = 0;
+#endif
#else
const int kPointerSizeLog2 = 2;
const intptr_t kIntptrSignBit = 0x80000000;
@@ -155,9 +162,13 @@ const uintptr_t kUintptrAllBitsSet = 0xFFFFFFFFu;
// x32 port also requires code range.
const bool kRequiresCodeRange = true;
const size_t kMaximalCodeRangeSize = 256 * MB;
+const size_t kMinimumCodeRangeSize = 1 * MB;
+const size_t kReservedCodeRangePages = 0;
#else
const bool kRequiresCodeRange = false;
const size_t kMaximalCodeRangeSize = 0 * MB;
+const size_t kMinimumCodeRangeSize = 0 * MB;
+const size_t kReservedCodeRangePages = 0;
#endif
#endif
Index: src/heap/spaces.cc
diff --git a/src/heap/spaces.cc b/src/heap/spaces.cc
index
ae4048f452e820f58f848c7e622b9bb75a779005..6794a4e92e6ea7c730b678feaa514654115cd573
100644
--- a/src/heap/spaces.cc
+++ b/src/heap/spaces.cc
@@ -110,6 +110,10 @@ bool CodeRange::SetUp(size_t requested) {
}
}
+ if (requested < kMinimumCodeRangeSize) {
+ requested = kMinimumCodeRangeSize;
+ }
+
DCHECK(!kRequiresCodeRange || requested <= kMaximalCodeRangeSize);
code_range_ = new base::VirtualMemory(requested);
CHECK(code_range_ != NULL);
@@ -121,14 +125,25 @@ bool CodeRange::SetUp(size_t requested) {
// We are sure that we have mapped a block of requested addresses.
DCHECK(code_range_->size() == requested);
- LOG(isolate_, NewEvent("CodeRange", code_range_->address(), requested));
Address base = reinterpret_cast<Address>(code_range_->address());
- Address aligned_base =
- RoundUp(reinterpret_cast<Address>(code_range_->address()),
- MemoryChunk::kAlignment);
+
+ // On some platforms, specifically Win64, we need to reserve some pages
at
+ // the beginning of an executable space.
+ if (kReservedCodeRangePages) {
+ if (!code_range_->Commit(
+ base, kReservedCodeRangePages * base::OS::CommitPageSize(),
true)) {
+ delete code_range_;
+ code_range_ = NULL;
+ return false;
+ }
+ base += kReservedCodeRangePages * base::OS::CommitPageSize();
+ }
+ Address aligned_base = RoundUp(base, MemoryChunk::kAlignment);
size_t size = code_range_->size() - (aligned_base - base);
allocation_list_.Add(FreeBlock(aligned_base, size));
current_allocation_block_index_ = 0;
+
+ LOG(isolate_, NewEvent("CodeRange", code_range_->address(), requested));
return true;
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.