Update benchmarks to new privileged ISA
authorAndrew Waterman <waterman@eecs.berkeley.edu>
Mon, 25 Nov 2013 10:25:42 +0000 (02:25 -0800)
committerAndrew Waterman <waterman@eecs.berkeley.edu>
Mon, 25 Nov 2013 10:25:42 +0000 (02:25 -0800)
benchmarks/Makefile
benchmarks/common/crt-mt.S
benchmarks/common/crt.S
benchmarks/common/pcr.h [deleted file]
benchmarks/common/syscalls.c
benchmarks/common/util.h
benchmarks/mt-matmul/bmark.mk
benchmarks/mt-vvadd/bmark.mk
env

index 9eb05cd4e288f12685d9c9fb2ba7b80c216c528f..dee7b239c6f5b6ae620eb479286da98041b4cbdb 100644 (file)
@@ -25,7 +25,7 @@ bmarks = \
        dhrystone \
        spmv \
        mt-vvadd \
-       mt-matmul \
+       #mt-matmul \
        #vec-vvadd \
        #vec-cmplxmult \
        #vec-matmul \
@@ -51,17 +51,16 @@ HOST_COMP = gcc $(HOST_OPTS)
 
 RISCV_GCC = riscv-gcc
 RISCV_GCC_OPTS = -Wa,-march=RVIMAFDXhwacha -std=gnu99 -O2 -nostdlib -nostartfiles -ffast-math
-RISCV_LINK = riscv-gcc -T $(bmarkdir)/common/test.ld
+RISCV_LINK = riscv-gcc -T $(bmarkdir)/common/test.ld $(incs)
 RISCV_LINK_MT = riscv-gcc -T $(bmarkdir)/common/test-mt.ld
 RISCV_LINK_OPTS = -lc
-RISCV_LINK_SYSCALL = $(bmarkdir)/common/syscalls.c -lc
 RISCV_OBJDUMP = riscv-objdump --disassemble-all --disassemble-zeroes --section=.text --section=.text.startup --section=.data
 RISCV_SIM = spike
 
 VPATH += $(addprefix $(bmarkdir)/, $(bmarks))
 VPATH += $(bmarkdir)/common
 
-incs  += -I$(bmarkdir)/common $(addprefix -I$(bmarkdir)/, $(bmarks))
+incs  += -I../env -I$(bmarkdir)/common $(addprefix -I$(bmarkdir)/, $(bmarks))
 objs  :=
 
 include $(patsubst %, $(bmarkdir)/%/bmark.mk, $(bmarks))
index 90cd75554945bd98a2cf7d7c89fee4c794d363ef..6cedec0f72f70937d7f8bdcb135914e3de9ef5d5 100644 (file)
@@ -1,4 +1,4 @@
-#include "pcr.h"
+#include "encoding.h"
 
   .data
   .globl _heapend
@@ -44,13 +44,12 @@ _start:
   li  x30,0
   li  x31,0
 
-  # enable fp
-  setpcr status, SR_EF
-
-  # enable vec
-  setpcr t0, status, SR_EV
+  # enable fp and accelerator
+  li a0, SR_EF | SR_EA
+  csrs status, a0
 
   ## if that didn't stick, we don't have an FPU, so don't initialize it
+  csrr t0, status
   and t0, t0, SR_EF
   beqz t0, 1f
 
@@ -91,7 +90,7 @@ _start:
 
 
   # get core id and number of cores
-  mfpcr a0,hartid
+  csrr a0, hartid
   lw a1, 4(zero)
 
   slli a2, a0, 13
index 563360a7de7675aea56d3f29f07d17f6c6b40c58..ae8706bfa831752588cd77fd031d22f77673b881 100644 (file)
@@ -1,4 +1,4 @@
-#include "pcr.h"
+#include "encoding.h"
 
   .data
   .globl _heapend
@@ -45,17 +45,16 @@ _start:
   li  x31,0
 
 #ifdef __riscv64
-  setpcr status, SR_S64
-  setpcr status, SR_U64
+  li a0, SR_U64 | SR_S64
+  csrs status, a0
 #endif
 
