From owner-p4-projects@FreeBSD.ORG Tue Dec 5 09:31:26 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6C77316A407; Tue, 5 Dec 2006 09:31:26 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 15B5E16A416 for ; Tue, 5 Dec 2006 09:31:26 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.FreeBSD.org (Postfix) with ESMTP id C6B3A43CA2 for ; Tue, 5 Dec 2006 09:30:47 +0000 (GMT) (envelope-from gonzo@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id kB59VP4U018563 for ; Tue, 5 Dec 2006 09:31:25 GMT (envelope-from gonzo@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id kB59VPM1018548 for perforce@freebsd.org; Tue, 5 Dec 2006 09:31:25 GMT (envelope-from gonzo@FreeBSD.org) Date: Tue, 5 Dec 2006 09:31:25 GMT Message-Id: <200612050931.kB59VPM1018548@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to gonzo@FreeBSD.org using -f From: Oleksandr Tymoshenko To: Perforce Change Reviews Cc: Subject: PERFORCE change 111129 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 05 Dec 2006 09:31:26 -0000 http://perforce.freebsd.org/chv.cgi?CH=111129 Change 111129 by gonzo@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]));