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 <jukkax@ssrc.tii.ae>
This commit is contained in:
Jukka Laitinen
2020-09-30 15:42:15 +03:00
parent 169eb616c6
commit 7c94bc8f02
3 changed files with 197 additions and 13 deletions
+14 -1
View File
@@ -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)
+147
View File
@@ -0,0 +1,147 @@
/****************************************************************************
* boards/arm/stm32f7/stm32f746g-disco/kernel/stm32_userspace.c
*
* Copyright (C) 2015 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 <nuttx/config.h>
#include <stdlib.h>
#include <nuttx/arch.h>
#include <nuttx/mm/mm.h>
#include <nuttx/wqueue.h>
#include <nuttx/userspace.h>
#include <sys/boardctl.h>
#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__ */
+36 -12
View File
@@ -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()
###############################################################################