Module Name: src
Committed By: martin
Date: Sat May 30 18:26:06 UTC 2009
Modified Files:
src/sys/arch/mips/include: locore.h
src/sys/arch/mips/mips: locore_mips1.S mipsX_subr.S mips_machdep.c
vm_machdep.c
Log Message:
Do not use the same trampoline for cpu_lwp_fork and cpu_setfunc - only
the former needs to call lwp_startup().
To generate a diff of this commit:
cvs rdiff -u -r1.78 -r1.79 src/sys/arch/mips/include/locore.h
cvs rdiff -u -r1.64 -r1.65 src/sys/arch/mips/mips/locore_mips1.S
cvs rdiff -u -r1.27 -r1.28 src/sys/arch/mips/mips/mipsX_subr.S
cvs rdiff -u -r1.210 -r1.211 src/sys/arch/mips/mips/mips_machdep.c
cvs rdiff -u -r1.122 -r1.123 src/sys/arch/mips/mips/vm_machdep.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/mips/include/locore.h
diff -u src/sys/arch/mips/include/locore.h:1.78 src/sys/arch/mips/include/locore.h:1.79
--- src/sys/arch/mips/include/locore.h:1.78 Wed Oct 17 19:55:36 2007
+++ src/sys/arch/mips/include/locore.h Sat May 30 18:26:06 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.h,v 1.78 2007/10/17 19:55:36 garbled Exp $ */
+/* $NetBSD: locore.h,v 1.79 2009/05/30 18:26:06 martin Exp $ */
/*
* Copyright 1996 The Board of Trustees of The Leland Stanford
@@ -53,6 +53,7 @@
int mips1_TLBUpdate(u_int, u_int);
void mips1_wbflush(void);
void mips1_lwp_trampoline(void);
+void mips1_setfunc_trampoline(void);
void mips1_cpu_switch_resume(void);
uint32_t tx3900_cp0_config_read(void);
@@ -68,6 +69,7 @@
void mips3_TLBWriteIndexedVPS(int, struct tlb *);
void mips3_wbflush(void);
void mips3_lwp_trampoline(void);
+void mips3_setfunc_trampoline(void);
void mips3_cpu_switch_resume(void);
void mips3_pagezero(void *dst);
@@ -81,6 +83,7 @@
void mips5900_TLBWriteIndexedVPS(int, struct tlb *);
void mips5900_wbflush(void);
void mips5900_lwp_trampoline(void);
+void mips5900_setfunc_trampoline(void);
void mips5900_cpu_switch_resume(void);
void mips5900_pagezero(void *dst);
#endif
@@ -96,6 +99,7 @@
void mips32_TLBWriteIndexedVPS(int, struct tlb *);
void mips32_wbflush(void);
void mips32_lwp_trampoline(void);
+void mips32_setfunc_trampoline(void);
void mips32_cpu_switch_resume(void);
#endif
@@ -109,6 +113,7 @@
void mips64_TLBWriteIndexedVPS(int, struct tlb *);
void mips64_wbflush(void);
void mips64_lwp_trampoline(void);
+void mips64_setfunc_trampoline(void);
void mips64_cpu_switch_resume(void);
void mips64_pagezero(void *dst);
#endif
@@ -235,6 +240,7 @@
#define MachTLBUpdate mips1_TLBUpdate
#define wbflush() mips1_wbflush()
#define lwp_trampoline mips1_lwp_trampoline
+#define setfunc_trampoline mips1_setfunc_trampoline
#elif !defined(MIPS1) && defined(MIPS3) && !defined(MIPS32) && !defined(MIPS64) && !defined(MIPS3_5900)
#define MachSetPID mips3_SetPID
#define MIPS_TBIAP() mips3_TBIAP(mips_num_tlb_entries)
@@ -242,6 +248,7 @@
#define MachTLBUpdate mips3_TLBUpdate
#define MachTLBWriteIndexedVPS mips3_TLBWriteIndexedVPS
#define lwp_trampoline mips3_lwp_trampoline
+#define setfunc_trampoline mips3_setfunc_trampoline
#define wbflush() mips3_wbflush()
#elif !defined(MIPS1) && !defined(MIPS3) && defined(MIPS32) && !defined(MIPS64)
#define MachSetPID mips32_SetPID
@@ -250,6 +257,7 @@
#define MachTLBUpdate mips32_TLBUpdate
#define MachTLBWriteIndexedVPS mips32_TLBWriteIndexedVPS
#define lwp_trampoline mips32_lwp_trampoline
+#define setfunc_trampoline mips32_setfunc_trampoline
#define wbflush() mips32_wbflush()
#elif !defined(MIPS1) && !defined(MIPS3) && !defined(MIPS32) && defined(MIPS64)
/* all common with mips3 */
@@ -259,6 +267,7 @@
#define MachTLBUpdate mips64_TLBUpdate
#define MachTLBWriteIndexedVPS mips64_TLBWriteIndexedVPS
#define lwp_trampoline mips64_lwp_trampoline
+#define setfunc_trampoline mips64_setfunc_trampoline
#define wbflush() mips64_wbflush()
#elif !defined(MIPS1) && defined(MIPS3) && !defined(MIPS32) && !defined(MIPS64) && defined(MIPS3_5900)
#define MachSetPID mips5900_SetPID
@@ -267,6 +276,7 @@
#define MachTLBUpdate mips5900_TLBUpdate
#define MachTLBWriteIndexedVPS mips5900_TLBWriteIndexedVPS
#define lwp_trampoline mips5900_lwp_trampoline
+#define setfunc_trampoline mips5900_setfunc_trampoline
#define wbflush() mips5900_wbflush()
#else
#define MachSetPID (*(mips_locore_jumpvec.setTLBpid))
@@ -275,6 +285,7 @@
#define MachTLBUpdate (*(mips_locore_jumpvec.tlbUpdate))
#define wbflush() (*(mips_locore_jumpvec.wbflush))()
#define lwp_trampoline (mips_locoresw[1])
+#define setfunc_trampoline (mips_locoresw[3])
#endif
#define CPU_IDLE (mips_locoresw[2])
Index: src/sys/arch/mips/mips/locore_mips1.S
diff -u src/sys/arch/mips/mips/locore_mips1.S:1.64 src/sys/arch/mips/mips/locore_mips1.S:1.65
--- src/sys/arch/mips/mips/locore_mips1.S:1.64 Sat Jan 26 14:40:08 2008
+++ src/sys/arch/mips/mips/locore_mips1.S Sat May 30 18:26:06 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: locore_mips1.S,v 1.64 2008/01/26 14:40:08 tsutsui Exp $ */
+/* $NetBSD: locore_mips1.S,v 1.65 2009/05/30 18:26:06 martin Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -1090,6 +1090,21 @@
END(mips1_lwp_trampoline)
/*
+ * Like lwp_trampoline, but do not call lwp_startup
+ */
+LEAF(mips1_setfunc_trampoline)
+ addu sp, sp, -CALLFRAME_SIZ
+
+ # Call the routine specified by cpu_setfunc()
+ jal ra, s0
+ move a0, s1
+
+ j mips1_xcpt_return
+ nop
+
+END(mips1_setfunc_trampoline)
+
+/*
* void mips1_cpu_switch_resume(struct lwp *newlwp)
*
* Wiredown the USPACE of newproc with TLB entry#0 and #1. Check
@@ -1249,6 +1264,7 @@
.word _C_LABEL(mips1_cpu_switch_resume)
.word _C_LABEL(mips1_lwp_trampoline)
.word _C_LABEL(nullop) # idle
+ .word _C_LABEL(mips1_setfunc_trampoline)
mips1_excpt_sw:
####
Index: src/sys/arch/mips/mips/mipsX_subr.S
diff -u src/sys/arch/mips/mips/mipsX_subr.S:1.27 src/sys/arch/mips/mips/mipsX_subr.S:1.28
--- src/sys/arch/mips/mips/mipsX_subr.S:1.27 Tue Mar 24 21:36:46 2009
+++ src/sys/arch/mips/mips/mipsX_subr.S Sat May 30 18:26:06 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: mipsX_subr.S,v 1.27 2009/03/24 21:36:46 martin Exp $ */
+/* $NetBSD: mipsX_subr.S,v 1.28 2009/05/30 18:26:06 martin Exp $ */
/*
* Copyright 2002 Wasabi Systems, Inc.
@@ -1952,6 +1952,7 @@
# saved if EXL=1.
#
.set noat
+1:
mtc0 zero, MIPS_COP_0_STATUS # disable int
COP0_SYNC
nop # 3 op delay
@@ -2021,6 +2022,22 @@
END(MIPSX(lwp_trampoline))
/*
+ * Like lwp_trampoline, but do not call lwp_startup
+ */
+LEAF(MIPSX(setfunc_trampoline))
+ addu sp, sp, -CALLFRAME_SIZ
+
+ # Call the routine specified by cpu_setfunc()
+ jal ra, s0
+ move a0, s1
+
+ j 1b
+ nop
+
+END(MIPSX(setfunc_trampoline))
+
+
+/*
* void mipsN_cpu_switch_resume(struct lwp *newlwp)
*
* Wiredown the USPACE of newproc in TLB entry#0. Check whether target
@@ -2285,6 +2302,7 @@
.word _C_LABEL(MIPSX(cpu_switch_resume))
.word _C_LABEL(MIPSX(lwp_trampoline))
.word _C_LABEL(nullop)
+ .word _C_LABEL(MIPSX(setfunc_trampoline))
MIPSX(excpt_sw):
####
Index: src/sys/arch/mips/mips/mips_machdep.c
diff -u src/sys/arch/mips/mips/mips_machdep.c:1.210 src/sys/arch/mips/mips/mips_machdep.c:1.211
--- src/sys/arch/mips/mips/mips_machdep.c:1.210 Mon Mar 16 23:11:12 2009
+++ src/sys/arch/mips/mips/mips_machdep.c Sat May 30 18:26:06 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: mips_machdep.c,v 1.210 2009/03/16 23:11:12 dsl Exp $ */
+/* $NetBSD: mips_machdep.c,v 1.211 2009/05/30 18:26:06 martin Exp $ */
/*
* Copyright 2002 Wasabi Systems, Inc.
@@ -112,7 +112,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.210 2009/03/16 23:11:12 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.211 2009/05/30 18:26:06 martin Exp $");
#include "opt_cputype.h"
@@ -193,7 +193,7 @@
mips_locore_jumpvec_t mips_locore_jumpvec;
-long *mips_locoresw[3];
+long *mips_locoresw[4];
int cpu_arch;
int cpu_mhz;
Index: src/sys/arch/mips/mips/vm_machdep.c
diff -u src/sys/arch/mips/mips/vm_machdep.c:1.122 src/sys/arch/mips/mips/vm_machdep.c:1.123
--- src/sys/arch/mips/mips/vm_machdep.c:1.122 Wed Nov 19 18:36:00 2008
+++ src/sys/arch/mips/mips/vm_machdep.c Sat May 30 18:26:06 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vm_machdep.c,v 1.122 2008/11/19 18:36:00 ad Exp $ */
+/* $NetBSD: vm_machdep.c,v 1.123 2009/05/30 18:26:06 martin Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -77,7 +77,7 @@
*/
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.122 2008/11/19 18:36:00 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.123 2009/05/30 18:26:06 martin Exp $");
#include "opt_ddb.h"
@@ -198,7 +198,7 @@
pcb->pcb_context[1] = (intptr_t)arg; /* S1 */
pcb->pcb_context[MIPS_CURLWP_CARD - 16] = (intptr_t)l; /* S? */
pcb->pcb_context[8] = (intptr_t)f; /* SP */
- pcb->pcb_context[10] = (intptr_t)lwp_trampoline; /* RA */
+ pcb->pcb_context[10] = (intptr_t)setfunc_trampoline; /* RA */
#ifdef IPL_ICU_MASK
pcb->pcb_ppl = 0; /* machine depenedend interrupt mask */
#endif