33 Commits

Author SHA1 Message Date
74c2ec2014 updates write for coremark 2025-05-22 12:22:11 +02:00
bccfc67926 removes unused code in cmake 2025-04-15 14:33:03 +02:00
8b3dc54e5c uses write_hex() in exit instead of tohost=0x1 2025-04-15 12:32:09 +02:00
9909769c0a updates to make 64bit compiling 2025-04-15 12:26:32 +02:00
071d9cc8eb updates bsp and cleans hello.c 2025-04-14 17:01:19 +02:00
a5825bfd67 updates preset for 64bit 2025-04-11 15:44:52 +02:00
36404dd7e0 adds -mcmodel=medany and map generation;updaes bsp 2025-04-11 15:41:29 +02:00
658ffbb405 adds map generation and updates bsp 2025-03-21 16:07:17 +01:00
c6bfaf0546 adds volatile to array passed to tohost and updates bsp submodule 2025-03-14 17:53:49 +01:00
e88c1148fb removes default release build 2025-03-14 14:26:49 +01:00
686d01ab3e adds extern to tohost/fromhost to avoid error during BSS initialization 2025-03-14 14:20:53 +01:00
884d445cb9 adds target. map generation to target_link_opinions 2025-03-11 11:49:26 +01:00
eee14af478 updates bsp 2025-03-11 11:46:23 +01:00
727fdcb7bb adds examples of write/tohost usage 2025-03-11 11:45:40 +01:00
3def42153f adds preset,json 2025-02-28 14:03:21 +01:00
75ba2e7588 adds cmake for coremark 2025-02-20 14:08:53 +01:00
1629b165b5 updates bsp 2025-01-16 11:11:18 +01:00
a2e932c56f adds build to gitignore 2025-01-16 11:10:53 +01:00
cde5ae627c updates dhrystone build 2025-01-16 11:09:58 +01:00
85304d1a43 updates bsp and build System 2025-01-06 20:33:30 +01:00
fddf608418 first version of working cmake 2024-12-20 14:33:57 +01:00
90c45d7c3c add first version of cmake 2024-12-17 12:34:07 +01:00
48cfa8d868 appendage 2024-06-17 19:04:12 +02:00
64d6045d43 expands README 2024-06-17 19:04:05 +02:00
765f48e85a fixes target naming 2024-06-14 20:46:09 +02:00
1ce18ee1f6 serialzes FW build in cmake build flow 2024-06-14 17:34:53 +02:00
b4a3a36b2e cleans up Makefile 2024-06-14 12:05:55 +00:00
2a541997a4 benchmarks/dhrystone/Makefile aktualisiert 2024-06-14 13:50:22 +02:00
70d94c1051 CMakeLists.txt aktualisiert 2024-06-14 13:38:31 +02:00
0df111f945 cleans up CMakeLists 2024-06-14 10:11:30 +02:00
9105f5fb14 update include paths 2024-05-31 08:55:49 +02:00
4cc156e0d0 Merge branch 'main' of https://git.minres.com/Firmware/Firmwares into main 2024-04-30 08:46:13 +02:00
5955f54a4d first semihosting integration 2024-02-26 20:41:13 +01:00
17 changed files with 934 additions and 740 deletions

3
.gitignore vendored
View File

@ -151,3 +151,6 @@ compile_commands.json
CTestTestfile.cmake CTestTestfile.cmake
*.dump *.dump
.vscode/c_cpp_properties.json
semihosting_test/build/semihosting_test
semihosting_test/build/Makefile

View File

