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

commit e087d0f79d92f5afd08a4d6b946ef4716f31f278
Author: zhangyuan29 <[email protected]>
AuthorDate: Mon Jan 6 23:29:07 2025 +0800

    arch/tricore: Support setjmp and longjmp.
    
    Add setjmp/longjmp support for TriCore architecture using iLLD
    intrinsics to save and restore the CSA (Context Save Area) chain.
    
    This implementation saves upper/lower context registers and walks
    the CSA linked list to restore the full call context on longjmp.
    
    Signed-off-by: zhangyuan29 <[email protected]>
---
 arch/tricore/Kconfig                      |  2 +
 arch/tricore/include/setjmp.h             | 89 +++++++++++++++++++++++++++++++
 libs/libc/machine/Make.defs               |  3 ++
 libs/libc/machine/tricore/CMakeLists.txt  |  8 +++
 libs/libc/machine/tricore/Kconfig         |  4 ++
 libs/libc/machine/{ => tricore}/Make.defs | 40 ++------------
 libs/libc/machine/tricore/arch_setjmp.c   | 69 ++++++++++++++++++++++++
 7 files changed, 180 insertions(+), 35 deletions(-)

diff --git a/arch/tricore/Kconfig b/arch/tricore/Kconfig
index 3db57114fdf..2feb737ec74 100644
--- a/arch/tricore/Kconfig
+++ b/arch/tricore/Kconfig
@@ -32,6 +32,7 @@ config ARCH_TC1V6
        select ARCH_HAVE_SETJMP
        select ARCH_HAVE_RESET
        select ARCH_HAVE_TESTSET
+       select ARCH_SETJMP_H
        default n
 
 config ARCH_TC1V8
@@ -46,6 +47,7 @@ config ARCH_TC1V8
        select ARCH_HAVE_SETJMP
        select ARCH_HAVE_RESET
        select ARCH_HAVE_TESTSET
+       select ARCH_SETJMP_H
        default n
 
 config ARCH_FAMILY
diff --git a/arch/tricore/include/setjmp.h b/arch/tricore/include/setjmp.h
new file mode 100644
index 00000000000..27a8c392456
--- /dev/null
+++ b/arch/tricore/include/setjmp.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+ * arch/tricore/include/setjmp.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_TRICORE_INCLUDE_SETJUMP_H
+#define __ARCH_TRICORE_INCLUDE_SETJUMP_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/compiler.h>
+
+#include <stdint.h>
+
+/****************************************************************************
+ * Pre-processor Prototypes
+ ****************************************************************************/
+
+#define JB_LPCXI    0
+#define JB_LA11     1
+#define JB_A2       2
+#define JB_A3       3
+#define JB_D0       4
+#define JB_D1       5
+#define JB_D2       6
+#define JB_D3       7
+#define JB_A4       8
+#define JB_A5       9
+#define JB_A6       10
+#define JB_A7       11
+#define JB_D4       12
+#define JB_D5       13
+#define JB_D6       14
+#define JB_D7       15
+#define JB_UA11     16
+#define JB_REG_NUM  17
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+struct setjmp_buf_s
+{
+  uintptr_t regs[JB_REG_NUM];
+};
+
+/* Traditional typedef for setjmp_buf */
+
+typedef struct setjmp_buf_s jmp_buf[1];
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+int setjmp(jmp_buf env);
+void longjmp(jmp_buf env, int val);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __ARCH_TRICORE_INCLUDE_SETJUMP_H */
diff --git a/libs/libc/machine/Make.defs b/libs/libc/machine/Make.defs
index 3c87c9a7c4b..fefcdff5c4e 100644
--- a/libs/libc/machine/Make.defs
+++ b/libs/libc/machine/Make.defs
@@ -53,6 +53,9 @@ endif
 ifeq ($(CONFIG_ARCH_SPARC),y)
 include $(TOPDIR)/libs/libc/machine/sparc/Make.defs
 endif
+ifeq ($(CONFIG_ARCH_TRICORE),y)
+include $(TOPDIR)/libs/libc/machine/tricore/Make.defs
+endif
 DEPPATH += --dep-path machine
 VPATH += :machine
 
