Module Name:    src
Committed By:   mrg
Date:           Fri May 29 22:06:56 UTC 2009

Modified Files:
        src/sys/arch/sparc/include: cpu.h
        src/sys/arch/sparc/sparc: locore.s vm_machdep.c

Log Message:
fix up cpu_setfunc() as noted by uwe:

- don't call lwp_startup for cpu_setfunc() users
- introduce lwp_setfunc_trampoline instead
- no need to set the "new" lwp for setfunc


To generate a diff of this commit:
cvs rdiff -u -r1.85 -r1.86 src/sys/arch/sparc/include/cpu.h
cvs rdiff -u -r1.245 -r1.246 src/sys/arch/sparc/sparc/locore.s
cvs rdiff -u -r1.99 -r1.100 src/sys/arch/sparc/sparc/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/sparc/include/cpu.h
diff -u src/sys/arch/sparc/include/cpu.h:1.85 src/sys/arch/sparc/include/cpu.h:1.86
--- src/sys/arch/sparc/include/cpu.h:1.85	Wed May 27 01:35:28 2009
+++ src/sys/arch/sparc/include/cpu.h	Fri May 29 22:06:55 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.h,v 1.85 2009/05/27 01:35:28 mrg Exp $ */
+/*	$NetBSD: cpu.h,v 1.86 2009/05/29 22:06:55 mrg Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -196,6 +196,7 @@
 void	write_all_windows(void);
 void	write_user_windows(void);
 void 	lwp_trampoline(void);
+void 	lwp_setfunc_trampoline(void);
 struct pcb;
 void	snapshot(struct pcb *);
 struct frame *getfp(void);

Index: src/sys/arch/sparc/sparc/locore.s
diff -u src/sys/arch/sparc/sparc/locore.s:1.245 src/sys/arch/sparc/sparc/locore.s:1.246
--- src/sys/arch/sparc/sparc/locore.s:1.245	Mon May 18 01:36:11 2009
+++ src/sys/arch/sparc/sparc/locore.s	Fri May 29 22:06:55 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.s,v 1.245 2009/05/18 01:36:11 mrg Exp $	*/
+/*	$NetBSD: locore.s,v 1.246 2009/05/29 22:06:55 mrg Exp $	*/
 
 /*
  * Copyright (c) 1996 Paul Kranenburg
@@ -5043,6 +5043,9 @@
  *
  * If were setting up a kernel thread, the function *(%l0) will not
  * return.
+ *
+ * For KERN_SA applications, we provide an alternate entry point for
+ * cpu_setfunc() to use.
  */
 ENTRY(lwp_trampoline)
 	/*
@@ -5055,6 +5058,7 @@
 	call	lwp_startup
 	 mov	%l2, %o1
 
+_ENTRY(lwp_setfunc_trampoline)
 	call	%l0
 	 mov	%l1, %o0
 

Index: src/sys/arch/sparc/sparc/vm_machdep.c
diff -u src/sys/arch/sparc/sparc/vm_machdep.c:1.99 src/sys/arch/sparc/sparc/vm_machdep.c:1.100
--- src/sys/arch/sparc/sparc/vm_machdep.c:1.99	Wed May 27 04:08:06 2009
+++ src/sys/arch/sparc/sparc/vm_machdep.c	Fri May 29 22:06:56 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: vm_machdep.c,v 1.99 2009/05/27 04:08:06 mrg Exp $ */
+/*	$NetBSD: vm_machdep.c,v 1.100 2009/05/29 22:06:56 mrg Exp $ */
 
 /*
  * Copyright (c) 1996
@@ -49,7 +49,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.99 2009/05/27 04:08:06 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.100 2009/05/29 22:06:56 mrg Exp $");
 
 #include "opt_multiprocessor.h"
 
@@ -275,8 +275,15 @@
 
 	/* Construct kernel frame to return to in cpu_switch() */
 	rp = (struct rwindow *)((u_int)npcb + TOPFRAMEOFF);
+	/**rp = *(struct rwindow *)((u_int)opcb + TOPFRAMEOFF);*/
+	rp->rw_local[0] = (int)func;		/* Function to call */
+	rp->rw_local[1] = (int)arg;		/* and its argument */
+	rp->rw_local[2] = (int)l2;		/* new LWP */
 
-	cpu_setfunc(l2, func, arg);
+	npcb->pcb_pc = (int)lwp_trampoline - 8;
+	npcb->pcb_sp = (int)rp;
+	npcb->pcb_psr &= ~PSR_CWP;	/* Run in window #0 */
+	npcb->pcb_wim = 1;		/* Fence at window #1 */
 }
 
 /*
@@ -329,9 +336,8 @@
 	rp = (struct rwindow *)((u_int)pcb + TOPFRAMEOFF);
 	rp->rw_local[0] = (int)func;		/* Function to call */
 	rp->rw_local[1] = (int)arg;		/* and its argument */
-	rp->rw_local[2] = (int)l;		/* new lwp */
 
-	pcb->pcb_pc = (int)lwp_trampoline - 8;
+	pcb->pcb_pc = (int)lwp_setfunc_trampoline - 8;
 	pcb->pcb_sp = (int)rp;
 	pcb->pcb_psr &= ~PSR_CWP;	/* Run in window #0 */
 	pcb->pcb_wim = 1;		/* Fence at window #1 */

Reply via email to