X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fv8%2Fsrc%2Farm%2Fcpu-arm.cc;h=9c7104eb95a72961d3abffbb8cf0054a30eb183c;hb=4a1a0bdd01eef90b0826a0e761d3379d3715c10f;hp=4ff82a78d4287e1ad3cb5d24bf339377d21e824d;hpb=b1be5ca53587d23e7aeb77b26861fdc0a181ffd8;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/v8/src/arm/cpu-arm.cc b/src/v8/src/arm/cpu-arm.cc index 4ff82a7..9c7104e 100644 --- a/src/v8/src/arm/cpu-arm.cc +++ b/src/v8/src/arm/cpu-arm.cc @@ -16,18 +16,16 @@ #if V8_TARGET_ARCH_ARM -#include "src/cpu.h" +#include "src/assembler.h" #include "src/macro-assembler.h" #include "src/simulator.h" // for cache flushing. namespace v8 { namespace internal { -void CPU::FlushICache(void* start, size_t size) { - // Nothing to do flushing no instructions. - if (size == 0) { - return; - } + +void CpuFeatures::FlushICache(void* start, size_t size) { + if (size == 0) return; #if defined(USE_SIMULATOR) // Not generating ARM instructions for C-code. This means that we are @@ -36,47 +34,31 @@ void CPU::FlushICache(void* start, size_t size) { // None of this code ends up in the snapshot so there are no issues // around whether or not to generate the code when building snapshots. Simulator::FlushICache(Isolate::Current()->simulator_i_cache(), start, size); + #elif V8_OS_QNX msync(start, size, MS_SYNC | MS_INVALIDATE_ICACHE); + #else - // Ideally, we would call - // syscall(__ARM_NR_cacheflush, start, - // reinterpret_cast(start) + size, 0); - // however, syscall(int, ...) is not supported on all platforms, especially - // not when using EABI, so we call the __ARM_NR_cacheflush syscall directly. + register uint32_t beg asm("r0") = reinterpret_cast(start); + register uint32_t end asm("r1") = beg + size; + register uint32_t flg asm("r2") = 0; + + asm volatile( + // This assembly works for both ARM and Thumb targets. + + // Preserve r7; it is callee-saved, and GCC uses it as a frame pointer for + // Thumb targets. + " push {r7}\n" + // r0 = beg + // r1 = end + // r2 = flags (0) + " ldr r7, =%c[scno]\n" // r7 = syscall number + " svc 0\n" - register uint32_t beg asm("a1") = reinterpret_cast(start); - register uint32_t end asm("a2") = - reinterpret_cast(start) + size; - register uint32_t flg asm("a3") = 0; - #if defined (__arm__) && !defined(__thumb__) - // __arm__ may be defined in thumb mode. - register uint32_t scno asm("r7") = __ARM_NR_cacheflush; - asm volatile( - "svc 0x0" - : "=r" (beg) - : "0" (beg), "r" (end), "r" (flg), "r" (scno)); - #else - // r7 is reserved by the EABI in thumb mode. - asm volatile( - "@ Enter ARM Mode \n\t" - "adr r3, 1f \n\t" - "bx r3 \n\t" - ".ALIGN 4 \n\t" - ".ARM \n" - "1: push {r7} \n\t" - "mov r7, %4 \n\t" - "svc 0x0 \n\t" - "pop {r7} \n\t" - "@ Enter THUMB Mode\n\t" - "adr r3, 2f+1 \n\t" - "bx r3 \n\t" - ".THUMB \n" - "2: \n\t" - : "=r" (beg) - : "0" (beg), "r" (end), "r" (flg), "r" (__ARM_NR_cacheflush) - : "r3"); - #endif + " pop {r7}\n" + : + : "r" (beg), "r" (end), "r" (flg), [scno] "i" (__ARM_NR_cacheflush) + : "memory"); #endif }