Home | History | Annotate | Download | only in qemu
      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
     32 #define kNativeEnter		4
     33 #define kNativeExit		5
     34 #define kNativeException	6
     35 
     36 // The trace identifier string must be less than 16 characters.
     37 #define TRACE_IDENT "qemu_trace_file"
     38 #define TRACE_VERSION 2
     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 */
    143