1eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org// Copyright 2006-2009 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// CPU specific code for arm independent of OS goes here. 6013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org#ifdef __arm__ 79ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org#ifdef __QNXNTO__ 89ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org#include <sys/mman.h> // for cache flushing. 99ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org#undef MAP_TYPE 109ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org#else 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <sys/syscall.h> // for cache flushing. 127276f14ca716596e0a0d17539516370c1f453847kasper.lund#endif 139ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org#endif 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_ARM 189dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 195de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/assembler.h" 20196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/macro-assembler.h" 21196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/simulator.h" // for cache flushing. 22013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org 2371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 2471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 275de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgvoid CpuFeatures::FlushICache(void* start, size_t size) { 28975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org if (size == 0) return; 293a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 309ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org#if defined(USE_SIMULATOR) 3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Not generating ARM instructions for C-code. This means that we are 32013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org // building an ARM emulator based target. We should notify the simulator 33013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org // that the Icache was flushed. 34eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // None of this code ends up in the snapshot so there are no issues 35eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // around whether or not to generate the code when building snapshots. 36ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Simulator::FlushICache(Isolate::Current()->simulator_i_cache(), start, size); 37975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 389ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org#elif V8_OS_QNX 399ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org msync(start, size, MS_SYNC | MS_INVALIDATE_ICACHE); 40975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#else 42975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org register uint32_t beg asm("r0") = reinterpret_cast<uint32_t>(start); 43975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org register uint32_t end asm("r1") = beg + size; 44975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org register uint32_t flg asm("r2") = 0; 45975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 46975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org asm volatile( 47975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org // This assembly works for both ARM and Thumb targets. 48975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 49975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org // Preserve r7; it is callee-saved, and GCC uses it as a frame pointer for 50975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org // Thumb targets. 51975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org " push {r7}\n" 52975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org // r0 = beg 53975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org // r1 = end 54975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org // r2 = flags (0) 5508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org " ldr r7, =%c[scno]\n" // r7 = syscall number 56975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org " svc 0\n" 5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 58975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org " pop {r7}\n" 59975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org : 60975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org : "r" (beg), "r" (end), "r" (flg), [scno] "i" (__ARM_NR_cacheflush) 61975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org : "memory"); 6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 669dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 679dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#endif // V8_TARGET_ARCH_ARM 68