aboutsummaryrefslogtreecommitdiff
path: root/src/target
diff options
context:
space:
mode:
Diffstat (limited to 'src/target')
-rw-r--r--src/target/aarch64.c3
-rw-r--r--src/target/armv8.c4
-rw-r--r--src/target/armv8_dpm.c5
3 files changed, 12 insertions, 0 deletions
diff --git a/src/target/aarch64.c b/src/target/aarch64.c
index 8fab3b5d..63174c2e 100644
--- a/src/target/aarch64.c
+++ b/src/target/aarch64.c
@@ -100,6 +100,7 @@ static int aarch64_restore_system_control_reg(struct target *target)
case ARM_MODE_ABT:
case ARM_MODE_FIQ:
case ARM_MODE_IRQ:
+ case ARM_MODE_SYS:
instr = ARMV4_5_MCR(15, 0, 0, 1, 0, 0);
break;
@@ -172,6 +173,7 @@ static int aarch64_mmu_modify(struct target *target, int enable)
case ARM_MODE_ABT:
case ARM_MODE_FIQ:
case ARM_MODE_IRQ:
+ case ARM_MODE_SYS:
instr = ARMV4_5_MCR(15, 0, 0, 1, 0, 0);
break;
@@ -1032,6 +1034,7 @@ static int aarch64_post_debug_entry(struct target *target)
case ARM_MODE_ABT:
case ARM_MODE_FIQ:
case ARM_MODE_IRQ:
+ case ARM_MODE_SYS:
instr = ARMV4_5_MRC(15, 0, 0, 1, 0, 0);
break;
diff --git a/src/target/armv8.c b/src/target/armv8.c
index 1981e7c3..cee837f5 100644
--- a/src/target/armv8.c
+++ b/src/target/armv8.c
@@ -74,6 +74,10 @@ static const struct {
.psr = ARM_MODE_ABT,
},
{
+ .name = "SYS",
+ .psr = ARM_MODE_SYS,
+ },
+ {
.name = "EL0T",
.psr = ARMV8_64_EL0T,
},
diff --git a/src/target/armv8_dpm.c b/src/target/armv8_dpm.c
index 3c941fa2..a5d7d11f 100644
--- a/src/target/armv8_dpm.c
+++ b/src/target/armv8_dpm.c
@@ -573,6 +573,7 @@ int armv8_dpm_modeswitch(struct arm_dpm *dpm, enum arm_mode mode)
case ARM_MODE_ABT:
case ARM_MODE_IRQ:
case ARM_MODE_FIQ:
+ case ARM_MODE_SYS:
target_el = 1;
break;
/*
@@ -790,6 +791,10 @@ int armv8_dpm_read_current_registers(struct arm_dpm *dpm)
dpm->last_el != armv8_curel_from_core_mode(arm_reg->mode))
continue;
+ /* Special case: ARM_MODE_SYS has no SPSR at EL1 */
+ if (r->number == ARMV8_SPSR_EL1 && arm->core_mode == ARM_MODE_SYS)
+ continue;
+
retval = dpmv8_read_reg(dpm, r, i);
if (retval != ERROR_OK)
goto fail;