-  # enable fp
-  setpcr status, SR_EF
-
-  # enable vec
-  setpcr t0, status, SR_EV
+  # enable fp and accelerator
+  li a0, SR_EF | SR_EA
+  csrs status, a0
 
   ## if that didn't stick, we don't have an FPU, so don't initialize it
+  csrr t0, status
   and t0, t0, SR_EF
   beqz t0, 1f
 
@@ -96,27 +95,27 @@ _start:
 
   lui a0, %hi(trap_entry)    
   add a0, a0, %lo(trap_entry)
-  mtpcr a0, evec
+  csrw evec, a0
 
   lui a0, %hi(main)    
   add a0, a0, %lo(main)
-  mtpcr a0, epc
+  csrw epc, a0
 
   # only allow core 0 to proceed
-1:mfpcr a0, hartid
+1:csrr a0, hartid
   bnez a0, 1b
 
   la  sp,stacktop
   
   # jmp to main as a user program
-  eret 
+  sret 
 1:b 1b
 
 .align 4
 .globl trap_entry
 trap_entry:                # only check for SYS_exit, otherwise crash out
   li a3, 1337              # magic "bad things" happened error code
-  mfpcr a1, cause
+  csrr a1, cause
   li a2, 6                 # syscall exception number
   bne a1, a2, exit_error
 handle_syscall:
@@ -125,12 +124,12 @@ handle_syscall:
   li a1, 1                 # successful exit code
   move a3, a0
   bne a3, a1, exit_error
-  mtpcr a1, tohost         # exit successfully (tohost == 1)
+  csrw tohost, a1          # exit successfully (tohost == 1)
 1:b 1b
 exit_error:
   sll a3, a3, 1
   or  a3, a3, 1
-  mtpcr a3, tohost
+  csrw tohost, a3
 1:b 1b
 
   .bss
