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