1/* Copyright (C) 2007-2008 The Android Open Source Project 2** 3** This software is licensed under the terms of the GNU General Public 4** License version 2, as published by the Free Software Foundation, and 5** may be copied, distributed, and modified under those terms. 6** 7** This program is distributed in the hope that it will be useful, 8** but WITHOUT ANY WARRANTY; without even the implied warranty of 9** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10** GNU General Public License for more details. 11*/ 12#ifndef _TRACE_DEV_H_ 13#define _TRACE_DEV_H_ 14 15#include "hw/android/goldfish/device.h" 16#include "cpu.h" 17 18#define CLIENT_PAGE_SIZE 4096 19 20/* trace device registers */ 21 22/* The indices below all corresponds to slots that can only be accessed 23 * by the guest kernel. See below for indices reachable from the guest 24 * user-land. 25 */ 26#define TRACE_DEV_REG_SWITCH 0 27#define TRACE_DEV_REG_FORK 1 28#define TRACE_DEV_REG_EXECVE_PID 2 29#define TRACE_DEV_REG_EXECVE_VMSTART 3 30#define TRACE_DEV_REG_EXECVE_VMEND 4 31#define TRACE_DEV_REG_EXECVE_OFFSET 5 32#define TRACE_DEV_REG_EXECVE_EXEPATH 6 33#define TRACE_DEV_REG_EXIT 7 34#define TRACE_DEV_REG_CMDLINE 8 35#define TRACE_DEV_REG_CMDLINE_LEN 9 36#define TRACE_DEV_REG_MMAP_EXEPATH 10 37#define TRACE_DEV_REG_INIT_PID 11 38#define TRACE_DEV_REG_INIT_NAME 12 39#define TRACE_DEV_REG_CLONE 13 40#define TRACE_DEV_REG_UNMAP_START 14 41#define TRACE_DEV_REG_UNMAP_END 15 42#define TRACE_DEV_REG_NAME 16 43#define TRACE_DEV_REG_TGID 17 44#define TRACE_DEV_REG_DYN_SYM 50 45#define TRACE_DEV_REG_DYN_SYM_ADDR 51 46#define TRACE_DEV_REG_REMOVE_ADDR 52 47#define TRACE_DEV_REG_PRINT_STR 60 48#define TRACE_DEV_REG_PRINT_NUM_DEC 61 49#define TRACE_DEV_REG_PRINT_NUM_HEX 62 50#define TRACE_DEV_REG_STOP_EMU 90 51#define TRACE_DEV_REG_ENABLE 100 52 53/* NOTE: The device's second physical page is mapped to /dev/qemu_trace 54 * This means that if you do the following: 55 * 56 * magicPage = my_mmap("/dev/qemu_trace", ...); 57 * *(uint32_t*)magicPage[index] = value; 58 * 59 * The write at address magicPage+index*4 here will be seen 60 * by the device as a write to the i/o offset 4096 + index*4, 61 * i.e. (1024 + index)*4. 62 * 63 * As a consequence, any index defined below corresponds to 64 * location (index-1024)*4 in the mmapped page in the guest. 65 */ 66 67/* The first 64 entries are reserved for VM instrumentation */ 68#define TRACE_DEV_REG_METHOD_ENTRY 1024 69#define TRACE_DEV_REG_METHOD_EXIT 1025 70#define TRACE_DEV_REG_METHOD_EXCEPTION 1026 71#define TRACE_DEV_REG_NATIVE_ENTRY 1028 72#define TRACE_DEV_REG_NATIVE_EXIT 1029 73#define TRACE_DEV_REG_NATIVE_EXCEPTION 1030 74 75/* Next, QEMUD fast pipes */ 76#define TRACE_DEV_PIPE_BASE 1280 /* 1024 + (64*4) */ 77#define TRACE_DEV_PIPE_COMMAND (TRACE_DEV_PIPE_BASE + 0) 78#define TRACE_DEV_PIPE_STATUS (TRACE_DEV_PIPE_BASE + 0) 79#define TRACE_DEV_PIPE_ADDRESS (TRACE_DEV_PIPE_BASE + 1) 80#define TRACE_DEV_PIPE_SIZE (TRACE_DEV_PIPE_BASE + 2) 81#define TRACE_DEV_PIPE_CHANNEL (TRACE_DEV_PIPE_BASE + 3) 82 83/* These entries are reserved for libc instrumentation, i.e. memcheck */ 84#if 0 /* see memcheck_common.h */ 85#define TRACE_DEV_REG_MEMCHECK 1536 /* 1024 + (128*4) */ 86#define TRACE_DEV_REG_LIBC_INIT (TRACE_DEV_REG_MEMCHECK + MEMCHECK_EVENT_LIBC_INIT) 87#define TRACE_DEV_REG_MALLOC (TRACE_DEV_REG_MEMCHECK + MEMCHECK_EVENT_MALLOC) 88#define TRACE_DEV_REG_FREE_PTR (TRACE_DEV_REG_MEMCHECK + MEMCHECK_EVENT_FREE_PTR) 89#define TRACE_DEV_REG_QUERY_MALLOC (TRACE_DEV_REG_MEMCHECK + MEMCHECK_EVENT_QUERY_MALLOC) 90#define TRACE_DEV_REG_PRINT_USER_STR (TRACE_DEV_REG_MEMCHECK + MEMCHECK_EVENT_PRINT_USER_STR) 91#endif 92 93/* the virtual trace device state */ 94typedef struct { 95 struct goldfish_device dev; 96} trace_dev_state; 97 98/* 99 * interfaces for copy from virtual space 100 * from target-arm/op_helper.c 101 */ 102extern void vstrcpy(target_ulong ptr, char *buf, int max); 103 104/* 105 * interfaces to trace module to signal kernel events 106 */ 107extern void trace_switch(int pid); 108extern void trace_fork(int tgid, int pid); 109extern void trace_clone(int tgid, int pid); 110extern void trace_execve(const char *arg, int len); 111extern void trace_exit(int exitcode); 112extern void trace_mmap(unsigned long vstart, unsigned long vend, 113 unsigned long offset, const char *path); 114extern void trace_munmap(unsigned long vstart, unsigned long vend); 115extern void trace_dynamic_symbol_add(unsigned long vaddr, const char *name); 116extern void trace_dynamic_symbol_remove(unsigned long vaddr); 117extern void trace_init_name(int tgid, int pid, const char *name); 118extern void trace_init_exec(unsigned long start, unsigned long end, 119 unsigned long offset, const char *exe); 120extern void start_tracing(void); 121extern void stop_tracing(void); 122extern void trace_exception(uint32 target_pc); 123 124#endif 125