Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions Documentation/config-yaml.rst
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,10 @@ Flash command can use special tags that are handled by NTFC:

- ``$IMAGE_BIN`` is replaced by path to ``nuttx.bin``.
- ``$IMAGE_HEX`` is replaced by path to ``nuttx.hex``.
- ``$APPS_BINDIR`` is replaced by the application binaries directory
(kernel-mode builds).
- ``$APPS_IMG`` is replaced by the generated application filesystem
image (requires ``apps_image``).

Example usage with ``st-flash`` tool:

Expand Down Expand Up @@ -430,6 +434,11 @@ These fields are parsed by :class:`ntfc.coreconfig.CoreConfig`.
- (Optional) Directory with kernel-mode application binaries. Defaults
to the ``bin/`` directory next to the NuttX ELF for kernel-mode
builds (``CONFIG_BUILD_KERNEL=y``)
* - ``apps_image``
- (Optional) Generate a filesystem image with the application
binaries after build, e.g. ``apps_image: {type: romfs}``. The
image path is available as ``$APPS_IMG`` in the ``flash``
command. Requires ``genromfs`` and a kernel-mode build
* - ``defconfig``
- Path to NuttX defconfig (auto-build)
* - ``elf_path``
Expand Down
3 changes: 3 additions & 0 deletions Documentation/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ product: # many products can be supported in tests (pro
app_bindir: '' # (optional) directory with kernel-mode application binaries.
# Defaults to the bin/ directory next to the NuttX ELF
# for kernel-mode builds.
apps_image: # (optional) generate a filesystem image with the application
type: romfs # binaries after build (kernel-mode only, requires genromfs).
# The image path is available as $APPS_IMG in 'flash'.

# NTFC can use pre-build image or build it from defconfig
# the behavior will depend on the parameters specified in config.
Expand Down
4 changes: 3 additions & 1 deletion Documentation/ntfc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@ dependencies: ["toml"] # python dependencies for test cases module
requirements: # nuttx config requirements
- ["CONFIG_DEBUG_SYMBOLS", True]
- ["CONFIG_SYSTEM_NSH", True]
- ["CONFIG_INIT_ENTRYPOINT", "nsh_main"]
# alternatives: any one entry satisfies the requirement;
# "*" accepts any set value
- [["CONFIG_INIT_ENTRYPOINT", "nsh_main"], ["CONFIG_INIT_FILEPATH", "*"]]
20 changes: 19 additions & 1 deletion Documentation/writing-test-cases.rst
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,20 @@ String/Value Requirements:
- ["CONFIG_INIT_ENTRYPOINT", "nsh_main"] # CONFIG must equal value
- ["CONFIG_TASK_NAME_SIZE", "32"] # CONFIG must equal value

Wildcard Requirements:

.. code-block:: yaml

requirements:
- ["CONFIG_INIT_FILEPATH", "*"] # CONFIG must be set (any value)

Alternative Requirements (any one entry satisfies the requirement):

.. code-block:: yaml

requirements:
- [["CONFIG_INIT_ENTRYPOINT", "nsh_main"], ["CONFIG_INIT_FILEPATH", "*"]]

How Requirements Work:

1. NTFC reads NuttX ``.config`` file from configuration
Expand Down Expand Up @@ -178,7 +192,11 @@ Execute NSH command and verify output:

Decorators:

- ``@pytest.mark.cmd_check("symbol_name")``: Verify ELF symbol exists
- ``@pytest.mark.cmd_check("symbol_name")``: Verify ELF symbol exists.
On kernel-mode targets (``CONFIG_BUILD_KERNEL=y``) the marker is first
matched against application file names (a trailing ``_main`` maps to
the file name, so ``hello_main`` matches the ``hello`` binary) and
then against symbols in the unstripped application binaries
- ``@pytest.mark.dep_config("CONFIG_X", "CONFIG_Y")``: Skip if configs not
enabled

Expand Down
32 changes: 32 additions & 0 deletions config/nuttx-qemu-armv7a-knsh.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# NuttX kernel-mode (CONFIG_BUILD_KERNEL=y) target for QEMU armv7a.
#
# The CMake build installs application binaries to <build>/bin and the
# builder sets exec_cwd=<build> for kernel-mode cores, so the hostfs
# mount data 'fs=.' maps /system to the build directory and
# /system/bin/init resolves to <build>/bin/init. Semihosting is
# required for the hostfs mount.

config:
cwd: './external'
build_dir: './build'

product:

name: "ntfc-armv7a-knsh"
cores:
core0:
name: 'main'
device: 'qemu'
exec_path: 'qemu-system-arm'
exec_args: '-semihosting -cpu cortex-a7 -nographic
-machine virt,highmem=off,virtualization=off,gic-version=2
-chardev stdio,id=con,mux=on -serial chardev:con
-mon chardev=con,mode=readline'
defconfig: 'boards/arm/qemu/qemu-armv7a/configs/knsh'
boot_timeout: 15
kv:
CONFIG_INIT_MOUNT_DATA: "fs=."
# required by the arch/os ostest test case
CONFIG_SYSTEM_SETLOGMASK: "y"
# required by the arch/os heap stability test case
CONFIG_TESTING_HEAP: "y"
32 changes: 32 additions & 0 deletions config/nuttx-qemu-armv8a-knsh.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# NuttX kernel-mode (CONFIG_BUILD_KERNEL=y) target for QEMU armv8a.
#
# The CMake build installs application binaries to <build>/bin and the
# builder sets exec_cwd=<build> for kernel-mode cores, so the hostfs
# mount data 'fs=.' maps /system to the build directory and
# /system/bin/init resolves to <build>/bin/init. Semihosting is
# required for the hostfs mount.

