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