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