summaryrefslogtreecommitdiff
path: root/src/target/armv4_5.c
diff options
context:
space:
mode:
authorDavid Brownell <dbrownell@users.sourceforge.net>2009-11-18 14:49:22 -0800
committerDavid Brownell <dbrownell@users.sourceforge.net>2009-11-18 14:49:22 -0800
commit94dba423137d25fbe898fe7b04c451c6225a0079 (patch)
tree8514461c03e97dc8f0412f2cf8396200b90ee531 /src/target/armv4_5.c
parentf5093e160534c269b8bc3590f5809ed3baead56f (diff)
downloadopenocd+libswd-94dba423137d25fbe898fe7b04c451c6225a0079.tar.gz
openocd+libswd-94dba423137d25fbe898fe7b04c451c6225a0079.tar.bz2
openocd+libswd-94dba423137d25fbe898fe7b04c451c6225a0079.tar.xz
openocd+libswd-94dba423137d25fbe898fe7b04c451c6225a0079.zip
ARM: add a default full_context() method
If the core doesn't provide an optimized version of this method, provide one without core-specific optimizations. Use this to make Cortex-A8 support the "arm reg" command. Related: make the two register access methods properly static, have the "set" log a "not halted" error too, and make sure that the "valid" flag is set on successful reads. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Diffstat (limited to 'src/target/armv4_5.c')
-rw-r--r--src/target/armv4_5.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/target/armv4_5.c b/src/target/armv4_5.c
index 562dc1f9..a4c704ec 100644
--- a/src/target/armv4_5.c
+++ b/src/target/armv4_5.c
@@ -299,7 +299,7 @@ static void arm_gdb_dummy_init(void)
register_init_dummy(&arm_gdb_dummy_fps_reg);
}
-int armv4_5_get_core_reg(struct reg *reg)
+static int armv4_5_get_core_reg(struct reg *reg)
{
int retval;
struct armv4_5_core_reg *armv4_5 = reg->arch_info;
@@ -311,13 +311,14 @@ int armv4_5_get_core_reg(struct reg *reg)
return ERROR_TARGET_NOT_HALTED;
}
- /* retval = armv4_5->armv4_5_common->full_context(target); */
retval = armv4_5->armv4_5_common->read_core_reg(target, armv4_5->num, armv4_5->mode);
+ if (retval == ERROR_OK)
+ reg->valid = 1;
return retval;
}
-int armv4_5_set_core_reg(struct reg *reg, uint8_t *buf)
+static int armv4_5_set_core_reg(struct reg *reg, uint8_t *buf)
{
struct armv4_5_core_reg *armv4_5 = reg->arch_info;
struct target *target = armv4_5->target;
@@ -326,6 +327,7 @@ int armv4_5_set_core_reg(struct reg *reg, uint8_t *buf)
if (target->state != TARGET_HALTED)
{
+ LOG_ERROR("Target not halted");
return ERROR_TARGET_NOT_HALTED;
}
@@ -1038,6 +1040,21 @@ int arm_blank_check_memory(struct target *target,
return ERROR_OK;
}
+static int arm_full_context(struct target *target)
+{
+ struct armv4_5_common_s *armv4_5 = target_to_armv4_5(target);
+ unsigned num_regs = armv4_5->core_cache->num_regs;
+ struct reg *reg = armv4_5->core_cache->reg_list;
+ int retval = ERROR_OK;
+
+ for (; num_regs && retval == ERROR_OK; num_regs--, reg++) {
+ if (reg->valid)
+ continue;
+ retval = armv4_5_get_core_reg(reg);
+ }
+ return retval;
+}
+
int armv4_5_init_arch_info(struct target *target, struct arm *armv4_5)
{
target->arch_info = armv4_5;
@@ -1049,5 +1066,9 @@ int armv4_5_init_arch_info(struct target *target, struct arm *armv4_5)
/* core_type may be overridden by subtype logic */
armv4_5->core_type = ARMV4_5_MODE_ANY;
+ /* default full_context() has no core-specific optimizations */
+ if (!armv4_5->full_context && armv4_5->read_core_reg)
+ armv4_5->full_context = arm_full_context;
+
return ERROR_OK;
}