removes firmwares to just keep BSP
This commit is contained in:
parent
7728785e27
commit
1c600a0458
|
@ -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>
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit d5fad6bd094899101a4e5fd53af7298160ced6ab
|
|
|
@ -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
|
|
|
@ -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>
|
|
|
@ -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 ' '
|
|
||||||
|
|
||||||
|
|
|
@ -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 ' '
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
|
@ -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
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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()
|
|
||||||
{
|
|
||||||
}
|
|
|
@ -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 */
|
|
|
@ -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 */
|
|
|
@ -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 */
|
|
|
@ -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,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
|
|
||||||
}
|
|
|
@ -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 */
|
|
|
@ -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
Loading…
Reference in New Issue