removes firmwares to just keep BSP
This commit is contained in:
		
							
								
								
									
										7
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							| @@ -1,7 +0,0 @@ | ||||
| [submodule "cm"] | ||||
|         path = benchmarks/coremark/cm | ||||
| 	url = https://github.com/eembc/coremark.git | ||||
|  | ||||
| [submodule "benchmarks/coremark/cm"] | ||||
| 	path = benchmarks/coremark/cm | ||||
| 	url = https://github.com/eembc/coremark.git | ||||
| @@ -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/cm PORT_DIR=../tgc BOARD=${BOARD} ISA=${ISA} | ||||
|     USES_TERMINAL | ||||
|     WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) | ||||
| @@ -1,27 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>bare-metal-bsp</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> | ||||
| 			<triggers>clean,full,incremental,</triggers> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> | ||||
| 			<triggers>full,incremental,</triggers> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.cdt.core.cnature</nature> | ||||
| 		<nature>org.eclipse.cdt.core.ccnature</nature> | ||||
| 		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> | ||||
| 		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> | ||||
| 	</natures> | ||||
| </projectDescription> | ||||
 Submodule benchmarks/coremark/cm deleted from d5fad6bd09
									
								
							| @@ -1,197 +0,0 @@ | ||||
| /* | ||||
| Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) | ||||
|  | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| 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; | ||||
|  | ||||
|     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; | ||||
| } | ||||
|  | ||||
| volatile int tohost; | ||||
| volatile int fromhost; | ||||
|  | ||||
| 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] (); | ||||
|  | ||||
| #ifdef HAVE_INIT_FINI | ||||
|     _init (); | ||||
| #endif | ||||
|  | ||||
|     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; | ||||
| volatile ee_s32 seed2_volatile = 0x3415; | ||||
| volatile ee_s32 seed3_volatile = 0x66; | ||||
| #endif | ||||
| #if PERFORMANCE_RUN | ||||
| volatile ee_s32 seed1_volatile = 0x0; | ||||
| volatile ee_s32 seed2_volatile = 0x0; | ||||
| volatile ee_s32 seed3_volatile = 0x66; | ||||
| #endif | ||||
| #if PROFILE_RUN | ||||
| volatile ee_s32 seed1_volatile = 0x8; | ||||
| volatile ee_s32 seed2_volatile = 0x8; | ||||
| volatile ee_s32 seed3_volatile = 0x8; | ||||
| #endif | ||||
| volatile ee_s32 seed4_volatile = ITERATIONS; | ||||
| volatile ee_s32 seed5_volatile = 0; | ||||
| /* Porting : Timing functions | ||||
|         How to capture time and convert to seconds must be ported to whatever is | ||||
|    supported by the platform. e.g. Read value from on board RTC, read value from | ||||
|    cpu clock cycles performance counter etc. Sample implementation for standard | ||||
|    time.h and windows.h definitions included. | ||||
| */ | ||||
| CORETIMETYPE | ||||
| barebones_clock() | ||||
| { | ||||
|     return (CORETIMETYPE)_read_cycle(); | ||||
| } | ||||
| /* Define : TIMER_RES_DIVIDER | ||||
|         Divider to trade off timer resolution and total time that can be | ||||
|    measured. | ||||
|  | ||||
|         Use lower values to increase resolution, but make sure that overflow | ||||
|    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 SAMPLE_TIME_IMPLEMENTATION 1 | ||||
| #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; | ||||
|  | ||||
| /* Function : start_time | ||||
|         This function will be called right before starting the timed portion of | ||||
|    the benchmark. | ||||
|  | ||||
|         Implementation may be capturing a system timer (as implemented in the | ||||
|    example code) or zeroing some system parameters - e.g. setting the cpu clocks | ||||
|    cycles to 0. | ||||
| */ | ||||
| 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. | ||||
|  | ||||
|         Implementation may be capturing a system timer (as implemented in the | ||||
|    example code) or other system parameters - e.g. reading the current value of | ||||
|    cpu cycles counter. | ||||
| */ | ||||
| void | ||||
| stop_time(void) | ||||
| { | ||||
|     GETMYTIME(&stop_time_val); | ||||
| } | ||||
| /* Function : get_time | ||||
|         Return an abstract "ticks" number that signifies time on the system. | ||||
|  | ||||
|         Actual value returned may be cpu cycles, milliseconds or any other | ||||
|    value, as long as it can be converted to seconds by <time_in_secs>. This | ||||
|    methodology is taken to accomodate any hardware or simulated platform. The | ||||
|    sample implementation returns millisecs by default, and the resolution is | ||||
|    controlled by <TIMER_RES_DIVIDER> | ||||
| */ | ||||
| CORE_TICKS | ||||
| 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. | ||||
|  | ||||
|         The <secs_ret> type is used to accomodate systems with no support for | ||||
|    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; | ||||
| } | ||||
|  | ||||
| ee_u32 default_num_contexts = 1; | ||||
|  | ||||
| /* Function : portable_init | ||||
|         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; | ||||
| } | ||||
| /* Function : portable_fini | ||||
|         Target specific final code | ||||
| */ | ||||
| void | ||||
| portable_fini(core_portable *p) | ||||
| { | ||||
|     p->portable_id = 0; | ||||
| } | ||||
| @@ -1,210 +0,0 @@ | ||||
| /* | ||||
| Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) | ||||
|  | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. | ||||
|  | ||||
| Original Author: Shay Gal-on | ||||
| */ | ||||
| /* Topic : Description | ||||
|         This file contains configuration constants required to execute on | ||||
|    different platforms | ||||
| */ | ||||
| #ifndef CORE_PORTME_H | ||||
| #define CORE_PORTME_H | ||||
| /************************/ | ||||
| /* Data types and settings */ | ||||
| /************************/ | ||||
| /* Configuration : HAS_FLOAT | ||||
|         Define to 1 if the platform supports floating point. | ||||
| */ | ||||
| #ifndef HAS_FLOAT | ||||
| #define HAS_FLOAT 0 | ||||
| #endif | ||||
| /* Configuration : HAS_TIME_H | ||||
|         Define to 1 if platform has the time.h header file, | ||||
|         and implementation of functions thereof. | ||||
| */ | ||||
| #ifndef HAS_TIME_H | ||||
| #define HAS_TIME_H 0 | ||||
| #endif | ||||
| /* Configuration : USE_CLOCK | ||||
|         Define to 1 if platform has the time.h header file, | ||||
|         and implementation of functions thereof. | ||||
| */ | ||||
| #ifndef USE_CLOCK | ||||
| #define USE_CLOCK 0 | ||||
| #endif | ||||
| /* Configuration : HAS_STDIO | ||||
|         Define to 1 if the platform has stdio.h. | ||||
| */ | ||||
| #ifndef HAS_STDIO | ||||
| #define HAS_STDIO 0 | ||||
| #endif | ||||
| /* Configuration : HAS_PRINTF | ||||
|         Define to 1 if the platform has stdio.h and implements the printf | ||||
|    function. | ||||
| */ | ||||
| #ifndef HAS_PRINTF | ||||
| #define HAS_PRINTF 0 | ||||
| #endif | ||||
|  | ||||
| /* Definitions : COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION | ||||
|         Initialize these strings per platform | ||||
| */ | ||||
| #ifndef COMPILER_VERSION | ||||
| #ifdef __GNUC__ | ||||
| #define COMPILER_VERSION "GCC"__VERSION__ | ||||
| #else | ||||
| #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" | ||||
| #endif | ||||
| #endif | ||||
| #ifndef COMPILER_FLAGS | ||||
| #define COMPILER_FLAGS \ | ||||
|     FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ | ||||
| #endif | ||||
| #ifndef MEM_LOCATION | ||||
| #define MEM_LOCATION "STACK" | ||||
| #endif | ||||
|  | ||||
| /* Data Types : | ||||
|         To avoid compiler issues, define the data types that need ot be used for | ||||
|    8b, 16b and 32b in <core_portme.h>. | ||||
|  | ||||
|         *Imprtant* : | ||||
|         ee_ptr_int needs to be the data type used to hold pointers, otherwise | ||||
|    coremark may fail!!! | ||||
| */ | ||||
| typedef signed short   ee_s16; | ||||
| typedef unsigned short ee_u16; | ||||
| typedef signed int     ee_s32; | ||||
| typedef double         ee_f32; | ||||
| typedef unsigned char  ee_u8; | ||||
| typedef unsigned int   ee_u32; | ||||
| typedef ee_u32         ee_ptr_int; | ||||
| typedef ee_u32         ee_size_t; | ||||
| #define NULL ((void *)0) | ||||
| /* align_mem : | ||||
|         This macro is used to align an offset to point to a 32b value. It is | ||||
|    used in the Matrix algorithm to initialize the input memory blocks. | ||||
| */ | ||||
| #define align_mem(x) (void *)(4 + (((ee_ptr_int)(x)-1) & ~3)) | ||||
|  | ||||
| /* Configuration : CORE_TICKS | ||||
|         Define type of return from the timing functions. | ||||
|  */ | ||||
| #define CORETIMETYPE ee_u32 | ||||
| typedef ee_u32 CORE_TICKS; | ||||
|  | ||||
| /* Configuration : SEED_METHOD | ||||
|         Defines method to get seed values that cannot be computed at compile | ||||
|    time. | ||||
|  | ||||
|         Valid values : | ||||
|         SEED_ARG - from command line. | ||||
|         SEED_FUNC - from a system function. | ||||
|         SEED_VOLATILE - from volatile variables. | ||||
| */ | ||||
| #ifndef SEED_METHOD | ||||
| #define SEED_METHOD SEED_VOLATILE | ||||
| #endif | ||||
|  | ||||
| /* Configuration : MEM_METHOD | ||||
|         Defines method to get a block of memry. | ||||
|  | ||||
|         Valid values : | ||||
|         MEM_MALLOC - for platforms that implement malloc and have malloc.h. | ||||
|         MEM_STATIC - to use a static memory array. | ||||
|         MEM_STACK - to allocate the data block on the stack (NYI). | ||||
| */ | ||||
| #ifndef MEM_METHOD | ||||
| #define MEM_METHOD MEM_STACK | ||||
| #endif | ||||
|  | ||||
| /* Configuration : MULTITHREAD | ||||
|         Define for parallel execution | ||||
|  | ||||
|         Valid values : | ||||
|         1 - only one context (default). | ||||
|         N>1 - will execute N copies in parallel. | ||||
|  | ||||
|         Note : | ||||
|         If this flag is defined to more then 1, an implementation for launching | ||||
|    parallel contexts must be defined. | ||||
|  | ||||
|         Two sample implementations are provided. Use <USE_PTHREAD> or <USE_FORK> | ||||
|    to enable them. | ||||
|  | ||||
|         It is valid to have a different implementation of <core_start_parallel> | ||||
|    and <core_end_parallel> in <core_portme.c>, to fit a particular architecture. | ||||
| */ | ||||
| #ifndef MULTITHREAD | ||||
| #define MULTITHREAD 1 | ||||
| #define USE_PTHREAD 0 | ||||
| #define USE_FORK    0 | ||||
| #define USE_SOCKET  0 | ||||
| #endif | ||||
|  | ||||
| /* Configuration : MAIN_HAS_NOARGC | ||||
|         Needed if platform does not support getting arguments to main. | ||||
|  | ||||
|         Valid values : | ||||
|         0 - argc/argv to main is supported | ||||
|         1 - argc/argv to main is not supported | ||||
|  | ||||
|         Note : | ||||
|         This flag only matters if MULTITHREAD has been defined to a value | ||||
|    greater then 1. | ||||
| */ | ||||
| #ifndef MAIN_HAS_NOARGC | ||||
| #define MAIN_HAS_NOARGC 0 | ||||
| #endif | ||||
|  | ||||
| /* Configuration : MAIN_HAS_NORETURN | ||||
|         Needed if platform does not support returning a value from main. | ||||
|  | ||||
|         Valid values : | ||||
|         0 - main returns an int, and return value will be 0. | ||||
|         1 - platform does not support returning a value from main | ||||
| */ | ||||
| #ifndef MAIN_HAS_NORETURN | ||||
| #define MAIN_HAS_NORETURN 0 | ||||
| #endif | ||||
|  | ||||
| /* Variable : default_num_contexts | ||||
|         Not used for this simple port, must cintain the value 1. | ||||
| */ | ||||
| extern ee_u32 default_num_contexts; | ||||
|  | ||||
| typedef struct CORE_PORTABLE_S | ||||
| { | ||||
|     ee_u8 portable_id; | ||||
| } core_portable; | ||||
|  | ||||
| /* target specific init/fini */ | ||||
| void portable_init(core_portable *p, int *argc, char *argv[]); | ||||
| void portable_fini(core_portable *p); | ||||
|  | ||||
| #if !defined(PROFILE_RUN) && !defined(PERFORMANCE_RUN) \ | ||||
|     && !defined(VALIDATION_RUN) | ||||
| #if (TOTAL_DATA_SIZE == 1200) | ||||
| #define PROFILE_RUN 1 | ||||
| #elif (TOTAL_DATA_SIZE == 2000) | ||||
| #define PERFORMANCE_RUN 1 | ||||
| #else | ||||
| #define VALIDATION_RUN 1 | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| int ee_printf(const char *fmt, ...); | ||||
|  | ||||
| #endif /* CORE_PORTME_H */ | ||||
| @@ -1,94 +0,0 @@ | ||||
| # Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| #    http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
| #  | ||||
| # Original Author: Shay Gal-on | ||||
|  | ||||
| #File : core_portme.mak | ||||
| ISA?=imc | ||||
| RISCV_ARCH:=rv32$(ISA)_zicsr_zifencei | ||||
| RISCV_ABI:=ilp32 | ||||
| TRIPLET?=riscv64-unknown-elf | ||||
| # Flag : OUTFLAG | ||||
| #	Use this flag to define how to to get an executable (e.g -o) | ||||
| OUTFLAG= -o | ||||
| # Flag : CC | ||||
| #	Use this flag to define compiler to use | ||||
| CC 		= $(TRIPLET)-gcc | ||||
| # Flag : LD | ||||
| #	Use this flag to define compiler to use | ||||
| LD		= $(TRIPLET)-gcc | ||||
| # Flag : AS | ||||
| #	Use this flag to define compiler to use | ||||
| AS		= $(TRIPLET)-as | ||||
| # Flag : CFLAGS | ||||
| #	Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" | ||||
| PORT_CFLAGS = -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -O3 -DCLOCKS_PER_SEC=10000000 -nostdlib -nostartfiles -nodefaultlibs \ | ||||
|  -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las -flto | ||||
| FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" | ||||
| CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\"  | ||||
| #Flag : LFLAGS_END | ||||
| #	Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts).  | ||||
| #	Note : On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. | ||||
| SEPARATE_COMPILE=1 | ||||
| # Flag : SEPARATE_COMPILE | ||||
| # You must also define below how to create an object file, and how to link. | ||||
| OBJOUT 	= -o | ||||
| LFLAGS 	= -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI)  | ||||
| #--specs=nano.specs -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI)  | ||||
| ASFLAGS = | ||||
| OFLAG 	= -o | ||||
| COUT 	= -c | ||||
|  | ||||
| LFLAGS_END =  | ||||
| # Flag : PORT_SRCS | ||||
| # 	Port specific source files can be added here | ||||
| #	You may also need cvt.c if the fcvt functions are not provided as intrinsics by your compiler! | ||||
| PORT_SRCS = $(PORT_DIR)/core_portme.c $(PORT_DIR)/ee_printf.c | ||||
| vpath %.c $(PORT_DIR) | ||||
| vpath %.s $(PORT_DIR) | ||||
| PORT_OBJS = core_portme.o ee_printf.o | ||||
| # Flag : LOAD | ||||
| #	For a simple port, we assume self hosted compile and run, no load needed. | ||||
|  | ||||
| # Flag : RUN | ||||
| #	For a simple port, we assume self hosted compile and run, simple invocation of the executable | ||||
|  | ||||
| LOAD = echo "" | ||||
| RUN = echo "" | ||||
|  | ||||
| OEXT = .o | ||||
| EXE = .elf | ||||
|  | ||||
| $(OPATH)$(PORT_DIR)/%$(OEXT) : %.c | ||||
| 	$(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ | ||||
|  | ||||
| $(OPATH)%$(OEXT) : %.c | ||||
| 	$(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ | ||||
|  | ||||
| $(OPATH)$(PORT_DIR)/%$(OEXT) : %.s | ||||
| 	$(AS) $(ASFLAGS) $< $(OBJOUT) $@ | ||||
|  | ||||
| # Target : port_pre% and port_post% | ||||
| # For the purpose of this simple port, no pre or post steps needed. | ||||
|  | ||||
| .PHONY : port_prebuild port_postbuild port_prerun port_postrun port_preload port_postload | ||||
| port_pre% port_post% :  | ||||
|  | ||||
| # FLAG : OPATH | ||||
| # Path to the output folder. Default - current folder. | ||||
| OPATH = ./ | ||||
| MKDIR = mkdir -p | ||||
|  | ||||
| dist-clean: clean | ||||
| 	rm -f *.o | ||||
| @@ -1,127 +0,0 @@ | ||||
| /* | ||||
| Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) | ||||
|  | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. | ||||
| */ | ||||
| #include <math.h> | ||||
| #define CVTBUFSIZE 80 | ||||
| static char CVTBUF[CVTBUFSIZE]; | ||||
|  | ||||
| static char * | ||||
| cvt(double arg, int ndigits, int *decpt, int *sign, char *buf, int eflag) | ||||
| { | ||||
|     int    r2; | ||||
|     double fi, fj; | ||||
|     char * p, *p1; | ||||
|  | ||||
|     if (ndigits < 0) | ||||
|         ndigits = 0; | ||||
|     if (ndigits >= CVTBUFSIZE - 1) | ||||
|         ndigits = CVTBUFSIZE - 2; | ||||
|     r2    = 0; | ||||
|     *sign = 0; | ||||
|     p     = &buf[0]; | ||||
|     if (arg < 0) | ||||
|     { | ||||
|         *sign = 1; | ||||
|         arg   = -arg; | ||||
|     } | ||||
|     arg = modf(arg, &fi); | ||||
|     p1  = &buf[CVTBUFSIZE]; | ||||
|  | ||||
|     if (fi != 0) | ||||
|     { | ||||
|         p1 = &buf[CVTBUFSIZE]; | ||||
|         while (fi != 0) | ||||
|         { | ||||
|             fj    = modf(fi / 10, &fi); | ||||
|             *--p1 = (int)((fj + .03) * 10) + '0'; | ||||
|             r2++; | ||||
|         } | ||||
|         while (p1 < &buf[CVTBUFSIZE]) | ||||
|             *p++ = *p1++; | ||||
|     } | ||||
|     else if (arg > 0) | ||||
|     { | ||||
|         while ((fj = arg * 10) < 1) | ||||
|         { | ||||
|             arg = fj; | ||||
|             r2--; | ||||
|         } | ||||
|     } | ||||
|     p1 = &buf[ndigits]; | ||||
|     if (eflag == 0) | ||||
|         p1 += r2; | ||||
|     *decpt = r2; | ||||
|     if (p1 < &buf[0]) | ||||
|     { | ||||
|         buf[0] = '\0'; | ||||
|         return buf; | ||||
|     } | ||||
|     while (p <= p1 && p < &buf[CVTBUFSIZE]) | ||||
|     { | ||||
|         arg *= 10; | ||||
|         arg  = modf(arg, &fj); | ||||
|         *p++ = (int)fj + '0'; | ||||
|     } | ||||
|     if (p1 >= &buf[CVTBUFSIZE]) | ||||
|     { | ||||
|         buf[CVTBUFSIZE - 1] = '\0'; | ||||
|         return buf; | ||||
|     } | ||||
|     p = p1; | ||||
|     *p1 += 5; | ||||
|     while (*p1 > '9') | ||||
|     { | ||||
|         *p1 = '0'; | ||||
|         if (p1 > buf) | ||||
|             ++*--p1; | ||||
|         else | ||||
|         { | ||||
|             *p1 = '1'; | ||||
|             (*decpt)++; | ||||
|             if (eflag == 0) | ||||
|             { | ||||
|                 if (p > buf) | ||||
|                     *p = '0'; | ||||
|                 p++; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     *p = '\0'; | ||||
|     return buf; | ||||
| } | ||||
|  | ||||
| char * | ||||
| ecvt(double arg, int ndigits, int *decpt, int *sign) | ||||
| { | ||||
|     return cvt(arg, ndigits, decpt, sign, CVTBUF, 1); | ||||
| } | ||||
|  | ||||
| char * | ||||
| ecvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf) | ||||
| { | ||||
|     return cvt(arg, ndigits, decpt, sign, buf, 1); | ||||
| } | ||||
|  | ||||
| char * | ||||
| fcvt(double arg, int ndigits, int *decpt, int *sign) | ||||
| { | ||||
|     return cvt(arg, ndigits, decpt, sign, CVTBUF, 0); | ||||
| } | ||||
|  | ||||
| char * | ||||
| fcvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf) | ||||
| { | ||||
|     return cvt(arg, ndigits, decpt, sign, buf, 0); | ||||
| } | ||||
| @@ -1,701 +0,0 @@ | ||||
| /* | ||||
| Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) | ||||
|  | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. | ||||
| */ | ||||
|  | ||||
| #include <coremark.h> | ||||
| #include <stdarg.h> | ||||
|  | ||||
| #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 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 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; | ||||
|  | ||||
|     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--; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     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; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     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]; | ||||
|     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; | ||||
|  | ||||
|     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]; | ||||
|     while (len < size--) | ||||
|         *str++ = ' '; | ||||
|  | ||||
|     return str; | ||||
| } | ||||
|  | ||||
| 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]; | ||||
|  | ||||
|         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]; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (!(type & LEFT)) | ||||
|         while (len < size--) | ||||
|             *str++ = ' '; | ||||
|     for (i = 0; i < len; ++i) | ||||
|         *str++ = tmp[i]; | ||||
|     while (len < size--) | ||||
|         *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); | ||||
| 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++; | ||||
| } | ||||
|  | ||||
| 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') | ||||
|     { | ||||
|         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 (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++ = ' '; | ||||
|  | ||||
|     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; | ||||
|  | ||||
|     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 | ||||
|  | ||||
|     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; | ||||
|         } | ||||
|  | ||||
|         // 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 conversion qualifier | ||||
|         qualifier = -1; | ||||
|         if (*fmt == 'l' || *fmt == 'L') | ||||
|         { | ||||
|             qualifier = *fmt; | ||||
|             fmt++; | ||||
|         } | ||||
|  | ||||
|         // 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; | ||||
|  | ||||
|             case 's': | ||||
|                 s = va_arg(args, char *); | ||||
|                 if (!s) | ||||
|                     s = "<NULL>"; | ||||
|                 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 '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; | ||||
|  | ||||
|             // Integer number formats - set up the flags and "break" | ||||
|             case 'o': | ||||
|                 base = 8; | ||||
|                 break; | ||||
|  | ||||
|             case 'X': | ||||
|                 flags |= UPPERCASE; | ||||
|  | ||||
|             case 'x': | ||||
|                 base = 16; | ||||
|                 break; | ||||
|  | ||||
|             case 'd': | ||||
|             case 'i': | ||||
|                 flags |= SIGN; | ||||
|  | ||||
|             case 'u': | ||||
|                 break; | ||||
|  | ||||
| #if HAS_FLOAT | ||||
|  | ||||
|             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); | ||||
|     } | ||||
|  | ||||
|     *str = '\0'; | ||||
|     return str - buf; | ||||
| } | ||||
|  | ||||
| #define UART0_BASE_ADDR 0xffff0000ULL | ||||
|  | ||||
| #define UART_REG_TXFIFO         0x00 | ||||
| #define UART_REG_RXFIFO         0x04 | ||||
| #define UART_REG_TXCTRL         0x08 | ||||
| #define UART_REG_RXCTRL         0x0c | ||||
| #define UART_REG_IE             0x10 | ||||
| #define UART_REG_IP             0x14 | ||||
| #define UART_REG_DIV            0x18 | ||||
| #define UART_TXEN               0x1 | ||||
|  | ||||
| #define UART0_REG(ADDR) *((ee_u32*) (UART0_BASE_ADDR + ADDR)) | ||||
|  | ||||
| void | ||||
| uart_send_char(char c) | ||||
| { | ||||
|       while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; | ||||
|       UART0_REG(UART_REG_TXFIFO) = (unsigned char)c; | ||||
| } | ||||
|  | ||||
| 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++; | ||||
|     } | ||||
|  | ||||
|     return n; | ||||
| } | ||||
| @@ -1,241 +0,0 @@ | ||||
| OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv") | ||||
| OUTPUT_ARCH(riscv) | ||||
| MEMORY | ||||
| { | ||||
|    RAM (rwx)  : ORIGIN = 0x0, LENGTH = 128M  | ||||
| } | ||||
|  | ||||
| ENTRY(_start) | ||||
|  | ||||
| SECTIONS | ||||
| { | ||||
|   /* Read-only sections, merged into text segment: */ | ||||
|   .interp         : { *(.interp) } | ||||
|   .note.gnu.build-id  : { *(.note.gnu.build-id) } | ||||
|   .hash           : { *(.hash) } | ||||
|   .gnu.hash       : { *(.gnu.hash) } | ||||
|   .dynsym         : { *(.dynsym) } | ||||
|   .dynstr         : { *(.dynstr) } | ||||
|   .gnu.version    : { *(.gnu.version) } | ||||
|   .gnu.version_d  : { *(.gnu.version_d) } | ||||
|   .gnu.version_r  : { *(.gnu.version_r) } | ||||
|   .rela.dyn       : | ||||
|     { | ||||
|       *(.rela.init) | ||||
|       *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) | ||||
|       *(.rela.fini) | ||||
|       *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) | ||||
|       *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) | ||||
|       *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) | ||||
|       *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) | ||||
|       *(.rela.ctors) | ||||
|       *(.rela.dtors) | ||||
|       *(.rela.got) | ||||
|       *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) | ||||
|       *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) | ||||
|       *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) | ||||
|       *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) | ||||
|       *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) | ||||
|       PROVIDE_HIDDEN (__rela_iplt_start = .); | ||||
|       *(.rela.iplt) | ||||
|       PROVIDE_HIDDEN (__rela_iplt_end = .); | ||||
|     } | ||||
|   .rela.plt       : | ||||
|     { | ||||
|       *(.rela.plt) | ||||
|     } | ||||
|   .plt            : { *(.plt) } | ||||
|   .iplt           : { *(.iplt) } | ||||
|   .init           : | ||||
|   { | ||||
|     KEEP (*(SORT_NONE(.init))) | ||||
|     *crt0.o(.text .text.*) | ||||
|   } > RAM | ||||
|   .text      : | ||||
|   { | ||||
|     *(.text.init) | ||||
|     *(.text.unlikely .text.*_unlikely .text.unlikely.*) | ||||
|     *(.text.exit .text.exit.*) | ||||
|     *(.text.startup .text.startup.*) | ||||
|     *(.text.hot .text.hot.*) | ||||
|     *(.text .stub .text.* .gnu.linkonce.t.*) | ||||
|     /* .gnu.warning sections are handled specially by elf32.em.  */ | ||||
|     *(.gnu.warning) | ||||
|   } | ||||
|   .fini           : | ||||
|   { | ||||
|     KEEP (*(SORT_NONE(.fini))) | ||||
|   } | ||||
|   PROVIDE (__etext = .); | ||||
|   PROVIDE (_etext = .); | ||||
|   PROVIDE (etext = .); | ||||
|   .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) } | ||||
|   .rodata1        : { *(.rodata1) } | ||||
|   .sdata2         : | ||||
|   { | ||||
|     *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) | ||||
|   } | ||||
|   .sbss2          : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } | ||||
|   .eh_frame_hdr   : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) } | ||||
|   .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) } | ||||
|   .gcc_except_table   : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } | ||||
|   .gnu_extab   : ONLY_IF_RO { *(.gnu_extab*) } | ||||
|   /* These sections are generated by the Sun/Oracle C++ compiler.  */ | ||||
|   .exception_ranges   : ONLY_IF_RO { *(.exception_ranges*) } | ||||
|   /* Adjust the address for the data segment.  We want to adjust up to | ||||
|      the same address within the page on the next page up.  */ | ||||
|   . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); | ||||
|   /* Exception handling  */ | ||||
|   .eh_frame       : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) } | ||||
|   .gnu_extab      : ONLY_IF_RW { *(.gnu_extab) } | ||||
|   .gcc_except_table   : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } | ||||
|   .exception_ranges   : ONLY_IF_RW { *(.exception_ranges*) } | ||||
|   /* Thread Local Storage sections  */ | ||||
|   .tdata	  : | ||||
|    { | ||||
|      PROVIDE_HIDDEN (__tdata_start = .); | ||||
|      *(.tdata .tdata.* .gnu.linkonce.td.*) | ||||
|    } | ||||
|   .tbss		  : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } | ||||
|   .preinit_array    : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__preinit_array_start = .); | ||||
|     KEEP (*(.preinit_array)) | ||||
|     PROVIDE_HIDDEN (__preinit_array_end = .); | ||||
|   } | ||||
|   .init_array    : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__init_array_start = .); | ||||
|     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) | ||||
|     KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) | ||||
|     PROVIDE_HIDDEN (__init_array_end = .); | ||||
|   } | ||||
|   .fini_array    : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__fini_array_start = .); | ||||
|     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) | ||||
|     KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) | ||||
|     PROVIDE_HIDDEN (__fini_array_end = .); | ||||
|   } | ||||
|   .ctors          : | ||||
|   { | ||||
|     /* gcc uses crtbegin.o to find the start of | ||||
|        the constructors, so we make sure it is | ||||
|        first.  Because this is a wildcard, it | ||||
|        doesn't matter if the user does not | ||||
|        actually link against crtbegin.o; the | ||||
|        linker won't look for a file to match a | ||||
|        wildcard.  The wildcard also means that it | ||||
|        doesn't matter which directory crtbegin.o | ||||
|        is in.  */ | ||||
|     KEEP (*crtbegin.o(.ctors)) | ||||
|     KEEP (*crtbegin?.o(.ctors)) | ||||
|     /* We don't want to include the .ctor section from | ||||
|        the crtend.o file until after the sorted ctors. | ||||
|        The .ctor section from the crtend file contains the | ||||
|        end of ctors marker and it must be last */ | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) | ||||
|     KEEP (*(SORT(.ctors.*))) | ||||
|     KEEP (*(.ctors)) | ||||
|   } | ||||
|   .dtors          : | ||||
|   { | ||||
|     KEEP (*crtbegin.o(.dtors)) | ||||
|     KEEP (*crtbegin?.o(.dtors)) | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) | ||||
|     KEEP (*(SORT(.dtors.*))) | ||||
|     KEEP (*(.dtors)) | ||||
|   } | ||||
|   .jcr            : { KEEP (*(.jcr)) } | ||||
|   .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) } | ||||
|   .dynamic        : { *(.dynamic) } | ||||
|   . = DATA_SEGMENT_RELRO_END (0, .); | ||||
|   .data           : | ||||
|   { | ||||
|     __DATA_BEGIN__ = .; | ||||
|     *(.data .data.* .gnu.linkonce.d.*) | ||||
|     SORT(CONSTRUCTORS) | ||||
|   } | ||||
|   .data1          : { *(.data1) } | ||||
|   .got            : { *(.got.plt) *(.igot.plt) *(.got) *(.igot) } | ||||
|   /* We want the small data sections together, so single-instruction offsets | ||||
|      can access them all, and initialized data all before uninitialized, so | ||||
|      we can shorten the on-disk segment size.  */ | ||||
|   .sdata          : | ||||
|   { | ||||
|     __SDATA_BEGIN__ = .; | ||||
|     *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata .srodata.*) | ||||
|     *(.sdata .sdata.* .gnu.linkonce.s.*) | ||||
|   } | ||||
|   _edata = .; PROVIDE (edata = .); | ||||
|   . = .; | ||||
|   __bss_start = .; | ||||
|   .sbss           : | ||||
|   { | ||||
|     *(.dynsbss) | ||||
|     *(.sbss .sbss.* .gnu.linkonce.sb.*) | ||||
|     *(.scommon) | ||||
|   } | ||||
|   .bss            : | ||||
|   { | ||||
|    *(.dynbss) | ||||
|    *(.bss .bss.* .gnu.linkonce.b.*) | ||||
|    *(COMMON) | ||||
|    /* Align here to ensure that the .bss section occupies space up to | ||||
|       _end.  Align after .bss to ensure correct alignment even if the | ||||
|       .bss section disappears because there are no input sections. | ||||
|       FIXME: Why do we need it? When there is no .bss section, we do not | ||||
|       pad the .data section.  */ | ||||
|    . = ALIGN(. != 0 ? 32 / 8 : 1); | ||||
|   } | ||||
|   . = ALIGN(32 / 8); | ||||
|   . = SEGMENT_START("ldata-segment", .); | ||||
|   . = ALIGN(32 / 8); | ||||
|   __BSS_END__ = .; | ||||
|     __global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800, | ||||
| 		            MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800)); | ||||
|   _end = .; PROVIDE (end = .); | ||||
|   . = DATA_SEGMENT_END (.); | ||||
|   /* Stabs debugging sections.  */ | ||||
|   .stab          0 : { *(.stab) } | ||||
|   .stabstr       0 : { *(.stabstr) } | ||||
|   .stab.excl     0 : { *(.stab.excl) } | ||||
|   .stab.exclstr  0 : { *(.stab.exclstr) } | ||||
|   .stab.index    0 : { *(.stab.index) } | ||||
|   .stab.indexstr 0 : { *(.stab.indexstr) } | ||||
|   .comment       0 : { *(.comment) } | ||||
|   .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) } | ||||
|   /* DWARF debug sections. | ||||
|      Symbols in the DWARF debugging sections are relative to the beginning | ||||
|      of the section so we begin them at 0.  */ | ||||
|   /* DWARF 1 */ | ||||
|   .debug          0 : { *(.debug) } | ||||
|   .line           0 : { *(.line) } | ||||
|   /* GNU DWARF 1 extensions */ | ||||
|   .debug_srcinfo  0 : { *(.debug_srcinfo) } | ||||
|   .debug_sfnames  0 : { *(.debug_sfnames) } | ||||
|   /* DWARF 1.1 and DWARF 2 */ | ||||
|   .debug_aranges  0 : { *(.debug_aranges) } | ||||
|   .debug_pubnames 0 : { *(.debug_pubnames) } | ||||
|   /* DWARF 2 */ | ||||
|   .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) } | ||||
|   .debug_abbrev   0 : { *(.debug_abbrev) } | ||||
|   .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end) } | ||||
|   .debug_frame    0 : { *(.debug_frame) } | ||||
|   .debug_str      0 : { *(.debug_str) } | ||||
|   .debug_loc      0 : { *(.debug_loc) } | ||||
|   .debug_macinfo  0 : { *(.debug_macinfo) } | ||||
|   /* SGI/MIPS DWARF 2 extensions */ | ||||
|   .debug_weaknames 0 : { *(.debug_weaknames) } | ||||
|   .debug_funcnames 0 : { *(.debug_funcnames) } | ||||
|   .debug_typenames 0 : { *(.debug_typenames) } | ||||
|   .debug_varnames  0 : { *(.debug_varnames) } | ||||
|   /* DWARF 3 */ | ||||
|   .debug_pubtypes 0 : { *(.debug_pubtypes) } | ||||
|   .debug_ranges   0 : { *(.debug_ranges) } | ||||
|   /* DWARF Extension.  */ | ||||
|   .debug_macro    0 : { *(.debug_macro) } | ||||
|   .debug_addr     0 : { *(.debug_addr) } | ||||
|   .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } | ||||
|   /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) } | ||||
| } | ||||
| @@ -1,91 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> | ||||
| 	<storageModule moduleId="org.eclipse.cdt.core.settings"> | ||||
| 		<cconfiguration id="cdt.managedbuild.toolchain.gnu.cross.base.574338120"> | ||||
| 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.cross.base.574338120" moduleId="org.eclipse.cdt.core.settings" name="Default"> | ||||
| 				<externalSettings/> | ||||
| 				<extensions> | ||||
| 					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 				</extensions> | ||||
| 			</storageModule> | ||||
| 			<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | ||||
| 				<configuration buildProperties="" id="cdt.managedbuild.toolchain.gnu.cross.base.574338120" name="Default" optionalBuildProperties="" parent="org.eclipse.cdt.build.core.emptycfg"> | ||||
| 					<folderInfo id="cdt.managedbuild.toolchain.gnu.cross.base.574338120.193230058" name="/" resourcePath=""> | ||||
| 						<toolChain id="cdt.managedbuild.toolchain.gnu.cross.base.1380433779" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.base"> | ||||
| 							<option id="cdt.managedbuild.option.gnu.cross.prefix.1116043753" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix"/> | ||||
| 							<option id="cdt.managedbuild.option.gnu.cross.path.1830096638" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path"/> | ||||
| 							<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.1472021173" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/> | ||||
| 							<builder id="cdt.managedbuild.builder.gnu.cross.1637284033" managedBuildOn="false" name="Gnu Make Builder.Default" superClass="cdt.managedbuild.builder.gnu.cross"/> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.c.compiler.491990707" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler"> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.281613902" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.1024192712" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler"> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1583119359" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.c.linker.1594327068" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.cpp.linker.408936561" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker"> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.377882542" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input"> | ||||
| 									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> | ||||
| 									<additionalInput kind="additionalinput" paths="$(LIBS)"/> | ||||
| 								</inputType> | ||||
| 							</tool> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.archiver.1387717882" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.assembler.146555242" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler"> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1034678525" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> | ||||
| 							</tool> | ||||
| 						</toolChain> | ||||
| 					</folderInfo> | ||||
| 				</configuration> | ||||
| 			</storageModule> | ||||
| 			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> | ||||
| 		</cconfiguration> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | ||||
| 		<project id="dhrystone.null.1977941895" name="dhrystone"/> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="scannerConfiguration"> | ||||
| 		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> | ||||
| 	<storageModule moduleId="refreshScope"/> | ||||
| 	<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"> | ||||
| 		<buildTargets> | ||||
| 			<target name="all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 				<buildCommand>make</buildCommand> | ||||
| 				<buildArguments/> | ||||
| 				<buildTarget>all</buildTarget> | ||||
| 				<stopOnError>true</stopOnError> | ||||
| 				<useDefaultCommand>true</useDefaultCommand> | ||||
| 				<runAllBuilders>true</runAllBuilders> | ||||
| 			</target> | ||||
| 			<target name="clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 				<buildCommand>make</buildCommand> | ||||
| 				<buildTarget>clean</buildTarget> | ||||
| 				<stopOnError>true</stopOnError> | ||||
| 				<useDefaultCommand>true</useDefaultCommand> | ||||
| 				<runAllBuilders>true</runAllBuilders> | ||||
| 			</target> | ||||
| 			<target name="all BOARD=tgc-vp" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 				<buildCommand>make</buildCommand> | ||||
| 				<buildArguments/> | ||||
| 				<buildTarget>all BOARD=tgc-vp</buildTarget> | ||||
| 				<stopOnError>true</stopOnError> | ||||
| 				<useDefaultCommand>true</useDefaultCommand> | ||||
| 				<runAllBuilders>true</runAllBuilders> | ||||
| 			</target> | ||||
| 			<target name="all BOARD=iss" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 				<buildCommand>make</buildCommand> | ||||
| 				<buildArguments/> | ||||
| 				<buildTarget>all BOARD=iss</buildTarget> | ||||
| 				<stopOnError>true</stopOnError> | ||||
| 				<useDefaultCommand>true</useDefaultCommand> | ||||
| 				<runAllBuilders>true</runAllBuilders> | ||||
| 			</target> | ||||
| 		</buildTargets> | ||||
| 	</storageModule> | ||||
| </cproject> | ||||
| @@ -1,3 +0,0 @@ | ||||
| target remote :20000 | ||||
| set remotebreak | ||||
| b main | ||||
							
								
								
									
										2
									
								
								benchmarks/dhrystone/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								benchmarks/dhrystone/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,2 +0,0 @@ | ||||
