summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYunsup Lee <yunsup@cs.berkeley.edu>2015-03-16 02:09:10 -0700
committerYunsup Lee <yunsup@cs.berkeley.edu>2015-03-16 02:09:10 -0700
commitbe6511639c2d9291e9050682c4d7ce3e7042d061 (patch)
tree525ce2fef82e9a0c5bbdd52066e57f3cc4f843f9
parent4ea6feac5fe663fe82de53632883ced6205f57f8 (diff)
downloadenv-be6511639c2d9291e9050682c4d7ce3e7042d061.zip
env-be6511639c2d9291e9050682c4d7ce3e7042d061.tar.gz
env-be6511639c2d9291e9050682c4d7ce3e7042d061.tar.bz2
clean up pt and vector environments
-rw-r--r--p/riscv_test.h20
-rw-r--r--pt/link.ld2
-rw-r--r--pt/riscv_test.h308
-rw-r--r--v/entry.S1
-rw-r--r--v/riscv_test.h6
-rw-r--r--v/vm.c4
6 files changed, 166 insertions, 175 deletions
diff --git a/p/riscv_test.h b/p/riscv_test.h
index 0c677f7..bea9b3a 100644
--- a/p/riscv_test.h
+++ b/p/riscv_test.h
@@ -53,6 +53,12 @@
RVTEST_ENABLE_SUPERVISOR; \
.endm
+#define RVTEST_RV64SV \
+ .macro init; \
+ RVTEST_ENABLE_SUPERVISOR; \
+ RVTEST_VEC_ENABLE; \
+ .endm
+
#define RVTEST_RV32M \
.macro init; \
RVTEST_ENABLE_MACHINE; \
@@ -91,9 +97,9 @@
2:fssr x0; \
#define RVTEST_VEC_ENABLE \
- li a0, SSSTATUS_XS & (SSTATUS_XS >> 1); \
- csrs status, a0; \
- csrr a1, status; \
+ li a0, SSTATUS_XS & (SSTATUS_XS >> 1); \
+ csrs sstatus, a0; \
+ csrr a1, sstatus; \
and a0, a0, a1; \
bnez a0, 2f; \
RVTEST_PASS; \
@@ -103,6 +109,10 @@
csrr a0, hartid; \
1: bnez a0, 1b
+#define EXTRA_TVEC_USER
+#define EXTRA_TVEC_SUPERVISOR
+#define EXTRA_TVEC_HYPERVISOR
+#define EXTRA_TVEC_MACHINE
#define EXTRA_INIT
#define EXTRA_INIT_TIMER
@@ -110,6 +120,7 @@
.text; \
.align 6; \
tvec_user: \
+ EXTRA_TVEC_USER; \
la t5, hcall; \
csrr t6, mepc; \
beq t5, t6, write_tohost; \
@@ -122,14 +133,17 @@ tvec_user: \
2: mrts; \
.align 6; \
tvec_supervisor: \
+ EXTRA_TVEC_SUPERVISOR; \
csrr t5, mcause; \
bgez t5, tvec_user; \
mrts; \
.align 6; \
tvec_hypervisor: \
+ EXTRA_TVEC_HYPERVISOR; \
RVTEST_FAIL; /* no hypervisor */ \
.align 6; \
tvec_machine: \
+ EXTRA_TVEC_MACHINE; \
.weak mtvec; \
la t5, hcall; \
csrr t6, mepc; \
diff --git a/pt/link.ld b/pt/link.ld
index 6b19389..694e906 100644
--- a/pt/link.ld
+++ b/pt/link.ld
@@ -26,7 +26,7 @@ SECTIONS
{
/* text: test code section */
- . = 0x00002000;
+ . = 0;
.text :
{
*(.text)
diff --git a/pt/riscv_test.h b/pt/riscv_test.h
index 31ff773..cdca2cf 100644
--- a/pt/riscv_test.h
+++ b/pt/riscv_test.h
@@ -5,179 +5,157 @@
#include "../p/riscv_test.h"
+#define TIMER_INTERVAL 100
+
+#undef EXTRA_TVEC_USER
+#define EXTRA_TVEC_USER \
+ csrw mscratch, a0; \
+ csrr a0, mcause; \
+ bltz a0, _interrupt_handler; \
+_skip: \
+
#undef EXTRA_INIT_TIMER
#define EXTRA_INIT_TIMER \
- ENABLE_TIMER_INTERRUPT; \
- j 6f; \
- XCPT_HANDLER; \
-6:
+ ENABLE_TIMER_INTERRUPT; \
+ j _jump_around_interrupt_handler; \
+ INTERRUPT_HANDLER; \
+_jump_around_interrupt_handler: \
-//-----------------------------------------------------------------------
-// Data Section Macro
-//-----------------------------------------------------------------------
+#define ENABLE_TIMER_INTERRUPT \
+ li a0, MSTATUS_STIE; \
+ csrs mstatus, a0; \
+ csrr a0, scycle; \
+ addi a0, a0, TIMER_INTERVAL; \
+ csrw stimecmp, a0; \
-#undef EXTRA_DATA
-#define EXTRA_DATA \
- .align 3; \
-regspill: \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
- .dword 0xdeadbeefcafebabe; \
-evac: \
- .skip 32768; \
+#define INTERRUPT_HANDLER \
+_interrupt_handler: \
+ slli a0, a0, 1; \
+ srli a0, a0, 1; \
+ add a0, a0, -IRQ_TIMER; \
+ bnez a0, _skip; \
+ csrw sscratch, a1; \
+ li a1, SSTATUS_XS; \
+ csrr a0, sstatus; \
+ and a0, a0, a1; \
+ beqz a0, _skip_vector_restore; \
+ VECTOR_RESTORE; \
+_skip_vector_restore: \
+ csrr a1, sscratch; \
+ csrr a0, scycle; \
+ addi a0, a0, TIMER_INTERVAL; \
+ csrw stimecmp, a0; \
+ csrr a0, mscratch; \
+ mret; \
-//-----------------------------------------------------------------------
-// Misc
-//-----------------------------------------------------------------------
+#ifdef __riscv64
-#define ENABLE_TIMER_INTERRUPT \
- csrw clear_ipi,x0; \
- csrr a0,status; \
- li a1,SR_IM; \
- or a0,a0,a1; \
- csrw status,a0; \
- la a0,_handler; \
- csrw evec,a0; \
- csrw count,x0; \
- addi a0,x0,100; \
- csrw compare,a0; \
- csrs status,SR_EI; \
+#define VECTOR_RESTORE \
+_vector_restore: \
+ la a0,regspill; \
+ sd a2,0(a0); \
+ sd a3,8(a0); \
+ sd a4,16(a0); \
+ sd a5,24(a0); \
+ sd a6,32(a0); \
+ sd a7,40(a0); \
+ vgetcfg a6; \
+ vgetvl a7; \
+ la a0,evac; \
+ vxcptevac a0; \
+ vsetcfg a6; \
+ vsetvl a7,a7; \
+ vxcpthold a0; \
+ li a5,0; \
+_handler_loop: \
+ ld a1,0(a0); \
+ addi a0,a0,8; \
+ blt a1,x0,_done; \
+ srli a2,a1,32; \
+ andi a2,a2,0x1; \
+ beq a2,x0,_vcnt; \
+_vcmd: \
+ beq a5,x0,_vcmd_skip; \
+ venqcmd a4,a3; \
+_vcmd_skip: \
+ li a5,1; \
+ move a4,a1; \
+ srli a3,a4,36; \
+ andi a3,a3,0x1; \
+_vimm1: \
+ srli a2,a4,35; \
+ andi a2,a2,0x1; \
+ beq a2,x0,_vimm2; \
+ ld a1,0(a0); \
+ addi a0,a0,8; \
+ venqimm1 a1,a3; \
+_vimm2: \
+ srli a2,a4,34; \
+ andi a2,a2,0x1; \
+ beq a2,x0,_end; \
+ ld a1,0(a0); \
+ addi a0,a0,8; \
+ venqimm2 a1,a3; \
+ j _end; \
+_vcnt: \
+ ld a2,0(a0); \
+ srli a2,a2,31; \
+ andi a2,a2,0x2; \
+ or a3,a3,a2; \
+ venqcnt a1,a3; \
+_end: \
+ j _handler_loop; \
+_done: \
+ beq a5,x0,_done_skip; \
+ venqcmd a4,a3; \
+_done_skip: \
+ la a0,regspill; \
+ ld a2,0(a0); \
+ ld a3,8(a0); \
+ ld a4,16(a0); \
+ ld a5,24(a0); \
+ ld a6,32(a0); \
+ ld a7,40(a0); \
-#define XCPT_HANDLER \
-_handler: \
- csrw sup0,a0; \
- csrw sup1,a1; \
- csrr a0,cause; \
- li a1,CAUSE_SYSCALL; \
- bne a0,a1,_cont; \
- li a1,1; \
- bne x27,a1,_fail; \
-_pass: \
- fence; \
- csrw tohost, 1; \
-1: j 1b; \
-_fail: \
- fence; \
- beqz TESTNUM, 1f; \
- sll TESTNUM, TESTNUM, 1; \
- or TESTNUM, TESTNUM, 1; \
- csrw tohost, TESTNUM; \
-1: j 1b; \
-_cont: \
- csrr a0,impl; \
- li a1,IMPL_ROCKET; \
- beq a0,a1,_rocket_handler; \
- vxcptcause x0; \
- la a0,evac; \
- vxcptsave a0; \
- vxcptrestore a0; \
- j _exit; \
- \
-_rocket_handler: \
- la a0,regspill; \
- sd a2,0(a0); \
- sd a3,8(a0); \
- sd a4,16(a0); \
- sd a5,24(a0); \
- sd s0,32(a0); \
- sd s1,40(a0); \
- vgetcfg s0; \
- vgetvl s1; \
- la a0,evac; \
- vxcptevac a0; \
- vsetcfg s0; \
- vsetvl s1,s1; \
- vxcpthold; \
- li a5,0; \
-_handler_loop: \
- ld a1,0(a0); \
- addi a0,a0,8; \
- blt a1,x0,_done; \
- srli a2,a1,32; \
- andi a2,a2,0x1; \
- beq a2,x0,_vcnt; \
-_vcmd: \
- beq a5,x0,_vcmd_skip; \
- venqcmd a4,a3; \
-_vcmd_skip: \
- li a5,1; \
- move a4,a1; \
- srli a3,a4,36; \
- andi a3,a3,0x1; \
-_vimm1: \
- srli a2,a4,35; \
- andi a2,a2,0x1; \
- beq a2,x0,_vimm2; \
- ld a1,0(a0); \
- addi a0,a0,8; \
- venqimm1 a1,a3; \
-_vimm2: \
- srli a2,a4,34; \
- andi a2,a2,0x1; \
- beq a2,x0,_end; \
- ld a1,0(a0); \
- addi a0,a0,8; \
- venqimm2 a1,a3; \
- j _end; \
-_vcnt: \
- ld a2,0(a0); \
- srli a2,a2,31; \
- andi a2,a2,0x2; \
- or a3,a3,a2; \
- venqcnt a1,a3; \
-_end: \
- j _handler_loop; \
-_done: \
- beq a5,x0,_done_skip; \
- venqcmd a4,a3; \
-_done_skip: \
- la a0,regspill; \
- ld a2,0(a0); \
- ld a3,8(a0); \
- ld a4,16(a0); \
- ld a5,24(a0); \
- ld s0,32(a0); \
- ld s1,40(a0); \
- \
-_exit: \
- csrs status,SR_PEI; \
- csrc status,SR_PS; \
- csrr a0,count; \
- addi a0,a0,100; \
- csrw compare,a0; \
- csrr a0,sup0; \
- csrr a1,sup1; \
- sret; \
+#else
-#undef RVTEST_PASS
-#define RVTEST_PASS \
- li x27, 1; \
- scall; \
+#define VECTOR_RESTORE
-#undef RVTEST_FAIL
-#define RVTEST_FAIL \
- li x27,2; \
- scall; \
+#endif
+
+//-----------------------------------------------------------------------
+// Data Section Macro
+//-----------------------------------------------------------------------
+
+#undef EXTRA_DATA
+#define EXTRA_DATA \
+ .align 3; \
+regspill: \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+ .dword 0xdeadbeefcafebabe; \
+evac: \
+ .skip 32768; \
#endif
diff --git a/v/entry.S b/v/entry.S
index 68c0f0a..c3c884d 100644
--- a/v/entry.S
+++ b/v/entry.S
@@ -145,7 +145,6 @@ trap_entry:
# disable saving vector state for now
addi t0,sp,SIZEOF_TRAPFRAME_T_SCALAR
- # rocket currently doesn't support vxcptsave/vxcptrestore natively
vgetcfg x4
STORE x4,0*REGBYTES(t0)
vgetvl x4
diff --git a/v/riscv_test.h b/v/riscv_test.h
index 30dd124..e076794 100644
--- a/v/riscv_test.h
+++ b/v/riscv_test.h
@@ -14,7 +14,7 @@
#undef RVTEST_RV64UV
#define RVTEST_RV64UV \
- RVTEST_RV64UF
+ RVTEST_RV64UF
#undef RVTEST_CODE_BEGIN
#define RVTEST_CODE_BEGIN \
@@ -60,8 +60,8 @@ userstart: \
#define vxcptkill() ({ \
asm volatile ("vxcptkill"); })
-#define vxcpthold() ({ \
- asm volatile ("vxcpthold"); })
+#define vxcpthold(addr) ({ \
+ asm volatile ("vxcpthold %0" : : "r"(addr)); })
#define venqcmd(bits, pf) ({ \
asm volatile ("venqcmd %0,%1" : : "r"(bits), "r"(pf)); })
diff --git a/v/vm.c b/v/vm.c
index a085577..7880b88 100644
--- a/v/vm.c
+++ b/v/vm.c
@@ -110,7 +110,7 @@ static void do_vxcptrestore(long* where)
vsetcfg(where[0]);
vsetvl(where[1]);
- vxcpthold();
+ vxcpthold(&where[2]);
int idx = 2;
long dword, cmd, pf;
@@ -216,7 +216,7 @@ void vm_boot(long test_addr, long seed)
l1pt[0] = (pte_t)l2pt | PTE_V | PTE_T;
l2pt[0] = (pte_t)l3pt | PTE_V | PTE_T;
write_csr(sptbr, l1pt);
- set_csr(mstatus, MSTATUS_IE1 | MSTATUS_FS /* | MSTATUS_XS */ | MSTATUS_MPRV);
+ set_csr(mstatus, MSTATUS_IE1 | MSTATUS_FS | MSTATUS_XS | MSTATUS_MPRV);
clear_csr(mstatus, MSTATUS_VM | MSTATUS_UA | MSTATUS_PRV1);
set_csr(mstatus, (long)VM_SV43 << __builtin_ctzl(MSTATUS_VM));
set_csr(mstatus, (long)UA_RV64 << __builtin_ctzl(MSTATUS_UA));