This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 422c43949a95845712b31ea8f1260e2f964aa5cf Author: anjiahao <anjia...@xiaomi.com> AuthorDate: Mon Feb 10 17:53:46 2025 +0800 binfmt:use crt0 inside of starthook test: 1.use mps3-an547 build helloxx as module and run it 2.use qemu-armv7a:knsh test kernel build helloxx and run it Signed-off-by: anjiahao <anjia...@xiaomi.com> --- arch/arm/src/Makefile | 7 +- arch/arm/src/armv7-a/Make.defs | 7 -- arch/arm/src/common/Make.defs | 2 + arch/arm/src/common/Toolchain.defs | 9 ++- arch/arm/src/{armv7-a => common}/crt0.c | 11 +-- arch/arm64/src/Makefile | 7 +- arch/arm64/src/Toolchain.defs | 8 ++- arch/arm64/src/common/Make.defs | 5 -- arch/arm64/src/common/crt0.c | 18 +++-- arch/avr/src/avr/Toolchain.defs | 2 +- arch/avr/src/avr32/Toolchain.defs | 2 +- arch/ceva/src/xc5/Toolchain.defs | 2 +- arch/ceva/src/xm6/Toolchain.defs | 2 +- arch/mips/src/mips32/Toolchain.defs | 2 +- arch/misoc/src/lm32/Toolchain.defs | 2 +- arch/misoc/src/minerva/Toolchain.defs | 2 +- arch/or1k/src/mor1kx/Toolchain.defs | 2 +- arch/risc-v/src/common/Make.defs | 2 - arch/risc-v/src/common/Toolchain.defs | 2 +- arch/risc-v/src/common/crt0.c | 18 +++-- arch/sparc/src/sparc_v8/Toolchain.defs | 2 +- arch/tricore/src/common/ToolchainTasking.defs | 2 +- arch/x86/src/common/Toolchain.defs | 2 +- arch/x86_64/src/Makefile | 7 +- arch/x86_64/src/common/Make.defs | 5 -- arch/x86_64/src/common/Toolchain.defs | 9 ++- arch/x86_64/src/common/crt0.c | 70 ++++++++++++++++++- arch/xtensa/src/lx6/Toolchain.defs | 2 +- arch/xtensa/src/lx7/Toolchain.defs | 2 +- arch/z80/src/ez80/Toolchain.defs | 2 +- arch/z80/src/z180/Toolchain.defs | 2 +- arch/z80/src/z8/Toolchain.defs | 2 +- arch/z80/src/z80/Toolchain.defs | 2 +- binfmt/Kconfig | 2 +- binfmt/binfmt_execmodule.c | 57 ---------------- boards/arm/cxd56xx/spresense/configs/elf/defconfig | 1 - boards/arm/imx6/sabre-6quad/configs/elf/defconfig | 1 - .../lc823450-xgevk/configs/audio/defconfig | 1 - .../lc823450/lc823450-xgevk/configs/bt/defconfig | 1 - .../lc823450/lc823450-xgevk/configs/elf/defconfig | 1 - .../lc823450/lc823450-xgevk/configs/ipl2/defconfig | 1 - .../lc823450/lc823450-xgevk/configs/knsh/defconfig | 1 - .../lc823450-xgevk/configs/krndis/defconfig | 1 - .../lc823450/lc823450-xgevk/configs/nsh/defconfig | 1 - .../lc823450-xgevk/configs/posix_spawn/defconfig | 1 - .../lc823450-xgevk/configs/rndis/defconfig | 1 - .../lc823450/lc823450-xgevk/configs/usb/defconfig | 1 - .../stm32/olimex-stm32-p407/configs/kelf/defconfig | 1 - .../stm32/stm32f4discovery/configs/elf/defconfig | 1 - .../stm32f4discovery/configs/posix_spawn/defconfig | 1 - boards/risc-v/k210/maix-bit/configs/smp2/defconfig | 1 - .../esp32/esp32-devkitc/configs/elf/defconfig | 1 - .../esp32s3/esp32s3-devkit/configs/elf/defconfig | 1 - include/nuttx/sched.h | 37 ---------- sched/Kconfig | 10 --- sched/task/CMakeLists.txt | 4 -- sched/task/Make.defs | 4 -- sched/task/task_start.c | 12 ---- sched/task/task_starthook.c | 78 ---------------------- 59 files changed, 156 insertions(+), 287 deletions(-) diff --git a/arch/arm/src/Makefile b/arch/arm/src/Makefile index b8718ef91f..e539f924d8 100644 --- a/arch/arm/src/Makefile +++ b/arch/arm/src/Makefile @@ -169,11 +169,14 @@ $(AOBJS) $(UAOBJS) $(HEAD_OBJ): %$(OBJEXT): %.S $(COBJS) $(UCOBJS): %$(OBJEXT): %.c $(call COMPILE, $<, $@) +$(STARTUP_OBJS): %$(OBJEXT): %.c + $(Q) $(CC) $(CELFFLAGS) -c common$(DELIM)crt0.c -o crt0$(OBJEXT) + ifeq ($(CONFIG_BUILD_FLAT),y) -$(BIN): $(OBJS) +$(BIN): $(STARTUP_OBJS) $(OBJS) $(call ARCHIVE, $@, $(OBJS)) else -$(BIN): $(UOBJS) +$(BIN): $(STARTUP_OBJS) $(UOBJS) $(call ARCHIVE, $@, $(UOBJS)) endif diff --git a/arch/arm/src/armv7-a/Make.defs b/arch/arm/src/armv7-a/Make.defs index 428f86e3b2..99a998b4a8 100644 --- a/arch/arm/src/armv7-a/Make.defs +++ b/arch/arm/src/armv7-a/Make.defs @@ -29,13 +29,6 @@ include common/Make.defs HEAD_ASRC += arm_vectortab.S -ifeq ($(CONFIG_BUILD_KERNEL),y) -crt0$(OBJEXT): crt0.c - $(CC) $(CFLAGS) -c armv7-a$(DELIM)crt0.c -o crt0$(OBJEXT) - -STARTUP_OBJS = crt0$(OBJEXT) -endif - # Common assembly language files CMN_ASRCS += arm_cpuhead.S arm_vectors.S arm_saveusercontext.S diff --git a/arch/arm/src/common/Make.defs b/arch/arm/src/common/Make.defs index 7818eef46e..e11a42a84b 100644 --- a/arch/arm/src/common/Make.defs +++ b/arch/arm/src/common/Make.defs @@ -20,6 +20,8 @@ # ############################################################################ +STARTUP_OBJS = crt0$(OBJEXT) + # Common ARM files CMN_CSRCS += arm_allocateheap.c arm_createstack.c arm_exit.c diff --git a/arch/arm/src/common/Toolchain.defs b/arch/arm/src/common/Toolchain.defs index 7e9533fb96..104d887a37 100644 --- a/arch/arm/src/common/Toolchain.defs +++ b/arch/arm/src/common/Toolchain.defs @@ -551,7 +551,14 @@ else endif endif -LDELFFLAGS += -e main -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) +ifneq ($(CONFIG_BUILD_KERNEL),y) + # Flat build and protected elf entry point use crt0, + # Kernel build will use apps/import/scripts/crt0 + + LDELFFLAGS += $(TOPDIR)$(DELIM)arch$(DELIM)arm$(DELIM)src$(DELIM)crt0.o +endif + +LDELFFLAGS += -e __start -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) # Zig toolchain diff --git a/arch/arm/src/armv7-a/crt0.c b/arch/arm/src/common/crt0.c similarity index 98% rename from arch/arm/src/armv7-a/crt0.c rename to arch/arm/src/common/crt0.c index 93e74b2c05..ccdb94428f 100644 --- a/arch/arm/src/armv7-a/crt0.c +++ b/arch/arm/src/common/crt0.c @@ -1,5 +1,5 @@ /**************************************************************************** - * arch/arm/src/armv7-a/crt0.c + * arch/arm/src/common/crt0.c * * SPDX-License-Identifier: Apache-2.0 * @@ -34,8 +34,6 @@ #include <arch/syscall.h> -#ifdef CONFIG_BUILD_KERNEL - /**************************************************************************** * Public Data ****************************************************************************/ @@ -80,6 +78,7 @@ int main(int argc, char *argv[]); * ****************************************************************************/ +#ifdef CONFIG_BUILD_KERNEL static void sig_trampoline(void) naked_function; static void sig_trampoline(void) { @@ -99,6 +98,7 @@ static void sig_trampoline(void) "i"(SYS_syscall) ); } +#endif #ifdef CONFIG_HAVE_CXXINITIALIZE @@ -135,6 +135,7 @@ static void exec_dtors(void) } #endif + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -167,7 +168,9 @@ void __start(int argc, char *argv[]) * that is visible to the RTOS. */ +#ifdef CONFIG_BUILD_KERNEL ARCH_DATA_RESERVE->ar_sigtramp = (addrenv_sigtramp_t)sig_trampoline; +#endif #ifdef CONFIG_HAVE_CXXINITIALIZE /* Call C++ constructors */ @@ -193,5 +196,3 @@ void __start(int argc, char *argv[]) exit(ret); } - -#endif /* CONFIG_BUILD_KERNEL */ diff --git a/arch/arm64/src/Makefile b/arch/arm64/src/Makefile index f0598f2309..47ea4379d5 100644 --- a/arch/arm64/src/Makefile +++ b/arch/arm64/src/Makefile @@ -142,11 +142,14 @@ $(AOBJS) $(UAOBJS) $(HEAD_OBJ): %$(OBJEXT): %.S $(COBJS) $(UCOBJS): %$(OBJEXT): %.c $(call COMPILE, $<, $@) +$(STARTUP_OBJS): %$(OBJEXT): %.c + $(Q) $(CC) $(CELFFLAGS) -c common$(DELIM)crt0.c -o crt0$(OBJEXT) + ifeq ($(CONFIG_BUILD_FLAT),y) -$(BIN): $(OBJS) +$(BIN): $(OBJS) $(STARTUP_OBJS) $(call ARCHIVE, $@, $(OBJS)) else -$(BIN): $(UOBJS) +$(BIN): $(UOBJS) $(STARTUP_OBJS) $(call ARCHIVE, $@, $(UOBJS)) endif diff --git a/arch/arm64/src/Toolchain.defs b/arch/arm64/src/Toolchain.defs index 9282ddc971..6eb3cd5a78 100644 --- a/arch/arm64/src/Toolchain.defs +++ b/arch/arm64/src/Toolchain.defs @@ -247,5 +247,11 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden -mlong-calls # --target1-abs CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -mlong-calls # --target1-abs -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start +ifneq ($(CONFIG_BUILD_KERNEL),y) + # Flat build and protected elf entry point use crt0, + # Kernel build will use apps/import/scripts/crt0 + + LDELFFLAGS += $(TOPDIR)$(DELIM)arch$(DELIM)arm64$(DELIM)src$(DELIM)crt0.o +endif LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/arm64/src/common/Make.defs b/arch/arm64/src/common/Make.defs index f23427948e..878354490d 100644 --- a/arch/arm64/src/common/Make.defs +++ b/arch/arm64/src/common/Make.defs @@ -25,12 +25,7 @@ HEAD_ASRC = arm64_head.S -ifeq ($(CONFIG_BUILD_KERNEL),y) -crt0$(OBJEXT): crt0.c - $(CC) $(CFLAGS) -c common$(DELIM)crt0.c -o crt0$(OBJEXT) - STARTUP_OBJS = crt0$(OBJEXT) -endif # Force the start-up logic to be at the beginning of the .text to simplify # debug. diff --git a/arch/arm64/src/common/crt0.c b/arch/arm64/src/common/crt0.c index c734cf6e86..b15a2e010a 100644 --- a/arch/arm64/src/common/crt0.c +++ b/arch/arm64/src/common/crt0.c @@ -34,8 +34,6 @@ #include <arch/syscall.h> -#ifdef CONFIG_BUILD_KERNEL - /**************************************************************************** * Public Function Prototypes ****************************************************************************/ @@ -69,6 +67,7 @@ int main(int argc, char *argv[]); * ****************************************************************************/ +#ifdef CONFIG_BUILD_KERNEL static void sig_trampoline(void) naked_function; static void sig_trampoline(void) { @@ -91,6 +90,7 @@ static void sig_trampoline(void) : ); } +#endif /**************************************************************************** * Public Data @@ -107,7 +107,7 @@ extern initializer_t _edtors[]; * Private Functions ****************************************************************************/ -#ifdef CONFIG_HAVE_CXX +#ifdef CONFIG_HAVE_CXXINITIALIZE /**************************************************************************** * Name: exec_ctors @@ -175,25 +175,31 @@ void __start(int argc, char *argv[]) * that is visible to the RTOS. */ +#ifdef CONFIG_BUILD_KERNEL ARCH_DATA_RESERVE->ar_sigtramp = (addrenv_sigtramp_t)sig_trampoline; +#endif -#ifdef CONFIG_HAVE_CXX +#ifdef CONFIG_HAVE_CXXINITIALIZE /* Call C++ constructors */ exec_ctors(); /* Setup so that C++ destructors called on task exit */ +# if CONFIG_LIBC_MAX_EXITFUNS > 0 atexit(exec_dtors); +# endif #endif /* Call the main() entry point passing argc and argv. */ ret = main(argc, argv); +#if defined(CONFIG_HAVE_CXXINITIALIZE) && CONFIG_LIBC_MAX_EXITFUNS <= 0 + exec_dtors(); +#endif + /* Call exit() if/when the main() returns */ exit(ret); } - -#endif /* CONFIG_BUILD_KERNEL */ diff --git a/arch/avr/src/avr/Toolchain.defs b/arch/avr/src/avr/Toolchain.defs index 7d989a9240..ab60713eab 100644 --- a/arch/avr/src/avr/Toolchain.defs +++ b/arch/avr/src/avr/Toolchain.defs @@ -180,5 +180,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/avr/src/avr32/Toolchain.defs b/arch/avr/src/avr32/Toolchain.defs index 24322a7ccd..b1745905bd 100644 --- a/arch/avr/src/avr32/Toolchain.defs +++ b/arch/avr/src/avr32/Toolchain.defs @@ -110,5 +110,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/ceva/src/xc5/Toolchain.defs b/arch/ceva/src/xc5/Toolchain.defs index 8cbf082fe3..f1f556e030 100644 --- a/arch/ceva/src/xc5/Toolchain.defs +++ b/arch/ceva/src/xc5/Toolchain.defs @@ -99,5 +99,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/ceva/src/xm6/Toolchain.defs b/arch/ceva/src/xm6/Toolchain.defs index db2a6a1769..5604220227 100644 --- a/arch/ceva/src/xm6/Toolchain.defs +++ b/arch/ceva/src/xm6/Toolchain.defs @@ -104,5 +104,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/mips/src/mips32/Toolchain.defs b/arch/mips/src/mips32/Toolchain.defs index 225be8edb2..e2c88098e5 100644 --- a/arch/mips/src/mips32/Toolchain.defs +++ b/arch/mips/src/mips32/Toolchain.defs @@ -325,5 +325,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/misoc/src/lm32/Toolchain.defs b/arch/misoc/src/lm32/Toolchain.defs index 932fe6dd77..821126ff79 100644 --- a/arch/misoc/src/lm32/Toolchain.defs +++ b/arch/misoc/src/lm32/Toolchain.defs @@ -141,5 +141,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/misoc/src/minerva/Toolchain.defs b/arch/misoc/src/minerva/Toolchain.defs index 4967b6cb14..50b15eea6b 100644 --- a/arch/misoc/src/minerva/Toolchain.defs +++ b/arch/misoc/src/minerva/Toolchain.defs @@ -89,5 +89,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/or1k/src/mor1kx/Toolchain.defs b/arch/or1k/src/mor1kx/Toolchain.defs index 5feaf57d55..a33d8e1c71 100644 --- a/arch/or1k/src/mor1kx/Toolchain.defs +++ b/arch/or1k/src/mor1kx/Toolchain.defs @@ -127,5 +127,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/risc-v/src/common/Make.defs b/arch/risc-v/src/common/Make.defs index 68f0dbc527..b24560bb7d 100644 --- a/arch/risc-v/src/common/Make.defs +++ b/arch/risc-v/src/common/Make.defs @@ -20,9 +20,7 @@ # ############################################################################ -ifeq ($(CONFIG_BUILD_KERNEL),y) STARTUP_OBJS = crt0$(OBJEXT) -endif # Specify our general Assembly files CMN_ASRCS += riscv_vectors.S riscv_exception_common.S diff --git a/arch/risc-v/src/common/Toolchain.defs b/arch/risc-v/src/common/Toolchain.defs index 3fe0ab7a40..09b9400b7d 100644 --- a/arch/risc-v/src/common/Toolchain.defs +++ b/arch/risc-v/src/common/Toolchain.defs @@ -433,7 +433,7 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -e main +LDELFFLAGS = -e __start ifeq ($(CONFIG_BINFMT_ELF_RELOCATABLE),y) LDELFFLAGS += -r diff --git a/arch/risc-v/src/common/crt0.c b/arch/risc-v/src/common/crt0.c index db7d51d8d5..73331e9fd3 100644 --- a/arch/risc-v/src/common/crt0.c +++ b/arch/risc-v/src/common/crt0.c @@ -35,8 +35,6 @@ #include "riscv_internal.h" -#ifdef CONFIG_BUILD_KERNEL - /**************************************************************************** * Public Function Prototypes ****************************************************************************/ @@ -66,6 +64,7 @@ int main(int argc, char *argv[]); * ****************************************************************************/ +#ifdef CONFIG_BUILD_KERNEL static void sig_trampoline(void) naked_function; static void sig_trampoline(void) { @@ -88,6 +87,7 @@ static void sig_trampoline(void) : ); } +#endif /**************************************************************************** * Public Data @@ -104,7 +104,7 @@ extern initializer_t _edtors[]; * Private Functions ****************************************************************************/ -#ifdef CONFIG_HAVE_CXX +#ifdef CONFIG_HAVE_CXXINITIALIZE /**************************************************************************** * Name: exec_ctors @@ -172,25 +172,31 @@ void __start(int argc, char *argv[]) * that is visible to the RTOS. */ +#ifdef CONFIG_BUILD_KERNEL ARCH_DATA_RESERVE->ar_sigtramp = (addrenv_sigtramp_t)sig_trampoline; +#endif -#ifdef CONFIG_HAVE_CXX +#ifdef CONFIG_HAVE_CXXINITIALIZE /* Call C++ constructors */ exec_ctors(); /* Setup so that C++ destructors called on task exit */ +# if CONFIG_LIBC_MAX_EXITFUNS > 0 atexit(exec_dtors); +# endif #endif /* Call the main() entry point passing argc and argv. */ ret = main(argc, argv); +#if defined(CONFIG_HAVE_CXXINITIALIZE) && CONFIG_LIBC_MAX_EXITFUNS <= 0 + exec_dtors(); +#endif + /* Call exit() if/when the main() returns */ exit(ret); } - -#endif /* CONFIG_BUILD_KERNEL */ diff --git a/arch/sparc/src/sparc_v8/Toolchain.defs b/arch/sparc/src/sparc_v8/Toolchain.defs index a743abeec7..d5041d7d11 100644 --- a/arch/sparc/src/sparc_v8/Toolchain.defs +++ b/arch/sparc/src/sparc_v8/Toolchain.defs @@ -136,5 +136,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/tricore/src/common/ToolchainTasking.defs b/arch/tricore/src/common/ToolchainTasking.defs index cf121918ee..6ae81f937c 100644 --- a/arch/tricore/src/common/ToolchainTasking.defs +++ b/arch/tricore/src/common/ToolchainTasking.defs @@ -138,5 +138,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/x86/src/common/Toolchain.defs b/arch/x86/src/common/Toolchain.defs index f24da4a50c..641a9c7b1a 100644 --- a/arch/x86/src/common/Toolchain.defs +++ b/arch/x86/src/common/Toolchain.defs @@ -90,5 +90,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/x86_64/src/Makefile b/arch/x86_64/src/Makefile index 80ef3a6b2b..45e1fdc859 100644 --- a/arch/x86_64/src/Makefile +++ b/arch/x86_64/src/Makefile @@ -115,11 +115,14 @@ $(AOBJS): %$(OBJEXT): %.S $(COBJS): %$(OBJEXT): %.c $(call COMPILE, $<, $@) +$(STARTUP_OBJS): %$(OBJEXT): %.c + $(Q) $(CC) $(CELFFLAGS) -c common$(DELIM)crt0.c -o crt0$(OBJEXT) + ifeq ($(CONFIG_BUILD_FLAT),y) -$(BIN): $(OBJS) +$(BIN): $(OBJS) $(STARTUP_OBJS) $(call ARCHIVE, $@, $(OBJS)) else -$(BIN): $(UOBJS) +$(BIN): $(UOBJS) $(STARTUP_OBJS) $(call ARCHIVE, $@, $(UOBJS)) endif diff --git a/arch/x86_64/src/common/Make.defs b/arch/x86_64/src/common/Make.defs index acc90a455a..88377c90a6 100644 --- a/arch/x86_64/src/common/Make.defs +++ b/arch/x86_64/src/common/Make.defs @@ -20,12 +20,7 @@ # ############################################################################ -ifeq ($(CONFIG_BUILD_KERNEL),y) -crt0$(OBJEXT): crt0.c - $(CC) $(CFLAGS) -c common$(DELIM)crt0.c -o crt0$(OBJEXT) - STARTUP_OBJS = crt0$(OBJEXT) -endif # Common x86_64 files diff --git a/arch/x86_64/src/common/Toolchain.defs b/arch/x86_64/src/common/Toolchain.defs index be3490a122..9206d4ed90 100644 --- a/arch/x86_64/src/common/Toolchain.defs +++ b/arch/x86_64/src/common/Toolchain.defs @@ -248,7 +248,14 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start +ifneq ($(CONFIG_BUILD_KERNEL),y) + # Flat build and protected elf entry point use crt0, + # Kernel build will use apps/import/scripts/crt0 + + LDELFFLAGS += $(TOPDIR)$(DELIM)arch$(DELIM)x86_64$(DELIM)src$(DELIM)crt0.o +endif + LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) # -fno-pic to avoid GOT relocations diff --git a/arch/x86_64/src/common/crt0.c b/arch/x86_64/src/common/crt0.c index bb39d48e5b..54b26ec147 100644 --- a/arch/x86_64/src/common/crt0.c +++ b/arch/x86_64/src/common/crt0.c @@ -30,10 +30,20 @@ #include <stdlib.h> #include <nuttx/addrenv.h> +#include <nuttx/arch.h> #include <arch/syscall.h> -#ifdef CONFIG_BUILD_KERNEL +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/* Linker defined symbols to .ctors and .dtors */ + +extern initializer_t _sctors[]; +extern initializer_t _ectors[]; +extern initializer_t _sdtors[]; +extern initializer_t _edtors[]; /**************************************************************************** * Public Function Prototypes @@ -58,6 +68,7 @@ int main(int argc, char *argv[]); * ****************************************************************************/ +#ifdef CONFIG_BUILD_KERNEL static void sig_trampoline(void) naked_function; static void sig_trampoline(void) { @@ -77,6 +88,43 @@ static void sig_trampoline(void) ); } +#endif + +#ifdef CONFIG_HAVE_CXXINITIALIZE + +/**************************************************************************** + * Name: exec_ctors + * + * Description: + * Call static constructors + * + ****************************************************************************/ + +static void exec_ctors(void) +{ + for (initializer_t *ctor = _sctors; ctor != _ectors; ctor++) + { + (*ctor)(); + } +} + +/**************************************************************************** + * Name: exec_dtors + * + * Description: + * Call static destructors + * + ****************************************************************************/ + +static void exec_dtors(void) +{ + for (initializer_t *dtor = _sdtors; dtor != _edtors; dtor++) + { + (*dtor)(); + } +} + +#endif /**************************************************************************** * Public Functions ****************************************************************************/ @@ -109,15 +157,31 @@ void __start(int argc, char *argv[]) * that is visible to the RTOS. */ +#ifdef CONFIG_BUILD_KERNEL ARCH_DATA_RESERVE->ar_sigtramp = (addrenv_sigtramp_t)sig_trampoline; +#endif + +#ifdef CONFIG_HAVE_CXXINITIALIZE + /* Call C++ constructors */ + + exec_ctors(); + + /* Setup so that C++ destructors called on task exit */ + +# if CONFIG_LIBC_MAX_EXITFUNS > 0 + atexit(exec_dtors); +# endif +#endif /* Call the main() entry point passing argc and argv. */ ret = main(argc, argv); +#if defined(CONFIG_HAVE_CXXINITIALIZE) && CONFIG_LIBC_MAX_EXITFUNS <= 0 + exec_dtors(); +#endif + /* Call exit() if/when the main() returns */ exit(ret); } - -#endif /* CONFIG_BUILD_KERNEL */ diff --git a/arch/xtensa/src/lx6/Toolchain.defs b/arch/xtensa/src/lx6/Toolchain.defs index 8488e53475..e9dd39c0c9 100644 --- a/arch/xtensa/src/lx6/Toolchain.defs +++ b/arch/xtensa/src/lx6/Toolchain.defs @@ -217,5 +217,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden -mtext-section-literals CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -mtext-section-literals -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/xtensa/src/lx7/Toolchain.defs b/arch/xtensa/src/lx7/Toolchain.defs index 51b1e4755d..963c784985 100644 --- a/arch/xtensa/src/lx7/Toolchain.defs +++ b/arch/xtensa/src/lx7/Toolchain.defs @@ -221,5 +221,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden -mtext-section-literals CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -mtext-section-literals -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/z80/src/ez80/Toolchain.defs b/arch/z80/src/ez80/Toolchain.defs index 0e7b323357..ff8b88d099 100644 --- a/arch/z80/src/ez80/Toolchain.defs +++ b/arch/z80/src/ez80/Toolchain.defs @@ -222,5 +222,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/z80/src/z180/Toolchain.defs b/arch/z80/src/z180/Toolchain.defs index f0392635c6..d6b21ac7b3 100644 --- a/arch/z80/src/z180/Toolchain.defs +++ b/arch/z80/src/z180/Toolchain.defs @@ -120,5 +120,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/z80/src/z8/Toolchain.defs b/arch/z80/src/z8/Toolchain.defs index 79195a95fb..e2b825f598 100644 --- a/arch/z80/src/z8/Toolchain.defs +++ b/arch/z80/src/z8/Toolchain.defs @@ -145,5 +145,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/arch/z80/src/z80/Toolchain.defs b/arch/z80/src/z80/Toolchain.defs index 9072efcc42..645eaf2b3f 100644 --- a/arch/z80/src/z80/Toolchain.defs +++ b/arch/z80/src/z80/Toolchain.defs @@ -120,5 +120,5 @@ LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) CELFFLAGS = $(CFLAGS) -fvisibility=hidden CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -LDELFFLAGS = -r -e main +LDELFFLAGS = -r -e __start LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld) diff --git a/binfmt/Kconfig b/binfmt/Kconfig index 585d878a4c..5a32240d70 100644 --- a/binfmt/Kconfig +++ b/binfmt/Kconfig @@ -66,7 +66,7 @@ endif config BINFMT_CONSTRUCTORS bool "C++ Static Constructor Support" default n - depends on HAVE_CXX && SCHED_STARTHOOK && ELF + depends on HAVE_CXX && ELF ---help--- Built-in support for C++ constructors in loaded modules. Currently only support for ELF binary formats. diff --git a/binfmt/binfmt_execmodule.c b/binfmt/binfmt_execmodule.c index b8fe873eaf..d1c35d9b62 100644 --- a/binfmt/binfmt_execmodule.c +++ b/binfmt/binfmt_execmodule.c @@ -52,55 +52,10 @@ * Pre-processor Definitions ****************************************************************************/ -/* If C++ constructors are used, then CONFIG_SCHED_STARTHOOK must also be - * selected be the start hook is used to schedule execution of the - * constructors. - */ - -#if defined(CONFIG_BINFMT_CONSTRUCTORS) && !defined(CONFIG_SCHED_STARTHOOK) -# error "CONFIG_SCHED_STARTHOOK must be defined to use constructors" -#endif - /**************************************************************************** * Private Functions ****************************************************************************/ -/**************************************************************************** - * Name: exec_ctors - * - * Description: - * Execute C++ static constructors. This function is registered as a - * start hook and runs on the thread of the newly created task before - * the new task's main function is called. - * - * Input Parameters: - * arg - Argument is instance of load state info structure cast to void *. - * - * Returned Value: - * 0 (OK) is returned on success and a negated errno is returned on - * failure. - * - ****************************************************************************/ - -#ifdef CONFIG_BINFMT_CONSTRUCTORS -static void exec_ctors(FAR void *arg) -{ - FAR const struct binary_s *binp = (FAR const struct binary_s *)arg; - binfmt_ctor_t *ctor = (CODE binfmt_ctor_t *)binp->mod.initarr; - int i; - - /* Execute each constructor */ - - for (i = 0; i < binp->mod.ninit; i++) - { - binfo("Calling ctor %d at %p\n", i, ctor); - - (*ctor)(); - ctor++; - } -} -#endif - /**************************************************************************** * Name: exec_swap * @@ -356,18 +311,6 @@ int exec_module(FAR struct binary_s *binp, } #endif -#ifdef CONFIG_BINFMT_CONSTRUCTORS - /* Setup a start hook that will execute all of the C++ static constructors - * on the newly created thread. The struct binary_s must persist at least - * until the new task has been started. - */ - - if (binp->mod.ninit > 0) - { - nxtask_starthook(tcb, exec_ctors, binp); - } -#endif - #ifdef CONFIG_SCHED_USER_IDENTITY if (binp->mode & S_ISUID) { diff --git a/boards/arm/cxd56xx/spresense/configs/elf/defconfig b/boards/arm/cxd56xx/spresense/configs/elf/defconfig index 5e440f0e4a..ea85276d00 100644 --- a/boards/arm/cxd56xx/spresense/configs/elf/defconfig +++ b/boards/arm/cxd56xx/spresense/configs/elf/defconfig @@ -44,7 +44,6 @@ CONFIG_RAM_START=0x0d000000 CONFIG_RR_INTERVAL=200 CONFIG_RTC=y CONFIG_RTC_DRIVER=y -CONFIG_SCHED_STARTHOOK=y CONFIG_SCHED_WAITPID=y CONFIG_SPI=y CONFIG_STACK_COLORATION=y diff --git a/boards/arm/imx6/sabre-6quad/configs/elf/defconfig b/boards/arm/imx6/sabre-6quad/configs/elf/defconfig index 0fc0f31e6f..02b1fc9678 100644 --- a/boards/arm/imx6/sabre-6quad/configs/elf/defconfig +++ b/boards/arm/imx6/sabre-6quad/configs/elf/defconfig @@ -47,7 +47,6 @@ CONFIG_RAM_START=0x10000000 CONFIG_RAM_VSTART=0x10000000 CONFIG_RAW_BINARY=y CONFIG_RR_INTERVAL=200 -CONFIG_SCHED_STARTHOOK=y CONFIG_SCHED_WAITPID=y CONFIG_STACK_COLORATION=y CONFIG_START_DAY=17 diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/audio/defconfig b/boards/arm/lc823450/lc823450-xgevk/configs/audio/defconfig index 50e25893f8..83c19b016b 100644 --- a/boards/arm/lc823450/lc823450-xgevk/configs/audio/defconfig +++ b/boards/arm/lc823450/lc823450-xgevk/configs/audio/defconfig @@ -103,7 +103,6 @@ CONFIG_RTC=y CONFIG_RTC_HIRES=y CONFIG_SCHED_CHILD_STATUS=y CONFIG_SCHED_HAVE_PARENT=y -CONFIG_SCHED_STARTHOOK=y CONFIG_SERIAL_TERMIOS=y CONFIG_SMP=y CONFIG_SMP_NCPUS=2 diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/bt/defconfig b/boards/arm/lc823450/lc823450-xgevk/configs/bt/defconfig index f0aa32439e..ca8f736496 100644 --- a/boards/arm/lc823450/lc823450-xgevk/configs/bt/defconfig +++ b/boards/arm/lc823450/lc823450-xgevk/configs/bt/defconfig @@ -122,7 +122,6 @@ CONFIG_SCHED_CHILD_STATUS=y CONFIG_SCHED_HAVE_PARENT=y CONFIG_SCHED_LPWORK=y CONFIG_SCHED_LPWORKPRIORITY=60 -CONFIG_SCHED_STARTHOOK=y CONFIG_SENSORS=y CONFIG_SERIAL_TERMIOS=y CONFIG_SMP=y diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/elf/defconfig b/boards/arm/lc823450/lc823450-xgevk/configs/elf/defconfig index 7330aeacb4..dd78b9b4ba 100644 --- a/boards/arm/lc823450/lc823450-xgevk/configs/elf/defconfig +++ b/boards/arm/lc823450/lc823450-xgevk/configs/elf/defconfig @@ -53,7 +53,6 @@ CONFIG_SCHED_CHILD_STATUS=y CONFIG_SCHED_HAVE_PARENT=y CONFIG_SCHED_INSTRUMENTATION=y CONFIG_SCHED_INSTRUMENTATION_SWITCH=y -CONFIG_SCHED_STARTHOOK=y CONFIG_SCHED_WAITPID=y CONFIG_SERIAL_TERMIOS=y CONFIG_START_DAY=3 diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/ipl2/defconfig b/boards/arm/lc823450/lc823450-xgevk/configs/ipl2/defconfig index cf0e7ad7a2..ce70320751 100644 --- a/boards/arm/lc823450/lc823450-xgevk/configs/ipl2/defconfig +++ b/boards/arm/lc823450/lc823450-xgevk/configs/ipl2/defconfig @@ -52,7 +52,6 @@ CONFIG_SCHED_CHILD_STATUS=y CONFIG_SCHED_HAVE_PARENT=y CONFIG_SCHED_INSTRUMENTATION=y CONFIG_SCHED_INSTRUMENTATION_SWITCH=y -CONFIG_SCHED_STARTHOOK=y CONFIG_SCHED_WAITPID=y CONFIG_SENSORS=y CONFIG_SERIAL_TERMIOS=y diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/knsh/defconfig b/boards/arm/lc823450/lc823450-xgevk/configs/knsh/defconfig index fa068b00e7..24b488c1a7 100644 --- a/boards/arm/lc823450/lc823450-xgevk/configs/knsh/defconfig +++ b/boards/arm/lc823450/lc823450-xgevk/configs/knsh/defconfig @@ -95,7 +95,6 @@ CONFIG_SCHED_CHILD_STATUS=y CONFIG_SCHED_HAVE_PARENT=y CONFIG_SCHED_INSTRUMENTATION=y CONFIG_SCHED_INSTRUMENTATION_SWITCH=y -CONFIG_SCHED_STARTHOOK=y CONFIG_SCHED_WAITPID=y CONFIG_SERIAL_TERMIOS=y CONFIG_SPI=y diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/krndis/defconfig b/boards/arm/lc823450/lc823450-xgevk/configs/krndis/defconfig index af3e8867fa..b5cd6c8c42 100644 --- a/boards/arm/lc823450/lc823450-xgevk/configs/krndis/defconfig +++ b/boards/arm/lc823450/lc823450-xgevk/configs/krndis/defconfig @@ -151,7 +151,6 @@ CONFIG_SCHED_INSTRUMENTATION_PREEMPTION=y CONFIG_SCHED_INSTRUMENTATION_SWITCH=y CONFIG_SCHED_LPWORK=y CONFIG_SCHED_LPWORKPRIORITY=60 -CONFIG_SCHED_STARTHOOK=y CONFIG_SCHED_WAITPID=y CONFIG_SENSORS=y CONFIG_SERIAL_TERMIOS=y diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/nsh/defconfig b/boards/arm/lc823450/lc823450-xgevk/configs/nsh/defconfig index 1c9e5f49b0..6d72a09e21 100644 --- a/boards/arm/lc823450/lc823450-xgevk/configs/nsh/defconfig +++ b/boards/arm/lc823450/lc823450-xgevk/configs/nsh/defconfig @@ -97,7 +97,6 @@ CONFIG_RTC=y CONFIG_RTC_DATETIME=y CONFIG_SCHED_CHILD_STATUS=y CONFIG_SCHED_HAVE_PARENT=y -CONFIG_SCHED_STARTHOOK=y CONFIG_SCHED_WAITPID=y CONFIG_SERIAL_TERMIOS=y CONFIG_SMP=y diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/posix_spawn/defconfig b/boards/arm/lc823450/lc823450-xgevk/configs/posix_spawn/defconfig index 6e47075ae1..44dc7acab6 100644 --- a/boards/arm/lc823450/lc823450-xgevk/configs/posix_spawn/defconfig +++ b/boards/arm/lc823450/lc823450-xgevk/configs/posix_spawn/defconfig @@ -52,7 +52,6 @@ CONFIG_SCHED_CHILD_STATUS=y CONFIG_SCHED_HAVE_PARENT=y CONFIG_SCHED_INSTRUMENTATION=y CONFIG_SCHED_INSTRUMENTATION_SWITCH=y -CONFIG_SCHED_STARTHOOK=y CONFIG_SCHED_WAITPID=y CONFIG_SERIAL_TERMIOS=y CONFIG_START_DAY=3 diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/rndis/defconfig b/boards/arm/lc823450/lc823450-xgevk/configs/rndis/defconfig index 930a46fab1..ef45d9acfa 100644 --- a/boards/arm/lc823450/lc823450-xgevk/configs/rndis/defconfig +++ b/boards/arm/lc823450/lc823450-xgevk/configs/rndis/defconfig @@ -147,7 +147,6 @@ CONFIG_SCHED_HPWORK=y CONFIG_SCHED_HPWORKPRIORITY=192 CONFIG_SCHED_LPWORK=y CONFIG_SCHED_LPWORKPRIORITY=60 -CONFIG_SCHED_STARTHOOK=y CONFIG_SENSORS=y CONFIG_SERIAL_TERMIOS=y CONFIG_SMP=y diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/usb/defconfig b/boards/arm/lc823450/lc823450-xgevk/configs/usb/defconfig index 8700b61662..82b237309b 100644 --- a/boards/arm/lc823450/lc823450-xgevk/configs/usb/defconfig +++ b/boards/arm/lc823450/lc823450-xgevk/configs/usb/defconfig @@ -99,7 +99,6 @@ CONFIG_RTC=y CONFIG_RTC_DATETIME=y CONFIG_SCHED_CHILD_STATUS=y CONFIG_SCHED_HAVE_PARENT=y -CONFIG_SCHED_STARTHOOK=y CONFIG_SENSORS=y CONFIG_SERIAL_TERMIOS=y CONFIG_SMP=y diff --git a/boards/arm/stm32/olimex-stm32-p407/configs/kelf/defconfig b/boards/arm/stm32/olimex-stm32-p407/configs/kelf/defconfig index 7f678543c0..88e6e2feef 100644 --- a/boards/arm/stm32/olimex-stm32-p407/configs/kelf/defconfig +++ b/boards/arm/stm32/olimex-stm32-p407/configs/kelf/defconfig @@ -44,7 +44,6 @@ CONFIG_RAM_SIZE=114688 CONFIG_RAM_START=0x20000000 CONFIG_RR_INTERVAL=200 CONFIG_SCHED_HPWORK=y -CONFIG_SCHED_STARTHOOK=y CONFIG_SCHED_WAITPID=y CONFIG_START_DAY=4 CONFIG_START_MONTH=8 diff --git a/boards/arm/stm32/stm32f4discovery/configs/elf/defconfig b/boards/arm/stm32/stm32f4discovery/configs/elf/defconfig index 95a1abc7cc..71c641aad4 100644 --- a/boards/arm/stm32/stm32f4discovery/configs/elf/defconfig +++ b/boards/arm/stm32/stm32f4discovery/configs/elf/defconfig @@ -35,7 +35,6 @@ CONFIG_RAM_SIZE=114688 CONFIG_RAM_START=0x20000000 CONFIG_RAW_BINARY=y CONFIG_RR_INTERVAL=200 -CONFIG_SCHED_STARTHOOK=y CONFIG_START_DAY=26 CONFIG_START_MONTH=10 CONFIG_START_YEAR=2012 diff --git a/boards/arm/stm32/stm32f4discovery/configs/posix_spawn/defconfig b/boards/arm/stm32/stm32f4discovery/configs/posix_spawn/defconfig index 7efe0e3858..9f49ec4157 100644 --- a/boards/arm/stm32/stm32f4discovery/configs/posix_spawn/defconfig +++ b/boards/arm/stm32/stm32f4discovery/configs/posix_spawn/defconfig @@ -37,7 +37,6 @@ CONFIG_RAM_SIZE=114688 CONFIG_RAM_START=0x20000000 CONFIG_RAW_BINARY=y CONFIG_RR_INTERVAL=200 -CONFIG_SCHED_STARTHOOK=y CONFIG_START_DAY=26 CONFIG_START_MONTH=10 CONFIG_START_YEAR=2012 diff --git a/boards/risc-v/k210/maix-bit/configs/smp2/defconfig b/boards/risc-v/k210/maix-bit/configs/smp2/defconfig index ada4d0b91b..576bf7dc5b 100644 --- a/boards/risc-v/k210/maix-bit/configs/smp2/defconfig +++ b/boards/risc-v/k210/maix-bit/configs/smp2/defconfig @@ -46,7 +46,6 @@ CONFIG_SCHED_CHILD_STATUS=y CONFIG_SCHED_HAVE_PARENT=y CONFIG_SCHED_INSTRUMENTATION=y CONFIG_SCHED_INSTRUMENTATION_SWITCH=y -CONFIG_SCHED_STARTHOOK=y CONFIG_SMP=y CONFIG_SMP_NCPUS=2 CONFIG_STACK_COLORATION=y diff --git a/boards/xtensa/esp32/esp32-devkitc/configs/elf/defconfig b/boards/xtensa/esp32/esp32-devkitc/configs/elf/defconfig index c40dc7f089..94ae8f5e79 100644 --- a/boards/xtensa/esp32/esp32-devkitc/configs/elf/defconfig +++ b/boards/xtensa/esp32/esp32-devkitc/configs/elf/defconfig @@ -52,7 +52,6 @@ CONFIG_RAM_START=0x20000000 CONFIG_RR_INTERVAL=200 CONFIG_SCHED_HPWORK=y CONFIG_SCHED_LPWORK=y -CONFIG_SCHED_STARTHOOK=y CONFIG_SCHED_WAITPID=y CONFIG_STACK_COLORATION=y CONFIG_START_DAY=6 diff --git a/boards/xtensa/esp32s3/esp32s3-devkit/configs/elf/defconfig b/boards/xtensa/esp32s3/esp32s3-devkit/configs/elf/defconfig index 4ffa9af75f..ae76c348f9 100644 --- a/boards/xtensa/esp32s3/esp32s3-devkit/configs/elf/defconfig +++ b/boards/xtensa/esp32s3/esp32s3-devkit/configs/elf/defconfig @@ -51,7 +51,6 @@ CONFIG_RAM_START=0x20000000 CONFIG_RR_INTERVAL=200 CONFIG_SCHED_HPWORK=y CONFIG_SCHED_LPWORK=y -CONFIG_SCHED_STARTHOOK=y CONFIG_SCHED_WAITPID=y CONFIG_START_DAY=6 CONFIG_START_MONTH=12 diff --git a/include/nuttx/sched.h b/include/nuttx/sched.h index ce0ee8ce51..018abb6a42 100644 --- a/include/nuttx/sched.h +++ b/include/nuttx/sched.h @@ -297,12 +297,6 @@ union entry_u typedef union entry_u entry_t; -/* This is the type of the function called at task startup */ - -#ifdef CONFIG_SCHED_STARTHOOK -typedef CODE void (*starthook_t)(FAR void *arg); -#endif - /* struct sporadic_s ********************************************************/ #ifdef CONFIG_SCHED_SPORADIC @@ -744,13 +738,6 @@ struct task_tcb_s /* Task Group *************************************************************/ struct task_group_s group; /* Shared task group data */ - - /* Task Management Fields *************************************************/ - -#ifdef CONFIG_SCHED_STARTHOOK - starthook_t starthook; /* Task startup function */ - FAR void *starthookarg; /* The argument passed to the hook */ -#endif }; /* struct pthread_tcb_s *****************************************************/ @@ -1129,30 +1116,6 @@ int nxtask_delete(pid_t pid); void nxtask_activate(FAR struct tcb_s *tcb); -/**************************************************************************** - * Name: nxtask_starthook - * - * Description: - * Configure a start hook... a function that will be called on the thread - * of the new task before the new task's main entry point is called. - * The start hook is useful, for example, for setting up automatic - * configuration of C++ constructors. - * - * Input Parameters: - * tcb - The new, unstarted task task that needs the start hook - * starthook - The pointer to the start hook function - * arg - The argument to pass to the start hook function. - * - * Returned Value: - * None - * - ****************************************************************************/ - -#ifdef CONFIG_SCHED_STARTHOOK -void nxtask_starthook(FAR struct task_tcb_s *tcb, starthook_t starthook, - FAR void *arg); -#endif - /**************************************************************************** * Name: nxtask_startup * diff --git a/sched/Kconfig b/sched/Kconfig index 07b616d794..09a7b315a0 100644 --- a/sched/Kconfig +++ b/sched/Kconfig @@ -1564,16 +1564,6 @@ config BOARD_INITTHREAD_PRIORITY endif # BOARD_LATE_INITIALIZE -config SCHED_STARTHOOK - bool "Enable startup hook" - default n - ---help--- - Enable a non-standard, internal OS API call nxtask_starthook(). - nxtask_starthook() registers a function that will be called on task - startup before that actual task entry point is called. The - starthook is useful, for example, for setting up automatic - configuration of C++ constructors. - endmenu # RTOS hooks menu "Signal Configuration" diff --git a/sched/task/CMakeLists.txt b/sched/task/CMakeLists.txt index 34ee0b7fc5..fdc19fdc58 100644 --- a/sched/task/CMakeLists.txt +++ b/sched/task/CMakeLists.txt @@ -60,8 +60,4 @@ if(NOT CONFIG_BINFMT_DISABLE) endif() endif() -if(CONFIG_SCHED_STARTHOOK) - list(APPEND SRCS task_starthook.c) -endif() - target_sources(sched PRIVATE ${SRCS}) diff --git a/sched/task/Make.defs b/sched/task/Make.defs index 91281e556f..1fd24403b5 100644 --- a/sched/task/Make.defs +++ b/sched/task/Make.defs @@ -44,10 +44,6 @@ CSRCS += task_execve.c task_posixspawn.c endif endif -ifeq ($(CONFIG_SCHED_STARTHOOK),y) -CSRCS += task_starthook.c -endif - # Include task build support DEPPATH += --dep-path task diff --git a/sched/task/task_start.c b/sched/task/task_start.c index bcd63755cd..815b78bc06 100644 --- a/sched/task/task_start.c +++ b/sched/task/task_start.c @@ -69,9 +69,6 @@ void nxtask_start(void) { FAR struct tcb_s *tcb = this_task(); uint8_t ttype = tcb->flags & TCB_FLAG_TTYPE_MASK; -#ifdef CONFIG_SCHED_STARTHOOK - FAR struct task_tcb_s *ttcb = (FAR struct task_tcb_s *)tcb; -#endif int exitcode = EXIT_FAILURE; FAR char **argv; int argc; @@ -87,15 +84,6 @@ void nxtask_start(void) } #endif - /* Execute the start hook if one has been registered */ - -#ifdef CONFIG_SCHED_STARTHOOK - if (ttype != TCB_FLAG_TTYPE_KERNEL && ttcb->starthook != NULL) - { - ttcb->starthook(ttcb->starthookarg); - } -#endif - /* Take args from stack, as group is shared for kthreads */ argv = nxsched_get_stackargs(tcb); diff --git a/sched/task/task_starthook.c b/sched/task/task_starthook.c deleted file mode 100644 index c0ae56f4f4..0000000000 --- a/sched/task/task_starthook.c +++ /dev/null @@ -1,78 +0,0 @@ -/**************************************************************************** - * sched/task/task_starthook.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 <nuttx/config.h> - -#include <assert.h> -#include <nuttx/sched.h> - -#include "task/task.h" - -#ifdef CONFIG_SCHED_STARTHOOK - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: nxtask_starthook - * - * Description: - * Configure a start hook... a function that will be called on the thread - * of the new task before the new task's main entry point is called. - * The start hook is useful, for example, for setting up automatic - * configuration of C++ constructors. - * - * Input Parameters: - * tcb - The new, unstarted task task that needs the start hook - * starthook - The pointer to the start hook function - * arg - The argument to pass to the start hook function. - * - * Returned Value: - * None - * - ****************************************************************************/ - -void nxtask_starthook(FAR struct task_tcb_s *tcb, starthook_t starthook, - FAR void *arg) -{ - /* Only tasks can have starthooks. The starthook will be called when the - * task is started (or restarted). - */ - -#ifndef CONFIG_DISABLE_PTHREAD - DEBUGASSERT(tcb && - (tcb->cmn.flags & TCB_FLAG_TTYPE_MASK) != - TCB_FLAG_TTYPE_PTHREAD); -#endif - - /* Set up the start hook */ - - tcb->starthook = starthook; - tcb->starthookarg = arg; -} - -#endif /* CONFIG_SCHED_STARTHOOK */