aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/target/cortex_m.c18
-rw-r--r--src/target/cortex_m.h3
2 files changed, 20 insertions, 1 deletions
diff --git a/src/target/cortex_m.c b/src/target/cortex_m.c
index 2472e38..017a6d3 100644
--- a/src/target/cortex_m.c
+++ b/src/target/cortex_m.c
@@ -2270,6 +2270,22 @@ static void cortex_m_dwt_free(struct target *target)
cm->dwt_cache = NULL;
}
+static bool cortex_m_has_tz(struct target *target)
+{
+ struct armv7m_common *armv7m = target_to_armv7m(target);
+ uint32_t dauthstatus;
+
+ if (armv7m->arm.arch != ARM_ARCH_V8M)
+ return false;
+
+ int retval = target_read_u32(target, DAUTHSTATUS, &dauthstatus);
+ if (retval != ERROR_OK) {
+ LOG_WARNING("Error reading DAUTHSTATUS register");
+ return false;
+ }
+ return (dauthstatus & DAUTHSTATUS_SID_MASK) != 0;
+}
+
#define MVFR0 0xe000ef40
#define MVFR1 0xe000ef44
@@ -2398,7 +2414,7 @@ int cortex_m_examine(struct target *target)
for (size_t idx = ARMV7M_FPU_FIRST_REG; idx <= ARMV7M_FPU_LAST_REG; idx++)
armv7m->arm.core_cache->reg_list[idx].exist = false;
- if (armv7m->arm.arch != ARM_ARCH_V8M)
+ if (!cortex_m_has_tz(target))
for (size_t idx = ARMV8M_FIRST_REG; idx <= ARMV8M_LAST_REG; idx++)
armv7m->arm.core_cache->reg_list[idx].exist = false;
diff --git a/src/target/cortex_m.h b/src/target/cortex_m.h
index b1de26e..a1c43b5 100644
--- a/src/target/cortex_m.h
+++ b/src/target/cortex_m.h
@@ -68,6 +68,9 @@ struct cortex_m_part_info {
#define DCB_DEMCR 0xE000EDFC
#define DCB_DSCSR 0xE000EE08
+#define DAUTHSTATUS 0xE000EFB8
+#define DAUTHSTATUS_SID_MASK 0x00000030
+
#define DCRSR_WNR BIT(16)
#define DWT_CTRL 0xE0001000