- added manpage for OpenOCD (thanks to Uwe Hermann)
[fw/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_tracemode_t;\r
108 \r
109 /* forward-declare ETM context */\r
110 struct etm_context_s;\r
111 \r
112 typedef struct etm_capture_driver_s\r
113 {\r
114         char *name;\r
115         int (*register_commands)(struct command_context_s *cmd_ctx);\r
116         int (*init)(struct etm_context_s *etm_ctx);\r
117         trace_status_t (*status)(struct etm_context_s *etm_ctx);\r
118         int (*read_trace)(struct etm_context_s *etm_ctx);\r
119         int (*start_capture)(struct etm_context_s *etm_ctx);\r
120         int (*stop_capture)(struct etm_context_s *etm_ctx);\r
121 } etm_capture_driver_t;\r
122 \r
123 enum\r
124 {\r
125         ETMV1_TRACESYNC_CYCLE = 0x1,\r
126         ETMV1_TRIGGER_CYCLE = 0x2,\r
127 };\r
128 \r
129 typedef struct etmv1_trace_data_s\r
130 {\r
131         u8 pipestat;    /* bits 0-2 pipeline status */\r
132         u16 packet;             /* packet data (4, 8 or 16 bit) */\r
133         int flags;              /* ETMV1_TRACESYNC_CYCLE, ETMV1_TRIGGER_CYCLE */\r
134 } etmv1_trace_data_t;\r
135 \r
136 /* describe a trace context\r
137  * if support for ETMv2 or ETMv3 is to be implemented,\r
138  * this will have to be split into version independent elements\r
139  * and a version specific part\r
140  */\r
141 typedef struct etm_context_s\r
142 {\r
143         target_t *target;                               /* target this ETM is connected to */\r
144         reg_cache_t *reg_cache;                 /* ETM register cache */\r
145         etm_capture_driver_t *capture_driver;   /* driver used to access ETM data */\r
146         void *capture_driver_priv;              /* capture driver private data */\r
147         trace_status_t capture_status;  /* current state of capture run */ \r
148         etmv1_trace_data_t *trace_data; /* trace data */\r
149         u32 trace_depth;                                /* number of trace cycles to be analyzed, 0 if no trace data available */\r
150         etm_portmode_t portmode;                /* normal, multiplexed or demultiplexed */\r
151         etmv1_tracemode_t tracemode;    /* type of information the trace contains (data, addres, contextID, ...) */ \r
152         armv4_5_state_t core_state;             /* current core state (ARM, Thumb, Jazelle) */\r
153         image_t *image;                                 /* source for target opcodes */\r
154         u32 pipe_index;                                 /* current trace cycle */\r
155         u32 data_index;                                 /* cycle holding next data packet */\r
156         int data_half;                                  /* port half on a 16 bit port */\r
157         u32 current_pc;                                 /* current program counter */\r
158         u32 pc_ok;                                              /* full PC has been acquired */\r
159         u32 last_branch;                                /* last branch address output */ \r
160         u32 last_branch_reason;                 /* branch reason code for the last branch encountered */\r
161         u32 last_ptr;                                   /* address of the last data access */\r
162         u32 ptr_ok;                                             /* whether last_ptr is valid */ \r
163         u32 context_id;                                 /* context ID of the code being traced */\r
164 } etm_context_t;\r
165 \r
166 /* PIPESTAT values */\r
167 typedef enum\r
168 {\r
169         STAT_IE = 0x0,\r
170         STAT_ID = 0x1,\r
171         STAT_IN = 0x2,\r
172         STAT_WT = 0x3,\r
173         STAT_BE = 0x4,\r
174         STAT_BD = 0x5,\r
175         STAT_TR = 0x6,\r
176         STAT_TD = 0x7\r
177 } etmv1_pipestat_t;\r
178 \r
179 /* branch reason values */\r
180 typedef enum\r
181 {\r
182         BR_NORMAL  = 0x0, /* Normal PC change : periodic synchro (ETMv1.1) */\r
183         BR_ENABLE  = 0x1, /* Trace has been enabled */\r
184         BR_RESTART = 0x2, /* Trace restarted after a FIFO overflow */\r
185         BR_NODEBUG = 0x3, /* ARM has exited for debug state */\r
186         BR_PERIOD  = 0x4, /* Peridioc synchronization point (ETM>=v1.2)*/\r
187         BR_RSVD5   = 0x5, /* reserved */\r
188         BR_RSVD6   = 0x6, /* reserved */\r
189         BR_RSVD7   = 0x7, /* reserved */\r
190 } etmv1_branch_reason_t;\r
191 \r
192 extern char *etmv1v1_branch_reason_strings[];\r
193 \r
194 extern reg_cache_t* etm_build_reg_cache(target_t *target, arm_jtag_t *jtag_info, etm_context_t *etm_ctx);\r
195 extern int etm_read_reg(reg_t *reg);\r
196 extern int etm_write_reg(reg_t *reg, u32 value);\r
197 extern int etm_read_reg_w_check(reg_t *reg, u8* check_value, u8* check_mask);\r
198 extern int etm_store_reg(reg_t *reg);\r
199 extern int etm_set_reg(reg_t *reg, u32 value);\r
200 extern int etm_set_reg_w_exec(reg_t *reg, u8 *buf);\r
201 \r
202 int etm_register_commands(struct command_context_s *cmd_ctx);\r
203 int etm_register_user_commands(struct command_context_s *cmd_ctx);\r
204 extern etm_context_t* etm_create_context(etm_portmode_t portmode, char *capture_driver_name);\r
205 \r
206 #define ERROR_ETM_INVALID_DRIVER        (-1300)\r
207 #define ERROR_ETM_PORTMODE_NOT_SUPPORTED        (-1301)\r
208 #define ERROR_ETM_CAPTURE_INIT_FAILED   (-1302)\r
209 \r
210 #endif /* ETM_H */\r