The Android Open Source Project | 8b23a6c | 2009-03-03 19:30:32 -0800 | [diff] [blame] | 1 | /* Copyright (C) 2006-2007 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 | |
| 13 | #ifndef TRACE_COMMON_H |
| 14 | #define TRACE_COMMON_H |
| 15 | |
| 16 | #include <inttypes.h> |
| 17 | |
| 18 | // This should be the same as OPC_BUF_SIZE |
| 19 | #define kMaxInsnPerBB 512 |
| 20 | |
| 21 | #define kMaxNumBasicBlocks 1024 |
| 22 | |
| 23 | #define kMaxNumAddrs 1024 |
| 24 | |
| 25 | #define kInsnBufferSize 1024 |
| 26 | |
| 27 | #define kCompressedSize 8192 |
| 28 | |
| 29 | #define kMethodEnter 0 |
| 30 | #define kMethodExit 1 |
| 31 | #define kMethodException 2 |
Jack Veenstra | e3ea32f | 2009-05-19 14:41:14 -0700 | [diff] [blame] | 32 | #define kNativeEnter 4 |
| 33 | #define kNativeExit 5 |
| 34 | #define kNativeException 6 |
The Android Open Source Project | 8b23a6c | 2009-03-03 19:30:32 -0800 | [diff] [blame] | 35 | |
| 36 | // The trace identifier string must be less than 16 characters. |
| 37 | #define TRACE_IDENT "qemu_trace_file" |
Jack Veenstra | e3ea32f | 2009-05-19 14:41:14 -0700 | [diff] [blame] | 38 | #define TRACE_VERSION 2 |
The Android Open Source Project | 8b23a6c | 2009-03-03 19:30:32 -0800 | [diff] [blame] | 39 | |
| 40 | typedef struct TraceHeader { |
| 41 | char ident[16]; |
| 42 | int version; |
| 43 | uint32_t start_sec; |
| 44 | uint32_t start_usec; |
| 45 | uint32_t pdate; |
| 46 | uint32_t ptime; |
| 47 | uint32_t num_used_pids; // number of distinct process ids used |
| 48 | int first_unused_pid; // -1 if all 32,768 pids are used (unlikely) |
| 49 | uint8_t padding[4]; // next field is 8-byte aligned |
| 50 | uint64_t num_static_bb; |
| 51 | uint64_t num_static_insn; |
| 52 | uint64_t num_dynamic_bb; |
| 53 | uint64_t num_dynamic_insn; |
| 54 | uint64_t elapsed_usecs; |
| 55 | } TraceHeader; |
| 56 | |
| 57 | typedef struct BBRec { |
| 58 | uint64_t start_time; // time of first occurrence |
| 59 | uint64_t bb_num; // basic block number |
| 60 | uint32_t repeat; // repeat count (= 0 if just one occurrence) |
| 61 | uint64_t time_diff; // diff from previous time (if repeat > 0) |
| 62 | } BBRec; |
| 63 | |
| 64 | // Define a trace record for addresses that miss in the cache |
| 65 | typedef struct AddrRec { |
| 66 | uint64_t time; |
| 67 | uint32_t addr; |
| 68 | } AddrRec; |
| 69 | |
| 70 | // Define a trace record for the start time of each instruction |
| 71 | typedef struct InsnRec { |
| 72 | uint64_t time_diff; // time difference from last instruction |
| 73 | uint32_t repeat; // repeat count |
| 74 | } InsnRec; |
| 75 | |
| 76 | // Define record types for process id changes. |
| 77 | #define kPidEndOfFile 0 |
| 78 | #define kPidFork 1 |
| 79 | #define kPidClone 2 |
| 80 | #define kPidSwitch 3 |
| 81 | #define kPidExec 4 |
| 82 | #define kPidMmap 5 |
| 83 | #define kPidExit 6 |
| 84 | #define kPidKthreadName 7 |
| 85 | #define kPidSymbolAdd 8 |
| 86 | #define kPidSymbolRemove 9 |
| 87 | #define kPidMunmap 10 |
| 88 | #define kPidNoAction 11 |
| 89 | #define kPidName 12 |
| 90 | |
| 91 | #define bswap16(x) ((((x) & 0xff) << 8) | (((x) >> 8) & 0xff)) |
| 92 | |
| 93 | #define bswap32(x) ((((x) & 0xff) << 24) | (((x) & 0xff00) << 8) \ |
| 94 | | (((x) >> 8) & 0xff00) | (((x) >> 24) & 0xff)) |
| 95 | |
| 96 | #define bswap64(x) (((x) << 56) | (((x) & 0xff00) << 40) \ |
| 97 | | (((x) & 0xff0000) << 24) | (((x) & 0xff000000ull) << 8) \ |
| 98 | | (((x) >> 8) & 0xff000000ull) | (((x) >> 24) & 0xff0000) \ |
| 99 | | (((x) >> 40) & 0xff00) | ((x) >> 56)) |
| 100 | |
| 101 | #if BYTE_ORDER == LITTLE_ENDIAN |
| 102 | #define hostToLE16(x) (x) |
| 103 | #define hostToLE32(x) (x) |
| 104 | #define hostToLE64(x) (x) |
| 105 | #define LE16ToHost(x) (x) |
| 106 | #define LE32ToHost(x) (x) |
| 107 | #define LE64ToHost(x) (x) |
| 108 | #define convert16(x) |
| 109 | #define convert32(x) |
| 110 | #define convert64(x) |
| 111 | #else |
| 112 | #define hostToLE16(x) bswap16(x) |
| 113 | #define hostToLE32(x) bswap32(x) |
| 114 | #define hostToLE64(x) bswap64(x) |
| 115 | #define LE16ToHost(x) bswap16(x) |
| 116 | #define LE32ToHost(x) bswap32(x) |
| 117 | #define LE64ToHost(x) bswap64(x) |
| 118 | #define convert16(x) (x = bswap16(x)) |
| 119 | #define convert32(x) (x = bswap32(x)) |
| 120 | #define convert64(x) (x = bswap64(x)) |
| 121 | #endif |
| 122 | |
| 123 | /* XXX: we wrap 16-bit thumb instructions into 32-bit undefined ARM instructions |
| 124 | * for simplicity reasons. See section 3.13.1 section of the ARM ARM for details |
| 125 | * on the undefined instruction space we're using |
| 126 | */ |
| 127 | static __inline__ int insn_is_thumb(uint32_t insn) |
| 128 | { |
| 129 | return ((insn & 0xfff000f0) == 0xf7f000f0); |
| 130 | } |
| 131 | |
| 132 | static __inline__ uint32_t insn_wrap_thumb(uint32_t insn) |
| 133 | { |
| 134 | return 0xf7f000f0 | ((insn & 0xfff0) << 4) | (insn & 0x000f); |
| 135 | } |
| 136 | |
| 137 | static __inline__ uint32_t insn_unwrap_thumb(uint32_t insn) |
| 138 | { |
| 139 | return ((insn >> 4) & 0xfff0) | (insn & 0x000f); |
| 140 | } |
| 141 | |
| 142 | #endif /* TRACE_COMMON_H */ |