aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-04-15 18:08:36 +0000
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-04-15 18:08:36 +0000
commite18e23e1b6c7cdfd4294e1f05aeee2b841d3cca2 (patch)
treeab544e6cc5beb44b18bf7f1f63df3a292eb8c0f3
parent5aa93a5e8a9290cb4eabb6044406552891c2ef80 (diff)
downloadriscv-openocd-e18e23e1b6c7cdfd4294e1f05aeee2b841d3cca2.zip
riscv-openocd-e18e23e1b6c7cdfd4294e1f05aeee2b841d3cca2.tar.gz
riscv-openocd-e18e23e1b6c7cdfd4294e1f05aeee2b841d3cca2.tar.bz2
Added checks for target->type->read/write_memory, soft_reset_halt and run_algorithm that the target has been examined.
git-svn-id: svn://svn.berlios.de/openocd/trunk@581 b42882b7-edfa-0310-969c-e2dbd0fdcd60
-rw-r--r--src/target/target.c53
-rw-r--r--src/target/target.h4
2 files changed, 57 insertions, 0 deletions
diff --git a/src/target/target.c b/src/target/target.c
index fe80441..3e9cce5 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -489,6 +489,45 @@ int target_examine(struct command_context_s *cmd_ctx)
return retval;
}
+static int target_write_memory_imp(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
+{
+ if (!target->type->examined)
+ {
+ LOG_ERROR("Target not examined yet");
+ return ERROR_FAIL;
+ }
+ return target->type->write_memory_imp(target, address, size, count, buffer);
+}
+
+static int target_read_memory_imp(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
+{
+ if (!target->type->examined)
+ {
+ LOG_ERROR("Target not examined yet");
+ return ERROR_FAIL;
+ }
+ return target->type->read_memory_imp(target, address, size, count, buffer);
+}
+
+static int target_soft_reset_halt_imp(struct target_s *target)
+{
+ if (!target->type->examined)
+ {
+ LOG_ERROR("Target not examined yet");
+ return ERROR_FAIL;
+ }
+ return target->type->soft_reset_halt_imp(target);
+}
+
+static int target_run_algorithm_imp(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info)
+{
+ if (!target->type->examined)
+ {
+ LOG_ERROR("Target not examined yet");
+ return ERROR_FAIL;
+ }
+ return target->type->run_algorithm_imp(target, num_mem_params, mem_params, num_reg_params, reg_param, entry_point, exit_point, timeout_ms, arch_info);
+}
int target_init(struct command_context_s *cmd_ctx)
{
@@ -513,6 +552,20 @@ int target_init(struct command_context_s *cmd_ctx)
{
target->type->virt2phys = default_virt2phys;
}
+ target->type->virt2phys = default_virt2phys;
+ /* a non-invasive way(in terms of patches) to add some code that
+ * runs before the type->write/read_memory implementation
+ */
+ target->type->write_memory_imp = target->type->write_memory;
+ target->type->write_memory = target_write_memory_imp;
+ target->type->read_memory_imp = target->type->read_memory;
+ target->type->read_memory = target_read_memory_imp;
+ target->type->soft_reset_halt_imp = target->type->soft_reset_halt;
+ target->type->soft_reset_halt = target_soft_reset_halt_imp;
+ target->type->run_algorithm_imp = target->type->run_algorithm;
+ target->type->run_algorithm = target_run_algorithm_imp;
+
+
if (target->type->mmu == NULL)
{
target->type->mmu = default_mmu;
diff --git a/src/target/target.h b/src/target/target.h
index 8f53d89..fd09df7 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -132,6 +132,7 @@ typedef struct target_type_s
*/
int (*assert_reset)(struct target_s *target);
int (*deassert_reset)(struct target_s *target);
+ int (*soft_reset_halt_imp)(struct target_s *target);
int (*soft_reset_halt)(struct target_s *target);
/* target register access for gdb.
@@ -149,7 +150,9 @@ typedef struct target_type_s
* size: 1 = byte (8bit), 2 = half-word (16bit), 4 = word (32bit)
* count: number of items of <size>
*/
+ int (*read_memory_imp)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
int (*read_memory)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
+ int (*write_memory_imp)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
int (*write_memory)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
/* write target memory in multiples of 4 byte, optimized for writing large quantities of data */
@@ -166,6 +169,7 @@ typedef struct target_type_s
int (*remove_watchpoint)(struct target_s *target, watchpoint_t *watchpoint);
/* target algorithm support */
+ int (*run_algorithm_imp)(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info);
int (*run_algorithm)(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info);
int (*register_commands)(struct command_context_s *cmd_ctx);