- split fileio handling into fileio part and image handling
[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 "trace.h"\r
27 #include "target.h"\r
28 #include "register.h"\r
29 #include "arm_jtag.h"\r
30 \r
31 #include "armv4_5.h"\r
32 \r
33 /* ETM registers (V1.3 protocol) */\r
34 enum\r
35 {\r
36         ETM_CTRL = 0x00,\r
37         ETM_CONFIG = 0x01,\r
38         ETM_TRIG_EVENT = 0x02,\r
39         ETM_MMD_CTRL = 0x03,\r
40         ETM_STATUS = 0x04,\r
41         ETM_SYS_CONFIG = 0x05,\r
42         ETM_TRACE_RESOURCE_CTRL = 0x06,\r
43         ETM_TRACE_EN_CTRL2 = 0x07,\r
44         ETM_TRACE_EN_EVENT = 0x08,\r
45         ETM_TRACE_EN_CTRL1 = 0x09,\r
46         ETM_FIFOFULL_REGION = 0x0a,\r
47         ETM_FIFOFULL_LEVEL = 0x0b,\r
48         ETM_VIEWDATA_EVENT = 0x0c,\r
49         ETM_VIEWDATA_CTRL1 = 0x0d,\r
50         ETM_VIEWDATA_CTRL2 = 0x0e,\r
51         ETM_VIEWDATA_CTRL3 = 0x0f,\r
52         ETM_ADDR_COMPARATOR_VALUE = 0x10,\r
53         ETM_ADDR_ACCESS_TYPE = 0x20,\r
54         ETM_DATA_COMPARATOR_VALUE = 0x30,\r
55         ETM_DATA_COMPARATOR_MASK = 0x40,\r
56         ETM_COUNTER_INITAL_VALUE = 0x50,\r
57         ETM_COUNTER_ENABLE = 0x54,\r
58         ETM_COUNTER_RELOAD_VALUE = 0x58,\r
59         ETM_COUNTER_VALUE = 0x5c,\r
60         ETM_SEQUENCER_CTRL = 0x60,\r
61         ETM_SEQUENCER_STATE = 0x67,\r
62         ETM_EXTERNAL_OUTPUT = 0x68,\r
63         ETM_CONTEXTID_COMPARATOR_VALUE = 0x6c,\r
64         ETM_CONTEXTID_COMPARATOR_MASK = 0x6f,   \r
65 };\r
66 \r
67 typedef struct etm_reg_s\r
68 {\r
69         int addr;\r
70         arm_jtag_t *jtag_info;\r
71 } etm_reg_t;\r
72 \r
73 typedef enum\r
74 {\r
75         /* Port width */\r
76         ETM_PORT_4BIT           = 0x00,\r
77         ETM_PORT_8BIT           = 0x10,\r
78         ETM_PORT_16BIT          = 0x20,\r
79         ETM_PORT_WIDTH_MASK     = 0x70, \r
80         /* Port modes */\r
81         ETM_PORT_NORMAL    = 0x00000,\r
82         ETM_PORT_MUXED     = 0x10000,\r
83         ETM_PORT_DEMUXED   = 0x20000,\r
84         ETM_PORT_MODE_MASK = 0x30000,\r
85         /* Clocking modes */\r
86         ETM_PORT_FULL_CLOCK = 0x0000,\r
87         ETM_PORT_HALF_CLOCK = 0x1000,\r
88         ETM_PORT_CLOCK_MASK = 0x1000,\r
89 } etm_portmode_t;\r
90 \r
91 typedef enum\r
92 {\r
93         /* Data trace */\r
94         ETMV1_TRACE_NONE         = 0x00,\r
95         ETMV1_TRACE_DATA     = 0x01,\r
96         ETMV1_TRACE_ADDR     = 0x02,\r
97         ETMV1_TRACE_MASK     = 0x03,\r
98         /* ContextID */\r
99         ETMV1_CONTEXTID_NONE = 0x00,\r
100         ETMV1_CONTEXTID_8    = 0x10,\r
101         ETMV1_CONTEXTID_16   = 0x20,\r
102         ETMV1_CONTEXTID_32   = 0x30,\r
103         ETMV1_CONTEXTID_MASK = 0x30,\r
104         /* Misc */\r
105         ETMV1_CYCLE_ACCURATE = 0x100\r
106 } etmv1_tracemode_t;\r
107 \r
108 /* forward-declare ETM context */\r
109 struct etm_context_s;\r
110 \r
111 typedef struct etm_capture_driver_s\r
112 {\r
113         char *name;\r
114         int (*register_commands)(struct command_context_s *cmd_ctx);\r
115         int (*init)(struct etm_context_s *etm_ctx);\r
116         trace_status_t (*status)(struct etm_context_s *etm_ctx);\r
117         int (*read_trace)(struct etm_context_s *etm_ctx);\r
118         int (*start_capture)(struct etm_context_s *etm_ctx);\r
119         int (*stop_capture)(struct etm_context_s *etm_ctx);\r
120 } etm_capture_driver_t;\r
121 \r
122 typedef struct etmv1_trace_data_s\r
123 {\r
124         u8 pipestat;    /* pipeline cycle this packet belongs to */\r
125         u16 packet;     /* packet data (4, 8 or 16 bit) */\r
126         int tracesync;  /* 1 if tracesync was set on this packet */\r
127 } etmv1_trace_data_t;\r
128 \r
129 /* describe a trace context\r
130  * if support for ETMv2 or ETMv3 is to be implemented,\r
131  * this will have to be split into version independent elements\r
132  * and a version specific part\r
133  */\r
134 typedef struct etm_context_s\r
135 {\r
136         reg_cache_t *reg_cache;                 /* ETM register cache */\r
137         etm_capture_driver_t *capture_driver;   /* driver used to access ETM data */\r
138         void *capture_driver_priv;              /* capture driver private data */\r
139         trace_status_t capture_status;  /* current state of capture run */ \r
140         etmv1_trace_data_t *trace_data; /* trace data */\r
141         u32 trace_depth;                                /* number of trace cycles to be analyzed, 0 if no trace data available */\r
142         etm_portmode_t portmode;                /* normal, multiplexed or demultiplexed */\r
143         etmv1_tracemode_t tracemode;    /* type of information the trace contains (data, addres, contextID, ...) */ \r
144         armv4_5_state_t core_state;             /* current core state (ARM, Thumb, Jazelle) */\r
145 //      trace_image_provider_t image_provider;  /* source for target opcodes */\r
146         u32 pipe_index;                                 /* current trace cycle */\r
147         u32 data_index;                                 /* cycle holding next data packet */\r
148         u32 current_pc;                                 /* current program counter */\r
149         u32 pc_ok;                                              /* full PC has been acquired */\r
150         u32 last_branch;                                /* last branch address output */ \r
151         u32 last_ptr;                                   /* address of the last data access */\r
152         u32 context_id;                                 /* context ID of the code being traced */\r
153 } etm_context_t;\r
154 \r
155 /* PIPESTAT values */\r
156 typedef enum\r
157 {\r
158         STAT_IE = 0x0,\r
159         STAT_ID = 0x1,\r
160         STAT_IN = 0x2,\r
161         STAT_WT = 0x3,\r
162         STAT_BE = 0x4,\r
163         STAT_BD = 0x5,\r
164         STAT_TR = 0x6,\r
165         STAT_TD = 0x7\r
166 } etmv1_pipestat_t;\r
167 \r
168 /* branch reason values */\r
169 typedef enum\r
170 {\r
171         BR_NORMAL  = 0x0, /* Normal PC change : periodic synchro (ETMv1.1) */\r
172         BR_ENABLE  = 0x1, /* Trace has been enabled */\r
173         BR_RESTART = 0x2, /* Trace restarted after a FIFO overflow */\r
174         BR_NODEBUG = 0x3, /* ARM has exited for debug state */\r
175         BR_PERIOD  = 0x4, /* Peridioc synchronization point (ETM>=v1.2)*/\r
176         BR_RSVD5   = 0x5, /* reserved */\r
177         BR_RSVD6   = 0x6, /* reserved */\r
178         BR_RSVD7   = 0x7, /* reserved */\r
179 } etmv1_branch_reason_t;\r
180 \r
181 extern char *etmv1v1_branch_reason_strings[];\r
182 \r
183 extern reg_cache_t* etm_build_reg_cache(target_t *target, arm_jtag_t *jtag_info, etm_context_t *etm_ctx);\r
184 extern int etm_read_reg(reg_t *reg);\r
185 extern int etm_write_reg(reg_t *reg, u32 value);\r
186 extern int etm_read_reg_w_check(reg_t *reg, u8* check_value, u8* check_mask);\r
187 extern int etm_store_reg(reg_t *reg);\r
188 extern int etm_set_reg(reg_t *reg, u32 value);\r
189 extern int etm_set_reg_w_exec(reg_t *reg, u8 *buf);\r
190 \r
191 int etm_register_commands(struct command_context_s *cmd_ctx);\r
192 int etm_register_user_commands(struct command_context_s *cmd_ctx);\r
193 extern etm_context_t* etm_create_context(etm_portmode_t portmode, char *capture_driver_name);\r
194 \r
195 #define ERROR_ETM_INVALID_DRIVER        (-1300)\r
196 #define ERROR_ETM_PORTMODE_NOT_SUPPORTED        (-1301)\r
197 #define ERROR_ETM_CAPTURE_INIT_FAILED   (-1302)\r
198 \r
199 #endif /* ETM_H */\r