aboutsummaryrefslogtreecommitdiff
path: root/src/target/armv8.c
diff options
context:
space:
mode:
authorMatthias Welwarsky <matthias.welwarsky@sysgo.com>2016-09-16 15:36:09 +0200
committerMatthias Welwarsky <matthias.welwarsky@sysgo.com>2017-02-10 14:01:39 +0100
commit56ab6ab1594e71b690ace9b813fb31b465693acb (patch)
treef70259e8d21119298dceca821f23eadcbed94cba /src/target/armv8.c
parent4afa32ece148268a07313843c3f0a860c27f3309 (diff)
downloadriscv-openocd-56ab6ab1594e71b690ace9b813fb31b465693acb.zip
riscv-openocd-56ab6ab1594e71b690ace9b813fb31b465693acb.tar.gz
riscv-openocd-56ab6ab1594e71b690ace9b813fb31b465693acb.tar.bz2
aarch64: fix armv8_set_core_reg when destination is cpsr
When armv8_set_core_reg is used to set the value of the CPSR, also update the internal architecture state. Change-Id: I5f6a2be6fde8d91ec3352d8ba23c4aa90eb02977 Signed-off-by: Matthias Welwarsky <matthias.welwarsky@sysgo.com>
Diffstat (limited to 'src/target/armv8.c')
-rw-r--r--src/target/armv8.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/target/armv8.c b/src/target/armv8.c
index 176c7ad..ad06796 100644
--- a/src/target/armv8.c
+++ b/src/target/armv8.c
@@ -845,14 +845,20 @@ static int armv8_set_core_reg(struct reg *reg, uint8_t *buf)
{
struct arm_reg *armv8_reg = reg->arch_info;
struct target *target = armv8_reg->target;
+ struct arm *arm = target_to_arm(target);
uint64_t value = buf_get_u64(buf, 0, 64);
if (target->state != TARGET_HALTED)
return ERROR_TARGET_NOT_HALTED;
- buf_set_u64(reg->value, 0, 64, value);
+ if (reg == arm->cpsr) {
+ armv8_set_cpsr(arm, (uint32_t)value);
+ } else {
+ buf_set_u64(reg->value, 0, 64, value);
+ reg->valid = 1;
+ }
+
reg->dirty = 1;
- reg->valid = 1;
return ERROR_OK;
}