Module Name: src
Committed By: martin
Date: Sat May 30 17:52:05 UTC 2009
Modified Files:
src/sys/arch/m68k/include: m68k.h
src/sys/arch/m68k/m68k: switch_subr.s vm_machdep.c
Log Message:
Do not use lwp_trampoline for cpu_setfunc, we do not want to call
lwp_startup() after a setfunc. Grow a simplified setfunc_trampoline
instead.
To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/m68k/include/m68k.h
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/m68k/m68k/switch_subr.s
cvs rdiff -u -r1.27 -r1.28 src/sys/arch/m68k/m68k/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/m68k/include/m68k.h
diff -u src/sys/arch/m68k/include/m68k.h:1.13 src/sys/arch/m68k/include/m68k.h:1.14
--- src/sys/arch/m68k/include/m68k.h:1.13 Wed Oct 17 19:55:05 2007
+++ src/sys/arch/m68k/include/m68k.h Sat May 30 17:52:05 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: m68k.h,v 1.13 2007/10/17 19:55:05 garbled Exp $ */
+/* $NetBSD: m68k.h,v 1.14 2009/05/30 17:52:05 martin Exp $ */
/*
* Copyright (c) 1982, 1990, 1993
@@ -144,7 +144,6 @@
int getsfc(void);
/* switch_subr.s */
-void lwp_trampoline(void);
void savectx(struct pcb *);
/* w16copy.s */
Index: src/sys/arch/m68k/m68k/switch_subr.s
diff -u src/sys/arch/m68k/m68k/switch_subr.s:1.21 src/sys/arch/m68k/m68k/switch_subr.s:1.22
--- src/sys/arch/m68k/m68k/switch_subr.s:1.21 Wed Oct 17 19:55:12 2007
+++ src/sys/arch/m68k/m68k/switch_subr.s Sat May 30 17:52:05 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: switch_subr.s,v 1.21 2007/10/17 19:55:12 garbled Exp $ */
+/* $NetBSD: switch_subr.s,v 1.22 2009/05/30 17:52:05 martin Exp $ */
/*
* Copyright (c) 2001 The NetBSD Foundation.
@@ -397,4 +397,17 @@
addql #8,%sp | toss SP and stack adjust
jra _ASM_LABEL(rei) | and return
+/*
+ * Very similar to lwp_trampoline, but do not call lwp_startup
+ */
+ENTRY_NOPROFILE(setfunc_trampoline)
+ movl %a3,%...@- | push function arg
+ jbsr %a2@ | call function
+ addql #4,%sp | pop arg
+ movl %sp@(FR_SP),%a0 | grab and load
+ movl %a0,%usp | user SP
+ moveml %...@+,#0x7FFF | restore most user regs
+ addql #8,%sp | toss SP and stack adjust
+ jra _ASM_LABEL(rei) | and return
+
Index: src/sys/arch/m68k/m68k/vm_machdep.c
diff -u src/sys/arch/m68k/m68k/vm_machdep.c:1.27 src/sys/arch/m68k/m68k/vm_machdep.c:1.28
--- src/sys/arch/m68k/m68k/vm_machdep.c:1.27 Wed Nov 19 18:35:59 2008
+++ src/sys/arch/m68k/m68k/vm_machdep.c Sat May 30 17:52:05 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vm_machdep.c,v 1.27 2008/11/19 18:35:59 ad Exp $ */
+/* $NetBSD: vm_machdep.c,v 1.28 2009/05/30 17:52:05 martin Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -77,7 +77,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.27 2008/11/19 18:35:59 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.28 2009/05/30 17:52:05 martin Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -129,6 +129,7 @@
struct trapframe *tf;
struct switchframe *sf;
extern struct pcb *curpcb;
+ extern void lwp_trampoline(void);
l2->l_md.md_flags = l1->l_md.md_flags;
@@ -171,8 +172,9 @@
struct pcb *pcb = &l->l_addr->u_pcb;
struct trapframe *tf = (struct trapframe *)l->l_md.md_regs;
struct switchframe *sf = (struct switchframe *)tf - 1;
+ extern void setfunc_trampoline(void);
- sf->sf_pc = (u_int)lwp_trampoline;
+ sf->sf_pc = (u_int)setfunc_trampoline;
pcb->pcb_regs[6] = (int)func; /* A2 */
pcb->pcb_regs[7] = (int)arg; /* A3 */
pcb->pcb_regs[11] = (int)sf; /* SSP */