diff --git a/libs/libc/machine/tricore/CMakeLists.txt 
b/libs/libc/machine/tricore/CMakeLists.txt
index dc98b2b2e42..e2708f1e04b 100644
--- a/libs/libc/machine/tricore/CMakeLists.txt
+++ b/libs/libc/machine/tricore/CMakeLists.txt
@@ -19,3 +19,11 @@
 # the License.
 #
 # 
##############################################################################
+
+set(SRCS)
+
+if(CONFIG_ARCH_SETJMP_H)
+  list(APPEND SRCS arch_setjmp.c)
+endif()
+
+target_sources(c PRIVATE ${SRCS})
diff --git a/libs/libc/machine/tricore/Kconfig 
b/libs/libc/machine/tricore/Kconfig
new file mode 100644
index 00000000000..f72f3c094ce
--- /dev/null
+++ b/libs/libc/machine/tricore/Kconfig
@@ -0,0 +1,4 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
diff --git a/libs/libc/machine/Make.defs b/libs/libc/machine/tricore/Make.defs
similarity index 51%
copy from libs/libc/machine/Make.defs
copy to libs/libc/machine/tricore/Make.defs
index 3c87c9a7c4b..118afa1ccbe 100644
--- a/libs/libc/machine/Make.defs
+++ b/libs/libc/machine/tricore/Make.defs
@@ -1,5 +1,5 @@
 ############################################################################
-# libs/libc/machine/Make.defs
+# libs/libc/machine/tricore/Make.defs
 #
 # SPDX-License-Identifier: Apache-2.0
 #
@@ -20,39 +20,9 @@
 #
 ############################################################################
 
-CSRCS += arch_atomic.c
-
-ifeq ($(CONFIG_MM_KASAN),y)
-  CSRCS += arch_libc.c
-endif
-
-ifeq ($(CONFIG_ARCH_ARM),y)
-include $(TOPDIR)/libs/libc/machine/arm/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_ARM64),y)
-include $(TOPDIR)/libs/libc/machine/arm64/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_RISCV),y)
-include $(TOPDIR)/libs/libc/machine/risc-v/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_SIM),y)
-include $(TOPDIR)/libs/libc/machine/sim/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_X86),y)
-include $(TOPDIR)/libs/libc/machine/x86/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_X86_64),y)
-include $(TOPDIR)/libs/libc/machine/x86_64/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_XTENSA),y)
-include $(TOPDIR)/libs/libc/machine/xtensa/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_RENESAS),y)
-include $(TOPDIR)/libs/libc/machine/renesas/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_SPARC),y)
-include $(TOPDIR)/libs/libc/machine/sparc/Make.defs
+ifeq ($(CONFIG_ARCH_SETJMP_H),y)
+CSRCS += arch_setjmp.c
 endif
-DEPPATH += --dep-path machine
-VPATH += :machine
 
+DEPPATH += --dep-path machine/tricore
+VPATH += :machine/tricore
diff --git a/libs/libc/machine/tricore/arch_setjmp.c 
b/libs/libc/machine/tricore/arch_setjmp.c
new file mode 100644
index 00000000000..e04fbe0605d
--- /dev/null
+++ b/libs/libc/machine/tricore/arch_setjmp.c
@@ -0,0 +1,69 @@
+/****************************************************************************
+ * libs/libc/machine/tricore/arch_setjmp.c
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <string.h>
+
+#include <arch/setjmp.h>
+#include <nuttx/arch.h>
+
+#include <IfxCpu_reg.h>
+#include <IfxCpu_Intrinsics.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int setjmp(jmp_buf env)
+{
+  uintptr_t *regs;
+  uintptr_t pcxi;
+
+  env->regs[JB_UA11] = (uintptr_t)__getA11();
+
+  pcxi = __mfcr(CPU_PCXI);
+  regs = tricore_csa2addr(pcxi);
+  memcpy(env, regs, TC_CONTEXT_SIZE);
+  return 0;
+}
+
+void longjmp(jmp_buf env, int val)
+{
+  void *func = (void *)env->regs[JB_UA11];
+  uintptr_t *regs;
+  uintptr_t pcxi;
+
+  pcxi = __mfcr(CPU_PCXI);
+  regs = tricore_csa2addr(pcxi);
+  memcpy(regs, env, TC_CONTEXT_SIZE);
+
+  if (val == 0)
+    {
+      val = 1;
+    }
+
+  __moveToDataParamRet(val);
+  __jumpToFunctionWithLink(func);
+}

Reply via email to