| /* 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 <inttypes.h> |
| |
| // 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 */ |