18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2007-2008 The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms. 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful, 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/ 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Virtual hardware for bridging the FUSE kernel module 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * in the emulated OS and outside file system 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "qemu_file.h" 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "goldfish_trace.h" 1808c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych#include "goldfish_vmem.h" 194e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner#include "sysemu.h" 20406a59bd0a2e7a38cd840a5c08602e3a36bd2df8David 'Digit' Turner#include "android-trace.h" 215389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_MEMCHECK 225389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#include "memcheck/memcheck.h" 234e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner#include "memcheck/memcheck_util.h" 245389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif // CONFIG_MEMCHECK 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner/* Set to 1 to debug tracing */ 27335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner#define DEBUG 0 28335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner 29335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner#if DEBUG 30335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner# define D(...) printf(__VA_ARGS__), fflush(stdout) 31335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner#else 32335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner# define D(...) ((void)0) 33335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner#endif 34335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner 35335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner/* Set to 1 to debug PID tracking */ 36335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner#define DEBUG_PID 0 37335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner 38335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner#if DEBUG_PID 39335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner# define DPID(...) printf(__VA_ARGS__), fflush(stdout) 40335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner#else 41335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner# define DPID(...) ((void)0) 42335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner#endif 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void cpu_loop_exit(void); 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int tracing; 475389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkineextern const char *trace_filename; 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* for execve */ 50b91980562344f6a3b719bfe4be007fa9406e585fDavid Turnerstatic char exec_path[CLIENT_PAGE_SIZE]; 51b91980562344f6a3b719bfe4be007fa9406e585fDavid Turnerstatic char exec_arg[CLIENT_PAGE_SIZE]; 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic unsigned long vstart; // VM start 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic unsigned long vend; // VM end 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic unsigned long eoff; // offset in EXE file 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic unsigned cmdlen; // cmdline length 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic unsigned pid; // PID (really thread id) 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic unsigned tgid; // thread group id (really process id) 58335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turnerstatic unsigned tid; // current thread id (same as pid, most of the time) 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic unsigned long dsaddr; // dynamic symbol address 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic unsigned long unmap_start; // start address to unmap 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* for context switch */ 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//static unsigned long cs_pid; // context switch PID 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* I/O write */ 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void trace_dev_write(void *opaque, target_phys_addr_t offset, uint32_t value) 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project trace_dev_state *s = (trace_dev_state *)opaque; 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 704e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner (void)s; 714e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (offset >> 2) { 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_SWITCH: // context switch, switch to pid 74335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner DPID("QEMU.trace: context switch tid=%u\n", value); 755389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 765389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine trace_switch(value); 77335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner D("QEMU.trace: kernel, context switch %u\n", value); 785389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 795389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_MEMCHECK 805389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (memcheck_enabled) { 815389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine memcheck_switch(value); 825389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 835389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif // CONFIG_MEMCHECK 84335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner tid = (unsigned) value; 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_TGID: // save the tgid for the following fork/clone 87335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner DPID("QEMU.trace: tgid=%u\n", value); 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tgid = value; 895389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 90335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner D("QEMU.trace: kernel, tgid %u\n", value); 915389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_FORK: // fork, fork new pid 94335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner DPID("QEMU.trace: fork (pid=%d tgid=%d value=%d)\n", pid, tgid, value); 955389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 965389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine trace_fork(tgid, value); 97335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner D("QEMU.trace: kernel, fork %u\n", value); 985389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 995389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_MEMCHECK 1005389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (memcheck_enabled) { 1015389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine memcheck_fork(tgid, value); 1025389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 1035389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif // CONFIG_MEMCHECK 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_CLONE: // fork, clone new pid (i.e. thread) 106335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner DPID("QEMU.trace: clone (pid=%d tgid=%d value=%d)\n", pid, tgid, value); 1075389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 1085389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine trace_clone(tgid, value); 109335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner D("QEMU.trace: kernel, clone %u\n", value); 1105389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 1115389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_MEMCHECK 1125389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (memcheck_enabled) { 1135389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine memcheck_clone(tgid, value); 1145389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 1155389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif // CONFIG_MEMCHECK 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_EXECVE_VMSTART: // execve, vstart 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project vstart = value; 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_EXECVE_VMEND: // execve, vend 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project vend = value; 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_EXECVE_OFFSET: // execve, offset in EXE 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project eoff = value; 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_EXECVE_EXEPATH: // init exec, path of EXE 127b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner vstrcpy(value, exec_path, CLIENT_PAGE_SIZE); 1285389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 129b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner trace_init_exec(vstart, vend, eoff, exec_path); 130335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner D("QEMU.trace: kernel, init exec [%lx,%lx]@%lx [%s]\n", 131335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner vstart, vend, eoff, exec_path); 1325389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 1335389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_MEMCHECK 1345389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (memcheck_enabled) { 135b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner if (exec_path[0] == '\0') { 1365389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine // vstrcpy may fail to copy path. In this case lets do it 1375389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine // differently. 138b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner memcheck_get_guest_kernel_string(exec_path, value, CLIENT_PAGE_SIZE); 1395389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 140b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner memcheck_mmap_exepath(vstart, vend, eoff, exec_path); 1415389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 1425389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif // CONFIG_MEMCHECK 143b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner exec_path[0] = 0; 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_CMDLINE_LEN: // execve, process cmdline length 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cmdlen = value; 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_CMDLINE: // execve, process cmdline 14908c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych safe_memory_rw_debug(cpu_single_env, value, (uint8_t*)exec_arg, cmdlen, 0); 1505389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 151b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner trace_execve(exec_arg, cmdlen); 1525389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 1535389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_MEMCHECK 1545389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (memcheck_enabled) { 155b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner memcheck_set_cmd_line(exec_arg, cmdlen); 1565389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 1575389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif // CONFIG_MEMCHECK 158335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner#if DEBUG || DEBUG_PID 1595389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < cmdlen; i ++) 162b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner if (i != cmdlen - 1 && exec_arg[i] == 0) 163b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner exec_arg[i] = ' '; 164b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner printf("QEMU.trace: kernel, execve %s[%d]\n", exec_arg, cmdlen); 165b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner exec_arg[0] = 0; 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_EXIT: // exit, exit current process with exit code 170335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner DPID("QEMU.trace: exit tid=%u\n", value); 1715389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 1725389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine trace_exit(value); 173335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner D("QEMU.trace: kernel, exit %x\n", value); 1745389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 1755389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_MEMCHECK 1765389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (memcheck_enabled) { 1775389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine memcheck_exit(value); 1785389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 1795389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif // CONFIG_MEMCHECK 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_NAME: // record thread name 182b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner vstrcpy(value, exec_path, CLIENT_PAGE_SIZE); 183335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner DPID("QEMU.trace: thread name=%s\n", exec_path); 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Remove the trailing newline if it exists 186b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner int len = strlen(exec_path); 187b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner if (exec_path[len - 1] == '\n') { 188b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner exec_path[len - 1] = 0; 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1905389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 191b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner trace_name(exec_path); 192335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner D("QEMU.trace: kernel, name %s\n", exec_path); 1935389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_MMAP_EXEPATH: // mmap, path of EXE, the others are same as execve 196b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner vstrcpy(value, exec_path, CLIENT_PAGE_SIZE); 197335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner DPID("QEMU.trace: mmap exe=%s\n", exec_path); 1985389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 199b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner trace_mmap(vstart, vend, eoff, exec_path); 200335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner D("QEMU.trace: kernel, mmap [%lx,%lx]@%lx [%s]\n", vstart, vend, eoff, exec_path); 2015389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 2025389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_MEMCHECK 2035389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (memcheck_enabled) { 204b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner if (exec_path[0] == '\0') { 2055389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine // vstrcpy may fail to copy path. In this case lets do it 2065389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine // differently. 207b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner memcheck_get_guest_kernel_string(exec_path, value, CLIENT_PAGE_SIZE); 2085389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 209b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner memcheck_mmap_exepath(vstart, vend, eoff, exec_path); 2105389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 2115389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif // CONFIG_MEMCHECK 212b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner exec_path[0] = 0; 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_INIT_PID: // init, name the pid that starts before device registered 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pid = value; 216335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner DPID("QEMU.trace: pid=%d\n", value); 2175389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_MEMCHECK 2185389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (memcheck_enabled) { 2195389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine memcheck_init_pid(value); 2205389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 2215389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif // CONFIG_MEMCHECK 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_INIT_NAME: // init, the comm of the init pid 224b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner vstrcpy(value, exec_path, CLIENT_PAGE_SIZE); 225335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner DPID("QEMU.trace: tgid=%d pid=%d name=%s\n", tgid, pid, exec_path); 2265389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 227b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner trace_init_name(tgid, pid, exec_path); 228335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner D("QEMU.trace: kernel, init name %u [%s]\n", pid, exec_path); 2295389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 230b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner exec_path[0] = 0; 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_DYN_SYM_ADDR: // dynamic symbol address 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dsaddr = value; 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_DYN_SYM: // add dynamic symbol 237b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner vstrcpy(value, exec_arg, CLIENT_PAGE_SIZE); 2385389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 239b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner trace_dynamic_symbol_add(dsaddr, exec_arg); 240335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner D("QEMU.trace: dynamic symbol %lx:%s\n", dsaddr, exec_arg); 2415389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 242b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner exec_arg[0] = 0; 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_REMOVE_ADDR: // remove dynamic symbol addr 2455389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 2465389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine trace_dynamic_symbol_remove(value); 247335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner D("QEMU.trace: dynamic symbol remove %lx\n", dsaddr); 2485389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_PRINT_STR: // print string 252b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner vstrcpy(value, exec_arg, CLIENT_PAGE_SIZE); 253b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner printf("%s", exec_arg); 254b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner exec_arg[0] = 0; 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_PRINT_NUM_DEC: // print number in decimal 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("%d", value); 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_PRINT_NUM_HEX: // print number in hexical 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("%x", value); 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_STOP_EMU: // stop the VM execution 2645389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 2655389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine // To ensure that the number of instructions executed in this 2665389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine // block is correct, we pretend that there was an exception. 2675389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine trace_exception(0); 2685389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cpu_single_env->exception_index = EXCP_HLT; 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cpu_single_env->halted = 1; 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_system_shutdown_request(); 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cpu_loop_exit(); 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_ENABLE: // tracing enable: 0 = stop, 1 = start 2765389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (value == 1) { 2775389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 2785389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine start_tracing(); 2795389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 2805389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (value == 0) { 2825389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 2835389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine stop_tracing(); 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2855389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine // To ensure that the number of instructions executed in this 2865389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine // block is correct, we pretend that there was an exception. 2875389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine trace_exception(0); 2885389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_UNMAP_START: 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unmap_start = value; 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_UNMAP_END: 2965389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 2975389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine trace_munmap(unmap_start, value); 2985389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 2995389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_MEMCHECK 3005389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (memcheck_enabled) { 3015389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine memcheck_unmap(unmap_start, value); 3025389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 3035389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif // CONFIG_MEMCHECK 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3069980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra case TRACE_DEV_REG_METHOD_ENTRY: 3079980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra case TRACE_DEV_REG_METHOD_EXIT: 3089980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra case TRACE_DEV_REG_METHOD_EXCEPTION: 309e3ea32ffa04468eddaf9c6ce2d36090f7bf43e49Jack Veenstra case TRACE_DEV_REG_NATIVE_ENTRY: 310e3ea32ffa04468eddaf9c6ce2d36090f7bf43e49Jack Veenstra case TRACE_DEV_REG_NATIVE_EXIT: 311e3ea32ffa04468eddaf9c6ce2d36090f7bf43e49Jack Veenstra case TRACE_DEV_REG_NATIVE_EXCEPTION: 3125389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (trace_filename != NULL) { 3135389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (tracing) { 3145389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine int call_type = (offset - 4096) >> 2; 3155389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine trace_interpreted_method(value, call_type); 3165389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 3175389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 3185389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine break; 3195389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 3205389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_MEMCHECK 3215389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine case TRACE_DEV_REG_MALLOC: 3225389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (memcheck_enabled) { 3235389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine memcheck_guest_alloc(value); 3245389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 3255389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine break; 3265389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 3275389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine case TRACE_DEV_REG_FREE_PTR: 3285389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (memcheck_enabled) { 3295389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine memcheck_guest_free(value); 3305389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 3315389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine break; 3325389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 3335389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine case TRACE_DEV_REG_QUERY_MALLOC: 3345389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (memcheck_enabled) { 3355389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine memcheck_guest_query_malloc(value); 3365389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 3375389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine break; 3385389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 3395389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine case TRACE_DEV_REG_LIBC_INIT: 3405389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (memcheck_enabled) { 3415389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine memcheck_guest_libc_initialized(value); 3425389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine } 3435389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine break; 3445389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine 3455389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine case TRACE_DEV_REG_PRINT_USER_STR: 3465389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (memcheck_enabled) { 3475389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine memcheck_guest_print_str(value); 3489980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra } 3499980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra break; 3505389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif // CONFIG_MEMCHECK 3519980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 3539980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra if (offset < 4096) { 3549980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra cpu_abort(cpu_single_env, "trace_dev_write: Bad offset %x\n", offset); 355335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner } else { 356335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner D("%s: offset=%d (0x%x) value=%d (0x%x)\n", __FUNCTION__, offset, 357335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner offset, value, value); 3589980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra } 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* I/O read */ 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic uint32_t trace_dev_read(void *opaque, target_phys_addr_t offset) 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project trace_dev_state *s = (trace_dev_state *)opaque; 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3684e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner (void)s; 3694e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (offset >> 2) { 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TRACE_DEV_REG_ENABLE: // tracing enable 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return tracing; 373335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 3759980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra if (offset < 4096) { 3769980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra cpu_abort(cpu_single_env, "trace_dev_read: Bad offset %x\n", offset); 377335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner } else { 378335d2c1342bb887ac67f1f60cff795f0c06beacaDavid 'Digit' Turner D("%s: offset=%d (0x%x)\n", __FUNCTION__, offset, offset); 3799980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra } 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic CPUReadMemoryFunc *trace_dev_readfn[] = { 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project trace_dev_read, 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project trace_dev_read, 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project trace_dev_read 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic CPUWriteMemoryFunc *trace_dev_writefn[] = { 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project trace_dev_write, 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project trace_dev_write, 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project trace_dev_write 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* initialize the trace device */ 3989980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstravoid trace_dev_init() 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project trace_dev_state *s; 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s = (trace_dev_state *)qemu_mallocz(sizeof(trace_dev_state)); 4039980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra s->dev.name = "qemu_trace"; 4049980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra s->dev.id = -1; 4059980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra s->dev.base = 0; // will be allocated dynamically 4069980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra s->dev.size = 0x2000; 4079980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra s->dev.irq = 0; 4089980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra s->dev.irq_count = 0; 4099980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra 4109980bbb9965ee2df42f94aafa817e91835dad406Jack Veenstra goldfish_device_add(&s->dev, trace_dev_readfn, trace_dev_writefn, s); 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 412b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner exec_path[0] = exec_arg[0] = '\0'; 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 414