config:
cwd: './external'
build_dir: './build'

product:

name: "ntfc-armv8a-knsh"
cores:
core0:
name: 'main'
device: 'qemu'
exec_path: 'qemu-system-aarch64'
exec_args: '-semihosting -cpu cortex-a53 -nographic
-machine virt,virtualization=on,gic-version=3
-net none -chardev stdio,id=con,mux=on
-serial chardev:con -mon chardev=con,mode=readline'
defconfig: 'boards/arm64/qemu/qemu-armv8a/configs/knsh'
boot_timeout: 15
kv:
CONFIG_INIT_MOUNT_DATA: "fs=."
# required by the arch/os ostest test case
CONFIG_SYSTEM_SETLOGMASK: "y"
# required by the arch/os heap stability test case
CONFIG_TESTING_HEAP: "y"
39 changes: 39 additions & 0 deletions config/nuttx-qemu-intel64-knsh.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# NuttX kernel-mode (CONFIG_BUILD_KERNEL=y) target for QEMU intel64.
#
# The knsh_romfs configuration loads user-space applications from a
# ROMFS image linked into the kernel; there is no hostfs, so exec_cwd
# is not relevant for the mount. Application command discovery uses the
# <build>/bin directory registered by the builder.
#
# Requires NuttX with CMake kernel-build support for x86_64 (branch
# fix-x86_64-cmake-kernel-build in the vendored checkout: arch_interface
# guard, CMAKE_LD, relocatable binary install, board ROMFS generation).

config:
cwd: './external'
build_dir: './build'

product:

name: "ntfc-intel64-knsh"
cores:
core0:
name: 'main'
device: 'qemu'
exec_path: 'qemu-system-x86_64'
exec_args: '-m 2G -cpu host -enable-kvm -nographic -serial mon:stdio'
defconfig: 'boards/x86_64/qemu/qemu-intel64/configs/knsh_romfs'
boot_timeout: 15
kv:
# resolve bare command names against the ROMFS mount point
CONFIG_LIBC_ENVPATH: "y"
CONFIG_PATH_INITIAL: "/system/bin"
# required by the arch/os ostest test case
CONFIG_SYSTEM_SETLOGMASK: "y"
# required by the arch/os heap stability test case
CONFIG_TESTING_HEAP: "y"
# setlocale()/nl_langinfo(), referenced by the LTP strftime cases
CONFIG_LIBC_LOCALE: "y"
# without it SIGKILL is absent from the default action table and
# can be ignored, which the LTP sigignore cases check for
CONFIG_SIG_SIGKILL_ACTION: "y"
31 changes: 31 additions & 0 deletions config/nuttx-qemu-riscv-rv-virt-knsh64.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# NuttX kernel-mode (CONFIG_BUILD_KERNEL=y) reference target.
#
# The knsh64 configuration is an S-mode build: QEMU boots its bundled
# OpenSBI firmware (no '-bios none') and NTFC appends '-kernel <elf>'.
#
# The CMake build installs application binaries to <build>/bin and the
# builder sets exec_cwd=<build> for kernel-mode cores, so the hostfs
# mount data 'fs=.' maps /system to the build directory and
# /system/bin/init resolves to <build>/bin/init.

config:
cwd: './external'
build_dir: './build'

product:

name: "ntfc-rv-virt-knsh64"
cores:
core0:
name: 'main'
device: 'qemu'
exec_path: 'qemu-system-riscv64'
exec_args: '-semihosting -M virt,aclint=on -cpu rv64 -smp 1 -nographic'
defconfig: 'boards/risc-v/qemu-rv/rv-virt/configs/knsh64'
boot_timeout: 15
kv:
CONFIG_INIT_MOUNT_DATA: "fs=."
# required by the arch/os ostest test case
CONFIG_SYSTEM_SETLOGMASK: "y"
# required by the arch/os heap stability test case
CONFIG_TESTING_HEAP: "y"
33 changes: 33 additions & 0 deletions config/nuttx-serial-knsh.yaml.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Template for a kernel-mode (CONFIG_BUILD_KERNEL=y) hardware target
# on a serial console. Copy, rename and fill in the board specifics.
#
# Kernel-mode hardware notes:
# - There is no hostfs on hardware: application binaries must reach the
# target filesystem. Either the board defconfig bakes a ROMFS into the
# kernel image, or 'apps_image' generates one from <build>/bin and the
# 'flash' command writes it with $APPS_IMG.
# - When NTFC builds the image, command discovery uses <build>/bin. For
# prebuilt images (no 'defconfig'), commands are discovered once from
# the running target by listing CONFIG_PATH_INITIAL.
# - Kernel boot (mount filesystem, load init ELF) plus a bootloader can
# exceed the 5 second default boot wait; raise 'boot_timeout'.

config:
cwd: './external'
build_dir: './build'

product:

name: "ntfc-<board>-knsh"
cores:
core0:
name: 'main'
device: 'serial'
exec_path: '/dev/ttyUSB0'
exec_args: '115200,n,8,1'
defconfig: 'boards/<arch>/<chip>/<board>/configs/knsh'
boot_timeout: 30
apps_image:
type: romfs
flash: '<flash-tool> write $IMAGE_BIN <kernel-address> $APPS_IMG <apps-address>'
reboot: '<reset-tool command>'
Loading