A QEMU runner prototype exists (test/scripts/qemu_test.sh + test/sdkconfig.defaults.qemu, 2026-05-18): Espressif qemu-xtensa runs the ESP32-S3 test firmware headless and validates the majority of the suite without hardware.
Known QEMU limitation: systimer alarm interrupts don't fire, so esp_timer callbacks never execute. FreeRTOS ticks (Timer Group 0) work — sleep, semaphore timeouts, and thread scheduling all pass.
Remaining work:
CONFIG_BOREAS_TEST_ESP_TIMER Kconfig (default y; n in sdkconfig.defaults.qemu) to compile out esp_timer-dependent tests, matching the CONFIG_IDF_TARGET_LINUX pattern
- Gate
test_k_timer_group(), delayable k_work tests, and test_thread_deferred_delay behind it
- Outcome: QEMU suite completes with a Unity summary, no hangs
- Candidate CI job: real Xtensa code paths without device-in-the-loop (complements the linux-target job)
Note: priority reduced since the linux runner (#17, #18) now covers timer/work/thread logic on host; QEMU's remaining value is Xtensa codegen/port coverage.
A QEMU runner prototype exists (
test/scripts/qemu_test.sh+test/sdkconfig.defaults.qemu, 2026-05-18): Espressifqemu-xtensaruns the ESP32-S3 test firmware headless and validates the majority of the suite without hardware.Known QEMU limitation: systimer alarm interrupts don't fire, so
esp_timercallbacks never execute. FreeRTOS ticks (Timer Group 0) work — sleep, semaphore timeouts, and thread scheduling all pass.Remaining work:
CONFIG_BOREAS_TEST_ESP_TIMERKconfig (default y; n insdkconfig.defaults.qemu) to compile out esp_timer-dependent tests, matching theCONFIG_IDF_TARGET_LINUXpatterntest_k_timer_group(), delayable k_work tests, andtest_thread_deferred_delaybehind itNote: priority reduced since the linux runner (#17, #18) now covers timer/work/thread logic on host; QEMU's remaining value is Xtensa codegen/port coverage.