Skip to content

Commit fedd124

Browse files
committed
Add RISC-V QEMU functional test runner and FPU verification
- Add Python-based test runner automating QEMU launch and GDB control. - Verifies Context Switching, FPU Context Preservation, and Timer Interrupts. - Implements robust cleanup using try-finally blocks to prevent orphaned QEMU processes. - Update CMake configuration to include the `check-functional-riscv32` target. - Add floating-point arithmetic test logic to thread entry function. - Add global pointer definition to linker script to resolve relocation errors.
1 parent 633629d commit fedd124

9 files changed

Lines changed: 693 additions & 1 deletion

File tree

CMakeLists.txt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,20 @@ target_link_options(kernel.elf PRIVATE
9898
-T${QEMU_DEMO_DIR}/link.lds
9999
-nostartfiles
100100
-Wl,-Map=kernel.map
101-
)
101+
)
102+
103+
# QEMU Test Runner Target
104+
find_package(Python3 COMPONENTS Interpreter)
105+
if(Python3_FOUND)
106+
add_custom_target(check-functional-riscv32
107+
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/test/ports/azrtos_test_tx_gnu_riscv32_qemu.py
108+
--elf $<TARGET_FILE:kernel.elf>
109+
--qemu qemu-system-riscv32
110+
--gdb gdb
111+
DEPENDS kernel.elf
112+
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
113+
COMMENT "Running QEMU/GDB Test Runner..."
114+
)
115+
else()
116+
message(WARNING "Python3 not found, run_qemu_test target will not be available.")
117+
endif()

build_qemu/CPackConfig.cmake

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# This file will be configured to contain variables for CPack. These variables
2+
# should be set in the CMake list file of the project before CPack module is
3+
# included. The list of available CPACK_xxx variables and their associated
4+
# documentation may be obtained using
5+
# cpack --help-variable-list
6+
#
7+
# Some variables are common to all generators (e.g. CPACK_PACKAGE_NAME)
8+
# and some are specific to a generator
9+
# (e.g. CPACK_NSIS_EXTRA_INSTALL_COMMANDS). The generator specific variables
10+
# usually begin with CPACK_<GENNAME>_xxxx.
11+
12+
13+
set(CPACK_BINARY_7Z "OFF")
14+
set(CPACK_BINARY_IFW "OFF")
15+
set(CPACK_BINARY_INNOSETUP "OFF")
16+
set(CPACK_BINARY_NSIS "ON")
17+
set(CPACK_BINARY_NUGET "OFF")
18+
set(CPACK_BINARY_WIX "OFF")
19+
set(CPACK_BINARY_ZIP "OFF")
20+
set(CPACK_BUILD_SOURCE_DIRS "/Users/winston/Documents/碩二/CA/threadx;/Users/winston/Documents/碩二/CA/threadx/build_qemu")
21+
set(CPACK_CMAKE_GENERATOR "Unix Makefiles")
22+
set(CPACK_COMPONENTS_ALL "")
23+
set(CPACK_COMPONENT_UNSPECIFIED_HIDDEN "TRUE")
24+
set(CPACK_COMPONENT_UNSPECIFIED_REQUIRED "TRUE")
25+
set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_FILE "/opt/homebrew/share/cmake/Templates/CPack.GenericDescription.txt")
26+
set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_SUMMARY "threadx built using CMake")
27+
set(CPACK_GENERATOR "NSIS")
28+
set(CPACK_INNOSETUP_ARCHITECTURE "x86")
29+
set(CPACK_INSTALL_CMAKE_PROJECTS "/Users/winston/Documents/碩二/CA/threadx/build_qemu;threadx;ALL;/")
30+
set(CPACK_INSTALL_PREFIX "/usr/local")
31+
set(CPACK_MODULE_PATH "")
32+
set(CPACK_NSIS_DISPLAY_NAME "threadx 0.1.1")
33+
set(CPACK_NSIS_INSTALLER_ICON_CODE "")
34+
set(CPACK_NSIS_INSTALLER_MUI_ICON_CODE "")
35+
set(CPACK_NSIS_INSTALL_ROOT "\$PROGRAMFILES")
36+
set(CPACK_NSIS_PACKAGE_NAME "threadx 0.1.1")
37+
set(CPACK_NSIS_UNINSTALL_NAME "Uninstall")
38+
set(CPACK_OBJCOPY_EXECUTABLE "/Users/winston/riscv-none-elf-gcc/bin/riscv-none-elf-objcopy")
39+
set(CPACK_OBJDUMP_EXECUTABLE "/Users/winston/riscv-none-elf-gcc/bin/riscv-none-elf-objdump")
40+
set(CPACK_OUTPUT_CONFIG_FILE "/Users/winston/Documents/碩二/CA/threadx/build_qemu/CPackConfig.cmake")
41+
set(CPACK_PACKAGE_DEFAULT_LOCATION "/")
42+
set(CPACK_PACKAGE_DESCRIPTION_FILE "/opt/homebrew/share/cmake/Templates/CPack.GenericDescription.txt")
43+
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "threadx built using CMake")
44+
set(CPACK_PACKAGE_FILE_NAME "threadx-0.1.1-Generic")
45+
set(CPACK_PACKAGE_INSTALL_DIRECTORY "threadx 0.1.1")
46+
set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "threadx 0.1.1")
47+
set(CPACK_PACKAGE_NAME "threadx")
48+
set(CPACK_PACKAGE_RELOCATABLE "true")
49+
set(CPACK_PACKAGE_VENDOR "Humanity")
50+
set(CPACK_PACKAGE_VERSION "0.1.1")
51+
set(CPACK_PACKAGE_VERSION_MAJOR "0")
52+
set(CPACK_PACKAGE_VERSION_MINOR "1")
53+
set(CPACK_PACKAGE_VERSION_PATCH "1")
54+
set(CPACK_READELF_EXECUTABLE "/Users/winston/riscv-none-elf-gcc/bin/riscv-none-elf-readelf")
55+
set(CPACK_RESOURCE_FILE_LICENSE "/opt/homebrew/share/cmake/Templates/CPack.GenericLicense.txt")
56+
set(CPACK_RESOURCE_FILE_README "/opt/homebrew/share/cmake/Templates/CPack.GenericDescription.txt")
57+
set(CPACK_RESOURCE_FILE_WELCOME "/opt/homebrew/share/cmake/Templates/CPack.GenericWelcome.txt")
58+
set(CPACK_SET_DESTDIR "OFF")
59+
set(CPACK_SOURCE_GENERATOR "ZIP")
60+
set(CPACK_SOURCE_IGNORE_FILES "\\.git/;\\.github/;_build/;\\.git;\\.gitattributes;\\.gitignore;.*~\$")
61+
set(CPACK_SOURCE_OUTPUT_CONFIG_FILE "/Users/winston/Documents/碩二/CA/threadx/build_qemu/CPackSourceConfig.cmake")
62+
set(CPACK_SYSTEM_NAME "Generic")
63+
set(CPACK_THREADS "1")
64+
set(CPACK_TOPLEVEL_TAG "Generic")
65+
set(CPACK_VERBATIM_VARIABLES "YES")
66+
set(CPACK_WIX_SIZEOF_VOID_P "4")
67+
68+
if(NOT CPACK_PROPERTIES_FILE)
69+
set(CPACK_PROPERTIES_FILE "/Users/winston/Documents/碩二/CA/threadx/build_qemu/CPackProperties.cmake")
70+
endif()
71+
72+
if(EXISTS ${CPACK_PROPERTIES_FILE})
73+
include(${CPACK_PROPERTIES_FILE})
74+
endif()

