target/cortex_m: add Cortex-M part number getter
authorTomas Vanek <vanekt@fbl.cz>
Thu, 25 Nov 2021 05:13:31 +0000 (06:13 +0100)
committerTomas Vanek <vanekt@fbl.cz>
Fri, 25 Feb 2022 20:26:56 +0000 (20:26 +0000)
The getter checks the magic numbers in arch_info to detect eventual
type mismatch.

Change-Id: I61134b05310a97ae9831517d0516c7b4240d35a5
Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-on: https://review.openocd.org/c/openocd/+/6751
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>
src/target/cortex_m.h

index 8fb34f46c12fa2ce49b4aeb4cf98c370f8a2461d..555401416206659c6df82f1bc03890fda9333075 100644 (file)
@@ -46,6 +46,7 @@
 #define ARM_CPUID_PARTNO_MASK  (0xFFF << ARM_CPUID_PARTNO_POS)
 
 enum cortex_m_partno {
+       CORTEX_M_PARTNO_INVALID,
        CORTEX_M0_PARTNO   = 0xC20,
        CORTEX_M1_PARTNO   = 0xC21,
        CORTEX_M3_PARTNO   = 0xC23,
@@ -294,6 +295,23 @@ target_to_cortex_m_safe(struct target *target)
        return cortex_m;
 }
 
+/**
+ * @returns cached value of Cortex-M part number
+ * or CORTEX_M_PARTNO_INVALID if the magic number does not match
+ * or core_info is not initialised.
+ */
+static inline enum cortex_m_partno cortex_m_get_partno_safe(struct target *target)
+{
+       struct cortex_m_common *cortex_m = target_to_cortex_m_safe(target);
+       if (!cortex_m)
+               return CORTEX_M_PARTNO_INVALID;
+
+       if (!cortex_m->core_info)
+               return CORTEX_M_PARTNO_INVALID;
+
+       return cortex_m->core_info->partno;
+}
+
 int cortex_m_examine(struct target *target);
 int cortex_m_set_breakpoint(struct target *target, struct breakpoint *breakpoint);
 int cortex_m_unset_breakpoint(struct target *target, struct breakpoint *breakpoint);