| dhrystone | ||||
| /dhrystone.dis | ||||
| @@ -1,28 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>dhrystone</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 		<project>bare-metal-bsp</project> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> | ||||
| 			<triggers>clean,full,incremental,</triggers> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> | ||||
| 			<triggers>full,incremental,</triggers> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.cdt.core.cnature</nature> | ||||
| 		<nature>org.eclipse.cdt.core.ccnature</nature> | ||||
| 		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> | ||||
| 		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> | ||||
| 	</natures> | ||||
| </projectDescription> | ||||
| @@ -1,24 +0,0 @@ | ||||
| TARGET := dhrystone | ||||
| ISA?=imc | ||||
|  | ||||
| ASM_SRCS :=  | ||||
| C_SRCS := dhry_stubs.c dhry_printf.c dhry_1.c dhry_2.c | ||||
| HEADERS := dhry.h | ||||
|  | ||||
| BOARD=iss | ||||
| LINK_TARGET=link | ||||
| RISCV_ARCH:=rv32$(ISA) | ||||
| ifneq (,$(findstring e,$(ISA))) | ||||
|     RISCV_ABI:=ilp32e | ||||
| else | ||||
|     RISCV_ABI:=ilp32 | ||||
| endif | ||||
| # '-lgcc -lm' are needed to add softfloat routines | ||||
| CFLAGS  := -g -march=$(RISCV_ARCH)_zicsr_zifencei -mabi=$(RISCV_ABI) -mcmodel=medlow -O3 -DHZ=32768 -DTIME -DNO_INIT -fno-inline -fno-builtin-printf -fno-common -Wno-implicit \ | ||||
|  -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 | ||||
|  | ||||
| TOOL_DIR=$(dir $(compiler)) | ||||
|  | ||||
| BSP_BASE = ../../bare-metal-bsp | ||||
| include $(BSP_BASE)/env/common-gcc.mk | ||||
| @@ -1,423 +0,0 @@ | ||||
| /* | ||||
|  **************************************************************************** | ||||
|  * | ||||
|  *                   "DHRYSTONE" Benchmark Program | ||||
|  *                   ----------------------------- | ||||
|  *                                                                             | ||||
|  *  Version:    C, Version 2.1 | ||||
|  *                                                                             | ||||
|  *  File:       dhry.h (part 1 of 3) | ||||
|  * | ||||
|  *  Date:       May 25, 1988 | ||||
|  * | ||||
|  *  Author:     Reinhold P. Weicker | ||||
|  *                      Siemens AG, AUT E 51 | ||||
|  *                      Postfach 3220 | ||||
|  *                      8520 Erlangen | ||||
|  *                      Germany (West) | ||||
|  *                              Phone:  [+49]-9131-7-20330 | ||||
|  *                                      (8-17 Central European Time) | ||||
|  *                              Usenet: ..!mcsun!unido!estevax!weicker | ||||
|  * | ||||
|  *              Original Version (in Ada) published in | ||||
|  *              "Communications of the ACM" vol. 27., no. 10 (Oct. 1984), | ||||
|  *              pp. 1013 - 1030, together with the statistics | ||||
|  *              on which the distribution of statements etc. is based. | ||||
|  * | ||||
|  *              In this C version, the following C library functions are used: | ||||
|  *              - strcpy, strcmp (inside the measurement loop) | ||||
|  *              - printf, scanf (outside the measurement loop) | ||||
|  *              In addition, Berkeley UNIX system calls "times ()" or "time ()" | ||||
|  *              are used for execution time measurement. For measurements | ||||
|  *              on other systems, these calls have to be changed. | ||||
|  * | ||||
|  *  Collection of Results: | ||||
|  *              Reinhold Weicker (address see above) and | ||||
|  *               | ||||
|  *              Rick Richardson | ||||
|  *              PC Research. Inc. | ||||
|  *              94 Apple Orchard Drive | ||||
|  *              Tinton Falls, NJ 07724 | ||||
|  *                      Phone:  (201) 389-8963 (9-17 EST)                | ||||
|  *                      Usenet: ...!uunet!pcrat!rick | ||||
|  * | ||||
|  *      Please send results to Rick Richardson and/or Reinhold Weicker. | ||||
|  *      Complete information should be given on hardware and software used. | ||||
|  *      Hardware information includes: Machine type, CPU, type and size | ||||
|  *      of caches; for microprocessors: clock frequency, memory speed | ||||
|  *      (number of wait states). | ||||
|  *      Software information includes: Compiler (and runtime library) | ||||
|  *      manufacturer and version, compilation switches, OS version. | ||||
|  *      The Operating System version may give an indication about the | ||||
|  *      compiler; Dhrystone itself performs no OS calls in the measurement loop. | ||||
|  * | ||||
|  *      The complete output generated by the program should be mailed | ||||
|  *      such that at least some checks for correctness can be made. | ||||
|  * | ||||
|  *************************************************************************** | ||||
|  * | ||||
|  *  History:    This version C/2.1 has been made for two reasons: | ||||
|  * | ||||
|  *              1) There is an obvious need for a common C version of | ||||
|  *              Dhrystone, since C is at present the most popular system | ||||
|  *              programming language for the class of processors | ||||
|  *              (microcomputers, minicomputers) where Dhrystone is used most. | ||||
|  *              There should be, as far as possible, only one C version of | ||||
|  *              Dhrystone such that results can be compared without | ||||
|  *              restrictions. In the past, the C versions distributed | ||||
|  *              by Rick Richardson (Version 1.1) and by Reinhold Weicker | ||||
|  *              had small (though not significant) differences. | ||||
|  * | ||||
|  *              2) As far as it is possible without changes to the Dhrystone | ||||
|  *              statistics, optimizing compilers should be prevented from | ||||
|  *              removing significant statements. | ||||
|  * | ||||
|  *              This C version has been developed in cooperation with | ||||
|  *              Rick Richardson (Tinton Falls, NJ), it incorporates many | ||||
|  *              ideas from the "Version 1.1" distributed previously by | ||||
|  *              him over the UNIX network Usenet. | ||||
|  *              I also thank Chaim Benedelac (National Semiconductor), | ||||
|  *              David Ditzel (SUN), Earl Killian and John Mashey (MIPS), | ||||
|  *              Alan Smith and Rafael Saavedra-Barrera (UC at Berkeley) | ||||
|  *              for their help with comments on earlier versions of the | ||||
|  *              benchmark. | ||||
|  * | ||||
|  *  Changes:    In the initialization part, this version follows mostly | ||||
|  *              Rick Richardson's version distributed via Usenet, not the | ||||
|  *              version distributed earlier via floppy disk by Reinhold Weicker. | ||||
|  *              As a concession to older compilers, names have been made | ||||
|  *              unique within the first 8 characters. | ||||
|  *              Inside the measurement loop, this version follows the | ||||
|  *              version previously distributed by Reinhold Weicker. | ||||
|  * | ||||
|  *              At several places in the benchmark, code has been added, | ||||
|  *              but within the measurement loop only in branches that  | ||||
|  *              are not executed. The intention is that optimizing compilers | ||||
|  *              should be prevented from moving code out of the measurement | ||||
|  *              loop, or from removing code altogether. Since the statements | ||||
|  *              that are executed within the measurement loop have NOT been | ||||
|  *              changed, the numbers defining the "Dhrystone distribution" | ||||
|  *              (distribution of statements, operand types and locality) | ||||
|  *              still hold. Except for sophisticated optimizing compilers, | ||||
|  *              execution times for this version should be the same as | ||||
|  *              for previous versions. | ||||
|  *               | ||||
|  *              Since it has proven difficult to subtract the time for the | ||||
|  *              measurement loop overhead in a correct way, the loop check | ||||
|  *              has been made a part of the benchmark. This does have | ||||
|  *              an impact - though a very minor one - on the distribution | ||||
|  *              statistics which have been updated for this version. | ||||
|  * | ||||
|  *              All changes within the measurement loop are described | ||||
|  *              and discussed in the companion paper "Rationale for | ||||
|  *              Dhrystone version 2". | ||||
|  * | ||||
|  *              Because of the self-imposed limitation that the order and | ||||
|  *              distribution of the executed statements should not be | ||||
|  *              changed, there are still cases where optimizing compilers | ||||
|  *              may not generate code for some statements. To a certain | ||||
|  *              degree, this is unavoidable for small synthetic benchmarks. | ||||
|  *              Users of the benchmark are advised to check code listings | ||||
|  *              whether code is generated for all statements of Dhrystone. | ||||
|  * | ||||
|  *              Version 2.1 is identical to version 2.0 distributed via | ||||
|  *              the UNIX network Usenet in March 1988 except that it corrects | ||||
|  *              some minor deficiencies that were found by users of version 2.0. | ||||
|  *              The only change within the measurement loop is that a | ||||
|  *              non-executed "else" part was added to the "if" statement in | ||||
|  *              Func_3, and a non-executed "else" part removed from Proc_3. | ||||
|  * | ||||
|  *************************************************************************** | ||||
|  * | ||||
|  * Defines:     The following "Defines" are possible: | ||||
|  *              -DREG=register          (default: Not defined) | ||||
|  *                      As an approximation to what an average C programmer | ||||
|  *                      might do, the "register" storage class is applied | ||||
|  *                      (if enabled by -DREG=register) | ||||
|  *                      - for local variables, if they are used (dynamically) | ||||
|  *                        five or more times | ||||
|  *                      - for parameters if they are used (dynamically) | ||||
|  *                        six or more times | ||||
|  *                      Note that an optimal "register" strategy is | ||||
|  *                      compiler-dependent, and that "register" declarations | ||||
|  *                      do not necessarily lead to faster execution. | ||||
|  *              -DNOSTRUCTASSIGN        (default: Not defined) | ||||
|  *                      Define if the C compiler does not support | ||||
|  *                      assignment of structures. | ||||
|  *              -DNOENUMS               (default: Not defined) | ||||
|  *                      Define if the C compiler does not support | ||||
|  *                      enumeration types. | ||||
|  *              -DTIMES                 (default) | ||||
|  *              -DTIME | ||||
|  *                      The "times" function of UNIX (returning process times) | ||||
|  *                      or the "time" function (returning wallclock time) | ||||
|  *                      is used for measurement.  | ||||
|  *                      For single user machines, "time ()" is adequate. For | ||||
|  *                      multi-user machines where you cannot get single-user | ||||
|  *                      access, use the "times ()" function. If you have | ||||
|  *                      neither, use a stopwatch in the dead of night. | ||||
|  *                      "printf"s are provided marking the points "Start Timer" | ||||
|  *                      and "Stop Timer". DO NOT use the UNIX "time(1)" | ||||
|  *                      command, as this will measure the total time to | ||||
|  *                      run this program, which will (erroneously) include | ||||
|  *                      the time to allocate storage (malloc) and to perform | ||||
|  *                      the initialization. | ||||
|  *              -DHZ=nnn | ||||
|  *                      In Berkeley UNIX, the function "times" returns process | ||||
|  *                      time in 1/HZ seconds, with HZ = 60 for most systems. | ||||
|  *                      CHECK YOUR SYSTEM DESCRIPTION BEFORE YOU JUST APPLY | ||||
|  *                      A VALUE. | ||||
|  * | ||||
|  *************************************************************************** | ||||
|  * | ||||
|  *  Compilation model and measurement (IMPORTANT): | ||||
|  * | ||||
|  *  This C version of Dhrystone consists of three files: | ||||
|  *  - dhry.h (this file, containing global definitions and comments) | ||||
|  *  - dhry_1.c (containing the code corresponding to Ada package Pack_1) | ||||
|  *  - dhry_2.c (containing the code corresponding to Ada package Pack_2) | ||||
|  * | ||||
|  *  The following "ground rules" apply for measurements: | ||||
|  *  - Separate compilation | ||||
|  *  - No procedure merging | ||||
|  *  - Otherwise, compiler optimizations are allowed but should be indicated | ||||
|  *  - Default results are those without register declarations | ||||
|  *  See the companion paper "Rationale for Dhrystone Version 2" for a more | ||||
|  *  detailed discussion of these ground rules. | ||||
|  * | ||||
|  *  For 16-Bit processors (e.g. 80186, 80286), times for all compilation | ||||
|  *  models ("small", "medium", "large" etc.) should be given if possible, | ||||
|  *  together with a definition of these models for the compiler system used. | ||||
|  * | ||||
|  ************************************************************************** | ||||
|  * | ||||
|  *  Dhrystone (C version) statistics: | ||||
|  * | ||||
|  *  [Comment from the first distribution, updated for version 2. | ||||
|  *   Note that because of language differences, the numbers are slightly | ||||
|  *   different from the Ada version.] | ||||
|  * | ||||
|  *  The following program contains statements of a high level programming | ||||
|  *  language (here: C) in a distribution considered representative:            | ||||
|  * | ||||
|  *    assignments                  52 (51.0 %) | ||||
|  *    control statements           33 (32.4 %) | ||||
|  *    procedure, function calls    17 (16.7 %) | ||||
|  * | ||||
|  *  103 statements are dynamically executed. The program is balanced with | ||||
|  *  respect to the three aspects:                                              | ||||
|  * | ||||
|  *    - statement type | ||||
|  *    - operand type | ||||
|  *    - operand locality | ||||
|  *         operand global, local, parameter, or constant.                      | ||||
|  * | ||||
|  *  The combination of these three aspects is balanced only approximately.     | ||||
|  * | ||||
|  *  1. Statement Type:                                                         | ||||
|  *  -----------------             number | ||||
|  * | ||||
|  *     V1 = V2                     9 | ||||
|  *       (incl. V1 = F(..) | ||||
|  *     V = Constant               12 | ||||
|  *     Assignment,                 7 | ||||
|  *       with array element | ||||
|  *     Assignment,                 6 | ||||
|  *       with record component | ||||
|  *                                -- | ||||
|  *                                34       34 | ||||
|  * | ||||
|  *     X = Y +|-|"&&"|"|" Z        5 | ||||
|  *     X = Y +|-|"==" Constant     6 | ||||
|  *     X = X +|- 1                 3 | ||||
|  *     X = Y *|/ Z                 2 | ||||
|  *     X = Expression,             1 | ||||
|  *           two operators | ||||
|  *     X = Expression,             1 | ||||
|  *           three operators | ||||
|  *                                -- | ||||
|  *                                18       18 | ||||
|  * | ||||
|  *     if ....                    14 | ||||
|  *       with "else"      7 | ||||
|  *       without "else"   7 | ||||
|  *           executed        3 | ||||
|  *           not executed    4 | ||||
|  *     for ...                     7  |  counted every time | ||||
|  *     while ...                   4  |  the loop condition | ||||
|  *     do ... while                1  |  is evaluated | ||||
|  *     switch ...                  1 | ||||
|  *     break                       1 | ||||
|  *     declaration with            1 | ||||
|  *       initialization | ||||
|  *                                -- | ||||
|  *                                34       34 | ||||
|  * | ||||
|  *     P (...)  procedure call    11 | ||||
|  *       user procedure      10 | ||||
|  *       library procedure    1 | ||||
|  *     X = F (...) | ||||
|  *             function  call      6 | ||||
|  *       user function        5                                          | ||||
|  *       library function     1                                                | ||||
|  *                                --                                           | ||||
|  *                                17       17 | ||||
|  *                                        --- | ||||
|  *                                        103 | ||||
|  * | ||||
|  *    The average number of parameters in procedure or function calls | ||||
|  *    is 1.82 (not counting the function values as implicit parameters). | ||||
|  * | ||||
|  * | ||||
|  *  2. Operators | ||||
|  *  ------------ | ||||
|  *                          number    approximate | ||||
|  *                                    percentage | ||||
|  * | ||||
|  *    Arithmetic             32          50.8                                  | ||||
|  * | ||||
|  *       +                     21          33.3                               | ||||
|  *       -                      7          11.1                               | ||||
|  *       *                      3           4.8 | ||||
|  *       / (int div)            1           1.6 | ||||
|  * | ||||
|  *    Comparison             27           42.8 | ||||
|  * | ||||
|  *       ==                     9           14.3 | ||||
|  *       /=                     4            6.3 | ||||
|  *       >                      1            1.6 | ||||
|  *       <                      3            4.8 | ||||
|  *       >=                     1            1.6 | ||||
|  *       <=                     9           14.3 | ||||
|  * | ||||
|  *    Logic                   4            6.3 | ||||
|  * | ||||
|  *       && (AND-THEN)          1            1.6 | ||||
|  *       |  (OR)                1            1.6 | ||||
|  *       !  (NOT)               2            3.2 | ||||
|  *  | ||||
|  *                           --          ----- | ||||
|  *                           63          100.1 | ||||
|  * | ||||
|  * | ||||
|  *  3. Operand Type (counted once per operand reference): | ||||
|  *  --------------- | ||||
|  *                          number    approximate | ||||
|  *                                    percentage | ||||
|  * | ||||
|  *     Integer               175        72.3 % | ||||
|  *     Character              45        18.6 % | ||||
|  *     Pointer                12         5.0 % | ||||
|  *     String30                6         2.5 % | ||||
|  *     Array                   2         0.8 % | ||||
|  *     Record                  2         0.8 % | ||||
|  *                           ---       ------- | ||||
|  *                           242       100.0 % | ||||
|  * | ||||
|  *  When there is an access path leading to the final operand (e.g. a record | ||||
|  *  component), only the final data type on the access path is counted.        | ||||
|  * | ||||
|  * | ||||
|  *  4. Operand Locality:                                                       | ||||
|  *  ------------------- | ||||
|  *                                number    approximate | ||||
|  *                                          percentage | ||||
|  * | ||||
|  *     local variable              114        47.1 % | ||||
|  *     global variable              22         9.1 % | ||||
|  *     parameter                    45        18.6 % | ||||
|  *        value                        23         9.5 % | ||||
|  *        reference                    22         9.1 % | ||||
|  *     function result               6         2.5 % | ||||
|  *     constant                     55        22.7 % | ||||
|  *                                 ---       ------- | ||||
|  *                                 242       100.0 % | ||||
|  * | ||||
|  * | ||||
|  *  The program does not compute anything meaningful, but it is syntactically | ||||
|  *  and semantically correct. All variables have a value assigned to them | ||||
|  *  before they are used as a source operand. | ||||
|  * | ||||
|  *  There has been no explicit effort to account for the effects of a | ||||
|  *  cache, or to balance the use of long or short displacements for code or | ||||
|  *  data. | ||||
|  * | ||||
|  *************************************************************************** | ||||
|  */ | ||||
|  | ||||
| /* Compiler and system dependent definitions: */ | ||||
|  | ||||
| #ifndef TIME | ||||
| #define TIMES | ||||
| #endif | ||||
|                 /* Use times(2) time function unless    */ | ||||
|                 /* explicitly defined otherwise         */ | ||||
|  | ||||
| #ifdef TIMES | ||||
| #include <sys/types.h> | ||||
| #include <sys/times.h> | ||||
|                 /* for "times" */ | ||||
| #endif | ||||
|  | ||||
| #define Mic_secs_Per_Second     1000000 | ||||
|                 /* Berkeley UNIX C returns process times in seconds/HZ */ | ||||
|  | ||||
| #ifdef  NOSTRUCTASSIGN | ||||
| #define structassign(d, s)      memcpy(&(d), &(s), sizeof(d)) | ||||
| #else | ||||
| #define structassign(d, s)      d = s | ||||
| #endif | ||||
|  | ||||
| #ifdef  NOENUM | ||||
| #define Ident_1 0 | ||||
| #define Ident_2 1 | ||||
| #define Ident_3 2 | ||||
| #define Ident_4 3 | ||||
| #define Ident_5 4 | ||||
|   typedef int   Enumeration; | ||||
| #else | ||||
|   typedef       enum    {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5} | ||||
|                 Enumeration; | ||||
| #endif | ||||
|         /* for boolean and enumeration types in Ada, Pascal */ | ||||
|  | ||||
| /* General definitions: */ | ||||
|  | ||||
| #include <stdio.h> | ||||
|                 /* for strcpy, strcmp */ | ||||
|  | ||||
| #define Null 0  | ||||
|                 /* Value of a Null pointer */ | ||||
| #define true  1 | ||||
| #define false 0 | ||||
|  | ||||
| typedef int     One_Thirty; | ||||
| typedef int     One_Fifty; | ||||
| typedef char    Capital_Letter; | ||||
| typedef int     Boolean; | ||||
| typedef char    Str_30 [31]; | ||||
| typedef int     Arr_1_Dim [50]; | ||||
| typedef int     Arr_2_Dim [50] [50]; | ||||
|  | ||||
| typedef struct record  | ||||
|     { | ||||
|     struct record *Ptr_Comp; | ||||
|     Enumeration    Discr; | ||||
|     union { | ||||
|           struct { | ||||
|                   Enumeration Enum_Comp; | ||||
|                   int         Int_Comp; | ||||
|                   char        Str_Comp [31]; | ||||
|                   } var_1; | ||||
|           struct { | ||||
|                   Enumeration E_Comp_2; | ||||
|                   char        Str_2_Comp [31]; | ||||
|                   } var_2; | ||||
|           struct { | ||||
|                   char        Ch_1_Comp; | ||||
|                   char        Ch_2_Comp; | ||||
|                   } var_3; | ||||
|           } variant; | ||||
|       } Rec_Type, *Rec_Pointer; | ||||
|  | ||||
|  | ||||
| @@ -1,386 +0,0 @@ | ||||
| /* | ||||
|  **************************************************************************** | ||||
|  * | ||||
|  *                   "DHRYSTONE" Benchmark Program | ||||
|  *                   ----------------------------- | ||||
|  *                                                                             | ||||
|  *  Version:    C, Version 2.1 | ||||
|  *                                                                             | ||||
|  *  File:       dhry_1.c (part 2 of 3) | ||||
|  * | ||||
|  *  Date:       May 25, 1988 | ||||
|  * | ||||
|  *  Author:     Reinhold P. Weicker | ||||
|  * | ||||
|  **************************************************************************** | ||||
|  */ | ||||
|  | ||||
| #include "dhry.h" | ||||
| extern char* strcpy(char* dest, const char* src); | ||||
|  | ||||
| /* Global Variables: */ | ||||
|  | ||||
| Rec_Pointer     Ptr_Glob, | ||||
|                 Next_Ptr_Glob; | ||||
| int             Int_Glob; | ||||
| Boolean         Bool_Glob; | ||||
| char            Ch_1_Glob, | ||||
|                 Ch_2_Glob; | ||||
| int             Arr_1_Glob [50]; | ||||
| int             Arr_2_Glob [50] [50]; | ||||
|  | ||||
| extern void     *malloc (); | ||||
| Enumeration     Func_1 (); | ||||
|   /* forward declaration necessary since Enumeration may not simply be int */ | ||||
|  | ||||
| #ifndef REG | ||||
|         Boolean Reg = false; | ||||
| #define REG | ||||
|         /* REG becomes defined as empty */ | ||||
|         /* i.e. no register variables   */ | ||||
| #else | ||||
|         Boolean Reg = true; | ||||
| #endif | ||||
|  | ||||
| /* variables for time measurement: */ | ||||
|  | ||||
| #ifdef TIMES | ||||
| struct tms      time_info; | ||||
| extern  int     times (); | ||||
|                 /* see library function "times" */ | ||||
| #define Too_Small_Time 120 | ||||
|                 /* Measurements should last at least about 2 seconds */ | ||||
| #endif | ||||
| #ifdef TIME | ||||
| extern long     time(); | ||||
|                 /* see library function "time"  */ | ||||
| #define Too_Small_Time 2 | ||||
|                 /* Measurements should last at least 2 seconds */ | ||||
| #endif | ||||
|  | ||||
| long            Begin_Time, | ||||
|                 End_Time, | ||||
|                 User_Time; | ||||
| float           Microseconds, | ||||
|                 Dhrystones_Per_Second; | ||||
|  | ||||
| /* end of variables for time measurement */ | ||||
|  | ||||
|  | ||||
| main () | ||||
| /*****/ | ||||
|  | ||||
|   /* main program, corresponds to procedures        */ | ||||
|   /* Main and Proc_0 in the Ada version             */ | ||||
| { | ||||
|         One_Fifty       Int_1_Loc; | ||||
|   REG   One_Fifty       Int_2_Loc; | ||||
|         One_Fifty       Int_3_Loc; | ||||
|   REG   char            Ch_Index; | ||||
|         Enumeration     Enum_Loc; | ||||
|         Str_30          Str_1_Loc; | ||||
|         Str_30          Str_2_Loc; | ||||
|   REG   int             Run_Index; | ||||
|   REG   int             Number_Of_Runs; | ||||
|  | ||||
|   /* Initializations */ | ||||
|  | ||||
|   Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); | ||||
|   Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); | ||||
|  | ||||
|   Ptr_Glob->Ptr_Comp                    = Next_Ptr_Glob; | ||||
|   Ptr_Glob->Discr                       = Ident_1; | ||||
|   Ptr_Glob->variant.var_1.Enum_Comp     = Ident_3; | ||||
|   Ptr_Glob->variant.var_1.Int_Comp      = 40; | ||||
|   strcpy (Ptr_Glob->variant.var_1.Str_Comp,  | ||||
|           "DHRYSTONE PROGRAM, SOME STRING"); | ||||
|   strcpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING"); | ||||
|  | ||||
|   Arr_2_Glob [8][7] = 10; | ||||
|         /* Was missing in published program. Without this statement,    */ | ||||
|         /* Arr_2_Glob [8][7] would have an undefined value.             */ | ||||
|         /* Warning: With 16-Bit processors and Number_Of_Runs > 32000,  */ | ||||
|         /* overflow may occur for this array element.                   */ | ||||
|  | ||||
|   printf ("\n"); | ||||
|   printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); | ||||
|   printf ("\n"); | ||||
|   if (Reg) | ||||
|   { | ||||
|     printf ("Program compiled with 'register' attribute\n"); | ||||
|     printf ("\n"); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     printf ("Program compiled without 'register' attribute\n"); | ||||
|     printf ("\n"); | ||||
|   } | ||||
|   printf ("Please give the number of runs through the benchmark: "); | ||||
|   { | ||||
|     int n; | ||||
|     scanf ("%d", &n); | ||||
|     Number_Of_Runs = n; | ||||
|   } | ||||
|   printf ("\n"); | ||||
|  | ||||
|   printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs); | ||||
|  | ||||
|   /***************/ | ||||
|   /* Start timer */ | ||||
|   /***************/ | ||||
|   | ||||
| #ifdef TIMES | ||||
|   times (&time_info); | ||||
|   Begin_Time = (long) time_info.tms_utime; | ||||
| #endif | ||||
| #ifdef TIME | ||||
|   Begin_Time = time ( (long *) 0); | ||||
| #endif | ||||
|  | ||||
|   for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) | ||||
|   { | ||||
|  | ||||
|     Proc_5(); | ||||
|     Proc_4(); | ||||
|       /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ | ||||
|     Int_1_Loc = 2; | ||||
|     Int_2_Loc = 3; | ||||
|     strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); | ||||
|     Enum_Loc = Ident_2; | ||||
|     Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); | ||||
|       /* Bool_Glob == 1 */ | ||||
|     while (Int_1_Loc < Int_2_Loc)  /* loop body executed once */ | ||||
|     { | ||||
|       Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; | ||||
|         /* Int_3_Loc == 7 */ | ||||
|       Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); | ||||
|         /* Int_3_Loc == 7 */ | ||||
|       Int_1_Loc += 1; | ||||
|     } /* while */ | ||||
|       /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ | ||||
|     Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); | ||||
|       /* Int_Glob == 5 */ | ||||
|     Proc_1 (Ptr_Glob); | ||||
|     for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) | ||||
|                              /* loop body executed twice */ | ||||
|     { | ||||
|       if (Enum_Loc == Func_1 (Ch_Index, 'C')) | ||||
|           /* then, not executed */ | ||||
|         { | ||||
|         Proc_6 (Ident_1, &Enum_Loc); | ||||
|         strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); | ||||
|         Int_2_Loc = Run_Index; | ||||
|         Int_Glob = Run_Index; | ||||
|         } | ||||
|     } | ||||
|       /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ | ||||
|     Int_2_Loc = Int_2_Loc * Int_1_Loc; | ||||
|     Int_1_Loc = Int_2_Loc / Int_3_Loc; | ||||
|     Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; | ||||
|       /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ | ||||
|     Proc_2 (&Int_1_Loc); | ||||
|       /* Int_1_Loc == 5 */ | ||||
|  | ||||
|   } /* loop "for Run_Index" */ | ||||
|  | ||||
|   /**************/ | ||||
|   /* Stop timer */ | ||||
|   /**************/ | ||||
|    | ||||
| #ifdef TIMES | ||||
|   times (&time_info); | ||||
|   End_Time = (long) time_info.tms_utime; | ||||
| #endif | ||||
| #ifdef TIME | ||||
|   End_Time = time ( (long *) 0); | ||||
| #endif | ||||
|  | ||||
|   printf ("Execution ends\n"); | ||||
|   printf ("\n"); | ||||
|   printf ("Final values of the variables used in the benchmark:\n"); | ||||
|   printf ("\n"); | ||||
|   printf ("Int_Glob:            %d\n", Int_Glob); | ||||
|   printf ("        should be:   %d\n", 5); | ||||
|   printf ("Bool_Glob:           %d\n", Bool_Glob); | ||||
|   printf ("        should be:   %d\n", 1); | ||||
|   printf ("Ch_1_Glob:           %c\n", Ch_1_Glob); | ||||
|   printf ("        should be:   %c\n", 'A'); | ||||
|   printf ("Ch_2_Glob:           %c\n", Ch_2_Glob); | ||||
|   printf ("        should be:   %c\n", 'B'); | ||||
|   printf ("Arr_1_Glob[8]:       %d\n", Arr_1_Glob[8]); | ||||
|   printf ("        should be:   %d\n", 7); | ||||
|   printf ("Arr_2_Glob[8][7]:    %d\n", Arr_2_Glob[8][7]); | ||||
|   printf ("        should be:   Number_Of_Runs + 10\n"); | ||||
|   printf ("Ptr_Glob->\n"); | ||||
|   printf ("  Ptr_Comp:          %d\n", (int) Ptr_Glob->Ptr_Comp); | ||||
|   printf ("        should be:   (implementation-dependent)\n"); | ||||
|   printf ("  Discr:             %d\n", Ptr_Glob->Discr); | ||||
|   printf ("        should be:   %d\n", 0); | ||||
|   printf ("  Enum_Comp:         %d\n", Ptr_Glob->variant.var_1.Enum_Comp); | ||||
|   printf ("        should be:   %d\n", 2); | ||||
|   printf ("  Int_Comp:          %d\n", Ptr_Glob->variant.var_1.Int_Comp); | ||||
|   printf ("        should be:   %d\n", 17); | ||||
|   printf ("  Str_Comp:          %s\n", Ptr_Glob->variant.var_1.Str_Comp); | ||||
|   printf ("        should be:   DHRYSTONE PROGRAM, SOME STRING\n"); | ||||
|   printf ("Next_Ptr_Glob->\n"); | ||||
|   printf ("  Ptr_Comp:          %d\n", (int) Next_Ptr_Glob->Ptr_Comp); | ||||
|   printf ("        should be:   (implementation-dependent), same as above\n"); | ||||
|   printf ("  Discr:             %d\n", Next_Ptr_Glob->Discr); | ||||
|   printf ("        should be:   %d\n", 0); | ||||
|   printf ("  Enum_Comp:         %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); | ||||
|   printf ("        should be:   %d\n", 1); | ||||
|   printf ("  Int_Comp:          %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); | ||||
|   printf ("        should be:   %d\n", 18); | ||||
|   printf ("  Str_Comp:          %s\n", | ||||
|                                 Next_Ptr_Glob->variant.var_1.Str_Comp); | ||||
|   printf ("        should be:   DHRYSTONE PROGRAM, SOME STRING\n"); | ||||
|   printf ("Int_1_Loc:           %d\n", Int_1_Loc); | ||||
|   printf ("        should be:   %d\n", 5); | ||||
|   printf ("Int_2_Loc:           %d\n", Int_2_Loc); | ||||
|   printf ("        should be:   %d\n", 13); | ||||
|   printf ("Int_3_Loc:           %d\n", Int_3_Loc); | ||||
|   printf ("        should be:   %d\n", 7); | ||||
|   printf ("Enum_Loc:            %d\n", Enum_Loc); | ||||
|   printf ("        should be:   %d\n", 1); | ||||
|   printf ("Str_1_Loc:           %s\n", Str_1_Loc); | ||||
|   printf ("        should be:   DHRYSTONE PROGRAM, 1'ST STRING\n"); | ||||
|   printf ("Str_2_Loc:           %s\n", Str_2_Loc); | ||||
|   printf ("        should be:   DHRYSTONE PROGRAM, 2'ND STRING\n"); | ||||
|   printf ("\n"); | ||||
|  | ||||
|   User_Time = End_Time - Begin_Time; | ||||
|  | ||||
|   if (User_Time < Too_Small_Time) | ||||
|   { | ||||
|     printf ("Measured time too small to obtain meaningful results\n"); | ||||
|     printf ("Please increase number of runs\n"); | ||||
|     printf ("\n"); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
| #ifdef TIME | ||||
|     Microseconds = ((float) User_Time/(float)HZ) * Mic_secs_Per_Second | ||||
|                         / (float) Number_Of_Runs; | ||||
|     Dhrystones_Per_Second = (float) Number_Of_Runs / ((float) User_Time/(float)HZ); | ||||
| #else | ||||
|     Microseconds = (float) User_Time * Mic_secs_Per_Second  | ||||
|                         / ((float) HZ * ((float) Number_Of_Runs)); | ||||
|     Dhrystones_Per_Second = ((float) HZ * (float) Number_Of_Runs) | ||||
|                         / (float) User_Time; | ||||
| #endif | ||||
|     printf ("Microseconds for one run through Dhrystone: "); | ||||
|     printf ("%6.1f \n", Microseconds); | ||||
|     printf ("Dhrystones per Second:                      "); | ||||
|     printf ("%6.1f \n", Dhrystones_Per_Second); | ||||
|     printf ("\n"); | ||||
|   } | ||||
|    | ||||
| } | ||||
|  | ||||
|  | ||||
| Proc_1 (Ptr_Val_Par) | ||||
| /******************/ | ||||
|  | ||||
| REG Rec_Pointer Ptr_Val_Par; | ||||
|     /* executed once */ | ||||
| { | ||||
|   REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp;   | ||||
|                                         /* == Ptr_Glob_Next */ | ||||
|   /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp,    */ | ||||
|   /* corresponds to "rename" in Ada, "with" in Pascal           */ | ||||
|    | ||||
|   structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob);  | ||||
|   Ptr_Val_Par->variant.var_1.Int_Comp = 5; | ||||
|   Next_Record->variant.var_1.Int_Comp  | ||||
|         = Ptr_Val_Par->variant.var_1.Int_Comp; | ||||
|   Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp; | ||||
|   Proc_3 (&Next_Record->Ptr_Comp); | ||||
|     /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp  | ||||
|                         == Ptr_Glob->Ptr_Comp */ | ||||
|   if (Next_Record->Discr == Ident_1) | ||||
|     /* then, executed */ | ||||
|   { | ||||
|     Next_Record->variant.var_1.Int_Comp = 6; | ||||
|     Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp,  | ||||
|            &Next_Record->variant.var_1.Enum_Comp); | ||||
|     Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp; | ||||
|     Proc_7 (Next_Record->variant.var_1.Int_Comp, 10,  | ||||
|            &Next_Record->variant.var_1.Int_Comp); | ||||
|   } | ||||
|   else /* not executed */ | ||||
|     structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp); | ||||
| } /* Proc_1 */ | ||||
|  | ||||
|  | ||||
| Proc_2 (Int_Par_Ref) | ||||
| /******************/ | ||||
|     /* executed once */ | ||||
|     /* *Int_Par_Ref == 1, becomes 4 */ | ||||
|  | ||||
| One_Fifty   *Int_Par_Ref; | ||||
| { | ||||
|   One_Fifty  Int_Loc;   | ||||
|   Enumeration   Enum_Loc; | ||||
|  | ||||
|   Int_Loc = *Int_Par_Ref + 10; | ||||
|   do /* executed once */ | ||||
|     if (Ch_1_Glob == 'A') | ||||
|       /* then, executed */ | ||||
|     { | ||||
|       Int_Loc -= 1; | ||||
|       *Int_Par_Ref = Int_Loc - Int_Glob; | ||||
|       Enum_Loc = Ident_1; | ||||
|     } /* if */ | ||||
|   while (Enum_Loc != Ident_1); /* true */ | ||||
| } /* Proc_2 */ | ||||
|  | ||||
|  | ||||
| Proc_3 (Ptr_Ref_Par) | ||||
| /******************/ | ||||
|     /* executed once */ | ||||
|     /* Ptr_Ref_Par becomes Ptr_Glob */ | ||||
|  | ||||
| Rec_Pointer *Ptr_Ref_Par; | ||||
|  | ||||
| { | ||||
|   if (Ptr_Glob != Null) | ||||
|     /* then, executed */ | ||||
|     *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp; | ||||
|   Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp); | ||||
| } /* Proc_3 */ | ||||
|  | ||||
|  | ||||
| Proc_4 () /* without parameters */ | ||||
| /*******/ | ||||
|     /* executed once */ | ||||
| { | ||||
|   Boolean Bool_Loc; | ||||
|  | ||||
|   Bool_Loc = Ch_1_Glob == 'A'; | ||||
|   Bool_Glob = Bool_Loc | Bool_Glob; | ||||
|   Ch_2_Glob = 'B'; | ||||
| } /* Proc_4 */ | ||||
|  | ||||
|  | ||||
| Proc_5 () /* without parameters */ | ||||
| /*******/ | ||||
|     /* executed once */ | ||||
| { | ||||
|   Ch_1_Glob = 'A'; | ||||
|   Bool_Glob = false; | ||||
| } /* Proc_5 */ | ||||
|  | ||||
|  | ||||
|         /* Procedure for the assignment of structures,          */ | ||||
|         /* if the C compiler doesn't support this feature       */ | ||||
| #ifdef  NOSTRUCTASSIGN | ||||
| memcpy (d, s, l) | ||||
| register char   *d; | ||||
| register char   *s; | ||||
| register int    l; | ||||
| { | ||||
|         while (l--) *d++ = *s++; | ||||
| } | ||||
| #endif | ||||
|  | ||||
|  | ||||
| @@ -1,192 +0,0 @@ | ||||
| /* | ||||
|  **************************************************************************** | ||||
|  * | ||||
|  *                   "DHRYSTONE" Benchmark Program | ||||
|  *                   ----------------------------- | ||||
|  *                                                                             | ||||
|  *  Version:    C, Version 2.1 | ||||
|  *                                                                             | ||||
|  *  File:       dhry_2.c (part 3 of 3) | ||||
|  * | ||||
|  *  Date:       May 25, 1988 | ||||
|  * | ||||
|  *  Author:     Reinhold P. Weicker | ||||
|  * | ||||
|  **************************************************************************** | ||||
|  */ | ||||
|  | ||||
| #include "dhry.h" | ||||
|  | ||||
| #ifndef REG | ||||
| #define REG | ||||
|         /* REG becomes defined as empty */ | ||||
|         /* i.e. no register variables   */ | ||||
| #endif | ||||
|  | ||||
| extern  int     Int_Glob; | ||||
| extern  char    Ch_1_Glob; | ||||
|  | ||||
|  | ||||
| Proc_6 (Enum_Val_Par, Enum_Ref_Par) | ||||
| /*********************************/ | ||||
|     /* executed once */ | ||||
|     /* Enum_Val_Par == Ident_3, Enum_Ref_Par becomes Ident_2 */ | ||||
|  | ||||
| Enumeration  Enum_Val_Par; | ||||
| Enumeration *Enum_Ref_Par; | ||||
| { | ||||
|   *Enum_Ref_Par = Enum_Val_Par; | ||||
|   if (! Func_3 (Enum_Val_Par)) | ||||
|     /* then, not executed */ | ||||
|     *Enum_Ref_Par = Ident_4; | ||||
|   switch (Enum_Val_Par) | ||||
|   { | ||||
|     case Ident_1:  | ||||
|       *Enum_Ref_Par = Ident_1; | ||||
|       break; | ||||
|     case Ident_2:  | ||||
|       if (Int_Glob > 100) | ||||
|         /* then */ | ||||
|       *Enum_Ref_Par = Ident_1; | ||||
|       else *Enum_Ref_Par = Ident_4; | ||||
|       break; | ||||
|     case Ident_3: /* executed */ | ||||
|       *Enum_Ref_Par = Ident_2; | ||||
|       break; | ||||
|     case Ident_4: break; | ||||
|     case Ident_5:  | ||||
|       *Enum_Ref_Par = Ident_3; | ||||
|       break; | ||||
|   } /* switch */ | ||||
| } /* Proc_6 */ | ||||
|  | ||||
|  | ||||
| Proc_7 (Int_1_Par_Val, Int_2_Par_Val, Int_Par_Ref) | ||||
| /**********************************************/ | ||||
|     /* executed three times                                      */  | ||||
|     /* first call:      Int_1_Par_Val == 2, Int_2_Par_Val == 3,  */ | ||||
|     /*                  Int_Par_Ref becomes 7                    */ | ||||
|     /* second call:     Int_1_Par_Val == 10, Int_2_Par_Val == 5, */ | ||||
|     /*                  Int_Par_Ref becomes 17                   */ | ||||
|     /* third call:      Int_1_Par_Val == 6, Int_2_Par_Val == 10, */ | ||||
|     /*                  Int_Par_Ref becomes 18                   */ | ||||
| One_Fifty       Int_1_Par_Val; | ||||
| One_Fifty       Int_2_Par_Val; | ||||
| One_Fifty      *Int_Par_Ref; | ||||
| { | ||||
|   One_Fifty Int_Loc; | ||||
|  | ||||
|   Int_Loc = Int_1_Par_Val + 2; | ||||
|   *Int_Par_Ref = Int_2_Par_Val + Int_Loc; | ||||
| } /* Proc_7 */ | ||||
|  | ||||
|  | ||||
| Proc_8 (Arr_1_Par_Ref, Arr_2_Par_Ref, Int_1_Par_Val, Int_2_Par_Val) | ||||
| /*********************************************************************/ | ||||
|     /* executed once      */ | ||||
|     /* Int_Par_Val_1 == 3 */ | ||||
|     /* Int_Par_Val_2 == 7 */ | ||||
| Arr_1_Dim       Arr_1_Par_Ref; | ||||
| Arr_2_Dim       Arr_2_Par_Ref; | ||||
| int             Int_1_Par_Val; | ||||
| int             Int_2_Par_Val; | ||||
| { | ||||
|   REG One_Fifty Int_Index; | ||||
|   REG One_Fifty Int_Loc; | ||||
|  | ||||
|   Int_Loc = Int_1_Par_Val + 5; | ||||
|   Arr_1_Par_Ref [Int_Loc] = Int_2_Par_Val; | ||||
|   Arr_1_Par_Ref [Int_Loc+1] = Arr_1_Par_Ref [Int_Loc]; | ||||
|   Arr_1_Par_Ref [Int_Loc+30] = Int_Loc; | ||||
|   for (Int_Index = Int_Loc; Int_Index <= Int_Loc+1; ++Int_Index) | ||||
|     Arr_2_Par_Ref [Int_Loc] [Int_Index] = Int_Loc; | ||||
|   Arr_2_Par_Ref [Int_Loc] [Int_Loc-1] += 1; | ||||
|   Arr_2_Par_Ref [Int_Loc+20] [Int_Loc] = Arr_1_Par_Ref [Int_Loc]; | ||||
|   Int_Glob = 5; | ||||
| } /* Proc_8 */ | ||||
|  | ||||
|  | ||||
| Enumeration Func_1 (Ch_1_Par_Val, Ch_2_Par_Val) | ||||
| /*************************************************/ | ||||
|     /* executed three times                                         */ | ||||
|     /* first call:      Ch_1_Par_Val == 'H', Ch_2_Par_Val == 'R'    */ | ||||
|     /* second call:     Ch_1_Par_Val == 'A', Ch_2_Par_Val == 'C'    */ | ||||
|     /* third call:      Ch_1_Par_Val == 'B', Ch_2_Par_Val == 'C'    */ | ||||
|  | ||||
| Capital_Letter   Ch_1_Par_Val; | ||||
| Capital_Letter   Ch_2_Par_Val; | ||||
| { | ||||
|   Capital_Letter        Ch_1_Loc; | ||||
|   Capital_Letter        Ch_2_Loc; | ||||
|  | ||||
|   Ch_1_Loc = Ch_1_Par_Val; | ||||
|   Ch_2_Loc = Ch_1_Loc; | ||||
|   if (Ch_2_Loc != Ch_2_Par_Val) | ||||
|     /* then, executed */ | ||||
|     return (Ident_1); | ||||
|   else  /* not executed */ | ||||
|   { | ||||
|     Ch_1_Glob = Ch_1_Loc; | ||||
|     return (Ident_2); | ||||
|    } | ||||
| } /* Func_1 */ | ||||
|  | ||||
|  | ||||
| Boolean Func_2 (Str_1_Par_Ref, Str_2_Par_Ref) | ||||
| /*************************************************/ | ||||
|     /* executed once */ | ||||
|     /* Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" */ | ||||
|     /* Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */ | ||||
|  | ||||
| Str_30  Str_1_Par_Ref; | ||||
| Str_30  Str_2_Par_Ref; | ||||
| { | ||||
|   REG One_Thirty        Int_Loc; | ||||
|       Capital_Letter    Ch_Loc; | ||||
|  | ||||
|   Int_Loc = 2; | ||||
|   while (Int_Loc <= 2) /* loop body executed once */ | ||||
|     if (Func_1 (Str_1_Par_Ref[Int_Loc], | ||||
|                 Str_2_Par_Ref[Int_Loc+1]) == Ident_1) | ||||
|       /* then, executed */ | ||||
|     { | ||||
|       Ch_Loc = 'A'; | ||||
|       Int_Loc += 1; | ||||
|     } /* if, while */ | ||||
|   if (Ch_Loc >= 'W' && Ch_Loc < 'Z') | ||||
|     /* then, not executed */ | ||||
|     Int_Loc = 7; | ||||
|   if (Ch_Loc == 'R') | ||||
|     /* then, not executed */ | ||||
|     return (true); | ||||
|   else /* executed */ | ||||
|   { | ||||
|     if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0) | ||||
|       /* then, not executed */ | ||||
|     { | ||||
|       Int_Loc += 7; | ||||
|       Int_Glob = Int_Loc; | ||||
|       return (true); | ||||
|     } | ||||
|     else /* executed */ | ||||
|       return (false); | ||||
|   } /* if Ch_Loc */ | ||||
| } /* Func_2 */ | ||||
|  | ||||
|  | ||||
| Boolean Func_3 (Enum_Par_Val) | ||||
| /***************************/ | ||||
|     /* executed once        */ | ||||
|     /* Enum_Par_Val == Ident_3 */ | ||||
| Enumeration Enum_Par_Val; | ||||
| { | ||||
|   Enumeration Enum_Loc; | ||||
|  | ||||
|   Enum_Loc = Enum_Par_Val; | ||||
|   if (Enum_Loc == Ident_3) | ||||
|     /* then, executed */ | ||||
|     return (true); | ||||
|   else /* not executed */ | ||||
|     return (false); | ||||
| } /* Func_3 */ | ||||
|  | ||||
| @@ -1,15 +0,0 @@ | ||||
| /* The functions in this file are only meant to support Dhrystone on an | ||||
|  * embedded RV32 system and are obviously incorrect in general. */ | ||||
|  | ||||
| #include <stdarg.h> | ||||
| #include <stddef.h> | ||||
| #include <stdio.h> | ||||
| #include <stdint.h> | ||||
| #include <string.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| //#undef putchar | ||||
| //int putchar(int ch) | ||||
| //{ | ||||
| //  return write(1, &ch, 1) == 1 ? ch : -1; | ||||
| //} | ||||
| @@ -1,22 +0,0 @@ | ||||
| #include "platform.h" | ||||
|  | ||||
| /* 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(); | ||||
| } | ||||
|  | ||||
| // set the number of dhrystone iterations | ||||
| void __wrap_scanf(const char* fmt, int* n) | ||||
| { | ||||
|   *n = 200000; | ||||
| } | ||||
|  | ||||
| extern volatile uint32_t tohost; | ||||
|  | ||||
| void exit(int n){ | ||||
|       tohost = 0x1; | ||||
|       for (;;); | ||||
| } | ||||
| @@ -1,90 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> | ||||
| 	<storageModule moduleId="org.eclipse.cdt.core.settings"> | ||||
| 		<cconfiguration id="cdt.managedbuild.toolchain.gnu.cross.base.710702645"> | ||||
| 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.cross.base.710702645" moduleId="org.eclipse.cdt.core.settings" name="Default"> | ||||
| 				<externalSettings/> | ||||
| 				<extensions> | ||||
| 					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 				</extensions> | ||||
| 			</storageModule> | ||||
| 			<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | ||||
| 				<configuration buildProperties="" id="cdt.managedbuild.toolchain.gnu.cross.base.710702645" name="Default" optionalBuildProperties="" parent="org.eclipse.cdt.build.core.emptycfg"> | ||||
| 					<folderInfo id="cdt.managedbuild.toolchain.gnu.cross.base.710702645.1430959477" name="/" resourcePath=""> | ||||
| 						<toolChain id="cdt.managedbuild.toolchain.gnu.cross.base.1474410205" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.base"> | ||||
| 							<option id="cdt.managedbuild.option.gnu.cross.prefix.2012376392" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix"/> | ||||
| 							<option id="cdt.managedbuild.option.gnu.cross.path.1855531274" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path"/> | ||||
| 							<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.58618619" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/> | ||||
| 							<builder id="cdt.managedbuild.builder.gnu.cross.2103802912" managedBuildOn="false" name="Gnu Make Builder.Default" superClass="cdt.managedbuild.builder.gnu.cross"/> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.c.compiler.1943289705" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler"> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.916400771" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.395349778" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler"> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.456264055" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.c.linker.361119866" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.cpp.linker.256085709" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker"> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1129115777" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input"> | ||||
| 									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> | ||||
| 									<additionalInput kind="additionalinput" paths="$(LIBS)"/> | ||||
| 								</inputType> | ||||
| 							</tool> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.archiver.1555926248" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.assembler.1451131906" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler"> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1651368058" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> | ||||
| 							</tool> | ||||
| 						</toolChain> | ||||
| 					</folderInfo> | ||||
| 				</configuration> | ||||
| 			</storageModule> | ||||
| 			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> | ||||
| 		</cconfiguration> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | ||||
| 		<project id="hello-world.null.1044706684" name="hello-world"/> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="scannerConfiguration"> | ||||
| 		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> | ||||
| 	<storageModule moduleId="refreshScope"/> | ||||
| 	<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"> | ||||
| 		<buildTargets> | ||||
| 			<target name="all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 				<buildCommand>make</buildCommand> | ||||
| 				<buildTarget>all</buildTarget> | ||||
| 				<stopOnError>true</stopOnError> | ||||
| 				<useDefaultCommand>true</useDefaultCommand> | ||||
| 				<runAllBuilders>true</runAllBuilders> | ||||
| 			</target> | ||||
| 			<target name="clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 				<buildCommand>make</buildCommand> | ||||
| 				<buildTarget>clean</buildTarget> | ||||
| 				<stopOnError>true</stopOnError> | ||||
| 				<useDefaultCommand>true</useDefaultCommand> | ||||
| 				<runAllBuilders>true</runAllBuilders> | ||||
| 			</target> | ||||
| 			<target name="clean all BOARD=tgc-vp" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 				<buildCommand>make</buildCommand> | ||||
| 				<buildArguments/> | ||||
| 				<buildTarget>clean all BOARD=tgc-vp</buildTarget> | ||||
| 				<stopOnError>true</stopOnError> | ||||
| 				<useDefaultCommand>true</useDefaultCommand> | ||||
| 				<runAllBuilders>true</runAllBuilders> | ||||
| 			</target> | ||||
| 			<target name="clean all BOARD=iss" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 				<buildCommand>make</buildCommand> | ||||
| 				<buildArguments/> | ||||
| 				<buildTarget>clean all BOARD=iss</buildTarget> | ||||
| 				<stopOnError>true</stopOnError> | ||||
| 				<useDefaultCommand>true</useDefaultCommand> | ||||
| 				<runAllBuilders>true</runAllBuilders> | ||||
| 			</target> | ||||
| 		</buildTargets> | ||||
| 	</storageModule> | ||||
| </cproject> | ||||
							
								
								
									
										2
									
								
								hello-world/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								hello-world/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,2 +0,0 @@ | ||||
| /hello | ||||
| /hello.dis | ||||
| @@ -1,27 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>hello-world</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> | ||||
| 			<triggers>clean,full,incremental,</triggers> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> | ||||
| 			<triggers>full,incremental,</triggers> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.cdt.core.cnature</nature> | ||||
| 		<nature>org.eclipse.cdt.core.ccnature</nature> | ||||
| 		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> | ||||
| 		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> | ||||
| 	</natures> | ||||
| </projectDescription> | ||||
| @@ -1,27 +0,0 @@ | ||||
| TARGET  = hello | ||||
| ISA?=imc | ||||
|  | ||||
| C_SRCS  = $(wildcard *.c)  | ||||
| HEADERS = $(wildcard *.h) | ||||
| OPT ?= -O2 | ||||
| CFLAGS += $(OPT) -g  | ||||
|  | ||||
| BOARD=iss | ||||
| LINK_TARGET=link | ||||
| RISCV_ARCH:=rv32$(ISA) | ||||
| ifneq (,$(findstring e,$(ISA))) | ||||
|     RISCV_ABI:=ilp32e | ||||
| else | ||||
|     RISCV_ABI:=ilp32 | ||||
| endif | ||||
| LDFLAGS += -g -Wl,--wrap=printf | ||||
|  | ||||
| compiler := $(shell which riscv64-unknown-elf-gcc) | ||||
| TOOL_DIR=$(dir $(compiler)) | ||||
|  | ||||
| TRIPLET=riscv64-unknown-elf | ||||
| BSP_BASE = ../bare-metal-bsp | ||||
| include $(BSP_BASE)/env/common-gcc.mk | ||||
|  | ||||
| $(TARGET).vlog:$(TARGET) | ||||
| 	riscv32-unknown-elf-objcopy -O verilog $(TARGET) $(TARGET).vlog | ||||
| @@ -1,24 +0,0 @@ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| #include "platform.h" | ||||
| #include "encoding.h" | ||||
|  | ||||
| int factorial(int i){ | ||||
|  | ||||
| 	volatile int result = 1; | ||||
| 	for (int ii = 1; ii <= i; ii++) { | ||||
| 		result = result * ii; | ||||
| 	} | ||||
| 	return result; | ||||
|  | ||||
| } | ||||
|  | ||||
| int main() | ||||
| { | ||||
| 	volatile int result = factorial (10); | ||||
| 	printf("Factorial is %d\n", result); | ||||
| 	printf("End of execution"); | ||||
| 	return 0; | ||||
| } | ||||
| @@ -1,15 +0,0 @@ | ||||
| #include "platform.h" | ||||
|  | ||||
| /* 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() / get_timer_freq(); | ||||
| } | ||||
|  | ||||
| // set the number of dhrystone iterations | ||||
| void __wrap_scanf(const char* fmt, int* n) | ||||
| { | ||||
|   *n = 100000000; | ||||
| } | ||||
| @@ -1,235 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> | ||||
| 	<storageModule moduleId="org.eclipse.cdt.core.settings"> | ||||
| 		<cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.debug.1288357282"> | ||||
| 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.debug.1288357282" moduleId="org.eclipse.cdt.core.settings" name="Debug"> | ||||
| 				<externalSettings/> | ||||
| 				<extensions> | ||||
| 					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 				</extensions> | ||||
| 			</storageModule> | ||||
| 			<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | ||||
| 				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.cross.exe.debug.1288357282" name="Debug" optionalBuildProperties="org.eclipse.cdt.docker.launcher.containerbuild.property.selectedvolumes=,org.eclipse.cdt.docker.launcher.containerbuild.property.volumes=" parent="cdt.managedbuild.config.gnu.cross.exe.debug"> | ||||
| 					<folderInfo id="cdt.managedbuild.config.gnu.cross.exe.debug.1288357282." name="/" resourcePath=""> | ||||
| 						<toolChain id="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.base.487598026" name="RISC-V Cross GCC" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.base"> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix.739333701" name="Prefix" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix" value="riscv64-unknown-elf-" valueType="string"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.suffix.766315301" name="Suffix" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.suffix"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c.229029585" name="C compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c" value="gcc" valueType="string"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp.381216421" name="C++ compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp" value="g++" valueType="string"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar.1952880948" name="Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar" value="ar" valueType="string"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy.1068397601" name="Hex/Bin converter" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy" value="objcopy" valueType="string"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump.1046710740" name="Listing generator" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump" value="objdump" valueType="string"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size.471667509" name="Size command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size" value="size" valueType="string"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make.293151496" name="Build command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make" value="make" valueType="string"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm.132896088" name="Remove command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm" value="rm" valueType="string"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.useglobalpath.1182695252" name="Use global path" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.useglobalpath"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.path.236750408" name="Path" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.path"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash.305557055" name="Create flash image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash" value="true" valueType="boolean"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting.644417611" name="Create extended listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.1010686072" name="Print size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize" value="true" valueType="boolean"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base.1395177494" name="Architecture" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply.680944124" name="Multiply extension (RVM)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.atomic.1752274498" name="Atomic extension (RVA)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.atomic"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.fp.2087823384" name="Floating point" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.fp"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.compressed.1749967731" name="Compressed extension (RVC)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.compressed"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer.480064871" name="Integer ABI" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.fp.1298303538" name="Floating point ABI" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.fp"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.tune.10334132" name="Tuning" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.tune"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.codemodel.365634305" name="Code model" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.codemodel"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.smalldatalimit.620989205" name="Small data limit" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.smalldatalimit"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.saverestore.455171985" name="Small prologue/epilogue (-msave-restore)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.saverestore"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.memcpy.1575786123" name="Force string operations to call library functions (-mmemcpy)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.memcpy"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.plt.1446412614" name="Allow use of PLTs (-mplt)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.plt"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.fdiv.1197230025" name="Floating-point divide/sqrt instructions (-mfdiv)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.fdiv"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.div.1569253410" name="Integer divide instructions (-mdiv)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.div"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.other.1328393393" name="Other target flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.other"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.959055674" name="Optimization Level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength.752594545" name="Message length (-fmessage-length=0)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar.1039278591" name="'char' is signed (-fsigned-char)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections.92698749" name="Function sections (-ffunction-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections.1398243902" name="Data sections (-fdata-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nocommon.1523577295" name="No common unitialized (-fno-common)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nocommon"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.noinlinefunctions.1160609701" name="Do not inline functions (-fno-inline-functions)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.noinlinefunctions"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.freestanding.80437893" name="Assume freestanding environment (-ffreestanding)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.freestanding"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nobuiltin.1841419435" name="Disable builtin (-fno-builtin)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nobuiltin"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.spconstant.69879503" name="Single precision constants (-fsingle-precision-constant)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.spconstant"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.PIC.1762990053" name="Position independent code (-fPIC)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.PIC"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.lto.1205887170" name="Link-time optimizer (-flto)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.lto"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nomoveloopinvariants.928491977" name="Disable loop invariant move (-fno-move-loop-invariants)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nomoveloopinvariants"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.other.1133880867" name="Other optimization flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.other"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name.1974354242" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name" value="RISC-V GCC/Newlib" valueType="string"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.syntaxonly.1972553342" name="Check syntax only (-fsyntax-only)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.syntaxonly"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.pedantic.187053015" name="Pedantic (-pedantic)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.pedantic"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.pedanticerrors.640932931" name="Pedantic warnings as errors (-pedantic-errors)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.pedanticerrors"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.nowarn.1719501651" name="Inhibit all warnings (-w)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.nowarn"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.unused.1142538364" name="Warn on various unused elements (-Wunused)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.unused"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.uninitialized.1461390572" name="Warn on uninitialized variables (-Wuninitialised)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.uninitialized"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.allwarn.667751861" name="Enable all common warnings (-Wall)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.allwarn"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.extrawarn.1082819004" name="Enable extra warnings (-Wextra)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.extrawarn"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.missingdeclaration.1491888665" name="Warn on undeclared global function (-Wmissing-declaration)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.missingdeclaration"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.conversion.1702934317" name="Warn on implicit conversions (-Wconversion)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.conversion"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.pointerarith.826971250" name="Warn if pointer arithmetic (-Wpointer-arith)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.pointerarith"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.padded.1676705619" name="Warn if padding is included (-Wpadded)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.padded"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.shadow.874882498" name="Warn if shadowed variable (-Wshadow)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.shadow"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.logicalop.1671309998" name="Warn if suspicious logical ops (-Wlogical-op)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.logicalop"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.agreggatereturn.1210043337" name="Warn if struct is returned (-Wagreggate-return)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.agreggatereturn"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.floatequal.1422457505" name="Warn if floats are compared as equal (-Wfloat-equal)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.floatequal"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.toerrors.995631866" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.toerrors"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.other.541873018" name="Other warning flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.other"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.1932452748" name="Debug level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format.2068938187" name="Debug format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.prof.112768011" name="Generate prof information (-p)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.prof"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.gprof.680551562" name="Generate gprof information (-pg)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.gprof"/> | ||||
| 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.other.107524958" name="Other debugging flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.other"/> | ||||
| 							<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform.407550864" isAbstract="false" osList="all" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform"/> | ||||
| 							<builder id="ilg.gnumcueclipse.managedbuild.cross.riscv.builder.1966027628" keepEnvironmentInBuildfile="true" managedBuildOn="false" name="Gnu Make Builder" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.builder"/> | ||||
| 							<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.977312615" name="GNU RISC-V Cross Assembler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler"> | ||||
| 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor.1916041529" name="Use preprocessor" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor" value="true" valueType="boolean"/> | ||||
| 								<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input.1601334211" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1123076801" name="GNU RISC-V Cross C Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler"> | ||||
| 								<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.818006879" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.1451909464" name="GNU RISC-V Cross C++ Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler"> | ||||
| 								<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.input.1707187335" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.956243520" name="GNU RISC-V Cross C Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker"> | ||||
| 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections.431540641" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections" value="true" valueType="boolean"/> | ||||
| 							</tool> | ||||
| 							<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker.31864598" name="GNU RISC-V Cross C++ Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker"> | ||||
| 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.gcsections.1436969788" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.gcsections" value="true" valueType="boolean"/> | ||||
| 								<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker.input.348230601" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker.input"> | ||||
| 									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> | ||||
| 									<additionalInput kind="additionalinput" paths="$(LIBS)"/> | ||||
| 								</inputType> | ||||
| 							</tool> | ||||
| 							<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver.227642664" name="GNU RISC-V Cross Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver"/> | ||||
| 							<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash.352194398" name="GNU RISC-V Cross Create Flash Image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash"/> | ||||
| 							<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting.1693132208" name="GNU RISC-V Cross Create Listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting"> | ||||
| 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.source.17227038" name="Display source (--source|-S)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.source" value="true" valueType="boolean"/> | ||||
| 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.allheaders.487042561" name="Display all headers (--all-headers|-x)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.allheaders" value="true" valueType="boolean"/> | ||||
| 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.demangle.1014918594" name="Demangle names (--demangle|-C)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.demangle" value="true" valueType="boolean"/> | ||||
| 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.linenumbers.1086352455" name="Display line numbers (--line-numbers|-l)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.linenumbers" value="true" valueType="boolean"/> | ||||
| 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.wide.1518764803" name="Wide lines (--wide|-w)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.wide" value="true" valueType="boolean"/> | ||||
| 							</tool> | ||||
| 							<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize.1565810565" name="GNU RISC-V Cross Print Size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize"> | ||||
| 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.printsize.format.374116974" name="Size format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.printsize.format"/> | ||||
| 							</tool> | ||||
| 						</toolChain> | ||||
| 					</folderInfo> | ||||
| 				</configuration> | ||||
| 			</storageModule> | ||||
| 			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> | ||||
| 			<storageModule moduleId="ilg.gnumcueclipse.managedbuild.packs"/> | ||||
| 			<storageModule buildDir="build/${ConfigName}" moduleId="de.marw.cdt.cmake.core.settings"> | ||||
| 				<options/> | ||||
| 			</storageModule> | ||||
| 		</cconfiguration> | ||||
| 		<cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.release.1031824371"> | ||||
| 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.release.1031824371" moduleId="org.eclipse.cdt.core.settings" name="Release"> | ||||
| 				<externalSettings/> | ||||
| 				<extensions> | ||||
| 					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 				</extensions> | ||||
| 			</storageModule> | ||||
| 			<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | ||||
| 				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.cross.exe.release.1031824371" name="Release" optionalBuildProperties="" parent="cdt.managedbuild.config.gnu.cross.exe.release"> | ||||
| 					<folderInfo id="cdt.managedbuild.config.gnu.cross.exe.release.1031824371." name="/" resourcePath=""> | ||||
| 						<toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.release.1438664554" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.release"> | ||||
| 							<option id="cdt.managedbuild.option.gnu.cross.prefix.1474979048" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix" value="riscv32-unknown-elf" valueType="string"/> | ||||
| 							<option id="cdt.managedbuild.option.gnu.cross.path.1676659144" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path" value="/opt/riscv/rv32i/bin" valueType="string"/> | ||||
| 							<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.828841384" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/> | ||||
| 							<builder buildPath="${workspace_loc:/simple-test}/Release" id="cdt.managedbuild.builder.gnu.cross.2000177921" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="cdt.managedbuild.builder.gnu.cross"/> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.c.compiler.560143013" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler"> | ||||
| 								<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.1661151579" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/> | ||||
| 								<option id="gnu.c.compiler.option.debugging.level.1316374933" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.326742547" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.256458056" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler"> | ||||
| 								<option id="gnu.cpp.compiler.option.optimization.level.1139272133" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/> | ||||
| 								<option id="gnu.cpp.compiler.option.debugging.level.547676250" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.437879445" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.c.linker.214344343" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.cpp.linker.477233781" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker"> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.165180109" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input"> | ||||
| 									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> | ||||
| 									<additionalInput kind="additionalinput" paths="$(LIBS)"/> | ||||
| 								</inputType> | ||||
| 							</tool> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.archiver.1545006586" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cross.assembler.30210068" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler"> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.2040238556" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> | ||||
| 							</tool> | ||||
| 						</toolChain> | ||||
| 					</folderInfo> | ||||
| 				</configuration> | ||||
| 			</storageModule> | ||||
| 			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> | ||||
| 		</cconfiguration> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | ||||
| 		<project id="simple-test.cdt.managedbuild.target.gnu.cross.exe.2047670776" name="Executable" projectType="cdt.managedbuild.target.gnu.cross.exe"/> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> | ||||
| 	<storageModule moduleId="refreshScope" versionNumber="2"> | ||||
| 		<configuration configurationName="Debug"> | ||||
| 			<resource resourceType="PROJECT" workspacePath="/simple-test"/> | ||||
| 		</configuration> | ||||
| 		<configuration configurationName="Release"> | ||||
| 			<resource resourceType="PROJECT" workspacePath="/simple-test"/> | ||||
| 		</configuration> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/> | ||||
| 	<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"> | ||||
| 		<buildTargets> | ||||
| 			<target name="all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 				<buildCommand>make</buildCommand> | ||||
| 				<buildArguments/> | ||||
| 				<buildTarget>all</buildTarget> | ||||
| 				<stopOnError>true</stopOnError> | ||||
| 				<useDefaultCommand>true</useDefaultCommand> | ||||
| 				<runAllBuilders>true</runAllBuilders> | ||||
| 			</target> | ||||
| 			<target name="clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 				<buildCommand>make</buildCommand> | ||||
| 				<buildArguments/> | ||||
| 				<buildTarget>clean</buildTarget> | ||||
| 				<stopOnError>true</stopOnError> | ||||
| 				<useDefaultCommand>true</useDefaultCommand> | ||||
| 				<runAllBuilders>true</runAllBuilders> | ||||
| 			</target> | ||||
| 		</buildTargets> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="scannerConfiguration"> | ||||
| 		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> | ||||
| 		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cross.exe.release.1031824371;cdt.managedbuild.config.gnu.cross.exe.release.1031824371.;cdt.managedbuild.tool.gnu.cross.cpp.compiler.256458056;cdt.managedbuild.tool.gnu.cpp.compiler.input.437879445"> | ||||
| 			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> | ||||
| 		</scannerConfigBuildInfo> | ||||
| 		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cross.exe.debug.1288357282;cdt.managedbuild.config.gnu.cross.exe.debug.1288357282.;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1123076801;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.818006879"> | ||||
| 			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> | ||||
| 		</scannerConfigBuildInfo> | ||||
| 		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cross.exe.debug.1288357282;cdt.managedbuild.config.gnu.cross.exe.debug.1288357282.;cdt.managedbuild.tool.gnu.cross.cpp.compiler.2110352016;cdt.managedbuild.tool.gnu.cpp.compiler.input.1211604423"> | ||||
| 			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> | ||||
| 		</scannerConfigBuildInfo> | ||||
| 		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cross.exe.debug.1288357282;cdt.managedbuild.config.gnu.cross.exe.debug.1288357282.;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.1451909464;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.input.1707187335"> | ||||
| 			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> | ||||
| 		</scannerConfigBuildInfo> | ||||
| 		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cross.exe.debug.1288357282;cdt.managedbuild.config.gnu.cross.exe.debug.1288357282.;cdt.managedbuild.tool.gnu.cross.c.compiler.1226990822;cdt.managedbuild.tool.gnu.c.compiler.input.980325680"> | ||||
| 			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> | ||||
| 		</scannerConfigBuildInfo> | ||||
| 		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cross.exe.release.1031824371;cdt.managedbuild.config.gnu.cross.exe.release.1031824371.;cdt.managedbuild.tool.gnu.cross.c.compiler.560143013;cdt.managedbuild.tool.gnu.c.compiler.input.326742547"> | ||||
| 			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> | ||||
| 		</scannerConfigBuildInfo> | ||||
| 	</storageModule> | ||||
| </cproject> | ||||
| @@ -1,28 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>hello</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 		<project>bsp</project> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> | ||||
| 			<triggers>clean,full,incremental,</triggers> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> | ||||
| 			<triggers>full,incremental,</triggers> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.cdt.core.cnature</nature> | ||||
| 		<nature>org.eclipse.cdt.core.ccnature</nature> | ||||
| 		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> | ||||
| 		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> | ||||
| 	</natures> | ||||
| </projectDescription> | ||||
| @@ -1,13 +0,0 @@ | ||||
|  | ||||
| TARGET = hello | ||||
| C_SRCS += $(wildcard *.c)  | ||||
| CFLAGS += -g  | ||||
| #-fno-builtin-printf | ||||
| LDFLAGS := -Wl,--wrap=scanf -Wl,--wrap=printf  | ||||
|  | ||||
| #BOARD = iss | ||||
| BOARD=freedom-e300-hifive1 | ||||
| TOOL_DIR=/opt/shared/riscv/FreedomStudio/20180122/SiFive/riscv64-unknown-elf-gcc-20171231-x86_64-linux-centos6/bin | ||||
|  | ||||
| BSP_BASE = ./bsp | ||||
| include $(BSP_BASE)/env/common.mk | ||||
| @@ -1,24 +0,0 @@ | ||||
| ################################################################################ | ||||
| # Automatically-generated file. Do not edit! | ||||
| ################################################################################ | ||||
|  | ||||
| # Add inputs and outputs from these tool invocations to the build variables  | ||||
| C_SRCS += \ | ||||
| ../drivers/fe300prci/fe300prci_driver.c  | ||||
|  | ||||
| OBJS += \ | ||||
| ./drivers/fe300prci/fe300prci_driver.o  | ||||
|  | ||||
| C_DEPS += \ | ||||
| ./drivers/fe300prci/fe300prci_driver.d  | ||||
|  | ||||
|  | ||||
| # Each subdirectory must supply rules for building sources it contributes | ||||
| drivers/fe300prci/%.o: ../drivers/fe300prci/%.c | ||||
| 	@echo 'Building file: $<' | ||||
| 	@echo 'Invoking: Cross GCC Compiler' | ||||
| 	riscv32-unknown-elf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" | ||||
| 	@echo 'Finished building: $<' | ||||
| 	@echo ' ' | ||||
|  | ||||
|  | ||||
| @@ -1,24 +0,0 @@ | ||||
| ################################################################################ | ||||
| # Automatically-generated file. Do not edit! | ||||
| ################################################################################ | ||||
|  | ||||
| # Add inputs and outputs from these tool invocations to the build variables  | ||||
| C_SRCS += \ | ||||
| ../drivers/plic/plic_driver.c  | ||||
|  | ||||
| OBJS += \ | ||||
| ./drivers/plic/plic_driver.o  | ||||
|  | ||||
| C_DEPS += \ | ||||
| ./drivers/plic/plic_driver.d  | ||||
|  | ||||
|  | ||||
| # Each subdirectory must supply rules for building sources it contributes | ||||
| drivers/plic/%.o: ../drivers/plic/%.c | ||||
| 	@echo 'Building file: $<' | ||||
| 	@echo 'Invoking: Cross GCC Compiler' | ||||
| 	riscv32-unknown-elf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" | ||||
| 	@echo 'Finished building: $<' | ||||
| 	@echo ' ' | ||||
|  | ||||
|  | ||||
| @@ -1,24 +0,0 @@ | ||||
| ################################################################################ | ||||
| # Automatically-generated file. Do not edit! | ||||
| ################################################################################ | ||||
|  | ||||
| # Add inputs and outputs from these tool invocations to the build variables  | ||||
| C_SRCS += \ | ||||
| ../env/freedom-e300-arty/init.c  | ||||
|  | ||||
| OBJS += \ | ||||
| ./env/freedom-e300-arty/init.o  | ||||
|  | ||||
| C_DEPS += \ | ||||
| ./env/freedom-e300-arty/init.d  | ||||
|  | ||||
|  | ||||
| # Each subdirectory must supply rules for building sources it contributes | ||||
| env/freedom-e300-arty/%.o: ../env/freedom-e300-arty/%.c | ||||
| 	@echo 'Building file: $<' | ||||
| 	@echo 'Invoking: Cross GCC Compiler' | ||||
| 	riscv32-unknown-elf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" | ||||
| 	@echo 'Finished building: $<' | ||||
| 	@echo ' ' | ||||
|  | ||||
|  | ||||
| @@ -1,27 +0,0 @@ | ||||
| ################################################################################ | ||||
| # Automatically-generated file. Do not edit! | ||||
| ################################################################################ | ||||
|  | ||||
| # Add inputs and outputs from these tool invocations to the build variables  | ||||
| C_SRCS += \ | ||||
| ../env/freedom-e300-hifive1/init.c  | ||||
|  | ||||
| O_SRCS += \ | ||||
| ../env/freedom-e300-hifive1/init.o  | ||||
|  | ||||
| OBJS += \ | ||||
| ./env/freedom-e300-hifive1/init.o  | ||||
|  | ||||
| C_DEPS += \ | ||||
| ./env/freedom-e300-hifive1/init.d  | ||||
|  | ||||
|  | ||||
| # Each subdirectory must supply rules for building sources it contributes | ||||
| env/freedom-e300-hifive1/%.o: ../env/freedom-e300-hifive1/%.c | ||||
| 	@echo 'Building file: $<' | ||||
| 	@echo 'Invoking: Cross GCC Compiler' | ||||
| 	riscv32-unknown-elf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" | ||||
| 	@echo 'Finished building: $<' | ||||
| 	@echo ' ' | ||||
|  | ||||
|  | ||||
							
								
								
									
										27
									
								
								hifive1-vp/hello/bsp/Debug/env/iss/subdir.mk
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								hifive1-vp/hello/bsp/Debug/env/iss/subdir.mk
									
									
									
									
										vendored
									
									
								
							| @@ -1,27 +0,0 @@ | ||||
| ################################################################################ | ||||
| # Automatically-generated file. Do not edit! | ||||
| ################################################################################ | ||||
|  | ||||
| # Add inputs and outputs from these tool invocations to the build variables  | ||||
| C_SRCS += \ | ||||
| ../env/iss/init.c  | ||||
|  | ||||
| O_SRCS += \ | ||||
| ../env/iss/init.o  | ||||
|  | ||||
| OBJS += \ | ||||
| ./env/iss/init.o  | ||||
|  | ||||
| C_DEPS += \ | ||||
| ./env/iss/init.d  | ||||
|  | ||||
|  | ||||
| # Each subdirectory must supply rules for building sources it contributes | ||||
| env/iss/%.o: ../env/iss/%.c | ||||
| 	@echo 'Building file: $<' | ||||
| 	@echo 'Invoking: Cross GCC Compiler' | ||||
| 	riscv32-unknown-elf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" | ||||
| 	@echo 'Finished building: $<' | ||||
| 	@echo ' ' | ||||
|  | ||||
|  | ||||
							
								
								
									
										27
									
								
								hifive1-vp/hello/bsp/Debug/env/subdir.mk
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								hifive1-vp/hello/bsp/Debug/env/subdir.mk
									
									
									
									
										vendored
									
									
								
							| @@ -1,27 +0,0 @@ | ||||
| ################################################################################ | ||||
| # Automatically-generated file. Do not edit! | ||||
| ################################################################################ | ||||
|  | ||||
| # Add inputs and outputs from these tool invocations to the build variables  | ||||
| O_SRCS += \ | ||||
| ../env/entry.o \ | ||||
| ../env/start.o  | ||||
|  | ||||
| S_UPPER_SRCS += \ | ||||
| ../env/entry.S \ | ||||
| ../env/start.S  | ||||
|  | ||||
| OBJS += \ | ||||
| ./env/entry.o \ | ||||
| ./env/start.o  | ||||
|  | ||||
|  | ||||
| # Each subdirectory must supply rules for building sources it contributes | ||||
| env/%.o: ../env/%.S | ||||
| 	@echo 'Building file: $<' | ||||
| 	@echo 'Invoking: Cross GCC Assembler' | ||||
| 	riscv32-unknown-elf-as  -o "$@" "$<" | ||||
| 	@echo 'Finished building: $<' | ||||
| 	@echo ' ' | ||||
|  | ||||
|  | ||||
| @@ -1,27 +0,0 @@ | ||||
| ################################################################################ | ||||
| # Automatically-generated file. Do not edit! | ||||
| ################################################################################ | ||||
|  | ||||
| # Add inputs and outputs from these tool invocations to the build variables  | ||||
| C_SRCS += \ | ||||
| ../libwrap/stdlib/malloc.c  | ||||
|  | ||||
| O_SRCS += \ | ||||
| ../libwrap/stdlib/malloc.o  | ||||
|  | ||||
| OBJS += \ | ||||
| ./libwrap/stdlib/malloc.o  | ||||
|  | ||||
| C_DEPS += \ | ||||
| ./libwrap/stdlib/malloc.d  | ||||
|  | ||||
|  | ||||
| # Each subdirectory must supply rules for building sources it contributes | ||||
| libwrap/stdlib/%.o: ../libwrap/stdlib/%.c | ||||
| 	@echo 'Building file: $<' | ||||
| 	@echo 'Invoking: Cross GCC Compiler' | ||||
| 	riscv32-unknown-elf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" | ||||
| 	@echo 'Finished building: $<' | ||||
| 	@echo ' ' | ||||
|  | ||||
|  | ||||
| @@ -1,98 +0,0 @@ | ||||
| ################################################################################ | ||||
| # Automatically-generated file. Do not edit! | ||||
| ################################################################################ | ||||
|  | ||||
| # Add inputs and outputs from these tool invocations to the build variables  | ||||
| C_SRCS += \ | ||||
| ../libwrap/sys/_exit.c \ | ||||
| ../libwrap/sys/close.c \ | ||||
| ../libwrap/sys/execve.c \ | ||||
| ../libwrap/sys/fork.c \ | ||||
| ../libwrap/sys/fstat.c \ | ||||
| ../libwrap/sys/getpid.c \ | ||||
| ../libwrap/sys/isatty.c \ | ||||
| ../libwrap/sys/kill.c \ | ||||
| ../libwrap/sys/link.c \ | ||||
| ../libwrap/sys/lseek.c \ | ||||
| ../libwrap/sys/open.c \ | ||||
| ../libwrap/sys/openat.c \ | ||||
| ../libwrap/sys/read.c \ | ||||
| ../libwrap/sys/sbrk.c \ | ||||
| ../libwrap/sys/stat.c \ | ||||
| ../libwrap/sys/times.c \ | ||||
| ../libwrap/sys/unlink.c \ | ||||
| ../libwrap/sys/wait.c \ | ||||
| ../libwrap/sys/write.c  | ||||
|  | ||||
| O_SRCS += \ | ||||
| ../libwrap/sys/_exit.o \ | ||||
| ../libwrap/sys/close.o \ | ||||
| ../libwrap/sys/execve.o \ | ||||
| ../libwrap/sys/fork.o \ | ||||
| ../libwrap/sys/fstat.o \ | ||||
| ../libwrap/sys/getpid.o \ | ||||
| ../libwrap/sys/isatty.o \ | ||||
| ../libwrap/sys/kill.o \ | ||||
| ../libwrap/sys/link.o \ | ||||
| ../libwrap/sys/lseek.o \ | ||||
| ../libwrap/sys/open.o \ | ||||
| ../libwrap/sys/read.o \ | ||||
| ../libwrap/sys/sbrk.o \ | ||||
| ../libwrap/sys/stat.o \ | ||||
| ../libwrap/sys/times.o \ | ||||
| ../libwrap/sys/unlink.o \ | ||||
| ../libwrap/sys/wait.o \ | ||||
| ../libwrap/sys/write.o  | ||||
|  | ||||
| OBJS += \ | ||||
| ./libwrap/sys/_exit.o \ | ||||
| ./libwrap/sys/close.o \ | ||||
| ./libwrap/sys/execve.o \ | ||||
| ./libwrap/sys/fork.o \ | ||||
| ./libwrap/sys/fstat.o \ | ||||
| ./libwrap/sys/getpid.o \ | ||||
| ./libwrap/sys/isatty.o \ | ||||
| ./libwrap/sys/kill.o \ | ||||
| ./libwrap/sys/link.o \ | ||||
| ./libwrap/sys/lseek.o \ | ||||
| ./libwrap/sys/open.o \ | ||||
| ./libwrap/sys/openat.o \ | ||||
| ./libwrap/sys/read.o \ | ||||
| ./libwrap/sys/sbrk.o \ | ||||
| ./libwrap/sys/stat.o \ | ||||
| ./libwrap/sys/times.o \ | ||||
| ./libwrap/sys/unlink.o \ | ||||
| ./libwrap/sys/wait.o \ | ||||
| ./libwrap/sys/write.o  | ||||
|  | ||||
| C_DEPS += \ | ||||
| ./libwrap/sys/_exit.d \ | ||||
| ./libwrap/sys/close.d \ | ||||
| ./libwrap/sys/execve.d \ | ||||
| ./libwrap/sys/fork.d \ | ||||
| ./libwrap/sys/fstat.d \ | ||||
| ./libwrap/sys/getpid.d \ | ||||
| ./libwrap/sys/isatty.d \ | ||||
| ./libwrap/sys/kill.d \ | ||||
| ./libwrap/sys/link.d \ | ||||
| ./libwrap/sys/lseek.d \ | ||||
| ./libwrap/sys/open.d \ | ||||
| ./libwrap/sys/openat.d \ | ||||
| ./libwrap/sys/read.d \ | ||||
| ./libwrap/sys/sbrk.d \ | ||||
| ./libwrap/sys/stat.d \ | ||||
| ./libwrap/sys/times.d \ | ||||
| ./libwrap/sys/unlink.d \ | ||||
| ./libwrap/sys/wait.d \ | ||||
| ./libwrap/sys/write.d  | ||||
|  | ||||
|  | ||||
| # Each subdirectory must supply rules for building sources it contributes | ||||
| libwrap/sys/%.o: ../libwrap/sys/%.c | ||||
| 	@echo 'Building file: $<' | ||||
| 	@echo 'Invoking: Cross GCC Compiler' | ||||
| 	riscv32-unknown-elf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" | ||||
| 	@echo 'Finished building: $<' | ||||
| 	@echo ' ' | ||||
|  | ||||
|  | ||||
| @@ -1,66 +0,0 @@ | ||||
| ################################################################################ | ||||
| # Automatically-generated file. Do not edit! | ||||
| ################################################################################ | ||||
|  | ||||
| -include ../makefile.init | ||||
|  | ||||
| RM := rm -rf | ||||
|  | ||||
| # All of the sources participating in the build are defined here | ||||
| -include sources.mk | ||||
| -include libwrap/sys/subdir.mk | ||||
| -include libwrap/stdlib/subdir.mk | ||||
| -include libwrap/misc/subdir.mk | ||||
| -include env/iss/subdir.mk | ||||
| -include env/freedom-e300-hifive1/subdir.mk | ||||
| -include env/freedom-e300-arty/subdir.mk | ||||
| -include env/subdir.mk | ||||
| -include drivers/plic/subdir.mk | ||||
| -include drivers/fe300prci/subdir.mk | ||||
| -include subdir.mk | ||||
| -include objects.mk | ||||
|  | ||||
| ifneq ($(MAKECMDGOALS),clean) | ||||
| ifneq ($(strip $(CC_DEPS)),) | ||||
| -include $(CC_DEPS) | ||||
| endif | ||||
| ifneq ($(strip $(C++_DEPS)),) | ||||
| -include $(C++_DEPS) | ||||
| endif | ||||
| ifneq ($(strip $(C_UPPER_DEPS)),) | ||||
| -include $(C_UPPER_DEPS) | ||||
| endif | ||||
| ifneq ($(strip $(CXX_DEPS)),) | ||||
| -include $(CXX_DEPS) | ||||
| endif | ||||
| ifneq ($(strip $(C_DEPS)),) | ||||
| -include $(C_DEPS) | ||||
| endif | ||||
| ifneq ($(strip $(CPP_DEPS)),) | ||||
| -include $(CPP_DEPS) | ||||
| endif | ||||
| endif | ||||
|  | ||||
| -include ../makefile.defs | ||||
|  | ||||
| # Add inputs and outputs from these tool invocations to the build variables  | ||||
|  | ||||
| # All Target | ||||
| all: bsp | ||||
|  | ||||
| # Tool invocations | ||||
| bsp: $(OBJS) $(USER_OBJS) | ||||
| 	@echo 'Building target: $@' | ||||
| 	@echo 'Invoking: Cross G++ Linker' | ||||
| 	riscv32-unknown-elf-g++  -o "bsp" $(OBJS) $(USER_OBJS) $(LIBS) | ||||
| 	@echo 'Finished building target: $@' | ||||
| 	@echo ' ' | ||||
|  | ||||
| # Other Targets | ||||
| clean: | ||||
| 	-$(RM) $(CC_DEPS)$(C++_DEPS)$(EXECUTABLES)$(OBJS)$(C_UPPER_DEPS)$(CXX_DEPS)$(C_DEPS)$(CPP_DEPS) bsp | ||||
| 	-@echo ' ' | ||||
|  | ||||
| .PHONY: all clean dependents | ||||
|  | ||||
| -include ../makefile.targets | ||||
| @@ -1,8 +0,0 @@ | ||||
| ################################################################################ | ||||
| # Automatically-generated file. Do not edit! | ||||
| ################################################################################ | ||||
|  | ||||
| USER_OBJS := | ||||
|  | ||||
| LIBS := | ||||
|  | ||||
| @@ -1,35 +0,0 @@ | ||||
| ################################################################################ | ||||
| # Automatically-generated file. Do not edit! | ||||
| ################################################################################ | ||||
|  | ||||
| C_UPPER_SRCS :=  | ||||
| CXX_SRCS :=  | ||||
| C++_SRCS :=  | ||||
| OBJ_SRCS :=  | ||||
| CC_SRCS :=  | ||||
| ASM_SRCS :=  | ||||
| C_SRCS :=  | ||||
| CPP_SRCS :=  | ||||
| O_SRCS :=  | ||||
| S_UPPER_SRCS :=  | ||||
| CC_DEPS :=  | ||||
| C++_DEPS :=  | ||||
| EXECUTABLES :=  | ||||
| OBJS :=  | ||||
| C_UPPER_DEPS :=  | ||||
| CXX_DEPS :=  | ||||
| C_DEPS :=  | ||||
| CPP_DEPS :=  | ||||
|  | ||||
| # Every subdirectory with source files must be described here | ||||
| SUBDIRS := \ | ||||
| drivers/fe300prci \ | ||||
| drivers/plic \ | ||||
| env \ | ||||
| env/freedom-e300-arty \ | ||||
| env/freedom-e300-hifive1 \ | ||||
| env/iss \ | ||||
| libwrap/misc \ | ||||
| libwrap/stdlib \ | ||||
| libwrap/sys \ | ||||
|  | ||||
| @@ -1,252 +0,0 @@ | ||||
| // See LICENSE file for license details | ||||
|  | ||||
| #include "platform.h" | ||||
|  | ||||
| #ifdef PRCI_BASE_ADDR | ||||
| #include "fe300prci/fe300prci_driver.h" | ||||
| #include <unistd.h> | ||||
|  | ||||
| #define rdmcycle(x)  {				       \ | ||||
|     uint32_t lo, hi, hi2;			       \ | ||||
|     __asm__ __volatile__ ("1:\n\t"		       \ | ||||
| 			  "csrr %0, mcycleh\n\t"       \ | ||||
| 			  "csrr %1, mcycle\n\t"	       \ | ||||
| 			  "csrr %2, mcycleh\n\t"		\ | ||||
| 			  "bne  %0, %2, 1b\n\t"			\ | ||||
| 			  : "=r" (hi), "=r" (lo), "=r" (hi2)) ;	\ | ||||
|     *(x) = lo | ((uint64_t) hi << 32); 				\ | ||||
|   } | ||||
|  | ||||
| uint32_t PRCI_measure_mcycle_freq(uint32_t mtime_ticks, uint32_t mtime_freq) | ||||
| { | ||||
|  | ||||
|   uint32_t start_mtime = CLINT_REG(CLINT_MTIME); | ||||
|   uint32_t end_mtime = start_mtime + mtime_ticks + 1; | ||||
|  | ||||
|   // Make sure we won't get rollover. | ||||
|   while (end_mtime < start_mtime){ | ||||
|     start_mtime = CLINT_REG(CLINT_MTIME); | ||||
|     end_mtime = start_mtime + mtime_ticks + 1; | ||||
|   } | ||||
|  | ||||
|   // Don't start measuring until mtime edge. | ||||
|   uint32_t tmp = start_mtime; | ||||
|   do { | ||||
|     start_mtime = CLINT_REG(CLINT_MTIME); | ||||
|   } while (start_mtime == tmp); | ||||
|    | ||||
|   uint64_t start_mcycle; | ||||
|   rdmcycle(&start_mcycle); | ||||
|    | ||||
|   while (CLINT_REG(CLINT_MTIME) < end_mtime) ; | ||||
|    | ||||
|   uint64_t end_mcycle; | ||||
|   rdmcycle(&end_mcycle); | ||||
|   uint32_t difference = (uint32_t) (end_mcycle - start_mcycle); | ||||
|  | ||||
|   uint64_t freq = ((uint64_t) difference * mtime_freq) / mtime_ticks; | ||||
|   return (uint32_t) freq & 0xFFFFFFFF; | ||||
|    | ||||
| } | ||||
|   | ||||
|  | ||||
| void PRCI_use_hfrosc(int div, int trim) | ||||
| { | ||||
|   // Make sure the HFROSC is running at its default setting | ||||
|   // It is OK to change this even if we are running off of it. | ||||
|    | ||||
|   PRCI_REG(PRCI_HFROSCCFG) = (ROSC_DIV(div) | ROSC_TRIM(trim) | ROSC_EN(1)); | ||||
|  | ||||
|   while ((PRCI_REG(PRCI_HFROSCCFG) & ROSC_RDY(1)) == 0); | ||||
|    | ||||
|   PRCI_REG(PRCI_PLLCFG) &= ~PLL_SEL(1); | ||||
| } | ||||
|  | ||||
| void PRCI_use_pll(int refsel, int bypass, | ||||
| 			 int r, int f, int q, int finaldiv, | ||||
| 			 int hfroscdiv, int hfrosctrim) | ||||
| { | ||||
|   // Ensure that we aren't running off the PLL before we mess with it. | ||||
|   if (PRCI_REG(PRCI_PLLCFG) & PLL_SEL(1)) { | ||||
|     // Make sure the HFROSC is running at its default setting | ||||
|     PRCI_use_hfrosc(4, 16); | ||||
|   } | ||||
|    | ||||
|   // Set PLL Source to be HFXOSC if desired. | ||||
|   uint32_t config_value = 0; | ||||
|  | ||||
|   config_value |= PLL_REFSEL(refsel); | ||||
|    | ||||
|   if (bypass) { | ||||
|     // Bypass | ||||
|     config_value |= PLL_BYPASS(1); | ||||
|  | ||||
|     PRCI_REG(PRCI_PLLCFG) = config_value; | ||||
|  | ||||
|     // If we don't have an HFXTAL, this doesn't really matter. | ||||
|     // Set our Final output divide to divide-by-1: | ||||
|     PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); | ||||
|   } else { | ||||
|    | ||||
|     // To overclock, use the hfrosc | ||||
|     if (hfrosctrim >= 0 && hfroscdiv >= 0) { | ||||
|       PRCI_use_hfrosc(hfroscdiv, hfrosctrim); | ||||
|     } | ||||
|      | ||||
|     // Set DIV Settings for PLL | ||||
|      | ||||
|     // (Legal values of f_REF are 6-48MHz) | ||||
|  | ||||
|     // Set DIVR to divide-by-2 to get 8MHz frequency | ||||
|     // (legal values of f_R are 6-12 MHz) | ||||
|  | ||||
|     config_value |= PLL_BYPASS(1); | ||||
|     config_value |= PLL_R(r); | ||||
|  | ||||
|     // Set DIVF to get 512Mhz frequncy | ||||
|     // There is an implied multiply-by-2, 16Mhz. | ||||
|     // So need to write 32-1 | ||||
|     // (legal values of f_F are 384-768 MHz) | ||||
|     config_value |= PLL_F(f); | ||||
|  | ||||
|     // Set DIVQ to divide-by-2 to get 256 MHz frequency | ||||
|     // (legal values of f_Q are 50-400Mhz) | ||||
|     config_value |= PLL_Q(q); | ||||
|  | ||||
|     // Set our Final output divide to divide-by-1: | ||||
|     if (finaldiv == 1){ | ||||
|       PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); | ||||
|     } else { | ||||
|       PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV(finaldiv-1)); | ||||
|     } | ||||
|  | ||||
|     PRCI_REG(PRCI_PLLCFG) = config_value; | ||||
|  | ||||
|     // Un-Bypass the PLL. | ||||
|     PRCI_REG(PRCI_PLLCFG) &= ~PLL_BYPASS(1); | ||||
|  | ||||
|     // Wait for PLL Lock | ||||
|     // Note that the Lock signal can be glitchy. | ||||
|     // Need to wait 100 us | ||||
|     // RTC is running at 32kHz. | ||||
|     // So wait 4 ticks of RTC. | ||||
|     uint32_t now = CLINT_REG(CLINT_MTIME); | ||||
|     while (CLINT_REG(CLINT_MTIME) - now < 4) ; | ||||
|      | ||||
|     // Now it is safe to check for PLL Lock | ||||
|     while ((PRCI_REG(PRCI_PLLCFG) & PLL_LOCK(1)) == 0); | ||||
|  | ||||
|   } | ||||
|  | ||||
|   // Switch over to PLL Clock source | ||||
|   PRCI_REG(PRCI_PLLCFG) |= PLL_SEL(1); | ||||
|  | ||||
|   // If we're running off HFXOSC, turn off the HFROSC to | ||||
|   // save power. | ||||
|   if (refsel) { | ||||
|     PRCI_REG(PRCI_HFROSCCFG) &= ~ROSC_EN(1); | ||||
|   } | ||||
|    | ||||
| } | ||||
|  | ||||
| void PRCI_use_default_clocks() | ||||
| { | ||||
|   // Turn off the LFROSC | ||||
|   AON_REG(AON_LFROSC) &= ~ROSC_EN(1); | ||||
|  | ||||
|   // Use HFROSC | ||||
|   PRCI_use_hfrosc(4, 16); | ||||
| } | ||||
|  | ||||
| void PRCI_use_hfxosc(uint32_t finaldiv) | ||||
| { | ||||
|    | ||||
|   PRCI_use_pll(1, // Use HFXTAL | ||||
| 	       1, // Bypass = 1 | ||||
| 	       0, // PLL settings don't matter | ||||
| 	       0, // PLL settings don't matter | ||||
| 	       0, // PLL settings don't matter | ||||
| 	       finaldiv, | ||||
| 	       -1, | ||||
| 	       -1); | ||||
| } | ||||
|  | ||||
| // This is a generic function, which | ||||
| // doesn't span the entire range of HFROSC settings. | ||||
| // It only adjusts the trim, which can span a hundred MHz or so. | ||||
| // This function does not check the legality of the PLL settings | ||||
| // at all, and it is quite possible to configure invalid PLL settings | ||||
| // this way. | ||||
| // It returns the actual measured CPU frequency. | ||||
|  | ||||
| uint32_t PRCI_set_hfrosctrim_for_f_cpu(uint32_t f_cpu, PRCI_freq_target target ) | ||||
| { | ||||
|  | ||||
|   uint32_t hfrosctrim = 0; | ||||
|   uint32_t hfroscdiv = 4; | ||||
|   uint32_t prev_trim = 0; | ||||
|  | ||||
|   // In this function we use PLL settings which | ||||
|   // will give us a 32x multiplier from the output | ||||
|   // of the HFROSC source to the output of the | ||||
|   // PLL. We first measure our HFROSC to get the | ||||
|   // right trim, then finally use it as the PLL source. | ||||
|   // We should really check here that the f_cpu | ||||
|   // requested is something in the limit of the PLL. For | ||||
|   // now that is up to the user. | ||||
|  | ||||
|   // This will undershoot for frequencies not divisible by 16. | ||||
|   uint32_t desired_hfrosc_freq = (f_cpu/ 16); | ||||
|  | ||||
|   PRCI_use_hfrosc(hfroscdiv, hfrosctrim); | ||||
|    | ||||
|   // Ignore the first run (for icache reasons) | ||||
|   uint32_t cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); | ||||
|  | ||||
|   cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); | ||||
|   uint32_t prev_freq = cpu_freq; | ||||
|    | ||||
|   while ((cpu_freq < desired_hfrosc_freq) && (hfrosctrim < 0x1F)){ | ||||
|     prev_trim = hfrosctrim; | ||||
|     prev_freq = cpu_freq; | ||||
|     hfrosctrim ++; | ||||
|     PRCI_use_hfrosc(hfroscdiv, hfrosctrim); | ||||
|     cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); | ||||
|   }  | ||||
|  | ||||
|   // We couldn't go low enough | ||||
|   if (prev_freq > desired_hfrosc_freq){ | ||||
|     PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); | ||||
|     cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); | ||||
|     return cpu_freq; | ||||
|   } | ||||
|    | ||||
|   // We couldn't go high enough | ||||
|   if (cpu_freq < desired_hfrosc_freq){ | ||||
|     PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); | ||||
|     cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); | ||||
|     return cpu_freq; | ||||
|   } | ||||
|  | ||||
|   // Check for over/undershoot | ||||
|   switch(target) { | ||||
|   case(PRCI_FREQ_CLOSEST): | ||||
|     if ((desired_hfrosc_freq - prev_freq) < (cpu_freq - desired_hfrosc_freq)) { | ||||
|       PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); | ||||
|     } else { | ||||
|       PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, hfrosctrim); | ||||
|     } | ||||
|     break; | ||||
|   case(PRCI_FREQ_UNDERSHOOT): | ||||
|     PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); | ||||
|     break; | ||||
|   default: | ||||
|     PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, hfrosctrim); | ||||
|   } | ||||
|  | ||||
|   cpu_freq =  PRCI_measure_mcycle_freq(1000, RTC_FREQ); | ||||
|   return cpu_freq; | ||||
|  | ||||
| } | ||||
|  | ||||
| #endif | ||||
| @@ -1,79 +0,0 @@ | ||||
| // See LICENSE file for license details | ||||
|  | ||||
| #ifndef _FE300PRCI_DRIVER_H_ | ||||
| #define _FE300PRCI_DRIVER_H_ | ||||
|  | ||||
| __BEGIN_DECLS | ||||
|  | ||||
| #include <unistd.h> | ||||
|  | ||||
| typedef enum prci_freq_target { | ||||
|    | ||||
|   PRCI_FREQ_OVERSHOOT, | ||||
|   PRCI_FREQ_CLOSEST, | ||||
|   PRCI_FREQ_UNDERSHOOT | ||||
|  | ||||
| } PRCI_freq_target; | ||||
|  | ||||
| /* Measure and return the approximate frequency of the  | ||||
|  * CPU, as given by measuring the mcycle counter against  | ||||
|  * the mtime ticks. | ||||
|  */ | ||||
| uint32_t PRCI_measure_mcycle_freq(uint32_t mtime_ticks, uint32_t mtime_freq); | ||||
|  | ||||
| /* Safely switch over to the HFROSC using the given div | ||||
|  * and trim settings. | ||||
|  */ | ||||
| void PRCI_use_hfrosc(int div, int trim); | ||||
|  | ||||
| /* Safely switch over to the 16MHz HFXOSC, | ||||
|  * applying the finaldiv clock divider (1 is the lowest | ||||
|  * legal value). | ||||
|  */ | ||||
| void PRCI_use_hfxosc(uint32_t finaldiv); | ||||
|  | ||||
| /* Safely switch over to the PLL using the given | ||||
|  * settings. | ||||
|  *  | ||||
|  * Note that not all combinations of the inputs are actually | ||||
|  * legal, and this function does not check for their | ||||
|  * legality ("safely" means that this function won't turn off | ||||
|  * or glitch the clock the CPU is actually running off, but | ||||
|  * doesn't protect against you making it too fast or slow.) | ||||
|  */ | ||||
|  | ||||
| void PRCI_use_pll(int refsel, int bypass, | ||||
| 			 int r, int f, int q, int finaldiv, | ||||
| 			 int hfroscdiv, int hfrosctrim); | ||||
|  | ||||
| /* Use the default clocks configured at reset. | ||||
|  * This is ~16Mhz HFROSC and turns off the LFROSC | ||||
|  * (on the current FE310 Dev Platforms, an external LFROSC is  | ||||
|  * used as it is more power efficient). | ||||
|  */ | ||||
| void PRCI_use_default_clocks(); | ||||
|  | ||||
| /* This routine will adjust the HFROSC trim | ||||
|  * while using HFROSC as the clock source,  | ||||
|  * measure the resulting frequency, then | ||||
|  * use it as the PLL clock source,  | ||||
|  * in an attempt to get over, under, or close to the  | ||||
|  * requested frequency. It returns the actual measured  | ||||
|  * frequency.  | ||||
|  * | ||||
|  * Note that the requested frequency must be within the  | ||||
|  * range supported by the PLL so not all values are  | ||||
|  * achievable with this function, and not all  | ||||
|  * are guaranteed to actually work. The PLL | ||||
|  * is rated higher than the hardware. | ||||
|  *  | ||||
|  * There is no check on the desired f_cpu frequency, it | ||||
|  * is up to the user to specify something reasonable. | ||||
|  */ | ||||
|  | ||||
| uint32_t PRCI_set_hfrosctrim_for_f_cpu(uint32_t f_cpu, PRCI_freq_target target); | ||||
|  | ||||
| __END_DECLS | ||||
|  | ||||
| #endif | ||||
|    | ||||
| @@ -1,127 +0,0 @@ | ||||
| // See LICENSE for license details. | ||||
|  | ||||
| #include "sifive/devices/plic.h" | ||||
| #include "plic/plic_driver.h" | ||||
| #include "platform.h" | ||||
| #include "encoding.h" | ||||
| #include <string.h> | ||||
|  | ||||
|  | ||||
| // Note that there are no assertions or bounds checking on these | ||||
| // parameter values. | ||||
|  | ||||
| void volatile_memzero(uint8_t * base, unsigned int size) | ||||
| { | ||||
|   volatile uint8_t * ptr; | ||||
|   for (ptr = base; ptr < (base + size); ptr++){ | ||||
|     *ptr = 0; | ||||
|   } | ||||
| } | ||||
|  | ||||
| void PLIC_init ( | ||||
|                 plic_instance_t * this_plic, | ||||
|                 uintptr_t         base_addr, | ||||
|                 uint32_t num_sources, | ||||
|                 uint32_t num_priorities | ||||
|                 ) | ||||
| { | ||||
|    | ||||
|   this_plic->base_addr = base_addr; | ||||
|   this_plic->num_sources = num_sources; | ||||
|   this_plic->num_priorities = num_priorities; | ||||
|    | ||||
|   // Disable all interrupts (don't assume that these registers are reset). | ||||
|   unsigned long hart_id = read_csr(mhartid); | ||||
|   volatile_memzero((uint8_t*) (this_plic->base_addr + | ||||
|                                PLIC_ENABLE_OFFSET + | ||||
|                                (hart_id << PLIC_ENABLE_SHIFT_PER_TARGET)), | ||||
|                    (num_sources + 8) / 8); | ||||
|    | ||||
|   // Set all priorities to 0 (equal priority -- don't assume that these are reset). | ||||
|   volatile_memzero ((uint8_t *)(this_plic->base_addr + | ||||
|                                 PLIC_PRIORITY_OFFSET), | ||||
|                     (num_sources + 1) << PLIC_PRIORITY_SHIFT_PER_SOURCE); | ||||
|  | ||||
|   // Set the threshold to 0. | ||||
|   volatile plic_threshold* threshold = (plic_threshold*) | ||||
|     (this_plic->base_addr + | ||||
|      PLIC_THRESHOLD_OFFSET + | ||||
|      (hart_id << PLIC_THRESHOLD_SHIFT_PER_TARGET)); | ||||
|  | ||||
|   *threshold = 0; | ||||
|    | ||||
| } | ||||
|  | ||||
| void PLIC_set_threshold (plic_instance_t * this_plic, | ||||
| 			 plic_threshold threshold){ | ||||
|  | ||||
|   unsigned long hart_id = read_csr(mhartid);   | ||||
|   volatile plic_threshold* threshold_ptr = (plic_threshold*) (this_plic->base_addr + | ||||
|                                                               PLIC_THRESHOLD_OFFSET + | ||||
|                                                               (hart_id << PLIC_THRESHOLD_SHIFT_PER_TARGET)); | ||||
|  | ||||
|   *threshold_ptr = threshold; | ||||
|  | ||||
| } | ||||
|    | ||||
|  | ||||
| void PLIC_enable_interrupt (plic_instance_t * this_plic, plic_source source){ | ||||
|  | ||||
|   unsigned long hart_id = read_csr(mhartid); | ||||
|   volatile uint8_t * current_ptr = (volatile uint8_t *)(this_plic->base_addr + | ||||
|                                                         PLIC_ENABLE_OFFSET + | ||||
|                                                         (hart_id << PLIC_ENABLE_SHIFT_PER_TARGET) + | ||||
|                                                         (source >> 3)); | ||||
|   uint8_t current = *current_ptr; | ||||
|   current = current | ( 1 << (source & 0x7)); | ||||
|   *current_ptr = current; | ||||
|  | ||||
| } | ||||
|  | ||||
| void PLIC_disable_interrupt (plic_instance_t * this_plic, plic_source source){ | ||||
|    | ||||
|   unsigned long hart_id = read_csr(mhartid); | ||||
|   volatile uint8_t * current_ptr = (volatile uint8_t *) (this_plic->base_addr + | ||||
|                                                          PLIC_ENABLE_OFFSET + | ||||
|                                                          (hart_id << PLIC_ENABLE_SHIFT_PER_TARGET) + | ||||
|                                                          (source >> 3)); | ||||
|   uint8_t current = *current_ptr; | ||||
|   current = current & ~(( 1 << (source & 0x7))); | ||||
|   *current_ptr = current; | ||||
|    | ||||
| } | ||||
|  | ||||
| void PLIC_set_priority (plic_instance_t * this_plic, plic_source source, plic_priority priority){ | ||||
|  | ||||
|   if (this_plic->num_priorities > 0) { | ||||
|     volatile plic_priority * priority_ptr = (volatile plic_priority *) | ||||
|       (this_plic->base_addr + | ||||
|        PLIC_PRIORITY_OFFSET + | ||||
|        (source << PLIC_PRIORITY_SHIFT_PER_SOURCE)); | ||||
|     *priority_ptr = priority; | ||||
|   } | ||||
| } | ||||
|  | ||||
| plic_source PLIC_claim_interrupt(plic_instance_t * this_plic){ | ||||
|    | ||||
|   unsigned long hart_id = read_csr(mhartid); | ||||
|  | ||||
|   volatile plic_source * claim_addr = (volatile plic_source * ) | ||||
|     (this_plic->base_addr + | ||||
|      PLIC_CLAIM_OFFSET + | ||||
|      (hart_id << PLIC_CLAIM_SHIFT_PER_TARGET)); | ||||
|  | ||||
|   return  *claim_addr; | ||||
|    | ||||
| } | ||||
|  | ||||
| void PLIC_complete_interrupt(plic_instance_t * this_plic, plic_source source){ | ||||
|    | ||||
|   unsigned long hart_id = read_csr(mhartid); | ||||
|   volatile plic_source * claim_addr = (volatile plic_source *) (this_plic->base_addr + | ||||
|                                                                 PLIC_CLAIM_OFFSET + | ||||
|                                                                 (hart_id << PLIC_CLAIM_SHIFT_PER_TARGET)); | ||||
|   *claim_addr = source; | ||||
|    | ||||
| } | ||||
|  | ||||
| @@ -1,51 +0,0 @@ | ||||
| // See LICENSE file for licence details | ||||
|  | ||||
| #ifndef PLIC_DRIVER_H | ||||
| #define PLIC_DRIVER_H | ||||
|  | ||||
|  | ||||
| __BEGIN_DECLS | ||||
|  | ||||
| #include "platform.h" | ||||
|  | ||||
| typedef struct __plic_instance_t | ||||
| { | ||||
|   uintptr_t base_addr; | ||||
|  | ||||
|   uint32_t num_sources; | ||||
|   uint32_t num_priorities; | ||||
|    | ||||
| } plic_instance_t; | ||||
|  | ||||
| typedef uint32_t plic_source; | ||||
| typedef uint32_t plic_priority; | ||||
| typedef uint32_t plic_threshold; | ||||
|  | ||||
| void PLIC_init ( | ||||
|                 plic_instance_t * this_plic, | ||||
|                 uintptr_t         base_addr, | ||||
|                 uint32_t num_sources, | ||||
|                 uint32_t num_priorities | ||||
|                 ); | ||||
|  | ||||
| void PLIC_set_threshold (plic_instance_t * this_plic, | ||||
| 			 plic_threshold threshold); | ||||
|    | ||||
| void PLIC_enable_interrupt (plic_instance_t * this_plic, | ||||
| 			    plic_source source); | ||||
|  | ||||
| void PLIC_disable_interrupt (plic_instance_t * this_plic, | ||||
| 			     plic_source source); | ||||
|    | ||||
| void PLIC_set_priority (plic_instance_t * this_plic, | ||||
| 			plic_source source, | ||||
| 			plic_priority priority); | ||||
|  | ||||
| plic_source PLIC_claim_interrupt(plic_instance_t * this_plic); | ||||
|  | ||||
| void PLIC_complete_interrupt(plic_instance_t * this_plic, | ||||
| 			     plic_source source); | ||||
|  | ||||
| __END_DECLS | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										62
									
								
								hifive1-vp/hello/bsp/env/common.mk
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										62
									
								
								hifive1-vp/hello/bsp/env/common.mk
									
									
									
									
										vendored
									
									
								
							| @@ -1,62 +0,0 @@ | ||||
