1288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#include <stdio.h> 2288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#include <stdlib.h> 3288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#include <string.h> 4288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner 5288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#include "cpu.h" 6288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#include "exec-all.h" 7288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#include "gdbstub.h" 8288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#include "def-helper.h" 9288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#include "helper-android.h" 10288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#include "qemu-common.h" 11288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner 123011b40fe40c7261c2c838d0037157dee556faceDavid 'Digit' Turner/* copy a string from the simulated virtual space to a buffer in QEMU */ 133011b40fe40c7261c2c838d0037157dee556faceDavid 'Digit' Turnervoid vstrcpy(target_ulong ptr, char *buf, int max) 143011b40fe40c7261c2c838d0037157dee556faceDavid 'Digit' Turner{ 153011b40fe40c7261c2c838d0037157dee556faceDavid 'Digit' Turner int index; 163011b40fe40c7261c2c838d0037157dee556faceDavid 'Digit' Turner 173011b40fe40c7261c2c838d0037157dee556faceDavid 'Digit' Turner if (buf == NULL) return; 183011b40fe40c7261c2c838d0037157dee556faceDavid 'Digit' Turner 193011b40fe40c7261c2c838d0037157dee556faceDavid 'Digit' Turner for (index = 0; index < max; index += 1) { 203011b40fe40c7261c2c838d0037157dee556faceDavid 'Digit' Turner cpu_physical_memory_read(ptr + index, (uint8_t*)buf + index, 1); 213011b40fe40c7261c2c838d0037157dee556faceDavid 'Digit' Turner if (buf[index] == 0) 223011b40fe40c7261c2c838d0037157dee556faceDavid 'Digit' Turner break; 233011b40fe40c7261c2c838d0037157dee556faceDavid 'Digit' Turner } 243011b40fe40c7261c2c838d0037157dee556faceDavid 'Digit' Turner} 253011b40fe40c7261c2c838d0037157dee556faceDavid 'Digit' Turner 26288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#ifdef CONFIG_TRACE 27406a59bd0a2e7a38cd840a5c08602e3a36bd2df8David 'Digit' Turner#include "android-trace.h" 28288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner 29288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turnervoid HELPER(traceTicks)(uint32_t ticks) 30288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner{ 31288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner sim_time += ticks; 32288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner} 33288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner 34288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turnervoid HELPER(traceInsn)(void) 35288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner{ 36288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner trace_insn_helper(); 37288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner} 38288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner 39288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#if HOST_LONG_BITS == 32 40288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turnervoid HELPER(traceBB32)(uint64_t bb_num, uint32_t tb) 41288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner{ 42288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner trace_bb_helper(bb_num, (void*)tb); 43288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner} 44288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#endif 45288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner 46288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#if HOST_LONG_BITS == 64 47288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turnervoid HELPER(traceBB64)(uint64_t bb_num, uint64_t tb) 48288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner{ 49288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner trace_bb_helper(bb_num, (void*)tb); 50288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner} 51288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#endif 52288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner 53288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#endif /* CONFIG_TRACE */ 54288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner 55288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#ifdef CONFIG_MEMCHECK 56288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#include "memcheck/memcheck_api.h" 57288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner 58288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turnervoid HELPER(on_call)(target_ulong pc, target_ulong ret) { 59288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner memcheck_on_call(pc, ret); 60288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner} 61288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner 62288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turnervoid HELPER(on_ret)(target_ulong ret) { 63288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner memcheck_on_ret(ret); 64288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner} 65288208c386810fef725aa448a9f46bd2772bec8cDavid 'Digit' Turner#endif // CONFIG_MEMCHECK 66