This is an automated email from the ASF dual-hosted git repository.

xiaoxiang781216 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 6ccb459e1a7 arch/tricore: drop iLLD dependency in hwdebug
6ccb459e1a7 is described below

commit 6ccb459e1a79c4a0de4e32353f98b72d2bc081e1
Author: zhangyuan29 <[email protected]>
AuthorDate: Tue Aug 11 21:09:44 2026 +0800

    arch/tricore: drop iLLD dependency in hwdebug
    
    Remove the dependency on the iLLD SFR headers (IfxCpu_bf.h and
    IfxCbs_reg.h) and the iLLD intrinsics (__mfcr/__mtcr) from the
    hardware debug monitor implementation.
    
    The debug CSFR numbers, trigger-event register (TR0..TR7) addresses,
    TREVT bit-field offsets and the CBS_OEC register address are now
    defined locally with a TC_ prefix, so the file no longer leaks the
    iLLD CPU_* namespace (which is still pulled in transitively through
    arch/irq.h).  Register accesses use the tricore_mfcr/tricore_mtcr
    macros, and the DBGTCR/DBGCFG/DBGACT bit-field unions are replaced
    with explicit shifts.
    
    This is a pure de-iLLD refactor with no behavior change, verified on
    a TC4x7 EVB: the board boots to NuttShell and breakpoints trigger
    identically before and after the change.
    
    Signed-off-by: zhangyuan29 <[email protected]>
---
 arch/tricore/src/common/tricore_hwdebug.c | 143 +++++++++++++++++++++---------
 1 file changed, 101 insertions(+), 42 deletions(-)

diff --git a/arch/tricore/src/common/tricore_hwdebug.c 
b/arch/tricore/src/common/tricore_hwdebug.c
index 16b0a93a7d6..f13ece20902 100644
--- a/arch/tricore/src/common/tricore_hwdebug.c
+++ b/arch/tricore/src/common/tricore_hwdebug.c
@@ -27,10 +27,6 @@
 #include <nuttx/config.h>
 
 #include <nuttx/arch.h>
-#include <arch/irq.h>
-
-#include <IfxCpu_bf.h>
-#include <IfxCbs_reg.h>
 
 #include "tricore_internal.h"
 
@@ -38,40 +34,93 @@
  * Pre-processor Definitions
  ****************************************************************************/
 
+/* Core Special Function Register (CSFR) numbers used below.  These were
+ * previously pulled in from the iLLD SFR headers; define them locally so
+ * this file no longer depends on iLLD.
+ */
+
+#define TC_DBGSR                      0xfd00  /* Debug Status Register */
+#define TC_DBGACT                     0xfd14  /* Debug Action Register */
+#define TC_DMS                        0xfd40  /* Debug Monitor Start Addr */
+#define TC_DCX                        0xfd44  /* Debug Context Save Addr */
+#define TC_DBGTCR                     0xfd48  /* Debug Trap Control Register */
+#define TC_DBGCFG                     0xfd4c  /* Debug Configuration Register 
*/
+
+/* Trigger event registers TR0..TR7: EVT at 0xf000 + n * 8, ADR at + 4 */
+
+#define TC_TR0_EVT                    0xf000
+#define TC_TR1_EVT                    0xf008
+#define TC_TR2_EVT                    0xf010
+#define TC_TR3_EVT                    0xf018
+#define TC_TR4_EVT                    0xf020
+#define TC_TR5_EVT                    0xf028
+#define TC_TR6_EVT                    0xf030
+#define TC_TR7_EVT                    0xf038
+
+#define TC_TR0_ADR                    0xf004
+#define TC_TR1_ADR                    0xf00c
+#define TC_TR2_ADR                    0xf014
+#define TC_TR3_ADR                    0xf01c
+#define TC_TR4_ADR                    0xf024
+#define TC_TR5_ADR                    0xf02c
+#define TC_TR6_ADR                    0xf034
+#define TC_TR7_ADR                    0xf03c
+
+/* CBS_OEC (OCDS Enable Control) memory-mapped register address */
+
+#ifdef CONFIG_ARCH_TC1V6
+#  define CBS_OEC_ADDR                0xf0000478
+#elif defined(CONFIG_ARCH_TC1V8)
+#  define CBS_OEC_ADDR                0xfa180068
+#endif
+
+/* Trigger event register (TREVT) bit field offsets/masks.  The address
+ * match/type bits share the same layout on TC1V6 and TC1V8; only the
+ * enable field differs (see TREVT_CFG_REG_EN_* below).
+ */
+
+#define TREVT_BBM_OFF                 3       /* Break Before Make */
+#define TREVT_TYP_OFF                 12      /* 0: watchpoint 1: breakpoint */
+#define TREVT_AST_OFF                 27      /* Address store trigger */
+#define TREVT_ALD_OFF                 28      /* Address load trigger */
+
+/* Debug Status Register (DBGSR) event source field */
+
+#define DBGSR_EVTSRC_OFF              8
+#define DBGSR_EVTSRC_MSK              0x1f
+
+/* Debug Configuration Register (DBGCFG) - TC1V8 only */
+
+#define DBGCFG_EN_OFF                 15      /* Debug enable */
+
 /* Watchpoint and breakpoint share a set of trigger events */
 
 #define TREVT_DEBUG_NUM               8
 #define TREVT_DEBUG_REGS              4
 #define TREVT_DEBUG_MATCH_TRAPMODE    0x03
 #define TREVT_DEBUG_EVTSRC_BASE       0x10
