LGTM On Thu, Jul 21, 2011 at 1:34 AM, <[email protected]> wrote:
> Reviewers: Chris Evans, > > Description: > Revert "Implement mapping randomization for 64-bit Linux." > > Causes sputnik test failures. > > [email protected] > BUG= > TEST= > > > Please review this at > http://codereview.chromium.**org/7468023/<http://codereview.chromium.org/7468023/> > > SVN Base: > https://v8.googlecode.com/svn/**branches/bleeding_edge<https://v8.googlecode.com/svn/branches/bleeding_edge> > > Affected files: > M src/platform-linux.cc > > > Index: src/platform-linux.cc > diff --git a/src/platform-linux.cc b/src/platform-linux.cc > index 37330be82ba3b16146be383ba451e5**60c5accc32..** > bc280ea0a06069474e45e3d19e85a5**b65ca49c8b 100644 > --- a/src/platform-linux.cc > +++ b/src/platform-linux.cc > @@ -78,33 +78,13 @@ double ceiling(double x) { > static Mutex* limit_mutex = NULL; > > > -static void* GetRandomMmapAddr() { > - Isolate* isolate = Isolate::UncheckedCurrent(); > - // Note that the current isolate isn't set up in a call path via > - // CpuFeatures::Probe. We don't care about randomization in this case > because > - // the code page is immediately freed. > - if (isolate != NULL) { > -#ifdef V8_TARGET_ARCH_X64 > - uint64_t rnd1 = V8::RandomPrivate(isolate); > - uint64_t rnd2 = V8::RandomPrivate(isolate); > - uint64_t raw_addr = (rnd1 << 32) ^ rnd2; > - raw_addr &= V8_UINT64_C(0x3ffffffff000); > -#else > - uint32_t raw_addr = V8::RandomPrivate(isolate); > - // The range 0x20000000 - 0x60000000 is relatively unpopulated across > a > - // variety of ASLR modes (PAE kernel, NX compat mode, etc). > - raw_addr &= 0x3ffff000; > - raw_addr += 0x20000000; > -#endif > - return reinterpret_cast<void*>(raw_**addr); > - } > - return NULL; > -} > - > - > void OS::Setup() { > - // Seed the random number generator. We preserve microsecond resolution. > - uint64_t seed = Ticks() ^ (getpid() << 16); > + // Seed the random number generator. > + // Convert the current time to a 64-bit integer first, before converting > it > + // to an unsigned. Going directly can cause an overflow and the seed to > be > + // set to all ones. The seed will be identical for different instances > that > + // call this setup code within the same millisecond. > + uint64_t seed = static_cast<uint64_t>(**TimeCurrentMillis()); > srandom(static_cast<unsigned int>(seed)); > limit_mutex = CreateMutex(); > > @@ -387,10 +367,10 @@ size_t OS::AllocateAlignment() { > void* OS::Allocate(const size_t requested, > size_t* allocated, > bool is_executable) { > + // TODO(805): Port randomization of allocated executable memory to > Linux. > const size_t msize = RoundUp(requested, sysconf(_SC_PAGESIZE)); > int prot = PROT_READ | PROT_WRITE | (is_executable ? PROT_EXEC : 0); > - void* addr = GetRandomMmapAddr(); > - void* mbase = mmap(addr, msize, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, > 0); > + void* mbase = mmap(NULL, msize, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, > 0); > if (mbase == MAP_FAILED) { > LOG(i::Isolate::Current(), > StringEvent("OS::Allocate", "mmap failed")); > @@ -606,7 +586,7 @@ static const int kMmapFdOffset = 0; > > > VirtualMemory::VirtualMemory(**size_t size) { > - address_ = mmap(GetRandomMmapAddr(), size, PROT_NONE, > + address_ = mmap(NULL, size, PROT_NONE, > MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, > kMmapFd, kMmapFdOffset); > size_ = size; > > > -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