@ -1,19 +0,0 @@
if (NOT DEFINED BOARD)
set(BOARD iss)
endif()
if (NOT DEFINED ISA)
set(ISA imc)
endif()
message(STATUS "Building firmware using ${BOARD} board configuration")
add_custom_target(fw-hello-world ALL
COMMAND make -C ${riscvfw_SOURCE_DIR}/hello-world BOARD=${BOARD} ISA=${ISA}
USES_TERMINAL
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
add_custom_target(fw-dhrystone ALL
COMMAND make -C ${riscvfw_SOURCE_DIR}/benchmarks/dhrystone BOARD=${BOARD} ISA=${ISA}
USES_TERMINAL
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
add_custom_target(fw-coremark ALL
COMMAND make -C ${riscvfw_SOURCE_DIR}/benchmarks/coremark BOARD=${BOARD} ISA=${ISA}
USES_TERMINAL
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

View File

@ -1,3 +1,25 @@
# Firmware # MINRES Firmware Repository
## Structure
This repository comes with several executables ready to be built, such as `hello-world` or `coremark` and `dhrystone` in the `benchmark` directory.
Creating the executables in the easiest way possible is done by calling `make`in the corresponding directory.
Using `make clean && bear -- make ` will cause a correct compile_commands.json to be emitted. This allows using completion tools like clangd. ## Prerequisite
This repository requires `riscv64-unknown-elf-gcc` to be located in `$PATH`.
## How to Use
When compiling executables, the target platform needs to be specified using the 'BOARD' variable. When compiling for the TGC5C for example, use `make BOARD=tgc_vp`, when compiling for RTL `make BOARD=rtl`. The default value for the Board variable is 'iss'.
The arch can be set with the 'ISA' variable, the default value is 'imc'.
When compiling for the TGC5A VP for example, the call to create the correct binary is the following:
```
make BOARD=tgc_vp ISA=e
```
## Useful information
Using `bear -- <build-command>` will cause a compile_commands.json to be emitted. This allows using completion tools like clangd.
## Current Limitations
Currently, this repository only supports creation of 32-bit executables (Even when setting the `RISCV_ARCH` and `RISCV_ABI` manually).
Compiling for the 'e' extension / ISA together with any other extension (`ISA=emc` for example), requires setting the `RISCV_ABI=ilp32e` explicitly.
When switching ABI or ARCH ensure that object files in the corresponding 'env' dir in the 'bare-metal-bsp' submodule are removed, so they get created with the appropriate flags (namely the 'init.o' file).

View File

@ -0,0 +1,46 @@
cmake_minimum_required(VERSION 3.21)
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
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})
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-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")
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)
#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}")

View File

@ -0,0 +1,70 @@
{
"version": 3,
"vendor": {
"conan": {}
},
"cmakeMinimumRequired": {
"major": 3,
"minor": 24,
"patch": 0
},
"configurePresets": [
{
"name": "debug",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake"
}
},
{
"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"
}
}
]
}

View File

