1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2008 by Spencer Oliver *
6 * spen@spen-soft.co.uk *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
13 * This program is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU General Public License for more details. *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program; if not, write to the *
20 * Free Software Foundation, Inc., *
21 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
22 ***************************************************************************/
28 #include "target_type.h"
32 #define _DEBUG_INSTRUCTION_EXECUTION_
35 /* forward declarations */
36 int arm966e_target_create(struct target_s
*target
, Jim_Interp
*interp
);
37 int arm966e_init_target(struct command_context_s
*cmd_ctx
, struct target_s
*target
);
39 target_type_t arm966e_target
=
44 .arch_state
= armv4_5_arch_state
,
46 .target_request_data
= arm7_9_target_request_data
,
49 .resume
= arm7_9_resume
,
52 .assert_reset
= arm7_9_assert_reset
,
53 .deassert_reset
= arm7_9_deassert_reset
,
54 .soft_reset_halt
= arm7_9_soft_reset_halt
,
56 .get_gdb_reg_list
= armv4_5_get_gdb_reg_list
,
58 .read_memory
= arm7_9_read_memory
,
59 .write_memory
= arm7_9_write_memory
,
60 .bulk_write_memory
= arm7_9_bulk_write_memory
,
61 .checksum_memory
= arm7_9_checksum_memory
,
62 .blank_check_memory
= arm7_9_blank_check_memory
,
64 .run_algorithm
= armv4_5_run_algorithm
,
66 .add_breakpoint
= arm7_9_add_breakpoint
,
67 .remove_breakpoint
= arm7_9_remove_breakpoint
,
68 .add_watchpoint
= arm7_9_add_watchpoint
,
69 .remove_watchpoint
= arm7_9_remove_watchpoint
,
71 .register_commands
= arm966e_register_commands
,
72 .target_create
= arm966e_target_create
,
73 .init_target
= arm966e_init_target
,
74 .examine
= arm9tdmi_examine
,
77 int arm966e_init_target(struct command_context_s
*cmd_ctx
, struct target_s
*target
)
79 arm9tdmi_init_target(cmd_ctx
, target
);
84 int arm966e_init_arch_info(target_t
*target
, arm966e_common_t
*arm966e
, jtag_tap_t
*tap
)
86 arm9tdmi_common_t
*arm9tdmi
= &arm966e
->arm9tdmi_common
;
87 arm7_9_common_t
*arm7_9
= &arm9tdmi
->arm7_9_common
;
89 arm9tdmi_init_arch_info(target
, arm9tdmi
, tap
);
91 arm9tdmi
->arch_info
= arm966e
;
92 arm966e
->common_magic
= ARM966E_COMMON_MAGIC
;
94 /* The ARM966E-S implements the ARMv5TE architecture which
95 * has the BKPT instruction, so we don't have to use a watchpoint comparator
97 arm7_9
->arm_bkpt
= ARMV5_BKPT(0x0);
98 arm7_9
->thumb_bkpt
= ARMV5_T_BKPT(0x0) & 0xffff;
103 int arm966e_target_create(struct target_s
*target
, Jim_Interp
*interp
)
105 arm966e_common_t
*arm966e
= calloc(1,sizeof(arm966e_common_t
));
107 arm966e_init_arch_info(target
, arm966e
, target
->tap
);
112 int arm966e_get_arch_pointers(target_t
*target
, armv4_5_common_t
**armv4_5_p
, arm7_9_common_t
**arm7_9_p
, arm9tdmi_common_t
**arm9tdmi_p
, arm966e_common_t
**arm966e_p
)
114 armv4_5_common_t
*armv4_5
= target
->arch_info
;
115 arm7_9_common_t
*arm7_9
;
116 arm9tdmi_common_t
*arm9tdmi
;
117 arm966e_common_t
*arm966e
;
119 if (armv4_5
->common_magic
!= ARMV4_5_COMMON_MAGIC
)
124 arm7_9
= armv4_5
->arch_info
;
125 if (arm7_9
->common_magic
!= ARM7_9_COMMON_MAGIC
)
130 arm9tdmi
= arm7_9
->arch_info
;
131 if (arm9tdmi
->common_magic
!= ARM9TDMI_COMMON_MAGIC
)
136 arm966e
= arm9tdmi
->arch_info
;
137 if (arm966e
->common_magic
!= ARM966E_COMMON_MAGIC
)
142 *armv4_5_p
= armv4_5
;
144 *arm9tdmi_p
= arm9tdmi
;
145 *arm966e_p
= arm966e
;
150 int arm966e_read_cp15(target_t
*target
, int reg_addr
, uint32_t *value
)
152 int retval
= ERROR_OK
;
153 armv4_5_common_t
*armv4_5
= target
->arch_info
;
154 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
155 arm_jtag_t
*jtag_info
= &arm7_9
->jtag_info
;
156 scan_field_t fields
[3];
157 uint8_t reg_addr_buf
= reg_addr
& 0x3f;
158 uint8_t nr_w_buf
= 0;
160 jtag_set_end_state(TAP_IDLE
);
161 if ((retval
= arm_jtag_scann(jtag_info
, 0xf)) != ERROR_OK
)
165 arm_jtag_set_instr(jtag_info
, jtag_info
->intest_instr
, NULL
);
167 fields
[0].tap
= jtag_info
->tap
;
168 fields
[0].num_bits
= 32;
169 fields
[0].out_value
= NULL
;
170 fields
[0].in_value
= NULL
;
172 fields
[1].tap
= jtag_info
->tap
;
173 fields
[1].num_bits
= 6;
174 fields
[1].out_value
= ®_addr_buf
;
175 fields
[1].in_value
= NULL
;
177 fields
[2].tap
= jtag_info
->tap
;
178 fields
[2].num_bits
= 1;
179 fields
[2].out_value
= &nr_w_buf
;
180 fields
[2].in_value
= NULL
;
182 jtag_add_dr_scan(3, fields
, jtag_get_end_state());
184 fields
[1].in_value
= (uint8_t *)value
;
186 jtag_add_dr_scan(3, fields
, jtag_get_end_state());
188 jtag_add_callback(arm_le_to_h_u32
, (jtag_callback_data_t
)value
);
191 #ifdef _DEBUG_INSTRUCTION_EXECUTION_
192 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
196 LOG_DEBUG("addr: 0x%x value: %8.8x", reg_addr
, *value
);
202 int arm966e_write_cp15(target_t
*target
, int reg_addr
, uint32_t value
)
204 int retval
= ERROR_OK
;
205 armv4_5_common_t
*armv4_5
= target
->arch_info
;
206 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
207 arm_jtag_t
*jtag_info
= &arm7_9
->jtag_info
;
208 scan_field_t fields
[3];
209 uint8_t reg_addr_buf
= reg_addr
& 0x3f;
210 uint8_t nr_w_buf
= 1;
211 uint8_t value_buf
[4];
213 buf_set_u32(value_buf
, 0, 32, value
);
215 jtag_set_end_state(TAP_IDLE
);
216 if ((retval
= arm_jtag_scann(jtag_info
, 0xf)) != ERROR_OK
)
220 arm_jtag_set_instr(jtag_info
, jtag_info
->intest_instr
, NULL
);
222 fields
[0].tap
= jtag_info
->tap
;
223 fields
[0].num_bits
= 32;
224 fields
[0].out_value
= value_buf
;
225 fields
[0].in_value
= NULL
;
227 fields
[1].tap
= jtag_info
->tap
;
228 fields
[1].num_bits
= 6;
229 fields
[1].out_value
= ®_addr_buf
;
230 fields
[1].in_value
= NULL
;
232 fields
[2].tap
= jtag_info
->tap
;
233 fields
[2].num_bits
= 1;
234 fields
[2].out_value
= &nr_w_buf
;
235 fields
[2].in_value
= NULL
;
237 jtag_add_dr_scan(3, fields
, jtag_get_end_state());
239 #ifdef _DEBUG_INSTRUCTION_EXECUTION_
240 LOG_DEBUG("addr: 0x%x value: %8.8x", reg_addr
, value
);
246 int arm966e_handle_cp15_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
249 target_t
*target
= get_current_target(cmd_ctx
);
250 armv4_5_common_t
*armv4_5
;
251 arm7_9_common_t
*arm7_9
;
252 arm9tdmi_common_t
*arm9tdmi
;
253 arm966e_common_t
*arm966e
;
254 arm_jtag_t
*jtag_info
;
256 if (arm966e_get_arch_pointers(target
, &armv4_5
, &arm7_9
, &arm9tdmi
, &arm966e
) != ERROR_OK
)
258 command_print(cmd_ctx
, "current target isn't an ARM966e target");
262 jtag_info
= &arm7_9
->jtag_info
;
264 if (target
->state
!= TARGET_HALTED
)
266 command_print(cmd_ctx
, "target must be stopped for \"%s\" command", cmd
);
270 /* one or more argument, access a single register (write if second argument is given */
273 int address
= strtoul(args
[0], NULL
, 0);
278 if ((retval
= arm966e_read_cp15(target
, address
, &value
)) != ERROR_OK
)
280 command_print(cmd_ctx
, "couldn't access reg %i", address
);
283 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
288 command_print(cmd_ctx
, "%i: %8.8" PRIx32
"", address
, value
);
292 uint32_t value
= strtoul(args
[1], NULL
, 0);
293 if ((retval
= arm966e_write_cp15(target
, address
, value
)) != ERROR_OK
)
295 command_print(cmd_ctx
, "couldn't access reg %i", address
);
298 command_print(cmd_ctx
, "%i: %8.8" PRIx32
"", address
, value
);
305 int arm966e_register_commands(struct command_context_s
*cmd_ctx
)
308 command_t
*arm966e_cmd
;
310 retval
= arm9tdmi_register_commands(cmd_ctx
);
311 arm966e_cmd
= register_command(cmd_ctx
, NULL
, "arm966e", NULL
, COMMAND_ANY
, "arm966e specific commands");
312 register_command(cmd_ctx
, arm966e_cmd
, "cp15", arm966e_handle_cp15_command
, COMMAND_EXEC
, "display/modify cp15 register <num> [value]");
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)