1/* 2 * Copyright (C) 2008 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27 28#include "ExecutableAllocator.h" 29 30#if ENABLE(ASSEMBLER) && OS(UNIX) && !OS(SYMBIAN) 31 32#include <sys/mman.h> 33#include <unistd.h> 34#include <wtf/VMTags.h> 35 36namespace JSC { 37 38#if !(OS(DARWIN) && CPU(X86_64)) 39 40void ExecutableAllocator::intializePageSize() 41{ 42 ExecutableAllocator::pageSize = getpagesize(); 43} 44 45ExecutablePool::Allocation ExecutablePool::systemAlloc(size_t n) 46{ 47 void* allocation = mmap(NULL, n, INITIAL_PROTECTION_FLAGS, MAP_PRIVATE | MAP_ANON, VM_TAG_FOR_EXECUTABLEALLOCATOR_MEMORY, 0); 48 if (allocation == MAP_FAILED) 49 CRASH(); 50 ExecutablePool::Allocation alloc = { reinterpret_cast<char*>(allocation), n }; 51 return alloc; 52} 53 54void ExecutablePool::systemRelease(const ExecutablePool::Allocation& alloc) 55{ 56 int result = munmap(alloc.pages, alloc.size); 57 ASSERT_UNUSED(result, !result); 58} 59 60#endif // !(OS(DARWIN) && CPU(X86_64)) 61 62#if ENABLE(ASSEMBLER_WX_EXCLUSIVE) 63void ExecutableAllocator::reprotectRegion(void* start, size_t size, ProtectionSeting setting) 64{ 65 if (!pageSize) 66 intializePageSize(); 67 68 // Calculate the start of the page containing this region, 69 // and account for this extra memory within size. 70 intptr_t startPtr = reinterpret_cast<intptr_t>(start); 71 intptr_t pageStartPtr = startPtr & ~(pageSize - 1); 72 void* pageStart = reinterpret_cast<void*>(pageStartPtr); 73 size += (startPtr - pageStartPtr); 74 75 // Round size up 76 size += (pageSize - 1); 77 size &= ~(pageSize - 1); 78 79 mprotect(pageStart, size, (setting == Writable) ? PROTECTION_FLAGS_RW : PROTECTION_FLAGS_RX); 80} 81#endif 82 83} 84 85#endif // HAVE(ASSEMBLER) 86