Skip to content

Native sim support#10621

Open
lgirdwood wants to merge 11 commits intothesofproject:mainfrom
lgirdwood:native_sim
Open

Native sim support#10621
lgirdwood wants to merge 11 commits intothesofproject:mainfrom
lgirdwood:native_sim

Conversation

@lgirdwood
Copy link
Copy Markdown
Member

Add support for native sim target and include being able to run under valgrind. This should support all cmocka tests as ztests meaning more/all can be removed. Will be added to CI soon.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds Zephyr native_sim support to enable running SOF Zephyr tests natively (including under Valgrind) and refines POSIX/libFuzzer integration so fuzz-specific code is only built/used when enabled.

Changes:

  • Add a native_sim platform target to the Zephyr build helper.
  • Make POSIX fuzzing sources/IPC hooks conditional on CONFIG_ARCH_POSIX_LIBFUZZER.
  • Extend the run scripts to support native_sim execution and optional --valgrind.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
zephyr/CMakeLists.txt Separates POSIX sources from fuzz-only sources so fuzz.c only builds when libFuzzer is enabled.
src/platform/posix/ipc.c Gates fuzz ISR/IRQ plumbing behind CONFIG_ARCH_POSIX_LIBFUZZER.
scripts/xtensa-build-zephyr.py Adds native_sim as a supported Zephyr platform config.
scripts/sof-qemu-run.sh Adds --valgrind flag parsing and changes default build dir behavior for native_sim runs.
scripts/sof-qemu-run.py Detects native_sim from CMakeCache.txt, supports running under Valgrind, and skips QEMU monitor steps for native_sim.
app/boards/native_sim.conf Introduces a board-specific Kconfig fragment for native_sim.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment on lines +17 to 20
#ifdef CONFIG_ARCH_POSIX_LIBFUZZER
// Not an ISR, called from the native_posix fuzz interrupt. Left
// alone for general hygiene. This is how a IPC interrupt would look
// if we had one.
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inside the #ifdef CONFIG_ARCH_POSIX_LIBFUZZER block, the extern declaration for posix_fuzz_buf/posix_fuzz_sz (currently extern uint8_t *posix_fuzz_buf, posix_fuzz_sz;) does not match the definitions in src/platform/posix/fuzz.c (const uint8_t *posix_fuzz_buf; size_t posix_fuzz_sz;). This mismatch can cause incorrect reads/writes (e.g., posix_fuzz_sz = 0; only updating 1 byte). Please split these into separate externs with the correct types (and const).

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

under investigation why we dont use header to align.

Add native_sim board configuration and support in the build script.
This allows building and running tests on the host using Zephyr's
native_sim target.

native_sim leverages the POSIX architecture, but the libfuzzer
support specifically requires CONFIG_ARCH_POSIX_LIBFUZZER to be set.
Therefore, this wraps fuzzer-specific code in ipc.c and the build
of fuzz.c behind this config to allow clean compilation on the
standard native_sim board.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Add native_sim board target to the sof-qemu-run scripts, and add an
option to additionally run it under valgrind.

The default build directory is set to ../build-native_sim

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
@lgirdwood lgirdwood marked this pull request as draft March 27, 2026 21:33
When building the firmware for native_sim, debugging allocations with
host machine tools like Valgrind is constrained due to Zephyr's
internal minimal libc tracking the heap manually via static pools. By bypassing
Zephyr's memory interception on native_sim using nsi_host_malloc,
dynamically tracked memory can surface appropriately to Valgrind memory
checkers without causing a libc heap pool panic.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
In file included from /home/lrg/work/sof2/sof/zephyr/sof_shell.c:14:
/home/lrg/work/sof2/sof/zephyr/sof_shell.c: In function 'cmd_sof_module_heap_usage':
/home/lrg/work/sof2/sof/zephyr/sof_shell.c:66:77: error: 'struct module_config' has no member named 'heap_bytes'
   66 |                             icd->id, usage, hwm, comp_mod(icd->cd)->priv.cfg.heap_bytes);
      |                                                                             ^
/home/lrg/work/sof2/zephyr/include/zephyr/shell/shell.h:1292:47: note: in definition of macro 'shell_print'
 1292 |         shell_fprintf_normal(_sh, _ft "\n", ##__VA_ARGS__)
      |                                               ^~~~~~~~~~~

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Keep spinning in case user needs to inspect status via monitor.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
@lgirdwood lgirdwood force-pushed the native_sim branch 2 times, most recently from 11e03f6 to db6ddb6 Compare March 31, 2026 09:18
@lgirdwood lgirdwood marked this pull request as ready for review March 31, 2026 09:39
The DAI_INTEL_UAOL configuration might not be present in Zephyr
headers (or certain Zephyr branches), leading to build failures.
Wrap its usage in SOF_DAI_INTEL_UAOL cases to ensure older or
different Zephyr versions still compile successfully.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
When building the native_sim fuzzer, the host allocator does not
possess the strict bounds of the internal Zephyr memory pools. If
the fuzzer generates a malformed payload requesting an excessively
large size (e.g. 4GB), it passes directly to the host ASAN allocator
which aborts due to OOM or protection limits. Adding a 16MB cap
allows these to fail gracefully.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
The fuzzer's payload size posix_fuzz_sz is provided by libFuzzer as
a size_t. Declaring it as a uint8_t in the ipc test harness resulted
in silent payload truncation (maximum 255 bytes) causing incomplete
corpus generation. This corrects the types between fuzz.c and ipc.c.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Make the maths tests available on native sim target.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Run the boot tests and quit when done.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
The xtensa-build-zephyr.py script attempts to parse and copy the
zephyr.ri (rimage) file for reproducible checksums and installation.
Since the native_sim platform does not produce an rimage file,
building it with this script results in a FileNotFoundError. Adding
native_sim to the list of exceptions resolves the build failure.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants