diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..d7bc671 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "am-kernels"] + path = am-kernels + url = ./am-kernels/ diff --git a/abstract-machine/.cache/clangd/index/am.h.A4EACDA3FFE8E991.idx b/abstract-machine/.cache/clangd/index/am.h.A4EACDA3FFE8E991.idx new file mode 100644 index 0000000..bec9f40 Binary files /dev/null and b/abstract-machine/.cache/clangd/index/am.h.A4EACDA3FFE8E991.idx differ diff --git a/abstract-machine/.cache/clangd/index/amdev.h.CED3274D6110AE08.idx b/abstract-machine/.cache/clangd/index/amdev.h.CED3274D6110AE08.idx new file mode 100644 index 0000000..826f18e Binary files /dev/null and b/abstract-machine/.cache/clangd/index/amdev.h.CED3274D6110AE08.idx differ diff --git a/abstract-machine/.cache/clangd/index/audio.c.CC9C4D1C2C767072.idx b/abstract-machine/.cache/clangd/index/audio.c.CC9C4D1C2C767072.idx new file mode 100644 index 0000000..b7ffe81 Binary files /dev/null and b/abstract-machine/.cache/clangd/index/audio.c.CC9C4D1C2C767072.idx differ diff --git a/abstract-machine/.cache/clangd/index/cpp.c.0997979504A7309C.idx b/abstract-machine/.cache/clangd/index/cpp.c.0997979504A7309C.idx new file mode 100644 index 0000000..caa5297 Binary files /dev/null and b/abstract-machine/.cache/clangd/index/cpp.c.0997979504A7309C.idx differ diff --git a/abstract-machine/.cache/clangd/index/cte.c.15ADB982FFA62EFA.idx b/abstract-machine/.cache/clangd/index/cte.c.15ADB982FFA62EFA.idx new file mode 100644 index 0000000..6a0f1d5 Binary files /dev/null and b/abstract-machine/.cache/clangd/index/cte.c.15ADB982FFA62EFA.idx differ diff --git a/abstract-machine/.cache/clangd/index/disk.c.2126A5215FB353A4.idx b/abstract-machine/.cache/clangd/index/disk.c.2126A5215FB353A4.idx new file mode 100644 index 0000000..0b293f6 Binary files /dev/null and b/abstract-machine/.cache/clangd/index/disk.c.2126A5215FB353A4.idx differ diff --git a/abstract-machine/.cache/clangd/index/gpu.c.892C4F545984B680.idx b/abstract-machine/.cache/clangd/index/gpu.c.892C4F545984B680.idx new file mode 100644 index 0000000..ac4a6da Binary files /dev/null and b/abstract-machine/.cache/clangd/index/gpu.c.892C4F545984B680.idx differ diff --git a/abstract-machine/.cache/clangd/index/input.c.261BA2591BDB382F.idx b/abstract-machine/.cache/clangd/index/input.c.261BA2591BDB382F.idx new file mode 100644 index 0000000..2815c0e Binary files /dev/null and b/abstract-machine/.cache/clangd/index/input.c.261BA2591BDB382F.idx differ diff --git a/abstract-machine/.cache/clangd/index/int64.c.CD49DDA5E3516884.idx b/abstract-machine/.cache/clangd/index/int64.c.CD49DDA5E3516884.idx new file mode 100644 index 0000000..1cb2004 Binary files /dev/null and b/abstract-machine/.cache/clangd/index/int64.c.CD49DDA5E3516884.idx differ diff --git a/abstract-machine/.cache/clangd/index/ioe.c.E16910D721F00C2C.idx b/abstract-machine/.cache/clangd/index/ioe.c.E16910D721F00C2C.idx new file mode 100644 index 0000000..71b75e1 Binary files /dev/null and b/abstract-machine/.cache/clangd/index/ioe.c.E16910D721F00C2C.idx differ diff --git a/abstract-machine/.cache/clangd/index/klib-macros.h.B800A13CFCD5D615.idx b/abstract-machine/.cache/clangd/index/klib-macros.h.B800A13CFCD5D615.idx new file mode 100644 index 0000000..38518d6 Binary files /dev/null and b/abstract-machine/.cache/clangd/index/klib-macros.h.B800A13CFCD5D615.idx differ diff --git a/abstract-machine/.cache/clangd/index/klib.h.B932C5DE116ED988.idx b/abstract-machine/.cache/clangd/index/klib.h.B932C5DE116ED988.idx new file mode 100644 index 0000000..69ea042 Binary files /dev/null and b/abstract-machine/.cache/clangd/index/klib.h.B932C5DE116ED988.idx differ diff --git a/abstract-machine/.cache/clangd/index/mpe.c.3D916D1C86ED9B7A.idx b/abstract-machine/.cache/clangd/index/mpe.c.3D916D1C86ED9B7A.idx new file mode 100644 index 0000000..c650205 Binary files /dev/null and b/abstract-machine/.cache/clangd/index/mpe.c.3D916D1C86ED9B7A.idx differ diff --git a/abstract-machine/.cache/clangd/index/native.h.28E399D158114ED9.idx b/abstract-machine/.cache/clangd/index/native.h.28E399D158114ED9.idx new file mode 100644 index 0000000..8e36d7e Binary files /dev/null and b/abstract-machine/.cache/clangd/index/native.h.28E399D158114ED9.idx differ diff --git a/abstract-machine/.cache/clangd/index/platform.c.BA0A6D5AC2C4C4A9.idx b/abstract-machine/.cache/clangd/index/platform.c.BA0A6D5AC2C4C4A9.idx new file mode 100644 index 0000000..b073947 Binary files /dev/null and b/abstract-machine/.cache/clangd/index/platform.c.BA0A6D5AC2C4C4A9.idx differ diff --git a/abstract-machine/.cache/clangd/index/platform.h.CF499A89AF71A47D.idx b/abstract-machine/.cache/clangd/index/platform.h.CF499A89AF71A47D.idx new file mode 100644 index 0000000..5e4a88d Binary files /dev/null and b/abstract-machine/.cache/clangd/index/platform.h.CF499A89AF71A47D.idx differ diff --git a/abstract-machine/.cache/clangd/index/stdio.c.4CCE235847DC4ACF.idx b/abstract-machine/.cache/clangd/index/stdio.c.4CCE235847DC4ACF.idx new file mode 100644 index 0000000..5d59d0c Binary files /dev/null and b/abstract-machine/.cache/clangd/index/stdio.c.4CCE235847DC4ACF.idx differ diff --git a/abstract-machine/.cache/clangd/index/stdlib.c.BDA9DBD681BB43AE.idx b/abstract-machine/.cache/clangd/index/stdlib.c.BDA9DBD681BB43AE.idx new file mode 100644 index 0000000..3f34709 Binary files /dev/null and b/abstract-machine/.cache/clangd/index/stdlib.c.BDA9DBD681BB43AE.idx differ diff --git a/abstract-machine/.cache/clangd/index/string.c.8CBA579FC3418125.idx b/abstract-machine/.cache/clangd/index/string.c.8CBA579FC3418125.idx new file mode 100644 index 0000000..0593987 Binary files /dev/null and b/abstract-machine/.cache/clangd/index/string.c.8CBA579FC3418125.idx differ diff --git a/abstract-machine/.cache/clangd/index/timer.c.9671737A8A895CE0.idx b/abstract-machine/.cache/clangd/index/timer.c.9671737A8A895CE0.idx new file mode 100644 index 0000000..3c6116a Binary files /dev/null and b/abstract-machine/.cache/clangd/index/timer.c.9671737A8A895CE0.idx differ diff --git a/abstract-machine/.cache/clangd/index/trap.S.B4DD7625DCFCA6BD.idx b/abstract-machine/.cache/clangd/index/trap.S.B4DD7625DCFCA6BD.idx new file mode 100644 index 0000000..f0a7976 Binary files /dev/null and b/abstract-machine/.cache/clangd/index/trap.S.B4DD7625DCFCA6BD.idx differ diff --git a/abstract-machine/.cache/clangd/index/trm.c.FF7A4AD075B0A551.idx b/abstract-machine/.cache/clangd/index/trm.c.FF7A4AD075B0A551.idx new file mode 100644 index 0000000..eb80f9a Binary files /dev/null and b/abstract-machine/.cache/clangd/index/trm.c.FF7A4AD075B0A551.idx differ diff --git a/abstract-machine/.cache/clangd/index/vme.c.F922A9D30D484DF9.idx b/abstract-machine/.cache/clangd/index/vme.c.F922A9D30D484DF9.idx new file mode 100644 index 0000000..714ab1c Binary files /dev/null and b/abstract-machine/.cache/clangd/index/vme.c.F922A9D30D484DF9.idx differ diff --git a/abstract-machine/.gitignore b/abstract-machine/.gitignore index 84c3ed2..bcba0ab 100644 --- a/abstract-machine/.gitignore +++ b/abstract-machine/.gitignore @@ -1,19 +1,6 @@ -* -!*/ -!*.h -!*.c -!*.cc -!*.S -!*.ld -!*.sh -!*.py -!*.mk -!Makefile -!README -!LICENSE -.* -_* -*~ -build/ -!.gitignore -.vscode \ No newline at end of file +**/.direnv/ +**/build/ +**/.envrc +**/.cache +.vscode +compile_commands.json diff --git a/abstract-machine/CMakeLists.txt b/abstract-machine/CMakeLists.txt new file mode 100644 index 0000000..4de3a06 --- /dev/null +++ b/abstract-machine/CMakeLists.txt @@ -0,0 +1,84 @@ +cmake_minimum_required(VERSION 3.22) + +project(abstract-machine) +enable_language(CXX C ASM) +set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 11) + +include(CMakeDependentOption) +include(CMakePackageConfigHelpers) # Used to find libcheck +include(CTest) + +# -- General options +set(ISA CACHE STRING "Target ISA") +set_property(CACHE ISA PROPERTY STRINGS "riscv" "x86" "x86_64" "native") +string(TOUPPER ${ISA} ISA_UPPER) + +cmake_dependent_option( + __PLATFORM_NEMU__ "Run on NEMU" + ON "ISA MATCHES \"(riscv | x86)\"" OFF) +cmake_dependent_option( + __PLATFORM_NATIVE__ "Run on native" + ON "ISA MATCHES native" OFF) + +# -- Set PLATFORM according to options +set(MATCH_PLATFORM_PATTERN "^__PLATFORM_([A-Z]*)__") +get_cmake_property(CACHE_VARS CACHE_VARIABLES) + +message(STATUS "ISA: ${ISA}") +foreach(VAR IN LISTS CACHE_VARS) + if(VAR MATCHES ${MATCH_PLATFORM_PATTERN}) + # Retrieve the value of the cache variable + get_property(VAR_VALUE CACHE ${VAR} PROPERTY VALUE) + set(PLATFORM_UPPER ${CMAKE_MATCH_1}) + string(TOLOWER ${PLATFORM_UPPER} PLATFORM) + message(STATUS "Variable: ${VAR}=${VAR_VALUE}, Platform: ${PLATFORM}") + endif() +endforeach() + +if(${PLATFORM} MATCHES "native") +set(ARCH "native") +else() +set(ARCH ${ISA}-${PLATFORM}) +endif() +string(TOUPPER ${ARCH} ARCH_UPPER) + +# -- Target specific options +cmake_dependent_option( + NATIVE_USE_KLIB "Use Klib even if on native" + ON "NOT __ISA_NATIVE__" OFF) + +# -- Add compile definitions based on options +add_compile_definitions( + $ + __ISA_${ISA_UPPER}__ + __PLATFORM_${PLATFORM_UPPER}__ +) + +add_compile_definitions( + $<$:__NATIVE_USE_KLIB__> +) + +# -- Required compiler flags +add_compile_options( + # -Werror + -Wno-main + -fno-asynchronous-unwind-tables + -fno-builtin + -fno-stack-protector + -U_FORTIFY_SOURCE + $<$:-fno-exceptions> + $<$:-ffreestanding> + $<$:-fno-rtti>) + +add_link_options( + -znoexecstack +) + +# -- Include linker script here. Use this linker script at link time if INCLUDE_LINKER_SCRIPT is set to true +set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/scripts/linker.ld) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") + +add_subdirectory(klib) +add_subdirectory(am) diff --git a/abstract-machine/CMakePresets.json b/abstract-machine/CMakePresets.json new file mode 100644 index 0000000..d14c0b6 --- /dev/null +++ b/abstract-machine/CMakePresets.json @@ -0,0 +1,29 @@ +{ + "version": 6, + "configurePresets": [ + { + "name": "native", + "displayName": "Native", + "generator": "Unix Makefiles", + "binaryDir": "${sourceDir}/out/build/${presetName}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "ISA": "native", + "__PLATFORM_NATIVE__": true, + "NATIVE_USE_KLIB": true + } + }, + { + "name": "riscv-nemu", + "displayName": "Riscv32 NEMU", + "generator": "Unix Makefiles", + "binaryDir": "${sourceDir}/out/build/${presetName}", + "installDir": "/home/xin/repo/ysyx-workbench/abstract-machine/out/install", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "ISA": "riscv", + "__PLATFORM_NEMU__": true + } + } + ] +} \ No newline at end of file diff --git a/abstract-machine/am/.cache/clangd/index/am.h.A4EACDA3FFE8E991.idx b/abstract-machine/am/.cache/clangd/index/am.h.A4EACDA3FFE8E991.idx new file mode 100644 index 0000000..02d2e71 Binary files /dev/null and b/abstract-machine/am/.cache/clangd/index/am.h.A4EACDA3FFE8E991.idx differ diff --git a/abstract-machine/am/.cache/clangd/index/amdev.h.CED3274D6110AE08.idx b/abstract-machine/am/.cache/clangd/index/amdev.h.CED3274D6110AE08.idx new file mode 100644 index 0000000..55f6ae8 Binary files /dev/null and b/abstract-machine/am/.cache/clangd/index/amdev.h.CED3274D6110AE08.idx differ diff --git a/abstract-machine/am/.cache/clangd/index/audio.c.CC9C4D1C2C767072.idx b/abstract-machine/am/.cache/clangd/index/audio.c.CC9C4D1C2C767072.idx new file mode 100644 index 0000000..2eb8c44 Binary files /dev/null and b/abstract-machine/am/.cache/clangd/index/audio.c.CC9C4D1C2C767072.idx differ diff --git a/abstract-machine/am/.cache/clangd/index/cte.c.15ADB982FFA62EFA.idx b/abstract-machine/am/.cache/clangd/index/cte.c.15ADB982FFA62EFA.idx new file mode 100644 index 0000000..337d721 Binary files /dev/null and b/abstract-machine/am/.cache/clangd/index/cte.c.15ADB982FFA62EFA.idx differ diff --git a/abstract-machine/am/.cache/clangd/index/disk.c.2126A5215FB353A4.idx b/abstract-machine/am/.cache/clangd/index/disk.c.2126A5215FB353A4.idx new file mode 100644 index 0000000..5e47ba4 Binary files /dev/null and b/abstract-machine/am/.cache/clangd/index/disk.c.2126A5215FB353A4.idx differ diff --git a/abstract-machine/am/.cache/clangd/index/gpu.c.892C4F545984B680.idx b/abstract-machine/am/.cache/clangd/index/gpu.c.892C4F545984B680.idx new file mode 100644 index 0000000..ed8c7b6 Binary files /dev/null and b/abstract-machine/am/.cache/clangd/index/gpu.c.892C4F545984B680.idx differ diff --git a/abstract-machine/am/.cache/clangd/index/input.c.261BA2591BDB382F.idx b/abstract-machine/am/.cache/clangd/index/input.c.261BA2591BDB382F.idx new file mode 100644 index 0000000..90455d1 Binary files /dev/null and b/abstract-machine/am/.cache/clangd/index/input.c.261BA2591BDB382F.idx differ diff --git a/abstract-machine/am/.cache/clangd/index/ioe.c.E16910D721F00C2C.idx b/abstract-machine/am/.cache/clangd/index/ioe.c.E16910D721F00C2C.idx new file mode 100644 index 0000000..03ea9b2 Binary files /dev/null and b/abstract-machine/am/.cache/clangd/index/ioe.c.E16910D721F00C2C.idx differ diff --git a/abstract-machine/am/.cache/clangd/index/mpe.c.3D916D1C86ED9B7A.idx b/abstract-machine/am/.cache/clangd/index/mpe.c.3D916D1C86ED9B7A.idx new file mode 100644 index 0000000..96e2f54 Binary files /dev/null and b/abstract-machine/am/.cache/clangd/index/mpe.c.3D916D1C86ED9B7A.idx differ diff --git a/abstract-machine/am/.cache/clangd/index/platform.c.BA0A6D5AC2C4C4A9.idx b/abstract-machine/am/.cache/clangd/index/platform.c.BA0A6D5AC2C4C4A9.idx new file mode 100644 index 0000000..7447300 Binary files /dev/null and b/abstract-machine/am/.cache/clangd/index/platform.c.BA0A6D5AC2C4C4A9.idx differ diff --git a/abstract-machine/am/.cache/clangd/index/platform.h.CF499A89AF71A47D.idx b/abstract-machine/am/.cache/clangd/index/platform.h.CF499A89AF71A47D.idx new file mode 100644 index 0000000..5593660 Binary files /dev/null and b/abstract-machine/am/.cache/clangd/index/platform.h.CF499A89AF71A47D.idx differ diff --git a/abstract-machine/am/.cache/clangd/index/timer.c.9671737A8A895CE0.idx b/abstract-machine/am/.cache/clangd/index/timer.c.9671737A8A895CE0.idx new file mode 100644 index 0000000..9ed1a6a Binary files /dev/null and b/abstract-machine/am/.cache/clangd/index/timer.c.9671737A8A895CE0.idx differ diff --git a/abstract-machine/am/.cache/clangd/index/trap.S.B4DD7625DCFCA6BD.idx b/abstract-machine/am/.cache/clangd/index/trap.S.B4DD7625DCFCA6BD.idx new file mode 100644 index 0000000..664d0c2 Binary files /dev/null and b/abstract-machine/am/.cache/clangd/index/trap.S.B4DD7625DCFCA6BD.idx differ diff --git a/abstract-machine/am/.cache/clangd/index/trm.c.FF7A4AD075B0A551.idx b/abstract-machine/am/.cache/clangd/index/trm.c.FF7A4AD075B0A551.idx new file mode 100644 index 0000000..29b9094 Binary files /dev/null and b/abstract-machine/am/.cache/clangd/index/trm.c.FF7A4AD075B0A551.idx differ diff --git a/abstract-machine/am/.cache/clangd/index/vme.c.F922A9D30D484DF9.idx b/abstract-machine/am/.cache/clangd/index/vme.c.F922A9D30D484DF9.idx new file mode 100644 index 0000000..6029e91 Binary files /dev/null and b/abstract-machine/am/.cache/clangd/index/vme.c.F922A9D30D484DF9.idx differ diff --git a/abstract-machine/am/CMakeLists.txt b/abstract-machine/am/CMakeLists.txt new file mode 100644 index 0000000..b0462e4 --- /dev/null +++ b/abstract-machine/am/CMakeLists.txt @@ -0,0 +1,10 @@ +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) + +add_library(am_interface INTERFACE) +target_include_directories(am_interface INTERFACE + $ + $) + +add_subdirectory(src) + +install(DIRECTORY include/ DESTINATION include/abstract-machine) diff --git a/abstract-machine/am/src/CMakeLists.txt b/abstract-machine/am/src/CMakeLists.txt new file mode 100644 index 0000000..97e86b0 --- /dev/null +++ b/abstract-machine/am/src/CMakeLists.txt @@ -0,0 +1,47 @@ +if(ISA MATCHES "native") +set(SOURCEDIR "./${PLATFORM}") +else() +set(SOURCEDIR "./${ISA}/${PLATFORM}") +endif() + +add_subdirectory(${SOURCEDIR}) + +target_include_directories(am-${ARCH} + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + PUBLIC + $ + $) +target_link_libraries(am-${ARCH} + PUBLIC klib_interface + INTERFACE m) +if(INCLUDE_LINKER_SCRIPT) + target_link_options(am-${ARCH} INTERFACE -T${LINKER_SCRIPT}) +endif() + +# Interface compile flags +target_link_options(am-${ARCH} INTERFACE + -znoexecstack) + +target_compile_options(am-${ARCH} INTERFACE + -fno-asynchronous-unwind-tables + -fno-builtin + -fno-stack-protector + -U_FORTIFY_SOURCE + $<$:-fno-exceptions> + $<$:-ffreestanding> + $<$:-fno-rtti>) + +install(TARGETS am-${ARCH} klib_interface am_interface + EXPORT amTargets + LIBRARY DESTINATION lib) + +install(EXPORT amTargets + FILE amTargets.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/am-${ARCH}) + +configure_package_config_file(${CMAKE_SOURCE_DIR}/cmake/am-config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/am-${ARCH}-config.cmake + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/am-${ARCH}) + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/am-${ARCH}-config.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/am-${ARCH}) diff --git a/abstract-machine/am/src/native/CMakeLists.txt b/abstract-machine/am/src/native/CMakeLists.txt new file mode 100644 index 0000000..e3c9303 --- /dev/null +++ b/abstract-machine/am/src/native/CMakeLists.txt @@ -0,0 +1,26 @@ +include(CheckPIESupported) +check_pie_supported() + +set(SOURCES + trap.S + cte.c + ioe.c + mpe.c + platform.c + trm.c + vme.c + ioe/audio.c + ioe/disk.c + ioe/gpu.c + ioe/input.c + ioe/timer.c +) +add_library(am-native ${SOURCES}) + +# FIXME: get free(): invalid address when user program compiled without pie +set_target_properties(am-native PROPERTIES + POSITION_INDEPENDENT_CODE TRUE + INTERFACE_POSITION_INDEPENDENT_CODE TRUE) + +find_package(SDL2 REQUIRED) +target_link_libraries(am-${ARCH} PUBLIC SDL2::SDL2) diff --git a/abstract-machine/am/src/riscv/nemu/CMakeLists.txt b/abstract-machine/am/src/riscv/nemu/CMakeLists.txt new file mode 100644 index 0000000..ac024cc --- /dev/null +++ b/abstract-machine/am/src/riscv/nemu/CMakeLists.txt @@ -0,0 +1,27 @@ +include(nemu-settings) + +add_library(am-${ISA}-nemu + cte.c + start.S + trap.S + vme.c + ${NEMU_SOURCES} +) + +target_compile_options(am-${ISA}-nemu PRIVATE + ${NEMU_COMPILE_OPTIONS} + ${RISCV_COMPILE_OPTIONS}) +target_link_options(am-${ISA}-nemu PRIVATE + ${NEMU_LINK_OPITIONS} + ${RISCV_LINK_OPTIONS}) +target_include_directories(am-${ISA}-nemu PRIVATE + ${NEMU_INCLUDE_DIRECTORIES}) + +target_compile_definitions(am-${ISA}-nemu PUBLIC + ARCH_H="arch/riscv.h") +target_compile_definitions(am-${ISA}-nemu PRIVATE + ISA_H="riscv/riscv.h") + +set_target_properties(am-${ISA}-nemu PROPERTIES + POSITION_INDEPENDENT_CODE OFF + INTERFACE_POSITION_INDEPENDENT_CODE OFF) diff --git a/abstract-machine/cmake/am-config.cmake.in b/abstract-machine/cmake/am-config.cmake.in new file mode 100644 index 0000000..f2fbb32 --- /dev/null +++ b/abstract-machine/cmake/am-config.cmake.in @@ -0,0 +1,9 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) +if(${ARCH} MATCHES "native") +find_dependency(SDL2 REQUIRED) +endif() + +# Include the targets file +include("${CMAKE_CURRENT_LIST_DIR}/amTargets.cmake") diff --git a/abstract-machine/cmake/klib-config.cmake.in b/abstract-machine/cmake/klib-config.cmake.in new file mode 100644 index 0000000..6b57e7f --- /dev/null +++ b/abstract-machine/cmake/klib-config.cmake.in @@ -0,0 +1,6 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) + +# Include the targets file +include("${CMAKE_CURRENT_LIST_DIR}/klibTargets.cmake") diff --git a/abstract-machine/cmake/nemu-settings.cmake b/abstract-machine/cmake/nemu-settings.cmake new file mode 100644 index 0000000..555b4dd --- /dev/null +++ b/abstract-machine/cmake/nemu-settings.cmake @@ -0,0 +1,11 @@ +set(NEMU_COMPILE_OPTIONS -fdata-sections -ffunction-sections) +set(NEMU_LINK_OPTIONS + --defsym=_pmem_start=0x80000000 + --defsym=_entry_offset=0x0 + --gc-sections + -e _start) +set(NEMU_INCLUDE_DIRECTORIES + ${CMAKE_SOURCE_DIR}/am/src/platform/nemu/include) +file(GLOB_RECURSE NEMU_SOURCES + ${CMAKE_SOURCE_DIR}/am/src/platform/nemu/*.[cS]) +set(INCLUDE_LINKER_SCRIPT true) diff --git a/abstract-machine/cmake/riscv-settings.cmake b/abstract-machine/cmake/riscv-settings.cmake new file mode 100644 index 0000000..1286e4c --- /dev/null +++ b/abstract-machine/cmake/riscv-settings.cmake @@ -0,0 +1,2 @@ +set(RISCV_COMPILE_OPTIONS) +set(RISCV_LINK_OPTIONS) diff --git a/abstract-machine/klib/CMakeLists.txt b/abstract-machine/klib/CMakeLists.txt new file mode 100644 index 0000000..2cf4a78 --- /dev/null +++ b/abstract-machine/klib/CMakeLists.txt @@ -0,0 +1,12 @@ +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) + +add_library(klib_interface INTERFACE) +target_include_directories(klib_interface + INTERFACE + $ + $) + +add_subdirectory(src) +# add_subdirectory(tests) + +install(DIRECTORY include/ DESTINATION include/abstract-machine) diff --git a/abstract-machine/klib/include/klib.h b/abstract-machine/klib/include/klib.h index ecb24c8..48d63e9 100644 --- a/abstract-machine/klib/include/klib.h +++ b/abstract-machine/klib/include/klib.h @@ -35,6 +35,7 @@ int atoi (const char *nptr); int printf (const char *format, ...); int sprintf (char *str, const char *format, ...); int snprintf (char *str, size_t size, const char *format, ...); +int vprintf (const char *format, va_list ap); int vsprintf (char *str, const char *format, va_list ap); int vsnprintf (char *str, size_t size, const char *format, va_list ap); diff --git a/abstract-machine/klib/result b/abstract-machine/klib/result new file mode 120000 index 0000000..afe16ba --- /dev/null +++ b/abstract-machine/klib/result @@ -0,0 +1 @@ +/nix/store/h1glxbcjgw3mv218w2wy73yih6s5p7iz-gdb-13.2 \ No newline at end of file diff --git a/abstract-machine/klib/src/CMakeLists.txt b/abstract-machine/klib/src/CMakeLists.txt new file mode 100644 index 0000000..bf7e136 --- /dev/null +++ b/abstract-machine/klib/src/CMakeLists.txt @@ -0,0 +1,33 @@ +# find_package(FLEX) +# find_package(BISON) + +# FLEX_TARGET(fmt_scanner fmt_scanner.l fmt_scanner.c) + +set(SOURCES + cpp.c + int64.c + stdio.c + stdlib.c + string.c + # ${FLEX_fmt_scanner_OUTPUTS} +) + +add_library(klib ${SOURCES}) +target_include_directories(klib PUBLIC $) +target_compile_definitions(klib PUBLIC $) + +install(TARGETS klib + EXPORT klibTargets + LIBRARY DESTINATION lib) + +install(EXPORT klibTargets + FILE klibTargets.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/klib) + +configure_package_config_file(${CMAKE_SOURCE_DIR}/cmake/klib-config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/klib-config.cmake + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/klib) + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/klib-config.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/klib) + diff --git a/abstract-machine/klib/src/stdio.c b/abstract-machine/klib/src/stdio.c index 1b19953..fec63bc 100644 --- a/abstract-machine/klib/src/stdio.c +++ b/abstract-machine/klib/src/stdio.c @@ -5,8 +5,20 @@ #if !defined(__ISA_NATIVE__) || defined(__NATIVE_USE_KLIB__) +int vprintf(const char *fmt, va_list ap) { + const char *p = fmt; + while(*p != '\0') { + putch(*p); + } + return 0; +} + int printf(const char *fmt, ...) { - panic("Not implemented"); + va_list args; + va_start(args, fmt); + vprintf(fmt, args); + va_end(args); + return 0; } int vsprintf(char *out, const char *fmt, va_list ap) { diff --git a/abstract-machine/klib/src/string.c b/abstract-machine/klib/src/string.c index f1a1f22..931e7dd 100644 --- a/abstract-machine/klib/src/string.c +++ b/abstract-machine/klib/src/string.c @@ -5,43 +5,115 @@ #if !defined(__ISA_NATIVE__) || defined(__NATIVE_USE_KLIB__) size_t strlen(const char *s) { - panic("Not implemented"); + const char *p = s; + size_t len = 0; + while(*(p++) != '\0') len++; + return len; } char *strcpy(char *dst, const char *src) { - panic("Not implemented"); + char *p_dst = dst; + const char *p_src = src; + for(; *p_src != '\0'; p_src++, p_dst++) { + *p_dst = *p_src; + } + *p_dst = '\0'; + return dst; } char *strncpy(char *dst, const char *src, size_t n) { - panic("Not implemented"); + int i = 0; + for(; i < n && src[i] != '\0'; i++) { + dst[i] = src[i]; + } + for(; i < n; i++) { + dst[i] = '\0'; + } + return dst; } char *strcat(char *dst, const char *src) { - panic("Not implemented"); + char *p_dst = dst; + const char *p_src = src; + while(*p_dst != '\0') p_dst++; + for(; *p_src != '\0'; p_src++, p_dst++) { + *p_dst = *p_src; + } + *p_dst = '\0'; + return dst; } int strcmp(const char *s1, const char *s2) { - panic("Not implemented"); + const char *p_s1 = s1, *p_s2 = s2; + for(; *p_s1 == *p_s2; p_s1++, p_s2++) { + if(*p_s1 == '\0' || *p_s2 == '\0') { + break; + } + } + return *p_s1 - *p_s2; } int strncmp(const char *s1, const char *s2, size_t n) { - panic("Not implemented"); + const char *p_s1 = s1, *p_s2 = s2; + int i = 0; + for(i = 0; i < n - 1; i++) { + if(s1[i] == '\0' || s2[i] == '\0') + break; + } + return s1[i] - s2[i]; } void *memset(void *s, int c, size_t n) { - panic("Not implemented"); + uint8_t *p = s; + for(int i = 0; i < n; i++) { + p[i] = c; + } + return s; } void *memmove(void *dst, const void *src, size_t n) { - panic("Not implemented"); + if (src + n > dst && src < dst) { + size_t len = dst - src; + void *p_dst = (void *)src + n; + const void *p_src = src + n - len; + while(p_dst >= dst) { + memcpy(p_dst, p_src, len); + p_src -= len; + p_dst -= len; + } + if(n % len) memcpy(dst, src, n % len); + } else if (dst < src && dst + n > src) { + size_t len = src - dst; + void *p_dst = dst; + const void *p_src = src; + while(p_src < src + n) { + memcpy(p_dst, p_src, len); + p_src += len; + p_dst += len; + } + if(n % len) memcpy(p_dst, p_src, n % len); + } else { + memcpy(dst, src, n); + } + + return dst; } void *memcpy(void *out, const void *in, size_t n) { - panic("Not implemented"); + for (size_t i = 0 ; i < n ; i++) { + *(uint8_t *)(out + i) = *(uint8_t *)(in + i); + } + return out; } int memcmp(const void *s1, const void *s2, size_t n) { - panic("Not implemented"); + const uint8_t *p1 = s1, *p2 = s2; + for (int i = 0; i < n; i++) { + if(*p1 != *p2) + return p1 - p2; + p1++; p2++; + } + return 0; } #endif diff --git a/abstract-machine/klib/tests/CMakeLists.txt b/abstract-machine/klib/tests/CMakeLists.txt new file mode 100644 index 0000000..f72c555 --- /dev/null +++ b/abstract-machine/klib/tests/CMakeLists.txt @@ -0,0 +1,17 @@ +set(TEST_SOURCES + stdio + string +) + +foreach(TEST IN LISTS TEST_SOURCES) + add_executable(${TEST} ${TEST}.c) + target_link_libraries(${TEST} am-${ARCH} klib m) + target_include_directories(${TEST} + PRIVATE $ + PRIVATE $ + ) + # TODO: Run tests in other configurations + if(__PLATFORM_NATIVE__) + add_test(NAME ${TEST} COMMAND ${TEST}) + endif() +endforeach() diff --git a/abstract-machine/klib/tests/stdio.c b/abstract-machine/klib/tests/stdio.c new file mode 100644 index 0000000..7287e83 --- /dev/null +++ b/abstract-machine/klib/tests/stdio.c @@ -0,0 +1,5 @@ +#include + +int main(void) { + return 0; +} \ No newline at end of file diff --git a/abstract-machine/klib/tests/string.c b/abstract-machine/klib/tests/string.c new file mode 100644 index 0000000..640f2d6 --- /dev/null +++ b/abstract-machine/klib/tests/string.c @@ -0,0 +1,75 @@ +#include +#include +#include + +void test_strcpy() { + char b[32]; + char *s; + b[16]='a'; b[17]='b'; b[18]='c'; b[19]=0; + panic_on((s = strcpy(b, b+16)) != b, "strcpy wrong return value"); + panic_on(strcmp(s, "abc") != 0, "strcpy gave incorrect string"); + panic_on((s = strcpy(b+1, b+16)) != b+1, "strcpy wrong return value"); + panic_on(strcmp(s, "abc") != 0, "strcpy gave incorrect string"); + + panic_on((s = strcpy(b+1, b+17)) != b+1, "strcpy wrong return value"); + panic_on(strcmp(s, "bc") != 0, "strcpy gave incorrect string"); +} + +void test_strncpy() { + char b[32]; + char *s; + int i; + b[3] = 'x'; b[4] = 0; + panic_on((s = strncpy(b, "abc", 3)) != b, "strncpy wrong return value"); + panic_on(b[2] != 'c', "strncpy fails to copy last byte"); + panic_on(b[3] != 'x', "strncpy overruns buffer to null-terminate"); +} + +void test_strncmp() { + panic_on(strncmp("abcd", "abce", 3) != 0, "strncmp compares past n"); + panic_on(strncmp("abc", "abd", 3) == 0, "strncmp fails to compare n-1st byte"); +} + +void test_memset() { + uint8_t arr[128]; + arr[120] = 0xd; + panic_on(memset(arr, 0xf, 120) != arr, "memset wrong return value"); + panic_on(arr[7] != 0xf, "memset fails to set value in range"); + panic_on(arr[120] != 0xd, "memset set value past n"); +} + +void test_memcpy() { + const uint8_t src[] = { 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x0, 0x0 }; + uint8_t dst[8] = {0}; + memcpy(dst, src, 8); + panic_on(memcmp(dst, src, 8) != 0, "memcpy fails to copy memory"); +} + +void test_memmove() { + const uint8_t ref[] = { 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x0, 0x0 }; + uint8_t dst[8] = {0}; + const uint8_t ans1[] = { 0x1, 0x2, 0x3, 0x4, 0x3, 0x4, 0x0, 0x0 }; + const uint8_t ans2[] = { 0x1, 0x2, 0x2, 0x3, 0x4, 0x3, 0x0, 0x0 }; + const uint8_t ans3[] = { 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x3, 0x4 }; + memmove(dst, ref, 8); + panic_on(memcmp(dst, ref, 8) != 0, "memmove fails to copy non-overlapping memory"); + + memmove(dst, dst + 2, 4); + panic_on(memcmp(dst, ans1, 8) != 0, "memmove fails to copy overlapping memory (dst < src)"); + + memmove(dst + 2, dst + 1, 4); + panic_on(memcmp(dst, ans2, 8) != 0, "memmove fails to copy overlapping memory (src < dst)"); + + memmove(dst + 3, dst, 5); + panic_on(memcmp(dst, ans3, 8) != 0, "memmove fails to copy overlapping memory (src < dst)"); +} + +int main(void) { + test_strcpy(); + test_strncpy(); + test_strncmp(); + test_memset(); + test_memcpy(); + test_memmove(); + return 0; +} diff --git a/abstract-machine/out/install/lib/libklib.a b/abstract-machine/out/install/lib/libklib.a new file mode 100644 index 0000000..de0ce70 Binary files /dev/null and b/abstract-machine/out/install/lib/libklib.a differ diff --git a/am-kernels b/am-kernels new file mode 160000 index 0000000..bb725d6 --- /dev/null +++ b/am-kernels @@ -0,0 +1 @@ +Subproject commit bb725d6f8223dd7de831c3b692e8c4531e9d01af diff --git a/flake.nix b/flake.nix index 4f6d95d..b86ae8a 100644 --- a/flake.nix +++ b/flake.nix @@ -19,12 +19,47 @@ { packages.nemu = pkgs.callPackage ./nemu { am-kernels = self.packages.${system}.am-kernels-rv32; }; + packages.abstract-machine = crossPkgs.stdenv.mkDerivation rec { + pname = "abstract-machine"; + version = "2024.02.18"; + + src = ./abstract-machine; + + nativeBuildInputs = [ + pkgs.cmake + ]; + + buildInputs = [ + # SDL2 + ]; + cmakeFlags = [ + (pkgs.lib.cmakeFeature "ISA" "riscv") + (pkgs.lib.cmakeBool "__PLATFORM_NEMU__" true) + ]; + }; + + packages.am-kernels-cmake = crossPkgs.stdenv.mkDerivation rec { + pname = "am-kernels-cmake"; + version = "2024.02.18"; + + src = /home/xin/repo/am-kernels; + + nativeBuildInputs = [ + pkgs.cmake + ]; + + buildInputs = [ + # SDL2 + self.packages.${system}.abstract-machine + ]; + }; + packages.am-kernels = pkgs.stdenv.mkDerivation rec { pname = "am-kernels"; version = "2024.02.18"; - buildInputs = [ - pkgs.SDL2 + buildInputs = with pkgs; [ + SDL2 ]; src = pkgs.fetchFromGitHub { @@ -53,11 +88,9 @@ installPhase = '' mkdir -p $out/bin - ls build/ - cp build/native/* $out/bin/ + rm -r build/native/src build/native/tests + cp -r build/native/* $out/bin/ ''; - - # dontFixup = true; }; packages.am-kernels-rv32 = crossPkgs.stdenv.mkDerivation rec { @@ -90,8 +123,10 @@ installPhase = '' mkdir -p $out/share/images $out/share/dump + mkdir -p $out/bin cp build/riscv32-nemu/*.bin $out/share/images cp build/riscv32-nemu/*.txt $out/share/dump + cp build/riscv32-nemu/*.elf $out/bin ''; dontFixup = true; @@ -112,7 +147,16 @@ self.packages.${system}.nemu ]; }; + + devShells.abstract-machine-shell = pkgs.mkShell { + packages = with pkgs; [ + clang-tools + cmake + check + pkg-config + SDL2 + ]; + }; } ); } - diff --git a/nemu/include/debug.h b/nemu/include/debug.h index 3aae781..329c64a 100644 --- a/nemu/include/debug.h +++ b/nemu/include/debug.h @@ -18,6 +18,7 @@ #include #include +#include IFDEF(CONFIG_ITRACE, void log_itrace_print()); diff --git a/nemu/result b/nemu/result new file mode 120000 index 0000000..f6d412e --- /dev/null +++ b/nemu/result @@ -0,0 +1 @@ +/nix/store/df4vrbp7ma2dnyqshms2fywnd73sa6jk-am-kernels-2024.02.18 \ No newline at end of file diff --git a/nemu/src/isa/riscv32/inst.c b/nemu/src/isa/riscv32/inst.c index 41c2098..1c41c63 100644 --- a/nemu/src/isa/riscv32/inst.c +++ b/nemu/src/isa/riscv32/inst.c @@ -62,6 +62,7 @@ static void do_branch(Decode *s, bool condition, word_t offset) { } } +#ifdef CONFIG_FTRACE static void ftrace_jalr(Decode *s, int rd, vaddr_t dst) { uint32_t i = s->isa.inst.val; int rs1 = BITS(i, 19, 15); @@ -71,6 +72,7 @@ static void ftrace_jalr(Decode *s, int rd, vaddr_t dst) { ftrace_call(s->pc, dst); } } +#endif static int decode_exec(Decode *s) { int rd = 0; diff --git a/nemu/src/monitor/monitor.c b/nemu/src/monitor/monitor.c index 6755edf..0154208 100644 --- a/nemu/src/monitor/monitor.c +++ b/nemu/src/monitor/monitor.c @@ -133,8 +133,12 @@ void init_monitor(int argc, char *argv[]) { // printf("elf_file: %s\n", elf_file); if(elf_file != NULL) { +#ifdef CONFIG_FTRACE void init_elf(const char *path); init_elf(elf_file); +#else + Warning("Elf file provided, but ftrace not turned on. Ignoring elf file."); +#endif } #ifndef CONFIG_ISA_loongarch32r diff --git a/nemu/src/utils/ftrace.c b/nemu/src/utils/ftrace.c index ec668c0..ea2f2b6 100644 --- a/nemu/src/utils/ftrace.c +++ b/nemu/src/utils/ftrace.c @@ -10,7 +10,6 @@ static vaddr_t ftrace_stack[CONFIG_FTRACE_STACK_SIZE] = {0}; static vaddr_t ftrace_stack_len = 0; func_t *func_table = NULL; int func_table_len = 0, func_table_size = 8; -#endif static int cmp_func_t(const void *a, const void *b) { return ((func_t *)a)->start > ((func_t *)b)->start; @@ -122,3 +121,4 @@ void ftrace_return(vaddr_t pc, vaddr_t addr) { Trace("%*s0x%x ret 0x%x <%s+0x%x>", ftrace_stack_len, "", pc, addr, f == NULL ? "???" : f->name, addr - f->start); } +#endif diff --git a/result b/result new file mode 120000 index 0000000..62f4c55 --- /dev/null +++ b/result @@ -0,0 +1 @@ +/nix/store/nzfl421lydgznc237s7z6nz93zml4i8p-am-kernels-rv32-riscv32-none-elf-2024.02.18 \ No newline at end of file