build_qemu/CPackSourceConfig.cmake

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# This file will be configured to contain variables for CPack. These variables
2+
# should be set in the CMake list file of the project before CPack module is
3+
# included. The list of available CPACK_xxx variables and their associated
4+
# documentation may be obtained using
5+
# cpack --help-variable-list
6+
#
7+
# Some variables are common to all generators (e.g. CPACK_PACKAGE_NAME)
8+
# and some are specific to a generator
9+
# (e.g. CPACK_NSIS_EXTRA_INSTALL_COMMANDS). The generator specific variables
10+
# usually begin with CPACK_<GENNAME>_xxxx.
11+
12+
13+
set(CPACK_BINARY_7Z "OFF")
14+
set(CPACK_BINARY_IFW "OFF")
15+
set(CPACK_BINARY_INNOSETUP "OFF")
16+
set(CPACK_BINARY_NSIS "ON")
17+
set(CPACK_BINARY_NUGET "OFF")
18+
set(CPACK_BINARY_WIX "OFF")
19+
set(CPACK_BINARY_ZIP "OFF")
20+
set(CPACK_BUILD_SOURCE_DIRS "/Users/winston/Documents/碩二/CA/threadx;/Users/winston/Documents/碩二/CA/threadx/build_qemu")
21+
set(CPACK_CMAKE_GENERATOR "Unix Makefiles")
22+
set(CPACK_COMPONENTS_ALL "")
23+
set(CPACK_COMPONENT_UNSPECIFIED_HIDDEN "TRUE")
24+
set(CPACK_COMPONENT_UNSPECIFIED_REQUIRED "TRUE")
25+
set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_FILE "/opt/homebrew/share/cmake/Templates/CPack.GenericDescription.txt")
26+
set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_SUMMARY "threadx built using CMake")
27+
set(CPACK_GENERATOR "ZIP")
28+
set(CPACK_IGNORE_FILES "\\.git/;\\.github/;_build/;\\.git;\\.gitattributes;\\.gitignore;.*~\$")
29+
set(CPACK_INNOSETUP_ARCHITECTURE "x86")
30+
set(CPACK_INSTALLED_DIRECTORIES "/Users/winston/Documents/碩二/CA/threadx;/")
31+
set(CPACK_INSTALL_CMAKE_PROJECTS "")
32+
set(CPACK_INSTALL_PREFIX "/usr/local")
33+
set(CPACK_MODULE_PATH "")
34+
set(CPACK_NSIS_DISPLAY_NAME "threadx 0.1.1")
35+
set(CPACK_NSIS_INSTALLER_ICON_CODE "")
36+
set(CPACK_NSIS_INSTALLER_MUI_ICON_CODE "")
37+
set(CPACK_NSIS_INSTALL_ROOT "\$PROGRAMFILES")
38+
set(CPACK_NSIS_PACKAGE_NAME "threadx 0.1.1")
39+
set(CPACK_NSIS_UNINSTALL_NAME "Uninstall")
40+
set(CPACK_OBJCOPY_EXECUTABLE "/Users/winston/riscv-none-elf-gcc/bin/riscv-none-elf-objcopy")
41+
set(CPACK_OBJDUMP_EXECUTABLE "/Users/winston/riscv-none-elf-gcc/bin/riscv-none-elf-objdump")
42+
set(CPACK_OUTPUT_CONFIG_FILE "/Users/winston/Documents/碩二/CA/threadx/build_qemu/CPackConfig.cmake")
43+
set(CPACK_PACKAGE_DEFAULT_LOCATION "/")
44+
set(CPACK_PACKAGE_DESCRIPTION_FILE "/opt/homebrew/share/cmake/Templates/CPack.GenericDescription.txt")
45+
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "threadx built using CMake")
46+
set(CPACK_PACKAGE_FILE_NAME "threadx-0.1.1-Source")
47+
set(CPACK_PACKAGE_INSTALL_DIRECTORY "threadx 0.1.1")
48+
set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "threadx 0.1.1")
49+
set(CPACK_PACKAGE_NAME "threadx")
50+
set(CPACK_PACKAGE_RELOCATABLE "true")
51+
set(CPACK_PACKAGE_VENDOR "Humanity")
52+
set(CPACK_PACKAGE_VERSION "0.1.1")
53+
set(CPACK_PACKAGE_VERSION_MAJOR "0")
54+
set(CPACK_PACKAGE_VERSION_MINOR "1")
55+
set(CPACK_PACKAGE_VERSION_PATCH "1")
56+
set(CPACK_READELF_EXECUTABLE "/Users/winston/riscv-none-elf-gcc/bin/riscv-none-elf-readelf")
57+
set(CPACK_RESOURCE_FILE_LICENSE "/opt/homebrew/share/cmake/Templates/CPack.GenericLicense.txt")
58+
set(CPACK_RESOURCE_FILE_README "/opt/homebrew/share/cmake/Templates/CPack.GenericDescription.txt")
59+
set(CPACK_RESOURCE_FILE_WELCOME "/opt/homebrew/share/cmake/Templates/CPack.GenericWelcome.txt")
60+
set(CPACK_RPM_PACKAGE_SOURCES "ON")
61+
set(CPACK_SET_DESTDIR "OFF")
62+
set(CPACK_SOURCE_GENERATOR "ZIP")
63+
set(CPACK_SOURCE_IGNORE_FILES "\\.git/;\\.github/;_build/;\\.git;\\.gitattributes;\\.gitignore;.*~\$")
64+
set(CPACK_SOURCE_INSTALLED_DIRECTORIES "/Users/winston/Documents/碩二/CA/threadx;/")
65+
set(CPACK_SOURCE_OUTPUT_CONFIG_FILE "/Users/winston/Documents/碩二/CA/threadx/build_qemu/CPackSourceConfig.cmake")
66+
set(CPACK_SOURCE_PACKAGE_FILE_NAME "threadx-0.1.1-Source")
67+
set(CPACK_SOURCE_TOPLEVEL_TAG "Generic-Source")
68+
set(CPACK_STRIP_FILES "")
69+
set(CPACK_SYSTEM_NAME "Generic")
70+
set(CPACK_THREADS "1")
71+
set(CPACK_TOPLEVEL_TAG "Generic-Source")
72+
set(CPACK_VERBATIM_VARIABLES "YES")
73+
set(CPACK_WIX_SIZEOF_VOID_P "4")
74+
75+
if(NOT CPACK_PROPERTIES_FILE)
76+
set(CPACK_PROPERTIES_FILE "/Users/winston/Documents/碩二/CA/threadx/build_qemu/CPackProperties.cmake")
77+
endif()
78+
79+
if(EXISTS ${CPACK_PROPERTIES_FILE})
80+
include(${CPACK_PROPERTIES_FILE})
81+
endif()

0 commit comments

Comments
 (0)