| # See LICENSE for license details. | ||||
|  | ||||
| ifndef _SIFIVE_MK_COMMON | ||||
| _SIFIVE_MK_COMMON := # defined | ||||
|  | ||||
| .PHONY: all | ||||
| all: $(TARGET) | ||||
|  | ||||
| include $(BSP_BASE)/libwrap/libwrap.mk | ||||
|  | ||||
| BOARD ?= freedom-e300-hifive1 | ||||
| ENV_DIR = $(BSP_BASE)/env | ||||
| PLATFORM_DIR = $(ENV_DIR)/$(BOARD) | ||||
|  | ||||
| #TARGET_FLAVOR := -march=rv32imac -mabi=ilp32 -mcmodel=medany -msmall-data-limit=8 -x assembler-with-cpp | ||||
| TARGET_FLAVOR := -march=rv32i -mabi=ilp32 | ||||
|  | ||||
| ASM_SRCS += $(ENV_DIR)/start.S | ||||
| ASM_SRCS += $(ENV_DIR)/entry.S | ||||
| C_SRCS += $(PLATFORM_DIR)/init.c | ||||
|  | ||||
| LINKER_SCRIPT := $(PLATFORM_DIR)/link.lds | ||||
|  | ||||
| INCLUDES += -I$(BSP_BASE)/include | ||||
| INCLUDES += -I$(BSP_BASE)/drivers/ | ||||
| INCLUDES += -I$(ENV_DIR) | ||||
| INCLUDES += -I$(PLATFORM_DIR) | ||||
|  | ||||
| TOOL_DIR ?= $(BSP_BASE)/../toolchain/bin | ||||
|  | ||||
| CC := $(TOOL_DIR)/riscv64-unknown-elf-gcc ${TARGET_FLAVOR} | ||||
| AR := $(TOOL_DIR)/riscv64-unknown-elf-ar | ||||
| OBJDUMP := $(TOOL_DIR)/riscv64-unknown-elf-objdump | ||||
|  | ||||
| LDFLAGS += -T $(LINKER_SCRIPT) -nostartfiles | ||||
| LDFLAGS += -L$(ENV_DIR) | ||||
|  | ||||
| ASM_OBJS := $(ASM_SRCS:.S=.o) | ||||
| C_OBJS := $(C_SRCS:.c=.o) | ||||
|  | ||||
| LINK_OBJS += $(ASM_OBJS) $(C_OBJS) | ||||
| LINK_DEPS += $(LINKER_SCRIPT) | ||||
|  | ||||
| CLEAN_OBJS += $(TARGET) $(LINK_OBJS) | ||||
|  | ||||
| CFLAGS += -g | ||||
|  | ||||
| $(TARGET): $(LINK_OBJS) $(LINK_DEPS) | ||||
| 	$(CC) $(CFLAGS) $(INCLUDES) $(LINK_OBJS) -o $@ $(LDFLAGS) | ||||
| 	$(OBJDUMP) -d $(TARGET) > $(TARGET).dis | ||||
|  | ||||
| $(ASM_OBJS): %.o: %.S $(HEADERS) | ||||
| 	$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< | ||||
|  | ||||
| $(C_OBJS): %.o: %.c $(HEADERS) | ||||
| 	$(CC) $(CFLAGS) $(INCLUDES) -include sys/cdefs.h -c -o $@ $< | ||||
|  | ||||
| .PHONY: clean | ||||
| clean: | ||||
| 	rm -f $(CLEAN_OBJS) | ||||
|  | ||||
| endif # _SIFIVE_MK_COMMON | ||||
							
								
								
									
										1313
									
								
								hifive1-vp/hello/bsp/env/encoding.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1313
									
								
								hifive1-vp/hello/bsp/env/encoding.h
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										97
									
								
								hifive1-vp/hello/bsp/env/entry.S
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										97
									
								
								hifive1-vp/hello/bsp/env/entry.S
									
									
									
									
										vendored
									
									
								
							| @@ -1,97 +0,0 @@ | ||||
