This is an automated email from Gerrit.

"Tomas Vanek <[email protected]>" just uploaded a new patch set to Gerrit, which 
you can find at https://review.openocd.org/c/openocd/+/9169

-- gerrit

commit 01b6b95787321440f5a9632cded04ba0535f5290
Author: Tomas Vanek <[email protected]>
Date:   Mon Oct 13 15:39:05 2025 +0200

    target: introduce target capability bits
    
    Add target_get_capab() call to identify which optional capabilities
    the target supports.
    
    For the beginning define bits for memory read/write while running
    and HW breakpoint/watchpoint manipulation at any state.
    
    Add simple usage in cortex_m.c
    
    Change-Id: I1a28f3707dfff9a2424090bb125990c7ea9a0387
    Signed-off-by: Tomas Vanek <[email protected]>

diff --git a/src/target/cortex_m.c b/src/target/cortex_m.c
index 42e9572602..b172d1bcd4 100644
--- a/src/target/cortex_m.c
+++ b/src/target/cortex_m.c
@@ -3101,6 +3101,13 @@ static int cortex_m_target_create(struct target *target)
        return ERROR_OK;
 }
 
+static unsigned int cortex_m_get_capab(struct target *target)
+{
+       return TARGET_CAPAB_MEM_READ_WHILE_RUNNING
+               | TARGET_CAPAB_MEM_WRITE_WHILE_RUNNING
+               | TARGET_CAPAB_BP_WP_MANIP_AT_ANY_STATE;
+}
+
 /*--------------------------------------------------------------------------*/
 
 static int cortex_m_verify_pointer(struct command_invocation *cmd,
@@ -3405,4 +3412,6 @@ struct target_type cortexm_target = {
        .deinit_target = cortex_m_deinit_target,
 
        .profiling = cortex_m_profiling,
+
+       .get_capab = cortex_m_get_capab,
 };
diff --git a/src/target/target.c b/src/target/target.c
index bdf0ff244d..5f1c85c3a5 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -1474,6 +1474,13 @@ unsigned int target_data_bits(struct target *target)
        return 32;
 }
 
+unsigned int target_get_capab(struct target *target)
+{
+       if (target->type->get_capab)
+               return target->type->get_capab(target);
+       return 0;
+}
+
 static int target_profiling(struct target *target, uint32_t *samples,
                        uint32_t max_num_samples, uint32_t *num_samples, 
uint32_t seconds)
 {
diff --git a/src/target/target.h b/src/target/target.h
index 6efcc7677b..b1fc0001d8 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -20,6 +20,7 @@
 #ifndef OPENOCD_TARGET_TARGET_H
 #define OPENOCD_TARGET_TARGET_H
 
+#include <helper/bits.h>
 #include <helper/list.h>
 #include "helper/replacements.h"
 #include "helper/system.h"
@@ -85,6 +86,10 @@ enum target_endianness {
        TARGET_BIG_ENDIAN = 1, TARGET_LITTLE_ENDIAN = 2
 };
 
+#define TARGET_CAPAB_MEM_READ_WHILE_RUNNING            BIT(0)
+#define TARGET_CAPAB_MEM_WRITE_WHILE_RUNNING   BIT(1)
+#define TARGET_CAPAB_BP_WP_MANIP_AT_ANY_STATE  BIT(2)
+
 struct working_area {
        target_addr_t address;
        uint32_t size;
@@ -690,6 +695,13 @@ unsigned int target_address_bits(struct target *target);
  */
 unsigned int target_data_bits(struct target *target);
 
+/**
+ * Return target capabilities as TARGET_CAPAB_ bits.
+ *
+ * This routine is a wrapper for target->type->get_capab
+ */
+unsigned int target_get_capab(struct target *target);
+
 /** Return the *name* of this targets current state */
 const char *target_state_name(const struct target *target);
 
diff --git a/src/target/target_type.h b/src/target/target_type.h
index ccbe03a476..6b1443c6b7 100644
--- a/src/target/target_type.h
+++ b/src/target/target_type.h
@@ -305,6 +305,10 @@ struct target_type {
         * will typically be 32 for 32-bit targets, and 64 for 64-bit targets. 
If
         * not implemented, it's assumed to be 32. */
        unsigned int (*data_bits)(struct target *target);
+
+       /* Return target capabilities as TARGET_CAPAB_ bits.
+        * Assume zero return (no optional capabilities) if not implemented */
+       unsigned int (*get_capab)(struct target *target);
 };
 
 // Keep in alphabetic order this list of targets

-- 

Reply via email to