aboutsummaryrefslogtreecommitdiff
path: root/pk/entry.S
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2010-08-24 02:22:20 -0700
committerAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2010-08-24 02:22:20 -0700
commitdd84f5743dd5527f08df7cebb1423149926eacdc (patch)
tree75f46a739d8f10d5864669bde6b7403a15adace3 /pk/entry.S
parent049091755596801479538bcc4722bc2810471aa0 (diff)
downloadriscv-pk-dd84f5743dd5527f08df7cebb1423149926eacdc.zip
riscv-pk-dd84f5743dd5527f08df7cebb1423149926eacdc.tar.gz
riscv-pk-dd84f5743dd5527f08df7cebb1423149926eacdc.tar.bz2
[pk] proxy kernel support for mixed 32b/64b operation
Diffstat (limited to 'pk/entry.S')
-rw-r--r--pk/entry.S154
1 files changed, 83 insertions, 71 deletions
diff --git a/pk/entry.S b/pk/entry.S
index b52ff15..8e85a81 100644
--- a/pk/entry.S
+++ b/pk/entry.S
@@ -1,44 +1,58 @@
+#include "pcr.h"
+
+#ifdef PK_ENABLE_KERNEL_64BIT
+# define STORE sd
+# define LOAD ld
+# define REGBYTES 8
+#else
+# define STORE sw
+# define LOAD lw
+# define REGBYTES 4
+#endif
+
.text
.set noat
.ent save_tf
save_tf: # write the trap frame onto the stack
+
# save gprs
- sd $1,8($k1)
- sd $2,16($k1)
- sd $3,24($k1)
- sd $4,32($k1)
- sd $5,40($k1)
- sd $6,48($k1)
- sd $7,56($k1)
- sd $8,64($k1)
- sd $9,72($k1)
- sd $10,80($k1)
- sd $11,88($k1)
- sd $12,96($k1)
- sd $13,104($k1)
- sd $14,112($k1)
- sd $15,120($k1)
- sd $16,128($k1)
- sd $17,136($k1)
- sd $18,144($k1)
- sd $19,152($k1)
- sd $20,160($k1)
- sd $21,168($k1)
- sd $22,176($k1)
- sd $23,184($k1)
- sd $24,192($k1)
- sd $25,200($k1)
- sd $28,224($k1)
- sd $29,232($k1)
- sd $30,240($k1)
- sd $k0,248($k1) # $ra is actually in $k0
+ 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
+
# get sr, epc, badvaddr
- mfpcr $t0,$0 # sr
- sd $t0,256($k1)
- mfpcr $t0,$1 # epc
- sd $t0,264($k1)
- mfpcr $t0,$2 # badvaddr
- sd $t0,272($k1)
+ 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)
jr $ra
.end save_tf
@@ -46,43 +60,43 @@ save_tf: # write the trap frame onto the stack
.ent pop_tf
pop_tf: # write the trap frame onto the stack
# restore gprs
- ld $t0,256($a0) # restore sr, which should disable interrupts
- mtpcr $t0,$0
+ LOAD $t0,32*REGBYTES($a0) # restore sr (should disable interrupts)
+ mtpcr $t0,$PCR_SR
move $k0,$a0
- ld $1,8($k0)
- ld $2,16($k0)
- ld $3,24($k0)
- ld $4,32($k0)
- ld $5,40($k0)
- ld $6,48($k0)
- ld $7,56($k0)
- ld $8,64($k0)
- ld $9,72($k0)
- ld $10,80($k0)
- ld $11,88($k0)
- ld $12,96($k0)
- ld $13,104($k0)
- ld $14,112($k0)
- ld $15,120($k0)
- ld $16,128($k0)
- ld $17,136($k0)
- ld $18,144($k0)
- ld $19,152($k0)
- ld $20,160($k0)
- ld $21,168($k0)
- ld $22,176($k0)
- ld $23,184($k0)
- ld $24,192($k0)
- ld $25,200($k0)
- ld $28,224($k0)
- ld $29,232($k0)
- ld $30,240($k0)
- ld $31,248($k0)
+ 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)
# gtfo!
- ld $k0,264($k0)
- mtpcr $k0,$1
+ LOAD $k0,33*REGBYTES($k0)
+ mtpcr $k0,$PCR_EPC
eret
.end pop_tf
@@ -90,9 +104,7 @@ pop_tf: # write the trap frame onto the stack
#define TRAP_TABLE_ENTRY(x) \
.align 7; \
- .set at=$k0; \
- la $k1,stack_top-320; \
- .set noat; \
+ law $k1,stack_top-320; \
move $k0,$ra; \
jal save_tf; \
move $sp,$k1; \