diff --git a/configs b/configs index ba78f31764..de62dbc734 160000 --- a/configs +++ b/configs @@ -1 +1 @@ -Subproject commit ba78f31764727583a33edf26a591daefeefda9b9 +Subproject commit de62dbc734217b4c18c11b87e4d1e75789193cdb diff --git a/include/nuttx/binfmt/canned_symtab.h b/include/nuttx/binfmt/canned_symtab.h index ba3419dec3..f40018081c 100644 --- a/include/nuttx/binfmt/canned_symtab.h +++ b/include/nuttx/binfmt/canned_symtab.h @@ -64,6 +64,18 @@ * fixed size arrays completely defined at compilation or link time. */ +/* In order to full describe a symbol table, a vector containing the address + * of the symbol table and the number of elements in the symbol table is + * required. + */ + +struct symtab_s; /* Forward reference */ +struct symtab_desc_s +{ + FAR struct symtab_s *symtab; + int nsymbols; +} + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -81,7 +93,9 @@ extern "C" * Name: canned_symtab_initialize * * Description: - * Setup system provided canned symbol table. + * Setup system provided canned symbol table. NOTE that this a user-space + * interface only. It is not generally available to to kernel mode code + * in protected or kernel builds. * * Input Parameters: * None @@ -91,7 +105,36 @@ extern "C" * ****************************************************************************/ +#if defined(CONFIG_BUILD_FLAT) || !defined(__KERNEL__) void canned_symtab_initialize(void); +#endif + +/**************************************************************************** + * Name: canned_symtab_select + * + * Description: + * Setup system provided canned symbol table. This function only exists + * the kernel portion of a protected or kernel build. It is called only + * by boardctl(). I this case: + * + * - canned_symbtab_initialize() and g_symtab() lie in the user space. + * - boardctl(), canned_symtabl_select(), and exec_setsymtab() reside in + * kernel space. + * + * Access to boardctl() is provided in user space through a call gate. + * + * Input Parameters: + * symtab - The symbol table to be used + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +#if (defined(CONFIG_BUILD_PROTECTED) || defined(CONFIG_BUILD_KERNEL)) && \ + defined(__KERNEL__) +int canned_symtab_select(FAR const struct symtab_desc_s *symdesc); +#endif #undef EXTERN #if defined(__cplusplus) diff --git a/include/sys/boardctl.h b/include/sys/boardctl.h index 172f0b69f5..0cbc937971 100644 --- a/include/sys/boardctl.h +++ b/include/sys/boardctl.h @@ -70,6 +70,13 @@ * CONFIGURATION: CONFIG_BOARDCTL_RESET * DEPENDENCIES: Board logic must provide board_reset * + * CMD: BOARDIOC_SYMTAB + * DESCRIPTION: Select a symbol table + * ARG: A pointer to an instance of struct symtab_desc_s + * (See include/nuttx/binfmt/canned_symtab.h). + * CONFIGURATION: CONFIG_LIBC_SYMTAB + * DEPENDENCIES: None + * * CMD: BOARDIOC_TSCTEST_SETUP * DESCRIPTION: Touchscreen controller test configuration * ARG: Touch controller device minor number @@ -111,12 +118,13 @@ #define BOARDIOC_INIT _BOARDIOC(0x0001) #define BOARDIOC_POWEROFF _BOARDIOC(0x0002) #define BOARDIOC_RESET _BOARDIOC(0x0003) -#define BOARDIOC_TSCTEST_SETUP _BOARDIOC(0x0004) -#define BOARDIOC_TSCTEST_TEARDOWN _BOARDIOC(0x0005) -#define BOARDIOC_ADCTEST_SETUP _BOARDIOC(0x0006) -#define BOARDIOC_PWMTEST_SETUP _BOARDIOC(0x0007) -#define BOARDIOC_CAN_INITIALIZE _BOARDIOC(0x0008) -#define BOARDIOC_GRAPHICS_SETUP _BOARDIOC(0x0009) +#define BOARDIOC_SYMTAB _BOARDIOC(0x0004) +#define BOARDIOC_TSCTEST_SETUP _BOARDIOC(0x0005) +#define BOARDIOC_TSCTEST_TEARDOWN _BOARDIOC(0x0006) +#define BOARDIOC_ADCTEST_SETUP _BOARDIOC(0x0007) +#define BOARDIOC_PWMTEST_SETUP _BOARDIOC(0x0008) +#define BOARDIOC_CAN_INITIALIZE _BOARDIOC(0x0009) +#define BOARDIOC_GRAPHICS_SETUP _BOARDIOC(0x000a) /* If CONFIG_BOARDCTL_IOCTL=y, then boad-specific commands will be support. * In this case, all commands not recognized by boardctl() will be forwarded @@ -125,7 +133,7 @@ * User defined board commands may begin with this value: */ -#define BOARDIOC_USER _BOARDIOC(0x000a) +#define BOARDIOC_USER _BOARDIOC(0x000b) /**************************************************************************** * Public Type Definitions diff --git a/libc/symtab/Kconfig b/libc/symtab/Kconfig index 317abaff47..4cdef0d9c7 100644 --- a/libc/symtab/Kconfig +++ b/libc/symtab/Kconfig @@ -6,7 +6,8 @@ config LIBC_SYMTAB bool "Include canned symtab for applications and shell" default n - depends on EXECFUNCS_HAVE_SYMTAB + depends on EXECFUNCS_HAVE_SYMTAB && !BUILD_KERNEL + select LIB_BOARDCTL if !BUILD_FLAT ---help--- Build and include default symbol table in the NuttX library. The symbol table is selected by call canned_symtab_initialize(). diff --git a/libc/symtab/README.txt b/libc/symtab/README.txt index d7dc6abcca..7cb544aefb 100644 --- a/libc/symtab/README.txt +++ b/libc/symtab/README.txt @@ -1,23 +1,48 @@ symtab ====== -This directory provide support for canned symbol table which provides +Symbol Tables and Build Modes +----------------------------- +This directory provide support for a canned symbol table which provides all/most of system and libc services/functions to the application and NSH. -The support is selected by CONFIG_LIBC_SYMTAB option and table has to be -prepared in advance manually. +Symbol tables have differing usefulness in different NuttX build modes: -It can be prepared from NuttX top level directory by next commands + 1. In the FLAT build (CONFIG_BUILD_FLAT), symbol tables are used to bind + addresses in loaded ELF or NxFLAT modules to base code that usually + resides in FLASH memory. Both OS interfaces and user/application + libraries are made available to the loaded module via symbol tables. + + 2. Symbol tables may be of value in a protected build + (CONFIG_BUILD_PROTECTED) where the newly started user task must + share resources with other user code (but should use system calls to + interact with the OS). + + 3. But in the kernel build mode (CONFIG_BUILD_KERNEL), only fully linked + executables loadable via execl(), execv(), or posix_spawan() can used. + There is no use for a symbol table with the kernel build since all + memory resources are separate; nothing is share-able with the newly + started process. + +Creating the Canned Symbol Table +-------------------------------- +The support is selected by CONFIG_LIBC_SYMTAB option and table has to be +prepared in advance manually. It can be prepared from NuttX top level +directory by using the following commands: cat syscall/syscall.csv libc/libc.csv | sort >libc/symtab/canned_symtab.csv tools/mksymtab libc/symtab/canned_symtab.csv libc/symtab/canned_symtab.inc -Next code selectes canned symtab from application: +Your board-level start up code code then needs to select the canned symbol +table by calling the OS internal function canned_symtab_initialize() in the +board-specfic board_apps_initialize() logic: #include ... canned_symtab_initialize(); +Code/Text Size Implications +--------------------------- The option can have substantial effect on system image size, mainly code/text. That is because the instructions to generate canned_symtab.inc above will cause EVERY interface in the NuttX RTOS and the C library to be diff --git a/libc/symtab/lib_symbtab.c b/libc/symtab/lib_symbtab.c index bdf9d32413..4905d0bc91 100644 --- a/libc/symtab/lib_symbtab.c +++ b/libc/symtab/lib_symbtab.c @@ -49,13 +49,87 @@ #include "canned_symtab.inc" -/************************************************************************ +/**************************************************************************** * Public Functions - ************************************************************************/ + ****************************************************************************/ +/**************************************************************************** + * Name: canned_symtab_initialize + * + * Description: + * Setup system provided canned symbol table. NOTE that this a user-space + * interface only. It is not generally available to to kernel mode code + * in protected or kernel builds. That is because exec_setsymtab() and + * g_symtab lie in different address spaces. + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +#if defined(CONFIG_BUILD_FLAT) || !defined(__KERNEL__) void canned_symtab_initialize(void) { +#ifdef CONFIG_BUILD_FLAT + /* In the FLAT build, exec_symtab() can be called directly from any logic. + * Both the symbol table and the function exec_setsymtabe reside in the same + * namespace and address space. + */ + exec_setsymtab(g_symtab, NSYMBOLS); + +#else + /* In the user mode portion of a protected or kernel build, we must set + * the symbol table indirectly through the boardctl() call gate that will + * proxy the call to canned_symtab_select(). In this case + * + * - canned_symbtab_initialize() and g_symtab() lie in the user space. + * - boardctl(), canned_symtabl_select(), and exec_setsymtab() reside in + * kernel space. + * + * Access to boardctl() is provided in user space throug a call gate. + */ + + struct symtab_desc_s symdesc; + + symdesc.symtab = g_symtab; + symdesc.nsymbols = NSYMBOLS; + (void)boardctl(BOARDIOC_SYMTAB, (uinptr_t)&symdesc); +#endif } +#endif + +/**************************************************************************** + * Name: canned_symtab_select + * + * Description: + * Setup system provided canned symbol table. This function only exists + * the kernel portion of a protected or kernel build. It is called only + * by boardctl(). I this case: + * + * - canned_symbtab_initialize() and g_symtab() lie in the user space. + * - boardctl(), canned_symtabl_select(), and exec_setsymtab() reside in + * kernel space. + * + * Access to boardctl() is provided in user space through a call gate. + * + * Input Parameters: + * symtab - The symbol table to be used + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +#if (defined(CONFIG_BUILD_PROTECTED) || defined(CONFIG_BUILD_KERNEL)) && \ + defined(__KERNEL__) +int canned_symtab_select(FAR const struct symtab_desc_s *symdesc) +{ + exec_setsymtab(symdesc->symtab, symdesc->nsymbols); +} +#endif #endif /* CONFIG_LIBC_SYMTAB */