PERFORCE change 111129 for review
Oleksandr Tymoshenko
gonzo at FreeBSD.org
Tue Dec 5 01:31:26 PST 2006
http://perforce.freebsd.org/chv.cgi?CH=111129
Change 111129 by gonzo at gonzo_hq on 2006/12/05 09:31:25
o We should preserve S0..S7 registers in trap as well.
These resgisters should not be changed during function
call. It's OK to leave them alone in all kinds of exceptions
but syscall. fork(2) call modifies them and child process
gets wrong values after return.
Affected files ...
.. //depot/projects/mips2/src/sys/mips/include/frame.h#4 edit
.. //depot/projects/mips2/src/sys/mips/mips/exception.S#17 edit
.. //depot/projects/mips2/src/sys/mips/mips/genassym.c#5 edit
Differences ...
==== //depot/projects/mips2/src/sys/mips/include/frame.h#4 (text+ko) ====
@@ -59,15 +59,24 @@
#define TF_T8 15
#define TF_T9 16
-#define TF_RA 17
-#define TF_SR 18
-#define TF_MULLO 19
-#define TF_MULHI 20
-#define TF_EPC 21 /* may be changed by trap() call */
+#define TF_S0 17
+#define TF_S1 18
+#define TF_S2 19
+#define TF_S3 20
+#define TF_S4 21
+#define TF_S5 22
+#define TF_S6 23
+#define TF_S7 24
+
+#define TF_RA 25
+#define TF_SR 26
+#define TF_MULLO 27
+#define TF_MULHI 28
+#define TF_EPC 29 /* may be changed by trap() call */
-#define TF_SP 22
+#define TF_SP 30
-#define TF_NREGS 23
+#define TF_NREGS 31
/* Needs to be 8-byte aligned */
struct trapframe {
==== //depot/projects/mips2/src/sys/mips/mips/exception.S#17 (text+ko) ====
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $P4: //depot/projects/mips2/src/sys/mips/mips/exception.S#16 $
+ * $P4: //depot/projects/mips2/src/sys/mips/mips/exception.S#17 $
*/
/* $NetBSD: mipsX_subr.S,v 1.19 2005/12/11 12:18:09 christos Exp $ */
@@ -776,6 +776,17 @@
lw t1, TF_REG_T1(k1)
lw t0, TF_REG_T0(k1)
+ lw s0, TF_REG_S0(k1)
+ lw s1, TF_REG_S1(k1)
+ lw s2, TF_REG_S2(k1)
+ lw s3, TF_REG_S3(k1)
+ lw s4, TF_REG_S4(k1)
+ lw s5, TF_REG_S5(k1)
+ lw s6, TF_REG_S6(k1)
+ lw s7, TF_REG_S7(k1)
+
+
+
/*
* Brief interlude.
*/
@@ -841,8 +852,14 @@
sw a2, TF_REG_A2(k1)
sw a3, TF_REG_A3(k1)
-
-
+ sw s0, TF_REG_S0(k1)
+ sw s1, TF_REG_S1(k1)
+ sw s2, TF_REG_S2(k1)
+ sw s3, TF_REG_S3(k1)
+ sw s4, TF_REG_S4(k1)
+ sw s5, TF_REG_S5(k1)
+ sw s6, TF_REG_S6(k1)
+ sw s7, TF_REG_S7(k1)
/*
* Brief interlude.
==== //depot/projects/mips2/src/sys/mips/mips/genassym.c#5 (text+ko) ====
@@ -157,6 +157,16 @@
ASSYM(TF_REG_MULHI, offsetof(struct trapframe, tf_regs[TF_MULHI]));
ASSYM(TF_REG_EPC, offsetof(struct trapframe, tf_regs[TF_EPC]));
ASSYM(TF_REG_SP, offsetof(struct trapframe, tf_regs[TF_SP]));
+
+ASSYM(TF_REG_S0, offsetof(struct trapframe, tf_regs[TF_S0]));
+ASSYM(TF_REG_S1, offsetof(struct trapframe, tf_regs[TF_S1]));
+ASSYM(TF_REG_S2, offsetof(struct trapframe, tf_regs[TF_S2]));
+ASSYM(TF_REG_S3, offsetof(struct trapframe, tf_regs[TF_S3]));
+ASSYM(TF_REG_S4, offsetof(struct trapframe, tf_regs[TF_S4]));
+ASSYM(TF_REG_S5, offsetof(struct trapframe, tf_regs[TF_S5]));
+ASSYM(TF_REG_S6, offsetof(struct trapframe, tf_regs[TF_S6]));
+ASSYM(TF_REG_S7, offsetof(struct trapframe, tf_regs[TF_S7]));
+
ASSYM(TF_PPL, offsetof(struct trapframe, tf_ppl));
ASSYM(PCB_REG_S0, offsetof(struct pcb, pcb_regs[PCB_REG_S0]));
More information about the p4-projects
mailing list