diff options
author | Andrew Waterman <waterman@s141.Millennium.Berkeley.EDU> | 2010-09-06 22:48:37 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@s141.Millennium.Berkeley.EDU> | 2010-09-06 22:48:37 -0700 |
commit | 2351867c654572283c3c85b84e8f57e0021f9295 (patch) | |
tree | ed7132345aea410b12a8304eb3961eb968be189f /pk | |
parent | fb6dba8fb1ac05bb1fea53cbdaa5d74c0fdb35b3 (diff) | |
download | riscv-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.S | 161 | ||||
-rw-r--r-- | pk/frontend.c | 4 | ||||
-rw-r--r-- | pk/pcr.h | 4 | ||||
-rw-r--r-- | pk/pk.h | 1 |
4 files changed, 96 insertions, 74 deletions
@@ -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]}; @@ -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__ @@ -7,6 +7,7 @@ typedef struct long sr; long epc; long badvaddr; + long cr29; } trapframe_t; #define USER_MEM_SIZE 0x70000000 |