| // See LICENSE for license details | ||||
|  | ||||
| #ifndef ENTRY_S | ||||
| #define ENTRY_S | ||||
|  | ||||
| #include "encoding.h" | ||||
| #include "sifive/bits.h" | ||||
|  | ||||
|   .section      .text.entry	 | ||||
|   .align 2 | ||||
|   .global trap_entry | ||||
| trap_entry: | ||||
|   addi sp, sp, -32*REGBYTES | ||||
|  | ||||
|   STORE x1, 1*REGBYTES(sp) | ||||
|   STORE x2, 2*REGBYTES(sp) | ||||
|   STORE x3, 3*REGBYTES(sp) | ||||
|   STORE x4, 4*REGBYTES(sp) | ||||
|   STORE x5, 5*REGBYTES(sp) | ||||
|   STORE x6, 6*REGBYTES(sp) | ||||
|   STORE x7, 7*REGBYTES(sp) | ||||
|   STORE x8, 8*REGBYTES(sp) | ||||
|   STORE x9, 9*REGBYTES(sp) | ||||
|   STORE x10, 10*REGBYTES(sp) | ||||
|   STORE x11, 11*REGBYTES(sp) | ||||
|   STORE x12, 12*REGBYTES(sp) | ||||
|   STORE x13, 13*REGBYTES(sp) | ||||
|   STORE x14, 14*REGBYTES(sp) | ||||
|   STORE x15, 15*REGBYTES(sp) | ||||
|   STORE x16, 16*REGBYTES(sp) | ||||
|   STORE x17, 17*REGBYTES(sp) | ||||
|   STORE x18, 18*REGBYTES(sp) | ||||
|   STORE x19, 19*REGBYTES(sp) | ||||
|   STORE x20, 20*REGBYTES(sp) | ||||
|   STORE x21, 21*REGBYTES(sp) | ||||
|   STORE x22, 22*REGBYTES(sp) | ||||
|   STORE x23, 23*REGBYTES(sp) | ||||
|   STORE x24, 24*REGBYTES(sp) | ||||
|   STORE x25, 25*REGBYTES(sp) | ||||
|   STORE x26, 26*REGBYTES(sp) | ||||
|   STORE x27, 27*REGBYTES(sp) | ||||
|   STORE x28, 28*REGBYTES(sp) | ||||
|   STORE x29, 29*REGBYTES(sp) | ||||
|   STORE x30, 30*REGBYTES(sp) | ||||
|   STORE x31, 31*REGBYTES(sp) | ||||
|  | ||||
|   csrr a0, mcause | ||||
|   csrr a1, mepc | ||||
|   mv a2, sp | ||||
|   call handle_trap | ||||
|   csrw mepc, a0 | ||||
|  | ||||
|   # Remain in M-mode after mret | ||||
|   li t0, MSTATUS_MPP | ||||
|   csrs mstatus, t0 | ||||
|  | ||||
|   LOAD x1, 1*REGBYTES(sp) | ||||
|   LOAD x2, 2*REGBYTES(sp) | ||||
|   LOAD x3, 3*REGBYTES(sp) | ||||
|   LOAD x4, 4*REGBYTES(sp) | ||||
|   LOAD x5, 5*REGBYTES(sp) | ||||
|   LOAD x6, 6*REGBYTES(sp) | ||||
|   LOAD x7, 7*REGBYTES(sp) | ||||
|   LOAD x8, 8*REGBYTES(sp) | ||||
|   LOAD x9, 9*REGBYTES(sp) | ||||
|   LOAD x10, 10*REGBYTES(sp) | ||||
|   LOAD x11, 11*REGBYTES(sp) | ||||
|   LOAD x12, 12*REGBYTES(sp) | ||||
|   LOAD x13, 13*REGBYTES(sp) | ||||
|   LOAD x14, 14*REGBYTES(sp) | ||||
|   LOAD x15, 15*REGBYTES(sp) | ||||
|   LOAD x16, 16*REGBYTES(sp) | ||||
|   LOAD x17, 17*REGBYTES(sp) | ||||
|   LOAD x18, 18*REGBYTES(sp) | ||||
|   LOAD x19, 19*REGBYTES(sp) | ||||
|   LOAD x20, 20*REGBYTES(sp) | ||||
|   LOAD x21, 21*REGBYTES(sp) | ||||
|   LOAD x22, 22*REGBYTES(sp) | ||||
|   LOAD x23, 23*REGBYTES(sp) | ||||
|   LOAD x24, 24*REGBYTES(sp) | ||||
|   LOAD x25, 25*REGBYTES(sp) | ||||
|   LOAD x26, 26*REGBYTES(sp) | ||||
|   LOAD x27, 27*REGBYTES(sp) | ||||
|   LOAD x28, 28*REGBYTES(sp) | ||||
|   LOAD x29, 29*REGBYTES(sp) | ||||
|   LOAD x30, 30*REGBYTES(sp) | ||||
|   LOAD x31, 31*REGBYTES(sp) | ||||
|  | ||||
|   addi sp, sp, 32*REGBYTES | ||||
|   mret | ||||
|  | ||||
| .weak handle_trap | ||||
| handle_trap: | ||||
| 1: | ||||
|   j 1b | ||||
| 	 | ||||
| #endif | ||||
| @@ -1,87 +0,0 @@ | ||||
| //See LICENSE for license details. | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| #include "platform.h" | ||||
| #include "encoding.h" | ||||
|  | ||||
| extern int main(int argc, char** argv); | ||||
| extern void trap_entry(); | ||||
|  | ||||
| static unsigned long get_cpu_freq() | ||||
| { | ||||
|   return 65000000; | ||||
| } | ||||
|  | ||||
| unsigned long get_timer_freq() | ||||
| { | ||||
|   return get_cpu_freq(); | ||||
| } | ||||
|  | ||||
| uint64_t get_timer_value() | ||||
| { | ||||
| #if __riscv_xlen == 32 | ||||
|   while (1) { | ||||
|     uint32_t hi = read_csr(mcycleh); | ||||
|     uint32_t lo = read_csr(mcycle); | ||||
|     if (hi == read_csr(mcycleh)) | ||||
|       return ((uint64_t)hi << 32) | lo; | ||||
|   } | ||||
| #else | ||||
|   return read_csr(mcycle); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| static void uart_init(size_t baud_rate) | ||||
| { | ||||
|   GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; | ||||
|   GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; | ||||
|   UART0_REG(UART_REG_DIV) = get_cpu_freq() / baud_rate - 1; | ||||
|   UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; | ||||
| } | ||||
|  | ||||
|  | ||||
| #ifdef USE_PLIC | ||||
| extern void handle_m_ext_interrupt(); | ||||
| #endif | ||||
|  | ||||
| #ifdef USE_M_TIME | ||||
| extern void handle_m_time_interrupt(); | ||||
| #endif | ||||
|  | ||||
| uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) | ||||
| { | ||||
|   if (0){ | ||||
| #ifdef USE_PLIC | ||||
|     // External Machine-Level interrupt from PLIC | ||||
|   } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { | ||||
|     handle_m_ext_interrupt(); | ||||
| #endif | ||||
| #ifdef USE_M_TIME | ||||
|     // External Machine-Level interrupt from PLIC | ||||
|   } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ | ||||
|     handle_m_time_interrupt(); | ||||
| #endif | ||||
|   } | ||||
|   else { | ||||
|     write(1, "Unhandled Trap:\n", 16); | ||||
|     _exit(1 + mcause); | ||||
|   } | ||||
|   return epc; | ||||
| } | ||||
|  | ||||
| void _init() | ||||
| { | ||||
|   #ifndef NO_INIT | ||||
|   uart_init(115200); | ||||
|  | ||||
|   printf("core freq at %d Hz\n", get_cpu_freq()); | ||||
|  | ||||
|   write_csr(mtvec, &trap_entry); | ||||
|   #endif | ||||
| } | ||||
|  | ||||
| void _fini() | ||||
| { | ||||
| } | ||||
							
								
								
									
										167
									
								
								hifive1-vp/hello/bsp/env/freedom-e300-arty/link.lds
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										167
									
								
								hifive1-vp/hello/bsp/env/freedom-e300-arty/link.lds
									
									
									
									
										vendored
									
									
								
							| @@ -1,167 +0,0 @@ | ||||
