| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Platform-specific code for POSIX goes here. This is not a platform on its | 5 // Platform-specific code for POSIX goes here. This is not a platform on its |
| 6 // own, but contains the parts which are the same across the POSIX platforms | 6 // own, but contains the parts which are the same across the POSIX platforms |
| 7 // Linux, MacOS, FreeBSD, OpenBSD, NetBSD and QNX. | 7 // Linux, MacOS, FreeBSD, OpenBSD, NetBSD and QNX. |
| 8 | 8 |
| 9 #include <dlfcn.h> | 9 #include <dlfcn.h> |
| 10 #include <errno.h> | 10 #include <errno.h> |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 | 36 |
| 37 #undef MAP_TYPE | 37 #undef MAP_TYPE |
| 38 | 38 |
| 39 #if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT) | 39 #if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT) |
| 40 #define LOG_TAG "v8" | 40 #define LOG_TAG "v8" |
| 41 #include <android/log.h> // NOLINT | 41 #include <android/log.h> // NOLINT |
| 42 #endif | 42 #endif |
| 43 | 43 |
| 44 #include "src/v8.h" | 44 #include "src/v8.h" |
| 45 | 45 |
| 46 #include "src/isolate-inl.h" | 46 #include "src/base/lazy-instance.h" |
| 47 #include "src/platform.h" | 47 #include "src/platform.h" |
| 48 #include "src/utils/random-number-generator.h" |
| 48 | 49 |
| 49 #ifdef V8_FAST_TLS_SUPPORTED | 50 #ifdef V8_FAST_TLS_SUPPORTED |
| 50 #include "src/base/atomicops.h" | 51 #include "src/base/atomicops.h" |
| 51 #endif | 52 #endif |
| 52 | 53 |
| 53 namespace v8 { | 54 namespace v8 { |
| 54 namespace internal { | 55 namespace internal { |
| 55 | 56 |
| 56 // 0 is never a valid thread id. | 57 // 0 is never a valid thread id. |
| 57 static const pthread_t kNoThread = (pthread_t) 0; | 58 static const pthread_t kNoThread = (pthread_t) 0; |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 void OS::Guard(void* address, const size_t size) { | 180 void OS::Guard(void* address, const size_t size) { |
| 180 #if V8_OS_CYGWIN | 181 #if V8_OS_CYGWIN |
| 181 DWORD oldprotect; | 182 DWORD oldprotect; |
| 182 VirtualProtect(address, size, PAGE_NOACCESS, &oldprotect); | 183 VirtualProtect(address, size, PAGE_NOACCESS, &oldprotect); |
| 183 #else | 184 #else |
| 184 mprotect(address, size, PROT_NONE); | 185 mprotect(address, size, PROT_NONE); |
| 185 #endif | 186 #endif |
| 186 } | 187 } |
| 187 | 188 |
| 188 | 189 |
| 190 static base::LazyInstance<RandomNumberGenerator>::type |
| 191 platform_random_number_generator = LAZY_INSTANCE_INITIALIZER; |
| 192 |
| 193 |
| 194 void OS::SetRandomSeed(int64_t seed) { |
| 195 platform_random_number_generator.Pointer()->SetSeed(seed); |
| 196 } |
| 197 |
| 198 |
| 189 void* OS::GetRandomMmapAddr() { | 199 void* OS::GetRandomMmapAddr() { |
| 190 #if V8_OS_NACL | 200 #if V8_OS_NACL |
| 191 // TODO(bradchen): restore randomization once Native Client gets | 201 // TODO(bradchen): restore randomization once Native Client gets |
| 192 // smarter about using mmap address hints. | 202 // smarter about using mmap address hints. |
| 193 // See http://code.google.com/p/nativeclient/issues/3341 | 203 // See http://code.google.com/p/nativeclient/issues/3341 |
| 194 return NULL; | 204 return NULL; |
| 195 #endif | 205 #endif |
| 196 #if defined(ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER) || \ | 206 #if defined(ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER) || \ |
| 197 defined(THREAD_SANITIZER) | 207 defined(THREAD_SANITIZER) |
| 198 // Dynamic tools do not support custom mmap addresses. | 208 // Dynamic tools do not support custom mmap addresses. |
| 199 return NULL; | 209 return NULL; |
| 200 #endif | 210 #endif |
| 201 Isolate* isolate = Isolate::UncheckedCurrent(); | 211 uintptr_t raw_addr; |
| 202 // Note that the current isolate isn't set up in a call path via | 212 platform_random_number_generator.Pointer()->NextBytes(&raw_addr, |
| 203 // CpuFeatures::Probe. We don't care about randomization in this case because | 213 sizeof(raw_addr)); |
| 204 // the code page is immediately freed. | |
| 205 if (isolate != NULL) { | |
| 206 uintptr_t raw_addr; | |
| 207 isolate->random_number_generator()->NextBytes(&raw_addr, sizeof(raw_addr)); | |
| 208 #if V8_TARGET_ARCH_X64 | 214 #if V8_TARGET_ARCH_X64 |
| 209 // Currently available CPUs have 48 bits of virtual addressing. Truncate | 215 // Currently available CPUs have 48 bits of virtual addressing. Truncate |
| 210 // the hint address to 46 bits to give the kernel a fighting chance of | 216 // the hint address to 46 bits to give the kernel a fighting chance of |
| 211 // fulfilling our placement request. | 217 // fulfilling our placement request. |
| 212 raw_addr &= V8_UINT64_C(0x3ffffffff000); | 218 raw_addr &= V8_UINT64_C(0x3ffffffff000); |
| 213 #else | 219 #else |
| 214 raw_addr &= 0x3ffff000; | 220 raw_addr &= 0x3ffff000; |
| 215 | 221 |
| 216 # ifdef __sun | 222 # ifdef __sun |
| 217 // For our Solaris/illumos mmap hint, we pick a random address in the bottom | 223 // For our Solaris/illumos mmap hint, we pick a random address in the bottom |
| 218 // half of the top half of the address space (that is, the third quarter). | 224 // half of the top half of the address space (that is, the third quarter). |
| 219 // Because we do not MAP_FIXED, this will be treated only as a hint -- the | 225 // Because we do not MAP_FIXED, this will be treated only as a hint -- the |
| 220 // system will not fail to mmap() because something else happens to already | 226 // system will not fail to mmap() because something else happens to already |
| 221 // be mapped at our random address. We deliberately set the hint high enough | 227 // be mapped at our random address. We deliberately set the hint high enough |
| 222 // to get well above the system's break (that is, the heap); Solaris and | 228 // to get well above the system's break (that is, the heap); Solaris and |
| 223 // illumos will try the hint and if that fails allocate as if there were | 229 // illumos will try the hint and if that fails allocate as if there were |
| 224 // no hint at all. The high hint prevents the break from getting hemmed in | 230 // no hint at all. The high hint prevents the break from getting hemmed in |
| 225 // at low values, ceding half of the address space to the system heap. | 231 // at low values, ceding half of the address space to the system heap. |
| 226 raw_addr += 0x80000000; | 232 raw_addr += 0x80000000; |
| 227 # else | 233 # else |
| 228 // The range 0x20000000 - 0x60000000 is relatively unpopulated across a | 234 // The range 0x20000000 - 0x60000000 is relatively unpopulated across a |
| 229 // variety of ASLR modes (PAE kernel, NX compat mode, etc) and on macos | 235 // variety of ASLR modes (PAE kernel, NX compat mode, etc) and on macos |
| 230 // 10.6 and 10.7. | 236 // 10.6 and 10.7. |
| 231 raw_addr += 0x20000000; | 237 raw_addr += 0x20000000; |
| 232 # endif | 238 # endif |
| 233 #endif | 239 #endif |
| 234 return reinterpret_cast<void*>(raw_addr); | 240 return reinterpret_cast<void*>(raw_addr); |
| 235 } | |
| 236 return NULL; | |
| 237 } | 241 } |
| 238 | 242 |
| 239 | 243 |
| 240 size_t OS::AllocateAlignment() { | 244 size_t OS::AllocateAlignment() { |
| 241 return static_cast<size_t>(sysconf(_SC_PAGESIZE)); | 245 return static_cast<size_t>(sysconf(_SC_PAGESIZE)); |
| 242 } | 246 } |
| 243 | 247 |
| 244 | 248 |
| 245 void OS::Sleep(int milliseconds) { | 249 void OS::Sleep(int milliseconds) { |
| 246 useconds_t ms = static_cast<useconds_t>(milliseconds); | 250 useconds_t ms = static_cast<useconds_t>(milliseconds); |
| (...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 691 | 695 |
| 692 void Thread::SetThreadLocal(LocalStorageKey key, void* value) { | 696 void Thread::SetThreadLocal(LocalStorageKey key, void* value) { |
| 693 pthread_key_t pthread_key = LocalKeyToPthreadKey(key); | 697 pthread_key_t pthread_key = LocalKeyToPthreadKey(key); |
| 694 int result = pthread_setspecific(pthread_key, value); | 698 int result = pthread_setspecific(pthread_key, value); |
| 695 ASSERT_EQ(0, result); | 699 ASSERT_EQ(0, result); |
| 696 USE(result); | 700 USE(result); |
| 697 } | 701 } |
| 698 | 702 |
| 699 | 703 |
| 700 } } // namespace v8::internal | 704 } } // namespace v8::internal |
| OLD | NEW |