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