Gregory Nutt 9ca5d71924 syscall/syscall.csv: Change 626afb015b89cdafebd7d044f097a74d33b210bd needed to change mqueue function protothypes in the KERNEL mode proxies as well. Failures found in build testing. 5 年之前
..
proxies db78b76102 Mostly updates and corrections to .gitignore files 11 年之前
stubs db78b76102 Mostly updates and corrections to .gitignore files 11 年之前
.gitignore 4748599a43 .dSYM only needs to be in the same .gitignore files as .exe 11 年之前
Kconfig 2a7416238a Syscall fixes: Add support for Cortex-M7; mount syscall has to be suppressed if there are no mountable file systems 9 年之前
Makefile c60a23b313 Merged in masayuki2009/nuttx.nuttx/fix_syscall_build (pull request #691) 6 年之前
README.txt befcb1c961 Fix some cloned errors in SAM GPIO interrupt setup 10 年之前
syscall.csv 9ca5d71924 syscall/syscall.csv: Change 626afb015b89cdafebd7d044f097a74d33b210bd needed to change mqueue function protothypes in the KERNEL mode proxies as well. Failures found in build testing. 5 年之前
syscall_funclookup.c 95163b2c59 Squashed commit of the following: 6 年之前
syscall_lookup.h d743ca0896 syscall/syscall_lookup.h: Fix a newly introduced warning found in build testing. 5 年之前
syscall_nparms.c 9c66bde5b0 Fix typo in pre-processor command noted by Pierre-noel Bouteville. Also move # of pre-processior command to column 1 9 年之前
syscall_stublookup.c 057d555129 sched/signal and syscall/: Add support for pselect() and ppoll() functions 6 年之前

README.txt

syscall/README.txt
==================

This directory supports a syscall layer from communication between a
monolithic, kernel-mode NuttX kernel and a separately built, user-mode
application set.

With most MCUs, NuttX is built as a flat, single executable image
containing the NuttX RTOS along with all application code. The RTOS code
and the application run in the same address space and at the same kernel-
mode privileges. In order to exploit security features of certain
processors, an alternative build model is also supported: NuttX can
be built separately as a monolithic, kernel-mode module and the applications
can be added as a separately built, user-mode module.

The syscall layer provided in this directory serves as the communication
layer from the user-mode application into the kernel-mode RTOS. The
switch from user-mode to kernel-mode is accomplished using software
interrupts (SWIs). SWIs are implemented differently and named differently
by different manufacturers but all work essentially the same: A special
instruction is executed in user-mode that causes a software generated
interrupt. The software generated interrupt is caught within the kernel
and handle in kernel-mode.

Header Files
============

include/syscall.h

This header file supports general access to SWI facilities. It is simply
a wrapper file that includes include/sys/syscall.h and
include/arch/syscall.h.

include/sys/syscall.h

The SWIs received by the kernel are distinguish by a code that identifies
how to process the SWI. This header file defines all such codes understood
by the NuttX kernel.

include/arch/syscall.h (or arch//include/syscall.h)

This header file is provided by the platform-specific logic and declares
(or defines) the mechanism for providing software interrupts on this
platform. The following functions must be declared (or defined) in this
header file:

- SWI with SYS_ call number and one parameter

uintptr_t sys_call0(unsigned int nbr);

- SWI with SYS_ call number and one parameter

uintptr_t sys_call1(unsigned int nbr, uintptr_t parm1);

- SWI with SYS_ call number and two parameters

uintptr_t sys_call2(unsigned int nbr, uintptr_t parm1, uintptr_t parm2);

- SWI with SYS_ call number and three parameters

uintptr_t sys_call3(unsigned int nbr, uintptr_t parm1,
uintptr_t parm2, uintptr_t parm3);

- SWI with SYS_ call number and four parameters

uintptr_t sys_call4(unsigned int nbr, uintptr_t parm1, uintptr_t parm2,
uintptr_t parm3, uintptr_t parm4);

- SWI with SYS_ call number and five parameters

uintptr_t sys_call5(unsigned int nbr, uintptr_t parm1, uintptr_t parm2,
uintptr_t parm3, uintptr_t parm4, uintptr_t parm5);

- SWI with SYS_ call number and six parameters

uintptr_t sys_call6(unsigned int nbr, uintptr_t parm1, uintptr_t parm2,
uintptr_t parm3, uintptr_t parm4, uintptr_t parm5,
uintptr_t parm6);
Syscall Database
================

Sycall information is maintained in a database. That "database" is
implemented as a simple comma-separated-value file, syscall.csv. Most
spreadsheets programs will accept this format and can be used to maintain
the syscall database.

The format of the CSV file for each line is:

Field 1: Function name
Field 2: The header file that contains the function prototype
Field 3: Condition for compilation
Field 4: The type of function return value.
Field 5 - N+5: The type of each of the N formal parameters of the function

Each type field has a format as follows:

type name:
For all simpler types
formal type | actual type:
For array types where the form of the formal (eg. int parm[2])
differs from the type of actual passed parameter (eg. int*). This
is necessary because you cannot do simple casts to array types.
formal type | union member actual type | union member fieldname:
A similar situation exists for unions. For example, the formal
parameter type union sigval -- You cannot cast a uintptr_t to
a union sigval, but you can cast to the type of one of the union
member types when passing the actual parameter. Similarly, we
cannot cast a union sigval to a uinptr_t either. Rather, we need
to cast a specific union member fieldname to uintptr_t.

NOTE: This CSV file is used both to support the generate of trap information,
but also for the generation of symbol tables. See nuttx/tools/README.txt
and nuttx/lib/README.txt for further information.

Auto-Generated Files
====================

Stubs and proxies for the sycalls are automatically generated from this CSV
database. Here the following definition is used:

Proxy - A tiny bit of code that executes in the user space. A proxy
has exactly the same function prototype as does the "real" function
for which it proxies. However, it only serves to map the function
call into a syscall, marshaling all of the system call parameters
as necessary.

Stub - Another tiny bit of code that executes within the NuttX kernel
that is used to map a software interrupt received by the kernel to
a kernel function call. The stubs receive the marshaled system
call data, and perform the actually kernel function call (in
kernel-mode) on behalf of the proxy function.

Sub-Directories
===============

stubs - Autogenerated stub files are placed in this directory.
proxies - Autogenerated proxy files are placed in this directory.

mksyscall
=========

mksyscall is C program that is used used during the initial NuttX build
by the logic in the top-level syscall/ directory. Information about the
stubs and proxies is maintained in a comma separated value (CSV) file
in the syscall/ directory. The mksyscall program will accept this CVS
file as input and generate all of the required proxy or stub files as
output. See tools/README.txt for additional information.