@ -15,55 +15,58 @@ limitations under the License.
Original Author: Shay Gal-on Original Author: Shay Gal-on
*/ */
#include "coremark.h"
#include "core_portme.h" #include "core_portme.h"
//Read cycle CSR #include "coremark.h"
unsigned long long _read_cycle() #include <unistd.h>
{ // Read cycle CSR
unsigned long long result; unsigned long long _read_cycle() {
unsigned long lower; unsigned long long result;
unsigned long upper1; unsigned long lower;
unsigned long upper2; unsigned long upper1;
unsigned long upper2;
asm volatile ( asm volatile("repeat_cycle_%=: csrr %0, cycleh;\n"
"repeat_cycle_%=: csrr %0, cycleh;\n" " csrr %1, cycle;\n"
" csrr %1, cycle;\n" " csrr %2, cycleh;\n"
" csrr %2, cycleh;\n" " bne %0, %2, repeat_cycle_%=;\n"
" bne %0, %2, repeat_cycle_%=;\n" : "=r"(upper1), "=r"(lower),
: "=r" (upper1),"=r" (lower),"=r" (upper2) // Outputs : temp variable for load result "=r"(upper2) // Outputs : temp variable for load result
: :
: :);
); *(unsigned long *)(&result) = lower;
*(unsigned long *)(&result) = lower; *((unsigned long *)(&result) + 1) = upper1;
*((unsigned long *)(&result)+1) = upper1;
return result; return result;
} }
volatile int tohost; // extern volatile int tohost;
volatile int fromhost; // extern volatile int fromhost;
void exit(int n){ void write_hex(int fd, uint32_t hex);
tohost = 0x1;
for (;;); void exit(int n) {
write_hex(STDERR_FILENO, 1);
// tohost = 0x1;
for (;;)
;
} }
void __libc_init_array (void) { void __libc_init_array(void) {
/* /*
size_t count; size_t count;
size_t i; size_t i;
count = __preinit_array_end - __preinit_array_start; count = __preinit_array_end - __preinit_array_start;
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
__preinit_array_start[i] (); __preinit_array_start[i] ();
#ifdef HAVE_INIT_FINI #ifdef HAVE_INIT_FINI
_init (); _init ();
#endif #endif
count = __init_array_end - __init_array_start; count = __init_array_end - __init_array_start;
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
__init_array_start[i] (); __init_array_start[i] ();
*/ */
} }
#if VALIDATION_RUN #if VALIDATION_RUN
volatile ee_s32 seed1_volatile = 0x3415; volatile ee_s32 seed1_volatile = 0x3415;
@ -89,10 +92,7 @@ volatile ee_s32 seed5_volatile = 0;
time.h and windows.h definitions included. time.h and windows.h definitions included.
*/ */
CORETIMETYPE CORETIMETYPE
barebones_clock() barebones_clock() { return (CORETIMETYPE)_read_cycle(); }
{
return (CORETIMETYPE)_read_cycle();
}
/* Define : TIMER_RES_DIVIDER /* Define : TIMER_RES_DIVIDER
Divider to trade off timer resolution and total time that can be Divider to trade off timer resolution and total time that can be
measured. measured.
@ -101,11 +101,11 @@ barebones_clock()
does not occur. If there are issues with the return value overflowing, does not occur. If there are issues with the return value overflowing,
increase this value. increase this value.
*/ */
#define GETMYTIME(_t) (*_t = barebones_clock()) #define GETMYTIME(_t) (*_t = barebones_clock())
#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) #define MYTIMEDIFF(fin, ini) ((fin) - (ini))
#define TIMER_RES_DIVIDER 1 #define TIMER_RES_DIVIDER 1
#define SAMPLE_TIME_IMPLEMENTATION 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. */ /** Define Host specific (POSIX), or target specific global time variables. */
static CORETIMETYPE start_time_val, stop_time_val; static CORETIMETYPE start_time_val, stop_time_val;
@ -118,11 +118,7 @@ static CORETIMETYPE start_time_val, stop_time_val;
example code) or zeroing some system parameters - e.g. setting the cpu clocks example code) or zeroing some system parameters - e.g. setting the cpu clocks
cycles to 0. cycles to 0.
*/ */
void void start_time(void) { GETMYTIME(&start_time_val); }
start_time(void)
{
GETMYTIME(&start_time_val);
}
/* Function : stop_time /* Function : stop_time
This function will be called right after ending the timed portion of the This function will be called right after ending the timed portion of the
benchmark. benchmark.
@ -131,11 +127,7 @@ start_time(void)
example code) or other system parameters - e.g. reading the current value of example code) or other system parameters - e.g. reading the current value of
cpu cycles counter. cpu cycles counter.
*/ */
void void stop_time(void) { GETMYTIME(&stop_time_val); }
stop_time(void)
{
GETMYTIME(&stop_time_val);
}
/* Function : get_time /* Function : get_time
Return an abstract "ticks" number that signifies time on the system. Return an abstract "ticks" number that signifies time on the system.
@ -146,11 +138,9 @@ stop_time(void)
controlled by <TIMER_RES_DIVIDER> controlled by <TIMER_RES_DIVIDER>
*/ */
CORE_TICKS CORE_TICKS
get_time(void) get_time(void) {
{ CORE_TICKS elapsed = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val));
CORE_TICKS elapsed return elapsed;
= (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val));
return elapsed;
} }
/* Function : time_in_secs /* Function : time_in_secs
Convert the value returned by get_time to seconds. Convert the value returned by get_time to seconds.
@ -159,11 +149,9 @@ get_time(void)
floating point. Default implementation implemented by the EE_TICKS_PER_SEC floating point. Default implementation implemented by the EE_TICKS_PER_SEC
macro above. macro above.
*/ */
secs_ret secs_ret time_in_secs(CORE_TICKS ticks) {
time_in_secs(CORE_TICKS ticks) secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC;
{ return retval;
secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC;
return retval;
} }
ee_u32 default_num_contexts = 1; ee_u32 default_num_contexts = 1;
@ -172,27 +160,18 @@ ee_u32 default_num_contexts = 1;
Target specific initialization code Target specific initialization code
Test for some common mistakes. Test for some common mistakes.
*/ */
void void portable_init(core_portable *p, int *argc, char *argv[]) {
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 "
if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) "pointer!\n");
{ }
ee_printf( if (sizeof(ee_u32) != 4) {
"ERROR! Please define ee_ptr_int to a type that holds a " ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n");
"pointer!\n"); }
} p->portable_id = 1;
if (sizeof(ee_u32) != 4) ee_printf("portable_init finished.\n");
{
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 /* Function : portable_fini
Target specific final code Target specific final code
*/ */
void void portable_fini(core_portable *p) { p->portable_id = 0; }
portable_fini(core_portable *p)
{
p->portable_id = 0;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,2 +1,3 @@
dhrystone dhrystone
/dhrystone.dis /dhrystone.dis
build/

View File

@ -0,0 +1,31 @@
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_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)
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)
add_custom_command(TARGET ${TARGET} POST_BUILD
COMMAND ${CMAKE_OBJDUMP} -S ${TARGET}.elf > ${TARGET}.dis
COMMENT "Creating disassembly for ${TARGET}")

