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); +}
