Extend canned symbol table logic to work in protected build mode

This commit is contained in:
Gregory Nutt 2015-08-23 10:44:04 -06:00
parent 9ab3f03153
commit f12692b78f
6 changed files with 168 additions and 17 deletions

@ -1 +1 @@
Subproject commit ba78f31764727583a33edf26a591daefeefda9b9
Subproject commit de62dbc734217b4c18c11b87e4d1e75789193cdb

View File

@ -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)

View File

@ -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

View File

@ -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().

View File

@ -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 <nuttx/binfmt/canned_symtab.h>
...
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

View File

@ -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 */