/* Copyright (C) 2006-2007 The Android Open Source Project ** ** This software is licensed under the terms of the GNU General Public ** License version 2, as published by the Free Software Foundation, and ** may be copied, distributed, and modified under those terms. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. */ #ifndef TRACE_COMMON_H #define TRACE_COMMON_H #include // This should be the same as OPC_BUF_SIZE #define kMaxInsnPerBB 512 #define kMaxNumBasicBlocks 1024 #define kMaxNumAddrs 1024 #define kInsnBufferSize 1024 #define kCompressedSize 8192 #define kMethodEnter 0 #define kMethodExit 1 #define kMethodException 2 #define kNativeEnter 4 #define kNativeExit 5 #define kNativeException 6 // The trace identifier string must be less than 16 characters. #define TRACE_IDENT "qemu_trace_file" #define TRACE_VERSION 2 typedef struct TraceHeader { char ident[16]; int version; uint32_t start_sec; uint32_t start_usec; uint32_t pdate; uint32_t ptime; uint32_t num_used_pids; // number of distinct process ids used int first_unused_pid; // -1 if all 32,768 pids are used (unlikely) uint8_t padding[4]; // next field is 8-byte aligned uint64_t num_static_bb; uint64_t num_static_insn; uint64_t num_dynamic_bb; uint64_t num_dynamic_insn; uint64_t elapsed_usecs; } TraceHeader; typedef struct BBRec { uint64_t start_time; // time of first occurrence uint64_t bb_num; // basic block number uint32_t repeat; // repeat count (= 0 if just one occurrence) uint64_t time_diff; // diff from previous time (if repeat > 0) } BBRec; // Define a trace record for addresses that miss in the cache typedef struct AddrRec { uint64_t time; uint32_t addr; } AddrRec; // Define a trace record for the start time of each instruction typedef struct InsnRec { uint64_t time_diff; // time difference from last instruction uint32_t repeat; // repeat count } InsnRec; // Define record types for process id changes. #define kPidEndOfFile 0 #define kPidFork 1 #define kPidClone 2 #define kPidSwitch 3 #define kPidExec 4 #define kPidMmap 5 #define kPidExit 6 #define kPidKthreadName 7 #define kPidSymbolAdd 8 #define kPidSymbolRemove 9 #define kPidMunmap 10 #define kPidNoAction 11 #define kPidName 12 #define bswap16(x) ((((x) & 0xff) << 8) | (((x) >> 8) & 0xff)) #define bswap32(x) ((((x) & 0xff) << 24) | (((x) & 0xff00) << 8) \ | (((x) >> 8) & 0xff00) | (((x) >> 24) & 0xff)) #define bswap64(x) (((x) << 56) | (((x) & 0xff00) << 40) \ | (((x) & 0xff0000) << 24) | (((x) & 0xff000000ull) << 8) \ | (((x) >> 8) & 0xff000000ull) | (((x) >> 24) & 0xff0000) \ | (((x) >> 40) & 0xff00) | ((x) >> 56)) #if BYTE_ORDER == LITTLE_ENDIAN #define hostToLE16(x) (x) #define hostToLE32(x) (x) #define hostToLE64(x) (x) #define LE16ToHost(x) (x) #define LE32ToHost(x) (x) #define LE64ToHost(x) (x) #define convert16(x) #define convert32(x) #define convert64(x) #else #define hostToLE16(x) bswap16(x) #define hostToLE32(x) bswap32(x) #define hostToLE64(x) bswap64(x) #define LE16ToHost(x) bswap16(x) #define LE32ToHost(x) bswap32(x) #define LE64ToHost(x) bswap64(x) #define convert16(x) (x = bswap16(x)) #define convert32(x) (x = bswap32(x)) #define convert64(x) (x = bswap64(x)) #endif /* XXX: we wrap 16-bit thumb instructions into 32-bit undefined ARM instructions * for simplicity reasons. See section 3.13.1 section of the ARM ARM for details * on the undefined instruction space we're using */ static __inline__ int insn_is_thumb(uint32_t insn) { return ((insn & 0xfff000f0) == 0xf7f000f0); } static __inline__ uint32_t insn_wrap_thumb(uint32_t insn) { return 0xf7f000f0 | ((insn & 0xfff0) << 4) | (insn & 0x000f); } static __inline__ uint32_t insn_unwrap_thumb(uint32_t insn) { return ((insn >> 4) & 0xfff0) | (insn & 0x000f); } #endif /* TRACE_COMMON_H */