1fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org// Copyright 2012 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. 45c838251403b0be9a882540f1922577abba4c872ager@chromium.org 55c838251403b0be9a882540f1922577abba4c872ager@chromium.org// CPU specific code for arm independent of OS goes here. 65c838251403b0be9a882540f1922577abba4c872ager@chromium.org 75c838251403b0be9a882540f1922577abba4c872ager@chromium.org#include <sys/syscall.h> 85c838251403b0be9a882540f1922577abba4c872ager@chromium.org#include <unistd.h> 95c838251403b0be9a882540f1922577abba4c872ager@chromium.org 105c838251403b0be9a882540f1922577abba4c872ager@chromium.org#ifdef __mips 115c838251403b0be9a882540f1922577abba4c872ager@chromium.org#include <asm/cachectl.h> 125c838251403b0be9a882540f1922577abba4c872ager@chromium.org#endif // #ifdef __mips 135c838251403b0be9a882540f1922577abba4c872ager@chromium.org 14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 159dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 1693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_MIPS 179dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 185de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/assembler.h" 19196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/macro-assembler.h" 207516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 21196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/simulator.h" // For cache flushing. 225c838251403b0be9a882540f1922577abba4c872ager@chromium.org 235c838251403b0be9a882540f1922577abba4c872ager@chromium.orgnamespace v8 { 245c838251403b0be9a882540f1922577abba4c872ager@chromium.orgnamespace internal { 255c838251403b0be9a882540f1922577abba4c872ager@chromium.org 267516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 275de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgvoid CpuFeatures::FlushICache(void* start, size_t size) { 2883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org // Nothing to do, flushing no instructions. 2983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org if (size == 0) { 3083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org return; 3183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } 3283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org 337516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#if !defined (USE_SIMULATOR) 34fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org#if defined(ANDROID) 35fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Bionic cacheflush can typically run in userland, avoiding kernel call. 36fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org char *end = reinterpret_cast<char *>(start) + size; 37fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org cacheflush( 38fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org reinterpret_cast<intptr_t>(start), reinterpret_cast<intptr_t>(end), 0); 39fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org#else // ANDROID 405c838251403b0be9a882540f1922577abba4c872ager@chromium.org int res; 4183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org // See http://www.linux-mips.org/wiki/Cacheflush_Syscall. 425c838251403b0be9a882540f1922577abba4c872ager@chromium.org res = syscall(__NR_cacheflush, start, size, ICACHE); 435c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (res) { 445c838251403b0be9a882540f1922577abba4c872ager@chromium.org V8_Fatal(__FILE__, __LINE__, "Failed to flush the instruction cache"); 455c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 46fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org#endif // ANDROID 477516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#else // USE_SIMULATOR. 487516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org // Not generating mips instructions for C-code. This means that we are 497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org // building a mips emulator based target. We should notify the simulator 507516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org // that the Icache was flushed. 517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org // None of this code ends up in the snapshot so there are no issues 527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org // around whether or not to generate the code when building snapshots. 537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Simulator::FlushICache(Isolate::Current()->simulator_i_cache(), start, size); 547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#endif // USE_SIMULATOR. 555c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 565c838251403b0be9a882540f1922577abba4c872ager@chromium.org 575c838251403b0be9a882540f1922577abba4c872ager@chromium.org} } // namespace v8::internal 585c838251403b0be9a882540f1922577abba4c872ager@chromium.org 599dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#endif // V8_TARGET_ARCH_MIPS 60