| 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 Cygwin goes here. For the POSIX-compatible | 5 // Platform-specific code for Cygwin goes here. For the POSIX-compatible |
| 6 // parts, the implementation is in platform-posix.cc. | 6 // parts, the implementation is in platform-posix.cc. |
| 7 | 7 |
| 8 #include <errno.h> | 8 #include <errno.h> |
| 9 #include <pthread.h> | 9 #include <pthread.h> |
| 10 #include <semaphore.h> | 10 #include <semaphore.h> |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 // Nothing to do on Cygwin. | 172 // Nothing to do on Cygwin. |
| 173 } | 173 } |
| 174 | 174 |
| 175 | 175 |
| 176 // The VirtualMemory implementation is taken from platform-win32.cc. | 176 // The VirtualMemory implementation is taken from platform-win32.cc. |
| 177 // The mmap-based virtual memory implementation as it is used on most posix | 177 // The mmap-based virtual memory implementation as it is used on most posix |
| 178 // platforms does not work well because Cygwin does not support MAP_FIXED. | 178 // platforms does not work well because Cygwin does not support MAP_FIXED. |
| 179 // This causes VirtualMemory::Commit to not always commit the memory region | 179 // This causes VirtualMemory::Commit to not always commit the memory region |
| 180 // specified. | 180 // specified. |
| 181 | 181 |
| 182 static void* GetRandomAddr() { | |
| 183 Isolate* isolate = Isolate::UncheckedCurrent(); | |
| 184 // Note that the current isolate isn't set up in a call path via | |
| 185 // CpuFeatures::Probe. We don't care about randomization in this case because | |
| 186 // the code page is immediately freed. | |
| 187 if (isolate != NULL) { | |
| 188 // The address range used to randomize RWX allocations in OS::Allocate | |
| 189 // Try not to map pages into the default range that windows loads DLLs | |
| 190 // Use a multiple of 64k to prevent committing unused memory. | |
| 191 // Note: This does not guarantee RWX regions will be within the | |
| 192 // range kAllocationRandomAddressMin to kAllocationRandomAddressMax | |
| 193 #ifdef V8_HOST_ARCH_64_BIT | |
| 194 static const intptr_t kAllocationRandomAddressMin = 0x0000000080000000; | |
| 195 static const intptr_t kAllocationRandomAddressMax = 0x000003FFFFFF0000; | |
| 196 #else | |
| 197 static const intptr_t kAllocationRandomAddressMin = 0x04000000; | |
| 198 static const intptr_t kAllocationRandomAddressMax = 0x3FFF0000; | |
| 199 #endif | |
| 200 uintptr_t address = | |
| 201 (isolate->random_number_generator()->NextInt() << kPageSizeBits) | | |
| 202 kAllocationRandomAddressMin; | |
| 203 address &= kAllocationRandomAddressMax; | |
| 204 return reinterpret_cast<void *>(address); | |
| 205 } | |
| 206 return NULL; | |
| 207 } | |
| 208 | |
| 209 | |
| 210 static void* RandomizedVirtualAlloc(size_t size, int action, int protection) { | 182 static void* RandomizedVirtualAlloc(size_t size, int action, int protection) { |
| 211 LPVOID base = NULL; | 183 LPVOID base = NULL; |
| 212 | 184 |
| 213 if (protection == PAGE_EXECUTE_READWRITE || protection == PAGE_NOACCESS) { | 185 if (protection == PAGE_EXECUTE_READWRITE || protection == PAGE_NOACCESS) { |
| 214 // For exectutable pages try and randomize the allocation address | 186 // For exectutable pages try and randomize the allocation address |
| 215 for (size_t attempts = 0; base == NULL && attempts < 3; ++attempts) { | 187 for (size_t attempts = 0; base == NULL && attempts < 3; ++attempts) { |
| 216 base = VirtualAlloc(GetRandomAddr(), size, action, protection); | 188 base = VirtualAlloc(OS::GetRandomMmapAddr(), size, action, protection); |
| 217 } | 189 } |
| 218 } | 190 } |
| 219 | 191 |
| 220 // After three attempts give up and let the OS find an address to use. | 192 // After three attempts give up and let the OS find an address to use. |
| 221 if (base == NULL) base = VirtualAlloc(NULL, size, action, protection); | 193 if (base == NULL) base = VirtualAlloc(NULL, size, action, protection); |
| 222 | 194 |
| 223 return base; | 195 return base; |
| 224 } | 196 } |
| 225 | 197 |
| 226 | 198 |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 return VirtualFree(base, 0, MEM_RELEASE) != 0; | 294 return VirtualFree(base, 0, MEM_RELEASE) != 0; |
| 323 } | 295 } |
| 324 | 296 |
| 325 | 297 |
| 326 bool VirtualMemory::HasLazyCommits() { | 298 bool VirtualMemory::HasLazyCommits() { |
| 327 // TODO(alph): implement for the platform. | 299 // TODO(alph): implement for the platform. |
| 328 return false; | 300 return false; |
| 329 } | 301 } |
| 330 | 302 |
| 331 } } // namespace v8::base | 303 } } // namespace v8::base |
| OLD | NEW |