summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2013-04-25 17:23:54 +0000
committerimp <imp@FreeBSD.org>2013-04-25 17:23:54 +0000
commita3c707ad59a7be3293252c706093499ecdefbf46 (patch)
tree81ea734f4cbff329130d280235382cd503da4119
parente31cb18360919b0c74c607ca1d3983020b8e033f (diff)
downloadFreeBSD-src-a3c707ad59a7be3293252c706093499ecdefbf46.zip
FreeBSD-src-a3c707ad59a7be3293252c706093499ecdefbf46.tar.gz
Use the offsets from pcb.h rather than regnum.h to store the registers
in the pcb. setjmp/longjmp in the kernel also used these values, so continue to use them although their use isn't technically the pcb register array (matching is all that's important for setjmp/longjmp in the kernel). Finally, eliminate the old register names from regnum.h. This is a lexical change only. The non-debug .o files have the same md5.
-rw-r--r--sys/mips/include/regnum.h18
-rw-r--r--sys/mips/mips/support.S49
-rw-r--r--sys/mips/mips/swtch.S85
3 files changed, 68 insertions, 84 deletions
diff --git a/sys/mips/include/regnum.h b/sys/mips/include/regnum.h
index 67538e5..829ca46 100644
--- a/sys/mips/include/regnum.h
+++ b/sys/mips/include/regnum.h
@@ -43,24 +43,6 @@
#define _MACHINE_REGNUM_H_
/*
- * This must match the numbers in pcb.h and is used by swtch.S
- */
-#define PREG_S0 0
-#define PREG_S1 1
-#define PREG_S2 2
-#define PREG_S3 3
-#define PREG_S4 4
-#define PREG_S5 5
-#define PREG_S6 6
-#define PREG_S7 7
-#define PREG_SP 8
-#define PREG_S8 9
-#define PREG_RA 10
-#define PREG_SR 11
-#define PREG_GP 12
-#define PREG_PC 13
-
-/*
* Location of the saved registers relative to ZERO.
* This must match struct trapframe defined in frame.h exactly.
* This must also match regdef.h.
diff --git a/sys/mips/mips/support.S b/sys/mips/mips/support.S
index 8bce22f..7acebf0 100644
--- a/sys/mips/mips/support.S
+++ b/sys/mips/mips/support.S
@@ -92,6 +92,7 @@
#include <machine/cpu.h>
#include <machine/regnum.h>
#include <machine/cpuregs.h>
+#include <machine/pcb.h>
#include "assym.s"
@@ -1079,35 +1080,35 @@ END(breakpoint)
LEAF(setjmp)
mfc0 v0, MIPS_COP_0_STATUS # Later the "real" spl value!
- REG_S s0, (SZREG * PREG_S0)(a0)
- REG_S s1, (SZREG * PREG_S1)(a0)
- REG_S s2, (SZREG * PREG_S2)(a0)
- REG_S s3, (SZREG * PREG_S3)(a0)
- REG_S s4, (SZREG * PREG_S4)(a0)
- REG_S s5, (SZREG * PREG_S5)(a0)
- REG_S s6, (SZREG * PREG_S6)(a0)
- REG_S s7, (SZREG * PREG_S7)(a0)
- REG_S s8, (SZREG * PREG_S8)(a0)
- REG_S sp, (SZREG * PREG_SP)(a0)
- REG_S ra, (SZREG * PREG_RA)(a0)
- REG_S v0, (SZREG * PREG_SR)(a0)
+ REG_S s0, (SZREG * PCB_REG_S0)(a0)
+ REG_S s1, (SZREG * PCB_REG_S1)(a0)
+ REG_S s2, (SZREG * PCB_REG_S2)(a0)
+ REG_S s3, (SZREG * PCB_REG_S3)(a0)
+ REG_S s4, (SZREG * PCB_REG_S4)(a0)
+ REG_S s5, (SZREG * PCB_REG_S5)(a0)
+ REG_S s6, (SZREG * PCB_REG_S6)(a0)
+ REG_S s7, (SZREG * PCB_REG_S7)(a0)
+ REG_S s8, (SZREG * PCB_REG_S8)(a0)
+ REG_S sp, (SZREG * PCB_REG_SP)(a0)
+ REG_S ra, (SZREG * PCB_REG_RA)(a0)
+ REG_S v0, (SZREG * PCB_REG_SR)(a0)
jr ra
li v0, 0 # setjmp return
END(setjmp)
LEAF(longjmp)
- REG_L v0, (SZREG * PREG_SR)(a0)
- REG_L ra, (SZREG * PREG_RA)(a0)
- REG_L s0, (SZREG * PREG_S0)(a0)
- REG_L s1, (SZREG * PREG_S1)(a0)
- REG_L s2, (SZREG * PREG_S2)(a0)
- REG_L s3, (SZREG * PREG_S3)(a0)
- REG_L s4, (SZREG * PREG_S4)(a0)
- REG_L s5, (SZREG * PREG_S5)(a0)
- REG_L s6, (SZREG * PREG_S6)(a0)
- REG_L s7, (SZREG * PREG_S7)(a0)
- REG_L s8, (SZREG * PREG_S8)(a0)
- REG_L sp, (SZREG * PREG_SP)(a0)
+ REG_L v0, (SZREG * PCB_REG_SR)(a0)
+ REG_L ra, (SZREG * PCB_REG_RA)(a0)
+ REG_L s0, (SZREG * PCB_REG_S0)(a0)
+ REG_L s1, (SZREG * PCB_REG_S1)(a0)
+ REG_L s2, (SZREG * PCB_REG_S2)(a0)
+ REG_L s3, (SZREG * PCB_REG_S3)(a0)
+ REG_L s4, (SZREG * PCB_REG_S4)(a0)
+ REG_L s5, (SZREG * PCB_REG_S5)(a0)
+ REG_L s6, (SZREG * PCB_REG_S6)(a0)
+ REG_L s7, (SZREG * PCB_REG_S7)(a0)
+ REG_L s8, (SZREG * PCB_REG_S8)(a0)
+ REG_L sp, (SZREG * PCB_REG_SP)(a0)
mtc0 v0, MIPS_COP_0_STATUS # Later the "real" spl value!
ITLBNOPFIX
jr ra
diff --git a/sys/mips/mips/swtch.S b/sys/mips/mips/swtch.S
index 3487a9d..8fd9c82 100644
--- a/sys/mips/mips/swtch.S
+++ b/sys/mips/mips/swtch.S
@@ -62,6 +62,7 @@
#include <machine/cpuregs.h>
#include <machine/regnum.h>
#include <machine/pte.h>
+#include <machine/pcb.h>
#include "assym.s"
@@ -173,26 +174,26 @@ END(fork_trampoline)
* savectx(struct pcb *pcbp);
*/
LEAF(savectx)
- SAVE_U_PCB_CONTEXT(s0, PREG_S0, a0)
- SAVE_U_PCB_CONTEXT(s1, PREG_S1, a0)
- SAVE_U_PCB_CONTEXT(s2, PREG_S2, a0)
- SAVE_U_PCB_CONTEXT(s3, PREG_S3, a0)
+ SAVE_U_PCB_CONTEXT(s0, PCB_REG_S0, a0)
+ SAVE_U_PCB_CONTEXT(s1, PCB_REG_S1, a0)
+ SAVE_U_PCB_CONTEXT(s2, PCB_REG_S2, a0)
+ SAVE_U_PCB_CONTEXT(s3, PCB_REG_S3, a0)
mfc0 v0, MIPS_COP_0_STATUS
- SAVE_U_PCB_CONTEXT(s4, PREG_S4, a0)
- SAVE_U_PCB_CONTEXT(s5, PREG_S5, a0)
- SAVE_U_PCB_CONTEXT(s6, PREG_S6, a0)
- SAVE_U_PCB_CONTEXT(s7, PREG_S7, a0)
- SAVE_U_PCB_CONTEXT(sp, PREG_SP, a0)
- SAVE_U_PCB_CONTEXT(s8, PREG_S8, a0)
- SAVE_U_PCB_CONTEXT(ra, PREG_RA, a0)
- SAVE_U_PCB_CONTEXT(v0, PREG_SR, a0)
- SAVE_U_PCB_CONTEXT(gp, PREG_GP, a0)
+ SAVE_U_PCB_CONTEXT(s4, PCB_REG_S4, a0)
+ SAVE_U_PCB_CONTEXT(s5, PCB_REG_S5, a0)
+ SAVE_U_PCB_CONTEXT(s6, PCB_REG_S6, a0)
+ SAVE_U_PCB_CONTEXT(s7, PCB_REG_S7, a0)
+ SAVE_U_PCB_CONTEXT(sp, PCB_REG_SP, a0)
+ SAVE_U_PCB_CONTEXT(s8, PCB_REG_S8, a0)
+ SAVE_U_PCB_CONTEXT(ra, PCB_REG_RA, a0)
+ SAVE_U_PCB_CONTEXT(v0, PCB_REG_SR, a0)
+ SAVE_U_PCB_CONTEXT(gp, PCB_REG_GP, a0)
move v0, ra /* save 'ra' before we trash it */
jal 1f
nop
1:
- SAVE_U_PCB_CONTEXT(ra, PREG_PC, a0)
+ SAVE_U_PCB_CONTEXT(ra, PCB_REG_PC, a0)
move ra, v0 /* restore 'ra' before returning */
j ra
@@ -229,26 +230,26 @@ NON_LEAF(cpu_switch, CALLFRAME_SIZ, ra)
beqz a0, mips_sw1
move a3, a0
PTR_L a0, TD_PCB(a0) # load PCB addr of curproc
- SAVE_U_PCB_CONTEXT(sp, PREG_SP, a0) # save old sp
+ SAVE_U_PCB_CONTEXT(sp, PCB_REG_SP, a0) # save old sp
PTR_SUBU sp, sp, CALLFRAME_SIZ
REG_S ra, CALLFRAME_RA(sp)
.mask 0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ)
- SAVE_U_PCB_CONTEXT(s0, PREG_S0, a0) # do a 'savectx()'
- SAVE_U_PCB_CONTEXT(s1, PREG_S1, a0)
- SAVE_U_PCB_CONTEXT(s2, PREG_S2, a0)
- SAVE_U_PCB_CONTEXT(s3, PREG_S3, a0)
- SAVE_U_PCB_CONTEXT(s4, PREG_S4, a0)
- SAVE_U_PCB_CONTEXT(s5, PREG_S5, a0)
- SAVE_U_PCB_CONTEXT(s6, PREG_S6, a0)
- SAVE_U_PCB_CONTEXT(s7, PREG_S7, a0)
- SAVE_U_PCB_CONTEXT(s8, PREG_S8, a0)
- SAVE_U_PCB_CONTEXT(ra, PREG_RA, a0) # save return address
- SAVE_U_PCB_CONTEXT(t0, PREG_SR, a0) # save status register
- SAVE_U_PCB_CONTEXT(gp, PREG_GP, a0)
+ SAVE_U_PCB_CONTEXT(s0, PCB_REG_S0, a0) # do a 'savectx()'
+ SAVE_U_PCB_CONTEXT(s1, PCB_REG_S1, a0)
+ SAVE_U_PCB_CONTEXT(s2, PCB_REG_S2, a0)
+ SAVE_U_PCB_CONTEXT(s3, PCB_REG_S3, a0)
+ SAVE_U_PCB_CONTEXT(s4, PCB_REG_S4, a0)
+ SAVE_U_PCB_CONTEXT(s5, PCB_REG_S5, a0)
+ SAVE_U_PCB_CONTEXT(s6, PCB_REG_S6, a0)
+ SAVE_U_PCB_CONTEXT(s7, PCB_REG_S7, a0)
+ SAVE_U_PCB_CONTEXT(s8, PCB_REG_S8, a0)
+ SAVE_U_PCB_CONTEXT(ra, PCB_REG_RA, a0) # save return address
+ SAVE_U_PCB_CONTEXT(t0, PCB_REG_SR, a0) # save status register
+ SAVE_U_PCB_CONTEXT(gp, PCB_REG_GP, a0)
jal getpc
nop
getpc:
- SAVE_U_PCB_CONTEXT(ra, PREG_PC, a0) # save return address
+ SAVE_U_PCB_CONTEXT(ra, PCB_REG_PC, a0) # save return address
#ifdef CPU_CNMIPS
@@ -262,7 +263,7 @@ getpc:
sw t2, TD_MDFLAGS(a3)
and t2, t0, ~MIPS_SR_COP_2_BIT # clear COP_2 enable bit
- SAVE_U_PCB_CONTEXT(t2, PREG_SR, a0) # save status register
+ SAVE_U_PCB_CONTEXT(t2, PCB_REG_SR, a0) # save status register
RESTORE_U_PCB_REG(t0, PS, a0) # get CPU status register
and t2, t0, ~MIPS_SR_COP_2_BIT # clear COP_2 enable bit
@@ -374,7 +375,7 @@ entry0set:
*/
sw2:
PTR_L s0, TD_PCB(s7)
- RESTORE_U_PCB_CONTEXT(sp, PREG_SP, s0)
+ RESTORE_U_PCB_CONTEXT(sp, PCB_REG_SP, s0)
PTR_LA t1, _C_LABEL(pmap_activate) # s7 = new proc pointer
jalr t1 # s7 = new proc pointer
move a0, s7 # BDSLOT
@@ -382,18 +383,18 @@ sw2:
* Restore registers and return.
*/
move a0, s0
- RESTORE_U_PCB_CONTEXT(gp, PREG_GP, a0)
- RESTORE_U_PCB_CONTEXT(v0, PREG_SR, a0) # restore kernel context
- RESTORE_U_PCB_CONTEXT(ra, PREG_RA, a0)
- RESTORE_U_PCB_CONTEXT(s0, PREG_S0, a0)
- RESTORE_U_PCB_CONTEXT(s1, PREG_S1, a0)
- RESTORE_U_PCB_CONTEXT(s2, PREG_S2, a0)
- RESTORE_U_PCB_CONTEXT(s3, PREG_S3, a0)
- RESTORE_U_PCB_CONTEXT(s4, PREG_S4, a0)
- RESTORE_U_PCB_CONTEXT(s5, PREG_S5, a0)
- RESTORE_U_PCB_CONTEXT(s6, PREG_S6, a0)
- RESTORE_U_PCB_CONTEXT(s7, PREG_S7, a0)
- RESTORE_U_PCB_CONTEXT(s8, PREG_S8, a0)
+ RESTORE_U_PCB_CONTEXT(gp, PCB_REG_GP, a0)
+ RESTORE_U_PCB_CONTEXT(v0, PCB_REG_SR, a0) # restore kernel context
+ RESTORE_U_PCB_CONTEXT(ra, PCB_REG_RA, a0)
+ RESTORE_U_PCB_CONTEXT(s0, PCB_REG_S0, a0)
+ RESTORE_U_PCB_CONTEXT(s1, PCB_REG_S1, a0)
+ RESTORE_U_PCB_CONTEXT(s2, PCB_REG_S2, a0)
+ RESTORE_U_PCB_CONTEXT(s3, PCB_REG_S3, a0)
+ RESTORE_U_PCB_CONTEXT(s4, PCB_REG_S4, a0)
+ RESTORE_U_PCB_CONTEXT(s5, PCB_REG_S5, a0)
+ RESTORE_U_PCB_CONTEXT(s6, PCB_REG_S6, a0)
+ RESTORE_U_PCB_CONTEXT(s7, PCB_REG_S7, a0)
+ RESTORE_U_PCB_CONTEXT(s8, PCB_REG_S8, a0)
mfc0 t0, MIPS_COP_0_STATUS
and t0, t0, MIPS_SR_INT_MASK
OpenPOWER on IntegriCloud