From 90c45d7c3c46d11473cc027e87fef8605e4ca9c2 Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Tue, 17 Dec 2024 12:34:07 +0100 Subject: [PATCH 01/22] add first version of cmake --- CMakeLists.txt | 177 ++++++++++++++++++++++++++-- benchmarks/coremark/CMakeLists.txt | 66 +++++++++++ benchmarks/dhrystone/CMakeLists.txt | 58 +++++++++ hello-world/CMakeLists.txt | 65 ++++++++++ 4 files changed, 357 insertions(+), 9 deletions(-) create mode 100644 benchmarks/coremark/CMakeLists.txt create mode 100644 benchmarks/dhrystone/CMakeLists.txt create mode 100644 hello-world/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b03c3d..ab87c75 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,170 @@ -if (NOT DEFINED BOARD) - set(BOARD iss) +cmake_minimum_required(VERSION 3.12) + +# Set default RISC-V toolchain if not specified +if(NOT DEFINED RISCV_TOOLCHAIN_PATH) + set(RISCV_TOOLCHAIN_PATH "/opt/shared/cross-toolchains/gcc13/CentOS/riscv64-unknown-elf/bin" CACHE STRING "Path to RISC-V toolchain") endif() -if (NOT DEFINED ISA) - set(ISA imc) + +# Allow override of compiler executables +if(NOT DEFINED RISCV_GCC) + set(RISCV_GCC "/opt/shared/cross-toolchains/gcc13/CentOS/riscv64-unknown-elf/bin/riscv64-unknown-elf-gcc" CACHE STRING "RISC-V GCC compiler") endif() -message(STATUS "Building firmware using ${BOARD} board configuration and isa ${ISA}") -add_custom_target(fw-common ALL - COMMAND make -C hello-world BOARD=${BOARD} ISA=${ISA} && make -C benchmarks/dhrystone BOARD=${BOARD} ISA=${ISA} && make -C benchmarks/coremark BOARD=${BOARD} ISA=${ISA} - USES_TERMINAL - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + +if(NOT DEFINED RISCV_GXX) + set(RISCV_GXX "${RISCV_TOOLCHAIN_PATH}/riscv64-unknown-elf-g++" CACHE STRING "RISC-V G++ compiler") +endif() + +if(NOT DEFINED RISCV_OBJCOPY) + set(RISCV_OBJCOPY "${RISCV_TOOLCHAIN_PATH}/riscv64-unknown-elf-objcopy" CACHE STRING "RISC-V objcopy") +endif() + +if(NOT DEFINED RISCV_OBJDUMP) + set(RISCV_OBJDUMP "${RISCV_TOOLCHAIN_PATH}/riscv64-unknown-elf-objdump" CACHE STRING "RISC-V objdump") +endif() + +# Set the compilers +set(CMAKE_C_COMPILER ${RISCV_GCC}) +set(CMAKE_CXX_COMPILER ${RISCV_GXX}) + +project(Firmware) + +# Define supported configurations +set(SUPPORTED_BOARDS iss) +set(SUPPORTED_ISAS "rv32i;rv32im;rv32imc;rv64i;rv64im;rv64imc;imc") +set(SUPPORTED_ABIS "ilp32;ilp32f;lp64;lp64f") + +# Build target options +option(BUILD_HELLO_WORLD "Build hello-world example" ON) +option(BUILD_DHRYSTONE "Build dhrystone benchmark" OFF) +option(BUILD_COREMARK "Build coremark benchmark" OFF) +option(BUILD_ALL "Build all targets" OFF) + +# If BUILD_ALL is ON, enable all targets +if(BUILD_ALL) + set(BUILD_HELLO_WORLD ON) + set(BUILD_DHRYSTONE ON) + set(BUILD_COREMARK ON) +endif() + +# Set default values and validate configurations +if(NOT DEFINED BOARD) + set(BOARD iss CACHE STRING "Target board") +endif() + +if(NOT DEFINED ISA) + set(ISA imc CACHE STRING "Target ISA") +endif() + +if(NOT DEFINED RISCV_ABI) + if(ISA MATCHES "^rv64") + set(RISCV_ABI "lp64" CACHE STRING "RISC-V ABI") + else() + set(RISCV_ABI "ilp32" CACHE STRING "RISC-V ABI") + endif() +endif() + +# Validate configurations +if(NOT BOARD IN_LIST SUPPORTED_BOARDS) + message(FATAL_ERROR "Invalid BOARD specified. Supported boards: ${SUPPORTED_BOARDS}") +endif() + +if(NOT ISA IN_LIST SUPPORTED_ISAS) + message(FATAL_ERROR "Invalid ISA specified. Supported ISAs: ${SUPPORTED_ISAS}") +endif() + +if(NOT RISCV_ABI IN_LIST SUPPORTED_ABIS) + message(FATAL_ERROR "Invalid ABI specified. Supported ABIs: ${SUPPORTED_ABIS}") +endif() + +# Set RISC-V architecture based on ISA +if(ISA MATCHES "^rv") + set(RISCV_ARCH ${ISA}) +else() + # Default to rv32 for backward compatibility + set(RISCV_ARCH "rv32${ISA}") +endif() + +# Set BSP base directory +set(BSP_BASE "${CMAKE_CURRENT_SOURCE_DIR}/bare-metal-bsp") + +# Global compile definitions +add_compile_definitions(BOARD_${BOARD}) + +# RISC-V specific compiler flags +#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=${RISCV_ARCH}_zicsr_zifencei -mabi=${RISCV_ABI}") +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=${RISCV_ARCH}_zicsr_zifencei -mabi=${RISCV_ABI}") + +# Optional: Enable semihosting support +option(SEMIHOSTING "Enable semihosting support" OFF) +if(SEMIHOSTING) + add_compile_definitions(SEMIHOSTING) +endif() + +#create interface library for propagating compile options +add_library(global_compile_options INTERFACE) + +# Compile options +target_compile_options(global_compile_options INTERFACE + -march=${RISCV_ARCH}_zicsr_zifencei + -mabi=${RISCV_ABI} + -mcmodel=medany + -O2 + -g + # -ffunction-sections + # -fdata-sections +) + + + +message(STATUS "Building firmware with configuration:") +message(STATUS " Board: ${BOARD}") +message(STATUS " ISA: ${ISA} (Architecture: ${RISCV_ARCH})") +message(STATUS " ABI: ${RISCV_ABI}") +message(STATUS " Semihosting: ${SEMIHOSTING}") +message(STATUS " Toolchain:") +message(STATUS " Path: ${RISCV_TOOLCHAIN_PATH}") +message(STATUS " C Compiler: ${CMAKE_C_COMPILER}") +message(STATUS " C++ Compiler: ${CMAKE_CXX_COMPILER}") +message(STATUS "Targets to build:") +message(STATUS " hello-world: ${BUILD_HELLO_WORLD}") +message(STATUS " dhrystone: ${BUILD_DHRYSTONE}") +message(STATUS " coremark: ${BUILD_COREMARK}") + + +add_subdirectory(bare-metal-bsp) + +# Add subdirectories based on build options +if(BUILD_HELLO_WORLD) + add_subdirectory(hello-world) +endif() + + +if(BUILD_DHRYSTONE) + add_subdirectory(benchmarks/dhrystone) +endif() + +if(BUILD_COREMARK) + add_subdirectory(benchmarks/coremark) +endif() + +# Create an all-inclusive target only if BUILD_ALL is ON +if(BUILD_ALL) + add_custom_target(fw-common ALL + DEPENDS + hello-world + dhrystone + coremark + ) +endif() + +# Print build instructions +message(STATUS "") +message(STATUS "Build instructions:") +message(STATUS " Build all targets: cmake -DBUILD_ALL=ON ..") +message(STATUS " Build specific target: cmake -DBUILD_HELLO_WORLD=ON -DBUILD_DHRYSTONE=OFF -DBUILD_COREMARK=OFF ..") +message(STATUS " Configure board: cmake -DBOARD=iss ..") +message(STATUS " Configure ISA: cmake -DISA=rv32imc ..") +message(STATUS " Configure ABI: cmake -DRISCV_ABI=ilp32 ..") +message(STATUS " Enable semihosting: cmake -DSEMIHOSTING=ON ..") +message(STATUS " Set toolchain path: cmake -DRISCV_TOOLCHAIN_PATH=/path/to/toolchain ..") +message(STATUS " Set specific compiler: cmake -DRISCV_GCC=/path/to/riscv-gcc -DRISCV_GXX=/path/to/riscv-g++ ..") diff --git a/benchmarks/coremark/CMakeLists.txt b/benchmarks/coremark/CMakeLists.txt new file mode 100644 index 0000000..e3230cb --- /dev/null +++ b/benchmarks/coremark/CMakeLists.txt @@ -0,0 +1,66 @@ +cmake_minimum_required(VERSION 3.12) +project(coremark C) + +# Include BSP libwrap +include(${BSP_BASE}/libwrap/CMakeLists.txt) + +# Source files +set(SOURCES + core_portme.c + cvt.c + ee_printf.c + cm/core_list_join.c + cm/core_main.c + cm/core_matrix.c + cm/core_state.c + cm/core_util.c +) + +# Create executable +add_executable(coremark ${SOURCES}) + +# Include directories +target_include_directories(coremark PRIVATE + ${BSP_BASE}/include + ${BSP_BASE}/drivers + ${BSP_BASE}/env + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/cm +) + +# Link with libwrap +target_link_libraries(coremark PRIVATE + LIBWRAP_TGC +) + +# Add compile definitions +target_compile_definitions(coremark PRIVATE + BOARD_${BOARD} + PERFORMANCE_RUN=1 + ITERATIONS=1000 + COMPILER_FLAGS="${CMAKE_C_FLAGS}" + COMPILER_VERSION="${CMAKE_C_COMPILER_VERSION}" +) + +# Set compile options +target_compile_options(coremark PRIVATE + -march=${RISCV_ARCH}_zicsr_zifencei + -mabi=${RISCV_ABI} + -mcmodel=medany + -ffunction-sections + -fdata-sections + -O2 # Optimization level for benchmarking +) + +# Set linker options +target_link_options(coremark PRIVATE + -T${BSP_BASE}/env/${BOARD}/link.ld + -nostartfiles + -Wl,--gc-sections + ${LIBWRAP_TGC_LDFLAGS} +) + +# Install target +install(TARGETS coremark + RUNTIME DESTINATION bin +) diff --git a/benchmarks/dhrystone/CMakeLists.txt b/benchmarks/dhrystone/CMakeLists.txt new file mode 100644 index 0000000..8bb862a --- /dev/null +++ b/benchmarks/dhrystone/CMakeLists.txt @@ -0,0 +1,58 @@ +cmake_minimum_required(VERSION 3.12) +project(dhrystone C) + +# Include BSP libwrap +include(${BSP_BASE}/libwrap/CMakeLists.txt) + +# Source files +set(SOURCES + dhry_1.c + dhry_2.c + dhry_stubs.c +) + +# Create executable +add_executable(dhrystone ${SOURCES}) + +# Include directories +target_include_directories(dhrystone PRIVATE + ${BSP_BASE}/include + ${BSP_BASE}/drivers + ${BSP_BASE}/env + ${CMAKE_CURRENT_SOURCE_DIR} +) + +# Link with libwrap +target_link_libraries(dhrystone PRIVATE + LIBWRAP_TGC +) + +# Add compile definitions +target_compile_definitions(dhrystone PRIVATE + BOARD_${BOARD} +) + +# Set compile options +target_compile_options(dhrystone PRIVATE + -march=${RISCV_ARCH}_zicsr_zifencei + -mabi=${RISCV_ABI} + -mcmodel=medany + -ffunction-sections + -fdata-sections + -O2 # Optimization level for benchmarking + -DTIME # Enable time measurement + -DNOENUM # Disable enum usage as per dhrystone requirements +) + +# Set linker options +target_link_options(dhrystone PRIVATE + -T${BSP_BASE}/env/${BOARD}/link.ld + -nostartfiles + -Wl,--gc-sections + ${LIBWRAP_TGC_LDFLAGS} +) + +# Install target +install(TARGETS dhrystone + RUNTIME DESTINATION bin +) diff --git a/hello-world/CMakeLists.txt b/hello-world/CMakeLists.txt new file mode 100644 index 0000000..af71120 --- /dev/null +++ b/hello-world/CMakeLists.txt @@ -0,0 +1,65 @@ +cmake_minimum_required(VERSION 3.12) +project(hello-world C) + +# Set default board to iss if not specified +if(NOT DEFINED BOARD) + set(BOARD "iss" CACHE STRING "Target board") +endif() + +#set(BSP_BASE "${CMAKE_CURRENT_SOURCE_DIR}/../bare-metal-bsp") + + + +# Source files +set(SOURCES + hello.c +) + +message(STATUS "Building for board: ${BOARD}") +message(STATUS "liu:${PROJECT_NAME} ") +message(STATUS "Using board-specific files from: ${BSP_BASE}/env/${BOARD}") + +# Create executable with all objects +add_executable(${PROJECT_NAME} + ${SOURCES} + ${BSP_OBJECTS} + + +) + +# Link with board library +target_link_libraries(${PROJECT_NAME} PRIVATE + ${LIBWRAP_OBJECTS} + ${ENV_OBJECTS} + #$ + #$ + ) + +# Include directories +target_include_directories(${PROJECT_NAME} PRIVATE + ${BSP_BASE}/include + ${BSP_BASE}/drivers + ${BSP_BASE}/env + ${BSP_BASE}/env/${BOARD} + ${BSP_BASE}/libwrap +) + +# Add compile definitions +target_compile_definitions(${PROJECT_NAME} PRIVATE + BOARD_${BOARD} +) + +# link global_compile_options to this target +target_link_libraries(${PROJECT_NAME} PRIVATE global_compile_options) + +# Set linker options +target_link_options(${PROJECT_NAME} PRIVATE + -T${BSP_BASE}/env/${BOARD}/link.ld + -nostartfiles + -Wl,--gc-sections +) + +# Install target +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION bin +) From fddf6084184fe1f6305ca7ab1ebe87d08db06d8f Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Fri, 20 Dec 2024 14:33:57 +0100 Subject: [PATCH 02/22] first version of working cmake --- CMakeLists.txt | 26 +++++++++++----------- bare-metal-bsp | 2 +- hello-world/CMakeLists.txt | 44 +++++++++++++++++++++++--------------- 3 files changed, 42 insertions(+), 30 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ab87c75..f382307 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,7 +52,7 @@ if(NOT DEFINED BOARD) endif() if(NOT DEFINED ISA) - set(ISA imc CACHE STRING "Target ISA") + set(ISA rv32imc CACHE STRING "Target ISA") endif() if(NOT DEFINED RISCV_ABI) @@ -69,7 +69,7 @@ if(NOT BOARD IN_LIST SUPPORTED_BOARDS) endif() if(NOT ISA IN_LIST SUPPORTED_ISAS) - message(FATAL_ERROR "Invalid ISA specified. Supported ISAs: ${SUPPORTED_ISAS}") + message(FATAL_ERROR "Invalid ISA specified(${ISA}). Supported ISAs: ${SUPPORTED_ISAS}") endif() if(NOT RISCV_ABI IN_LIST SUPPORTED_ABIS) @@ -91,8 +91,10 @@ set(BSP_BASE "${CMAKE_CURRENT_SOURCE_DIR}/bare-metal-bsp") add_compile_definitions(BOARD_${BOARD}) # RISC-V specific compiler flags -#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=${RISCV_ARCH}_zicsr_zifencei -mabi=${RISCV_ABI}") -#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=${RISCV_ARCH}_zicsr_zifencei -mabi=${RISCV_ABI}") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -g -march=${RISCV_ARCH}_zicsr_zifencei -mabi=${RISCV_ABI} -mcmodel=medany") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -g -march=${RISCV_ARCH}_zicsr_zifencei -mabi=${RISCV_ABI} -mcmodel=medany") +#set(CMAKE_ASM_COMPILER riscv64-unknown-elf-as) +set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -O2 -g -march=${RISCV_ARCH}_zicsr_zifencei -mabi=${RISCV_ABI} -mcmodel=medany") # Optional: Enable semihosting support option(SEMIHOSTING "Enable semihosting support" OFF) @@ -101,18 +103,18 @@ if(SEMIHOSTING) endif() #create interface library for propagating compile options -add_library(global_compile_options INTERFACE) +#add_library(global_compile_options INTERFACE) # Compile options -target_compile_options(global_compile_options INTERFACE - -march=${RISCV_ARCH}_zicsr_zifencei - -mabi=${RISCV_ABI} - -mcmodel=medany - -O2 - -g +#target_compile_options(global_compile_options INTERFACE +# -march=${RISCV_ARCH}_zicsr_zifencei + # -mabi=${RISCV_ABI} + # -mcmodel=medany + # -O2 + # -g # -ffunction-sections # -fdata-sections -) +#) diff --git a/bare-metal-bsp b/bare-metal-bsp index 87dc0ec..f419b1a 160000 --- a/bare-metal-bsp +++ b/bare-metal-bsp @@ -1 +1 @@ -Subproject commit 87dc0ec2304adcb94a25b397a357aadae1304867 +Subproject commit f419b1a3e6e9e8075d7e937ac5b1e1fb4829a976 diff --git a/hello-world/CMakeLists.txt b/hello-world/CMakeLists.txt index af71120..b1db947 100644 --- a/hello-world/CMakeLists.txt +++ b/hello-world/CMakeLists.txt @@ -6,9 +6,6 @@ if(NOT DEFINED BOARD) set(BOARD "iss" CACHE STRING "Target board") endif() -#set(BSP_BASE "${CMAKE_CURRENT_SOURCE_DIR}/../bare-metal-bsp") - - # Source files set(SOURCES @@ -21,19 +18,19 @@ message(STATUS "Using board-specific files from: ${BSP_BASE}/env/${BOARD}") # Create executable with all objects add_executable(${PROJECT_NAME} - ${SOURCES} - ${BSP_OBJECTS} - + ${SOURCES} ) +set_target_properties(${PROJECT_NAME} PROPERTIES SUFFIX ".elf") + # Link with board library -target_link_libraries(${PROJECT_NAME} PRIVATE - ${LIBWRAP_OBJECTS} - ${ENV_OBJECTS} - #$ - #$ - ) +#target_link_libraries(${PROJECT_NAME} PRIVATE +# libwrap +# ${BOARD} +# $ +# #$ +# ) # Include directories target_include_directories(${PROJECT_NAME} PRIVATE @@ -49,14 +46,27 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE BOARD_${BOARD} ) -# link global_compile_options to this target -target_link_libraries(${PROJECT_NAME} PRIVATE global_compile_options) +# link global_compile_options to this target ???? +#target_link_libraries(${PROJECT_NAME} PRIVATE global_compile_options) + +get_target_property(WRAP_LIBRARY_PATH libwrap ARCHIVE_OUTPUT_DIRECTORY) +get_target_property(BOARDLIBRARY_PATH ${BOARD} ARCHIVE_OUTPUT_DIRECTORY) +## TODDO ??? +set(ASM_OBJ_LIB "${BOARDLIBRARY_PATH}/CMakeFiles/asm_obj.dir") + +message(STATUS "in hello_world WRAP_LIBRARY_PATH : ${WRAP_LIBRARY_PATH}, BOARDLIBRARY_PATH : ${BOARDLIBRARY_PATH} ASM_OBJ_LIB: ${ASM_OBJ_LIB} ") # Set linker options target_link_options(${PROJECT_NAME} PRIVATE - -T${BSP_BASE}/env/${BOARD}/link.ld - -nostartfiles - -Wl,--gc-sections + --verbose + -L${ASM_OBJ_LIB} + -L${WRAP_LIBRARY_PATH} + -L${BOARDLIBRARY_PATH} + ${ASM_OBJ_LIB}/start.S.o + ${ASM_OBJ_LIB}/entry.S.o + -L/scratch/hongyu/workarea/Firmwares/build/bare-metal-bsp/env/CMakeFiles/asm_obj.dir + -g -Wl,--wrap=printf -march=rv32imc -mabi=ilp32 -L../bare-metal-bsp/env/ -Wl,--wrap=malloc -Wl,--wrap=open -Wl,--wrap=lseek -Wl,--wrap=_lseek -Wl,--wrap=read -Wl,--wrap=_read -Wl,--wrap=write -Wl,--wrap=_write -Wl,--wrap=fstat -Wl,--wrap=_fstat -Wl,--wrap=stat -Wl,--wrap=close -Wl,--wrap=_close -Wl,--wrap=link -Wl,--wrap=unlink -Wl,--wrap=execve -Wl,--wrap=fork -Wl,--wrap=getpid -Wl,--wrap=kill -Wl,--wrap=wait -Wl,--wrap=isatty -Wl,--wrap=times -Wl,--wrap=sbrk -Wl,--wrap=_sbrk -Wl,--wrap=exit -Wl,--wrap=_exit -Wl,--wrap=puts -Wl,--wrap=_puts -Wl,--wrap=printf -Wl,--wrap=sprintf -L. -Wl,--start-group -llibwrap -liss -lc -Wl,--end-group -T /scratch/hongyu/workarea/Firmwares/bare-metal-bsp/env/iss/link.lds -Wl,--no-warn-rwx-segments -Wl,-Map=hello.map -nostartfiles -o hello.elf + ) # Install target From 85304d1a43c27a9d8a2824ff3335f132d8707376 Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Mon, 6 Jan 2025 20:33:30 +0100 Subject: [PATCH 03/22] updates bsp and build System --- bare-metal-bsp | 2 +- hello-world/CMakeLists.txt | 81 +++++--------------------------------- 2 files changed, 10 insertions(+), 73 deletions(-) diff --git a/bare-metal-bsp b/bare-metal-bsp index f419b1a..6cd7ea8 160000 --- a/bare-metal-bsp +++ b/bare-metal-bsp @@ -1 +1 @@ -Subproject commit f419b1a3e6e9e8075d7e937ac5b1e1fb4829a976 +Subproject commit 6cd7ea887ad0f2d5ae692405ba0bbd2b6ee75646 diff --git a/hello-world/CMakeLists.txt b/hello-world/CMakeLists.txt index b1db947..51e1a58 100644 --- a/hello-world/CMakeLists.txt +++ b/hello-world/CMakeLists.txt @@ -1,75 +1,12 @@ -cmake_minimum_required(VERSION 3.12) +cmake_minimum_required(VERSION 3.21) project(hello-world C) +set(TARGET hello) +add_executable(${TARGET} hello.c) -# Set default board to iss if not specified -if(NOT DEFINED BOARD) - set(BOARD "iss" CACHE STRING "Target board") -endif() +set(BOARD "iss" CACHE STRING "Target board") +add_subdirectory(../bare-metal-bsp bsp) +target_link_libraries(${TARGET} PRIVATE bsp) - -# Source files -set(SOURCES - hello.c -) - -message(STATUS "Building for board: ${BOARD}") -message(STATUS "liu:${PROJECT_NAME} ") -message(STATUS "Using board-specific files from: ${BSP_BASE}/env/${BOARD}") - -# Create executable with all objects -add_executable(${PROJECT_NAME} - ${SOURCES} - -) - -set_target_properties(${PROJECT_NAME} PROPERTIES SUFFIX ".elf") - -# Link with board library -#target_link_libraries(${PROJECT_NAME} PRIVATE -# libwrap -# ${BOARD} -# $ -# #$ -# ) - -# Include directories -target_include_directories(${PROJECT_NAME} PRIVATE - ${BSP_BASE}/include - ${BSP_BASE}/drivers - ${BSP_BASE}/env - ${BSP_BASE}/env/${BOARD} - ${BSP_BASE}/libwrap -) - -# Add compile definitions -target_compile_definitions(${PROJECT_NAME} PRIVATE - BOARD_${BOARD} -) - -# link global_compile_options to this target ???? -#target_link_libraries(${PROJECT_NAME} PRIVATE global_compile_options) - -get_target_property(WRAP_LIBRARY_PATH libwrap ARCHIVE_OUTPUT_DIRECTORY) -get_target_property(BOARDLIBRARY_PATH ${BOARD} ARCHIVE_OUTPUT_DIRECTORY) -## TODDO ??? -set(ASM_OBJ_LIB "${BOARDLIBRARY_PATH}/CMakeFiles/asm_obj.dir") - -message(STATUS "in hello_world WRAP_LIBRARY_PATH : ${WRAP_LIBRARY_PATH}, BOARDLIBRARY_PATH : ${BOARDLIBRARY_PATH} ASM_OBJ_LIB: ${ASM_OBJ_LIB} ") - -# Set linker options -target_link_options(${PROJECT_NAME} PRIVATE - --verbose - -L${ASM_OBJ_LIB} - -L${WRAP_LIBRARY_PATH} - -L${BOARDLIBRARY_PATH} - ${ASM_OBJ_LIB}/start.S.o - ${ASM_OBJ_LIB}/entry.S.o - -L/scratch/hongyu/workarea/Firmwares/build/bare-metal-bsp/env/CMakeFiles/asm_obj.dir - -g -Wl,--wrap=printf -march=rv32imc -mabi=ilp32 -L../bare-metal-bsp/env/ -Wl,--wrap=malloc -Wl,--wrap=open -Wl,--wrap=lseek -Wl,--wrap=_lseek -Wl,--wrap=read -Wl,--wrap=_read -Wl,--wrap=write -Wl,--wrap=_write -Wl,--wrap=fstat -Wl,--wrap=_fstat -Wl,--wrap=stat -Wl,--wrap=close -Wl,--wrap=_close -Wl,--wrap=link -Wl,--wrap=unlink -Wl,--wrap=execve -Wl,--wrap=fork -Wl,--wrap=getpid -Wl,--wrap=kill -Wl,--wrap=wait -Wl,--wrap=isatty -Wl,--wrap=times -Wl,--wrap=sbrk -Wl,--wrap=_sbrk -Wl,--wrap=exit -Wl,--wrap=_exit -Wl,--wrap=puts -Wl,--wrap=_puts -Wl,--wrap=printf -Wl,--wrap=sprintf -L. -Wl,--start-group -llibwrap -liss -lc -Wl,--end-group -T /scratch/hongyu/workarea/Firmwares/bare-metal-bsp/env/iss/link.lds -Wl,--no-warn-rwx-segments -Wl,-Map=hello.map -nostartfiles -o hello.elf - -) - -# Install target -install(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION bin -) +add_custom_command(TARGET ${TARGET} POST_BUILD + COMMAND ${CMAKE_OBJDUMP} -S ${TARGET}.elf > ${TARGET}.dis + COMMENT "Creating disassembly for ${TARGET}") From cde5ae627c1ec1c84b5cc877e1bd6e6ccc554c2a Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Thu, 16 Jan 2025 11:09:58 +0100 Subject: [PATCH 04/22] updates dhrystone build --- benchmarks/dhrystone/CMakeLists.txt | 71 +++++++---------------------- benchmarks/dhrystone/Makefile | 1 + 2 files changed, 18 insertions(+), 54 deletions(-) diff --git a/benchmarks/dhrystone/CMakeLists.txt b/benchmarks/dhrystone/CMakeLists.txt index 8bb862a..4d86a66 100644 --- a/benchmarks/dhrystone/CMakeLists.txt +++ b/benchmarks/dhrystone/CMakeLists.txt @@ -1,58 +1,21 @@ -cmake_minimum_required(VERSION 3.12) +cmake_minimum_required(VERSION 3.21) project(dhrystone C) +set(TARGET dhrystone) +set(CMAKE_BUILD_TYPE Release) +set(ITERATIONS 50000) # 20000 for TGC -# Include BSP libwrap -include(${BSP_BASE}/libwrap/CMakeLists.txt) +add_executable(${TARGET} dhry_1.c dhry_2.c dhry_stubs.c) +target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR}) +target_compile_options(${TARGET} PRIVATE -fno-inline -fno-builtin-printf -fno-common -Wno-implicit -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las) +target_compile_definitions(${TARGET} PRIVATE ITERATIONS=${ITERATIONS} HZ=32768 TIME NO_INIT) -# Source files -set(SOURCES - dhry_1.c - dhry_2.c - dhry_stubs.c -) +set(BOARD "iss" CACHE STRING "Target board") +add_subdirectory(../../bare-metal-bsp bsp) +target_link_libraries(${TARGET} PRIVATE bsp) +target_link_options(${TARGET} PRIVATE LINKER:--wrap=scanf) +include(CMakePrintHelpers) +cmake_print_properties(TARGETS ${TARGET} PROPERTIES COMPILE_DEFINITIONS COMPILE_OPTIONS LINK_OPTIONS INTERFACE_LINK_OPTIONS) -# Create executable -add_executable(dhrystone ${SOURCES}) - -# Include directories -target_include_directories(dhrystone PRIVATE - ${BSP_BASE}/include - ${BSP_BASE}/drivers - ${BSP_BASE}/env - ${CMAKE_CURRENT_SOURCE_DIR} -) - -# Link with libwrap -target_link_libraries(dhrystone PRIVATE - LIBWRAP_TGC -) - -# Add compile definitions -target_compile_definitions(dhrystone PRIVATE - BOARD_${BOARD} -) - -# Set compile options -target_compile_options(dhrystone PRIVATE - -march=${RISCV_ARCH}_zicsr_zifencei - -mabi=${RISCV_ABI} - -mcmodel=medany - -ffunction-sections - -fdata-sections - -O2 # Optimization level for benchmarking - -DTIME # Enable time measurement - -DNOENUM # Disable enum usage as per dhrystone requirements -) - -# Set linker options -target_link_options(dhrystone PRIVATE - -T${BSP_BASE}/env/${BOARD}/link.ld - -nostartfiles - -Wl,--gc-sections - ${LIBWRAP_TGC_LDFLAGS} -) - -# Install target -install(TARGETS dhrystone - RUNTIME DESTINATION bin -) +add_custom_command(TARGET ${TARGET} POST_BUILD + COMMAND ${CMAKE_OBJDUMP} -S ${TARGET}.elf > ${TARGET}.dis + COMMENT "Creating disassembly for ${TARGET}") diff --git a/benchmarks/dhrystone/Makefile b/benchmarks/dhrystone/Makefile index ba8ede8..32cba0a 100644 --- a/benchmarks/dhrystone/Makefile +++ b/benchmarks/dhrystone/Makefile @@ -17,6 +17,7 @@ endif # '-lgcc -lm' are needed to add softfloat routines CFLAGS := -g -O3 -DITERATIONS=$(ITERATIONS) -DHZ=32768 -DTIME -DNO_INIT -fno-inline -fno-builtin-printf -fno-common -Wno-implicit \ -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las +LDFLAGS := -Wl,--wrap=scanf TOOL_DIR=$(dir $(compiler)) From a2e932c56f998a586dec311048e6ac30a2a51b84 Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Thu, 16 Jan 2025 11:10:53 +0100 Subject: [PATCH 05/22] adds build to gitignore --- benchmarks/dhrystone/.gitignore | 1 + hello-world/.gitignore | 1 + 2 files changed, 2 insertions(+) diff --git a/benchmarks/dhrystone/.gitignore b/benchmarks/dhrystone/.gitignore index f8028c7..a3f9bbf 100644 --- a/benchmarks/dhrystone/.gitignore +++ b/benchmarks/dhrystone/.gitignore @@ -1,2 +1,3 @@ dhrystone /dhrystone.dis +build/ \ No newline at end of file diff --git a/hello-world/.gitignore b/hello-world/.gitignore index 35be72e..c3f0253 100644 --- a/hello-world/.gitignore +++ b/hello-world/.gitignore @@ -1,2 +1,3 @@ /hello /hello.dis +build/ \ No newline at end of file From 1629b165b558f259f342dd24453609a0c741a928 Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Thu, 16 Jan 2025 11:11:18 +0100 Subject: [PATCH 06/22] updates bsp --- bare-metal-bsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bare-metal-bsp b/bare-metal-bsp index 6cd7ea8..fbe6560 160000 --- a/bare-metal-bsp +++ b/bare-metal-bsp @@ -1 +1 @@ -Subproject commit 6cd7ea887ad0f2d5ae692405ba0bbd2b6ee75646 +Subproject commit fbe6560e79b3e22f08faba55ba38180f580a201b From 75ba2e75882f40bc0aee987a96de1572f2986a86 Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Thu, 20 Feb 2025 14:08:53 +0100 Subject: [PATCH 07/22] adds cmake for coremark --- benchmarks/coremark/CMakeLists.txt | 62 +- benchmarks/coremark/ee_printf.c | 1105 +++++++++++++--------------- 2 files changed, 525 insertions(+), 642 deletions(-) diff --git a/benchmarks/coremark/CMakeLists.txt b/benchmarks/coremark/CMakeLists.txt index e3230cb..745bd68 100644 --- a/benchmarks/coremark/CMakeLists.txt +++ b/benchmarks/coremark/CMakeLists.txt @@ -1,8 +1,9 @@ -cmake_minimum_required(VERSION 3.12) +cmake_minimum_required(VERSION 3.21) project(coremark C) +set(TARGET coremark) +set(CMAKE_BUILD_TYPE Release) + -# Include BSP libwrap -include(${BSP_BASE}/libwrap/CMakeLists.txt) # Source files set(SOURCES @@ -16,51 +17,20 @@ set(SOURCES cm/core_util.c ) + # Create executable add_executable(coremark ${SOURCES}) +target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/cm) +target_compile_options(${TARGET} PRIVATE -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition ) +target_compile_definitions(${TARGET} PRIVATE PERFORMANCE_RUN=1 CLOCKS_PER_SEC=10000000 FLAGS_STR="" PERFORMANCE_RUN=1 CLOCKS_PER_SEC=10000000 ITERATIONS=600) -# Include directories -target_include_directories(coremark PRIVATE - ${BSP_BASE}/include - ${BSP_BASE}/drivers - ${BSP_BASE}/env - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/cm -) +set(BOARD "iss" CACHE STRING "Target board") +add_subdirectory(../../bare-metal-bsp bsp) +target_link_libraries(${TARGET} PRIVATE bsp) -# Link with libwrap -target_link_libraries(coremark PRIVATE - LIBWRAP_TGC -) +include(CMakePrintHelpers) +cmake_print_properties(TARGETS ${TARGET} PROPERTIES COMPILE_DEFINITIONS COMPILE_OPTIONS LINK_OPTIONS INTERFACE_LINK_OPTIONS) -# Add compile definitions -target_compile_definitions(coremark PRIVATE - BOARD_${BOARD} - PERFORMANCE_RUN=1 - ITERATIONS=1000 - COMPILER_FLAGS="${CMAKE_C_FLAGS}" - COMPILER_VERSION="${CMAKE_C_COMPILER_VERSION}" -) - -# Set compile options -target_compile_options(coremark PRIVATE - -march=${RISCV_ARCH}_zicsr_zifencei - -mabi=${RISCV_ABI} - -mcmodel=medany - -ffunction-sections - -fdata-sections - -O2 # Optimization level for benchmarking -) - -# Set linker options -target_link_options(coremark PRIVATE - -T${BSP_BASE}/env/${BOARD}/link.ld - -nostartfiles - -Wl,--gc-sections - ${LIBWRAP_TGC_LDFLAGS} -) - -# Install target -install(TARGETS coremark - RUNTIME DESTINATION bin -) +add_custom_command(TARGET ${TARGET} POST_BUILD + COMMAND ${CMAKE_OBJDUMP} -S ${TARGET}.elf > ${TARGET}.dis + COMMENT "Creating disassembly for ${TARGET}") diff --git a/benchmarks/coremark/ee_printf.c b/benchmarks/coremark/ee_printf.c index 8f983b0..95d3e1e 100644 --- a/benchmarks/coremark/ee_printf.c +++ b/benchmarks/coremark/ee_printf.c @@ -16,690 +16,603 @@ limitations under the License. #include #include +#include -#define ZEROPAD (1 << 0) /* Pad with zero */ -#define SIGN (1 << 1) /* Unsigned/signed long */ -#define PLUS (1 << 2) /* Show plus */ -#define SPACE (1 << 3) /* Spacer */ -#define LEFT (1 << 4) /* Left justified */ -#define HEX_PREP (1 << 5) /* 0x */ +#define ZEROPAD (1 << 0) /* Pad with zero */ +#define SIGN (1 << 1) /* Unsigned/signed long */ +#define PLUS (1 << 2) /* Show plus */ +#define SPACE (1 << 3) /* Spacer */ +#define LEFT (1 << 4) /* Left justified */ +#define HEX_PREP (1 << 5) /* 0x */ #define UPPERCASE (1 << 6) /* 'ABCDEF' */ #define is_digit(c) ((c) >= '0' && (c) <= '9') -static char * digits = "0123456789abcdefghijklmnopqrstuvwxyz"; -static char * upper_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +static char *digits = "0123456789abcdefghijklmnopqrstuvwxyz"; +static char *upper_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; static ee_size_t strnlen(const char *s, ee_size_t count); -static ee_size_t -strnlen(const char *s, ee_size_t count) -{ - const char *sc; - for (sc = s; *sc != '\0' && count--; ++sc) - ; - return sc - s; +static ee_size_t strnlen(const char *s, ee_size_t count) { + const char *sc; + for (sc = s; *sc != '\0' && count--; ++sc) + ; + return sc - s; } -static int -skip_atoi(const char **s) -{ - int i = 0; - while (is_digit(**s)) - i = i * 10 + *((*s)++) - '0'; - return i; +static int skip_atoi(const char **s) { + int i = 0; + while (is_digit(**s)) + i = i * 10 + *((*s)++) - '0'; + return i; } -static char * -number(char *str, long num, int base, int size, int precision, int type) -{ - char c, sign, tmp[66]; - char *dig = digits; - int i; +static char *number(char *str, long num, int base, int size, int precision, + int type) { + char c, sign, tmp[66]; + char *dig = digits; + int i; - if (type & UPPERCASE) - dig = upper_digits; - if (type & LEFT) - type &= ~ZEROPAD; - if (base < 2 || base > 36) - return 0; + if (type & UPPERCASE) + dig = upper_digits; + if (type & LEFT) + type &= ~ZEROPAD; + if (base < 2 || base > 36) + return 0; - c = (type & ZEROPAD) ? '0' : ' '; - sign = 0; - if (type & SIGN) - { - if (num < 0) - { - sign = '-'; - num = -num; - size--; - } - else if (type & PLUS) - { - sign = '+'; - size--; - } - else if (type & SPACE) - { - sign = ' '; - size--; - } + c = (type & ZEROPAD) ? '0' : ' '; + sign = 0; + if (type & SIGN) { + if (num < 0) { + sign = '-'; + num = -num; + size--; + } else if (type & PLUS) { + sign = '+'; + size--; + } else if (type & SPACE) { + sign = ' '; + size--; } + } - if (type & HEX_PREP) - { - if (base == 16) - size -= 2; - else if (base == 8) - size--; + if (type & HEX_PREP) { + if (base == 16) + size -= 2; + else if (base == 8) + size--; + } + + i = 0; + + if (num == 0) + tmp[i++] = '0'; + else { + while (num != 0) { + tmp[i++] = dig[((unsigned long)num) % (unsigned)base]; + num = ((unsigned long)num) / (unsigned)base; } + } - i = 0; - - if (num == 0) - tmp[i++] = '0'; - else - { - while (num != 0) - { - tmp[i++] = dig[((unsigned long)num) % (unsigned)base]; - num = ((unsigned long)num) / (unsigned)base; - } - } - - if (i > precision) - precision = i; - size -= precision; - if (!(type & (ZEROPAD | LEFT))) - while (size-- > 0) - *str++ = ' '; - if (sign) - *str++ = sign; - - if (type & HEX_PREP) - { - if (base == 8) - *str++ = '0'; - else if (base == 16) - { - *str++ = '0'; - *str++ = digits[33]; - } - } - - if (!(type & LEFT)) - while (size-- > 0) - *str++ = c; - while (i < precision--) - *str++ = '0'; - while (i-- > 0) - *str++ = tmp[i]; + if (i > precision) + precision = i; + size -= precision; + if (!(type & (ZEROPAD | LEFT))) while (size-- > 0) - *str++ = ' '; + *str++ = ' '; + if (sign) + *str++ = sign; - return str; + if (type & HEX_PREP) { + if (base == 8) + *str++ = '0'; + else if (base == 16) { + *str++ = '0'; + *str++ = digits[33]; + } + } + + if (!(type & LEFT)) + while (size-- > 0) + *str++ = c; + while (i < precision--) + *str++ = '0'; + while (i-- > 0) + *str++ = tmp[i]; + while (size-- > 0) + *str++ = ' '; + + return str; } -static char * -eaddr(char *str, unsigned char *addr, int size, int precision, int type) -{ - char tmp[24]; - char *dig = digits; - int i, len; +static char *eaddr(char *str, unsigned char *addr, int size, int precision, + int type) { + char tmp[24]; + char *dig = digits; + int i, len; - if (type & UPPERCASE) - dig = upper_digits; - len = 0; - for (i = 0; i < 6; i++) - { - if (i != 0) - tmp[len++] = ':'; - tmp[len++] = dig[addr[i] >> 4]; - tmp[len++] = dig[addr[i] & 0x0F]; - } + if (type & UPPERCASE) + dig = upper_digits; + len = 0; + for (i = 0; i < 6; i++) { + if (i != 0) + tmp[len++] = ':'; + tmp[len++] = dig[addr[i] >> 4]; + tmp[len++] = dig[addr[i] & 0x0F]; + } - if (!(type & LEFT)) - while (len < size--) - *str++ = ' '; - for (i = 0; i < len; ++i) - *str++ = tmp[i]; + if (!(type & LEFT)) while (len < size--) - *str++ = ' '; + *str++ = ' '; + for (i = 0; i < len; ++i) + *str++ = tmp[i]; + while (len < size--) + *str++ = ' '; - return str; + return str; } -static char * -iaddr(char *str, unsigned char *addr, int size, int precision, int type) -{ - char tmp[24]; - int i, n, len; +static char *iaddr(char *str, unsigned char *addr, int size, int precision, + int type) { + char tmp[24]; + int i, n, len; - len = 0; - for (i = 0; i < 4; i++) - { - if (i != 0) - tmp[len++] = '.'; - n = addr[i]; + len = 0; + for (i = 0; i < 4; i++) { + if (i != 0) + tmp[len++] = '.'; + n = addr[i]; - if (n == 0) - tmp[len++] = digits[0]; - else - { - if (n >= 100) - { - tmp[len++] = digits[n / 100]; - n = n % 100; - tmp[len++] = digits[n / 10]; - n = n % 10; - } - else if (n >= 10) - { - tmp[len++] = digits[n / 10]; - n = n % 10; - } + if (n == 0) + tmp[len++] = digits[0]; + else { + if (n >= 100) { + tmp[len++] = digits[n / 100]; + n = n % 100; + tmp[len++] = digits[n / 10]; + n = n % 10; + } else if (n >= 10) { + tmp[len++] = digits[n / 10]; + n = n % 10; + } - tmp[len++] = digits[n]; - } + tmp[len++] = digits[n]; } + } - if (!(type & LEFT)) - while (len < size--) - *str++ = ' '; - for (i = 0; i < len; ++i) - *str++ = tmp[i]; + if (!(type & LEFT)) while (len < size--) - *str++ = ' '; + *str++ = ' '; + for (i = 0; i < len; ++i) + *str++ = tmp[i]; + while (len < size--) + *str++ = ' '; - return str; + return str; } #if HAS_FLOAT -char * ecvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf); -char * fcvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf); +char *ecvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf); +char *fcvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf); static void ee_bufcpy(char *d, char *s, int count); -void -ee_bufcpy(char *pd, char *ps, int count) -{ - char *pe = ps + count; - while (ps != pe) - *pd++ = *ps++; +void ee_bufcpy(char *pd, char *ps, int count) { + char *pe = ps + count; + while (ps != pe) + *pd++ = *ps++; } -static void -parse_float(double value, char *buffer, char fmt, int precision) -{ - int decpt, sign, exp, pos; - char *digits = NULL; - char cvtbuf[80]; - int capexp = 0; - int magnitude; +static void parse_float(double value, char *buffer, char fmt, int precision) { + int decpt, sign, exp, pos; + char *digits = NULL; + char cvtbuf[80]; + int capexp = 0; + int magnitude; - if (fmt == 'G' || fmt == 'E') - { - capexp = 1; - fmt += 'a' - 'A'; + if (fmt == 'G' || fmt == 'E') { + capexp = 1; + fmt += 'a' - 'A'; + } + + if (fmt == 'g') { + digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); + magnitude = decpt - 1; + if (magnitude < -4 || magnitude > precision - 1) { + fmt = 'e'; + precision -= 1; + } else { + fmt = 'f'; + precision -= decpt; } + } - if (fmt == 'g') - { - digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); - magnitude = decpt - 1; - if (magnitude < -4 || magnitude > precision - 1) - { - fmt = 'e'; - precision -= 1; - } - else - { - fmt = 'f'; - precision -= decpt; - } - } + if (fmt == 'e') { + digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); - if (fmt == 'e') - { - digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); - - if (sign) - *buffer++ = '-'; - *buffer++ = *digits; - if (precision > 0) - *buffer++ = '.'; - ee_bufcpy(buffer, digits + 1, precision); - buffer += precision; - *buffer++ = capexp ? 'E' : 'e'; - - if (decpt == 0) - { - if (value == 0.0) - exp = 0; - else - exp = -1; - } - else - exp = decpt - 1; - - if (exp < 0) - { - *buffer++ = '-'; - exp = -exp; - } - else - *buffer++ = '+'; - - buffer[2] = (exp % 10) + '0'; - exp = exp / 10; - buffer[1] = (exp % 10) + '0'; - exp = exp / 10; - buffer[0] = (exp % 10) + '0'; - buffer += 3; - } - else if (fmt == 'f') - { - digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); - if (sign) - *buffer++ = '-'; - if (*digits) - { - if (decpt <= 0) - { - *buffer++ = '0'; - *buffer++ = '.'; - for (pos = 0; pos < -decpt; pos++) - *buffer++ = '0'; - while (*digits) - *buffer++ = *digits++; - } - else - { - pos = 0; - while (*digits) - { - if (pos++ == decpt) - *buffer++ = '.'; - *buffer++ = *digits++; - } - } - } - else - { - *buffer++ = '0'; - if (precision > 0) - { - *buffer++ = '.'; - for (pos = 0; pos < precision; pos++) - *buffer++ = '0'; - } - } - } - - *buffer = '\0'; -} - -static void -decimal_point(char *buffer) -{ - while (*buffer) - { - if (*buffer == '.') - return; - if (*buffer == 'e' || *buffer == 'E') - break; - buffer++; - } - - if (*buffer) - { - int n = strnlen(buffer, 256); - while (n > 0) - { - buffer[n + 1] = buffer[n]; - n--; - } - - *buffer = '.'; - } - else - { - *buffer++ = '.'; - *buffer = '\0'; - } -} - -static void -cropzeros(char *buffer) -{ - char *stop; - - while (*buffer && *buffer != '.') - buffer++; - if (*buffer++) - { - while (*buffer && *buffer != 'e' && *buffer != 'E') - buffer++; - stop = buffer--; - while (*buffer == '0') - buffer--; - if (*buffer == '.') - buffer--; - while (buffer != stop) - *++buffer = 0; - } -} - -static char * -flt(char *str, double num, int size, int precision, char fmt, int flags) -{ - char tmp[80]; - char c, sign; - int n, i; - - // Left align means no zero padding - if (flags & LEFT) - flags &= ~ZEROPAD; - - // Determine padding and sign char - c = (flags & ZEROPAD) ? '0' : ' '; - sign = 0; - if (flags & SIGN) - { - if (num < 0.0) - { - sign = '-'; - num = -num; - size--; - } - else if (flags & PLUS) - { - sign = '+'; - size--; - } - else if (flags & SPACE) - { - sign = ' '; - size--; - } - } - - // Compute the precision value - if (precision < 0) - precision = 6; // Default precision: 6 - - // Convert floating point number to text - parse_float(num, tmp, fmt, precision); - - if ((flags & HEX_PREP) && precision == 0) - decimal_point(tmp); - if (fmt == 'g' && !(flags & HEX_PREP)) - cropzeros(tmp); - - n = strnlen(tmp, 256); - - // Output number with alignment and padding - size -= n; - if (!(flags & (ZEROPAD | LEFT))) - while (size-- > 0) - *str++ = ' '; if (sign) - *str++ = sign; - if (!(flags & LEFT)) - while (size-- > 0) - *str++ = c; - for (i = 0; i < n; i++) - *str++ = tmp[i]; - while (size-- > 0) - *str++ = ' '; + *buffer++ = '-'; + *buffer++ = *digits; + if (precision > 0) + *buffer++ = '.'; + ee_bufcpy(buffer, digits + 1, precision); + buffer += precision; + *buffer++ = capexp ? 'E' : 'e'; - return str; + if (decpt == 0) { + if (value == 0.0) + exp = 0; + else + exp = -1; + } else + exp = decpt - 1; + + if (exp < 0) { + *buffer++ = '-'; + exp = -exp; + } else + *buffer++ = '+'; + + buffer[2] = (exp % 10) + '0'; + exp = exp / 10; + buffer[1] = (exp % 10) + '0'; + exp = exp / 10; + buffer[0] = (exp % 10) + '0'; + buffer += 3; + } else if (fmt == 'f') { + digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); + if (sign) + *buffer++ = '-'; + if (*digits) { + if (decpt <= 0) { + *buffer++ = '0'; + *buffer++ = '.'; + for (pos = 0; pos < -decpt; pos++) + *buffer++ = '0'; + while (*digits) + *buffer++ = *digits++; + } else { + pos = 0; + while (*digits) { + if (pos++ == decpt) + *buffer++ = '.'; + *buffer++ = *digits++; + } + } + } else { + *buffer++ = '0'; + if (precision > 0) { + *buffer++ = '.'; + for (pos = 0; pos < precision; pos++) + *buffer++ = '0'; + } + } + } + + *buffer = '\0'; +} + +static void decimal_point(char *buffer) { + while (*buffer) { + if (*buffer == '.') + return; + if (*buffer == 'e' || *buffer == 'E') + break; + buffer++; + } + + if (*buffer) { + int n = strnlen(buffer, 256); + while (n > 0) { + buffer[n + 1] = buffer[n]; + n--; + } + + *buffer = '.'; + } else { + *buffer++ = '.'; + *buffer = '\0'; + } +} + +static void cropzeros(char *buffer) { + char *stop; + + while (*buffer && *buffer != '.') + buffer++; + if (*buffer++) { + while (*buffer && *buffer != 'e' && *buffer != 'E') + buffer++; + stop = buffer--; + while (*buffer == '0') + buffer--; + if (*buffer == '.') + buffer--; + while (buffer != stop) + *++buffer = 0; + } +} + +static char *flt(char *str, double num, int size, int precision, char fmt, + int flags) { + char tmp[80]; + char c, sign; + int n, i; + + // Left align means no zero padding + if (flags & LEFT) + flags &= ~ZEROPAD; + + // Determine padding and sign char + c = (flags & ZEROPAD) ? '0' : ' '; + sign = 0; + if (flags & SIGN) { + if (num < 0.0) { + sign = '-'; + num = -num; + size--; + } else if (flags & PLUS) { + sign = '+'; + size--; + } else if (flags & SPACE) { + sign = ' '; + size--; + } + } + + // Compute the precision value + if (precision < 0) + precision = 6; // Default precision: 6 + + // Convert floating point number to text + parse_float(num, tmp, fmt, precision); + + if ((flags & HEX_PREP) && precision == 0) + decimal_point(tmp); + if (fmt == 'g' && !(flags & HEX_PREP)) + cropzeros(tmp); + + n = strnlen(tmp, 256); + + // Output number with alignment and padding + size -= n; + if (!(flags & (ZEROPAD | LEFT))) + while (size-- > 0) + *str++ = ' '; + if (sign) + *str++ = sign; + if (!(flags & LEFT)) + while (size-- > 0) + *str++ = c; + for (i = 0; i < n; i++) + *str++ = tmp[i]; + while (size-- > 0) + *str++ = ' '; + + return str; } #endif -static int -ee_vsprintf(char *buf, const char *fmt, va_list args) -{ - int len; - unsigned long num; - int i, base; - char * str; - char * s; +static int ee_vsprintf(char *buf, const char *fmt, va_list args) { + int len; + unsigned long num; + int i, base; + char *str; + char *s; - int flags; // Flags to number() + int flags; // Flags to number() - int field_width; // Width of output field - int precision; // Min. # of digits for integers; max number of chars for - // from string - int qualifier; // 'h', 'l', or 'L' for integer fields + int field_width; // Width of output field + int precision; // Min. # of digits for integers; max number of chars for + // from string + int qualifier; // 'h', 'l', or 'L' for integer fields - for (str = buf; *fmt; fmt++) - { - if (*fmt != '%') - { - *str++ = *fmt; - continue; - } + for (str = buf; *fmt; fmt++) { + if (*fmt != '%') { + *str++ = *fmt; + continue; + } - // Process flags - flags = 0; - repeat: - fmt++; // This also skips first '%' - switch (*fmt) - { - case '-': - flags |= LEFT; - goto repeat; - case '+': - flags |= PLUS; - goto repeat; - case ' ': - flags |= SPACE; - goto repeat; - case '#': - flags |= HEX_PREP; - goto repeat; - case '0': - flags |= ZEROPAD; - goto repeat; - } + // Process flags + flags = 0; + repeat: + fmt++; // This also skips first '%' + switch (*fmt) { + case '-': + flags |= LEFT; + goto repeat; + case '+': + flags |= PLUS; + goto repeat; + case ' ': + flags |= SPACE; + goto repeat; + case '#': + flags |= HEX_PREP; + goto repeat; + case '0': + flags |= ZEROPAD; + goto repeat; + } - // Get field width - field_width = -1; - if (is_digit(*fmt)) - field_width = skip_atoi(&fmt); - else if (*fmt == '*') - { - fmt++; - field_width = va_arg(args, int); - if (field_width < 0) - { - field_width = -field_width; - flags |= LEFT; - } - } + // Get field width + field_width = -1; + if (is_digit(*fmt)) + field_width = skip_atoi(&fmt); + else if (*fmt == '*') { + fmt++; + field_width = va_arg(args, int); + if (field_width < 0) { + field_width = -field_width; + flags |= LEFT; + } + } - // Get the precision - precision = -1; - if (*fmt == '.') - { - ++fmt; - if (is_digit(*fmt)) - precision = skip_atoi(&fmt); - else if (*fmt == '*') - { - ++fmt; - precision = va_arg(args, int); - } - if (precision < 0) - precision = 0; - } + // Get the precision + precision = -1; + if (*fmt == '.') { + ++fmt; + if (is_digit(*fmt)) + precision = skip_atoi(&fmt); + else if (*fmt == '*') { + ++fmt; + precision = va_arg(args, int); + } + if (precision < 0) + precision = 0; + } - // Get the conversion qualifier - qualifier = -1; - if (*fmt == 'l' || *fmt == 'L') - { - qualifier = *fmt; - fmt++; - } + // Get the conversion qualifier + qualifier = -1; + if (*fmt == 'l' || *fmt == 'L') { + qualifier = *fmt; + fmt++; + } - // Default base - base = 10; + // Default base + base = 10; - switch (*fmt) - { - case 'c': - if (!(flags & LEFT)) - while (--field_width > 0) - *str++ = ' '; - *str++ = (unsigned char)va_arg(args, int); - while (--field_width > 0) - *str++ = ' '; - continue; + switch (*fmt) { + case 'c': + if (!(flags & LEFT)) + while (--field_width > 0) + *str++ = ' '; + *str++ = (unsigned char)va_arg(args, int); + while (--field_width > 0) + *str++ = ' '; + continue; - case 's': - s = va_arg(args, char *); - if (!s) - s = ""; - len = strnlen(s, precision); - if (!(flags & LEFT)) - while (len < field_width--) - *str++ = ' '; - for (i = 0; i < len; ++i) - *str++ = *s++; - while (len < field_width--) - *str++ = ' '; - continue; + case 's': + s = va_arg(args, char *); + if (!s) + s = ""; + len = strnlen(s, precision); + if (!(flags & LEFT)) + while (len < field_width--) + *str++ = ' '; + for (i = 0; i < len; ++i) + *str++ = *s++; + while (len < field_width--) + *str++ = ' '; + continue; - case 'p': - if (field_width == -1) - { - field_width = 2 * sizeof(void *); - flags |= ZEROPAD; - } - str = number(str, - (unsigned long)va_arg(args, void *), - 16, - field_width, - precision, - flags); - continue; + case 'p': + if (field_width == -1) { + field_width = 2 * sizeof(void *); + flags |= ZEROPAD; + } + str = number(str, (unsigned long)va_arg(args, void *), 16, field_width, + precision, flags); + continue; - case 'A': - flags |= UPPERCASE; + case 'A': + flags |= UPPERCASE; - case 'a': - if (qualifier == 'l') - str = eaddr(str, - va_arg(args, unsigned char *), - field_width, - precision, - flags); - else - str = iaddr(str, - va_arg(args, unsigned char *), - field_width, - precision, - flags); - continue; + case 'a': + if (qualifier == 'l') + str = eaddr(str, va_arg(args, unsigned char *), field_width, precision, + flags); + else + str = iaddr(str, va_arg(args, unsigned char *), field_width, precision, + flags); + continue; - // Integer number formats - set up the flags and "break" - case 'o': - base = 8; - break; + // Integer number formats - set up the flags and "break" + case 'o': + base = 8; + break; - case 'X': - flags |= UPPERCASE; + case 'X': + flags |= UPPERCASE; - case 'x': - base = 16; - break; + case 'x': + base = 16; + break; - case 'd': - case 'i': - flags |= SIGN; + case 'd': + case 'i': + flags |= SIGN; - case 'u': - break; + case 'u': + break; #if HAS_FLOAT - case 'f': - str = flt(str, - va_arg(args, double), - field_width, - precision, - *fmt, - flags | SIGN); - continue; + case 'f': + str = flt(str, va_arg(args, double), field_width, precision, *fmt, + flags | SIGN); + continue; #endif - default: - if (*fmt != '%') - *str++ = '%'; - if (*fmt) - *str++ = *fmt; - else - --fmt; - continue; - } - - if (qualifier == 'l') - num = va_arg(args, unsigned long); - else if (flags & SIGN) - num = va_arg(args, int); - else - num = va_arg(args, unsigned int); - - str = number(str, num, base, field_width, precision, flags); + default: + if (*fmt != '%') + *str++ = '%'; + if (*fmt) + *str++ = *fmt; + else + --fmt; + continue; } - *str = '\0'; - return str - buf; + if (qualifier == 'l') + num = va_arg(args, unsigned long); + else if (flags & SIGN) + num = va_arg(args, int); + else + num = va_arg(args, unsigned int); + + str = number(str, num, base, field_width, precision, flags); + } + + *str = '\0'; + return str - buf; } #include -void -uart_send_char(char c) -{ +void uart_send_char(char c) { + write(STDOUT_FILENO, &c, 1); // write or puts ?? + /* #if defined(BOARD_ehrenberg) - while (get_uart_rx_tx_reg_tx_free(uart)==0) ; - uart_write(uart, c); - if (c == '\n') { - while (get_uart_rx_tx_reg_tx_free(uart)==0) ; - uart_write(uart, '\r'); - } +while (get_uart_rx_tx_reg_tx_free(uart) == 0) +; +uart_write(uart, c); +if (c == '\n') { +while (get_uart_rx_tx_reg_tx_free(uart) == 0) + ; +uart_write(uart, '\r'); +} #elif defined(BOARD_iss) - *((uint32_t*) 0xFFFF0000) = c; +*((uint32_t *)0xFFFF0000) = c; #else - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = c; - if (c == '\n') { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = '\r'; - } +while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) +; +UART0_REG(UART_REG_TXFIFO) = c; +if (c == '\n') { +while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) + ; +UART0_REG(UART_REG_TXFIFO) = '\r'; +} #endif + +*/ } -int -ee_printf(const char *fmt, ...) -{ - char buf[1024], *p; - va_list args; - int n = 0; +int ee_printf(const char *fmt, ...) { + char buf[1024], *p; + va_list args; + int n = 0; - va_start(args, fmt); - ee_vsprintf(buf, fmt, args); - va_end(args); - p = buf; - while (*p) - { - uart_send_char(*p); - n++; - p++; - } + va_start(args, fmt); + ee_vsprintf(buf, fmt, args); + va_end(args); + p = buf; + while (*p) { + uart_send_char(*p); + n++; + p++; + } - return n; + return n; } From 3def42153f95a6404652c3d8963e1ff2c2f552b9 Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Fri, 28 Feb 2025 14:03:21 +0100 Subject: [PATCH 08/22] adds preset,json --- benchmarks/coremark/CMakePresets.json | 27 ++++++++++++++++++++++++++ benchmarks/dhrystone/CMakePresets.json | 27 ++++++++++++++++++++++++++ hello-world/CMakePresets.json | 27 ++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 benchmarks/coremark/CMakePresets.json create mode 100644 benchmarks/dhrystone/CMakePresets.json create mode 100644 hello-world/CMakePresets.json diff --git a/benchmarks/coremark/CMakePresets.json b/benchmarks/coremark/CMakePresets.json new file mode 100644 index 0000000..1814549 --- /dev/null +++ b/benchmarks/coremark/CMakePresets.json @@ -0,0 +1,27 @@ +{ + "version": 3, + "vendor": { + "conan": {} + }, + "cmakeMinimumRequired": { + "major": 3, + "minor": 24, + "patch": 0 + }, + "configurePresets": [ + { + "name": "dbg", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" + } + }, + { + "name": "rel", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" + } + } + ] +} \ No newline at end of file diff --git a/benchmarks/dhrystone/CMakePresets.json b/benchmarks/dhrystone/CMakePresets.json new file mode 100644 index 0000000..1814549 --- /dev/null +++ b/benchmarks/dhrystone/CMakePresets.json @@ -0,0 +1,27 @@ +{ + "version": 3, + "vendor": { + "conan": {} + }, + "cmakeMinimumRequired": { + "major": 3, + "minor": 24, + "patch": 0 + }, + "configurePresets": [ + { + "name": "dbg", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" + } + }, + { + "name": "rel", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" + } + } + ] +} \ No newline at end of file diff --git a/hello-world/CMakePresets.json b/hello-world/CMakePresets.json new file mode 100644 index 0000000..1814549 --- /dev/null +++ b/hello-world/CMakePresets.json @@ -0,0 +1,27 @@ +{ + "version": 3, + "vendor": { + "conan": {} + }, + "cmakeMinimumRequired": { + "major": 3, + "minor": 24, + "patch": 0 + }, + "configurePresets": [ + { + "name": "dbg", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" + } + }, + { + "name": "rel", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" + } + } + ] +} \ No newline at end of file From 727fdcb7bbe2ad7af7e2e05b58e61769a973dea0 Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Tue, 11 Mar 2025 11:45:40 +0100 Subject: [PATCH 09/22] adds examples of write/tohost usage --- hello-world/hello.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/hello-world/hello.c b/hello-world/hello.c index 219ed8a..29a9145 100644 --- a/hello-world/hello.c +++ b/hello-world/hello.c @@ -1,24 +1,31 @@ #include #include +#include #include -#include "platform.h" #include "encoding.h" +#include "platform.h" +#include -int factorial(int i){ - - volatile int result = 1; - for (int ii = 1; ii <= i; ii++) { - result = result * ii; - } - return result; +int factorial(int i) { + volatile int result = 1; + for (int ii = 1; ii <= i; ii++) { + result = result * ii; + } + return result; } +extern volatile uint32_t tohost; +extern volatile uint32_t fromhost; +int main() { + volatile int result = factorial(10); + char string[] = "hello world with write"; -int main() -{ - volatile int result = factorial (10); - printf("Factorial is %d\n", result); - printf("End of execution"); - return 0; + write(STDOUT_FILENO, string, sizeof(string)); + + uint64_t payload[4] = {64, 0, (uintptr_t)string, (strlen(string) + 1)}; + // tohost = (uint32_t)payload; + printf("Factorial is %d", result); + // printf("End of execution"); + return 0; } From eee14af4788bc57b24694cad433f15afb4bb3907 Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Tue, 11 Mar 2025 11:46:23 +0100 Subject: [PATCH 10/22] updates bsp --- bare-metal-bsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bare-metal-bsp b/bare-metal-bsp index fbe6560..3042e0e 160000 --- a/bare-metal-bsp +++ b/bare-metal-bsp @@ -1 +1 @@ -Subproject commit fbe6560e79b3e22f08faba55ba38180f580a201b +Subproject commit 3042e0e1243ff816fa0bc3a24d71ae4501e1ca17 From 884d445cb97c2d43bbe4afd8acddcfdc3a5d44c7 Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Tue, 11 Mar 2025 11:49:26 +0100 Subject: [PATCH 11/22] adds target. map generation to target_link_opinions --- benchmarks/coremark/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmarks/coremark/CMakeLists.txt b/benchmarks/coremark/CMakeLists.txt index 745bd68..85c98d3 100644 --- a/benchmarks/coremark/CMakeLists.txt +++ b/benchmarks/coremark/CMakeLists.txt @@ -27,6 +27,7 @@ target_compile_definitions(${TARGET} PRIVATE PERFORMANCE_RUN=1 CLOCKS_PER_SEC=10 set(BOARD "iss" CACHE STRING "Target board") add_subdirectory(../../bare-metal-bsp bsp) target_link_libraries(${TARGET} PRIVATE bsp) +target_link_options(${TARGET} PRIVATE -Wl,-Map=${TARGET}.map) include(CMakePrintHelpers) cmake_print_properties(TARGETS ${TARGET} PROPERTIES COMPILE_DEFINITIONS COMPILE_OPTIONS LINK_OPTIONS INTERFACE_LINK_OPTIONS) From 686d01ab3edf53a1075199b8f59a437460d52ef1 Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Fri, 14 Mar 2025 14:20:53 +0100 Subject: [PATCH 12/22] adds extern to tohost/fromhost to avoid error during BSS initialization --- benchmarks/coremark/core_portme.c | 149 +++++++++++++----------------- 1 file changed, 62 insertions(+), 87 deletions(-) diff --git a/benchmarks/coremark/core_portme.c b/benchmarks/coremark/core_portme.c index e986425..7f1119e 100644 --- a/benchmarks/coremark/core_portme.c +++ b/benchmarks/coremark/core_portme.c @@ -15,55 +15,54 @@ limitations under the License. Original Author: Shay Gal-on */ -#include "coremark.h" #include "core_portme.h" -//Read cycle CSR -unsigned long long _read_cycle() -{ - unsigned long long result; - unsigned long lower; - unsigned long upper1; - unsigned long upper2; +#include "coremark.h" +// Read cycle CSR +unsigned long long _read_cycle() { + unsigned long long result; + unsigned long lower; + unsigned long upper1; + unsigned long upper2; - asm volatile ( - "repeat_cycle_%=: csrr %0, cycleh;\n" - " csrr %1, cycle;\n" - " csrr %2, cycleh;\n" - " bne %0, %2, repeat_cycle_%=;\n" - : "=r" (upper1),"=r" (lower),"=r" (upper2) // Outputs : temp variable for load result - : - : - ); - *(unsigned long *)(&result) = lower; - *((unsigned long *)(&result)+1) = upper1; + asm volatile("repeat_cycle_%=: csrr %0, cycleh;\n" + " csrr %1, cycle;\n" + " csrr %2, cycleh;\n" + " bne %0, %2, repeat_cycle_%=;\n" + : "=r"(upper1), "=r"(lower), + "=r"(upper2) // Outputs : temp variable for load result + : + :); + *(unsigned long *)(&result) = lower; + *((unsigned long *)(&result) + 1) = upper1; - return result; + return result; } -volatile int tohost; -volatile int fromhost; +extern volatile int tohost; +extern volatile int fromhost; -void exit(int n){ - tohost = 0x1; - for (;;); +void exit(int n) { + tohost = 0x1; + for (;;) + ; } -void __libc_init_array (void) { -/* - size_t count; - size_t i; - count = __preinit_array_end - __preinit_array_start; - for (i = 0; i < count; i++) - __preinit_array_start[i] (); +void __libc_init_array(void) { + /* + size_t count; + size_t i; + count = __preinit_array_end - __preinit_array_start; + for (i = 0; i < count; i++) + __preinit_array_start[i] (); -#ifdef HAVE_INIT_FINI - _init (); -#endif + #ifdef HAVE_INIT_FINI + _init (); + #endif - count = __init_array_end - __init_array_start; - for (i = 0; i < count; i++) - __init_array_start[i] (); -*/ + count = __init_array_end - __init_array_start; + for (i = 0; i < count; i++) + __init_array_start[i] (); + */ } #if VALIDATION_RUN volatile ee_s32 seed1_volatile = 0x3415; @@ -89,10 +88,7 @@ volatile ee_s32 seed5_volatile = 0; time.h and windows.h definitions included. */ CORETIMETYPE -barebones_clock() -{ - return (CORETIMETYPE)_read_cycle(); -} +barebones_clock() { return (CORETIMETYPE)_read_cycle(); } /* Define : TIMER_RES_DIVIDER Divider to trade off timer resolution and total time that can be measured. @@ -101,11 +97,11 @@ barebones_clock() does not occur. If there are issues with the return value overflowing, increase this value. */ -#define GETMYTIME(_t) (*_t = barebones_clock()) -#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) -#define TIMER_RES_DIVIDER 1 +#define GETMYTIME(_t) (*_t = barebones_clock()) +#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) +#define TIMER_RES_DIVIDER 1 #define SAMPLE_TIME_IMPLEMENTATION 1 -#define EE_TICKS_PER_SEC (CLOCKS_PER_SEC / TIMER_RES_DIVIDER) +#define EE_TICKS_PER_SEC (CLOCKS_PER_SEC / TIMER_RES_DIVIDER) /** Define Host specific (POSIX), or target specific global time variables. */ static CORETIMETYPE start_time_val, stop_time_val; @@ -118,11 +114,7 @@ static CORETIMETYPE start_time_val, stop_time_val; example code) or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. */ -void -start_time(void) -{ - GETMYTIME(&start_time_val); -} +void start_time(void) { GETMYTIME(&start_time_val); } /* Function : stop_time This function will be called right after ending the timed portion of the benchmark. @@ -131,11 +123,7 @@ start_time(void) example code) or other system parameters - e.g. reading the current value of cpu cycles counter. */ -void -stop_time(void) -{ - GETMYTIME(&stop_time_val); -} +void stop_time(void) { GETMYTIME(&stop_time_val); } /* Function : get_time Return an abstract "ticks" number that signifies time on the system. @@ -146,11 +134,9 @@ stop_time(void) controlled by */ CORE_TICKS -get_time(void) -{ - CORE_TICKS elapsed - = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; +get_time(void) { + CORE_TICKS elapsed = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; } /* Function : time_in_secs Convert the value returned by get_time to seconds. @@ -159,11 +145,9 @@ get_time(void) floating point. Default implementation implemented by the EE_TICKS_PER_SEC macro above. */ -secs_ret -time_in_secs(CORE_TICKS ticks) -{ - secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; } ee_u32 default_num_contexts = 1; @@ -172,27 +156,18 @@ ee_u32 default_num_contexts = 1; Target specific initialization code Test for some common mistakes. */ -void -portable_init(core_portable *p, int *argc, char *argv[]) -{ - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) - { - ee_printf( - "ERROR! Please define ee_ptr_int to a type that holds a " - "pointer!\n"); - } - if (sizeof(ee_u32) != 4) - { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } - p->portable_id = 1; - ee_printf("portable_init finished.\n"); +void portable_init(core_portable *p, int *argc, char *argv[]) { + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a " + "pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } + p->portable_id = 1; + ee_printf("portable_init finished.\n"); } /* Function : portable_fini Target specific final code */ -void -portable_fini(core_portable *p) -{ - p->portable_id = 0; -} +void portable_fini(core_portable *p) { p->portable_id = 0; } From e88c1148fb6de21fb77580d68f68abea547223a9 Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Fri, 14 Mar 2025 14:26:49 +0100 Subject: [PATCH 13/22] removes default release build --- benchmarks/coremark/CMakeLists.txt | 7 +++++-- benchmarks/dhrystone/CMakeLists.txt | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/benchmarks/coremark/CMakeLists.txt b/benchmarks/coremark/CMakeLists.txt index 85c98d3..05c75a1 100644 --- a/benchmarks/coremark/CMakeLists.txt +++ b/benchmarks/coremark/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.21) project(coremark C) set(TARGET coremark) -set(CMAKE_BUILD_TYPE Release) +#set(CMAKE_BUILD_TYPE Release) @@ -21,7 +21,7 @@ set(SOURCES # Create executable add_executable(coremark ${SOURCES}) target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/cm) -target_compile_options(${TARGET} PRIVATE -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition ) +target_compile_options(${TARGET} PRIVATE -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition ) target_compile_definitions(${TARGET} PRIVATE PERFORMANCE_RUN=1 CLOCKS_PER_SEC=10000000 FLAGS_STR="" PERFORMANCE_RUN=1 CLOCKS_PER_SEC=10000000 ITERATIONS=600) set(BOARD "iss" CACHE STRING "Target board") @@ -32,6 +32,9 @@ target_link_options(${TARGET} PRIVATE -Wl,-Map=${TARGET}.map) include(CMakePrintHelpers) cmake_print_properties(TARGETS ${TARGET} PROPERTIES COMPILE_DEFINITIONS COMPILE_OPTIONS LINK_OPTIONS INTERFACE_LINK_OPTIONS) +#message(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}") +#message(STATUS "CMAKE_C_FLAGS = ${CMAKE_C_FLAGS}") + add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${CMAKE_OBJDUMP} -S ${TARGET}.elf > ${TARGET}.dis COMMENT "Creating disassembly for ${TARGET}") diff --git a/benchmarks/dhrystone/CMakeLists.txt b/benchmarks/dhrystone/CMakeLists.txt index 4d86a66..761b77f 100644 --- a/benchmarks/dhrystone/CMakeLists.txt +++ b/benchmarks/dhrystone/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.21) project(dhrystone C) set(TARGET dhrystone) -set(CMAKE_BUILD_TYPE Release) + set(ITERATIONS 50000) # 20000 for TGC add_executable(${TARGET} dhry_1.c dhry_2.c dhry_stubs.c) From c6bfaf05464e7dd897f4c0051fa01fa692f0c89c Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Fri, 14 Mar 2025 17:53:49 +0100 Subject: [PATCH 14/22] adds volatile to array passed to tohost and updates bsp submodule --- bare-metal-bsp | 2 +- hello-world/hello.c | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/bare-metal-bsp b/bare-metal-bsp index 3042e0e..ada4881 160000 --- a/bare-metal-bsp +++ b/bare-metal-bsp @@ -1 +1 @@ -Subproject commit 3042e0e1243ff816fa0bc3a24d71ae4501e1ca17 +Subproject commit ada4881d335e079b1ea655461e03e1e6fd90d63f diff --git a/hello-world/hello.c b/hello-world/hello.c index 29a9145..399a95e 100644 --- a/hello-world/hello.c +++ b/hello-world/hello.c @@ -19,13 +19,15 @@ extern volatile uint32_t tohost; extern volatile uint32_t fromhost; int main() { volatile int result = factorial(10); - char string[] = "hello world with write"; + volatile char string[] = "hello world with write in hello"; + + volatile uint64_t payload[4] = {64, 0, (uintptr_t)string, + (strlen(string) + 1)}; + tohost = (uint32_t)payload; write(STDOUT_FILENO, string, sizeof(string)); - uint64_t payload[4] = {64, 0, (uintptr_t)string, (strlen(string) + 1)}; - // tohost = (uint32_t)payload; printf("Factorial is %d", result); - // printf("End of execution"); + // printf("End of execution"); return 0; } From 658ffbb405b795bcc2f9ce9d258a7e2f67220b39 Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Fri, 21 Mar 2025 16:07:17 +0100 Subject: [PATCH 15/22] adds map generation and updates bsp --- bare-metal-bsp | 2 +- benchmarks/dhrystone/CMakeLists.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/bare-metal-bsp b/bare-metal-bsp index ada4881..7d55172 160000 --- a/bare-metal-bsp +++ b/bare-metal-bsp @@ -1 +1 @@ -Subproject commit ada4881d335e079b1ea655461e03e1e6fd90d63f +Subproject commit 7d55172d51290ab1e9d36d40c600da0d7a386b69 diff --git a/benchmarks/dhrystone/CMakeLists.txt b/benchmarks/dhrystone/CMakeLists.txt index 761b77f..e27f81d 100644 --- a/benchmarks/dhrystone/CMakeLists.txt +++ b/benchmarks/dhrystone/CMakeLists.txt @@ -13,6 +13,7 @@ set(BOARD "iss" CACHE STRING "Target board") add_subdirectory(../../bare-metal-bsp bsp) target_link_libraries(${TARGET} PRIVATE bsp) target_link_options(${TARGET} PRIVATE LINKER:--wrap=scanf) +target_link_options(${TARGET} PRIVATE -Wl,-Map=${TARGET}.map) include(CMakePrintHelpers) cmake_print_properties(TARGETS ${TARGET} PROPERTIES COMPILE_DEFINITIONS COMPILE_OPTIONS LINK_OPTIONS INTERFACE_LINK_OPTIONS) From 36404dd7e0a67cc221eb7838697feb898426dfdc Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Fri, 11 Apr 2025 15:41:29 +0200 Subject: [PATCH 16/22] adds -mcmodel=medany and map generation;updaes bsp --- bare-metal-bsp | 2 +- hello-world/CMakeLists.txt | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/bare-metal-bsp b/bare-metal-bsp index 7d55172..db3a2d6 160000 --- a/bare-metal-bsp +++ b/bare-metal-bsp @@ -1 +1 @@ -Subproject commit 7d55172d51290ab1e9d36d40c600da0d7a386b69 +Subproject commit db3a2d68d6c7c73e32d4e2e0aae3a10e7de86576 diff --git a/hello-world/CMakeLists.txt b/hello-world/CMakeLists.txt index 51e1a58..da4b83b 100644 --- a/hello-world/CMakeLists.txt +++ b/hello-world/CMakeLists.txt @@ -1,11 +1,24 @@ cmake_minimum_required(VERSION 3.21) project(hello-world C) set(TARGET hello) +option(HAVE_NO_INIT_FINI "Enable NO_INIT_FINI" OFF) + +if(HAVE_NO_INIT_FINI) + #if HAVE_NO_INIT_FINI is ON + add_definitions(-DHAVE_NO_INIT_FINI) +endif() + + add_executable(${TARGET} hello.c) +target_compile_options(${TARGET} PRIVATE -mcmodel=medany) +#target_compile_options(${TARGET} PRIVATE -mcmodel=medany -fPIC) + set(BOARD "iss" CACHE STRING "Target board") +message(STATUS, " board ${BOARD}") add_subdirectory(../bare-metal-bsp bsp) target_link_libraries(${TARGET} PRIVATE bsp) +target_link_options(${TARGET} PRIVATE -Wl,-Map=${TARGET}.map) add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${CMAKE_OBJDUMP} -S ${TARGET}.elf > ${TARGET}.dis From a5825bfd67f6e48563c14dcabf9d07d0d4bbe7d1 Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Fri, 11 Apr 2025 15:44:52 +0200 Subject: [PATCH 17/22] updates preset for 64bit --- hello-world/CMakePresets.json | 47 +++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/hello-world/CMakePresets.json b/hello-world/CMakePresets.json index 1814549..345cd99 100644 --- a/hello-world/CMakePresets.json +++ b/hello-world/CMakePresets.json @@ -10,14 +10,57 @@ }, "configurePresets": [ { - "name": "dbg", + "name": "debug", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" } }, { - "name": "rel", + "name": "debug_moon", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "BOARD": "moonlight", + "HAVE_NO_INIT_FINI": "ON", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" + } + }, + { + "name": "debug_tgc", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "BOARD": "tgc_vp", + "HAVE_NO_INIT_FINI": "ON", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" + } + }, + { + "name": "debug_64", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv64gc.cmake" + } + }, + { + "name": "debug_64_moon", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "BOARD": "moonlight", + "HAVE_NO_INIT_FINI": "ON", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv64gc.cmake" + } + }, + { + "name": "debug_64_tgc", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "BOARD": "tgc_vp", + "HAVE_NO_INIT_FINI": "ON", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv64gc.cmake" + } + }, + { + "name": "release", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release", "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" From 071d9cc8ebe555067dd2c73a2ae94d22600b8673 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 14 Apr 2025 17:01:19 +0200 Subject: [PATCH 18/22] updates bsp and cleans hello.c --- bare-metal-bsp | 2 +- hello-world/hello.c | 21 ++++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/bare-metal-bsp b/bare-metal-bsp index db3a2d6..e0807b8 160000 --- a/bare-metal-bsp +++ b/bare-metal-bsp @@ -1 +1 @@ -Subproject commit db3a2d68d6c7c73e32d4e2e0aae3a10e7de86576 +Subproject commit e0807b8cddb07c2eb91dfe0b230d3121897b7a96 diff --git a/hello-world/hello.c b/hello-world/hello.c index 399a95e..2d574b8 100644 --- a/hello-world/hello.c +++ b/hello-world/hello.c @@ -15,19 +15,22 @@ int factorial(int i) { } return result; } -extern volatile uint32_t tohost; -extern volatile uint32_t fromhost; -int main() { - volatile int result = factorial(10); - volatile char string[] = "hello world with write in hello"; - volatile uint64_t payload[4] = {64, 0, (uintptr_t)string, - (strlen(string) + 1)}; - tohost = (uint32_t)payload; +void write_tohost(char* string) { + volatile uint64_t payload[4] = {64, 0, (uintptr_t)string, + (strlen(string) + 1)}; + tohost = (uintptr_t)payload; +} + +int main() { + char string[] = "hello world with write in hello"; + + write_tohost(string); write(STDOUT_FILENO, string, sizeof(string)); + int result = factorial(10); printf("Factorial is %d", result); - // printf("End of execution"); + return 0; } From 9909769c0ab5daf78152717e935674c208d24fd0 Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Tue, 15 Apr 2025 12:26:32 +0200 Subject: [PATCH 19/22] updates to make 64bit compiling --- bare-metal-bsp | 2 +- benchmarks/coremark/CMakeLists.txt | 9 ++++- benchmarks/coremark/CMakePresets.json | 47 ++++++++++++++++++++++++-- benchmarks/dhrystone/CMakeLists.txt | 11 ++++++ benchmarks/dhrystone/CMakePresets.json | 47 ++++++++++++++++++++++++-- hello-world/hello.c | 9 ++--- 6 files changed, 115 insertions(+), 10 deletions(-) diff --git a/bare-metal-bsp b/bare-metal-bsp index e0807b8..853d1c3 160000 --- a/bare-metal-bsp +++ b/bare-metal-bsp @@ -1 +1 @@ -Subproject commit e0807b8cddb07c2eb91dfe0b230d3121897b7a96 +Subproject commit 853d1c33ecab1a7096bed7c3f94893d0a27437f3 diff --git a/benchmarks/coremark/CMakeLists.txt b/benchmarks/coremark/CMakeLists.txt index 05c75a1..16981bd 100644 --- a/benchmarks/coremark/CMakeLists.txt +++ b/benchmarks/coremark/CMakeLists.txt @@ -3,6 +3,12 @@ project(coremark C) set(TARGET coremark) #set(CMAKE_BUILD_TYPE Release) +option(HAVE_NO_INIT_FINI "Enable NO_INIT_FINI" OFF) + +if(HAVE_NO_INIT_FINI) + #if HAVE_NO_INIT_FINI is ON + add_definitions(-DHAVE_NO_INIT_FINI) +endif() # Source files @@ -21,7 +27,8 @@ set(SOURCES # Create executable add_executable(coremark ${SOURCES}) target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/cm) -target_compile_options(${TARGET} PRIVATE -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition ) +target_compile_options(${TARGET} PRIVATE -mcmodel=medany) +target_compile_options(${TARGET} PRIVATE -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-builtin-strnlen -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition ) target_compile_definitions(${TARGET} PRIVATE PERFORMANCE_RUN=1 CLOCKS_PER_SEC=10000000 FLAGS_STR="" PERFORMANCE_RUN=1 CLOCKS_PER_SEC=10000000 ITERATIONS=600) set(BOARD "iss" CACHE STRING "Target board") diff --git a/benchmarks/coremark/CMakePresets.json b/benchmarks/coremark/CMakePresets.json index 1814549..345cd99 100644 --- a/benchmarks/coremark/CMakePresets.json +++ b/benchmarks/coremark/CMakePresets.json @@ -10,14 +10,57 @@ }, "configurePresets": [ { - "name": "dbg", + "name": "debug", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" } }, { - "name": "rel", + "name": "debug_moon", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "BOARD": "moonlight", + "HAVE_NO_INIT_FINI": "ON", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" + } + }, + { + "name": "debug_tgc", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "BOARD": "tgc_vp", + "HAVE_NO_INIT_FINI": "ON", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" + } + }, + { + "name": "debug_64", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv64gc.cmake" + } + }, + { + "name": "debug_64_moon", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "BOARD": "moonlight", + "HAVE_NO_INIT_FINI": "ON", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv64gc.cmake" + } + }, + { + "name": "debug_64_tgc", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "BOARD": "tgc_vp", + "HAVE_NO_INIT_FINI": "ON", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv64gc.cmake" + } + }, + { + "name": "release", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release", "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" diff --git a/benchmarks/dhrystone/CMakeLists.txt b/benchmarks/dhrystone/CMakeLists.txt index e27f81d..3854668 100644 --- a/benchmarks/dhrystone/CMakeLists.txt +++ b/benchmarks/dhrystone/CMakeLists.txt @@ -2,9 +2,18 @@ cmake_minimum_required(VERSION 3.21) project(dhrystone C) set(TARGET dhrystone) +option(HAVE_NO_INIT_FINI "Enable NO_INIT_FINI" OFF) + +if(HAVE_NO_INIT_FINI) + #if HAVE_NO_INIT_FINI is ON + add_definitions(-DHAVE_NO_INIT_FINI) +endif() + set(ITERATIONS 50000) # 20000 for TGC add_executable(${TARGET} dhry_1.c dhry_2.c dhry_stubs.c) +target_compile_options(${TARGET} PRIVATE -mcmodel=medany) +#target_compile_options(${TARGET} PRIVATE -mcmodel=medany -fPIC) target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR}) target_compile_options(${TARGET} PRIVATE -fno-inline -fno-builtin-printf -fno-common -Wno-implicit -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las) target_compile_definitions(${TARGET} PRIVATE ITERATIONS=${ITERATIONS} HZ=32768 TIME NO_INIT) @@ -13,6 +22,8 @@ set(BOARD "iss" CACHE STRING "Target board") add_subdirectory(../../bare-metal-bsp bsp) target_link_libraries(${TARGET} PRIVATE bsp) target_link_options(${TARGET} PRIVATE LINKER:--wrap=scanf) +#target_link_options(${TARGET} PRIVATE LINKER:--wrap=scanf -Wl,--no-gc-sections) + target_link_options(${TARGET} PRIVATE -Wl,-Map=${TARGET}.map) include(CMakePrintHelpers) cmake_print_properties(TARGETS ${TARGET} PROPERTIES COMPILE_DEFINITIONS COMPILE_OPTIONS LINK_OPTIONS INTERFACE_LINK_OPTIONS) diff --git a/benchmarks/dhrystone/CMakePresets.json b/benchmarks/dhrystone/CMakePresets.json index 1814549..345cd99 100644 --- a/benchmarks/dhrystone/CMakePresets.json +++ b/benchmarks/dhrystone/CMakePresets.json @@ -10,14 +10,57 @@ }, "configurePresets": [ { - "name": "dbg", + "name": "debug", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" } }, { - "name": "rel", + "name": "debug_moon", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "BOARD": "moonlight", + "HAVE_NO_INIT_FINI": "ON", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" + } + }, + { + "name": "debug_tgc", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "BOARD": "tgc_vp", + "HAVE_NO_INIT_FINI": "ON", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" + } + }, + { + "name": "debug_64", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv64gc.cmake" + } + }, + { + "name": "debug_64_moon", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "BOARD": "moonlight", + "HAVE_NO_INIT_FINI": "ON", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv64gc.cmake" + } + }, + { + "name": "debug_64_tgc", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "BOARD": "tgc_vp", + "HAVE_NO_INIT_FINI": "ON", + "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv64gc.cmake" + } + }, + { + "name": "release", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release", "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" diff --git a/hello-world/hello.c b/hello-world/hello.c index 2d574b8..090d3bd 100644 --- a/hello-world/hello.c +++ b/hello-world/hello.c @@ -15,11 +15,12 @@ int factorial(int i) { } return result; } +extern volatile uintptr_t tohost; -void write_tohost(char* string) { - volatile uint64_t payload[4] = {64, 0, (uintptr_t)string, - (strlen(string) + 1)}; - tohost = (uintptr_t)payload; +void write_tohost(char *string) { + volatile uint64_t payload[4] = {64, 0, (uintptr_t)string, + (strlen(string) + 1)}; + tohost = (uintptr_t)payload; } int main() { From 8b3dc54e5cf28037922720e9b60d183fce23fced Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Tue, 15 Apr 2025 12:32:09 +0200 Subject: [PATCH 20/22] uses write_hex() in exit instead of tohost=0x1 --- benchmarks/coremark/core_portme.c | 10 +++++++--- benchmarks/dhrystone/dhry_stubs.c | 21 +++++++++------------ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/benchmarks/coremark/core_portme.c b/benchmarks/coremark/core_portme.c index 7f1119e..41a7714 100644 --- a/benchmarks/coremark/core_portme.c +++ b/benchmarks/coremark/core_portme.c @@ -17,6 +17,7 @@ Original Author: Shay Gal-on */ #include "core_portme.h" #include "coremark.h" +#include // Read cycle CSR unsigned long long _read_cycle() { unsigned long long result; @@ -38,11 +39,14 @@ unsigned long long _read_cycle() { return result; } -extern volatile int tohost; -extern volatile int fromhost; +// extern volatile int tohost; +// extern volatile int fromhost; + +void write_hex(int fd, uint32_t hex); void exit(int n) { - tohost = 0x1; + write_hex(STDERR_FILENO, 1); + // tohost = 0x1; for (;;) ; } diff --git a/benchmarks/dhrystone/dhry_stubs.c b/benchmarks/dhrystone/dhry_stubs.c index a3e7b7c..3a327e2 100644 --- a/benchmarks/dhrystone/dhry_stubs.c +++ b/benchmarks/dhrystone/dhry_stubs.c @@ -1,4 +1,5 @@ #include "platform.h" +#include #ifndef ITERATIONS #define ITERATIONS 20000 #endif @@ -6,20 +7,16 @@ /* The functions in this file are only meant to support Dhrystone on an * embedded RV32 system and are obviously incorrect in general. */ -long time(void) -{ - return get_timer_value(); -} +long time(void) { return get_timer_value(); } // set the number of dhrystone iterations -void __wrap_scanf(const char* fmt, int* n) -{ - *n = ITERATIONS; -} +void __wrap_scanf(const char *fmt, int *n) { *n = ITERATIONS; } -extern volatile uint32_t tohost; +// extern volatile uint64_t tohost; -void exit(int n){ - tohost = 0x1; - for (;;); +void exit(int n) { + // tohost = 0x1; + write_hex(STDERR_FILENO, 1); + for (;;) + ; } From bccfc67926e6e49a118a747e77a33b7d4b20a1d7 Mon Sep 17 00:00:00 2001 From: Hongyu Liu Date: Tue, 15 Apr 2025 14:33:03 +0200 Subject: [PATCH 21/22] removes unused code in cmake --- CMakeLists.txt | 172 ---------------------------- bare-metal-bsp | 2 +- benchmarks/coremark/CMakeLists.txt | 1 - benchmarks/dhrystone/CMakeLists.txt | 2 - hello-world/CMakeLists.txt | 6 +- 5 files changed, 3 insertions(+), 180 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f382307..e69de29 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,172 +0,0 @@ -cmake_minimum_required(VERSION 3.12) - -# Set default RISC-V toolchain if not specified -if(NOT DEFINED RISCV_TOOLCHAIN_PATH) - set(RISCV_TOOLCHAIN_PATH "/opt/shared/cross-toolchains/gcc13/CentOS/riscv64-unknown-elf/bin" CACHE STRING "Path to RISC-V toolchain") -endif() - -# Allow override of compiler executables -if(NOT DEFINED RISCV_GCC) - set(RISCV_GCC "/opt/shared/cross-toolchains/gcc13/CentOS/riscv64-unknown-elf/bin/riscv64-unknown-elf-gcc" CACHE STRING "RISC-V GCC compiler") -endif() - -if(NOT DEFINED RISCV_GXX) - set(RISCV_GXX "${RISCV_TOOLCHAIN_PATH}/riscv64-unknown-elf-g++" CACHE STRING "RISC-V G++ compiler") -endif() - -if(NOT DEFINED RISCV_OBJCOPY) - set(RISCV_OBJCOPY "${RISCV_TOOLCHAIN_PATH}/riscv64-unknown-elf-objcopy" CACHE STRING "RISC-V objcopy") -endif() - -if(NOT DEFINED RISCV_OBJDUMP) - set(RISCV_OBJDUMP "${RISCV_TOOLCHAIN_PATH}/riscv64-unknown-elf-objdump" CACHE STRING "RISC-V objdump") -endif() - -# Set the compilers -set(CMAKE_C_COMPILER ${RISCV_GCC}) -set(CMAKE_CXX_COMPILER ${RISCV_GXX}) - -project(Firmware) - -# Define supported configurations -set(SUPPORTED_BOARDS iss) -set(SUPPORTED_ISAS "rv32i;rv32im;rv32imc;rv64i;rv64im;rv64imc;imc") -set(SUPPORTED_ABIS "ilp32;ilp32f;lp64;lp64f") - -# Build target options -option(BUILD_HELLO_WORLD "Build hello-world example" ON) -option(BUILD_DHRYSTONE "Build dhrystone benchmark" OFF) -option(BUILD_COREMARK "Build coremark benchmark" OFF) -option(BUILD_ALL "Build all targets" OFF) - -# If BUILD_ALL is ON, enable all targets -if(BUILD_ALL) - set(BUILD_HELLO_WORLD ON) - set(BUILD_DHRYSTONE ON) - set(BUILD_COREMARK ON) -endif() - -# Set default values and validate configurations -if(NOT DEFINED BOARD) - set(BOARD iss CACHE STRING "Target board") -endif() - -if(NOT DEFINED ISA) - set(ISA rv32imc CACHE STRING "Target ISA") -endif() - -if(NOT DEFINED RISCV_ABI) - if(ISA MATCHES "^rv64") - set(RISCV_ABI "lp64" CACHE STRING "RISC-V ABI") - else() - set(RISCV_ABI "ilp32" CACHE STRING "RISC-V ABI") - endif() -endif() - -# Validate configurations -if(NOT BOARD IN_LIST SUPPORTED_BOARDS) - message(FATAL_ERROR "Invalid BOARD specified. Supported boards: ${SUPPORTED_BOARDS}") -endif() - -if(NOT ISA IN_LIST SUPPORTED_ISAS) - message(FATAL_ERROR "Invalid ISA specified(${ISA}). Supported ISAs: ${SUPPORTED_ISAS}") -endif() - -if(NOT RISCV_ABI IN_LIST SUPPORTED_ABIS) - message(FATAL_ERROR "Invalid ABI specified. Supported ABIs: ${SUPPORTED_ABIS}") -endif() - -# Set RISC-V architecture based on ISA -if(ISA MATCHES "^rv") - set(RISCV_ARCH ${ISA}) -else() - # Default to rv32 for backward compatibility - set(RISCV_ARCH "rv32${ISA}") -endif() - -# Set BSP base directory -set(BSP_BASE "${CMAKE_CURRENT_SOURCE_DIR}/bare-metal-bsp") - -# Global compile definitions -add_compile_definitions(BOARD_${BOARD}) - -# RISC-V specific compiler flags -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -g -march=${RISCV_ARCH}_zicsr_zifencei -mabi=${RISCV_ABI} -mcmodel=medany") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -g -march=${RISCV_ARCH}_zicsr_zifencei -mabi=${RISCV_ABI} -mcmodel=medany") -#set(CMAKE_ASM_COMPILER riscv64-unknown-elf-as) -set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -O2 -g -march=${RISCV_ARCH}_zicsr_zifencei -mabi=${RISCV_ABI} -mcmodel=medany") - -# Optional: Enable semihosting support -option(SEMIHOSTING "Enable semihosting support" OFF) -if(SEMIHOSTING) - add_compile_definitions(SEMIHOSTING) -endif() - -#create interface library for propagating compile options -#add_library(global_compile_options INTERFACE) - -# Compile options -#target_compile_options(global_compile_options INTERFACE -# -march=${RISCV_ARCH}_zicsr_zifencei - # -mabi=${RISCV_ABI} - # -mcmodel=medany - # -O2 - # -g - # -ffunction-sections - # -fdata-sections -#) - - - -message(STATUS "Building firmware with configuration:") -message(STATUS " Board: ${BOARD}") -message(STATUS " ISA: ${ISA} (Architecture: ${RISCV_ARCH})") -message(STATUS " ABI: ${RISCV_ABI}") -message(STATUS " Semihosting: ${SEMIHOSTING}") -message(STATUS " Toolchain:") -message(STATUS " Path: ${RISCV_TOOLCHAIN_PATH}") -message(STATUS " C Compiler: ${CMAKE_C_COMPILER}") -message(STATUS " C++ Compiler: ${CMAKE_CXX_COMPILER}") -message(STATUS "Targets to build:") -message(STATUS " hello-world: ${BUILD_HELLO_WORLD}") -message(STATUS " dhrystone: ${BUILD_DHRYSTONE}") -message(STATUS " coremark: ${BUILD_COREMARK}") - - -add_subdirectory(bare-metal-bsp) - -# Add subdirectories based on build options -if(BUILD_HELLO_WORLD) - add_subdirectory(hello-world) -endif() - - -if(BUILD_DHRYSTONE) - add_subdirectory(benchmarks/dhrystone) -endif() - -if(BUILD_COREMARK) - add_subdirectory(benchmarks/coremark) -endif() - -# Create an all-inclusive target only if BUILD_ALL is ON -if(BUILD_ALL) - add_custom_target(fw-common ALL - DEPENDS - hello-world - dhrystone - coremark - ) -endif() - -# Print build instructions -message(STATUS "") -message(STATUS "Build instructions:") -message(STATUS " Build all targets: cmake -DBUILD_ALL=ON ..") -message(STATUS " Build specific target: cmake -DBUILD_HELLO_WORLD=ON -DBUILD_DHRYSTONE=OFF -DBUILD_COREMARK=OFF ..") -message(STATUS " Configure board: cmake -DBOARD=iss ..") -message(STATUS " Configure ISA: cmake -DISA=rv32imc ..") -message(STATUS " Configure ABI: cmake -DRISCV_ABI=ilp32 ..") -message(STATUS " Enable semihosting: cmake -DSEMIHOSTING=ON ..") -message(STATUS " Set toolchain path: cmake -DRISCV_TOOLCHAIN_PATH=/path/to/toolchain ..") -message(STATUS " Set specific compiler: cmake -DRISCV_GCC=/path/to/riscv-gcc -DRISCV_GXX=/path/to/riscv-g++ ..") diff --git a/bare-metal-bsp b/bare-metal-bsp index 853d1c3..5403974 160000 --- a/bare-metal-bsp +++ b/bare-metal-bsp @@ -1 +1 @@ -Subproject commit 853d1c33ecab1a7096bed7c3f94893d0a27437f3 +Subproject commit 540397494a48b07b1e8282b6059689246b622564 diff --git a/benchmarks/coremark/CMakeLists.txt b/benchmarks/coremark/CMakeLists.txt index 16981bd..f9fda51 100644 --- a/benchmarks/coremark/CMakeLists.txt +++ b/benchmarks/coremark/CMakeLists.txt @@ -27,7 +27,6 @@ set(SOURCES # Create executable add_executable(coremark ${SOURCES}) target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/cm) -target_compile_options(${TARGET} PRIVATE -mcmodel=medany) target_compile_options(${TARGET} PRIVATE -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-builtin-strnlen -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition ) target_compile_definitions(${TARGET} PRIVATE PERFORMANCE_RUN=1 CLOCKS_PER_SEC=10000000 FLAGS_STR="" PERFORMANCE_RUN=1 CLOCKS_PER_SEC=10000000 ITERATIONS=600) diff --git a/benchmarks/dhrystone/CMakeLists.txt b/benchmarks/dhrystone/CMakeLists.txt index 3854668..47294cd 100644 --- a/benchmarks/dhrystone/CMakeLists.txt +++ b/benchmarks/dhrystone/CMakeLists.txt @@ -12,8 +12,6 @@ endif() set(ITERATIONS 50000) # 20000 for TGC add_executable(${TARGET} dhry_1.c dhry_2.c dhry_stubs.c) -target_compile_options(${TARGET} PRIVATE -mcmodel=medany) -#target_compile_options(${TARGET} PRIVATE -mcmodel=medany -fPIC) target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR}) target_compile_options(${TARGET} PRIVATE -fno-inline -fno-builtin-printf -fno-common -Wno-implicit -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las) target_compile_definitions(${TARGET} PRIVATE ITERATIONS=${ITERATIONS} HZ=32768 TIME NO_INIT) diff --git a/hello-world/CMakeLists.txt b/hello-world/CMakeLists.txt index da4b83b..83f3883 100644 --- a/hello-world/CMakeLists.txt +++ b/hello-world/CMakeLists.txt @@ -8,14 +8,12 @@ if(HAVE_NO_INIT_FINI) add_definitions(-DHAVE_NO_INIT_FINI) endif() - add_executable(${TARGET} hello.c) -target_compile_options(${TARGET} PRIVATE -mcmodel=medany) -#target_compile_options(${TARGET} PRIVATE -mcmodel=medany -fPIC) + set(BOARD "iss" CACHE STRING "Target board") -message(STATUS, " board ${BOARD}") +message(" BOARD = ${BOARD}") add_subdirectory(../bare-metal-bsp bsp) target_link_libraries(${TARGET} PRIVATE bsp) target_link_options(${TARGET} PRIVATE -Wl,-Map=${TARGET}.map) From 74c2ec2014f703017edb2f1014b6d5ff61092dfe Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Thu, 22 May 2025 12:22:11 +0200 Subject: [PATCH 22/22] updates write for coremark --- benchmarks/coremark/ee_printf.c | 28 +--------------------------- 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/benchmarks/coremark/ee_printf.c b/benchmarks/coremark/ee_printf.c index 95d3e1e..6952ea6 100644 --- a/benchmarks/coremark/ee_printf.c +++ b/benchmarks/coremark/ee_printf.c @@ -571,33 +571,7 @@ static int ee_vsprintf(char *buf, const char *fmt, va_list args) { #include -void uart_send_char(char c) { - write(STDOUT_FILENO, &c, 1); // write or puts ?? - /* -#if defined(BOARD_ehrenberg) -while (get_uart_rx_tx_reg_tx_free(uart) == 0) -; -uart_write(uart, c); -if (c == '\n') { -while (get_uart_rx_tx_reg_tx_free(uart) == 0) - ; -uart_write(uart, '\r'); -} -#elif defined(BOARD_iss) -*((uint32_t *)0xFFFF0000) = c; -#else -while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) -; -UART0_REG(UART_REG_TXFIFO) = c; -if (c == '\n') { -while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) - ; -UART0_REG(UART_REG_TXFIFO) = '\r'; -} -#endif - -*/ -} +void uart_send_char(char c) { write(STDOUT_FILENO, &c, 1); } int ee_printf(const char *fmt, ...) { char buf[1024], *p;