diff --git a/benchmarks/common/pcr.h b/benchmarks/common/pcr.h
deleted file mode 100644 (file)
index 8780cdd..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-// See LICENSE for license details.
-
-#ifndef _RISCV_PCR_H
-#define _RISCV_PCR_H
-
-#define SR_S     0x00000001
-#define SR_PS    0x00000002
-#define SR_EI    0x00000004
-#define SR_PEI   0x00000008
-#define SR_EF    0x00000010
-#define SR_U64   0x00000020
-#define SR_S64   0x00000040
-#define SR_VM    0x00000080
-#define SR_EV    0x00000100
-#define SR_IM    0x00FF0000
-#define SR_IP    0xFF000000
-#define SR_ZERO  ~(SR_S|SR_PS|SR_EI|SR_PEI|SR_EF|SR_U64|SR_S64|SR_VM|SR_EV|SR_IM|SR_IP)
-#define SR_IM_SHIFT 16
-#define SR_IP_SHIFT 24
-
-#define PCR_SUP0     0
-#define PCR_SUP1     1
-#define PCR_EPC      2
-#define PCR_BADVADDR 3
-#define PCR_PTBR     4
-#define PCR_ASID     5
-#define PCR_COUNT    6
-#define PCR_COMPARE  7
-#define PCR_EVEC     8
-#define PCR_CAUSE    9
-#define PCR_SR       10
-#define PCR_HARTID   11
-#define PCR_IMPL     12
-#define PCR_FATC     13
-#define PCR_SEND_IPI 14
-#define PCR_CLR_IPI  15
-#define PCR_VECBANK  18
-#define PCR_VECCFG   19
-#define PCR_RESET    29
-#define PCR_TOHOST   30
-#define PCR_FROMHOST 31
-
-#define IRQ_COP   2
-#define IRQ_IPI   5
-#define IRQ_HOST  6
-#define IRQ_TIMER 7
-
-#define IMPL_SPIKE  1
-#define IMPL_ROCKET 2
-
-#define CAUSE_MISALIGNED_FETCH 0
-#define CAUSE_FAULT_FETCH 1
-#define CAUSE_ILLEGAL_INSTRUCTION 2
-#define CAUSE_PRIVILEGED_INSTRUCTION 3
-#define CAUSE_FP_DISABLED 4
-#define CAUSE_SYSCALL 6
-#define CAUSE_BREAKPOINT 7
-#define CAUSE_MISALIGNED_LOAD 8
-#define CAUSE_MISALIGNED_STORE 9
-#define CAUSE_FAULT_LOAD 10
-#define CAUSE_FAULT_STORE 11
-#define CAUSE_VECTOR_DISABLED 12
-#define CAUSE_VECTOR_BANK 13
-
-#define CAUSE_VECTOR_MISALIGNED_FETCH 24
-#define CAUSE_VECTOR_FAULT_FETCH 25
-#define CAUSE_VECTOR_ILLEGAL_INSTRUCTION 26
-#define CAUSE_VECTOR_ILLEGAL_COMMAND 27
-#define CAUSE_VECTOR_MISALIGNED_LOAD 28
-#define CAUSE_VECTOR_MISALIGNED_STORE 29
-#define CAUSE_VECTOR_FAULT_LOAD 30
-#define CAUSE_VECTOR_FAULT_STORE 31
-
-// page table entry (PTE) fields
-#define PTE_V    0x001 // Entry is a page Table descriptor
-#define PTE_T    0x002 // Entry is a page Table, not a terminal node
-#define PTE_G    0x004 // Global
-#define PTE_UR   0x008 // User Write permission
-#define PTE_UW   0x010 // User Read permission
-#define PTE_UX   0x020 // User eXecute permission
-#define PTE_SR   0x040 // Supervisor Read permission
-#define PTE_SW   0x080 // Supervisor Write permission
-#define PTE_SX   0x100 // Supervisor eXecute permission
-#define PTE_PERM (PTE_SR | PTE_SW | PTE_SX | PTE_UR | PTE_UW | PTE_UX)
-
-#ifdef __riscv
-
-#ifdef __riscv64
-# define RISCV_PGLEVELS 3
-# define RISCV_PGSHIFT 13
-#else
-# define RISCV_PGLEVELS 2
-# define RISCV_PGSHIFT 12
-#endif
-#define RISCV_PGLEVEL_BITS 10
-#define RISCV_PGSIZE (1 << RISCV_PGSHIFT)
-
-#ifndef __ASSEMBLER__
-
-#define mtpcr(reg,val) ({ long __tmp = (long)(val), __tmp2; \
-          asm volatile ("mtpcr %0,%1,cr%2" : "=r"(__tmp2) : "r"(__tmp),"i"(reg)); \
-          __tmp2; })
-
-#define mfpcr(reg) ({ long __tmp; \
-          asm volatile ("mfpcr %0,cr%1" : "=r"(__tmp) : "i"(reg)); \
-          __tmp; })
-
-#define setpcr(reg,val) ({ long __tmp; \
-          asm volatile ("setpcr %0,cr%2,%1" : "=r"(__tmp) : "i"(val), "i"(reg)); \
-          __tmp; })
-
-#define clearpcr(reg,val) ({ long __tmp; \
-          asm volatile ("clearpcr %0,cr%2,%1" : "=r"(__tmp) : "i"(val), "i"(reg)); \
-          __tmp; })
-
-#define rdcycle() ({ unsigned long __tmp; \
-          asm volatile ("rdcycle %0" : "=r"(__tmp)); \
-          __tmp; })
-
-#endif
-
-#endif
-
-#endif
index 0c1bc7f6fc9e403ae0c40b0aea41992e16f2e9de..4154ba48d5cb9234ec074bb1d3f02efdac032276 100644 (file)
@@ -2,7 +2,7 @@
 #include <string.h>
 #include <stdarg.h>
 #include <machine/syscall.h>
-#include "pcr.h"
+#include "encoding.h"
 
 void exit(int code)
 {
@@ -10,7 +10,7 @@ void exit(int code)
   magic_mem[0] = SYS_exit;
   magic_mem[1] = code;
   __sync_synchronize();
-  mtpcr(PCR_TOHOST, (long)magic_mem);
+  write_csr(tohost, (long)magic_mem);
   while(1);
 }
 
