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_H
     14 #define TRACE_H
     15 
     16 #include <inttypes.h>
     17 #include "trace_common.h"
     18 
     19 extern uint64_t start_time, end_time;
     20 extern uint64_t elapsed_usecs;
     21 extern uint64 Now();
     22 
     23 struct TranslationBlock;
     24 
     25 // For tracing dynamic execution of basic blocks
     26 typedef struct TraceBB {
     27     char	*filename;
     28     FILE	*fstream;
     29     BBRec	buffer[kMaxNumBasicBlocks];
     30     BBRec	*next;		// points to next record in buffer
     31     uint64_t	flush_time;	// time of last buffer flush
     32     char	compressed[kCompressedSize];
     33     char	*compressed_ptr;
     34     char	*high_water_ptr;
     35     int64_t	prev_bb_num;
     36     uint64_t	prev_bb_time;
     37     uint64_t	current_bb_num;
     38     uint64_t	current_bb_start_time;
     39     uint64_t	recnum;		// counts number of trace records
     40     uint32_t	current_bb_addr;
     41     int		num_insns;
     42 } TraceBB;
     43 
     44 // For tracing simuation start times of instructions
     45 typedef struct TraceInsn {
     46     char	*filename;
     47     FILE	*fstream;
     48     InsnRec	dummy;		// this is here so we can use buffer[-1]
     49     InsnRec	buffer[kInsnBufferSize];
     50     InsnRec	*current;
     51     uint64_t	prev_time;	// time of last instruction start
     52     char	compressed[kCompressedSize];
     53     char	*compressed_ptr;
     54     char	*high_water_ptr;
     55 } TraceInsn;
     56 
     57 // For tracing the static information about a basic block
     58 typedef struct TraceStatic {
     59     char	*filename;
     60     FILE	*fstream;
     61     uint32_t	insns[kMaxInsnPerBB];
     62     int		next_insn;
     63     uint64_t	bb_num;
     64     uint32_t	bb_addr;
     65     int		is_thumb;
     66 } TraceStatic;
     67 
     68 // For tracing load and store addresses
     69 typedef struct TraceAddr {
     70     char	*filename;
     71     FILE	*fstream;
     72     AddrRec	buffer[kMaxNumAddrs];
     73     AddrRec	*next;
     74     char	compressed[kCompressedSize];
     75     char	*compressed_ptr;
     76     char	*high_water_ptr;
     77     uint32_t	prev_addr;
     78     uint64_t	prev_time;
     79 } TraceAddr;
     80 
     81 // For tracing exceptions
     82 typedef struct TraceExc {
     83     char	*filename;
     84     FILE	*fstream;
     85     char	compressed[kCompressedSize];
     86     char	*compressed_ptr;
     87     char	*high_water_ptr;
     88     uint64_t	prev_time;
     89     uint64_t	prev_bb_recnum;
     90 } TraceExc;
     91 
     92 // For tracing process id changes
     93 typedef struct TracePid {
     94     char	*filename;
     95     FILE	*fstream;
     96     char	compressed[kCompressedSize];
     97     char	*compressed_ptr;
     98     uint64_t	prev_time;
     99 } TracePid;
    100 
    101 // For tracing Dalvik VM method enter and exit
    102 typedef struct TraceMethod {
    103     char	*filename;
    104     FILE	*fstream;
    105     char	compressed[kCompressedSize];
    106     char	*compressed_ptr;
    107     uint64_t	prev_time;
    108     uint32_t	prev_addr;
    109     int32_t	prev_pid;
    110 } TraceMethod;
    111 
    112 extern TraceBB trace_bb;
    113 extern TraceInsn trace_insn;
    114 extern TraceStatic trace_static;
    115 extern TraceAddr trace_load;
    116 extern TraceAddr trace_store;
    117 extern TraceExc trace_exc;
    118 extern TracePid trace_pid;
    119 extern TraceMethod trace_method;
    120 
    121 // The simulated time, in clock ticks, starting with one.
    122 extern uint64_t sim_time;
    123 
    124 // This variable == 1 if we are currently tracing, otherwise == 0.
    125 extern int tracing;
    126 extern int trace_all_addr;
    127 extern int trace_cache_miss;
    128 
    129 extern void start_tracing();
    130 extern void stop_tracing();
    131 extern void trace_init(const char *filename);
    132 extern void trace_bb_start(uint32_t bb_addr);
    133 extern void trace_add_insn(uint32_t insn, int is_thumb);
    134 extern void trace_bb_end();
    135 
    136 extern int get_insn_ticks_arm(uint32_t insn);
    137 extern int get_insn_ticks_thumb(uint32_t  insn);
    138 
    139 extern void trace_exception(uint32 pc);
    140 extern void trace_bb_helper(uint64_t bb_num, TranslationBlock *tb);
    141 extern void trace_insn_helper();
    142 extern void sim_dcache_load(uint32_t addr);
    143 extern void sim_dcache_store(uint32_t addr, uint32_t val);
    144 extern void sim_dcache_swp(uint32_t addr);
    145 extern void trace_interpreted_method(uint32_t addr, int call_type);
    146 
    147 extern const char *trace_filename;
    148 extern int tracing;
    149 extern int trace_cache_miss;
    150 extern int trace_all_addr;
    151 
    152 #endif /* TRACE_H */
    153