| OUTPUT_ARCH( "riscv" ) | ||||
|  | ||||
| ENTRY( _start ) | ||||
|  | ||||
| MEMORY | ||||
| { | ||||
|   flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M | ||||
|   ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K | ||||
| } | ||||
|  | ||||
| PHDRS | ||||
| { | ||||
|   flash PT_LOAD; | ||||
|   ram_init PT_LOAD; | ||||
|   ram PT_NULL; | ||||
| } | ||||
|  | ||||
| SECTIONS | ||||
| { | ||||
|   __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; | ||||
|  | ||||
|   .init           : | ||||
|   { | ||||
|     KEEP (*(SORT_NONE(.init))) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .text           : | ||||
|   { | ||||
|     *(.text.unlikely .text.unlikely.*) | ||||
|     *(.text.startup .text.startup.*) | ||||
|     *(.text .text.*) | ||||
|     *(.gnu.linkonce.t.*) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .fini           : | ||||
|   { | ||||
|     KEEP (*(SORT_NONE(.fini))) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   PROVIDE (__etext = .); | ||||
|   PROVIDE (_etext = .); | ||||
|   PROVIDE (etext = .); | ||||
|  | ||||
|   .rodata         : | ||||
|   { | ||||
|     *(.rdata) | ||||
|     *(.rodata .rodata.*) | ||||
|     *(.gnu.linkonce.r.*) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   . = ALIGN(4); | ||||
|  | ||||
|   .preinit_array  : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__preinit_array_start = .); | ||||
|     KEEP (*(.preinit_array)) | ||||
|     PROVIDE_HIDDEN (__preinit_array_end = .); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .init_array     : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__init_array_start = .); | ||||
|     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) | ||||
|     KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) | ||||
|     PROVIDE_HIDDEN (__init_array_end = .); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .fini_array     : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__fini_array_start = .); | ||||
|     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) | ||||
|     KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) | ||||
|     PROVIDE_HIDDEN (__fini_array_end = .); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .ctors          : | ||||
|   { | ||||
|     /* gcc uses crtbegin.o to find the start of | ||||
|        the constructors, so we make sure it is | ||||
|        first.  Because this is a wildcard, it | ||||
|        doesn't matter if the user does not | ||||
|        actually link against crtbegin.o; the | ||||
|        linker won't look for a file to match a | ||||
|        wildcard.  The wildcard also means that it | ||||
|        doesn't matter which directory crtbegin.o | ||||
|        is in.  */ | ||||
|     KEEP (*crtbegin.o(.ctors)) | ||||
|     KEEP (*crtbegin?.o(.ctors)) | ||||
|     /* We don't want to include the .ctor section from | ||||
|        the crtend.o file until after the sorted ctors. | ||||
|        The .ctor section from the crtend file contains the | ||||
|        end of ctors marker and it must be last */ | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) | ||||
|     KEEP (*(SORT(.ctors.*))) | ||||
|     KEEP (*(.ctors)) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .dtors          : | ||||
|   { | ||||
|     KEEP (*crtbegin.o(.dtors)) | ||||
|     KEEP (*crtbegin?.o(.dtors)) | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) | ||||
|     KEEP (*(SORT(.dtors.*))) | ||||
|     KEEP (*(.dtors)) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .lalign         : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     PROVIDE( _data_lma = . ); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .dalign         : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     PROVIDE( _data = . ); | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   .data          : | ||||
|   { | ||||
|     *(.data .data.*) | ||||
|     *(.gnu.linkonce.d.*) | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   .srodata        : | ||||
|   { | ||||
|     PROVIDE( _gp = . + 0x800 ); | ||||
|     *(.srodata.cst16) | ||||
|     *(.srodata.cst8) | ||||
|     *(.srodata.cst4) | ||||
|     *(.srodata.cst2) | ||||
|     *(.srodata .srodata.*) | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   .sdata          : | ||||
|   { | ||||
|     *(.sdata .sdata.*) | ||||
|     *(.gnu.linkonce.s.*) | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   . = ALIGN(4); | ||||
|   PROVIDE( _edata = . ); | ||||
|   PROVIDE( edata = . ); | ||||
|  | ||||
|   PROVIDE( _fbss = . ); | ||||
|   PROVIDE( __bss_start = . ); | ||||
|   .bss            : | ||||
|   { | ||||
|     *(.sbss*) | ||||
|     *(.gnu.linkonce.sb.*) | ||||
|     *(.bss .bss.*) | ||||
|     *(.gnu.linkonce.b.*) | ||||
|     *(COMMON) | ||||
|     . = ALIGN(4); | ||||
|   } >ram AT>ram :ram | ||||
|  | ||||
|   . = ALIGN(8); | ||||
|   PROVIDE( _end = . ); | ||||
|   PROVIDE( end = . ); | ||||
|  | ||||
|   .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : | ||||
|   { | ||||
|     PROVIDE( _heap_end = . ); | ||||
|     . = __stack_size; | ||||
|     PROVIDE( _sp = . ); | ||||
|   } >ram AT>ram :ram | ||||
| } | ||||
| @@ -1,30 +0,0 @@ | ||||
| adapter_khz     10000 | ||||
|  | ||||
| #source [find interface/ftdi/olimex-arm-usb-tiny-h.cfg] | ||||
|  | ||||
| interface ftdi | ||||
| ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" | ||||
| ftdi_vid_pid 0x15ba 0x002a | ||||
|  | ||||
| ftdi_layout_init 0x0808 0x0a1b | ||||
| ftdi_layout_signal nSRST -oe 0x0200 | ||||
| ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 | ||||
| ftdi_layout_signal LED -data 0x0800 | ||||
| # | ||||
|  | ||||
| set _CHIPNAME riscv | ||||
| jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913 | ||||
|  | ||||
| set _TARGETNAME $_CHIPNAME.cpu | ||||
| target create $_TARGETNAME riscv -chain-position $_TARGETNAME | ||||
| $_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 | ||||
|  | ||||
| flash bank my_first_flash fespi 0x20000000 0 0 0 $_TARGETNAME | ||||
| init | ||||
| #reset | ||||
| if {[ info exists pulse_srst]} { | ||||
|   ftdi_set_signal nSRST 0 | ||||
|   ftdi_set_signal nSRST z | ||||
| } | ||||
| halt | ||||
| #flash protect 0 64 last off | ||||
| @@ -1,125 +0,0 @@ | ||||
| // See LICENSE for license details. | ||||
|  | ||||
| #ifndef _SIFIVE_PLATFORM_H | ||||
| #define _SIFIVE_PLATFORM_H | ||||
|  | ||||
| // Some things missing from the official encoding.h | ||||
| #define MCAUSE_INT         0x80000000 | ||||
| #define MCAUSE_CAUSE       0x7FFFFFFF | ||||
|  | ||||
| #include "sifive/const.h" | ||||
| #include "sifive/devices/aon.h" | ||||
| #include "sifive/devices/clint.h" | ||||
| #include "sifive/devices/gpio.h" | ||||
| #include "sifive/devices/plic.h" | ||||
| #include "sifive/devices/pwm.h" | ||||
| #include "sifive/devices/spi.h" | ||||
| #include "sifive/devices/uart.h" | ||||
|  | ||||
| /**************************************************************************** | ||||
|  * Platform definitions | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| #define TRAPVEC_TABLE_BASE_ADDR _AC(0x00001010,UL) | ||||
| #define CLINT_BASE_ADDR _AC(0x02000000,UL) | ||||
| #define PLIC_BASE_ADDR _AC(0x0C000000,UL) | ||||
| #define AON_BASE_ADDR _AC(0x10000000,UL) | ||||
| #define GPIO_BASE_ADDR _AC(0x10012000,UL) | ||||
| #define UART0_BASE_ADDR _AC(0x10013000,UL) | ||||
| #define SPI0_BASE_ADDR _AC(0x10014000,UL) | ||||
| #define PWM0_BASE_ADDR _AC(0x10015000,UL) | ||||
| #define UART1_BASE_ADDR _AC(0x10023000,UL) | ||||
| #define SPI1_BASE_ADDR _AC(0x10024000,UL) | ||||
| #define PWM1_BASE_ADDR _AC(0x10025000,UL) | ||||
| #define SPI2_BASE_ADDR _AC(0x10034000,UL) | ||||
| #define PWM2_BASE_ADDR _AC(0x10035000,UL) | ||||
| #define SPI0_MMAP_ADDR _AC(0x20000000,UL) | ||||
| #define MEM_BASE_ADDR _AC(0x80000000,UL) | ||||
|  | ||||
| // IOF Mappings | ||||
| #define IOF0_SPI1_MASK          _AC(0x000007FC,UL) | ||||
| #define SPI11_NUM_SS     (4) | ||||
| #define IOF_SPI1_SS0          (2u) | ||||
| #define IOF_SPI1_SS1          (8u) | ||||
| #define IOF_SPI1_SS2          (9u) | ||||
| #define IOF_SPI1_SS3          (10u) | ||||
| #define IOF_SPI1_MOSI         (3u) | ||||
| #define IOF_SPI1_MISO         (4u) | ||||
| #define IOF_SPI1_SCK          (5u) | ||||
| #define IOF_SPI1_DQ0          (3u) | ||||
| #define IOF_SPI1_DQ1          (4u) | ||||
| #define IOF_SPI1_DQ2          (6u) | ||||
| #define IOF_SPI1_DQ3          (7u) | ||||
|  | ||||
| #define IOF0_SPI2_MASK          _AC(0xFC000000,UL) | ||||
| #define SPI2_NUM_SS       (1) | ||||
| #define IOF_SPI2_SS0          (26u) | ||||
| #define IOF_SPI2_MOSI         (27u) | ||||
| #define IOF_SPI2_MISO         (28u) | ||||
| #define IOF_SPI2_SCK          (29u) | ||||
| #define IOF_SPI2_DQ0          (27u) | ||||
| #define IOF_SPI2_DQ1          (28u) | ||||
| #define IOF_SPI2_DQ2          (30u) | ||||
| #define IOF_SPI2_DQ3          (31u) | ||||
|  | ||||
| #define IOF0_UART0_MASK         _AC(0x00030000, UL) | ||||
| #define IOF_UART0_RX   (16u) | ||||
| #define IOF_UART0_TX   (17u) | ||||
|  | ||||
| #define IOF0_UART1_MASK         _AC(0x03000000, UL) | ||||
| #define IOF_UART1_RX (24u) | ||||
| #define IOF_UART1_TX (25u) | ||||
|  | ||||
| #define IOF1_PWM0_MASK          _AC(0x0000000F, UL) | ||||
| #define IOF1_PWM1_MASK          _AC(0x00780000, UL) | ||||
| #define IOF1_PWM2_MASK          _AC(0x00003C00, UL) | ||||
|  | ||||
| // Interrupt Numbers | ||||
| #define INT_RESERVED 0 | ||||
| #define INT_WDOGCMP 1 | ||||
| #define INT_RTCCMP 2 | ||||
| #define INT_UART0_BASE 3 | ||||
| #define INT_UART1_BASE 4 | ||||
| #define INT_SPI0_BASE 5 | ||||
| #define INT_SPI1_BASE 6 | ||||
| #define INT_SPI2_BASE 7 | ||||
| #define INT_GPIO_BASE 8 | ||||
| #define INT_PWM0_BASE 40 | ||||
| #define INT_PWM1_BASE 44 | ||||
| #define INT_PWM2_BASE 48 | ||||
|  | ||||
| // Helper functions | ||||
| #define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i))) | ||||
| #define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i))) | ||||
| #define AON_REG(offset) _REG32(AON_BASE_ADDR, offset) | ||||
| #define CLINT_REG(offset) _REG32(CLINT_BASE_ADDR, offset) | ||||
| #define GPIO_REG(offset) _REG32(GPIO_BASE_ADDR, offset) | ||||
| #define OTP_REG(offset)  _REG32(OTP_BASE_ADDR, offset) | ||||
| #define PLIC_REG(offset) _REG32(PLIC_BASE_ADDR, offset) | ||||
| #define PRCI_REG(offset) _REG32(PRCI_BASE_ADDR, offset) | ||||
| #define PWM0_REG(offset) _REG32(PWM0_BASE_ADDR, offset) | ||||
| #define PWM1_REG(offset) _REG32(PWM1_BASE_ADDR, offset) | ||||
| #define PWM2_REG(offset) _REG32(PWM2_BASE_ADDR, offset) | ||||
| #define SPI0_REG(offset) _REG32(SPI0_BASE_ADDR, offset) | ||||
| #define SPI1_REG(offset) _REG32(SPI1_BASE_ADDR, offset) | ||||
| #define SPI2_REG(offset) _REG32(SPI2_BASE_ADDR, offset) | ||||
| #define UART0_REG(offset) _REG32(UART0_BASE_ADDR, offset) | ||||
| #define UART1_REG(offset) _REG32(UART1_BASE_ADDR, offset) | ||||
|  | ||||
| // Misc | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
|  | ||||
| #define NUM_GPIO 32 | ||||
|  | ||||
| #define PLIC_NUM_INTERRUPTS 52 | ||||
| #define PLIC_NUM_PRIORITIES 7 | ||||
|  | ||||
| #define HAS_BOARD_BUTTONS | ||||
| #include "hifive1.h" | ||||
|  | ||||
| unsigned long get_timer_freq(void); | ||||
| uint64_t get_timer_value(void); | ||||
|  | ||||
| #endif /* _SIFIVE_PLATFORM_H */ | ||||
							
								
								
									
										238
									
								
								hifive1-vp/hello/bsp/env/freedom-e300-hifive1/init.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										238
									
								
								hifive1-vp/hello/bsp/env/freedom-e300-hifive1/init.c
									
									
									
									
										vendored
									
									
								
							| @@ -1,238 +0,0 @@ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| #include "platform.h" | ||||
| #include "encoding.h" | ||||
|  | ||||
| extern int main(int argc, char** argv); | ||||
| extern void trap_entry(); | ||||
|  | ||||
| static unsigned long mtime_lo(void) | ||||
| { | ||||
|   return *(volatile unsigned long *)(CLINT_BASE_ADDR + CLINT_MTIME); | ||||
| } | ||||
|  | ||||
| #ifdef __riscv32 | ||||
|  | ||||
| static uint32_t mtime_hi(void) | ||||
| { | ||||
|   return *(volatile uint32_t *)(CLINT_BASE_ADDR + CLINT_MTIME + 4); | ||||
| } | ||||
|  | ||||
| uint64_t get_timer_value() | ||||
| { | ||||
|   while (1) { | ||||
|     uint32_t hi = mtime_hi(); | ||||
|     uint32_t lo = mtime_lo(); | ||||
|     if (hi == mtime_hi()) | ||||
|       return ((uint64_t)hi << 32) | lo; | ||||
|   } | ||||
| } | ||||
|  | ||||
| #else /* __riscv32 */ | ||||
|  | ||||
| uint64_t get_timer_value() | ||||
| { | ||||
|   return mtime_lo(); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| unsigned long get_timer_freq() | ||||
| { | ||||
|   return 32768; | ||||
| } | ||||
|  | ||||
| static void use_hfrosc(int div, int trim) | ||||
| { | ||||
|   // Make sure the HFROSC is running at its default setting | ||||
|   PRCI_REG(PRCI_HFROSCCFG) = (ROSC_DIV(div) | ROSC_TRIM(trim) | ROSC_EN(1)); | ||||
|   while ((PRCI_REG(PRCI_HFROSCCFG) & ROSC_RDY(1)) == 0) ; | ||||
|   PRCI_REG(PRCI_PLLCFG) &= ~PLL_SEL(1); | ||||
| } | ||||
|  | ||||
| static void use_pll(int refsel, int bypass, int r, int f, int q) | ||||
| { | ||||
|   // Ensure that we aren't running off the PLL before we mess with it. | ||||
|   if (PRCI_REG(PRCI_PLLCFG) & PLL_SEL(1)) { | ||||
|     // Make sure the HFROSC is running at its default setting | ||||
|     use_hfrosc(4, 16); | ||||
|   } | ||||
|  | ||||
|   // Set PLL Source to be HFXOSC if available. | ||||
|   uint32_t config_value = 0; | ||||
|  | ||||
|   config_value |= PLL_REFSEL(refsel); | ||||
|  | ||||
|   if (bypass) { | ||||
|     // Bypass | ||||
|     config_value |= PLL_BYPASS(1); | ||||
|  | ||||
|     PRCI_REG(PRCI_PLLCFG) = config_value; | ||||
|  | ||||
|     // If we don't have an HFXTAL, this doesn't really matter. | ||||
|     // Set our Final output divide to divide-by-1: | ||||
|     PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); | ||||
|   } else { | ||||
|     // In case we are executing from QSPI, | ||||
|     // (which is quite likely) we need to | ||||
|     // set the QSPI clock divider appropriately | ||||
|     // before boosting the clock frequency. | ||||
|  | ||||
|     // Div = f_sck/2 | ||||
|     SPI0_REG(SPI_REG_SCKDIV) = 8; | ||||
|  | ||||
|     // Set DIV Settings for PLL | ||||
|     // Both HFROSC and HFXOSC are modeled as ideal | ||||
|     // 16MHz sources (assuming dividers are set properly for | ||||
|     // HFROSC). | ||||
|     // (Legal values of f_REF are 6-48MHz) | ||||
|  | ||||
|     // Set DIVR to divide-by-2 to get 8MHz frequency | ||||
|     // (legal values of f_R are 6-12 MHz) | ||||
|  | ||||
|     config_value |= PLL_BYPASS(1); | ||||
|     config_value |= PLL_R(r); | ||||
|  | ||||
|     // Set DIVF to get 512Mhz frequncy | ||||
|     // There is an implied multiply-by-2, 16Mhz. | ||||
|     // So need to write 32-1 | ||||
|     // (legal values of f_F are 384-768 MHz) | ||||
|     config_value |= PLL_F(f); | ||||
|  | ||||
|     // Set DIVQ to divide-by-2 to get 256 MHz frequency | ||||
|     // (legal values of f_Q are 50-400Mhz) | ||||
|     config_value |= PLL_Q(q); | ||||
|  | ||||
|     // Set our Final output divide to divide-by-1: | ||||
|     PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); | ||||
|  | ||||
|     PRCI_REG(PRCI_PLLCFG) = config_value; | ||||
|  | ||||
|     // Un-Bypass the PLL. | ||||
|     PRCI_REG(PRCI_PLLCFG) &= ~PLL_BYPASS(1); | ||||
|  | ||||
|     // Wait for PLL Lock | ||||
|     // Note that the Lock signal can be glitchy. | ||||
|     // Need to wait 100 us | ||||
|     // RTC is running at 32kHz. | ||||
|     // So wait 4 ticks of RTC. | ||||
|     uint32_t now = mtime_lo(); | ||||
|     while (mtime_lo() - now < 4) ; | ||||
|  | ||||
|     // Now it is safe to check for PLL Lock | ||||
|     while ((PRCI_REG(PRCI_PLLCFG) & PLL_LOCK(1)) == 0) ; | ||||
|   } | ||||
|  | ||||
|   // Switch over to PLL Clock source | ||||
|   PRCI_REG(PRCI_PLLCFG) |= PLL_SEL(1); | ||||
| } | ||||
|  | ||||
| static void use_default_clocks() | ||||
| { | ||||
|   // Turn off the LFROSC | ||||
|   AON_REG(AON_LFROSC) &= ~ROSC_EN(1); | ||||
|  | ||||
|   // Use HFROSC | ||||
|   use_hfrosc(4, 16); | ||||
| } | ||||
|  | ||||
| static unsigned long __attribute__((noinline)) measure_cpu_freq(size_t n) | ||||
| { | ||||
|   unsigned long start_mtime, delta_mtime; | ||||
|   unsigned long mtime_freq = get_timer_freq(); | ||||
|  | ||||
|   // Don't start measuruing until we see an mtime tick | ||||
|   unsigned long tmp = mtime_lo(); | ||||
|   do { | ||||
|     start_mtime = mtime_lo(); | ||||
|   } while (start_mtime == tmp); | ||||
|  | ||||
|   unsigned long start_mcycle = read_csr(mcycle); | ||||
|  | ||||
|   do { | ||||
|     delta_mtime = mtime_lo() - start_mtime; | ||||
|   } while (delta_mtime < n); | ||||
|  | ||||
|   unsigned long delta_mcycle = read_csr(mcycle) - start_mcycle; | ||||
|  | ||||
|   return (delta_mcycle / delta_mtime) * mtime_freq | ||||
|          + ((delta_mcycle % delta_mtime) * mtime_freq) / delta_mtime; | ||||
| } | ||||
|  | ||||
| unsigned long get_cpu_freq() | ||||
| { | ||||
|   static uint32_t cpu_freq; | ||||
|  | ||||
|   if (!cpu_freq) { | ||||
|     // warm up I$ | ||||
|     measure_cpu_freq(1); | ||||
|     // measure for real | ||||
|     cpu_freq = measure_cpu_freq(10); | ||||
|   } | ||||
|  | ||||
|   return cpu_freq; | ||||
| } | ||||
|  | ||||
| static void uart_init(size_t baud_rate) | ||||
| { | ||||
|   GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; | ||||
|   GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; | ||||
|   UART0_REG(UART_REG_DIV) = get_cpu_freq() / baud_rate - 1; | ||||
|   UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| #ifdef USE_PLIC | ||||
| extern void handle_m_ext_interrupt(); | ||||
| #endif | ||||
|  | ||||
| #ifdef USE_M_TIME | ||||
| extern void handle_m_time_interrupt(); | ||||
| #endif | ||||
|  | ||||
| uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) | ||||
| { | ||||
|   if (0){ | ||||
| #ifdef USE_PLIC | ||||
|     // External Machine-Level interrupt from PLIC | ||||
|   } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { | ||||
|     handle_m_ext_interrupt(); | ||||
| #endif | ||||
| #ifdef USE_M_TIME | ||||
|     // External Machine-Level interrupt from PLIC | ||||
|   } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ | ||||
|     handle_m_time_interrupt(); | ||||
| #endif | ||||
|   } | ||||
|   else { | ||||
|     write(1, "trap\n", 5); | ||||
|     _exit(1 + mcause); | ||||
|   } | ||||
|   return epc; | ||||
| } | ||||
|  | ||||
| void _init() | ||||
| { | ||||
|    | ||||
|   #ifndef NO_INIT | ||||
|   use_default_clocks(); | ||||
|   use_pll(0, 0, 1, 31, 1); | ||||
|   uart_init(115200); | ||||
|  | ||||
|   printf("core freq at %d Hz\n", get_cpu_freq()); | ||||
|  | ||||
|   write_csr(mtvec, &trap_entry); | ||||
|   if (read_csr(misa) & (1 << ('F' - 'A'))) { // if F extension is present | ||||
|     write_csr(mstatus, MSTATUS_FS); // allow FPU instructions without trapping | ||||
|     write_csr(fcsr, 0); // initialize rounding mode, undefined at reset | ||||
|   } | ||||
|   #endif | ||||
|    | ||||
| } | ||||
|  | ||||
| void _fini() | ||||
| { | ||||
| } | ||||
| @@ -1,167 +0,0 @@ | ||||
| OUTPUT_ARCH( "riscv" ) | ||||
|  | ||||
| ENTRY( _start ) | ||||
|  | ||||
| MEMORY | ||||
| { | ||||
|   flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M | ||||
|   ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K | ||||
| } | ||||
|  | ||||
| PHDRS | ||||
| { | ||||
|   flash PT_LOAD; | ||||
|   ram_init PT_LOAD; | ||||
|   ram PT_NULL; | ||||
| } | ||||
|  | ||||
| SECTIONS | ||||
| { | ||||
|   __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; | ||||
|  | ||||
|   .init           : | ||||
|   { | ||||
|     KEEP (*(SORT_NONE(.init))) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .text           : | ||||
|   { | ||||
|     *(.text.unlikely .text.unlikely.*) | ||||
|     *(.text.startup .text.startup.*) | ||||
|     *(.text .text.*) | ||||
|     *(.gnu.linkonce.t.*) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .fini           : | ||||
|   { | ||||
|     KEEP (*(SORT_NONE(.fini))) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   PROVIDE (__etext = .); | ||||
|   PROVIDE (_etext = .); | ||||
|   PROVIDE (etext = .); | ||||
|  | ||||
|   .rodata         : | ||||
|   { | ||||
|     *(.rdata) | ||||
|     *(.rodata .rodata.*) | ||||
|     *(.gnu.linkonce.r.*) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   . = ALIGN(4); | ||||
|  | ||||
|   .preinit_array  : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__preinit_array_start = .); | ||||
|     KEEP (*(.preinit_array)) | ||||
|     PROVIDE_HIDDEN (__preinit_array_end = .); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .init_array     : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__init_array_start = .); | ||||
|     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) | ||||
|     KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) | ||||
|     PROVIDE_HIDDEN (__init_array_end = .); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .fini_array     : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__fini_array_start = .); | ||||
|     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) | ||||
|     KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) | ||||
|     PROVIDE_HIDDEN (__fini_array_end = .); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .ctors          : | ||||
|   { | ||||
|     /* gcc uses crtbegin.o to find the start of | ||||
|        the constructors, so we make sure it is | ||||
|        first.  Because this is a wildcard, it | ||||
|        doesn't matter if the user does not | ||||
|        actually link against crtbegin.o; the | ||||
|        linker won't look for a file to match a | ||||
|        wildcard.  The wildcard also means that it | ||||
|        doesn't matter which directory crtbegin.o | ||||
|        is in.  */ | ||||
|     KEEP (*crtbegin.o(.ctors)) | ||||
|     KEEP (*crtbegin?.o(.ctors)) | ||||
|     /* We don't want to include the .ctor section from | ||||
|        the crtend.o file until after the sorted ctors. | ||||
|        The .ctor section from the crtend file contains the | ||||
|        end of ctors marker and it must be last */ | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) | ||||
|     KEEP (*(SORT(.ctors.*))) | ||||
|     KEEP (*(.ctors)) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .dtors          : | ||||
|   { | ||||
|     KEEP (*crtbegin.o(.dtors)) | ||||
|     KEEP (*crtbegin?.o(.dtors)) | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) | ||||
|     KEEP (*(SORT(.dtors.*))) | ||||
|     KEEP (*(.dtors)) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .lalign         : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     PROVIDE( _data_lma = . ); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .dalign         : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     PROVIDE( _data = . ); | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   .data          : | ||||
|   { | ||||
|     *(.data .data.*) | ||||
|     *(.gnu.linkonce.d.*) | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   .srodata        : | ||||
|   { | ||||
|     PROVIDE( _gp = . + 0x800 ); | ||||
|     *(.srodata.cst16) | ||||
|     *(.srodata.cst8) | ||||
|     *(.srodata.cst4) | ||||
|     *(.srodata.cst2) | ||||
|     *(.srodata .srodata.*) | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   .sdata          : | ||||
|   { | ||||
|     *(.sdata .sdata.*) | ||||
|     *(.gnu.linkonce.s.*) | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   . = ALIGN(4); | ||||
|   PROVIDE( _edata = . ); | ||||
|   PROVIDE( edata = . ); | ||||
|  | ||||
|   PROVIDE( _fbss = . ); | ||||
|   PROVIDE( __bss_start = . ); | ||||
|   .bss            : | ||||
|   { | ||||
|     *(.sbss*) | ||||
|     *(.gnu.linkonce.sb.*) | ||||
|     *(.bss .bss.*) | ||||
|     *(.gnu.linkonce.b.*) | ||||
|     *(COMMON) | ||||
|     . = ALIGN(4); | ||||
|   } >ram AT>ram :ram | ||||
|  | ||||
|   . = ALIGN(8); | ||||
|   PROVIDE( _end = . ); | ||||
|   PROVIDE( end = . ); | ||||
|  | ||||
|   .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : | ||||
|   { | ||||
|     PROVIDE( _heap_end = . ); | ||||
|     . = __stack_size; | ||||
|     PROVIDE( _sp = . ); | ||||
|   } >ram AT>ram :ram | ||||
| } | ||||
| @@ -1,34 +0,0 @@ | ||||
| adapter_khz     10000 | ||||
|  | ||||
| interface ftdi | ||||
| ftdi_device_desc "Dual RS232-HS" | ||||
| ftdi_vid_pid 0x0403 0x6010 | ||||
|  | ||||
| ftdi_layout_init 0x0008 0x001b | ||||
| ftdi_layout_signal nSRST -oe 0x0020 -data 0x0020 | ||||
|  | ||||
| #Reset Stretcher logic on FE310 is ~1 second long | ||||
| #This doesn't apply if you use | ||||
| # ftdi_set_signal, but still good to document | ||||
| #adapter_nsrst_delay 1500 | ||||
|  | ||||
| set _CHIPNAME riscv | ||||
| jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913 | ||||
|  | ||||
| set _TARGETNAME $_CHIPNAME.cpu | ||||
| target create $_TARGETNAME riscv -chain-position $_TARGETNAME | ||||
| $_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 | ||||
|  | ||||
| flash bank onboard_spi_flash fespi 0x20000000 0 0 0 $_TARGETNAME | ||||
| init | ||||
| #reset -- This type of reset is not implemented yet | ||||
| if {[ info exists pulse_srst]} { | ||||
|   ftdi_set_signal nSRST 0 | ||||
|   ftdi_set_signal nSRST z | ||||
|   #Wait for the reset stretcher | ||||
|   #It will work without this, but | ||||
|   #will incur lots of delays for later commands. | ||||
|   sleep 1500 | ||||
| }	 | ||||
| halt | ||||
| #flash protect 0 64 last off | ||||
| @@ -1,133 +0,0 @@ | ||||
| // See LICENSE for license details. | ||||
|  | ||||
| #ifndef _SIFIVE_PLATFORM_H | ||||
| #define _SIFIVE_PLATFORM_H | ||||
|  | ||||
| // Some things missing from the official encoding.h | ||||
| #define MCAUSE_INT         0x80000000 | ||||
| #define MCAUSE_CAUSE       0x7FFFFFFF | ||||
|  | ||||
| #include "sifive/const.h" | ||||
| #include "sifive/devices/aon.h" | ||||
| #include "sifive/devices/clint.h" | ||||
| #include "sifive/devices/gpio.h" | ||||
| #include "sifive/devices/otp.h" | ||||
| #include "sifive/devices/plic.h" | ||||
| #include "sifive/devices/prci.h" | ||||
| #include "sifive/devices/pwm.h" | ||||
| #include "sifive/devices/spi.h" | ||||
| #include "sifive/devices/uart.h" | ||||
|  | ||||
| /**************************************************************************** | ||||
|  * Platform definitions | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| // Memory map | ||||
| #define MASKROM_BASE_ADDR _AC(0x00001000,UL) | ||||
| #define TRAPVEC_TABLE_BASE_ADDR _AC(0x00001010,UL) | ||||
| #define OTP_MMAP_ADDR _AC(0x00020000,UL) | ||||
| #define CLINT_BASE_ADDR _AC(0x02000000,UL) | ||||
| #define PLIC_BASE_ADDR _AC(0x0C000000,UL) | ||||
| #define AON_BASE_ADDR _AC(0x10000000,UL) | ||||
| #define PRCI_BASE_ADDR _AC(0x10008000,UL) | ||||
| #define OTP_BASE_ADDR _AC(0x10010000,UL) | ||||
| #define GPIO_BASE_ADDR _AC(0x10012000,UL) | ||||
| #define UART0_BASE_ADDR _AC(0x10013000,UL) | ||||
| #define SPI0_BASE_ADDR _AC(0x10014000,UL) | ||||
| #define PWM0_BASE_ADDR _AC(0x10015000,UL) | ||||
| #define UART1_BASE_ADDR _AC(0x10023000,UL) | ||||
| #define SPI1_BASE_ADDR _AC(0x10024000,UL) | ||||
| #define PWM1_BASE_ADDR _AC(0x10025000,UL) | ||||
| #define SPI2_BASE_ADDR _AC(0x10034000,UL) | ||||
| #define PWM2_BASE_ADDR _AC(0x10035000,UL) | ||||
| #define SPI0_MMAP_ADDR _AC(0x20000000,UL) | ||||
| #define MEM_BASE_ADDR _AC(0x80000000,UL) | ||||
|  | ||||
| // IOF masks | ||||
| #define IOF0_SPI1_MASK          _AC(0x000007FC,UL) | ||||
| #define SPI11_NUM_SS     (4) | ||||
| #define IOF_SPI1_SS0          (2u) | ||||
| #define IOF_SPI1_SS1          (8u) | ||||
| #define IOF_SPI1_SS2          (9u) | ||||
| #define IOF_SPI1_SS3          (10u) | ||||
| #define IOF_SPI1_MOSI         (3u) | ||||
| #define IOF_SPI1_MISO         (4u) | ||||
| #define IOF_SPI1_SCK          (5u) | ||||
| #define IOF_SPI1_DQ0          (3u) | ||||
| #define IOF_SPI1_DQ1          (4u) | ||||
| #define IOF_SPI1_DQ2          (6u) | ||||
| #define IOF_SPI1_DQ3          (7u) | ||||
|  | ||||
| #define IOF0_SPI2_MASK          _AC(0xFC000000,UL) | ||||
| #define SPI2_NUM_SS       (1) | ||||
| #define IOF_SPI2_SS0          (26u) | ||||
| #define IOF_SPI2_MOSI         (27u) | ||||
| #define IOF_SPI2_MISO         (28u) | ||||
| #define IOF_SPI2_SCK          (29u) | ||||
| #define IOF_SPI2_DQ0          (27u) | ||||
| #define IOF_SPI2_DQ1          (28u) | ||||
| #define IOF_SPI2_DQ2          (30u) | ||||
| #define IOF_SPI2_DQ3          (31u) | ||||
|  | ||||
| //#define IOF0_I2C_MASK          _AC(0x00003000,UL) | ||||
|  | ||||
| #define IOF0_UART0_MASK         _AC(0x00030000, UL) | ||||
| #define IOF_UART0_RX   (16u) | ||||
| #define IOF_UART0_TX   (17u) | ||||
|  | ||||
| #define IOF0_UART1_MASK         _AC(0x03000000, UL) | ||||
| #define IOF_UART1_RX (24u) | ||||
| #define IOF_UART1_TX (25u) | ||||
|  | ||||
| #define IOF1_PWM0_MASK          _AC(0x0000000F, UL) | ||||
| #define IOF1_PWM1_MASK          _AC(0x00780000, UL) | ||||
| #define IOF1_PWM2_MASK          _AC(0x00003C00, UL) | ||||
|  | ||||
| // Interrupt numbers | ||||
| #define INT_RESERVED 0 | ||||
| #define INT_WDOGCMP 1 | ||||
| #define INT_RTCCMP 2 | ||||
| #define INT_UART0_BASE 3 | ||||
| #define INT_UART1_BASE 4 | ||||
| #define INT_SPI0_BASE 5 | ||||
| #define INT_SPI1_BASE 6 | ||||
| #define INT_SPI2_BASE 7 | ||||
| #define INT_GPIO_BASE 8 | ||||
| #define INT_PWM0_BASE 40 | ||||
| #define INT_PWM1_BASE 44 | ||||
| #define INT_PWM2_BASE 48 | ||||
|  | ||||
| // Helper functions | ||||
| #define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i))) | ||||
| #define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i))) | ||||
| #define AON_REG(offset) _REG32(AON_BASE_ADDR, offset) | ||||
| #define CLINT_REG(offset) _REG32(CLINT_BASE_ADDR, offset) | ||||
| #define GPIO_REG(offset) _REG32(GPIO_BASE_ADDR, offset) | ||||
| #define OTP_REG(offset)  _REG32(OTP_BASE_ADDR, offset) | ||||
| #define PLIC_REG(offset) _REG32(PLIC_BASE_ADDR, offset) | ||||
| #define PRCI_REG(offset) _REG32(PRCI_BASE_ADDR, offset) | ||||
| #define PWM0_REG(offset) _REG32(PWM0_BASE_ADDR, offset) | ||||
| #define PWM1_REG(offset) _REG32(PWM1_BASE_ADDR, offset) | ||||
| #define PWM2_REG(offset) _REG32(PWM2_BASE_ADDR, offset) | ||||
| #define SPI0_REG(offset) _REG32(SPI0_BASE_ADDR, offset) | ||||
| #define SPI1_REG(offset) _REG32(SPI1_BASE_ADDR, offset) | ||||
| #define SPI2_REG(offset) _REG32(SPI2_BASE_ADDR, offset) | ||||
| #define UART0_REG(offset) _REG32(UART0_BASE_ADDR, offset) | ||||
| #define UART1_REG(offset) _REG32(UART1_BASE_ADDR, offset) | ||||
|  | ||||
| // Misc | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| #define NUM_GPIO 32 | ||||
|  | ||||
| #define PLIC_NUM_INTERRUPTS 52 | ||||
| #define PLIC_NUM_PRIORITIES 7 | ||||
|  | ||||
| #include "hifive1.h" | ||||
|  | ||||
| unsigned long get_cpu_freq(void); | ||||
| unsigned long get_timer_freq(void); | ||||
| uint64_t get_timer_value(void); | ||||
|  | ||||
| #endif /* _SIFIVE_PLATFORM_H */ | ||||
							
								
								
									
										79
									
								
								hifive1-vp/hello/bsp/env/hifive1.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										79
									
								
								hifive1-vp/hello/bsp/env/hifive1.h
									
									
									
									
										vendored
									
									
								
							| @@ -1,79 +0,0 @@ | ||||
| // See LICENSE for license details. | ||||
|  | ||||
| #ifndef _SIFIVE_HIFIVE1_H | ||||
| #define _SIFIVE_HIFIVE1_H | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| /**************************************************************************** | ||||
|  * GPIO Connections | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| // These are the GPIO bit offsets for the RGB LED on HiFive1 Board. | ||||
| // These are also mapped to RGB LEDs on the Freedom E300 Arty | ||||
| // FPGA | ||||
| // Dev Kit. | ||||
|  | ||||
| #define RED_LED_OFFSET   22 | ||||
| #define GREEN_LED_OFFSET 19 | ||||
| #define BLUE_LED_OFFSET  21 | ||||
|  | ||||
| // These are the GPIO bit offsets for the differen digital pins | ||||
| // on the headers for both the HiFive1 Board and the Freedom E300 Arty FPGA Dev Kit. | ||||
| #define PIN_0_OFFSET 16 | ||||
| #define PIN_1_OFFSET 17 | ||||
| #define PIN_2_OFFSET 18 | ||||
| #define PIN_3_OFFSET 19 | ||||
| #define PIN_4_OFFSET 20 | ||||
| #define PIN_5_OFFSET 21 | ||||
| #define PIN_6_OFFSET 22 | ||||
| #define PIN_7_OFFSET 23 | ||||
| #define PIN_8_OFFSET 0 | ||||
| #define PIN_9_OFFSET 1 | ||||
| #define PIN_10_OFFSET 2 | ||||
| #define PIN_11_OFFSET 3 | ||||
| #define PIN_12_OFFSET 4 | ||||
| #define PIN_13_OFFSET 5 | ||||
| //#define PIN_14_OFFSET 8 //This pin is not connected on either board. | ||||
| #define PIN_15_OFFSET 9 | ||||
| #define PIN_16_OFFSET 10 | ||||
| #define PIN_17_OFFSET 11 | ||||
| #define PIN_18_OFFSET 12 | ||||
| #define PIN_19_OFFSET 13 | ||||
|  | ||||
| // These are *PIN* numbers, not | ||||
| // GPIO Offset Numbers. | ||||
| #define PIN_SPI1_SCK    (13u) | ||||
| #define PIN_SPI1_MISO   (12u) | ||||
| #define PIN_SPI1_MOSI   (11u) | ||||
| #define PIN_SPI1_SS0    (10u) | ||||
| #define PIN_SPI1_SS1    (14u)  | ||||
| #define PIN_SPI1_SS2    (15u) | ||||
| #define PIN_SPI1_SS3    (16u) | ||||
|  | ||||
| #define SS_PIN_TO_CS_ID(x) \ | ||||
|   ((x==PIN_SPI1_SS0 ? 0 :		 \ | ||||
|     (x==PIN_SPI1_SS1 ? 1 :		 \ | ||||
|      (x==PIN_SPI1_SS2 ? 2 :		 \ | ||||
|       (x==PIN_SPI1_SS3 ? 3 :		 \ | ||||
|        -1)))))  | ||||
|  | ||||
|  | ||||
| // These buttons are present only on the Freedom E300 Arty Dev Kit. | ||||
| #ifdef HAS_BOARD_BUTTONS | ||||
| #define BUTTON_0_OFFSET 15 | ||||
| #define BUTTON_1_OFFSET 30 | ||||
| #define BUTTON_2_OFFSET 31 | ||||
|  | ||||
| #define INT_DEVICE_BUTTON_0 (INT_GPIO_BASE + BUTTON_0_OFFSET) | ||||
| #define INT_DEVICE_BUTTON_1 (INT_GPIO_BASE + BUTTON_1_OFFSET) | ||||
| #define INT_DEVICE_BUTTON_2 (INT_GPIO_BASE + BUTTON_2_OFFSET) | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #define HAS_HFXOSC 1 | ||||
| #define HAS_LFROSC_BYPASS 1 | ||||
|  | ||||
| #define RTC_FREQ 32768 | ||||
|  | ||||
| #endif /* _SIFIVE_HIFIVE1_H */ | ||||
							
								
								
									
										238
									
								
								hifive1-vp/hello/bsp/env/iss/init.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										238
									
								
								hifive1-vp/hello/bsp/env/iss/init.c
									
									
									
									
										vendored
									
									
								
							| @@ -1,238 +0,0 @@ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| #include "platform.h" | ||||
| #include "encoding.h" | ||||
|  | ||||
| extern int main(int argc, char** argv); | ||||
| extern void trap_entry(); | ||||
|  | ||||
| static unsigned long mtime_lo(void) | ||||
| { | ||||
|   return *(volatile unsigned long *)(CLINT_BASE_ADDR + CLINT_MTIME); | ||||
| } | ||||
|  | ||||
| #ifdef __riscv32 | ||||
|  | ||||
| static uint32_t mtime_hi(void) | ||||
| { | ||||
|   return *(volatile uint32_t *)(CLINT_BASE_ADDR + CLINT_MTIME + 4); | ||||
| } | ||||
|  | ||||
| uint64_t get_timer_value() | ||||
| { | ||||
|   while (1) { | ||||
|     uint32_t hi = mtime_hi(); | ||||
|     uint32_t lo = mtime_lo(); | ||||
|     if (hi == mtime_hi()) | ||||
|       return ((uint64_t)hi << 32) | lo; | ||||
|   } | ||||
| } | ||||
|  | ||||
| #else /* __riscv32 */ | ||||
|  | ||||
| uint64_t get_timer_value() | ||||
| { | ||||
|   return mtime_lo(); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| unsigned long get_timer_freq() | ||||
| { | ||||
|   return 32768; | ||||
| } | ||||
|  | ||||
| static void use_hfrosc(int div, int trim) | ||||
| { | ||||
|   // Make sure the HFROSC is running at its default setting | ||||
|   PRCI_REG(PRCI_HFROSCCFG) = (ROSC_DIV(div) | ROSC_TRIM(trim) | ROSC_EN(1)); | ||||
|   while ((PRCI_REG(PRCI_HFROSCCFG) & ROSC_RDY(1)) == 0) ; | ||||
|   PRCI_REG(PRCI_PLLCFG) &= ~PLL_SEL(1); | ||||
| } | ||||
|  | ||||
| static void use_pll(int refsel, int bypass, int r, int f, int q) | ||||
| { | ||||
|   // Ensure that we aren't running off the PLL before we mess with it. | ||||
|   if (PRCI_REG(PRCI_PLLCFG) & PLL_SEL(1)) { | ||||
|     // Make sure the HFROSC is running at its default setting | ||||
|     use_hfrosc(4, 16); | ||||
|   } | ||||
|  | ||||
|   // Set PLL Source to be HFXOSC if available. | ||||
|   uint32_t config_value = 0; | ||||
|  | ||||
|   config_value |= PLL_REFSEL(refsel); | ||||
|  | ||||
|   if (bypass) { | ||||
|     // Bypass | ||||
|     config_value |= PLL_BYPASS(1); | ||||
|  | ||||
|     PRCI_REG(PRCI_PLLCFG) = config_value; | ||||
|  | ||||
|     // If we don't have an HFXTAL, this doesn't really matter. | ||||
|     // Set our Final output divide to divide-by-1: | ||||
|     PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); | ||||
|   } else { | ||||
|     // In case we are executing from QSPI, | ||||
|     // (which is quite likely) we need to | ||||
|     // set the QSPI clock divider appropriately | ||||
|     // before boosting the clock frequency. | ||||
|  | ||||
|     // Div = f_sck/2 | ||||
|     SPI0_REG(SPI_REG_SCKDIV) = 8; | ||||
|  | ||||
|     // Set DIV Settings for PLL | ||||
|     // Both HFROSC and HFXOSC are modeled as ideal | ||||
|     // 16MHz sources (assuming dividers are set properly for | ||||
|     // HFROSC). | ||||
|     // (Legal values of f_REF are 6-48MHz) | ||||
|  | ||||
|     // Set DIVR to divide-by-2 to get 8MHz frequency | ||||
|     // (legal values of f_R are 6-12 MHz) | ||||
|  | ||||
|     config_value |= PLL_BYPASS(1); | ||||
|     config_value |= PLL_R(r); | ||||
|  | ||||
|     // Set DIVF to get 512Mhz frequncy | ||||
|     // There is an implied multiply-by-2, 16Mhz. | ||||
|     // So need to write 32-1 | ||||
|     // (legal values of f_F are 384-768 MHz) | ||||
|     config_value |= PLL_F(f); | ||||
|  | ||||
|     // Set DIVQ to divide-by-2 to get 256 MHz frequency | ||||
|     // (legal values of f_Q are 50-400Mhz) | ||||
|     config_value |= PLL_Q(q); | ||||
|  | ||||
|     // Set our Final output divide to divide-by-1: | ||||
|     PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); | ||||
|  | ||||
|     PRCI_REG(PRCI_PLLCFG) = config_value; | ||||
|  | ||||
|     // Un-Bypass the PLL. | ||||
|     PRCI_REG(PRCI_PLLCFG) &= ~PLL_BYPASS(1); | ||||
|  | ||||
|     // Wait for PLL Lock | ||||
|     // Note that the Lock signal can be glitchy. | ||||
|     // Need to wait 100 us | ||||
|     // RTC is running at 32kHz. | ||||
|     // So wait 4 ticks of RTC. | ||||
|     uint32_t now = mtime_lo(); | ||||
|     while (mtime_lo() - now < 4) ; | ||||
|  | ||||
|     // Now it is safe to check for PLL Lock | ||||
|     while ((PRCI_REG(PRCI_PLLCFG) & PLL_LOCK(1)) == 0) ; | ||||
|   } | ||||
|  | ||||
|   // Switch over to PLL Clock source | ||||
|   PRCI_REG(PRCI_PLLCFG) |= PLL_SEL(1); | ||||
| } | ||||
|  | ||||
| static void use_default_clocks() | ||||
| { | ||||
|   // Turn off the LFROSC | ||||
|   AON_REG(AON_LFROSC) &= ~ROSC_EN(1); | ||||
|  | ||||
|   // Use HFROSC | ||||
|   use_hfrosc(4, 16); | ||||
| } | ||||
|  | ||||
| static unsigned long __attribute__((noinline)) measure_cpu_freq(size_t n) | ||||
| { | ||||
|   unsigned long start_mtime, delta_mtime; | ||||
|   unsigned long mtime_freq = get_timer_freq(); | ||||
|  | ||||
|   // Don't start measuruing until we see an mtime tick | ||||
|   unsigned long tmp = mtime_lo(); | ||||
|   do { | ||||
|     start_mtime = mtime_lo(); | ||||
|   } while (start_mtime == tmp); | ||||
|  | ||||
|   unsigned long start_mcycle = read_csr(mcycle); | ||||
|  | ||||
|   do { | ||||
|     delta_mtime = mtime_lo() - start_mtime; | ||||
|   } while (delta_mtime < n); | ||||
|  | ||||
|   unsigned long delta_mcycle = read_csr(mcycle) - start_mcycle; | ||||
|  | ||||
|   return (delta_mcycle / delta_mtime) * mtime_freq | ||||
|          + ((delta_mcycle % delta_mtime) * mtime_freq) / delta_mtime; | ||||
| } | ||||
|  | ||||
| unsigned long get_cpu_freq() | ||||
| { | ||||
|   static uint32_t cpu_freq; | ||||
|  | ||||
|   if (!cpu_freq) { | ||||
|     // warm up I$ | ||||
|     measure_cpu_freq(1); | ||||
|     // measure for real | ||||
|     cpu_freq = measure_cpu_freq(10); | ||||
|   } | ||||
|  | ||||
|   return cpu_freq; | ||||
| } | ||||
|  | ||||
| static void uart_init(size_t baud_rate) | ||||
| { | ||||
|   GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; | ||||
|   GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; | ||||
|   UART0_REG(UART_REG_DIV) = get_cpu_freq() / baud_rate - 1; | ||||
|   UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| #ifdef USE_PLIC | ||||
| extern void handle_m_ext_interrupt(); | ||||
| #endif | ||||
|  | ||||
| #ifdef USE_M_TIME | ||||
| extern void handle_m_time_interrupt(); | ||||
| #endif | ||||
|  | ||||
| uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) | ||||
| { | ||||
|   if (0){ | ||||
| #ifdef USE_PLIC | ||||
|     // External Machine-Level interrupt from PLIC | ||||
|   } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { | ||||
|     handle_m_ext_interrupt(); | ||||
| #endif | ||||
| #ifdef USE_M_TIME | ||||
|     // External Machine-Level interrupt from PLIC | ||||
|   } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ | ||||
|     handle_m_time_interrupt(); | ||||
| #endif | ||||
|   } | ||||
|   else { | ||||
|     write(1, "trap\n", 5); | ||||
|     _exit(1 + mcause); | ||||
|   } | ||||
|   return epc; | ||||
| } | ||||
|  | ||||
| void _init() | ||||
| { | ||||
|    | ||||
|   #ifndef NO_INIT | ||||
|   use_default_clocks(); | ||||
|   use_pll(0, 0, 1, 31, 1); | ||||
|   uart_init(115200); | ||||
|  | ||||
|   printf("core freq at %d Hz\n", get_cpu_freq()); | ||||
|  | ||||
|   write_csr(mtvec, &trap_entry); | ||||
|   if (read_csr(misa) & (1 << ('F' - 'A'))) { // if F extension is present | ||||
|     write_csr(mstatus, MSTATUS_FS); // allow FPU instructions without trapping | ||||
|     write_csr(fcsr, 0); // initialize rounding mode, undefined at reset | ||||
|   } | ||||
|   #endif | ||||
|    | ||||
| } | ||||
|  | ||||
| void _fini() | ||||
| { | ||||
| } | ||||
							
								
								
									
										168
									
								
								hifive1-vp/hello/bsp/env/iss/link.lds
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										168
									
								
								hifive1-vp/hello/bsp/env/iss/link.lds
									
									
									
									
										vendored
									
									
								
							| @@ -1,168 +0,0 @@ | ||||
