aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2022-12-14 15:54:53 +0100
committerAntonio Borneo <borneo.antonio@gmail.com>2022-12-18 21:52:41 +0000
commit77c281d2df25621782b48d0a45846b93fba3860d (patch)
treef4869c5fa3dc09f95760a1c6bcadd14403948466
parentc913e4d5a6cafab9a19735c440be8d0c111b2088 (diff)
downloadriscv-openocd-77c281d2df25621782b48d0a45846b93fba3860d.zip
riscv-openocd-77c281d2df25621782b48d0a45846b93fba3860d.tar.gz
riscv-openocd-77c281d2df25621782b48d0a45846b93fba3860d.tar.bz2
cortex_m: handle armv8m cores without security extension
Cores armv8m, e.g. Cortex-M33, can be instantiated without the optional Security Extension. In this case, the secure registers are not present and when GDB try accessing them it triggers a set of errors. For armv8m cores without security extension, don't provide to GDB the description of the secure registers. Change-Id: I254478a4cf883e85b786df3f62c726b2f40d88d9 Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reported-by: Torbjörn SVENSSON <torbjorn.svensson@foss.st.com> Reviewed-on: https://review.openocd.org/c/openocd/+/7402 Tested-by: jenkins Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
-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