From 8813e071bc853b07fc76dcabfa977cf7ff00f575 Mon Sep 17 00:00:00 2001 From: Mateusz Holenko Date: Wed, 10 Jul 2019 10:39:26 +0200 Subject: [PATCH] Add `litex` target Use configuration from the `csr.h` file generated dynamically when building a LiteX platform. --- src/main/c/emulator/makefile | 5 +++ src/main/c/emulator/src/hal.c | 71 ++++++++++++++++++++++++++++++++++ src/main/c/emulator/src/main.c | 2 +- 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/main/c/emulator/makefile b/src/main/c/emulator/makefile index d9d9098..7534d08 100755 --- a/src/main/c/emulator/makefile +++ b/src/main/c/emulator/makefile @@ -18,6 +18,11 @@ sim: all qemu: CFLAGS += -DQEMU qemu: all +litex: CFLAGS += -DLITEX -I${LITEX_BASE}/software/include +litex: | check_litex_base all +check_litex_base: + @[ "${LITEX_BASE}" ] || ( echo ">> LITEX_BASE is not set"; exit 1 ) + include ${STANDALONE}/common/riscv64-unknown-elf.mk include ${STANDALONE}/common/standalone.mk diff --git a/src/main/c/emulator/src/hal.c b/src/main/c/emulator/src/hal.c index 52bb0e4..a9189f2 100644 --- a/src/main/c/emulator/src/hal.c +++ b/src/main/c/emulator/src/hal.c @@ -144,5 +144,76 @@ void halInit(){ #endif +#ifdef LITEX + +// this is copied from LiteX +#define CSR_ACCESSORS_DEFINED +static inline void csr_writeb(uint8_t value, unsigned long addr) +{ + *((volatile uint8_t *)addr) = value; +} + +static inline uint8_t csr_readb(unsigned long addr) +{ + return *(volatile uint8_t *)addr; +} + +static inline void csr_writew(uint16_t value, unsigned long addr) +{ + *((volatile uint16_t *)addr) = value; +} + +static inline uint16_t csr_readw(unsigned long addr) +{ + return *(volatile uint16_t *)addr; +} + +static inline void csr_writel(uint32_t value, unsigned long addr) +{ + *((volatile uint32_t *)addr) = value; +} + +static inline uint32_t csr_readl(unsigned long addr) +{ + return *(volatile uint32_t *)addr; +} + +// this is a file generated by LiteX +#include + +#if !defined(CSR_UART_BASE) || !defined(CSR_CPU_BASE) + #error LiteX configuration with uart and cpu_timer is required. +#endif + +void stopSim(){ + while(1); +} + +void putC(char ch){ + uart_rxtx_write(ch); +} + +int32_t getC(){ + return uart_rxempty_read() + ? -1 + : uart_rxtx_read(); +} + +uint32_t rdtime(){ + return (uint32_t)cpu_timer_time_read(); +} + +uint32_t rdtimeh(){ + return (uint32_t)(cpu_timer_time_read() >> 32); +} + +void setMachineTimerCmp(uint32_t low, uint32_t high){ + cpu_timer_time_cmp_write((((unsigned long long int)high) << 32) | low); +} + +void halInit(){ +} + +#endif diff --git a/src/main/c/emulator/src/main.c b/src/main/c/emulator/src/main.c index 2102818..dc12fb8 100755 --- a/src/main/c/emulator/src/main.c +++ b/src/main/c/emulator/src/main.c @@ -161,7 +161,7 @@ void trap(){ #ifdef SIM uint32_t instruction = csr_read(mbadaddr); #endif -#ifdef QEMU +#if defined(QEMU) || defined(LITEX) uint32_t instruction = 0; uint32_t i; if (mepc & 2) {