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) 31 32namespace JSC { 33 34size_t ExecutableAllocator::pageSize = 0; 35 36#if ENABLE(EXECUTABLE_ALLOCATOR_DEMAND) 37 38void ExecutableAllocator::intializePageSize() 39{ 40#if OS(SYMBIAN) && CPU(ARMV5_OR_LOWER) 41 // The moving memory model (as used in ARMv5 and earlier platforms) 42 // on Symbian OS limits the number of chunks for each process to 16. 43 // To mitigate this limitation increase the pagesize to allocate 44 // fewer, larger chunks. Set the page size to 256 Kb to compensate 45 // for moving memory model limitation 46 ExecutableAllocator::pageSize = 256 * 1024; 47#else 48 ExecutableAllocator::pageSize = WTF::pageSize(); 49#endif 50} 51 52ExecutablePool::Allocation ExecutablePool::systemAlloc(size_t size) 53{ 54 PageAllocation allocation = PageAllocation::allocate(size, OSAllocator::JSJITCodePages, EXECUTABLE_POOL_WRITABLE, true); 55 if (!allocation) 56 CRASH(); 57 return allocation; 58} 59 60void ExecutablePool::systemRelease(ExecutablePool::Allocation& allocation) 61{ 62 allocation.deallocate(); 63} 64 65bool ExecutableAllocator::isValid() const 66{ 67 return true; 68} 69 70bool ExecutableAllocator::underMemoryPressure() 71{ 72 return false; 73} 74 75size_t ExecutableAllocator::committedByteCount() 76{ 77 return 0; 78} 79 80#endif 81 82#if ENABLE(ASSEMBLER_WX_EXCLUSIVE) 83 84#if OS(WINDOWS) || OS(SYMBIAN) 85#error "ASSEMBLER_WX_EXCLUSIVE not yet suported on this platform." 86#endif 87 88void ExecutableAllocator::reprotectRegion(void* start, size_t size, ProtectionSetting setting) 89{ 90 if (!pageSize) 91 intializePageSize(); 92 93 // Calculate the start of the page containing this region, 94 // and account for this extra memory within size. 95 intptr_t startPtr = reinterpret_cast<intptr_t>(start); 96 intptr_t pageStartPtr = startPtr & ~(pageSize - 1); 97 void* pageStart = reinterpret_cast<void*>(pageStartPtr); 98 size += (startPtr - pageStartPtr); 99 100 // Round size up 101 size += (pageSize - 1); 102 size &= ~(pageSize - 1); 103 104 mprotect(pageStart, size, (setting == Writable) ? PROTECTION_FLAGS_RW : PROTECTION_FLAGS_RX); 105} 106 107#endif 108 109#if CPU(ARM_TRADITIONAL) && OS(LINUX) && COMPILER(RVCT) 110 111__asm void ExecutableAllocator::cacheFlush(void* code, size_t size) 112{ 113 ARM 114 push {r7} 115 add r1, r1, r0 116 mov r7, #0xf0000 117 add r7, r7, #0x2 118 mov r2, #0x0 119 svc #0x0 120 pop {r7} 121 bx lr 122} 123 124#endif 125 126} 127 128#endif // HAVE(ASSEMBLER) 129