Compare commits
17
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
619be720d3 | ||
|
|
4c86ddd9fb | ||
|
|
abfde888fb | ||
|
|
b082091db2 | ||
|
|
eeb17437ee | ||
|
|
cffa693e29 | ||
|
|
9c0047b3ea | ||
|
|
ca1adccb2b | ||
|
|
3217871752 | ||
|
|
9dd7dcb4ce | ||
|
|
3403edcde9 | ||
|
|
3a3cbf38c3 | ||
|
|
822696ae0d | ||
|
|
314ceeb072 | ||
|
|
4c2208c1ac | ||
|
|
36a6de6dc0 | ||
|
|
d2cb78724a |
No files matched your search
@@ -0,0 +1,7 @@
|
|||||||
|
[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
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
if (NOT DEFINED BOARD)
|
||||||
|
set(BOARD iss)
|
||||||
|
endif()
|
||||||
|
if (NOT DEFINED ISA)
|
||||||
|
set(ISA imc)
|
||||||
|
endif()
|
||||||
|
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})
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1 @@
|
|||||||
|
/*.o
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/*.o
|
||||||
Vendored
+121
@@ -0,0 +1,121 @@
|
|||||||
|
#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)
|
||||||
|
{
|
||||||
|
unsigned long ret;
|
||||||
|
__asm volatile("rdtime %0":"=r"(ret));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if __riscv_xlen==32
|
||||||
|
|
||||||
|
static uint32_t mtime_hi(void)
|
||||||
|
{
|
||||||
|
unsigned long ret;
|
||||||
|
__asm volatile("rdtimeh %0":"=r"(ret));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif __riscv_xlen==64
|
||||||
|
|
||||||
|
uint64_t get_timer_value()
|
||||||
|
{
|
||||||
|
return mtime_lo();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
unsigned long get_timer_freq()
|
||||||
|
{
|
||||||
|
return 32768;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long get_cpu_freq()
|
||||||
|
{
|
||||||
|
return 10000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_pll(void){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#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 {
|
||||||
|
char* result = "trap 0\n";
|
||||||
|
result[5]=(mcause&0xff)+'0';
|
||||||
|
//write(1, "trap\n", 5);
|
||||||
|
write(1, result, 7);
|
||||||
|
_exit(1 + mcause);
|
||||||
|
}
|
||||||
|
return epc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _init()
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifndef NO_INIT
|
||||||
|
init_pll();
|
||||||
|
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()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int is_uart_ready(int uart_id){
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
int try_write_uart_char(int uart_id, char c){
|
||||||
|
*((char*)0x10000000) = c;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
void write_uart_char(int uart_id, char c){
|
||||||
|
*((char*)0x10000000) = c;
|
||||||
|
}
|
||||||
+10
-3
@@ -4,8 +4,8 @@ ENTRY( _start )
|
|||||||
|
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M
|
flash (rxai!w) : ORIGIN = 0x00000000, LENGTH = 256M
|
||||||
ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K
|
ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 1M
|
||||||
}
|
}
|
||||||
|
|
||||||
PHDRS
|
PHDRS
|
||||||
@@ -19,7 +19,7 @@ SECTIONS
|
|||||||
{
|
{
|
||||||
__stack_size = DEFINED(__stack_size) ? __stack_size : 2K;
|
__stack_size = DEFINED(__stack_size) ? __stack_size : 2K;
|
||||||
|
|
||||||
.init :
|
.init ORIGIN(flash) :
|
||||||
{
|
{
|
||||||
KEEP (*(SORT_NONE(.init)))
|
KEEP (*(SORT_NONE(.init)))
|
||||||
} >flash AT>flash :flash
|
} >flash AT>flash :flash
|
||||||
@@ -118,6 +118,7 @@ SECTIONS
|
|||||||
|
|
||||||
.data :
|
.data :
|
||||||
{
|
{
|
||||||
|
__DATA_BEGIN__ = .;
|
||||||
*(.data .data.*)
|
*(.data .data.*)
|
||||||
*(.gnu.linkonce.d.*)
|
*(.gnu.linkonce.d.*)
|
||||||
} >ram AT>flash :ram_init
|
} >ram AT>flash :ram_init
|
||||||
@@ -134,6 +135,7 @@ SECTIONS
|
|||||||
|
|
||||||
.sdata :
|
.sdata :
|
||||||
{
|
{
|
||||||
|
__SDATA_BEGIN__ = .;
|
||||||
*(.sdata .sdata.*)
|
*(.sdata .sdata.*)
|
||||||
*(.gnu.linkonce.s.*)
|
*(.gnu.linkonce.s.*)
|
||||||
} >ram AT>flash :ram_init
|
} >ram AT>flash :ram_init
|
||||||
@@ -155,6 +157,8 @@ SECTIONS
|
|||||||
} >ram AT>ram :ram
|
} >ram AT>ram :ram
|
||||||
|
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
|
__BSS_END__ = .;
|
||||||
|
__global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800, MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800));
|
||||||
PROVIDE( _end = . );
|
PROVIDE( _end = . );
|
||||||
PROVIDE( end = . );
|
PROVIDE( end = . );
|
||||||
|
|
||||||
@@ -164,4 +168,7 @@ SECTIONS
|
|||||||
. = __stack_size;
|
. = __stack_size;
|
||||||
PROVIDE( _sp = . );
|
PROVIDE( _sp = . );
|
||||||
} >ram AT>ram :ram
|
} >ram AT>ram :ram
|
||||||
|
|
||||||
|
PROVIDE( tohost = 0xfffffff0 );
|
||||||
|
PROVIDE( fromhost = 0xfffffff8 );
|
||||||
}
|
}
|
||||||
Vendored
+32
@@ -0,0 +1,32 @@
|
|||||||
|
// See LICENSE for license details.
|
||||||
|
|
||||||
|
#ifndef _ISS_PLATFORM_H
|
||||||
|
#define _ISS_PLATFORM_H
|
||||||
|
|
||||||
|
// Some things missing from the official encoding.h
|
||||||
|
#define MCAUSE_INT 0x80000000
|
||||||
|
#define MCAUSE_CAUSE 0x7FFFFFFF
|
||||||
|
|
||||||
|
#include "rtl/const.h"
|
||||||
|
/****************************************************************************
|
||||||
|
* Platform definitions
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#define MEM_BASE_ADDR _AC(0x00000000,UL)
|
||||||
|
|
||||||
|
// Helper functions
|
||||||
|
#define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i)))
|
||||||
|
#define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i)))
|
||||||
|
|
||||||
|
// Misc
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
void init_pll(void);
|
||||||
|
unsigned long get_cpu_freq(void);
|
||||||
|
unsigned long get_timer_freq(void);
|
||||||
|
uint64_t get_timer_value(void);
|
||||||
|
int is_uart_ready(int uart_id);
|
||||||
|
int try_write_uart_char(int uart_id, char);
|
||||||
|
void write_uart_char(int uart_id, char);
|
||||||
|
#endif /* _ISS_PLATFORM_H */
|
||||||
@@ -22,7 +22,7 @@ INCLUDES += -I$(BSP_BASE)/drivers/
|
|||||||
INCLUDES += -I$(ENV_DIR)
|
INCLUDES += -I$(ENV_DIR)
|
||||||
INCLUDES += -I$(PLATFORM_DIR)
|
INCLUDES += -I$(PLATFORM_DIR)
|
||||||
|
|
||||||
TOOL_DIR ?= $(BSP_BASE)/../toolchain/bin
|
TOOL_DIR ?= $(BSP_BASE)/../toolchain/bin/
|
||||||
|
|
||||||
LDFLAGS += -T $(LINKER_SCRIPT) -nostartfiles
|
LDFLAGS += -T $(LINKER_SCRIPT) -nostartfiles
|
||||||
LDFLAGS += -L$(ENV_DIR) --specs=nano.specs
|
LDFLAGS += -L$(ENV_DIR) --specs=nano.specs
|
||||||
@@ -40,15 +40,17 @@ CFLAGS += -march=$(RISCV_ARCH)
|
|||||||
CFLAGS += -mabi=$(RISCV_ABI)
|
CFLAGS += -mabi=$(RISCV_ABI)
|
||||||
CFLAGS += -mcmodel=medany
|
CFLAGS += -mcmodel=medany
|
||||||
|
|
||||||
TRIPLET?=riscv64-unknown-elf
|
TRIPLET?=riscv32
|
||||||
CXX=$(TOOL_DIR)/$(TRIPLET)-c++
|
CXX=$(LLVM_TOOL_DIR)clang++ --target=$(TRIPLET) -isystem $(TOOL_DIR)/../$(TRIPLET)/include
|
||||||
CC=$(TOOL_DIR)/$(TRIPLET)-gcc
|
CC=$(LLVM_TOOL_DIR)clang --target=$(TRIPLET) -isystem $(TOOL_DIR)/../$(TRIPLET)/include
|
||||||
LD=$(TOOL_DIR)/$(TRIPLET)-gcc
|
LD=$(TOOL_DIR)$(TRIPLET)-gcc
|
||||||
AR=$(TOOL_DIR)/$(TRIPLET)-ar
|
AR=$(TOOL_DIR)$(TRIPLET)-ar
|
||||||
|
OBJDUMP := $(TOOL_DIR)/$(TRIPLET)-objdump
|
||||||
|
|
||||||
|
|
||||||
$(TARGET): $(LINK_OBJS) $(LINK_DEPS)
|
$(TARGET): $(LINK_OBJS) $(LINK_DEPS)
|
||||||
$(LD) $(LINK_OBJS) $(LDFLAGS) $(LIBWRAP) -o $@
|
$(LD) $(LINK_OBJS) $(LDFLAGS) $(LIBWRAP) -o $@
|
||||||
|
$(OBJDUMP) -d -S $(TARGET) > $(TARGET).dis
|
||||||
|
|
||||||
$(ASM_OBJS): %.o: %.S $(HEADERS)
|
$(ASM_OBJS): %.o: %.S $(HEADERS)
|
||||||
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $<
|
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $<
|
||||||
@@ -61,6 +63,10 @@ $(CXX_OBJS): %.o: %.cpp $(HEADERS)
|
|||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
|
rm -f $(TARGET) $(LINK_OBJS)
|
||||||
|
|
||||||
|
.PHONY: clean-all
|
||||||
|
clean-all:
|
||||||
rm -f $(CLEAN_OBJS) $(LIBWRAP)
|
rm -f $(CLEAN_OBJS) $(LIBWRAP)
|
||||||
|
|
||||||
endif # _SIFIVE_MK_COMMON
|
endif
|
||||||
+22
-14
@@ -1,13 +1,12 @@
|
|||||||
# See LICENSE for license details.
|
ifndef _MK_COMMON
|
||||||
|
_MK_COMMON := # defined
|
||||||
ifndef _SIFIVE_MK_COMMON
|
|
||||||
_SIFIVE_MK_COMMON := # defined
|
|
||||||
|
|
||||||
.PHONY: all
|
.PHONY: all
|
||||||
all: $(TARGET)
|
all: $(TARGET)
|
||||||
|
|
||||||
include $(BSP_BASE)/libwrap/libwrap.mk
|
include $(BSP_BASE)/libwrap/libwrap.mk
|
||||||
|
|
||||||
|
BOARD?=iss
|
||||||
ENV_DIR = $(BSP_BASE)/env
|
ENV_DIR = $(BSP_BASE)/env
|
||||||
PLATFORM_DIR = $(ENV_DIR)/$(BOARD)
|
PLATFORM_DIR = $(ENV_DIR)/$(BOARD)
|
||||||
|
|
||||||
@@ -22,10 +21,12 @@ INCLUDES += -I$(BSP_BASE)/drivers/
|
|||||||
INCLUDES += -I$(ENV_DIR)
|
INCLUDES += -I$(ENV_DIR)
|
||||||
INCLUDES += -I$(PLATFORM_DIR)
|
INCLUDES += -I$(PLATFORM_DIR)
|
||||||
|
|
||||||
TOOL_DIR ?= $(BSP_BASE)/../toolchain/bin
|
TOOL_DIR ?= $(BSP_BASE)/../toolchain/bin/
|
||||||
|
|
||||||
LDFLAGS += -T $(LINKER_SCRIPT) -nostartfiles
|
LDFLAGS += -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI)
|
||||||
LDFLAGS += -L$(ENV_DIR) --specs=nano.specs
|
LDFLAGS += -T $(LINKER_SCRIPT) -Wl,-Map=$(TARGET).map -nostartfiles
|
||||||
|
LDFLAGS += -L$(ENV_DIR)
|
||||||
|
# --specs=nano.specs
|
||||||
|
|
||||||
ASM_OBJS := $(ASM_SRCS:.S=.o)
|
ASM_OBJS := $(ASM_SRCS:.S=.o)
|
||||||
C_OBJS := $(C_SRCS:.c=.o)
|
C_OBJS := $(C_SRCS:.c=.o)
|
||||||
@@ -36,19 +37,26 @@ LINK_DEPS += $(LINKER_SCRIPT)
|
|||||||
|
|
||||||
CLEAN_OBJS += $(TARGET) $(LINK_OBJS)
|
CLEAN_OBJS += $(TARGET) $(LINK_OBJS)
|
||||||
|
|
||||||
CFLAGS += -march=$(RISCV_ARCH)
|
GCCVERSION = $(shell $(CC) --version | grep gcc | awk '{print($NF);}')
|
||||||
|
ifeq ($(GCCVERSION),9.2)
|
||||||
|
CFLAGS += -march=$(RISCV_ARCH)
|
||||||
|
else
|
||||||
|
CFLAGS += -march=$(RISCV_ARCH)_zicsr_zifencei
|
||||||
|
endif
|
||||||
CFLAGS += -mabi=$(RISCV_ABI)
|
CFLAGS += -mabi=$(RISCV_ABI)
|
||||||
CFLAGS += -mcmodel=medany
|
CFLAGS += -mcmodel=medany
|
||||||
|
|
||||||
TRIPLET?=riscv64-unknown-elf
|
TRIPLET?=riscv64-unknown-elf
|
||||||
CXX=$(TOOL_DIR)/$(TRIPLET)-c++
|
CXX=$(TOOL_DIR)$(TRIPLET)-c++
|
||||||
CC=$(TOOL_DIR)/$(TRIPLET)-gcc
|
CC=$(TOOL_DIR)$(TRIPLET)-gcc
|
||||||
LD=$(TOOL_DIR)/$(TRIPLET)-gcc
|
LD=$(TOOL_DIR)$(TRIPLET)-gcc
|
||||||
AR=$(TOOL_DIR)/$(TRIPLET)-ar
|
AR=$(TOOL_DIR)$(TRIPLET)-ar
|
||||||
|
OBJDUMP := $(TOOL_DIR)$(TRIPLET)-objdump
|
||||||
|
|
||||||
|
|
||||||
$(TARGET): $(LINK_OBJS) $(LINK_DEPS)
|
$(TARGET): $(LINK_OBJS) $(LINK_DEPS)
|
||||||
$(LD) $(LINK_OBJS) $(LDFLAGS) $(LIBWRAP) -o $@
|
$(LD) $(LINK_OBJS) $(LDFLAGS) -o $@
|
||||||
|
$(OBJDUMP) -d -S $(TARGET) > $(TARGET).dis
|
||||||
|
|
||||||
$(ASM_OBJS): %.o: %.S $(HEADERS)
|
$(ASM_OBJS): %.o: %.S $(HEADERS)
|
||||||
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $<
|
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $<
|
||||||
@@ -63,4 +71,4 @@ $(CXX_OBJS): %.o: %.cpp $(HEADERS)
|
|||||||
clean:
|
clean:
|
||||||
rm -f $(CLEAN_OBJS) $(LIBWRAP)
|
rm -f $(CLEAN_OBJS) $(LIBWRAP)
|
||||||
|
|
||||||
endif # _SIFIVE_MK_COMMON
|
endif
|
||||||
File renamed without changes.
+5
-3
@@ -4,7 +4,7 @@
|
|||||||
#define ENTRY_S
|
#define ENTRY_S
|
||||||
|
|
||||||
#include "encoding.h"
|
#include "encoding.h"
|
||||||
#include "sifive/bits.h"
|
#include "rtl/bits.h"
|
||||||
|
|
||||||
.section .text.entry
|
.section .text.entry
|
||||||
.align 2
|
.align 2
|
||||||
@@ -27,6 +27,7 @@ trap_entry:
|
|||||||
STORE x13, 13*REGBYTES(sp)
|
STORE x13, 13*REGBYTES(sp)
|
||||||
STORE x14, 14*REGBYTES(sp)
|
STORE x14, 14*REGBYTES(sp)
|
||||||
STORE x15, 15*REGBYTES(sp)
|
STORE x15, 15*REGBYTES(sp)
|
||||||
|
#ifndef __riscv_abi_rve
|
||||||
STORE x16, 16*REGBYTES(sp)
|
STORE x16, 16*REGBYTES(sp)
|
||||||
STORE x17, 17*REGBYTES(sp)
|
STORE x17, 17*REGBYTES(sp)
|
||||||
STORE x18, 18*REGBYTES(sp)
|
STORE x18, 18*REGBYTES(sp)
|
||||||
@@ -43,7 +44,7 @@ trap_entry:
|
|||||||
STORE x29, 29*REGBYTES(sp)
|
STORE x29, 29*REGBYTES(sp)
|
||||||
STORE x30, 30*REGBYTES(sp)
|
STORE x30, 30*REGBYTES(sp)
|
||||||
STORE x31, 31*REGBYTES(sp)
|
STORE x31, 31*REGBYTES(sp)
|
||||||
|
#endif
|
||||||
csrr a0, mcause
|
csrr a0, mcause
|
||||||
csrr a1, mepc
|
csrr a1, mepc
|
||||||
mv a2, sp
|
mv a2, sp
|
||||||
@@ -69,6 +70,7 @@ trap_entry:
|
|||||||
LOAD x13, 13*REGBYTES(sp)
|
LOAD x13, 13*REGBYTES(sp)
|
||||||
LOAD x14, 14*REGBYTES(sp)
|
LOAD x14, 14*REGBYTES(sp)
|
||||||
LOAD x15, 15*REGBYTES(sp)
|
LOAD x15, 15*REGBYTES(sp)
|
||||||
|
#ifndef __riscv_abi_rve
|
||||||
LOAD x16, 16*REGBYTES(sp)
|
LOAD x16, 16*REGBYTES(sp)
|
||||||
LOAD x17, 17*REGBYTES(sp)
|
LOAD x17, 17*REGBYTES(sp)
|
||||||
LOAD x18, 18*REGBYTES(sp)
|
LOAD x18, 18*REGBYTES(sp)
|
||||||
@@ -85,7 +87,7 @@ trap_entry:
|
|||||||
LOAD x29, 29*REGBYTES(sp)
|
LOAD x29, 29*REGBYTES(sp)
|
||||||
LOAD x30, 30*REGBYTES(sp)
|
LOAD x30, 30*REGBYTES(sp)
|
||||||
LOAD x31, 31*REGBYTES(sp)
|
LOAD x31, 31*REGBYTES(sp)
|
||||||
|
#endif
|
||||||
addi sp, sp, 32*REGBYTES
|
addi sp, sp, 32*REGBYTES
|
||||||
mret
|
mret
|
||||||
|
|
||||||
File renamed without changes.
Vendored
File renamed without changes.
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "platform.h"
|
#include "../hifive1/platform.h"
|
||||||
#include "encoding.h"
|
#include "encoding.h"
|
||||||
|
|
||||||
extern int main(int argc, char** argv);
|
extern int main(int argc, char** argv);
|
||||||
+4
-1
@@ -5,7 +5,7 @@ ENTRY( _start )
|
|||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M
|
flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M
|
||||||
ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 512K
|
ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 1M
|
||||||
}
|
}
|
||||||
|
|
||||||
PHDRS
|
PHDRS
|
||||||
@@ -163,4 +163,7 @@ SECTIONS
|
|||||||
. = __stack_size;
|
. = __stack_size;
|
||||||
PROVIDE( _sp = . );
|
PROVIDE( _sp = . );
|
||||||
} >ram AT>ram :ram
|
} >ram AT>ram :ram
|
||||||
|
|
||||||
|
PROVIDE( tohost = 0xfffffff0 );
|
||||||
|
PROVIDE( fromhost = 0xfffffff8 );
|
||||||
}
|
}
|
||||||
Vendored
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1 @@
|
|||||||
|
/*.o
|
||||||
+42
-22
@@ -1,4 +1,3 @@
|
|||||||
//See LICENSE for license details.
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@@ -9,38 +8,55 @@
|
|||||||
extern int main(int argc, char** argv);
|
extern int main(int argc, char** argv);
|
||||||
extern void trap_entry();
|
extern void trap_entry();
|
||||||
|
|
||||||
static unsigned long get_cpu_freq()
|
static unsigned long mtime_lo(void)
|
||||||
{
|
{
|
||||||
return 65000000;
|
unsigned long ret;
|
||||||
|
__asm volatile("rdtime %0":"=r"(ret));
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long get_timer_freq()
|
|
||||||
|
#if __riscv_xlen==32
|
||||||
|
|
||||||
|
static uint32_t mtime_hi(void)
|
||||||
{
|
{
|
||||||
return get_cpu_freq();
|
unsigned long ret;
|
||||||
|
__asm volatile("rdtimeh %0":"=r"(ret));
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t get_timer_value()
|
uint64_t get_timer_value()
|
||||||
{
|
{
|
||||||
#if __riscv_xlen == 32
|
|
||||||
while (1) {
|
while (1) {
|
||||||
uint32_t hi = read_csr(mcycleh);
|
uint32_t hi = mtime_hi();
|
||||||
uint32_t lo = read_csr(mcycle);
|
uint32_t lo = mtime_lo();
|
||||||
if (hi == read_csr(mcycleh))
|
if (hi == mtime_hi())
|
||||||
return ((uint64_t)hi << 32) | lo;
|
return ((uint64_t)hi << 32) | lo;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
return read_csr(mcycle);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void uart_init(size_t baud_rate)
|
#elif __riscv_xlen==64
|
||||||
|
|
||||||
|
uint64_t get_timer_value()
|
||||||
{
|
{
|
||||||
GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK;
|
return mtime_lo();
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
unsigned long get_timer_freq()
|
||||||
|
{
|
||||||
|
return 32768;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long get_cpu_freq()
|
||||||
|
{
|
||||||
|
return 10000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_pll(void){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef USE_PLIC
|
#ifdef USE_PLIC
|
||||||
extern void handle_m_ext_interrupt();
|
extern void handle_m_ext_interrupt();
|
||||||
@@ -65,7 +81,7 @@ uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
write(1, "Unhandled Trap:\n", 16);
|
write(1, "trap\n", 5);
|
||||||
_exit(1 + mcause);
|
_exit(1 + mcause);
|
||||||
}
|
}
|
||||||
return epc;
|
return epc;
|
||||||
@@ -73,13 +89,17 @@ uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc)
|
|||||||
|
|
||||||
void _init()
|
void _init()
|
||||||
{
|
{
|
||||||
#ifndef NO_INIT
|
|
||||||
uart_init(115200);
|
|
||||||
|
|
||||||
|
#ifndef NO_INIT
|
||||||
|
init_pll();
|
||||||
printf("core freq at %d Hz\n", get_cpu_freq());
|
printf("core freq at %d Hz\n", get_cpu_freq());
|
||||||
|
|
||||||
write_csr(mtvec, &trap_entry);
|
write_csr(mtvec, &trap_entry);
|
||||||
#endif
|
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()
|
void _fini()
|
||||||
+10
-3
@@ -4,8 +4,8 @@ ENTRY( _start )
|
|||||||
|
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M
|
flash (rxai!w) : ORIGIN = 0x00000020, LENGTH = 1M
|
||||||
ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K
|
ram (wxa!ri) : ORIGIN = 0x10000000, LENGTH = 16K
|
||||||
}
|
}
|
||||||
|
|
||||||
PHDRS
|
PHDRS
|
||||||
@@ -19,7 +19,7 @@ SECTIONS
|
|||||||
{
|
{
|
||||||
__stack_size = DEFINED(__stack_size) ? __stack_size : 2K;
|
__stack_size = DEFINED(__stack_size) ? __stack_size : 2K;
|
||||||
|
|
||||||
.init :
|
.init ORIGIN(flash) :
|
||||||
{
|
{
|
||||||
KEEP (*(SORT_NONE(.init)))
|
KEEP (*(SORT_NONE(.init)))
|
||||||
} >flash AT>flash :flash
|
} >flash AT>flash :flash
|
||||||
@@ -118,6 +118,7 @@ SECTIONS
|
|||||||
|
|
||||||
.data :
|
.data :
|
||||||
{
|
{
|
||||||
|
__DATA_BEGIN__ = .;
|
||||||
*(.data .data.*)
|
*(.data .data.*)
|
||||||
*(.gnu.linkonce.d.*)
|
*(.gnu.linkonce.d.*)
|
||||||
} >ram AT>flash :ram_init
|
} >ram AT>flash :ram_init
|
||||||
@@ -134,6 +135,7 @@ SECTIONS
|
|||||||
|
|
||||||
.sdata :
|
.sdata :
|
||||||
{
|
{
|
||||||
|
__SDATA_BEGIN__ = .;
|
||||||
*(.sdata .sdata.*)
|
*(.sdata .sdata.*)
|
||||||
*(.gnu.linkonce.s.*)
|
*(.gnu.linkonce.s.*)
|
||||||
} >ram AT>flash :ram_init
|
} >ram AT>flash :ram_init
|
||||||
@@ -155,6 +157,8 @@ SECTIONS
|
|||||||
} >ram AT>ram :ram
|
} >ram AT>ram :ram
|
||||||
|
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
|
__BSS_END__ = .;
|
||||||
|
__global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800, MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800));
|
||||||
PROVIDE( _end = . );
|
PROVIDE( _end = . );
|
||||||
PROVIDE( end = . );
|
PROVIDE( end = . );
|
||||||
|
|
||||||
@@ -164,4 +168,7 @@ SECTIONS
|
|||||||
. = __stack_size;
|
. = __stack_size;
|
||||||
PROVIDE( _sp = . );
|
PROVIDE( _sp = . );
|
||||||
} >ram AT>ram :ram
|
} >ram AT>ram :ram
|
||||||
|
|
||||||
|
PROVIDE( tohost = 0xfffffff0 );
|
||||||
|
PROVIDE( fromhost = 0xfffffff8 );
|
||||||
}
|
}
|
||||||
Vendored
+31
@@ -0,0 +1,31 @@
|
|||||||
|
// See LICENSE for license details.
|
||||||
|
|
||||||
|
#ifndef _ISS_PLATFORM_H
|
||||||
|
#define _ISS_PLATFORM_H
|
||||||
|
|
||||||
|
// Some things missing from the official encoding.h
|
||||||
|
#define MCAUSE_INT 0x80000000
|
||||||
|
#define MCAUSE_CAUSE 0x7FFFFFFF
|
||||||
|
#define USE_TOHOST 1
|
||||||
|
|
||||||
|
#include "rtl/const.h"
|
||||||
|
/****************************************************************************
|
||||||
|
* Platform definitions
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#define MEM_BASE_ADDR _AC(0x00000000,UL)
|
||||||
|
|
||||||
|
// Helper functions
|
||||||
|
#define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i)))
|
||||||
|
#define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i)))
|
||||||
|
|
||||||
|
// Misc
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
void init_pll(void);
|
||||||
|
unsigned long get_cpu_freq(void);
|
||||||
|
unsigned long get_timer_freq(void);
|
||||||
|
uint64_t get_timer_value(void);
|
||||||
|
|
||||||
|
#endif /* _ISS_PLATFORM_H */
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/*.o
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
//See LICENSE for license details.
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@@ -9,38 +8,55 @@
|
|||||||
extern int main(int argc, char** argv);
|
extern int main(int argc, char** argv);
|
||||||
extern void trap_entry();
|
extern void trap_entry();
|
||||||
|
|
||||||
static unsigned long get_cpu_freq()
|
static unsigned long mtime_lo(void)
|
||||||
{
|
{
|
||||||
return 65000000;
|
unsigned long ret;
|
||||||
|
__asm volatile("rdtime %0":"=r"(ret));
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long get_timer_freq()
|
|
||||||
|
#if __riscv_xlen==32
|
||||||
|
|
||||||
|
static uint32_t mtime_hi(void)
|
||||||
{
|
{
|
||||||
return get_cpu_freq();
|
unsigned long ret;
|
||||||
|
__asm volatile("rdtimeh %0":"=r"(ret));
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t get_timer_value()
|
uint64_t get_timer_value()
|
||||||
{
|
{
|
||||||
#if __riscv_xlen == 32
|
|
||||||
while (1) {
|
while (1) {
|
||||||
uint32_t hi = read_csr(mcycleh);
|
uint32_t hi = mtime_hi();
|
||||||
uint32_t lo = read_csr(mcycle);
|
uint32_t lo = mtime_lo();
|
||||||
if (hi == read_csr(mcycleh))
|
if (hi == mtime_hi())
|
||||||
return ((uint64_t)hi << 32) | lo;
|
return ((uint64_t)hi << 32) | lo;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
return read_csr(mcycle);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void uart_init(size_t baud_rate)
|
#elif __riscv_xlen==64
|
||||||
|
|
||||||
|
uint64_t get_timer_value()
|
||||||
{
|
{
|
||||||
GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK;
|
return mtime_lo();
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
unsigned long get_timer_freq()
|
||||||
|
{
|
||||||
|
return 32768;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long get_cpu_freq()
|
||||||
|
{
|
||||||
|
return 10000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_pll(void){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef USE_PLIC
|
#ifdef USE_PLIC
|
||||||
extern void handle_m_ext_interrupt();
|
extern void handle_m_ext_interrupt();
|
||||||
@@ -65,7 +81,7 @@ uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
write(1, "Unhandled Trap:\n", 16);
|
write(1, "trap\n", 5);
|
||||||
_exit(1 + mcause);
|
_exit(1 + mcause);
|
||||||
}
|
}
|
||||||
return epc;
|
return epc;
|
||||||
@@ -73,13 +89,17 @@ uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc)
|
|||||||
|
|
||||||
void _init()
|
void _init()
|
||||||
{
|
{
|
||||||
#ifndef NO_INIT
|
|
||||||
uart_init(115200);
|
|
||||||
|
|
||||||
|
#ifndef NO_INIT
|
||||||
|
init_pll();
|
||||||
printf("core freq at %d Hz\n", get_cpu_freq());
|
printf("core freq at %d Hz\n", get_cpu_freq());
|
||||||
|
|
||||||
write_csr(mtvec, &trap_entry);
|
write_csr(mtvec, &trap_entry);
|
||||||
#endif
|
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()
|
void _fini()
|
||||||
@@ -4,9 +4,8 @@ ENTRY( _start )
|
|||||||
|
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
/*flash (rxai!w) : ORIGIN = 0x00000000, LENGTH = 1M*/
|
flash (rxai!w) : ORIGIN = 0x00000000, LENGTH = 1M
|
||||||
flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M
|
ram (wxa!ri) : ORIGIN = 0x10000000, LENGTH = 16K
|
||||||
ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PHDRS
|
PHDRS
|
||||||
@@ -20,7 +19,7 @@ SECTIONS
|
|||||||
{
|
{
|
||||||
__stack_size = DEFINED(__stack_size) ? __stack_size : 2K;
|
__stack_size = DEFINED(__stack_size) ? __stack_size : 2K;
|
||||||
|
|
||||||
.init :
|
.init ORIGIN(flash) :
|
||||||
{
|
{
|
||||||
KEEP (*(SORT_NONE(.init)))
|
KEEP (*(SORT_NONE(.init)))
|
||||||
} >flash AT>flash :flash
|
} >flash AT>flash :flash
|
||||||
@@ -119,6 +118,7 @@ SECTIONS
|
|||||||
|
|
||||||
.data :
|
.data :
|
||||||
{
|
{
|
||||||
|
__DATA_BEGIN__ = .;
|
||||||
*(.data .data.*)
|
*(.data .data.*)
|
||||||
*(.gnu.linkonce.d.*)
|
*(.gnu.linkonce.d.*)
|
||||||
} >ram AT>flash :ram_init
|
} >ram AT>flash :ram_init
|
||||||
@@ -135,6 +135,7 @@ SECTIONS
|
|||||||
|
|
||||||
.sdata :
|
.sdata :
|
||||||
{
|
{
|
||||||
|
__SDATA_BEGIN__ = .;
|
||||||
*(.sdata .sdata.*)
|
*(.sdata .sdata.*)
|
||||||
*(.gnu.linkonce.s.*)
|
*(.gnu.linkonce.s.*)
|
||||||
} >ram AT>flash :ram_init
|
} >ram AT>flash :ram_init
|
||||||
@@ -156,6 +157,8 @@ SECTIONS
|
|||||||
} >ram AT>ram :ram
|
} >ram AT>ram :ram
|
||||||
|
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
|
__BSS_END__ = .;
|
||||||
|
__global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800, MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800));
|
||||||
PROVIDE( _end = . );
|
PROVIDE( _end = . );
|
||||||
PROVIDE( end = . );
|
PROVIDE( end = . );
|
||||||
|
|
||||||
@@ -165,4 +168,8 @@ SECTIONS
|
|||||||
. = __stack_size;
|
. = __stack_size;
|
||||||
PROVIDE( _sp = . );
|
PROVIDE( _sp = . );
|
||||||
} >ram AT>ram :ram
|
} >ram AT>ram :ram
|
||||||
|
|
||||||
|
#PROVIDE( tohost = 0x00018000 );
|
||||||
|
PROVIDE( tohost = 0xfffffff0 );
|
||||||
|
PROVIDE( fromhost = 0xfffffff8 );
|
||||||
}
|
}
|
||||||
Vendored
+30
@@ -0,0 +1,30 @@
|
|||||||
|
// See LICENSE for license details.
|
||||||
|
|
||||||
|
#ifndef _ISS_PLATFORM_H
|
||||||
|
#define _ISS_PLATFORM_H
|
||||||
|
|
||||||
|
// Some things missing from the official encoding.h
|
||||||
|
#define MCAUSE_INT 0x80000000
|
||||||
|
#define MCAUSE_CAUSE 0x7FFFFFFF
|
||||||
|
|
||||||
|
#include "rtl/const.h"
|
||||||
|
/****************************************************************************
|
||||||
|
* Platform definitions
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#define MEM_BASE_ADDR _AC(0x00000000,UL)
|
||||||
|
|
||||||
|
// Helper functions
|
||||||
|
#define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i)))
|
||||||
|
#define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i)))
|
||||||
|
|
||||||
|
// Misc
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
void init_pll(void);
|
||||||
|
unsigned long get_cpu_freq(void);
|
||||||
|
unsigned long get_timer_freq(void);
|
||||||
|
uint64_t get_timer_value(void);
|
||||||
|
|
||||||
|
#endif /* _ISS_PLATFORM_H */
|
||||||
+10
-4
@@ -5,7 +5,12 @@
|
|||||||
.type _start,@function
|
.type _start,@function
|
||||||
|
|
||||||
_start:
|
_start:
|
||||||
la gp, _gp
|
la gp, trap_entry
|
||||||
|
csrw mtvec, gp
|
||||||
|
.option push
|
||||||
|
.option norelax
|
||||||
|
la gp, __global_pointer$
|
||||||
|
.option pop
|
||||||
la sp, _sp
|
la sp, _sp
|
||||||
|
|
||||||
/* Load data section */
|
/* Load data section */
|
||||||
@@ -15,8 +20,8 @@ _start:
|
|||||||
bgeu a1, a2, 2f
|
bgeu a1, a2, 2f
|
||||||
1:
|
1:
|
||||||
lw t0, (a0)
|
lw t0, (a0)
|
||||||
sw t0, (a1)
|
|
||||||
addi a0, a0, 4
|
addi a0, a0, 4
|
||||||
|
sw t0, (a1)
|
||||||
addi a1, a1, 4
|
addi a1, a1, 4
|
||||||
bltu a1, a2, 1b
|
bltu a1, a2, 1b
|
||||||
2:
|
2:
|
||||||
@@ -32,10 +37,11 @@ _start:
|
|||||||
2:
|
2:
|
||||||
|
|
||||||
/* Call global constructors */
|
/* Call global constructors */
|
||||||
|
//#ifdef HAVE_INIT_FINI
|
||||||
la a0, __libc_fini_array
|
la a0, __libc_fini_array
|
||||||
call atexit
|
call atexit
|
||||||
call __libc_init_array
|
call __libc_init_array
|
||||||
|
//#endif
|
||||||
#ifndef __riscv_float_abi_soft
|
#ifndef __riscv_float_abi_soft
|
||||||
/* Enable FPU */
|
/* Enable FPU */
|
||||||
li t0, MSTATUS_FS
|
li t0, MSTATUS_FS
|
||||||
@@ -51,4 +57,4 @@ _start:
|
|||||||
li a0, 0
|
li a0, 0
|
||||||
li a1, 0
|
li a1, 0
|
||||||
call main
|
call main
|
||||||
tail exit
|
tail _exit
|
||||||
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,27 @@
|
|||||||
|
#ifndef _RTL_CONST_H
|
||||||
|
#define _RTL_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))
|
||||||
|
|
||||||
|
#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) *((volatile uint32_t*) (UART0_BASE_ADDR + ADDR))
|
||||||
|
#endif /* _RTL_CONST_H */
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -1,7 +1,5 @@
|
|||||||
# See LICENSE for license details.
|
ifndef _MK_LIBWRAP
|
||||||
|
_MK_LIBWRAP := # defined
|
||||||
ifndef _SIFIVE_MK_LIBWRAP
|
|
||||||
_SIFIVE_MK_LIBWRAP := # defined
|
|
||||||
|
|
||||||
LIBWRAP_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
|
LIBWRAP_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||||
LIBWRAP_DIR := $(LIBWRAP_DIR:/=)
|
LIBWRAP_DIR := $(LIBWRAP_DIR:/=)
|
||||||
@@ -27,22 +25,40 @@ LIBWRAP_SRCS := \
|
|||||||
sys/sbrk.c \
|
sys/sbrk.c \
|
||||||
sys/_exit.c \
|
sys/_exit.c \
|
||||||
sys/puts.c \
|
sys/puts.c \
|
||||||
misc/write_hex.c
|
misc/write_hex.c \
|
||||||
|
sys/printf.c
|
||||||
|
|
||||||
LIBWRAP_SRCS := $(foreach f,$(LIBWRAP_SRCS),$(LIBWRAP_DIR)/$(f))
|
LIBWRAP_SRCS := $(foreach f,$(LIBWRAP_SRCS),$(LIBWRAP_DIR)/$(f))
|
||||||
LIBWRAP_OBJS := $(LIBWRAP_SRCS:.c=.o)
|
LIBWRAP_OBJS := $(LIBWRAP_SRCS:.c=.o)
|
||||||
|
|
||||||
LIBWRAP_SYMS := malloc free \
|
LIBWRAP_SYMS := \
|
||||||
open lseek read write fstat stat close link unlink \
|
open \
|
||||||
execve fork getpid kill wait \
|
lseek _lseek\
|
||||||
isatty times sbrk _exit puts
|
read _read\
|
||||||
|
write _write\
|
||||||
|
fstat _fstat\
|
||||||
|
stat \
|
||||||
|
close _close\
|
||||||
|
link \
|
||||||
|
unlink \
|
||||||
|
execve \
|
||||||
|
fork \
|
||||||
|
getpid \
|
||||||
|
kill \
|
||||||
|
wait \
|
||||||
|
isatty \
|
||||||
|
times \
|
||||||
|
sbrk _sbrk\
|
||||||
|
_exit \
|
||||||
|
puts _puts\
|
||||||
|
printf \
|
||||||
|
sprintf
|
||||||
|
|
||||||
LIBWRAP := libwrap.a
|
LIBWRAP := libwrap.a
|
||||||
|
|
||||||
LINK_DEPS += $(LIBWRAP)
|
LINK_DEPS += $(LIBWRAP)
|
||||||
|
|
||||||
LDFLAGS += $(foreach s,$(LIBWRAP_SYMS),-Wl,--wrap=$(s))
|
LDFLAGS += $(foreach s,$(LIBWRAP_SYMS),-Wl,--wrap=$(s))
|
||||||
LDFLAGS += $(foreach s,$(LIBWRAP_SYMS),-Wl,--wrap=_$(s))
|
|
||||||
LDFLAGS += -L. -Wl,--start-group -lwrap -lc -Wl,--end-group
|
LDFLAGS += -L. -Wl,--start-group -lwrap -lc -Wl,--end-group
|
||||||
|
|
||||||
CLEAN_OBJS += $(LIBWRAP_OBJS)
|
CLEAN_OBJS += $(LIBWRAP_OBJS)
|
||||||
@@ -53,4 +69,4 @@ $(LIBWRAP_OBJS): %.o: %.c $(HEADERS)
|
|||||||
$(LIBWRAP): $(LIBWRAP_OBJS)
|
$(LIBWRAP): $(LIBWRAP_OBJS)
|
||||||
$(AR) rcs $@ $^
|
$(AR) rcs $@ $^
|
||||||
|
|
||||||
endif # _SIFIVE_MK_LIBWRAP
|
endif # _MK_LIBWRAP
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/*.o
|
||||||
File renamed without changes.
@@ -0,0 +1 @@
|
|||||||
|
/*.o
|
||||||
File renamed without changes.
@@ -0,0 +1 @@
|
|||||||
|
/*.o
|
||||||
@@ -3,6 +3,10 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
|
||||||
|
extern volatile uint32_t tohost;
|
||||||
|
extern volatile uint32_t fromhost;
|
||||||
|
void write_hex(int fd, uint32_t hex);
|
||||||
|
|
||||||
void __wrap__exit(int code)
|
void __wrap__exit(int code)
|
||||||
{
|
{
|
||||||
//volatile uint32_t* leds = (uint32_t*) (GPIO_BASE_ADDR + GPIO_OUT_OFFSET);
|
//volatile uint32_t* leds = (uint32_t*) (GPIO_BASE_ADDR + GPIO_OUT_OFFSET);
|
||||||
@@ -12,6 +16,9 @@ void __wrap__exit(int code)
|
|||||||
write(STDERR_FILENO, message, sizeof(message) - 1);
|
write(STDERR_FILENO, message, sizeof(message) - 1);
|
||||||
write_hex(STDERR_FILENO, code);
|
write_hex(STDERR_FILENO, code);
|
||||||
write(STDERR_FILENO, "\n", 1);
|
write(STDERR_FILENO, "\n", 1);
|
||||||
|
#ifdef USE_TOHOST
|
||||||
|
tohost = code+1;
|
||||||
|
#endif
|
||||||
|
write(STDERR_FILENO, "\x04", 1);
|
||||||
for (;;);
|
for (;;);
|
||||||
}
|
}
|
||||||
+2
@@ -8,4 +8,6 @@ int __wrap_close(int fd)
|
|||||||
{
|
{
|
||||||
return _stub(EBADF);
|
return _stub(EBADF);
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_under_alias(close);
|
weak_under_alias(close);
|
||||||
|
|
||||||
File renamed without changes.
File renamed without changes.
@@ -15,4 +15,5 @@ int __wrap_fstat(int fd, struct stat* st)
|
|||||||
|
|
||||||
return _stub(EBADF);
|
return _stub(EBADF);
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_under_alias(fstat);
|
weak_under_alias(fstat);
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -13,4 +13,6 @@ off_t __wrap_lseek(int fd, off_t ptr, int dir)
|
|||||||
|
|
||||||
return _stub(EBADF);
|
return _stub(EBADF);
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_under_alias(lseek);
|
weak_under_alias(lseek);
|
||||||
|
|
||||||
File renamed without changes.
File renamed without changes.
@@ -14,6 +14,13 @@ int putchar(int ch)
|
|||||||
return write(STDOUT_FILENO, &ch, 1) == 1 ? ch : -1;
|
return write(STDOUT_FILENO, &ch, 1) == 1 ? ch : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t strnlen (const char *str, size_t n)
|
||||||
|
{
|
||||||
|
const char *start = str;
|
||||||
|
while (n-- > 0 && *str) str++;
|
||||||
|
return str - start;
|
||||||
|
}
|
||||||
|
|
||||||
static void sprintf_putch(int ch, void** data)
|
static void sprintf_putch(int ch, void** data)
|
||||||
{
|
{
|
||||||
char** pstr = (char**)data;
|
char** pstr = (char**)data;
|
||||||
File renamed without changes.
File renamed without changes.
@@ -15,4 +15,5 @@ void *__wrap_sbrk(ptrdiff_t incr)
|
|||||||
curbrk += incr;
|
curbrk += incr;
|
||||||
return curbrk - incr;
|
return curbrk - incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_under_alias(sbrk);
|
weak_under_alias(sbrk);
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Submodule
+1
Submodule benchmarks/coremark/cm added at d5fad6bd09.
@@ -0,0 +1,197 @@
|
|||||||
|
/*
|
||||||
|
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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,210 @@
|
|||||||
|
/*
|
||||||
|
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 */
|
||||||
Executable
+94
@@ -0,0 +1,94 @@
|
|||||||
|
# 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)
|
||||||
|
RISCV_ABI:=ilp32
|
||||||
|
|
||||||
|
# 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 = riscv32-unknown-elf-gcc
|
||||||
|
# Flag : LD
|
||||||
|
# Use this flag to define compiler to use
|
||||||
|
LD = riscv32-unknown-elf-gcc
|
||||||
|
# Flag : AS
|
||||||
|
# Use this flag to define compiler to use
|
||||||
|
AS = riscv32-unknown-elf-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 =
|
||||||
|
#--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
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
/*
|
||||||
|
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);
|
||||||
|
}
|
||||||
@@ -0,0 +1,701 @@
|
|||||||
|
/*
|
||||||
|
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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,241 @@
|
|||||||
|
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_*) }
|
||||||
|
}
|
||||||
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,2 @@
|
|||||||
|
dhrystone
|
||||||
|
/dhrystone.dis
|
||||||
File renamed without changes.
@@ -0,0 +1,25 @@
|
|||||||
|
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)
|
||||||
|
ifeq ($(ISA),e)
|
||||||
|
RISCV_ABI:=ilp32e
|
||||||
|
else
|
||||||
|
RISCV_ABI:=ilp32
|
||||||
|
endif
|
||||||
|
# '-lgcc -lm' are needed to add softfloat routines
|
||||||
|
CFLAGS := -g -march=$(RISCV_ARCH) -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) -mabi=$(RISCV_ABI) -mcmodel=medlow -Wl,--wrap=scanf -Wl,--wrap=printf -Wl,--wrap=exit -lgcc -lm
|
||||||
|
|
||||||
|
TOOL_DIR=$(dir $(compiler))
|
||||||
|
|
||||||
|
TRIPLET=riscv32-unknown-elf
|
||||||
|
BSP_BASE = ../../bare-metal-bsp
|
||||||
|
include $(BSP_BASE)/env/common-gcc.mk
|
||||||
File renamed without changes.
@@ -16,6 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "dhry.h"
|
#include "dhry.h"
|
||||||
|
extern char* strcpy(char* dest, const char* src);
|
||||||
|
|
||||||
/* Global Variables: */
|
/* Global Variables: */
|
||||||
|
|
||||||
@@ -258,9 +259,9 @@ main ()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef TIME
|
#ifdef TIME
|
||||||
Microseconds = (float) User_Time * Mic_secs_Per_Second
|
Microseconds = ((float) User_Time/(float)HZ) * Mic_secs_Per_Second
|
||||||
/ (float) Number_Of_Runs;
|
/ (float) Number_Of_Runs;
|
||||||
Dhrystones_Per_Second = (float) Number_Of_Runs / (float) User_Time;
|
Dhrystones_Per_Second = (float) Number_Of_Runs / ((float) User_Time/(float)HZ);
|
||||||
#else
|
#else
|
||||||
Microseconds = (float) User_Time * Mic_secs_Per_Second
|
Microseconds = (float) User_Time * Mic_secs_Per_Second
|
||||||
/ ((float) HZ * ((float) Number_Of_Runs));
|
/ ((float) HZ * ((float) Number_Of_Runs));
|
||||||
File renamed without changes.
@@ -0,0 +1,15 @@
|
|||||||
|
/* 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;
|
||||||
|
//}
|
||||||
@@ -5,18 +5,16 @@
|
|||||||
|
|
||||||
long time(void)
|
long time(void)
|
||||||
{
|
{
|
||||||
return get_timer_value() / get_timer_freq();
|
return get_timer_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the number of dhrystone iterations
|
// set the number of dhrystone iterations
|
||||||
void __wrap_scanf(const char* fmt, int* n)
|
void __wrap_scanf(const char* fmt, int* n)
|
||||||
{
|
{
|
||||||
// *n = 100000000;
|
*n = 200000;
|
||||||
*n = 1000000;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
volatile uint64_t tohost;
|
extern volatile uint32_t tohost;
|
||||||
volatile uint64_t fromhost;
|
|
||||||
|
|
||||||
void __wrap_exit(int n){
|
void __wrap_exit(int n){
|
||||||
tohost = 0x1;
|
tohost = 0x1;
|
||||||
@@ -1,168 +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="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.516870870">
|
|
||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.516870870" 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"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.autotools.core.ErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
<extension id="de.marw.cdt.cmake.core.CMakeErrorParser" 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="${cross_rm} -rf" description="" id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.516870870" name="Debug" optionalBuildProperties="org.eclipse.cdt.docker.launcher.containerbuild.property.selectedvolumes=,org.eclipse.cdt.docker.launcher.containerbuild.property.volumes=" parent="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.516870870">
|
|
||||||
<folderInfo id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.516870870." name="/" resourcePath="">
|
|
||||||
<toolChain id="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.debug.108811797" name="RISC-V Cross GCC">
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash.8320194" name="Create flash image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting.379436257" name="Create extended listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting" useByScannerDiscovery="false"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.1043841176" name="Print size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.383399415" name="Optimization Level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.more" valueType="enumerated"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength.178339006" name="Message length (-fmessage-length=0)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength" useByScannerDiscovery="true" value="false" valueType="boolean"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar.119459497" name="'char' is signed (-fsigned-char)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar" useByScannerDiscovery="true" value="false" valueType="boolean"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections.735578493" name="Function sections (-ffunction-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections" useByScannerDiscovery="true" value="false" valueType="boolean"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections.663648478" name="Data sections (-fdata-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections" useByScannerDiscovery="true" value="false" valueType="boolean"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.33211902" name="Debug level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.max" valueType="enumerated"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format.1212459035" name="Debug format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format" useByScannerDiscovery="true"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name.2118228106" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name" useByScannerDiscovery="false" value="RISC-V GCC/Newlib" valueType="string"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix.1953815021" name="Prefix" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix" useByScannerDiscovery="false" value="riscv64-unknown-elf-" valueType="string"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c.739203741" name="C compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c" useByScannerDiscovery="false" value="gcc" valueType="string"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp.1844392607" name="C++ compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp" useByScannerDiscovery="false" value="g++" valueType="string"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar.2006331761" name="Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar" useByScannerDiscovery="false" value="ar" valueType="string"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy.953275776" name="Hex/Bin converter" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy" useByScannerDiscovery="false" value="objcopy" valueType="string"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump.1629820216" name="Listing generator" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump" useByScannerDiscovery="false" value="objdump" valueType="string"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size.1139290195" name="Size command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size" useByScannerDiscovery="false" value="size" valueType="string"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make.598152082" name="Build command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make" useByScannerDiscovery="false" value="make" valueType="string"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm.1903820766" name="Remove command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm" useByScannerDiscovery="false" value="rm" valueType="string"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base.274413758" name="Architecture" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.arch.rv32i" valueType="enumerated"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply.1227968882" name="Multiply extension (RVM)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.atomic.25268933" name="Atomic extension (RVA)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.atomic" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.compressed.148707865" name="Compressed extension (RVC)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.compressed" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer.2137340048" name="Integer ABI" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.abi.integer.ilp32" valueType="enumerated"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.codemodel.93793405" name="Code model" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.codemodel" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.codemodel.any" valueType="enumerated"/>
|
|
||||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform.1301923652" isAbstract="false" osList="all"/>
|
|
||||||
<builder buildPath="${workspace_loc:/demo_gpio}/Debug" id="ilg.gnumcueclipse.managedbuild.cross.riscv.builder.1496635672" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder"/>
|
|
||||||
</toolChain>
|
|
||||||
</folderInfo>
|
|
||||||
</configuration>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
|
||||||
<storageModule moduleId="ilg.gnumcueclipse.managedbuild.packs"/>
|
|
||||||
</cconfiguration>
|
|
||||||
<cconfiguration id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1992646408">
|
|
||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1992646408" 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="${cross_rm} -rf" description="" id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1992646408" name="Release" optionalBuildProperties="org.eclipse.cdt.docker.launcher.containerbuild.property.selectedvolumes=,org.eclipse.cdt.docker.launcher.containerbuild.property.volumes=" parent="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release">
|
|
||||||
<folderInfo id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1992646408." name="/" resourcePath="">
|
|
||||||
<toolChain id="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.release.1937283388" name="RISC-V Cross GCC" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.release">
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash.672219611" 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.1692672647" name="Create extended listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.1955835524" name="Print size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize" value="true" valueType="boolean"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.1634926912" name="Optimization Level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.size" valueType="enumerated"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength.1936180446" name="Message length (-fmessage-length=0)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength" value="true" valueType="boolean"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar.148983493" name="'char' is signed (-fsigned-char)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar" value="true" valueType="boolean"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections.2117145633" name="Function sections (-ffunction-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections" value="true" valueType="boolean"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections.1653949713" name="Data sections (-fdata-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections" value="true" valueType="boolean"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.728682044" name="Debug level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format.1767313058" name="Debug format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name.254213830" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name" value="RISC-V GCC/Newlib" valueType="string"/>
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix.372256120" 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.c.298542489" 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.1240126358" 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.170388081" 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.1277104890" 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.488685269" 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.554860593" 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.468110366" 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.309041178" name="Remove command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm" value="rm" valueType="string"/>
|
|
||||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform.687762738" isAbstract="false" osList="all" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform"/>
|
|
||||||
<builder buildPath="${workspace_loc:/demo_gpio}/Release" id="ilg.gnumcueclipse.managedbuild.cross.riscv.builder.609463428" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.builder"/>
|
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.1648537074" name="GNU RISC-V Cross Assembler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler">
|
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor.1113623358" 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.1033931684" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1778523424" 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.1714150627" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.669753833" name="GNU RISC-V Cross C++ Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler"/>
|
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.1530679232" 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.1637900674" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections" value="true" valueType="boolean"/>
|
|
||||||
<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.input.1335245598" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.input">
|
|
||||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
|
||||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
|
||||||
</inputType>
|
|
||||||
</tool>
|
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker.648232936" 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.929507343" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.gcsections" value="true" valueType="boolean"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver.439296099" name="GNU RISC-V Cross Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver"/>
|
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash.2024214820" 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.1648338834" 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.1291642104" 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.616461822" 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.1146271318" 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.1242922810" 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.876301703" 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.1112238656" 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.483461408" 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"/>
|
|
||||||
</cconfiguration>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
|
||||||
<project id="demo_gpio.ilg.gnumcueclipse.managedbuild.cross.riscv.target.elf.431462479" name="Executable"/>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="scannerConfiguration">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
<scannerConfigBuildInfo instanceId="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1992646408;ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1992646408.;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1778523424;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.1714150627">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
</scannerConfigBuildInfo>
|
|
||||||
<scannerConfigBuildInfo instanceId="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.516870870;ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.516870870.;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1632260763;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.517786622">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
</scannerConfigBuildInfo>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
|
||||||
<storageModule moduleId="refreshScope" versionNumber="2">
|
|
||||||
<configuration configurationName="Debug">
|
|
||||||
<resource resourceType="PROJECT" workspacePath="/demo_gpio"/>
|
|
||||||
</configuration>
|
|
||||||
<configuration configurationName="Release">
|
|
||||||
<resource resourceType="PROJECT" workspacePath="/demo_gpio"/>
|
|
||||||
</configuration>
|
|
||||||
</storageModule>
|
|
||||||
<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>
|
|
||||||
</buildTargets>
|
|
||||||
</storageModule>
|
|
||||||
</cproject>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
/Debug/
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<projectDescription>
|
|
||||||
<name>demo_gpio</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.managedbuilder.core.managedBuildNature</nature>
|
|
||||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
|
||||||
</natures>
|
|
||||||
</projectDescription>
|
|
||||||
Loaded 100 of 691 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user