From dd84f5743dd5527f08df7cebb1423149926eacdc Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Tue, 24 Aug 2010 02:22:20 -0700 Subject: [pk] proxy kernel support for mixed 32b/64b operation --- pk/entry.S | 154 +++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 83 insertions(+), 71 deletions(-) (limited to 'pk/entry.S') 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; \ -- cgit v1.1