Compare commits
20 Commits
feature/re
...
feature/hi
Author | SHA1 | Date | |
---|---|---|---|
619be720d3 | |||
4c86ddd9fb | |||
abfde888fb | |||
b082091db2 | |||
eeb17437ee | |||
cffa693e29 | |||
9c0047b3ea | |||
ca1adccb2b | |||
3217871752 | |||
9dd7dcb4ce | |||
3403edcde9 | |||
3a3cbf38c3 | |||
822696ae0d | |||
314ceeb072 | |||
4c2208c1ac | |||
36a6de6dc0 | |||
d2cb78724a | |||
0de438dc52 | |||
5f44f8df98 | |||
02ce96eed8 |
7
.gitmodules
vendored
Normal file
7
.gitmodules
vendored
Normal file
@ -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
|
18
CMakeLists.txt
Normal file
18
CMakeLists.txt
Normal file
@ -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})
|
1
bare-metal-bsp/env/.gitignore
vendored
Normal file
1
bare-metal-bsp/env/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/*.o
|
1
bare-metal-bsp/env/TGC5L/.gitignore
vendored
Normal file
1
bare-metal-bsp/env/TGC5L/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/*.o
|
121
bare-metal-bsp/env/TGC5L/init.c
vendored
Normal file
121
bare-metal-bsp/env/TGC5L/init.c
vendored
Normal file
@ -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;
|
||||||
|
}
|
@ -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 );
|
||||||
}
|
}
|
32
bare-metal-bsp/env/TGC5L/platform.h
vendored
Normal file
32
bare-metal-bsp/env/TGC5L/platform.h
vendored
Normal file
@ -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
|
@ -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
|
@ -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
|
||||||
|
|
@ -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);
|
@ -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 );
|
||||||
}
|
}
|
1
bare-metal-bsp/env/iss/.gitignore
vendored
Normal file
1
bare-metal-bsp/env/iss/.gitignore
vendored
Normal file
@ -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,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 );
|
||||||
}
|
}
|
31
bare-metal-bsp/env/iss/platform.h
vendored
Normal file
31
bare-metal-bsp/env/iss/platform.h
vendored
Normal file
@ -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 */
|
1
bare-metal-bsp/env/rtl/.gitignore
vendored
Normal file
1
bare-metal-bsp/env/rtl/.gitignore
vendored
Normal file
@ -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 );
|
||||||
}
|
}
|
30
bare-metal-bsp/env/rtl/platform.h
vendored
Normal file
30
bare-metal-bsp/env/rtl/platform.h
vendored
Normal file
@ -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 */
|
@ -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
|
27
bare-metal-bsp/include/rtl/const.h
Normal file
27
bare-metal-bsp/include/rtl/const.h
Normal file
@ -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 */
|
@ -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
|
1
bare-metal-bsp/libwrap/misc/.gitignore
vendored
Normal file
1
bare-metal-bsp/libwrap/misc/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/*.o
|
1
bare-metal-bsp/libwrap/stdlib/.gitignore
vendored
Normal file
1
bare-metal-bsp/libwrap/stdlib/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/*.o
|
1
bare-metal-bsp/libwrap/sys/.gitignore
vendored
Normal file
1
bare-metal-bsp/libwrap/sys/.gitignore
vendored
Normal file
@ -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 (;;);
|
||||||
}
|
}
|
@ -8,4 +8,6 @@ int __wrap_close(int fd)
|
|||||||
{
|
{
|
||||||
return _stub(EBADF);
|
return _stub(EBADF);
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_under_alias(close);
|
weak_under_alias(close);
|
||||||
|
|
@ -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);
|
@ -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);
|
||||||
|
|
@ -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;
|
@ -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);
|
1
benchmarks/coremark/cm
Submodule
1
benchmarks/coremark/cm
Submodule
Submodule benchmarks/coremark/cm added at d5fad6bd09
197
benchmarks/coremark/tgc/core_portme.c
Normal file
197
benchmarks/coremark/tgc/core_portme.c
Normal file
@ -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;
|
||||||
|
}
|
210
benchmarks/coremark/tgc/core_portme.h
Normal file
210
benchmarks/coremark/tgc/core_portme.h
Normal file
@ -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 */
|
94
benchmarks/coremark/tgc/core_portme.mak
Executable file
94
benchmarks/coremark/tgc/core_portme.mak
Executable file
@ -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
|
127
benchmarks/coremark/tgc/cvt.c
Normal file
127
benchmarks/coremark/tgc/cvt.c
Normal file
@ -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);
|
||||||
|
}
|
701
benchmarks/coremark/tgc/ee_printf.c
Normal file
701
benchmarks/coremark/tgc/ee_printf.c
Normal file
@ -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;
|
||||||
|
}
|
241
benchmarks/coremark/tgc/tgc.lds
Normal file
241
benchmarks/coremark/tgc/tgc.lds
Normal file
@ -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_*) }
|
||||||
|
}
|
2
benchmarks/dhrystone/.gitignore
vendored
Normal file
2
benchmarks/dhrystone/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
dhrystone
|
||||||
|
/dhrystone.dis
|
25
benchmarks/dhrystone/Makefile
Normal file
25
benchmarks/dhrystone/Makefile
Normal file
@ -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
|
@ -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));
|
15
benchmarks/dhrystone/dhry_printf.c
Normal file
15
benchmarks/dhrystone/dhry_printf.c
Normal file
@ -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
demo_gpio/.gitignore
vendored
1
demo_gpio/.gitignore
vendored
@ -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>
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user