]> git.sur5r.net Git - openocd/blob - src/target/etm.h
- calculate cycles since last executed instruction when cycle-accurate tracing is...
[openocd] / src / target / etm.h
1 /***************************************************************************\r
2  *   Copyright (C) 2005, 2007 by Dominic Rath                              *\r
3  *   Dominic.Rath@gmx.de                                                   *\r
4  *                                                                         *\r
5  *   Copyright (C) 2007 by Vincent Palatin                                 *\r
6  *   vincent.palatin_openocd@m4x.org                                       *\r
7  *                                                                         *\r
8  *   This program is free software; you can redistribute it and/or modify  *\r
9  *   it under the terms of the GNU General Public License as published by  *\r
10  *   the Free Software Foundation; either version 2 of the License, or     *\r
11  *   (at your option) any later version.                                   *\r
12  *                                                                         *\r
13  *   This program is distributed in the hope that it will be useful,       *\r
14  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *\r
15  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *\r
16  *   GNU General Public License for more details.                          *\r
17  *                                                                         *\r
18  *   You should have received a copy of the GNU General Public License     *\r
19  *   along with this program; if not, write to the                         *\r
20  *   Free Software Foundation, Inc.,                                       *\r
21  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\r
22  ***************************************************************************/\r
23 #ifndef ETM_H\r
24 #define ETM_H\r
25 \r
26 #include "image.h"\r
27 #include "trace.h"\r
28 #include "target.h"\r
29 #include "register.h"\r
30 #include "arm_jtag.h"\r
31 \r
32 #include "armv4_5.h"\r
33 \r
34 /* ETM registers (V1.3 protocol) */\r
35 enum\r
36 {\r
37         ETM_CTRL = 0x00,\r
38         ETM_CONFIG = 0x01,\r
39         ETM_TRIG_EVENT = 0x02,\r
40         ETM_MMD_CTRL = 0x03,\r
41         ETM_STATUS = 0x04,\r
42         ETM_SYS_CONFIG = 0x05,\r
43         ETM_TRACE_RESOURCE_CTRL = 0x06,\r
44         ETM_TRACE_EN_CTRL2 = 0x07,\r
45         ETM_TRACE_EN_EVENT = 0x08,\r
46         ETM_TRACE_EN_CTRL1 = 0x09,\r
47         ETM_FIFOFULL_REGION = 0x0a,\r
48         ETM_FIFOFULL_LEVEL = 0x0b,\r
49         ETM_VIEWDATA_EVENT = 0x0c,\r
50         ETM_VIEWDATA_CTRL1 = 0x0d,\r
51         ETM_VIEWDATA_CTRL2 = 0x0e,\r
52         ETM_VIEWDATA_CTRL3 = 0x0f,\r
53         ETM_ADDR_COMPARATOR_VALUE = 0x10,\r
54         ETM_ADDR_ACCESS_TYPE = 0x20,\r
55         ETM_DATA_COMPARATOR_VALUE = 0x30,\r
56         ETM_DATA_COMPARATOR_MASK = 0x40,\r
57         ETM_COUNTER_INITAL_VALUE = 0x50,\r
58         ETM_COUNTER_ENABLE = 0x54,\r
59         ETM_COUNTER_RELOAD_VALUE = 0x58,\r
60         ETM_COUNTER_VALUE = 0x5c,\r
61         ETM_SEQUENCER_CTRL = 0x60,\r
62         ETM_SEQUENCER_STATE = 0x67,\r
63         ETM_EXTERNAL_OUTPUT = 0x68,\r
64         ETM_CONTEXTID_COMPARATOR_VALUE = 0x6c,\r
65         ETM_CONTEXTID_COMPARATOR_MASK = 0x6f,   \r
66 };\r
67 \r
68 typedef struct etm_reg_s\r
69 {\r
70         int addr;\r
71         arm_jtag_t *jtag_info;\r
72 } etm_reg_t;\r
73 \r
74 typedef enum\r
75 {\r
76         /* Port width */\r
77         ETM_PORT_4BIT           = 0x00,\r
78         ETM_PORT_8BIT           = 0x10,\r
79         ETM_PORT_16BIT          = 0x20,\r
80         ETM_PORT_WIDTH_MASK     = 0x70, \r
81         /* Port modes */\r
82         ETM_PORT_NORMAL    = 0x00000,\r
83         ETM_PORT_MUXED     = 0x10000,\r
84         ETM_PORT_DEMUXED   = 0x20000,\r
85         ETM_PORT_MODE_MASK = 0x30000,\r
86         /* Clocking modes */\r
87         ETM_PORT_FULL_CLOCK = 0x0000,\r
88         ETM_PORT_HALF_CLOCK = 0x1000,\r
89         ETM_PORT_CLOCK_MASK = 0x1000,\r
90 } etm_portmode_t;\r
91 \r
92 typedef enum\r
93 {\r
94         /* Data trace */\r
95         ETMV1_TRACE_NONE         = 0x00,\r
96         ETMV1_TRACE_DATA     = 0x01,\r
97         ETMV1_TRACE_ADDR     = 0x02,\r
98         ETMV1_TRACE_MASK     = 0x03,\r
99         /* ContextID */\r
100         ETMV1_CONTEXTID_NONE = 0x00,\r
101         ETMV1_CONTEXTID_8    = 0x10,\r
102         ETMV1_CONTEXTID_16   = 0x20,\r
103         ETMV1_CONTEXTID_32   = 0x30,\r
104         ETMV1_CONTEXTID_MASK = 0x30,\r
105         /* Misc */\r
106         ETMV1_CYCLE_ACCURATE = 0x100,\r
107         ETMV1_BRANCH_OUTPUT = 0x200\r
108 } etmv1_tracemode_t;\r
109 \r
110 /* forward-declare ETM context */\r
111 struct etm_context_s;\r
112 \r
113 typedef struct etm_capture_driver_s\r
114 {\r
115         char *name;\r
116         int (*register_commands)(struct command_context_s *cmd_ctx);\r
117         int (*init)(struct etm_context_s *etm_ctx);\r
118         trace_status_t (*status)(struct etm_context_s *etm_ctx);\r
119         int (*read_trace)(struct etm_context_s *etm_ctx);\r
120         int (*start_capture)(struct etm_context_s *etm_ctx);\r
121         int (*stop_capture)(struct etm_context_s *etm_ctx);\r
122 } etm_capture_driver_t;\r
123 \r
124 enum\r
125 {\r
126         ETMV1_TRACESYNC_CYCLE = 0x1,\r
127         ETMV1_TRIGGER_CYCLE = 0x2,\r
128 };\r
129 \r
130 typedef struct etmv1_trace_data_s\r
131 {\r
132         u8 pipestat;    /* bits 0-2 pipeline status */\r
133         u16 packet;             /* packet data (4, 8 or 16 bit) */\r
134         int flags;              /* ETMV1_TRACESYNC_CYCLE, ETMV1_TRIGGER_CYCLE */\r
135 } etmv1_trace_data_t;\r
136 \r
137 /* describe a trace context\r
138  * if support for ETMv2 or ETMv3 is to be implemented,\r
139  * this will have to be split into version independent elements\r
140  * and a version specific part\r
141  */\r
142 typedef struct etm_context_s\r
143 {\r
144         target_t *target;                               /* target this ETM is connected to */\r
145         reg_cache_t *reg_cache;                 /* ETM register cache */\r
146         etm_capture_driver_t *capture_driver;   /* driver used to access ETM data */\r
147         void *capture_driver_priv;              /* capture driver private data */\r
148         u32 trigger_percent;                    /* percent of trace buffer to be filled after the trigger */\r
149         trace_status_t capture_status;  /* current state of capture run */ \r
150         etmv1_trace_data_t *trace_data; /* trace data */\r
151         u32 trace_depth;                                /* number of trace cycles to be analyzed, 0 if no trace data available */\r
152         etm_portmode_t portmode;                /* normal, multiplexed or demultiplexed */\r
153         etmv1_tracemode_t tracemode;    /* type of information the trace contains (data, addres, contextID, ...) */ \r
154         armv4_5_state_t core_state;             /* current core state (ARM, Thumb, Jazelle) */\r
155         image_t *image;                                 /* source for target opcodes */\r
156         u32 pipe_index;                                 /* current trace cycle */\r
157         u32 data_index;                                 /* cycle holding next data packet */\r
158         int data_half;                                  /* port half on a 16 bit port */\r
159         u32 current_pc;                                 /* current program counter */\r
160         u32 pc_ok;                                              /* full PC has been acquired */\r
161         u32 last_branch;                                /* last branch address output */ \r
162         u32 last_branch_reason;                 /* branch reason code for the last branch encountered */\r
163         u32 last_ptr;                                   /* address of the last data access */\r
164         u32 ptr_ok;                                             /* whether last_ptr is valid */ \r
165         u32 context_id;                                 /* context ID of the code being traced */\r
166         u32 last_instruction;                   /* index of last instruction executed (to calculate cycle timings) */\r
167 } etm_context_t;\r
168 \r
169 /* PIPESTAT values */\r
170 typedef enum\r
171 {\r
172         STAT_IE = 0x0,\r
173         STAT_ID = 0x1,\r
174         STAT_IN = 0x2,\r
175         STAT_WT = 0x3,\r
176         STAT_BE = 0x4,\r
177         STAT_BD = 0x5,\r
178         STAT_TR = 0x6,\r
179         STAT_TD = 0x7\r
180 } etmv1_pipestat_t;\r
181 \r
182 /* branch reason values */\r
183 typedef enum\r
184 {\r
185         BR_NORMAL  = 0x0, /* Normal PC change : periodic synchro (ETMv1.1) */\r
186         BR_ENABLE  = 0x1, /* Trace has been enabled */\r
187         BR_RESTART = 0x2, /* Trace restarted after a FIFO overflow */\r
188         BR_NODEBUG = 0x3, /* ARM has exited for debug state */\r
189         BR_PERIOD  = 0x4, /* Peridioc synchronization point (ETM>=v1.2)*/\r
190         BR_RSVD5   = 0x5, /* reserved */\r
191         BR_RSVD6   = 0x6, /* reserved */\r
192         BR_RSVD7   = 0x7, /* reserved */\r
193 } etmv1_branch_reason_t;\r
194 \r
195 extern char *etmv1v1_branch_reason_strings[];\r
196 \r
197 extern reg_cache_t* etm_build_reg_cache(target_t *target, arm_jtag_t *jtag_info, etm_context_t *etm_ctx);\r
198 extern int etm_read_reg(reg_t *reg);\r
199 extern int etm_write_reg(reg_t *reg, u32 value);\r
200 extern int etm_read_reg_w_check(reg_t *reg, u8* check_value, u8* check_mask);\r
201 extern int etm_store_reg(reg_t *reg);\r
202 extern int etm_set_reg(reg_t *reg, u32 value);\r
203 extern int etm_set_reg_w_exec(reg_t *reg, u8 *buf);\r
204 \r
205 int etm_register_commands(struct command_context_s *cmd_ctx);\r
206 int etm_register_user_commands(struct command_context_s *cmd_ctx);\r
207 extern etm_context_t* etm_create_context(etm_portmode_t portmode, char *capture_driver_name);\r
208 \r
209 #define ERROR_ETM_INVALID_DRIVER        (-1300)\r
210 #define ERROR_ETM_PORTMODE_NOT_SUPPORTED        (-1301)\r
211 #define ERROR_ETM_CAPTURE_INIT_FAILED   (-1302)\r
212 \r
213 #endif /* ETM_H */\r