From 7c94bc8f028bd0b667608b7ea07051c9202e6602 Mon Sep 17 00:00:00 2001 From: Jukka Laitinen Date: Wed, 30 Sep 2020 15:42:15 +0300 Subject: [PATCH] Add kernel/userspace and nuttx_syscall libraries to build Build NuttX proxies, stubs and separate user space and kernel space libraries Signed-off-by: Jukka Laitinen --- boards/px4/fmu-v5/src/CMakeLists.txt | 15 ++- boards/px4/fmu-v5/src/stm32_userspace.c | 147 ++++++++++++++++++++++++ platforms/nuttx/NuttX/CMakeLists.txt | 48 ++++++-- 3 files changed, 197 insertions(+), 13 deletions(-) create mode 100644 boards/px4/fmu-v5/src/stm32_userspace.c diff --git a/boards/px4/fmu-v5/src/CMakeLists.txt b/boards/px4/fmu-v5/src/CMakeLists.txt index d00f86e356..837dbad710 100644 --- a/boards/px4/fmu-v5/src/CMakeLists.txt +++ b/boards/px4/fmu-v5/src/CMakeLists.txt @@ -52,5 +52,18 @@ target_link_libraries(drivers_board drivers__led # drv_led_start nuttx_arch # sdio nuttx_drivers # sdio - px4_layer ) + +if (NOT DEFINED CONFIG_BUILD_FLAT) + target_link_libraries(drivers_board PRIVATE px4_kernel_layer) +else() + target_link_libraries(drivers_board PRIVATE px4_layer) +endif() + +add_library(drivers_userspace + stm32_userspace.c +) + +target_link_libraries(drivers_userspace PRIVATE px4_userspace_init) + +add_dependencies(drivers_userspace arch_board_hw_info) diff --git a/boards/px4/fmu-v5/src/stm32_userspace.c b/boards/px4/fmu-v5/src/stm32_userspace.c new file mode 100644 index 0000000000..afbc870b6e --- /dev/null +++ b/boards/px4/fmu-v5/src/stm32_userspace.c @@ -0,0 +1,147 @@ +/**************************************************************************** + * boards/arm/stm32f7/stm32f746g-disco/kernel/stm32_userspace.c + * + * Copyright (C) 2015 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include +#include +#include +#include + +#if !defined(CONFIG_BUILD_FLAT) && !defined(__KERNEL__) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Configuration ************************************************************/ + +#ifndef CONFIG_NUTTX_USERSPACE +# error "CONFIG_NUTTX_USERSPACE not defined" +#endif + +#if CONFIG_NUTTX_USERSPACE != 0x08100000 +# error "CONFIG_NUTTX_USERSPACE must be 0x08100000 to match memory.ld" +#endif + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/* These 'addresses' of these values are setup by the linker script. They are + * not actual uint32_t storage locations! They are only used meaningfully in + * the following way: + * + * - The linker script defines, for example, the symbol_sdata. + * - The declaration extern uint32_t _sdata; makes C happy. C will believe + * that the value _sdata is the address of a uint32_t variable _data (it + * is not!). + * - We can recover the linker value then by simply taking the address of + * of _data. like: uint32_t *pdata = &_sdata; + */ + +extern uint32_t _stext; /* Start of .text */ +extern uint32_t _etext; /* End_1 of .text + .rodata */ +extern const uint32_t _eronly; /* End+1 of read only section (.text + .rodata) */ +extern uint32_t _sdata; /* Start of .data */ +extern uint32_t _edata; /* End+1 of .data */ +extern uint32_t _sbss; /* Start of .bss */ +extern uint32_t _ebss; /* End+1 of .bss */ + +/* This is the user space entry point */ + +int CONFIG_USER_ENTRYPOINT(int argc, char *argv[]); +int nsh_main(int argc, char *argv[]); + +const struct userspace_s userspace __attribute__((section(".userspace"))) = { + /* General memory map */ + + .us_entrypoint = (main_t)CONFIG_USER_ENTRYPOINT, + .us_textstart = (uintptr_t) &_stext, + .us_textend = (uintptr_t) &_etext, + .us_datasource = (uintptr_t) &_eronly, + .us_datastart = (uintptr_t) &_sdata, + .us_dataend = (uintptr_t) &_edata, + .us_bssstart = (uintptr_t) &_sbss, + .us_bssend = (uintptr_t) &_ebss, + + /* Memory manager heap structure */ + + .us_heap = &g_mmheap, + + /* Task/thread startup routines */ + + .task_startup = nxtask_startup, + + /* Signal handler trampoline */ + + .signal_handler = up_signal_handler, + + /* User-space work queue support (declared in include/nuttx/wqueue.h) */ + +#ifdef CONFIG_LIB_USRWORK + .work_usrstart = work_usrstart, +#endif +}; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +void px4_userspace_init(void); + +int CONFIG_USER_ENTRYPOINT(int argc, char *argv[]) +{ + +#ifdef CONFIG_NSH_ARCHINIT +#error CONFIG_NSH_ARCHINIT must not be defined! +#endif + + boardctl(BOARDIOC_INIT, 0); + + px4_userspace_init(); + + return nsh_main(argc, argv); +} + + +#endif /* !CONFIG_BUILD_FLAT && !__KERNEL__ */ diff --git a/platforms/nuttx/NuttX/CMakeLists.txt b/platforms/nuttx/NuttX/CMakeLists.txt index eec421b590..06c30a8cd6 100644 --- a/platforms/nuttx/NuttX/CMakeLists.txt +++ b/platforms/nuttx/NuttX/CMakeLists.txt @@ -288,14 +288,21 @@ add_dependencies(nuttx_build nuttx_apps_build) target_link_libraries(nuttx_build INTERFACE nuttx_apps) # helper for all targets -function(add_nuttx_dir nuttx_lib nuttx_lib_dir kernel extra) +function(add_nuttx_dir nuttx_lib nuttx_lib_dir kernel extra target) + if (${target} STREQUAL all) + set(nuttx_lib_target all) + else() + set(nuttx_lib_target lib${target}.a) + endif() + file(GLOB_RECURSE nuttx_lib_files LIST_DIRECTORIES false ${CMAKE_CURRENT_SOURCE_DIR}/nuttx/${nuttx_lib_dir}/*) add_custom_command(OUTPUT ${NUTTX_DIR}/${nuttx_lib_dir}/lib${nuttx_lib}.a COMMAND find ${nuttx_lib_dir} -type f -name *.o -delete - COMMAND make -C ${nuttx_lib_dir} ${nuttx_build_options} --no-print-directory all TOPDIR=${NUTTX_DIR} KERNEL=${kernel} EXTRAFLAGS=${extra} + COMMAND make -C ${nuttx_lib_dir} ${nuttx_build_options} --no-print-directory ${nuttx_lib_target} TOPDIR=${NUTTX_DIR} KERNEL=${kernel} EXTRAFLAGS=${extra} + DEPENDS ${nuttx_lib_files} nuttx_context ${NUTTX_DIR}/include/nuttx/config.h ${NUTTX_DIR}/include/nuttx/version.h @@ -309,19 +316,36 @@ function(add_nuttx_dir nuttx_lib nuttx_lib_dir kernel extra) target_link_libraries(nuttx_build INTERFACE nuttx_${nuttx_lib}) endfunction() + # add_nuttx_dir(NAME DIRECTORY KERNEL EXTRA) -add_nuttx_dir(arch arch/${CONFIG_ARCH}/src y -D__KERNEL__) -add_nuttx_dir(binfmt binfmt y -D__KERNEL__) -add_nuttx_dir(boards boards y -D__KERNEL__) -add_nuttx_dir(drivers drivers y -D__KERNEL__) -add_nuttx_dir(fs fs y -D__KERNEL__) -add_nuttx_dir(sched sched y -D__KERNEL__) -add_nuttx_dir(c libs/libc n "") -add_nuttx_dir(xx libs/libxx n "") -add_nuttx_dir(mm mm n "") +add_nuttx_dir(binfmt binfmt y -D__KERNEL__ all) +add_nuttx_dir(boards boards y -D__KERNEL__ all) +add_nuttx_dir(drivers drivers y -D__KERNEL__ all) +add_nuttx_dir(fs fs y -D__KERNEL__ all) +add_nuttx_dir(sched sched y -D__KERNEL__ all) +add_nuttx_dir(xx libs/libxx n "" all) + +if (NOT CONFIG_BUILD_FLAT) + add_nuttx_dir(arch arch/${CONFIG_ARCH}/src n "" arch) + add_dependencies(nuttx_arch_build nuttx_karch_build) # can't build these in parallel + add_nuttx_dir(karch arch/arm/src y -D__KERNEL__ karch) + add_nuttx_dir(c libs/libc n "" c) + add_dependencies(nuttx_c_build nuttx_kc_build) # can't build these in parallel + add_nuttx_dir(kc libs/libc y -D__KERNEL__ kc) + add_nuttx_dir(mm mm n "" mm) + add_dependencies(nuttx_mm_build nuttx_kmm_build) # can't build these in parallel + add_nuttx_dir(kmm mm y -D__KERNEL__ kmm) + add_nuttx_dir(proxies syscall n "" proxies) + add_dependencies(nuttx_proxies_build nuttx_stubs_build) # can't build these in parallel + add_nuttx_dir(stubs syscall y -D__KERNEL__ stubs) +else() + add_nuttx_dir(arch arch/${CONFIG_ARCH}/src y -D__KERNEL__ all) + add_nuttx_dir(c libs/libc n "" all) + add_nuttx_dir(mm mm n "" mm) +endif() if(CONFIG_NET) - add_nuttx_dir(net net y -D__KERNEL__) + add_nuttx_dir(net net y -D__KERNEL__ all) endif() ###############################################################################