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 32 namespace JSC { 33 34 size_t ExecutableAllocator::pageSize = 0; 35 36 #if ENABLE(EXECUTABLE_ALLOCATOR_DEMAND) 37 38 void 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 52 ExecutablePool::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 60 void ExecutablePool::systemRelease(ExecutablePool::Allocation& allocation) 61 { 62 allocation.deallocate(); 63 } 64 65 bool ExecutableAllocator::isValid() const 66 { 67 return true; 68 } 69 70 bool ExecutableAllocator::underMemoryPressure() 71 { 72 return false; 73 } 74 75 size_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 88 void 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