diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e27e77c..d42c1ae 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -24,19 +24,38 @@ enable_testing() set(TARGET_MEM "ram_dram" CACHE STRING "memory map to use") set(CMAKE_EXECUTABLE_SUFFIX_C ".elf") +set(THREADX_TEST_SIMULATOR + "" + CACHE FILEPATH "Path to the RISC-V VP executable used by CTest") +if(NOT THREADX_TEST_SIMULATOR) + message(FATAL_ERROR + "THREADX_TEST_SIMULATOR is not set. Configure with -DTHREADX_TEST_SIMULATOR=/path/to/riscv-vp") +endif() + +# Evaluate the variable from the toolchain file to decide which XLEN we are targetting (IMAC only!) +if(CMAKE_SYSTEM_PROCESSOR STREQUAL "risc-v32") + set(THREADX_TEST_ISA "rv32imac_m") +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "risc-v64") + set(THREADX_TEST_ISA "rv64imac_m") +else() + message(FATAL_ERROR + "Unsupported CMAKE_SYSTEM_PROCESSOR for VP ISA selection: ${CMAKE_SYSTEM_PROCESSOR}") +endif() + # The regression tests require the Timer ISR to call the function test_interrupt_dispatch(void) -# We patch the current trap handler and include it using MOONLIGHT_TRAP_SOURCE +# We patch the current trap handler and include it using MOONLIGHT_TRAP_SOURCE. set(MOONLIGHT_TRAP_SOURCE_INPUT ${THREADX4TGFS_ROOT}/port/moonlight/src/trap_non_vectored.c) set(MOONLIGHT_TRAP_SOURCE ${CMAKE_BINARY_DIR}/generated/trap_non_vectored.c) -execute_process( +add_custom_command( + OUTPUT ${MOONLIGHT_TRAP_SOURCE} COMMAND bash ${CMAKE_CURRENT_LIST_DIR}/threadx/generate_trap_file.sh - ${MOONLIGHT_TRAP_SOURCE_INPUT} - ${MOONLIGHT_TRAP_SOURCE} - RESULT_VARIABLE MOONLIGHT_TRAP_GENERATE_RESULT + ${MOONLIGHT_TRAP_SOURCE_INPUT} + ${MOONLIGHT_TRAP_SOURCE} + DEPENDS ${MOONLIGHT_TRAP_SOURCE_INPUT} + ${CMAKE_CURRENT_LIST_DIR}/threadx/generate_trap_file.sh + VERBATIM ) -if(NOT MOONLIGHT_TRAP_GENERATE_RESULT EQUAL 0) - message(FATAL_ERROR "Failed to generate regression trap source") -endif() +set_source_files_properties(${MOONLIGHT_TRAP_SOURCE} PROPERTIES GENERATED TRUE) add_subdirectory(${THREADX4TGFS_ROOT}/port/moonlight ${CMAKE_BINARY_DIR}/port/moonlight) diff --git a/test/threadx/CMakeLists.txt b/test/threadx/CMakeLists.txt index d7217dd..ae9a56b 100644 --- a/test/threadx/CMakeLists.txt +++ b/test/threadx/CMakeLists.txt @@ -5,19 +5,19 @@ set(TX_CMAKE_DIR ${THREADX4TGFS_ROOT}/third-party/threadx/test/tx/cmake ) -# This time patch a test. Since we use a patched trap vector, we need the function test_interrupt_dispatch(void) to exist -# As this test is not using testcontrol.c to provide the symbol, we do so in this workaround +# This test needs a local test_interrupt_dispatch() because it does not link testcontrol.c. set(TX_KERNEL_SETUP_TEST_SOURCE_INPUT ${THREADX4TGFS_ROOT}/third-party/threadx/test/tx/regression/threadx_initialize_kernel_setup_test.c) set(TX_KERNEL_SETUP_TEST_SOURCE ${CMAKE_BINARY_DIR}/generated/threadx_initialize_kernel_setup_test.c) -execute_process( +add_custom_command( + OUTPUT ${TX_KERNEL_SETUP_TEST_SOURCE} COMMAND bash ${CMAKE_CURRENT_LIST_DIR}/generate_kernel_setup_test_file.sh - ${TX_KERNEL_SETUP_TEST_SOURCE_INPUT} - ${TX_KERNEL_SETUP_TEST_SOURCE} - RESULT_VARIABLE TX_KERNEL_SETUP_TEST_GENERATE_RESULT + ${TX_KERNEL_SETUP_TEST_SOURCE_INPUT} + ${TX_KERNEL_SETUP_TEST_SOURCE} + DEPENDS ${TX_KERNEL_SETUP_TEST_SOURCE_INPUT} + ${CMAKE_CURRENT_LIST_DIR}/generate_kernel_setup_test_file.sh + VERBATIM ) -if(NOT TX_KERNEL_SETUP_TEST_GENERATE_RESULT EQUAL 0) - message(FATAL_ERROR "Failed to generate patched kernel setup test source") -endif() +set_source_files_properties(${TX_KERNEL_SETUP_TEST_SOURCE} PROPERTIES GENERATED TRUE) set(TX_REGRESSION_CASES ${TX_REGRESSION_DIR}/threadx_block_memory_basic_test.c @@ -153,8 +153,26 @@ function(add_threadx_regression_test TEST_SOURCE) list(APPEND TX_REGRESSION_TARGETS ${TEST_NAME}) set(TX_REGRESSION_TARGETS ${TX_REGRESSION_TARGETS} PARENT_SCOPE) - # The executable is embedded and not directly host-runnable. - # Add a real add_test() command here once a QEMU or board runner exists. + if(TEST_NAME STREQUAL "threadx_initialize_kernel_setup_test") + add_test( + NAME ${TEST_NAME} + COMMAND ${CMAKE_CURRENT_LIST_DIR}/run_threadx_simple_test.sh + ${THREADX_TEST_SIMULATOR} + ${THREADX_TEST_ISA} + $ + "Running Initialize Kernel Setup Test................................ SUCCESS!" + "Running Initialize Kernel Setup Test................................ ERROR!" + ) + else() + add_test( + NAME ${TEST_NAME} + COMMAND ${CMAKE_CURRENT_LIST_DIR}/run_threadx_test.sh + ${THREADX_TEST_SIMULATOR} + ${THREADX_TEST_ISA} + $ + ) + endif() + set_tests_properties(${TEST_NAME} PROPERTIES TIMEOUT 5) endfunction() foreach(test_case ${TX_REGRESSION_CASES}) diff --git a/test/threadx/run_threadx_simple_test.sh b/test/threadx/run_threadx_simple_test.sh new file mode 100755 index 0000000..1e9ef7c --- /dev/null +++ b/test/threadx/run_threadx_simple_test.sh @@ -0,0 +1,40 @@ +#!/bin/bash +set -euo pipefail + +simulator="$1" +isa="$2" +elf="$3" +pass_pattern="$4" +fail_pattern="$5" + +if [ ! -x "$simulator" ]; then + echo "Simulator not found or not executable: $simulator" >&2 + exit 2 +fi + +if [ ! -f "$elf" ]; then + echo "ELF not found: $elf" >&2 + exit 2 +fi + +log_file=$(mktemp) +trap 'rm -f "$log_file"' EXIT + +"$simulator" \ + --isa="$isa" \ + -f "$elf" \ + -p tb.top.core.finish_condition=1 \ + -m 10s \ + | tee "$log_file" + +if grep -Fq "$fail_pattern" "$log_file"; then + echo "ThreadX regression reported failure pattern: $fail_pattern" >&2 + exit 1 +fi + +if ! grep -Fq "$pass_pattern" "$log_file"; then + echo "Missing expected success pattern in simulator output: $pass_pattern" >&2 + exit 1 +fi + +exit 0 diff --git a/test/threadx/run_threadx_test.sh b/test/threadx/run_threadx_test.sh new file mode 100755 index 0000000..e728176 --- /dev/null +++ b/test/threadx/run_threadx_test.sh @@ -0,0 +1,48 @@ +#!/bin/bash +set -euo pipefail + +simulator="$1" +isa="$2" +elf="$3" + +if [ ! -x "$simulator" ]; then + echo "Simulator not found or not executable: $simulator" >&2 + exit 2 +fi + +if [ ! -f "$elf" ]; then + echo "ELF not found: $elf" >&2 + exit 2 +fi + +log_file=$(mktemp) +trap 'rm -f "$log_file"' EXIT + +"$simulator" \ + --isa="$isa" \ + -f "$elf" \ + -p tb.top.core.finish_condition=1 \ + -m 10s \ + | tee "$log_file" + +summary_line=$(grep -F "**** Test Summary:" "$log_file" | tail -n 1 || true) +if [ -z "$summary_line" ]; then + echo "Missing ThreadX test summary in simulator output" >&2 + exit 1 +fi + +read -r passed failed errors <&2 + exit 1 +fi + +if [ "$failed" -ne 0 ] || [ "$errors" -ne 0 ]; then + echo "ThreadX regression reported failure: passed=$passed failed=$failed errors=$errors" >&2 + exit 1 +fi + +exit 0