View File

@ -0,0 +1,70 @@
{
"version": 3,
"vendor": {
"conan": {}
},
"cmakeMinimumRequired": {
"major": 3,
"minor": 24,
"patch": 0
},
"configurePresets": [
{
"name": "debug",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake"
}
},
{
"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"
}
}
]
}

View File

@ -15,9 +15,9 @@ else
RISCV_ABI:=ilp32 RISCV_ABI:=ilp32
endif endif
# '-lgcc -lm' are needed to add softfloat routines # '-lgcc -lm' are needed to add softfloat routines
CFLAGS := -g -march=$(RISCV_ARCH)_zicsr_zifencei -mabi=$(RISCV_ABI) -mcmodel=medlow -O3 -DITERATIONS=$(ITERATIONS) -DHZ=32768 -DTIME -DNO_INIT -fno-inline -fno-builtin-printf -fno-common -Wno-implicit \ 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 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las
LDFLAGS := -g -march=$(RISCV_ARCH)_zicsr_zifencei -mabi=$(RISCV_ABI) -mcmodel=medlow -Wl,--wrap=scanf -Wl,--wrap=printf -Wl,--wrap=exit -lgcc -lm LDFLAGS := -Wl,--wrap=scanf
TOOL_DIR=$(dir $(compiler)) TOOL_DIR=$(dir $(compiler))

View File

@ -1,4 +1,5 @@
#include "platform.h" #include "platform.h"
#include <unistd.h>
#ifndef ITERATIONS #ifndef ITERATIONS
#define ITERATIONS 20000 #define ITERATIONS 20000
#endif #endif
@ -6,20 +7,16 @@
/* The functions in this file are only meant to support Dhrystone on an /* The functions in this file are only meant to support Dhrystone on an
* embedded RV32 system and are obviously incorrect in general. */ * embedded RV32 system and are obviously incorrect in general. */
long time(void) long time(void) { return get_timer_value(); }
{
return get_timer_value();
}
// set the number of dhrystone iterations // set the number of dhrystone iterations
void __wrap_scanf(const char* fmt, int* n) void __wrap_scanf(const char *fmt, int *n) { *n = ITERATIONS; }
{
*n = ITERATIONS;
}
extern volatile uint32_t tohost; // extern volatile uint64_t tohost;
void exit(int n){ void exit(int n) {
tohost = 0x1; // tohost = 0x1;
for (;;); write_hex(STDERR_FILENO, 1);
for (;;)
;
} }

View File

@ -1,2 +1,3 @@
/hello /hello
/hello.dis /hello.dis
build/

View File

@ -0,0 +1,23 @@
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)
set(BOARD "iss" CACHE STRING "Target 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)
add_custom_command(TARGET ${TARGET} POST_BUILD
COMMAND ${CMAKE_OBJDUMP} -S ${TARGET}.elf > ${TARGET}.dis
COMMENT "Creating disassembly for ${TARGET}")

View File

@ -0,0 +1,70 @@
{
"version": 3,
"vendor": {
"conan": {}
},
"cmakeMinimumRequired": {
"major": 3,
"minor": 24,
"patch": 0
},
"configurePresets": [
{
"name": "debug",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake"
}
},
{
"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"
}
}
]
}

View File

@ -1,24 +1,37 @@
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include "platform.h"
#include "encoding.h" #include "encoding.h"
#include "platform.h"
#include <string.h>
int factorial(int i){ int factorial(int i) {
volatile int result = 1; volatile int result = 1;
for (int ii = 1; ii <= i; ii++) { for (int ii = 1; ii <= i; ii++) {
result = result * ii; result = result * ii;
} }
return result; 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;
} }
int main() int main() {
{ char string[] = "hello world with write in hello";
volatile int result = factorial (10);
printf("Factorial is %d\n", result); write_tohost(string);
printf("End of execution");
return 0; write(STDOUT_FILENO, string, sizeof(string));
int result = factorial(10);
printf("Factorial is %d", result);
return 0;
} }