1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CPU specific code for arm independent of OS goes here. 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <sys/syscall.h> 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <unistd.h> 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef __mips 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <asm/cachectl.h> 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // #ifdef __mips 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TARGET_ARCH_MIPS64 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/assembler.h" 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/macro-assembler.h" 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/simulator.h" // For cache flushing. 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid CpuFeatures::FlushICache(void* start, size_t size) { 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !defined(USE_SIMULATOR) 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Nothing to do, flushing no instructions. 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (size == 0) { 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if defined(ANDROID) && !defined(__LP64__) 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Bionic cacheflush can typically run in userland, avoiding kernel call. 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char *end = reinterpret_cast<char *>(start) + size; 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cacheflush( 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<intptr_t>(start), reinterpret_cast<intptr_t>(end), 0); 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else // ANDROID 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch long res; // NOLINT(runtime/int) 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // See http://www.linux-mips.org/wiki/Cacheflush_Syscall. 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch res = syscall(__NR_cacheflush, start, size, ICACHE); 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (res) { 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_Fatal(__FILE__, __LINE__, "Failed to flush the instruction cache"); 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // ANDROID 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // !USE_SIMULATOR. 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // V8_TARGET_ARCH_MIPS64 52