diff options
| -rw-r--r-- | Makefile | 7 | ||||
| -rw-r--r-- | bsp/env/coreplexip-arty.h | 2 | ||||
| -rw-r--r-- | bsp/env/coreplexip-e31-arty/link.lds | 16 | ||||
| -rw-r--r-- | bsp/env/freedom-e300-hifive1/link.lds | 16 | ||||
| -rw-r--r-- | bsp/env/hifive1.h | 2 | ||||
| -rw-r--r-- | bsp/env/start.S | 10 | ||||
| -rw-r--r-- | bsp/libwrap/misc/write_hex.c | 4 | ||||
| m--------- | openocd | 0 | ||||
| -rwxr-xr-x | regression.bash | 71 | ||||
| m--------- | riscv-gnu-toolchain | 0 | ||||
| -rw-r--r-- | software/coremark/.unsupported-boards | 6 | ||||
| -rw-r--r-- | software/coreplexip_welcome/.unsupported-boards | 2 | ||||
| -rw-r--r-- | software/double_tap_dontboot/.unsupported-boards | 3 | ||||
| -rw-r--r-- | software/global_interrupts/.unsupported-boards | 2 | ||||
| -rw-r--r-- | software/led_fade/.unsupported-boards | 3 | ||||
| -rw-r--r-- | software/local_interrupts/.unsupported-boards | 2 | ||||
| -rw-r--r-- | software/performance_counters/performance_counters.c | 24 | 
17 files changed, 137 insertions, 33 deletions
| @@ -14,6 +14,7 @@ endif  # Default target  BOARD ?= freedom-e300-hifive1  PROGRAM ?= demo_gpio +GDB_PORT ?= 3333  # Variables the user probably shouldn't override.  builddir := work/build @@ -190,7 +191,7 @@ PROGRAM_ELF = software/$(PROGRAM)/$(PROGRAM)  .PHONY: software_clean  software_clean: -	$(MAKE) -C $(PROGRAM_DIR) clean +	$(MAKE) -C $(PROGRAM_DIR) BSP_BASE=$(abspath bsp) BOARD=$(BOARD) clean  .PHONY: software  software: software_clean @@ -208,7 +209,7 @@ OPENOCDARGS += -f $(OPENOCDCFG)  GDB_UPLOAD_ARGS ?= --batch  GDB_UPLOAD_CMDS += -ex "set remotetimeout 240" -GDB_UPLOAD_CMDS += -ex "target extended-remote localhost:3333" +GDB_UPLOAD_CMDS += -ex "target extended-remote localhost:$(GDB_PORT)"  GDB_UPLOAD_CMDS += -ex "monitor reset halt"  GDB_UPLOAD_CMDS += -ex "monitor flash protect 0 64 last off"  GDB_UPLOAD_CMDS += -ex "load" @@ -229,7 +230,7 @@ run_openocd:  	$(RISCV_OPENOCD) $(OPENOCDARGS)  GDBCMDS += -ex "set remotetimeout 240" -GDBCMDS += -ex "target extended-remote localhost:3333" +GDBCMDS += -ex "target extended-remote localhost:$(GDB_PORT)"  run_gdb:  	$(RISCV_GDB) $(PROGRAM_DIR)/$(PROGRAM) $(GDBARGS) $(GDBCMDS) diff --git a/bsp/env/coreplexip-arty.h b/bsp/env/coreplexip-arty.h index 161da7c..eedcaa5 100644 --- a/bsp/env/coreplexip-arty.h +++ b/bsp/env/coreplexip-arty.h @@ -97,6 +97,6 @@  #define RTC_FREQ 32768 -void write_hex(int fd, long int hex); +void write_hex(int fd, unsigned long int hex);  #endif /* _SIFIVE_COREPLEXIP_ARTY_H */ diff --git a/bsp/env/coreplexip-e31-arty/link.lds b/bsp/env/coreplexip-e31-arty/link.lds index 45a82d7..590c5b6 100644 --- a/bsp/env/coreplexip-e31-arty/link.lds +++ b/bsp/env/coreplexip-e31-arty/link.lds @@ -120,11 +120,11 @@ SECTIONS    {      *(.data .data.*)      *(.gnu.linkonce.d.*) -  } >ram AT>flash :ram_init - -  .srodata        : -  { -    PROVIDE( _gp = . + 0x800 ); +    . = ALIGN(8); +    PROVIDE( __global_pointer$ = . + 0x800 ); +    *(.sdata .sdata.*) +    *(.gnu.linkonce.s.*) +    . = ALIGN(8);      *(.srodata.cst16)      *(.srodata.cst8)      *(.srodata.cst4) @@ -132,12 +132,6 @@ SECTIONS      *(.srodata .srodata.*)    } >ram AT>flash :ram_init -  .sdata          : -  { -    *(.sdata .sdata.*) -    *(.gnu.linkonce.s.*) -  } >ram AT>flash :ram_init -    . = ALIGN(4);    PROVIDE( _edata = . );    PROVIDE( edata = . ); diff --git a/bsp/env/freedom-e300-hifive1/link.lds b/bsp/env/freedom-e300-hifive1/link.lds index 90e5c8f..6b37141 100644 --- a/bsp/env/freedom-e300-hifive1/link.lds +++ b/bsp/env/freedom-e300-hifive1/link.lds @@ -120,11 +120,11 @@ SECTIONS    {      *(.data .data.*)      *(.gnu.linkonce.d.*) -  } >ram AT>flash :ram_init - -  .srodata        : -  { -    PROVIDE( _gp = . + 0x800 ); +    . = ALIGN(8); +    PROVIDE( __global_pointer$ = . + 0x800 ); +    *(.sdata .sdata.*) +    *(.gnu.linkonce.s.*) +    . = ALIGN(8);      *(.srodata.cst16)      *(.srodata.cst8)      *(.srodata.cst4) @@ -132,12 +132,6 @@ SECTIONS      *(.srodata .srodata.*)    } >ram AT>flash :ram_init -  .sdata          : -  { -    *(.sdata .sdata.*) -    *(.gnu.linkonce.s.*) -  } >ram AT>flash :ram_init -    . = ALIGN(4);    PROVIDE( _edata = . );    PROVIDE( edata = . ); diff --git a/bsp/env/hifive1.h b/bsp/env/hifive1.h index b987847..0db2f0f 100644 --- a/bsp/env/hifive1.h +++ b/bsp/env/hifive1.h @@ -76,6 +76,6 @@  #define RTC_FREQ 32768 -void write_hex(int fd, long int hex); +void write_hex(int fd, unsigned long int hex);  #endif /* _SIFIVE_HIFIVE1_H */ diff --git a/bsp/env/start.S b/bsp/env/start.S index 9ec6c1c..e86105b 100644 --- a/bsp/env/start.S +++ b/bsp/env/start.S @@ -7,7 +7,10 @@  	.type _start,@function  _start: -	la gp, _gp +.option push +.option norelax +	la gp, __global_pointer$ +.option pop  	la sp, _sp  	/* Load data section */ @@ -52,7 +55,8 @@ _start:  	/* argc = argv = 0 */  	li a0, 0  	li a1, 0 -	call _init  	call main -	call _fini  	tail exit + +1: +	j 1b diff --git a/bsp/libwrap/misc/write_hex.c b/bsp/libwrap/misc/write_hex.c index 96f832d..a35ad7a 100644 --- a/bsp/libwrap/misc/write_hex.c +++ b/bsp/libwrap/misc/write_hex.c @@ -4,13 +4,13 @@  #include <unistd.h>  #include "platform.h" -void write_hex(int fd, long int hex) +void write_hex(int fd, unsigned long int hex)  {    uint8_t ii;    uint8_t jj;    char towrite;    write(fd , "0x", 2); -  for (ii = sizeof(long int) * 2 ; ii > 0; ii--) { +  for (ii = sizeof(unsigned long int) * 2 ; ii > 0; ii--) {      jj = ii - 1;      uint8_t digit = ((hex & (0xF << (jj*4))) >> (jj*4));      towrite = digit < 0xA ? ('0' + digit) : ('A' +  (digit - 0xA)); diff --git a/openocd b/openocd -Subproject 51ab5a0c8b1513e0bf2581173c569ec4505dde5 +Subproject 459b39ec67bbbe2ea0a192344c5236518da79c6 diff --git a/regression.bash b/regression.bash new file mode 100755 index 0000000..da8bf10 --- /dev/null +++ b/regression.bash @@ -0,0 +1,71 @@ +#!/bin/bash + +unset board +unset manual +while [[ "$1" != "" ]] +do +  case "$1" in +  "--board") +    board="$2" +    shift +    shift +    ;; +  "--manual") +    manual="true" +    shift +    ;; +  esac +done + +if [[ "$board" == "" ]] +then +  echo "Specify a --board to test" >&2 +  exit 1 +fi + +if [[ "$manual" == "true" ]] +then +  echo "You're running in manual test mode.  Please connect a $board to continue..." +  read -p "Press ENTER to continue" +fi + +set -e + +find software -mindepth 1 -maxdepth 2 -type d | cut -d/ -f2 | while read program +do +  # Allow examples to specify the boards on which they won't run. +  if test -f software/$program/.unsupported-boards +  then +    if grep -q $board software/$program/.unsupported-boards +    then +      continue +    fi +  fi + +  # Build the example. +  make BOARD=$board PROGRAM=$program software + +  # We require user interaction in order to verify the tests succeed.  If the +  # user hasn't specified the manual flag then don't bother running the tests. +  if [[ "$manual" == "true" ]] +  then +    echo "We're about to run $program on $board, waiting 10 seconds" +    sleep 1s + +    echo "flashing $program" +    make BOARD=$board PROGRAM=$program upload + +    echo "$program has been flashed to your $board, please test it.  GDB will open in 2 seconds" +    urxvt -hold -e make BOARD=$board PROGRAM=$program run_openocd & +    sleep 2s +    urxvt -hold -e make BOARD=$board PROGRAM=$program run_gdb + +    echo "Close the running OpenOCD" +    wait +  fi +done + +if [[ "$manual" != "true" ]] +then +  echo "You haven't actually verified the tests run, please don't release!" >&2 +fi diff --git a/riscv-gnu-toolchain b/riscv-gnu-toolchain -Subproject 19ddd4d6f42bddaa29a76f926fea9ee5be17776 +Subproject f5fae1c27b2365da773816ddcd92f533867f28e diff --git a/software/coremark/.unsupported-boards b/software/coremark/.unsupported-boards new file mode 100644 index 0000000..9221334 --- /dev/null +++ b/software/coremark/.unsupported-boards @@ -0,0 +1,6 @@ +# We don't deliver the full coremark sources for license reasons, so this can't +# run in regression. +freedom-e300-hifive1 +freedom-e300-arty +coreplexip-e31-arty +coreplexip-e51-arty diff --git a/software/coreplexip_welcome/.unsupported-boards b/software/coreplexip_welcome/.unsupported-boards new file mode 100644 index 0000000..33cea3a --- /dev/null +++ b/software/coreplexip_welcome/.unsupported-boards @@ -0,0 +1,2 @@ +freedom-e300-arty +freedom-e300-hifive1 diff --git a/software/double_tap_dontboot/.unsupported-boards b/software/double_tap_dontboot/.unsupported-boards new file mode 100644 index 0000000..4e93148 --- /dev/null +++ b/software/double_tap_dontboot/.unsupported-boards @@ -0,0 +1,3 @@ +coreplexip-e31-arty +coreplexip-e51-arty + diff --git a/software/global_interrupts/.unsupported-boards b/software/global_interrupts/.unsupported-boards new file mode 100644 index 0000000..33cea3a --- /dev/null +++ b/software/global_interrupts/.unsupported-boards @@ -0,0 +1,2 @@ +freedom-e300-arty +freedom-e300-hifive1 diff --git a/software/led_fade/.unsupported-boards b/software/led_fade/.unsupported-boards new file mode 100644 index 0000000..4e93148 --- /dev/null +++ b/software/led_fade/.unsupported-boards @@ -0,0 +1,3 @@ +coreplexip-e31-arty +coreplexip-e51-arty + diff --git a/software/local_interrupts/.unsupported-boards b/software/local_interrupts/.unsupported-boards new file mode 100644 index 0000000..33cea3a --- /dev/null +++ b/software/local_interrupts/.unsupported-boards @@ -0,0 +1,2 @@ +freedom-e300-arty +freedom-e300-hifive1 diff --git a/software/performance_counters/performance_counters.c b/software/performance_counters/performance_counters.c index e7c12a3..8094128 100644 --- a/software/performance_counters/performance_counters.c +++ b/software/performance_counters/performance_counters.c @@ -18,6 +18,15 @@  // rollover with this routine as suggested by the  // RISC-V Priviledged Architecture Specification. +#if __riscv_xlen == 64 +#define rdmcycle(x)  {					\ +    uint64_t hi;					\ +    __asm__ __volatile__ ("1:\n\t"			\ +			  "csrr %0, mcycle\n\t"		\ +			  : "=r" (hi)) ;		\ +    *(x) = hi;		 				\ +  } +#else  #define rdmcycle(x)  {				       \      uint32_t lo, hi, hi2;			       \      __asm__ __volatile__ ("1:\n\t"		       \ @@ -28,12 +37,22 @@  			  : "=r" (hi), "=r" (lo), "=r" (hi2)) ;	\      *(x) = lo | ((uint64_t) hi << 32); 				\    } +#endif  // The minstret counter is 64-bit counter, but  // Freedom E platforms use RV32, we must access it as  // 2 32-bit registers, same as for mcycle. +#if __riscv_xlen == 64 +#define rdminstret(x)  {				\ +    uint64_t hi;					\ +    __asm__ __volatile__ ("1:\n\t"			\ +			  "csrr %0, minstret\n\t"	\ +			  : "=r" (hi)) ;		\ +    *(x) = hi;						\ +  } +#else  #define rdminstret(x)  {			       \      uint32_t lo, hi, hi2;			       \      __asm__ __volatile__ ("1:\n\t"		       \ @@ -44,6 +63,7 @@  			  : "=r" (hi), "=r" (lo), "=r" (hi2)) ;	\      *(x) = lo | ((uint64_t) hi << 32); 				\    } +#endif  // Simple program to measure the performance of. @@ -90,9 +110,11 @@ int main()    for (int ii = 0; ii < 3; ii++){      write_csr(mcycle,  0); -    write_csr(mcycleh, 0);      write_csr(minstret, 0); +#if __riscv_xlen == 32 +    write_csr(mcycleh, 0);      write_csr(minstreth, 0); +#endif      volatile int result = factorial (100); | 
