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