1eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org// Copyright 2006-2009 the V8 project authors. All rights reserved.
243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without
343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met:
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions of source code must retain the above copyright
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       notice, this list of conditions and the following disclaimer.
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions in binary form must reproduce the above
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       copyright notice, this list of conditions and the following
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       disclaimer in the documentation and/or other materials provided
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       with the distribution.
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Neither the name of Google Inc. nor the names of its
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       contributors may be used to endorse or promote products derived
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       from this software without specific prior written permission.
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// CPU specific code for arm independent of OS goes here.
29013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org#ifdef __arm__
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <sys/syscall.h>  // for cache flushing.
317276f14ca716596e0a0d17539516370c1f453847kasper.lund#endif
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "v8.h"
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_ARM
369dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "cpu.h"
38c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#include "macro-assembler.h"
39303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org#include "simulator.h"  // for cache flushing.
40013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org
4171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
4271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comvoid CPU::SetUp() {
45c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  CpuFeatures::Probe();
46c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org}
47c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
48c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
49c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgbool CPU::SupportsCrankshaft() {
50c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  return CpuFeatures::IsSupported(VFP3);
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid CPU::FlushICache(void* start, size_t size) {
553a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // Nothing to do flushing no instructions.
563a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  if (size == 0) {
573a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    return;
583a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  }
593a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
60303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org#if defined (USE_SIMULATOR)
6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Not generating ARM instructions for C-code. This means that we are
62013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  // building an ARM emulator based target.  We should notify the simulator
63013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  // that the Icache was flushed.
64eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // None of this code ends up in the snapshot so there are no issues
65eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // around whether or not to generate the code when building snapshots.
66ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Simulator::FlushICache(Isolate::Current()->simulator_i_cache(), start, size);
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#else
6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Ideally, we would call
6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  //   syscall(__ARM_NR_cacheflush, start,
7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  //           reinterpret_cast<intptr_t>(start) + size, 0);
7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // however, syscall(int, ...) is not supported on all platforms, especially
7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // not when using EABI, so we call the __ARM_NR_cacheflush syscall directly.
7343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  register uint32_t beg asm("a1") = reinterpret_cast<uint32_t>(start);
7543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  register uint32_t end asm("a2") =
7643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      reinterpret_cast<uint32_t>(start) + size;
7743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  register uint32_t flg asm("a3") = 0;
7844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  #if defined (__arm__) && !defined(__thumb__)
7944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    // __arm__ may be defined in thumb mode.
8044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    register uint32_t scno asm("r7") = __ARM_NR_cacheflush;
8144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    asm volatile(
8244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        "svc 0x0"
8344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        : "=r" (beg)
8444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        : "0" (beg), "r" (end), "r" (flg), "r" (scno));
8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  #else
8644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    // r7 is reserved by the EABI in thumb mode.
8744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    asm volatile(
8844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    "@   Enter ARM Mode  \n\t"
8944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        "adr r3, 1f      \n\t"
9044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        "bx  r3          \n\t"
9144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        ".ALIGN 4        \n\t"
9244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        ".ARM            \n"
9344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    "1:  push {r7}       \n\t"
9444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        "mov r7, %4      \n\t"
9544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        "svc 0x0         \n\t"
9644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        "pop {r7}        \n\t"
9744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    "@   Enter THUMB Mode\n\t"
9844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        "adr r3, 2f+1    \n\t"
9944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        "bx  r3          \n\t"
10044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        ".THUMB          \n"
10144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    "2:                  \n\t"
10244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        : "=r" (beg)
10344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        : "0" (beg), "r" (end), "r" (flg), "r" (__ARM_NR_cacheflush)
10444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        : "r3");
10543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  #endif
10643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif
10743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
1109dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
1119dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#endif  // V8_TARGET_ARCH_ARM
112