12efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5e014e5bf9ccd6a759add3b35ba610f3a0c752a90machenbach@chromium.org// Platform-specific code for Linux goes here. For the POSIX-compatible
6e014e5bf9ccd6a759add3b35ba610f3a0c752a90machenbach@chromium.org// parts, the implementation is in platform-posix.cc.
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <pthread.h>
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <semaphore.h>
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <signal.h>
115d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org#include <sys/prctl.h>
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <sys/time.h>
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <sys/resource.h>
14303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org#include <sys/syscall.h>
15381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org#include <sys/types.h>
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <stdlib.h>
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Ubuntu Dapper requires memory pages to be marked as
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// executable. Otherwise, OS raises an exception when executing code
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// in that page.
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <sys/types.h>  // mmap & munmap
22236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org#include <sys/mman.h>   // mmap & munmap
23236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org#include <sys/stat.h>   // open
24bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org#include <fcntl.h>      // open
25bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org#include <unistd.h>     // sysconf
26236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org#include <strings.h>    // index
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <errno.h>
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <stdarg.h>
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
30471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org// GLibc on ARM defines mcontext_t has a typedef for 'struct sigcontext'.
31471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org// Old versions of the C library <signal.h> didn't define the type.
32471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org#if defined(__ANDROID__) && !defined(__BIONIC_HAVE_UCONTEXT_T) && \
33f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    (defined(__arm__) || defined(__aarch64__)) && \
34f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    !defined(__BIONIC_HAVE_STRUCT_SIGCONTEXT)
35471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org#include <asm/sigcontext.h>
36471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org#endif
37471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
38e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org#if defined(LEAK_SANITIZER)
39e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org#include <sanitizer/lsan_interface.h>
40e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org#endif
41e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef MAP_TYPE
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
46196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/platform.h"
4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
5071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#ifdef __arm__
54169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
55c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.orgbool OS::ArmUsingHardFloat() {
56c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org  // GCC versions 4.6 and above define __ARM_PCS or __ARM_PCS_VFP to specify
57c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org  // the Floating Point ABI used (PCS stands for Procedure Call Standard).
58c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org  // We use these as well as a couple of other defines to statically determine
59c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org  // what FP ABI used.
60c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org  // GCC versions 4.4 and below don't support hard-fp.
61c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org  // GCC versions 4.5 may support hard-fp without defining __ARM_PCS or
62c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org  // __ARM_PCS_VFP.
63c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org
64c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org#define GCC_VERSION (__GNUC__ * 10000                                          \
65c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                     + __GNUC_MINOR__ * 100                                    \
66c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                     + __GNUC_PATCHLEVEL__)
67c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org#if GCC_VERSION >= 40600
68c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org#if defined(__ARM_PCS_VFP)
69c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org  return true;
708e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org#else
71c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org  return false;
72c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org#endif
738e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
74c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org#elif GCC_VERSION < 40500
75c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org  return false;
768e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
77c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org#else
78c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org#if defined(__ARM_PCS_VFP)
79c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org  return true;
80594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#elif defined(__ARM_PCS) || defined(__SOFTFP__) || defined(__SOFTFP) || \
81594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      !defined(__VFP_FP__)
82c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org  return false;
83c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org#else
84c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org#error "Your version of GCC does not report the FP ABI compiled for."          \
85c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org       "Please report it on this issue"                                        \
86c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org       "http://code.google.com/p/v8/issues/detail?id=2140"
87c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org
88c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org#endif
89c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org#endif
90c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org#undef GCC_VERSION
918e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org}
92c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org
93c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#endif  // def __arm__
94c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
95c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
966b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgconst char* OS::LocalTimezone(double time, TimezoneCache* cache) {
9777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  if (std::isnan(time)) return "";
98e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org  time_t tv = static_cast<time_t>(std::floor(time/msPerSecond));
99b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  struct tm* t = localtime(&tv);
100b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  if (NULL == t) return "";
101b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  return t->tm_zone;
102b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}
103b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
104b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1056b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgdouble OS::LocalTimeOffset(TimezoneCache* cache) {
106b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  time_t tv = time(NULL);
107b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  struct tm* t = localtime(&tv);
108b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // tm_gmtoff includes any daylight savings offset, so subtract it.
109b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  return static_cast<double>(t->tm_gmtoff * msPerSecond -
110b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org                             (t->tm_isdst > 0 ? 3600 * msPerSecond : 0));
111b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}
112b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
113b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1147276f14ca716596e0a0d17539516370c1f453847kasper.lundvoid* OS::Allocate(const size_t requested,
1157276f14ca716596e0a0d17539516370c1f453847kasper.lund                   size_t* allocated,
116f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org                   bool is_executable) {
117c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  const size_t msize = RoundUp(requested, AllocateAlignment());
118f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  int prot = PROT_READ | PROT_WRITE | (is_executable ? PROT_EXEC : 0);
119b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org  void* addr = OS::GetRandomMmapAddr();
1209fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org  void* mbase = mmap(addr, msize, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
1211845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  if (mbase == MAP_FAILED) return NULL;
12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  *allocated = msize;
12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return mbase;
12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass PosixMemoryMappedFile : public OS::MemoryMappedFile {
12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PosixMemoryMappedFile(FILE* file, void* memory, int size)
13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    : file_(file), memory_(memory), size_(size) { }
13143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual ~PosixMemoryMappedFile();
13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual void* memory() { return memory_; }
1330a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  virtual int size() { return size_; }
13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  FILE* file_;
13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void* memory_;
13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int size_;
13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1410a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgOS::MemoryMappedFile* OS::MemoryMappedFile::open(const char* name) {
1423a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  FILE* file = fopen(name, "r+");
1430a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  if (file == NULL) return NULL;
1440a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1450a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  fseek(file, 0, SEEK_END);
1460a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  int size = ftell(file);
1470a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1480a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  void* memory =
149b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org      mmap(OS::GetRandomMmapAddr(),
150b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org           size,
151b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org           PROT_READ | PROT_WRITE,
152b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org           MAP_SHARED,
153b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org           fileno(file),
154b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org           0);
1550a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  return new PosixMemoryMappedFile(file, memory, size);
1560a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org}
1570a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1580a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
15943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenOS::MemoryMappedFile* OS::MemoryMappedFile::create(const char* name, int size,
16043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    void* initial) {
16143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  FILE* file = fopen(name, "w+");
16243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (file == NULL) return NULL;
1639258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  int result = fwrite(initial, size, 1, file);
1649258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  if (result < 1) {
1659258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    fclose(file);
1669258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    return NULL;
1679258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  }
16843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void* memory =
169b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org      mmap(OS::GetRandomMmapAddr(),
170b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org           size,
171b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org           PROT_READ | PROT_WRITE,
172b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org           MAP_SHARED,
173b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org           fileno(file),
174b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org           0);
17543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return new PosixMemoryMappedFile(file, memory, size);
17643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
17743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPosixMemoryMappedFile::~PosixMemoryMappedFile() {
180c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (memory_) OS::Free(memory_, size_);
18143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  fclose(file_);
18243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
184a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
1851845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgstd::vector<OS::SharedLibraryAddress> OS::GetSharedLibraryAddresses() {
1861845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  std::vector<SharedLibraryAddress> result;
187b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org  // This function assumes that the layout of the file is as follows:
188b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org  // hex_start_addr-hex_end_addr rwxp <unused data> [binary_file_name]
189b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org  // If we encounter an unexpected situation we abort scanning further entries.
190c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  FILE* fp = fopen("/proc/self/maps", "r");
1911845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  if (fp == NULL) return result;
192b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org
193b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org  // Allocate enough room to be able to store a full file name.
194b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org  const int kLibNameLen = FILENAME_MAX + 1;
195b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org  char* lib_name = reinterpret_cast<char*>(malloc(kLibNameLen));
196b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org
197b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org  // This loop will terminate once the scanning hits an EOF.
19843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  while (true) {
1990b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org    uintptr_t start, end;
2000b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org    char attr_r, attr_w, attr_x, attr_p;
201b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org    // Parse the addresses and permission bits at the beginning of the line.
2020b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org    if (fscanf(fp, "%" V8PRIxPTR "-%" V8PRIxPTR, &start, &end) != 2) break;
2030b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org    if (fscanf(fp, " %c%c%c%c", &attr_r, &attr_w, &attr_x, &attr_p) != 4) break;
204b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org
2050b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org    int c;
206ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    if (attr_r == 'r' && attr_w != 'w' && attr_x == 'x') {
207ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org      // Found a read-only executable entry. Skip characters until we reach
208b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org      // the beginning of the filename or the end of the line.
209b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org      do {
210b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org        c = getc(fp);
21146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      } while ((c != EOF) && (c != '\n') && (c != '/') && (c != '['));
212b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org      if (c == EOF) break;  // EOF: Was unexpected, just exit.
213b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org
214b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org      // Process the filename if found.
21546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      if ((c == '/') || (c == '[')) {
21646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org        // Push the '/' or '[' back into the stream to be read below.
21746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org        ungetc(c, fp);
218b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org
219b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org        // Read to the end of the line. Exit if the read fails.
220b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org        if (fgets(lib_name, kLibNameLen, fp) == NULL) break;
221b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org
222b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org        // Drop the newline character read by fgets. We do not need to check
223b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org        // for a zero-length string because we know that we at least read the
22446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org        // '/' or '[' character.
2250b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org        lib_name[strlen(lib_name) - 1] = '\0';
2260b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org      } else {
227b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org        // No library name found, just record the raw address range.
228b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org        snprintf(lib_name, kLibNameLen,
2290b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org                 "%08" V8PRIxPTR "-%08" V8PRIxPTR, start, end);
2300b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org      }
2311845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org      result.push_back(SharedLibraryAddress(lib_name, start, end));
232b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org    } else {
233f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com      // Entry not describing executable data. Skip to end of line to set up
234b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org      // reading the next entry.
235b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org      do {
236b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org        c = getc(fp);
237b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org      } while ((c != EOF) && (c != '\n'));
238b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org      if (c == EOF) break;
2395aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    }
24043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
241b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org  free(lib_name);
2420b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  fclose(fp);
2431845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  return result;
24443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
24543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
24643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2474a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgvoid OS::SignalCodeMovingGC() {
2484a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // Support for ll_prof.py.
2494a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  //
2504a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // The Linux profiler built into the kernel logs all mmap's with
2514a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // PROT_EXEC so that analysis tools can properly attribute ticks. We
2524a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // do a mmap with a name known by ll_prof.py and immediately munmap
2534a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // it. This injects a GC marker into the stream of events generated
2544a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // by the kernel and allows us to synchronize V8 code log and the
2554a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // kernel log.
2564a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  int size = sysconf(_SC_PAGESIZE);
257de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  FILE* f = fopen(FLAG_gc_fake_mmap, "w+");
258b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  if (f == NULL) {
259b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    OS::PrintError("Failed to open %s\n", FLAG_gc_fake_mmap);
260b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    OS::Abort();
261b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  }
262b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org  void* addr = mmap(OS::GetRandomMmapAddr(),
263b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org                    size,
264ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#if defined(__native_client__)
265ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                    // The Native Client port of V8 uses an interpreter,
266ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                    // so code pages don't need PROT_EXEC.
267ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                    PROT_READ,
268ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#else
269b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org                    PROT_READ | PROT_EXEC,
270ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#endif
271b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org                    MAP_PRIVATE,
272b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org                    fileno(f),
273b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org                    0);
2744a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  ASSERT(addr != MAP_FAILED);
275c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  OS::Free(addr, size);
2764a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  fclose(f);
2774a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org}
2784a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
2794a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
28043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Constants used for mmap.
28143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic const int kMmapFd = -1;
28243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic const int kMmapFdOffset = 0;
28343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
284e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
285c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comVirtualMemory::VirtualMemory() : address_(NULL), size_(0) { }
28643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
287e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
288e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgVirtualMemory::VirtualMemory(size_t size)
289e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    : address_(ReserveRegion(size)), size_(size) { }
29043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
292c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comVirtualMemory::VirtualMemory(size_t size, size_t alignment)
293c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    : address_(NULL), size_(0) {
294c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  ASSERT(IsAligned(alignment, static_cast<intptr_t>(OS::AllocateAlignment())));
295c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  size_t request_size = RoundUp(size + alignment,
296c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                static_cast<intptr_t>(OS::AllocateAlignment()));
297b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org  void* reservation = mmap(OS::GetRandomMmapAddr(),
298c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                           request_size,
299c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                           PROT_NONE,
300c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                           MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE,
301c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                           kMmapFd,
302c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                           kMmapFdOffset);
303c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (reservation == MAP_FAILED) return;
304c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
305c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  Address base = static_cast<Address>(reservation);
306c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  Address aligned_base = RoundUp(base, alignment);
307c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  ASSERT_LE(base, aligned_base);
308c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
309c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Unmap extra memory reserved before and after the desired block.
310c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (aligned_base != base) {
311c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    size_t prefix_size = static_cast<size_t>(aligned_base - base);
312c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    OS::Free(base, prefix_size);
313c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    request_size -= prefix_size;
314c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
315c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
316c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  size_t aligned_size = RoundUp(size, OS::AllocateAlignment());
317c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  ASSERT_LE(aligned_size, request_size);
318c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
319c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (aligned_size != request_size) {
320c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    size_t suffix_size = request_size - aligned_size;
321c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    OS::Free(aligned_base + aligned_size, suffix_size);
322c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    request_size -= suffix_size;
323c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
324c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
325c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  ASSERT(aligned_size == request_size);
326c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
327c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  address_ = static_cast<void*>(aligned_base);
328c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  size_ = aligned_size;
329e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org#if defined(LEAK_SANITIZER)
330e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org  __lsan_register_root_region(address_, size_);
331e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org#endif
332c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
333c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
334c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
33543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenVirtualMemory::~VirtualMemory() {
33643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (IsReserved()) {
337c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    bool result = ReleaseRegion(address(), size());
338c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    ASSERT(result);
339c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    USE(result);
34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
34143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool VirtualMemory::IsReserved() {
345c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return address_ != NULL;
346c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
347c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
348c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
349c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid VirtualMemory::Reset() {
350c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  address_ = NULL;
351c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  size_ = 0;
35243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
35343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
355f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.orgbool VirtualMemory::Commit(void* address, size_t size, bool is_executable) {
356c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return CommitRegion(address, size, is_executable);
357c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
358c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
359c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
360c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool VirtualMemory::Uncommit(void* address, size_t size) {
361c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return UncommitRegion(address, size);
362c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
363c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
364c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
365ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgbool VirtualMemory::Guard(void* address) {
366ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  OS::Guard(address, OS::CommitPageSize());
367ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  return true;
368ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org}
369ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org
370ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org
371c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid* VirtualMemory::ReserveRegion(size_t size) {
372b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org  void* result = mmap(OS::GetRandomMmapAddr(),
373c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                      size,
374c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                      PROT_NONE,
375c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                      MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE,
376c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                      kMmapFd,
377c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                      kMmapFdOffset);
378c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
379c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (result == MAP_FAILED) return NULL;
380c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
381e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org#if defined(LEAK_SANITIZER)
382e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org  __lsan_register_root_region(result, size);
383e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org#endif
384c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return result;
385c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
386c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
387c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
388c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool VirtualMemory::CommitRegion(void* base, size_t size, bool is_executable) {
389ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#if defined(__native_client__)
390ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  // The Native Client port of V8 uses an interpreter,
391ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  // so code pages don't need PROT_EXEC.
392ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  int prot = PROT_READ | PROT_WRITE;
393ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#else
394f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  int prot = PROT_READ | PROT_WRITE | (is_executable ? PROT_EXEC : 0);
395ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#endif
396c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (MAP_FAILED == mmap(base,
397c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                         size,
398c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                         prot,
39943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                         MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
400c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                         kMmapFd,
401c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                         kMmapFdOffset)) {
40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return false;
40343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
40443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return true;
40643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
409c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool VirtualMemory::UncommitRegion(void* base, size_t size) {
410c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return mmap(base,
411c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com              size,
412c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com              PROT_NONE,
413a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org              MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_FIXED,
414c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com              kMmapFd,
415c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com              kMmapFdOffset) != MAP_FAILED;
416c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
417c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
418c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
419c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool VirtualMemory::ReleaseRegion(void* base, size_t size) {
420e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org#if defined(LEAK_SANITIZER)
421e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org  __lsan_unregister_root_region(base, size);
422e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org#endif
423c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return munmap(base, size) == 0;
42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
42543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42772204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.orgbool VirtualMemory::HasLazyCommits() {
42872204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org  return true;
42972204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org}
43072204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org
43143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
432