-#ifdef CONFIG_ARCH_TC1V8
-#  define IFX_CPU_TR_EVT_BBM_OFF      IFX_CPU_TREVT_BBM_OFF
-#  define IFX_CPU_TR_EVT_TYP_OFF      IFX_CPU_TREVT_TYP_OFF
-#  define IFX_CPU_TR_EVT_AST_OFF      IFX_CPU_TREVT_AST_OFF
-#  define IFX_CPU_TR_EVT_ALD_OFF      IFX_CPU_TREVT_ALD_OFF
-#endif
 
-#define TREVT_DEBUG_BBM               (1 << IFX_CPU_TR_EVT_BBM_OFF)
-#define TREVT_DEBUG_WP                (0 << IFX_CPU_TR_EVT_TYP_OFF)
-#define TREVT_DEBUG_BP                (1 << IFX_CPU_TR_EVT_TYP_OFF)
-#define TREVT_DEBUG_WP_AST            (1 << IFX_CPU_TR_EVT_AST_OFF)
-#define TREVT_DEBUG_WP_ALD            (1 << IFX_CPU_TR_EVT_ALD_OFF)
+#define TREVT_DEBUG_BBM               (1 << TREVT_BBM_OFF)
+#define TREVT_DEBUG_WP                (0 << TREVT_TYP_OFF)
+#define TREVT_DEBUG_BP                (1 << TREVT_TYP_OFF)
+#define TREVT_DEBUG_WP_AST            (1 << TREVT_AST_OFF)
+#define TREVT_DEBUG_WP_ALD            (1 << TREVT_ALD_OFF)
 #define TREVT_DEBUG_WP_ASTLD          (TREVT_DEBUG_WP_AST | TREVT_DEBUG_WP_ALD)
 
 /* Register TREVT[2:0] have difference between tc3xx and tc4xx */
 
 #ifdef CONFIG_ARCH_TC1V6
-#  define TREVT_CFG_REG_EN_MASK       IFX_CPU_TR_EVT_EVTA_MSK
+#  define TREVT_CFG_REG_EN_MASK       0x7     /* EVTA field mask */
 #  define TREVT_CFG_REG_EN_VALUE      TREVT_DEBUG_MATCH_TRAPMODE
 #elif defined(CONFIG_ARCH_TC1V8)
-#  define TREVT_CFG_REG_EN_MASK       IFX_CPU_TREVT_EN_MSK
+#  define TREVT_CFG_REG_EN_MASK       0x1     /* EN bit mask */
 #  define TREVT_CFG_REG_EN_VALUE      0x01
 #endif
 
 #define TREVT_SET_CASE(reg, n, val) \