| OUTPUT_ARCH( "riscv" ) | ||||
|  | ||||
| ENTRY( _start ) | ||||
|  | ||||
| MEMORY | ||||
| { | ||||
|   /*flash (rxai!w) : ORIGIN = 0x00000000, LENGTH = 1M*/ | ||||
|   flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M | ||||
|   ram (wxa!ri) :   ORIGIN = 0x80000000, LENGTH = 16K | ||||
| } | ||||
|  | ||||
| PHDRS | ||||
| { | ||||
|   flash PT_LOAD; | ||||
|   ram_init PT_LOAD; | ||||
|   ram PT_NULL; | ||||
| } | ||||
|  | ||||
| SECTIONS | ||||
| { | ||||
|   __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; | ||||
|  | ||||
|   .init           : | ||||
|   { | ||||
|     KEEP (*(SORT_NONE(.init))) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .text           : | ||||
|   { | ||||
|     *(.text.unlikely .text.unlikely.*) | ||||
|     *(.text.startup .text.startup.*) | ||||
|     *(.text .text.*) | ||||
|     *(.gnu.linkonce.t.*) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .fini           : | ||||
|   { | ||||
|     KEEP (*(SORT_NONE(.fini))) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   PROVIDE (__etext = .); | ||||
|   PROVIDE (_etext = .); | ||||
|   PROVIDE (etext = .); | ||||
|  | ||||
|   .rodata         : | ||||
|   { | ||||
|     *(.rdata) | ||||
|     *(.rodata .rodata.*) | ||||
|     *(.gnu.linkonce.r.*) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   . = ALIGN(4); | ||||
|  | ||||
|   .preinit_array  : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__preinit_array_start = .); | ||||
|     KEEP (*(.preinit_array)) | ||||
|     PROVIDE_HIDDEN (__preinit_array_end = .); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .init_array     : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__init_array_start = .); | ||||
|     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) | ||||
|     KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) | ||||
|     PROVIDE_HIDDEN (__init_array_end = .); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .fini_array     : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__fini_array_start = .); | ||||
|     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) | ||||
|     KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) | ||||
|     PROVIDE_HIDDEN (__fini_array_end = .); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .ctors          : | ||||
|   { | ||||
|     /* gcc uses crtbegin.o to find the start of | ||||
|        the constructors, so we make sure it is | ||||
|        first.  Because this is a wildcard, it | ||||
|        doesn't matter if the user does not | ||||
|        actually link against crtbegin.o; the | ||||
|        linker won't look for a file to match a | ||||
|        wildcard.  The wildcard also means that it | ||||
|        doesn't matter which directory crtbegin.o | ||||
|        is in.  */ | ||||
|     KEEP (*crtbegin.o(.ctors)) | ||||
|     KEEP (*crtbegin?.o(.ctors)) | ||||
|     /* We don't want to include the .ctor section from | ||||
|        the crtend.o file until after the sorted ctors. | ||||
|        The .ctor section from the crtend file contains the | ||||
|        end of ctors marker and it must be last */ | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) | ||||
|     KEEP (*(SORT(.ctors.*))) | ||||
|     KEEP (*(.ctors)) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .dtors          : | ||||
|   { | ||||
|     KEEP (*crtbegin.o(.dtors)) | ||||
|     KEEP (*crtbegin?.o(.dtors)) | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) | ||||
|     KEEP (*(SORT(.dtors.*))) | ||||
|     KEEP (*(.dtors)) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .lalign         : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     PROVIDE( _data_lma = . ); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .dalign         : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     PROVIDE( _data = . ); | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   .data          : | ||||
|   { | ||||
|     *(.data .data.*) | ||||
|     *(.gnu.linkonce.d.*) | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   .srodata        : | ||||
|   { | ||||
|     PROVIDE( _gp = . + 0x800 ); | ||||
|     *(.srodata.cst16) | ||||
|     *(.srodata.cst8) | ||||
|     *(.srodata.cst4) | ||||
|     *(.srodata.cst2) | ||||
|     *(.srodata .srodata.*) | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   .sdata          : | ||||
|   { | ||||
|     *(.sdata .sdata.*) | ||||
|     *(.gnu.linkonce.s.*) | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   . = ALIGN(4); | ||||
|   PROVIDE( _edata = . ); | ||||
|   PROVIDE( edata = . ); | ||||
|  | ||||
|   PROVIDE( _fbss = . ); | ||||
|   PROVIDE( __bss_start = . ); | ||||
|   .bss            : | ||||
|   { | ||||
|     *(.sbss*) | ||||
|     *(.gnu.linkonce.sb.*) | ||||
|     *(.bss .bss.*) | ||||
|     *(.gnu.linkonce.b.*) | ||||
|     *(COMMON) | ||||
|     . = ALIGN(4); | ||||
|   } >ram AT>ram :ram | ||||
|  | ||||
|   . = ALIGN(8); | ||||
|   PROVIDE( _end = . ); | ||||
|   PROVIDE( end = . ); | ||||
|  | ||||
|   .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : | ||||
|   { | ||||
|     PROVIDE( _heap_end = . ); | ||||
|     . = __stack_size; | ||||
|     PROVIDE( _sp = . ); | ||||
|   } >ram AT>ram :ram | ||||
| } | ||||
							
								
								
									
										34
									
								
								hifive1-vp/hello/bsp/env/iss/openocd.cfg
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								hifive1-vp/hello/bsp/env/iss/openocd.cfg
									
									
									
									
										vendored
									
									
								
							| @@ -1,34 +0,0 @@ | ||||
| adapter_khz     10000 | ||||
|  | ||||
| interface ftdi | ||||
| ftdi_device_desc "Dual RS232-HS" | ||||
| ftdi_vid_pid 0x0403 0x6010 | ||||
|  | ||||
| ftdi_layout_init 0x0008 0x001b | ||||
| ftdi_layout_signal nSRST -oe 0x0020 -data 0x0020 | ||||
|  | ||||
| #Reset Stretcher logic on FE310 is ~1 second long | ||||
| #This doesn't apply if you use | ||||
| # ftdi_set_signal, but still good to document | ||||
| #adapter_nsrst_delay 1500 | ||||
|  | ||||
| set _CHIPNAME riscv | ||||
| jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913 | ||||
|  | ||||
| set _TARGETNAME $_CHIPNAME.cpu | ||||
| target create $_TARGETNAME riscv -chain-position $_TARGETNAME | ||||
| $_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 | ||||
|  | ||||
| flash bank onboard_spi_flash fespi 0x20000000 0 0 0 $_TARGETNAME | ||||
| init | ||||
| #reset -- This type of reset is not implemented yet | ||||
| if {[ info exists pulse_srst]} { | ||||
|   ftdi_set_signal nSRST 0 | ||||
|   ftdi_set_signal nSRST z | ||||
|   #Wait for the reset stretcher | ||||
|   #It will work without this, but | ||||
|   #will incur lots of delays for later commands. | ||||
|   sleep 1500 | ||||
| }	 | ||||
| halt | ||||
| #flash protect 0 64 last off | ||||
							
								
								
									
										133
									
								
								hifive1-vp/hello/bsp/env/iss/platform.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										133
									
								
								hifive1-vp/hello/bsp/env/iss/platform.h
									
									
									
									
										vendored
									
									
								
							| @@ -1,133 +0,0 @@ | ||||
| // See LICENSE for license details. | ||||
|  | ||||
| #ifndef _SIFIVE_PLATFORM_H | ||||
| #define _SIFIVE_PLATFORM_H | ||||
|  | ||||
| // Some things missing from the official encoding.h | ||||
| #define MCAUSE_INT         0x80000000 | ||||
| #define MCAUSE_CAUSE       0x7FFFFFFF | ||||
|  | ||||
| #include "sifive/const.h" | ||||
| #include "sifive/devices/aon.h" | ||||
| #include "sifive/devices/clint.h" | ||||
| #include "sifive/devices/gpio.h" | ||||
| #include "sifive/devices/otp.h" | ||||
| #include "sifive/devices/plic.h" | ||||
| #include "sifive/devices/prci.h" | ||||
| #include "sifive/devices/pwm.h" | ||||
| #include "sifive/devices/spi.h" | ||||
| #include "sifive/devices/uart.h" | ||||
|  | ||||
| /**************************************************************************** | ||||
|  * Platform definitions | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| // Memory map | ||||
| #define MASKROM_BASE_ADDR _AC(0x00001000,UL) | ||||
| #define TRAPVEC_TABLE_BASE_ADDR _AC(0x00001010,UL) | ||||
| #define OTP_MMAP_ADDR _AC(0x00020000,UL) | ||||
| #define CLINT_BASE_ADDR _AC(0x02000000,UL) | ||||
| #define PLIC_BASE_ADDR _AC(0x0C000000,UL) | ||||
| #define AON_BASE_ADDR _AC(0x10000000,UL) | ||||
| #define PRCI_BASE_ADDR _AC(0x10008000,UL) | ||||
| #define OTP_BASE_ADDR _AC(0x10010000,UL) | ||||
| #define GPIO_BASE_ADDR _AC(0x10012000,UL) | ||||
| #define UART0_BASE_ADDR _AC(0x10013000,UL) | ||||
| #define SPI0_BASE_ADDR _AC(0x10014000,UL) | ||||
| #define PWM0_BASE_ADDR _AC(0x10015000,UL) | ||||
| #define UART1_BASE_ADDR _AC(0x10023000,UL) | ||||
| #define SPI1_BASE_ADDR _AC(0x10024000,UL) | ||||
| #define PWM1_BASE_ADDR _AC(0x10025000,UL) | ||||
| #define SPI2_BASE_ADDR _AC(0x10034000,UL) | ||||
| #define PWM2_BASE_ADDR _AC(0x10035000,UL) | ||||
| #define SPI0_MMAP_ADDR _AC(0x20000000,UL) | ||||
| #define MEM_BASE_ADDR _AC(0x80000000,UL) | ||||
|  | ||||
| // IOF masks | ||||
| #define IOF0_SPI1_MASK          _AC(0x000007FC,UL) | ||||
| #define SPI11_NUM_SS     (4) | ||||
| #define IOF_SPI1_SS0          (2u) | ||||
| #define IOF_SPI1_SS1          (8u) | ||||
| #define IOF_SPI1_SS2          (9u) | ||||
| #define IOF_SPI1_SS3          (10u) | ||||
| #define IOF_SPI1_MOSI         (3u) | ||||
| #define IOF_SPI1_MISO         (4u) | ||||
| #define IOF_SPI1_SCK          (5u) | ||||
| #define IOF_SPI1_DQ0          (3u) | ||||
| #define IOF_SPI1_DQ1          (4u) | ||||
| #define IOF_SPI1_DQ2          (6u) | ||||
| #define IOF_SPI1_DQ3          (7u) | ||||
|  | ||||
| #define IOF0_SPI2_MASK          _AC(0xFC000000,UL) | ||||
| #define SPI2_NUM_SS       (1) | ||||
| #define IOF_SPI2_SS0          (26u) | ||||
| #define IOF_SPI2_MOSI         (27u) | ||||
| #define IOF_SPI2_MISO         (28u) | ||||
| #define IOF_SPI2_SCK          (29u) | ||||
| #define IOF_SPI2_DQ0          (27u) | ||||
| #define IOF_SPI2_DQ1          (28u) | ||||
| #define IOF_SPI2_DQ2          (30u) | ||||
| #define IOF_SPI2_DQ3          (31u) | ||||
|  | ||||
| //#define IOF0_I2C_MASK          _AC(0x00003000,UL) | ||||
|  | ||||
| #define IOF0_UART0_MASK         _AC(0x00030000, UL) | ||||
| #define IOF_UART0_RX   (16u) | ||||
| #define IOF_UART0_TX   (17u) | ||||
|  | ||||
| #define IOF0_UART1_MASK         _AC(0x03000000, UL) | ||||
| #define IOF_UART1_RX (24u) | ||||
| #define IOF_UART1_TX (25u) | ||||
|  | ||||
| #define IOF1_PWM0_MASK          _AC(0x0000000F, UL) | ||||
| #define IOF1_PWM1_MASK          _AC(0x00780000, UL) | ||||
| #define IOF1_PWM2_MASK          _AC(0x00003C00, UL) | ||||
|  | ||||
| // Interrupt numbers | ||||
| #define INT_RESERVED 0 | ||||
| #define INT_WDOGCMP 1 | ||||
| #define INT_RTCCMP 2 | ||||
| #define INT_UART0_BASE 3 | ||||
| #define INT_UART1_BASE 4 | ||||
| #define INT_SPI0_BASE 5 | ||||
| #define INT_SPI1_BASE 6 | ||||
| #define INT_SPI2_BASE 7 | ||||
| #define INT_GPIO_BASE 8 | ||||
| #define INT_PWM0_BASE 40 | ||||
| #define INT_PWM1_BASE 44 | ||||
| #define INT_PWM2_BASE 48 | ||||
|  | ||||
| // Helper functions | ||||
| #define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i))) | ||||
| #define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i))) | ||||
| #define AON_REG(offset) _REG32(AON_BASE_ADDR, offset) | ||||
| #define CLINT_REG(offset) _REG32(CLINT_BASE_ADDR, offset) | ||||
| #define GPIO_REG(offset) _REG32(GPIO_BASE_ADDR, offset) | ||||
| #define OTP_REG(offset)  _REG32(OTP_BASE_ADDR, offset) | ||||
| #define PLIC_REG(offset) _REG32(PLIC_BASE_ADDR, offset) | ||||
| #define PRCI_REG(offset) _REG32(PRCI_BASE_ADDR, offset) | ||||
| #define PWM0_REG(offset) _REG32(PWM0_BASE_ADDR, offset) | ||||
| #define PWM1_REG(offset) _REG32(PWM1_BASE_ADDR, offset) | ||||
| #define PWM2_REG(offset) _REG32(PWM2_BASE_ADDR, offset) | ||||
| #define SPI0_REG(offset) _REG32(SPI0_BASE_ADDR, offset) | ||||
| #define SPI1_REG(offset) _REG32(SPI1_BASE_ADDR, offset) | ||||
| #define SPI2_REG(offset) _REG32(SPI2_BASE_ADDR, offset) | ||||
| #define UART0_REG(offset) _REG32(UART0_BASE_ADDR, offset) | ||||
| #define UART1_REG(offset) _REG32(UART1_BASE_ADDR, offset) | ||||
|  | ||||
| // Misc | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| #define NUM_GPIO 32 | ||||
|  | ||||
| #define PLIC_NUM_INTERRUPTS 52 | ||||
| #define PLIC_NUM_PRIORITIES 7 | ||||
|  | ||||
| #include "hifive1.h" | ||||
|  | ||||
| unsigned long get_cpu_freq(void); | ||||
| unsigned long get_timer_freq(void); | ||||
| uint64_t get_timer_value(void); | ||||
|  | ||||
| #endif /* _SIFIVE_PLATFORM_H */ | ||||
							
								
								
									
										54
									
								
								hifive1-vp/hello/bsp/env/start.S
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										54
									
								
								hifive1-vp/hello/bsp/env/start.S
									
									
									
									
										vendored
									
									
								
							| @@ -1,54 +0,0 @@ | ||||
| // See LICENSE for license details. | ||||
|  | ||||
| 	.section .init | ||||
| 	.globl _start | ||||
| 	.type _start,@function | ||||
|  | ||||
| _start: | ||||
| 	la gp, _gp | ||||
| 	la sp, _sp | ||||
|  | ||||
| 	/* Load data section */ | ||||
| 	la a0, _data_lma | ||||
| 	la a1, _data | ||||
| 	la a2, _edata | ||||
| 	bgeu a1, a2, 2f | ||||
| 1: | ||||
| 	lw t0, (a0) | ||||
| 	sw t0, (a1) | ||||
| 	addi a0, a0, 4 | ||||
| 	addi a1, a1, 4 | ||||
| 	bltu a1, a2, 1b | ||||
| 2: | ||||
|  | ||||
| 	/* Clear bss section */ | ||||
| 	la a0, __bss_start | ||||
| 	la a1, _end | ||||
| 	bgeu a0, a1, 2f | ||||
| 1: | ||||
| 	sw zero, (a0) | ||||
| 	addi a0, a0, 4 | ||||
| 	bltu a0, a1, 1b | ||||
| 2: | ||||
|  | ||||
| 	/* Call global constructors */ | ||||
| 	la a0, __libc_fini_array | ||||
| 	call atexit | ||||
| 	call __libc_init_array | ||||
|  | ||||
| #ifndef __riscv_float_abi_soft | ||||
| 	/* Enable FPU */ | ||||
| 	li t0, MSTATUS_FS | ||||
| 	csrs mstatus, t0 | ||||
| 	csrr t1, mstatus | ||||
| 	and t1, t1, t0 | ||||
| 	beqz t1, 1f | ||||
| 	fssr x0 | ||||
| 1: | ||||
| #endif | ||||
|  | ||||
| 	/* argc = argv = 0 */ | ||||
| 	li a0, 0 | ||||
| 	li a1, 0 | ||||
| 	call main | ||||
| 	tail exit | ||||
| @@ -1,35 +0,0 @@ | ||||
| #ifndef _RISCV_BITS_H | ||||
| #define _RISCV_BITS_H | ||||
|  | ||||
| #define likely(x) __builtin_expect((x), 1) | ||||
| #define unlikely(x) __builtin_expect((x), 0) | ||||
|  | ||||
| #define ROUNDUP(a, b) ((((a)-1)/(b)+1)*(b)) | ||||
| #define ROUNDDOWN(a, b) ((a)/(b)*(b)) | ||||
|  | ||||
| #define MAX(a, b) ((a) > (b) ? (a) : (b)) | ||||
| #define MIN(a, b) ((a) < (b) ? (a) : (b)) | ||||
| #define CLAMP(a, lo, hi) MIN(MAX(a, lo), hi) | ||||
|  | ||||
| #define EXTRACT_FIELD(val, which) (((val) & (which)) / ((which) & ~((which)-1))) | ||||
| #define INSERT_FIELD(val, which, fieldval) (((val) & ~(which)) | ((fieldval) * ((which) & ~((which)-1)))) | ||||
|  | ||||
| #define STR(x) XSTR(x) | ||||
| #define XSTR(x) #x | ||||
|  | ||||
| #ifdef __riscv64 | ||||
| # define SLL32    sllw | ||||
| # define STORE    sd | ||||
| # define LOAD     ld | ||||
| # define LWU      lwu | ||||
| # define LOG_REGBYTES 3 | ||||
| #else | ||||
| # define SLL32    sll | ||||
| # define STORE    sw | ||||
| # define LOAD     lw | ||||
| # define LWU      lw | ||||
| # define LOG_REGBYTES 2 | ||||
| #endif | ||||
| #define REGBYTES (1 << LOG_REGBYTES) | ||||
|  | ||||
| #endif | ||||
| @@ -1,17 +0,0 @@ | ||||
| /* Derived from <linux/const.h> */ | ||||
|  | ||||
| #ifndef _SIFIVE_CONST_H | ||||
| #define _SIFIVE_CONST_H | ||||
|  | ||||
| #ifdef __ASSEMBLER__ | ||||
| #define _AC(X,Y)        X | ||||
| #define _AT(T,X)        X | ||||
| #else | ||||
| #define _AC(X,Y)        (X##Y) | ||||
| #define _AT(T,X)        ((T)(X)) | ||||
| #endif /* !__ASSEMBLER__*/ | ||||
|  | ||||
| #define _BITUL(x)       (_AC(1,UL) << (x)) | ||||
| #define _BITULL(x)      (_AC(1,ULL) << (x)) | ||||
|  | ||||
| #endif /* _SIFIVE_CONST_H */ | ||||
| @@ -1,88 +0,0 @@ | ||||
| // See LICENSE for license details. | ||||
|  | ||||
| #ifndef _SIFIVE_AON_H | ||||
| #define _SIFIVE_AON_H | ||||
|  | ||||
| /* Register offsets */ | ||||
|  | ||||
| #define AON_WDOGCFG     0x000 | ||||
| #define AON_WDOGCOUNT   0x008 | ||||
| #define AON_WDOGS       0x010 | ||||
| #define AON_WDOGFEED    0x018 | ||||
| #define AON_WDOGKEY     0x01C | ||||
| #define AON_WDOGCMP     0x020 | ||||
|  | ||||
| #define AON_RTCCFG      0x040 | ||||
| #define AON_RTCLO       0x048 | ||||
| #define AON_RTCHI       0x04C | ||||
| #define AON_RTCS        0x050 | ||||
| #define AON_RTCCMP      0x060 | ||||
|  | ||||
| #define AON_BACKUP0     0x080 | ||||
| #define AON_BACKUP1     0x084 | ||||
| #define AON_BACKUP2     0x088 | ||||
| #define AON_BACKUP3     0x08C | ||||
| #define AON_BACKUP4     0x090 | ||||
| #define AON_BACKUP5     0x094 | ||||
| #define AON_BACKUP6     0x098 | ||||
| #define AON_BACKUP7     0x09C | ||||
| #define AON_BACKUP8     0x0A0 | ||||
| #define AON_BACKUP9     0x0A4 | ||||
| #define AON_BACKUP10    0x0A8 | ||||
| #define AON_BACKUP11    0x0AC | ||||
| #define AON_BACKUP12    0x0B0 | ||||
| #define AON_BACKUP13    0x0B4 | ||||
| #define AON_BACKUP14    0x0B8 | ||||
| #define AON_BACKUP15    0x0BC | ||||
|  | ||||
| #define AON_PMUWAKEUPI0 0x100 | ||||
| #define AON_PMUWAKEUPI1 0x104 | ||||
| #define AON_PMUWAKEUPI2 0x108 | ||||
| #define AON_PMUWAKEUPI3 0x10C | ||||
| #define AON_PMUWAKEUPI4 0x110 | ||||
| #define AON_PMUWAKEUPI5 0x114 | ||||
| #define AON_PMUWAKEUPI6 0x118 | ||||
| #define AON_PMUWAKEUPI7 0x11C | ||||
| #define AON_PMUSLEEPI0  0x120 | ||||
| #define AON_PMUSLEEPI1  0x124 | ||||
| #define AON_PMUSLEEPI2  0x128 | ||||
| #define AON_PMUSLEEPI3  0x12C | ||||
| #define AON_PMUSLEEPI4  0x130 | ||||
| #define AON_PMUSLEEPI5  0x134 | ||||
| #define AON_PMUSLEEPI6  0x138 | ||||
| #define AON_PMUSLEEPI7  0x13C | ||||
| #define AON_PMUIE       0x140 | ||||
| #define AON_PMUCAUSE    0x144 | ||||
| #define AON_PMUSLEEP    0x148 | ||||
| #define AON_PMUKEY      0x14C | ||||
|  | ||||
| #define AON_LFROSC      0x070 | ||||
| /* Constants */ | ||||
|  | ||||
| #define AON_WDOGKEY_VALUE  0x51F15E | ||||
| #define AON_WDOGFEED_VALUE 0xD09F00D | ||||
|  | ||||
| #define AON_WDOGCFG_SCALE       0x0000000F | ||||
| #define AON_WDOGCFG_RSTEN       0x00000100 | ||||
| #define AON_WDOGCFG_ZEROCMP     0x00000200 | ||||
| #define AON_WDOGCFG_ENALWAYS    0x00001000 | ||||
| #define AON_WDOGCFG_ENCOREAWAKE 0x00002000 | ||||
| #define AON_WDOGCFG_CMPIP       0x10000000 | ||||
|  | ||||
| #define AON_RTCCFG_SCALE     0x0000000F | ||||
| #define AON_RTCCFG_ENALWAYS  0x00001000 | ||||
| #define AON_RTCCFG_CMPIP     0x10000000 | ||||
|  | ||||
| #define AON_WAKEUPCAUSE_RESET   0x00 | ||||
| #define AON_WAKEUPCAUSE_RTC     0x01 | ||||
| #define AON_WAKEUPCAUSE_DWAKEUP 0x02 | ||||
| #define AON_WAKEUPCAUSE_AWAKEUP 0x03 | ||||
|  | ||||
| #define AON_RESETCAUSE_POWERON  0x0000 | ||||
| #define AON_RESETCAUSE_EXTERNAL 0x0100 | ||||
| #define AON_RESETCAUSE_WATCHDOG 0x0200 | ||||
|  | ||||
| #define AON_PMUCAUSE_WAKEUPCAUSE 0x00FF | ||||
| #define AON_PMUCAUSE_RESETCAUSE  0xFF00 | ||||
|  | ||||
| #endif /* _SIFIVE_AON_H */ | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user