Browse Source

[sim, xcc] added PCRs to replace k0 and k1

cs250
Andrew Waterman 16 years ago
parent
commit
2351867c65
  1. 161
      pk/entry.S
  2. 4
      pk/frontend.c
  3. 4
      pk/pcr.h
  4. 1
      pk/pk.h

161
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

4
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]};

4
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__

1
pk/pk.h

@ -7,6 +7,7 @@ typedef struct
long sr;
long epc;
long badvaddr;
long cr29;
} trapframe_t;
#define USER_MEM_SIZE 0x70000000

Loading…
Cancel
Save