-  case n: __mtcr(CPU_TR##n##_##reg, val); break;
+  case n: tricore_mtcr(TC_TR##n##_##reg, val); break;
 #define TREVT_GET_CASE(reg, n, val) \
-  case n: val = __mfcr(CPU_TR##n##_##reg); break;
+  case n: val = tricore_mfcr(TC_TR##n##_##reg); break;
 
 #define TREVT_GET_CFG_REG(n)          TREVT_GET(EVT, n)
 #define TREVT_SET_CFG_REG(n, val)     TREVT_SET(EVT, n, val)
@@ -123,9 +172,17 @@ struct tricore_debugpoint_s
   void *arg;
 };
 
+/* The debug context save area pointed to by DCX must be aligned to a full
+ * context (upper + lower CSA = 32 registers).  This matches the value that
+ * arch/irq.h exports as XCPTCONTEXT_SIZE, defined locally to avoid pulling
+ * in the iLLD-tainted header.
+ */
+
+#define TRICORE_DBG_CTX_SIZE (sizeof(uintptr_t) * 32)
+
 struct tricore_debug_s
 {
-  uintptr_t aligned_data(XCPTCONTEXT_SIZE) dcx[TREVT_DEBUG_REGS];
+  uintptr_t aligned_data(TRICORE_DBG_CTX_SIZE) dcx[TREVT_DEBUG_REGS];
   struct tricore_debugpoint_s dp[TREVT_DEBUG_NUM];
 };
 
@@ -259,8 +316,8 @@ void tricore_trevt_match(void)
 
   dp = g_trevt_debug.dp;
 
-  evtsrc = ((__mfcr(CPU_DBGSR) >> IFX_CPU_DBGSR_EVTSRC_OFF) &
-            IFX_CPU_DBGSR_EVTSRC_MSK) - TREVT_DEBUG_EVTSRC_BASE;
+  evtsrc = ((tricore_mfcr(TC_DBGSR) >> DBGSR_EVTSRC_OFF) &
+            DBGSR_EVTSRC_MSK) - TREVT_DEBUG_EVTSRC_BASE;
 
   dp[evtsrc].callback(dp[evtsrc].type, dp[evtsrc].addr,
                       dp[evtsrc].size, dp[evtsrc].arg);
@@ -276,47 +333,49 @@ void tricore_trevt_match(void)
 
 int tricore_init_dbgmonitor(void)
 {
-  Ifx_CPU_DBGTCR dbgtcr;
+  /* DBGTCR: DTA (bit 0) = 0, all other fields cleared */
 
-  dbgtcr.B.DTA = 0;
+  uint32_t dbgtcr = 0;
+#ifdef CONFIG_ARCH_TC1V8
+  /* DBGCFG: EN (bit 15) = 1, TC (bit 0) = 0, TCP (bit 1) = 0.
+   * DBGACT: EVTA (bits 2:0) = trap mode.
+   */
 
-  if (!(__mfcr(CPU_DBGSR) & 0x1))
+  uint32_t dbgcfg = 1 << DBGCFG_EN_OFF;
+  uint32_t dbgact = TREVT_DEBUG_MATCH_TRAPMODE;
+#endif
+
+  if (!(tricore_mfcr(TC_DBGSR) & 0x1))
     {
-      CBS_OEC.U = 0xa1;
-      CBS_OEC.U = 0x5e;
-      CBS_OEC.U = 0xa1;
-      CBS_OEC.U = 0x5e;
+      /* Unlock sequence for the OCDS Enable Control register */
+
+      putreg32(0xa1, CBS_OEC_ADDR);
+      putreg32(0x5e, CBS_OEC_ADDR);
+      putreg32(0xa1, CBS_OEC_ADDR);
+      putreg32(0x5e, CBS_OEC_ADDR);
     }
 
 #ifdef CONFIG_ARCH_TC1V8
-  Ifx_CPU_DBGCFG dbgcfg;
-  Ifx_CPU_DBGACT dbgact;
-
-  dbgcfg.B.EN = 1;
-  dbgcfg.B.TC = 0;
-  dbgcfg.B.TCP = 0;
-  dbgact.B.EVTA = TREVT_DEBUG_MATCH_TRAPMODE;
-
   /* Set debug configuration register */
 
-  __mtcr(CPU_DBGCFG, dbgcfg.U);
+  tricore_mtcr(TC_DBGCFG, dbgcfg);
 
   /* Set debug action configuration register */
 
-  __mtcr(CPU_DBGACT, dbgact.U);
+  tricore_mtcr(TC_DBGACT, dbgact);
 #endif
 
   /* Set debug trap control register */
 
-  __mtcr(CPU_DBGTCR, dbgtcr.U);
+  tricore_mtcr(TC_DBGTCR, dbgtcr);
 
   /* Set trevt trap handler */
 
-  __mtcr(CPU_DMS, (uintptr_t)tricore_dbgmonitor);
+  tricore_mtcr(TC_DMS, (uintptr_t)tricore_dbgmonitor);
 
   /* Set dcx register */
 
-  __mtcr(CPU_DCX, (uintptr_t)g_trevt_debug.dcx);
+  tricore_mtcr(TC_DCX, (uintptr_t)g_trevt_debug.dcx);
 
   return OK;
 }

Reply via email to