aboutsummaryrefslogtreecommitdiff
path: root/pk
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2010-09-06 22:48:37 -0700
committerAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2010-09-06 22:48:37 -0700
commit2351867c654572283c3c85b84e8f57e0021f9295 (patch)
treeed7132345aea410b12a8304eb3961eb968be189f /pk
parentfb6dba8fb1ac05bb1fea53cbdaa5d74c0fdb35b3 (diff)
downloadriscv-pk-2351867c654572283c3c85b84e8f57e0021f9295.zip
riscv-pk-2351867c654572283c3c85b84e8f57e0021f9295.tar.gz
riscv-pk-2351867c654572283c3c85b84e8f57e0021f9295.tar.bz2
[sim, xcc] added PCRs to replace k0 and k1
Diffstat (limited to 'pk')
-rw-r--r--pk/entry.S161
-rw-r--r--pk/frontend.c4
-rw-r--r--pk/pcr.h4
-rw-r--r--pk/pk.h1
4 files changed, 96 insertions, 74 deletions
diff --git a/pk/entry.S b/pk/entry.S
index 8e85a81..91a1e2a 100644
--- a/pk/entry.S
+++ b/pk/entry.S
@@ -16,43 +16,49 @@
save_tf: # write the trap frame onto the stack
# save gprs
- STORE $1,1*REGBYTES($k1)
- STORE $2,2*REGBYTES($k1)
- STORE $3,3*REGBYTES($k1)
- STORE $4,4*REGBYTES($k1)
- STORE $5,5*REGBYTES($k1)
- STORE $6,6*REGBYTES($k1)
- STORE $7,7*REGBYTES($k1)
- STORE $8,8*REGBYTES($k1)
- STORE $9,9*REGBYTES($k1)
- STORE $10,10*REGBYTES($k1)
- STORE $11,11*REGBYTES($k1)
- STORE $12,12*REGBYTES($k1)
- STORE $13,13*REGBYTES($k1)
- STORE $14,14*REGBYTES($k1)
- STORE $15,15*REGBYTES($k1)
- STORE $16,16*REGBYTES($k1)
- STORE $17,17*REGBYTES($k1)
- STORE $18,18*REGBYTES($k1)
- STORE $19,19*REGBYTES($k1)
- STORE $20,20*REGBYTES($k1)
- STORE $21,21*REGBYTES($k1)
- STORE $22,22*REGBYTES($k1)
- STORE $23,23*REGBYTES($k1)
- STORE $24,24*REGBYTES($k1)
- STORE $25,25*REGBYTES($k1)
- STORE $28,28*REGBYTES($k1)
- STORE $29,29*REGBYTES($k1)
- STORE $30,30*REGBYTES($k1)
- STORE $k0,31*REGBYTES($k1) # $ra is actually in $k0
+ STORE $2,2*REGBYTES($1)
+ mfpcr $2,$PCR_K1
+ STORE $2,1*REGBYTES($1) # $x1 is actually in $PCR_K1
+ STORE $3,3*REGBYTES($1)
+ STORE $4,4*REGBYTES($1)
+ STORE $5,5*REGBYTES($1)
+ STORE $6,6*REGBYTES($1)
+ STORE $7,7*REGBYTES($1)
+ STORE $8,8*REGBYTES($1)
+ STORE $9,9*REGBYTES($1)
+ STORE $10,10*REGBYTES($1)
+ STORE $11,11*REGBYTES($1)
+ STORE $12,12*REGBYTES($1)
+ STORE $13,13*REGBYTES($1)
+ STORE $14,14*REGBYTES($1)
+ STORE $15,15*REGBYTES($1)
+ STORE $16,16*REGBYTES($1)
+ STORE $17,17*REGBYTES($1)
+ STORE $18,18*REGBYTES($1)
+ STORE $19,19*REGBYTES($1)
+ STORE $20,20*REGBYTES($1)
+ STORE $21,21*REGBYTES($1)
+ STORE $22,22*REGBYTES($1)
+ STORE $23,23*REGBYTES($1)
+ STORE $24,24*REGBYTES($1)
+ STORE $25,25*REGBYTES($1)
+ STORE $26,26*REGBYTES($1)
+ STORE $27,27*REGBYTES($1)
+ STORE $28,28*REGBYTES($1)
+ STORE $29,29*REGBYTES($1)
+ STORE $30,30*REGBYTES($1)
+ mfpcr $2,$PCR_K0
+ STORE $2,31*REGBYTES($1) # $ra is actually in $PCR_K0
- # get sr, epc, badvaddr
- mfpcr $t0,$PCR_SR # sr
- STORE $t0,32*REGBYTES($k1)
- mfpcr $t0,$PCR_EPC # epc
- STORE $t0,33*REGBYTES($k1)
- mfpcr $t0,$PCR_BADVADDR # badvaddr
- STORE $t0,34*REGBYTES($k1)
+ # get sr, epc, badvaddr, cr29 (tid)
+ mfpcr $2,$PCR_SR # sr
+ STORE $2,32*REGBYTES($1)
+ mfpcr $2,$PCR_EPC # epc
+ STORE $2,33*REGBYTES($1)
+ mfpcr $2,$PCR_BADVADDR # badvaddr
+ STORE $2,34*REGBYTES($1)
+ mfcr $2,$29 # cr29 (tid)
+ STORE $2,35*REGBYTES($1)
jr $ra
.end save_tf
@@ -63,40 +69,50 @@ pop_tf: # write the trap frame onto the stack
LOAD $t0,32*REGBYTES($a0) # restore sr (should disable interrupts)
mtpcr $t0,$PCR_SR
- move $k0,$a0
- LOAD $1,1*REGBYTES($k0)
- LOAD $2,2*REGBYTES($k0)
- LOAD $3,3*REGBYTES($k0)
- LOAD $4,4*REGBYTES($k0)
- LOAD $5,5*REGBYTES($k0)
- LOAD $6,6*REGBYTES($k0)
- LOAD $7,7*REGBYTES($k0)
- LOAD $8,8*REGBYTES($k0)
- LOAD $9,9*REGBYTES($k0)
- LOAD $10,10*REGBYTES($k0)
- LOAD $11,11*REGBYTES($k0)
- LOAD $12,12*REGBYTES($k0)
- LOAD $13,13*REGBYTES($k0)
- LOAD $14,14*REGBYTES($k0)
- LOAD $15,15*REGBYTES($k0)
- LOAD $16,16*REGBYTES($k0)
- LOAD $17,17*REGBYTES($k0)
- LOAD $18,18*REGBYTES($k0)
- LOAD $19,19*REGBYTES($k0)
- LOAD $20,20*REGBYTES($k0)
- LOAD $21,21*REGBYTES($k0)
- LOAD $22,22*REGBYTES($k0)
- LOAD $23,23*REGBYTES($k0)
- LOAD $24,24*REGBYTES($k0)
- LOAD $25,25*REGBYTES($k0)
- LOAD $28,28*REGBYTES($k0)
- LOAD $29,29*REGBYTES($k0)
- LOAD $30,30*REGBYTES($k0)
- LOAD $31,31*REGBYTES($k0)
+ LOAD $1,1*REGBYTES($a0)
+ mtpcr $1,$PCR_K0
+ LOAD $1,2*REGBYTES($a0)
+ mtpcr $1,$PCR_K1
+ move $1,$a0
+ LOAD $3,3*REGBYTES($1)
+ LOAD $4,4*REGBYTES($1)
+ LOAD $5,5*REGBYTES($1)
+ LOAD $6,6*REGBYTES($1)
+ LOAD $7,7*REGBYTES($1)
+ LOAD $8,8*REGBYTES($1)
+ LOAD $9,9*REGBYTES($1)
+ LOAD $10,10*REGBYTES($1)
+ LOAD $11,11*REGBYTES($1)
+ LOAD $12,12*REGBYTES($1)
+ LOAD $13,13*REGBYTES($1)
+ LOAD $14,14*REGBYTES($1)
+ LOAD $15,15*REGBYTES($1)
+ LOAD $16,16*REGBYTES($1)
+ LOAD $17,17*REGBYTES($1)
+ LOAD $18,18*REGBYTES($1)
+ LOAD $19,19*REGBYTES($1)
+ LOAD $20,20*REGBYTES($1)
+ LOAD $21,21*REGBYTES($1)
+ LOAD $22,22*REGBYTES($1)
+ LOAD $23,23*REGBYTES($1)
+ LOAD $24,24*REGBYTES($1)
+ LOAD $25,25*REGBYTES($1)
+ LOAD $26,26*REGBYTES($1)
+ LOAD $27,27*REGBYTES($1)
+ LOAD $28,28*REGBYTES($1)
+ LOAD $29,29*REGBYTES($1)
+ LOAD $30,30*REGBYTES($1)
+ LOAD $31,31*REGBYTES($1)
+
+ # restore cr29 (tid)
+ LOAD $2,35*REGBYTES($1)
+ mtcr $2,$29
# gtfo!
- LOAD $k0,33*REGBYTES($k0)
- mtpcr $k0,$PCR_EPC
+ LOAD $2,33*REGBYTES($1)
+ mtpcr $2,$PCR_EPC
+ mfpcr $1,$PCR_K0
+ mfpcr $2,$PCR_K1
eret
.end pop_tf
@@ -104,11 +120,12 @@ pop_tf: # write the trap frame onto the stack
#define TRAP_TABLE_ENTRY(x) \
.align 7; \
- law $k1,stack_top-320; \
- move $k0,$ra; \
+ mtpcr $ra,$PCR_K0; \
+ mtpcr $1,$PCR_K1; \
+ law $1,stack_top-320; \
jal save_tf; \
- move $sp,$k1; \
- move $a0,$k1; \
+ move $sp,$1; \
+ move $a0,$1; \
ei; \
jal x; \
unimp
diff --git a/pk/frontend.c b/pk/frontend.c
index f02ed0d..c28dca4 100644
--- a/pk/frontend.c
+++ b/pk/frontend.c
@@ -17,8 +17,8 @@ sysret_t frontend_syscall(long n, long a0, long a1, long a2, long a3)
magic_mem[3] = a2;
magic_mem[4] = a3;
- mtpcr(magic_mem,16);
- while(mfpcr(17) == 0);
+ mtpcr(magic_mem,PCR_TOHOST);
+ while(mfpcr(PCR_FROMHOST) == 0);
sysret_t ret = {magic_mem[0],magic_mem[1]};
diff --git a/pk/pcr.h b/pk/pcr.h
index 4137dcd..402989e 100644
--- a/pk/pcr.h
+++ b/pk/pcr.h
@@ -15,6 +15,10 @@
#define PCR_EPC 1
#define PCR_BADVADDR 2
#define PCR_TBR 3
+#define PCR_TOHOST 16
+#define PCR_FROMHOST 17
+#define PCR_K0 24
+#define PCR_K1 25
#ifndef __ASSEMBLER__
diff --git a/pk/pk.h b/pk/pk.h
index dfe68f7..c164306 100644
--- a/pk/pk.h
+++ b/pk/pk.h
@@ -7,6 +7,7 @@ typedef struct
long sr;
long epc;
long badvaddr;
+ long cr29;
} trapframe_t;
#define USER_MEM_SIZE 0x70000000