@@ -22,8 +22,8 @@ void printstr(const char* s)
   magic_mem[2] = (unsigned long)s;
   magic_mem[3] = strlen(s);
   __sync_synchronize();
-  mtpcr(PCR_TOHOST, (long)magic_mem);
-  while(mtpcr(PCR_FROMHOST, 0) == 0);
+  write_csr(tohost, (long)magic_mem);
+  while (swap_csr(fromhost, 0) == 0);
 }
 
 int putchar(int ch)
@@ -42,8 +42,8 @@ int putchar(int ch)
     magic_mem[2] = (long)buf;
     magic_mem[3] = buflen;
     __sync_synchronize();
-    mtpcr(PCR_TOHOST, (long)magic_mem);
-    while(mtpcr(PCR_FROMHOST, 0) == 0);
+    write_csr(tohost, (long)magic_mem);
+    while (swap_csr(fromhost, 0) == 0);
 
     buflen = 0;
   }
index 79d9256a7060c0eedfd2919a2ee815e1155b65b5..10f3169aa5608a074851eeec7b1436682449b9fb 100644 (file)
@@ -51,7 +51,7 @@ void finishTest(int test_result)
           "li a2,0    ;"
           "li a3,0    ;"
           "li v0,%1   ;"
-          "syscall" : : "r"(test_result) , "i"(SYS_exit));
+          "scall" : : "r"(test_result) , "i"(SYS_exit));
    }
 #endif
 }
index 67d6af320abf2b08183a47b9ac5340e55c9fb9cb..77499519c3cc940d8a6a987864f3f6840a77ea29 100644 (file)
@@ -23,7 +23,7 @@ $(mt_matmul_host_bin) : $(mt_matmul_c_src)
 
 mt_matmul_riscv_bin = mt-matmul.riscv
 $(mt_matmul_riscv_bin) : $(mt_matmul_c_objs) $(mt_matmul_riscv_objs)
-       $(RISCV_LINK_MT) $(RISCV_LINK_SYSCALL) $(mt_matmul_c_objs) $(mt_matmul_riscv_objs) -o $(mt_matmul_riscv_bin)
+       $(RISCV_LINK_MT) $(mt_matmul_c_objs) $(mt_matmul_riscv_objs) $(RISCV_LINK_OPTS) -o $(mt_matmul_riscv_bin)
 
 junk += $(mt_matmul_c_objs) $(mt_matmul_riscv_objs) \
         $(mt_matmul_host_bin) $(mt_matmul_riscv_bin)
index 0ab2504089c6ade75a53228de27a646fc465ed5d..1f8b3ed3d3d10285ea3b766add355f7ce80272c9 100644 (file)
@@ -10,6 +10,7 @@
 
 mt_vvadd_c_src = \
        mt-vvadd.c \
+       syscalls.c \
 
 mt_vvadd_riscv_src = \
        crt-mt.S \
@@ -23,7 +24,7 @@ $(mt_vvadd_host_bin) : $(mt_vvadd_c_src)
 
 mt_vvadd_riscv_bin = mt-vvadd.riscv
 $(mt_vvadd_riscv_bin) : $(mt_vvadd_c_objs) $(mt_vvadd_riscv_objs)
-       $(RISCV_LINK_MT) $(RISCV_LINK_SYSCALL) $(mt_vvadd_c_objs) $(mt_vvadd_riscv_objs) -o $(mt_vvadd_riscv_bin)
+       $(RISCV_LINK_MT) $(mt_vvadd_c_objs) $(mt_vvadd_riscv_objs) $(RISCV_LINK_OPTS) -o $(mt_vvadd_riscv_bin)
 
 junk += $(mt_vvadd_c_objs) $(mt_vvadd_riscv_objs) \
         $(mt_vvadd_host_bin) $(mt_vvadd_riscv_bin)
diff --git a/env b/env
index 9c4e0839779f302720173ad063fa25366cef21f7..75d8f53ef210c29495410503529db2ae5c73964d 160000 (submodule)
--- a/env
+++ b/env
@@ -1 +1 @@
-Subproject commit 9c4e0839779f302720173ad063fa25366cef21f7
+Subproject commit 75d8f53ef210c29495410503529db2ae5c73964d