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 +#include + +#include + +/**************************************************************************** + * 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/tricore/Make.defs b/libs/libc/machine/tricore/Make.defs new file mode 100644 index 00000000000..118afa1ccbe --- /dev/null +++ b/libs/libc/machine/tricore/Make.defs @@ -0,0 +1,28 @@ +############################################################################ +# libs/libc/machine/tricore/Make.defs +# +# 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. +# +############################################################################ + +ifeq ($(CONFIG_ARCH_SETJMP_H),y) +CSRCS += arch_setjmp.c +endif + +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 + +#include +#include + +#include +#include + +/**************************************************************************** + * 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); +}