diff options
author | Artur Grabowski <art@cvs.openbsd.org> | 2001-11-06 18:41:11 +0000 |
---|---|---|
committer | Artur Grabowski <art@cvs.openbsd.org> | 2001-11-06 18:41:11 +0000 |
commit | 89ae7820c1a454d61cd281925d300bf324cfb4a3 (patch) | |
tree | 322119c116dc2ae1a396e832aac803b47d2df136 | |
parent | 1c0a1a534d87ced0c6089cb972b59491152bbdfa (diff) |
Let fork1, uvm_fork, and cpu_fork take a function/argument pair as argument,
instead of doing fork1, cpu_set_kpc. This lets us retire cpu_set_kpc and
avoid a multiprocessor race.
This commit breaks vax because it doesn't look like any other arch, someone
working on vax might want to look at this and try to adapt the code to be
more like the rest of the world.
Idea and uvm parts from NetBSD.
39 files changed, 215 insertions, 573 deletions
diff --git a/sys/arch/alpha/alpha/vm_machdep.c b/sys/arch/alpha/alpha/vm_machdep.c index 4f78963b675..bf8d1c8ae1c 100644 --- a/sys/arch/alpha/alpha/vm_machdep.c +++ b/sys/arch/alpha/alpha/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.24 2001/09/19 20:50:55 mickey Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.25 2001/11/06 18:41:09 art Exp $ */ /* $NetBSD: vm_machdep.c,v 1.55 2000/03/29 03:49:48 simonb Exp $ */ /* @@ -134,18 +134,19 @@ cpu_exit(p) * directly to user level with an apparent return value of 0 from * fork(), while the parent process returns normally. * - * p1 is the process being forked; if p1 == &proc0, we are creating - * a kernel thread, and the return path will later be changed in cpu_set_kpc. + * p1 is the process being forked; * * If an alternate user-level stack is requested (with non-zero values * in both the stack and stacksize args), set up the user stack pointer * accordingly. */ void -cpu_fork(p1, p2, stack, stacksize) - register struct proc *p1, *p2; +cpu_fork(p1, p2, stack, stacksize, func, arg) + struct proc *p1, *p2; void *stack; size_t stacksize; + void (*func)(void *); + void *arg; { struct user *up = p2->p_addr; @@ -224,51 +225,17 @@ cpu_fork(p1, p2, stack, stacksize) * Arrange for continuation at child_return(), which * will return to exception_return(). Note that the child * process doesn't stay in the kernel for long! - * - * This is an inlined version of cpu_set_kpc. */ up->u_pcb.pcb_hw.apcb_ksp = (u_int64_t)p2tf; - up->u_pcb.pcb_context[0] = - (u_int64_t)child_return; /* s0: pc */ + up->u_pcb.pcb_context[0] = (u_int64_t)func; up->u_pcb.pcb_context[1] = (u_int64_t)exception_return; /* s1: ra */ - up->u_pcb.pcb_context[2] = - (u_int64_t)p2; /* s2: arg */ + up->u_pcb.pcb_context[2] = (u_int64_t)arg; up->u_pcb.pcb_context[7] = (u_int64_t)switch_trampoline; /* ra: assembly magic */ up->u_pcb.pcb_context[8] = ALPHA_PSL_IPL_0; /* ps: IPL */ } } - -/* - * cpu_set_kpc: - * - * Arrange for in-kernel execution of a process to continue at the - * named pc, as if the code at that address were called as a function - * with argument, the current process's process pointer. - * - * Note that it's assumed that when the named process returns, - * exception_return() should be invoked, to return to user mode. - * - * (Note that cpu_fork(), above, uses an open-coded version of this.) - */ -void -cpu_set_kpc(p, pc, arg) - struct proc *p; - void (*pc) __P((void *)); - void *arg; -{ - struct pcb *pcbp; - - pcbp = &p->p_addr->u_pcb; - pcbp->pcb_context[0] = (u_int64_t)pc; /* s0 - pc to invoke */ - pcbp->pcb_context[1] = - (u_int64_t)exception_return; /* s1 - return address */ - pcbp->pcb_context[2] = (u_int64_t)arg; /* s2 - arg */ - pcbp->pcb_context[7] = - (u_int64_t)switch_trampoline; /* ra - assembly magic */ -} - /* * Finish a swapin operation. * We neded to update the cached PTEs for the user area in the diff --git a/sys/arch/alpha/include/cpu.h b/sys/arch/alpha/include/cpu.h index ed68ef7aead..b599120df2e 100644 --- a/sys/arch/alpha/include/cpu.h +++ b/sys/arch/alpha/include/cpu.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.h,v 1.14 2001/11/04 23:12:46 art Exp $ */ +/* $OpenBSD: cpu.h,v 1.15 2001/11/06 18:41:09 art Exp $ */ /* $NetBSD: cpu.h,v 1.45 2000/08/21 02:03:12 thorpej Exp $ */ /*- @@ -114,7 +114,6 @@ int alpha_pa_access(u_long); void ast(struct trapframe *); int badaddr(void *, size_t); int badaddr_read(void *, size_t, void *); -void child_return(void *); u_int64_t console_restart(struct trapframe *); void do_sir(void); void dumpconf(void); diff --git a/sys/arch/amiga/amiga/trap.c b/sys/arch/amiga/amiga/trap.c index 836461cf499..01a801fa8b0 100644 --- a/sys/arch/amiga/amiga/trap.c +++ b/sys/arch/amiga/amiga/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.22 2001/09/13 15:35:05 art Exp $ */ +/* $OpenBSD: trap.c,v 1.23 2001/11/06 18:41:09 art Exp $ */ /* $NetBSD: trap.c,v 1.56 1997/07/16 00:01:47 is Exp $ */ /* @@ -194,10 +194,8 @@ void trap __P((int, u_int, u_int, struct frame)); int db_trap __P((int, db_regs_t *)); #endif void syscall __P((register_t, struct frame)); -void child_return __P((struct proc *, struct frame)); void _wb_fault __P((void)); - void userret(p, pc, oticks) struct proc *p; @@ -947,24 +945,6 @@ syscall(code, frame) } /* - * Process the tail end of a fork() for the child - */ -void -child_return(p, frame) - struct proc *p; - struct frame frame; -{ - frame.f_regs[D0] = 0; - frame.f_sr &= ~PSL_C; /* carry bit */ - - userret(p, frame.f_pc, p->p_sticks); -#ifdef KTRACE - if (KTRPOINT(p, KTR_SYSRET)) - ktrsysret(p, SYS_fork, 0, 0); -#endif -} - -/* * Process a pending write back */ int diff --git a/sys/arch/amiga/amiga/vm_machdep.c b/sys/arch/amiga/amiga/vm_machdep.c index fa38f74c45d..5d59a8db699 100644 --- a/sys/arch/amiga/amiga/vm_machdep.c +++ b/sys/arch/amiga/amiga/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.23 2001/09/21 02:11:53 miod Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.24 2001/11/06 18:41:09 art Exp $ */ /* $NetBSD: vm_machdep.c,v 1.30 1997/05/19 10:14:50 veego Exp $ */ /* @@ -61,10 +61,6 @@ #include <uvm/uvm_extern.h> #include <machine/pte.h> -/* XXX - Put this in some header file? */ -void child_return __P((struct proc *, struct frame)); - - /* * Finish a fork operation, with process p2 nearly set up. * Copy and update the kernel stack and pcb, making the child @@ -75,14 +71,16 @@ void child_return __P((struct proc *, struct frame)); * the frame pointers on the stack after copying. */ void -cpu_fork(p1, p2, stack, stacksize) - register struct proc *p1, *p2; +cpu_fork(p1, p2, stack, stacksize, func, arg) + struct proc *p1, *p2; void *stack; size_t stacksize; + void (*func)(void *); + void *arg; { - register struct pcb *pcb = &p2->p_addr->u_pcb; - register struct trapframe *tf; - register struct switchframe *sf; + struct pcb *pcb = &p2->p_addr->u_pcb; + struct trapframe *tf; + struct switchframe *sf; extern struct pcb *curpcb; p2->p_md.md_flags = p1->p_md.md_flags; @@ -99,7 +97,7 @@ cpu_fork(p1, p2, stack, stacksize) /* * Copy the trap frame, and arrange for the child to return directly - * through return_to_user(). Note the inline cpu_set_kpc(); + * through return_to_user(). */ tf = (struct trapframe *)((u_int)p2->p_addr + USPACE) - 1; p2->p_md.md_regs = (int *)tf; @@ -113,38 +111,12 @@ cpu_fork(p1, p2, stack, stacksize) sf = (struct switchframe *)tf - 1; sf->sf_pc = (u_int)proc_trampoline; - pcb->pcb_regs[6] = (int)child_return; /* A2 */ - pcb->pcb_regs[7] = (int)p2; /* A3 */ + pcb->pcb_regs[6] = (int)func; /* A2 */ + pcb->pcb_regs[7] = (int)arg; /* A3 */ pcb->pcb_regs[11] = (int)sf; /* SSP */ } /* - * cpu_set_kpc: - * - * Arrange for in-kernel execution of a process to continue at the - * named pc, as if the code at that address were called as a function - * with argument, the current process's process pointer. - * - * Note that it's assumed that when the named process returns, rei() - * should be invoked, to return to user mode. - */ -void -cpu_set_kpc(p, pc, arg) - struct proc *p; - void (*pc) __P((void *)); - void *arg; -{ - struct pcb *pcbp; - struct switchframe *sf; - - pcbp = &p->p_addr->u_pcb; - sf = (struct switchframe *)pcbp->pcb_regs[11]; - sf->sf_pc = (u_int)proc_trampoline; - pcbp->pcb_regs[6] = (int)pc; /* A2 */ - pcbp->pcb_regs[7] = (int)arg; /* A3 */ -} - -/* * cpu_exit is called as the last action during exit. * We release the address space and machine-dependent resources, * Block context switches and then call switch_exit() which will diff --git a/sys/arch/hp300/hp300/trap.c b/sys/arch/hp300/hp300/trap.c index 40909fb3758..a602ad607dc 100644 --- a/sys/arch/hp300/hp300/trap.c +++ b/sys/arch/hp300/hp300/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.29 2001/11/04 02:58:54 miod Exp $ */ +/* $OpenBSD: trap.c,v 1.30 2001/11/06 18:41:09 art Exp $ */ /* $NetBSD: trap.c,v 1.57 1998/02/16 20:58:31 thorpej Exp $ */ /* @@ -115,14 +115,13 @@ extern struct emul emul_sunos; int writeback __P((struct frame *fp, int docachepush)); void trap __P((int type, u_int code, u_int v, struct frame frame)); void syscall __P((register_t code, struct frame frame)); -void child_return __P((struct proc *, struct frame)); #ifdef DEBUG void dumpssw __P((u_short)); void dumpwb __P((int, u_short, u_int, u_int)); #endif -static inline void userret __P((struct proc *p, struct frame *fp, +void userret __P((struct proc *p, struct frame *fp, u_quad_t oticks, u_int faultaddr, int fromtrap)); int astpending; @@ -207,7 +206,7 @@ int mmupid = -1; * trap and syscall both need the following work done before returning * to user mode. */ -static inline void +void userret(p, fp, oticks, faultaddr, fromtrap) struct proc *p; struct frame *fp; @@ -1171,20 +1170,3 @@ bad: ktrsysret(p, code, error, rval[0]); #endif } - -void -child_return(p, frame) - struct proc *p; - struct frame frame; -{ - - frame.f_regs[D0] = 0; - frame.f_sr &= ~PSL_C; - frame.f_format = FMT0; - - userret(p, &frame, 0, (u_int)0, 0); -#ifdef KTRACE - if (KTRPOINT(p, KTR_SYSRET)) - ktrsysret(p, SYS_fork, 0, 0); -#endif -} diff --git a/sys/arch/hp300/hp300/vm_machdep.c b/sys/arch/hp300/hp300/vm_machdep.c index 1293e6fa1fe..5c1fc78828e 100644 --- a/sys/arch/hp300/hp300/vm_machdep.c +++ b/sys/arch/hp300/hp300/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.31 2001/09/21 02:11:57 miod Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.32 2001/11/06 18:41:09 art Exp $ */ /* $NetBSD: vm_machdep.c,v 1.47 1999/03/26 23:41:29 mycroft Exp $ */ /* @@ -72,12 +72,13 @@ * the frame pointers on the stack after copying. */ void -cpu_fork(p1, p2, stack, stacksize) +cpu_fork(p1, p2, stack, stacksize, func, arg) struct proc *p1, *p2; void *stack; size_t stacksize; + void (*func)(void *); + void *arg; { - void child_return __P((struct proc *, struct frame)); struct pcb *pcb = &p2->p_addr->u_pcb; struct trapframe *tf; struct switchframe *sf; @@ -98,7 +99,7 @@ cpu_fork(p1, p2, stack, stacksize) /* * Copy the trap frame, and arrange for the child to return directly - * through child_return(). Note the in-line cpu_set_kpc(). + * through child_return(). */ tf = (struct trapframe *)((u_int)p2->p_addr + USPACE) - 1; p2->p_md.md_regs = (int *)tf; @@ -112,30 +113,12 @@ cpu_fork(p1, p2, stack, stacksize) sf = (struct switchframe *)tf - 1; sf->sf_pc = (u_int)proc_trampoline; - pcb->pcb_regs[6] = (int)child_return; /* A2 */ - pcb->pcb_regs[7] = (int)p2; /* A3 */ + pcb->pcb_regs[6] = (int)func; /* A2 */ + pcb->pcb_regs[7] = (int)arg; /* A3 */ pcb->pcb_regs[11] = (int)sf; /* SSP */ } /* - * Arrange for in-kernel execution of a process to continue at the - * named pc, as if the code at that address were called as a function - * with the supplied argument. - * - * Note that it's assumed that when the named process returns, rei() - * should be invoked, to return to user code. - */ -void -cpu_set_kpc(p, pc, arg) - struct proc *p; - void (*pc) __P((void *)); - void *arg; -{ - p->p_addr->u_pcb.pcb_regs[6] = (int)pc; /* A2 */ - p->p_addr->u_pcb.pcb_regs[7] = (int)arg; /* A3 */ -} - -/* * cpu_exit is called as the last action during exit. * We release the address space and machine-dependent resources, * including the memory for the user structure and kernel stack. diff --git a/sys/arch/hppa/hppa/vm_machdep.c b/sys/arch/hppa/hppa/vm_machdep.c index 60a0504df69..f7b02d18586 100644 --- a/sys/arch/hppa/hppa/vm_machdep.c +++ b/sys/arch/hppa/hppa/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.25 2001/09/19 20:50:56 mickey Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.26 2001/11/06 18:41:09 art Exp $ */ /* * Copyright (c) 1999-2000 Michael Shalayeff @@ -181,13 +181,15 @@ cpu_swapout(p) } void -cpu_fork(p1, p2, stack, stacksize) +cpu_fork(p1, p2, stack, stacksize, func, arg) struct proc *p1, *p2; void *stack; size_t stacksize; + void (*func)(void *); + void *arg; { - register struct pcb *pcbp; - register struct trapframe *tf; + struct pcb *pcbp; + struct trapframe *tf; register_t sp, osp; #ifdef DIAGNOSTIC @@ -247,8 +249,8 @@ cpu_fork(p1, p2, stack, stacksize) osp = sp; sp += HPPA_FRAME_SIZE + 16*4; /* std frame + calee-save registers */ *HPPA_FRAME_CARG(0, sp) = tf->tf_sp; - *HPPA_FRAME_CARG(1, sp) = KERNMODE(child_return); - *HPPA_FRAME_CARG(2, sp) = (register_t)p2; + *HPPA_FRAME_CARG(1, sp) = KERNMODE(func); + *HPPA_FRAME_CARG(2, sp) = (register_t)arg; *(register_t*)(sp + HPPA_FRAME_PSP) = osp; *(register_t*)(sp + HPPA_FRAME_CRP) = (register_t)switch_trampoline; @@ -257,23 +259,6 @@ cpu_fork(p1, p2, stack, stacksize) } void -cpu_set_kpc(p, pc, arg) - struct proc *p; - void (*pc) __P((void *)); - void *arg; -{ - struct trapframe *tf = p->p_md.md_regs; - register_t sp = tf->tf_sp; - - /* - * Overwrite normally stashed there &child_return(p) - */ - *HPPA_FRAME_CARG(1, sp) = (register_t)pc; - *HPPA_FRAME_CARG(2, sp) = (register_t)arg; - fdcache(HPPA_SID_KERNEL, (vaddr_t)sp, HPPA_FRAME_SIZE); -} - -void cpu_exit(p) struct proc *p; { diff --git a/sys/arch/hppa/include/cpu.h b/sys/arch/hppa/include/cpu.h index 87e95be610b..ab629b1b318 100644 --- a/sys/arch/hppa/include/cpu.h +++ b/sys/arch/hppa/include/cpu.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.h,v 1.20 2001/01/29 00:01:58 mickey Exp $ */ +/* $OpenBSD: cpu.h,v 1.21 2001/11/06 18:41:09 art Exp $ */ /* * Copyright (c) 2000-2001 Michael Shalayeff @@ -148,7 +148,6 @@ int spcopy __P((pa_space_t ssp, const void *src, int spstrcpy __P((pa_space_t ssp, const void *src, pa_space_t dsp, void *dst, size_t size, size_t *rsize)); int copy_on_fault __P((void)); -void child_return __P((struct proc *p)); void switch_trampoline __P((void)); void switch_exit __P((struct proc *p)); int cpu_dumpsize __P((void)); diff --git a/sys/arch/i386/i386/trap.c b/sys/arch/i386/i386/trap.c index 4e40a39aae1..892ce2bb758 100644 --- a/sys/arch/i386/i386/trap.c +++ b/sys/arch/i386/i386/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.43 2001/09/20 11:57:18 art Exp $ */ +/* $OpenBSD: trap.c,v 1.44 2001/11/06 18:41:09 art Exp $ */ /* $NetBSD: trap.c,v 1.95 1996/05/05 06:50:02 mycroft Exp $ */ /*- @@ -753,15 +753,16 @@ syscall(frame) } void -child_return(p, frame) - struct proc *p; - struct trapframe frame; +child_return(arg) + void *arg; { + struct proc *p = (struct proc *)arg; + struct trapframe *tf = p->p_md.md_regs; - frame.tf_eax = 0; - frame.tf_eflags &= ~PSL_C; + tf->tf_eax = 0; + tf->tf_eflags &= ~PSL_C; - userret(p, frame.tf_eip, 0); + userret(p, tf->tf_eip, 0); #ifdef KTRACE if (KTRPOINT(p, KTR_SYSRET)) ktrsysret(p, SYS_fork, 0, 0); diff --git a/sys/arch/i386/i386/vm_machdep.c b/sys/arch/i386/i386/vm_machdep.c index aa62e5497ea..1f9bbce2f03 100644 --- a/sys/arch/i386/i386/vm_machdep.c +++ b/sys/arch/i386/i386/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.30 2001/09/21 02:11:57 miod Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.31 2001/11/06 18:41:09 art Exp $ */ /* $NetBSD: vm_machdep.c,v 1.61 1996/05/03 19:42:35 christos Exp $ */ /*- @@ -83,14 +83,16 @@ void setredzone __P((u_short *, caddr_t)); * the frame pointers on the stack after copying. */ void -cpu_fork(p1, p2, stack, stacksize) - register struct proc *p1, *p2; +cpu_fork(p1, p2, stack, stacksize, func, arg) + struct proc *p1, *p2; void *stack; size_t stacksize; + void (*func)(void *); + void *arg; { - register struct pcb *pcb = &p2->p_addr->u_pcb; - register struct trapframe *tf; - register struct switchframe *sf; + struct pcb *pcb = &p2->p_addr->u_pcb; + struct trapframe *tf; + struct switchframe *sf; #if NNPX > 0 /* @@ -127,7 +129,7 @@ cpu_fork(p1, p2, stack, stacksize) /* * Copy the trapframe, and arrange for the child to return directly - * through rei(). Note the inline version of cpu_set_kpc(). + * through rei(). */ p2->p_md.md_regs = tf = (struct trapframe *)pcb->pcb_tss.tss_esp0 - 1; *tf = *p1->p_md.md_regs; @@ -140,24 +142,10 @@ cpu_fork(p1, p2, stack, stacksize) sf = (struct switchframe *)tf - 1; sf->sf_ppl = 0; - sf->sf_esi = (int)child_return; - sf->sf_ebx = (int)p2; - sf->sf_eip = (int)proc_trampoline; - pcb->pcb_esp = (int)sf; -} - -void -cpu_set_kpc(p, pc, arg) - struct proc *p; - void (*pc) __P((void *)); - void *arg; -{ - struct switchframe *sf = - (struct switchframe *)p->p_addr->u_pcb.pcb_esp; - - sf->sf_esi = (int)pc; + sf->sf_esi = (int)func; sf->sf_ebx = (int)arg; sf->sf_eip = (int)proc_trampoline; + pcb->pcb_esp = (int)sf; } void diff --git a/sys/arch/i386/include/cpu.h b/sys/arch/i386/include/cpu.h index 58b1a6d7e6d..60c38f6892d 100644 --- a/sys/arch/i386/include/cpu.h +++ b/sys/arch/i386/include/cpu.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.h,v 1.38 2001/07/13 19:55:41 deraadt Exp $ */ +/* $OpenBSD: cpu.h,v 1.39 2001/11/06 18:41:09 art Exp $ */ /* $NetBSD: cpu.h,v 1.35 1996/05/05 19:29:26 christos Exp $ */ /*- @@ -230,9 +230,6 @@ int kvtop __P((caddr_t)); void vm86_gpfault __P((struct proc *, int)); #endif /* VM86 */ -/* trap.c */ -void child_return __P((struct proc *, struct trapframe)); - #ifdef GENERIC /* swapgeneric.c */ void setconf __P((void)); diff --git a/sys/arch/m68k/m68k/m68k_machdep.c b/sys/arch/m68k/m68k/m68k_machdep.c index 4b0c39194b8..287d064859f 100644 --- a/sys/arch/m68k/m68k/m68k_machdep.c +++ b/sys/arch/m68k/m68k/m68k_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: m68k_machdep.c,v 1.1 1997/07/06 07:46:28 downsj Exp $ */ +/* $OpenBSD: m68k_machdep.c,v 1.2 2001/11/06 18:41:09 art Exp $ */ /* $NetBSD: m68k_machdep.c,v 1.3 1997/06/12 09:57:04 veego Exp $ */ /*- @@ -38,7 +38,37 @@ */ #include <sys/param.h> +#include <sys/proc.h> +#include <sys/syscall.h> +#include <sys/ktrace.h> + +#include <machine/frame.h> +#include <machine/reg.h> /* the following is used externally (sysctl_hw) */ char machine_arch[] = MACHINE_ARCH; /* from <machine/param.h> */ +void userret __P((struct proc *, int, u_quad_t)); /* XXX */ +/* + * Process the tail end of a fork() for the child + * + * XXX - this is probably the wrong file. + */ +void +child_return(arg) + void *arg; +{ + struct proc *p = (struct proc *)arg; + struct frame *f = (struct frame *)p->p_md.md_regs; + + f->f_regs[D0] = 0; + f->f_sr &= ~PSL_C; /* carry bit */ + f->f_format = FMT0; + + userret(p, f->f_pc, p->p_sticks); +#ifdef KTRACE + if (KTRPOINT(p, KTR_SYSRET)) + ktrsysret(p, SYS_fork, 0, 0); +#endif +} + diff --git a/sys/arch/mac68k/include/cpu.h b/sys/arch/mac68k/include/cpu.h index d2e4c7c6f74..807d64e7233 100644 --- a/sys/arch/mac68k/include/cpu.h +++ b/sys/arch/mac68k/include/cpu.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.h,v 1.21 2001/08/20 19:49:03 miod Exp $ */ +/* $OpenBSD: cpu.h,v 1.22 2001/11/06 18:41:09 art Exp $ */ /* $NetBSD: cpu.h,v 1.45 1997/02/10 22:13:40 scottr Exp $ */ /* @@ -318,9 +318,6 @@ void savectx __P((struct pcb *)); void proc_trampoline __P((void)); void loadustp __P((int)); -/* trap.c */ -void child_return __P((struct proc *, struct frame)); - /* vm_machdep.c */ void physaccess __P((caddr_t, caddr_t, register int, register int)); void physunaccess __P((caddr_t, register int)); diff --git a/sys/arch/mac68k/mac68k/trap.c b/sys/arch/mac68k/mac68k/trap.c index c3e2f016602..fdd648b8e2d 100644 --- a/sys/arch/mac68k/mac68k/trap.c +++ b/sys/arch/mac68k/mac68k/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.28 2001/09/14 08:57:05 art Exp $ */ +/* $OpenBSD: trap.c,v 1.29 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: trap.c,v 1.68 1998/12/22 08:47:07 scottr Exp $ */ /* @@ -144,8 +144,8 @@ int mmupid = -1; void trap __P((int, u_int, u_int, struct frame)); void syscall __P((register_t, struct frame)); -static inline void userret __P((struct proc *p, struct frame *fp, - u_quad_t oticks, u_int faultaddr, int fromtrap)); +void userret __P((struct proc *p, struct frame *fp, u_quad_t oticks, + u_int faultaddr, int fromtrap)); #if defined(M68040) static int writeback __P((struct frame *, int)); @@ -159,7 +159,7 @@ static void dumpwb __P((int, u_short, u_int, u_int)); * Trap and syscall both need the following work done before returning * to user mode. */ -static __inline void +void userret(p, fp, oticks, faultaddr, fromtrap) struct proc *p; struct frame *fp; @@ -1125,25 +1125,3 @@ syscall(code, frame) ktrsysret(p, code, error, rval[0]); #endif } - -void child_return __P((struct proc *, struct frame)); - -/* - * Process the tail end of a fork() for the child. - */ -void -child_return(p, frame) - struct proc *p; - struct frame frame; -{ - - frame.f_regs[D0] = 0; /* Return value. */ - frame.f_sr &= ~PSL_C; /* carry bit indicates error */ - frame.f_format = FMT0; - - userret(p, &frame, 0, (u_int)0, 0); -#ifdef KTRACE - if (KTRPOINT(p, KTR_SYSRET)) - ktrsysret(p, SYS_fork, 0, 0); -#endif -} diff --git a/sys/arch/mac68k/mac68k/vm_machdep.c b/sys/arch/mac68k/mac68k/vm_machdep.c index 2fdb4ad5c4d..6896e457e29 100644 --- a/sys/arch/mac68k/mac68k/vm_machdep.c +++ b/sys/arch/mac68k/mac68k/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.24 2001/09/21 02:11:58 miod Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.25 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: vm_machdep.c,v 1.29 1998/07/28 18:34:55 thorpej Exp $ */ /* @@ -76,12 +76,13 @@ void savectx __P((struct pcb *)); * the frame pointers on the stack after copying. */ void -cpu_fork(p1, p2, stack, stacksize) +cpu_fork(p1, p2, stack, stacksize, func, arg) struct proc *p1, *p2; void *stack; size_t stacksize; + void (*func)(void *); + void *arg; { - void child_return __P((struct proc *, struct frame)); /* XXX */ struct pcb *pcb = &p2->p_addr->u_pcb; struct trapframe *tf; struct switchframe *sf; @@ -111,36 +112,11 @@ cpu_fork(p1, p2, stack, stacksize) sf = (struct switchframe *)tf - 1; sf->sf_pc = (u_int)proc_trampoline; - pcb->pcb_regs[6] = (int)child_return; /* A2 */ - pcb->pcb_regs[7] = (int)p2; /* A3 */ + pcb->pcb_regs[6] = (int)func; /* A2 */ + pcb->pcb_regs[7] = (int)arg; /* A3 */ pcb->pcb_regs[11] = (int)sf; /* SSP */ } -/* - * cpu_set_kpc - * Arrange for in-kernel execution of a process to continue at the - * named PC as if the code at that address had been called as a function - * with one argument--the named process's process pointer. - * - * Note that it's assumed that whne the named process returns, rei() - * should be invoked to return to user mode. - */ -void -cpu_set_kpc(p, pc, arg) - struct proc *p; - void (*pc) __P((void *)); - void *arg; -{ - struct pcb *pcbp; - struct switchframe *sf; - - pcbp = &p->p_addr->u_pcb; - sf = (struct switchframe *)pcbp->pcb_regs[11]; - sf->sf_pc = (u_int)proc_trampoline; - pcbp->pcb_regs[6] = (int)pc; /* A2 */ - pcbp->pcb_regs[7] = (int)p; /* A3 */ -} - void switch_exit __P((struct proc *)); /* diff --git a/sys/arch/macppc/include/cpu.h b/sys/arch/macppc/include/cpu.h index bc2918a4d48..d0b6b60f731 100644 --- a/sys/arch/macppc/include/cpu.h +++ b/sys/arch/macppc/include/cpu.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.h,v 1.1 2001/09/01 15:49:06 drahn Exp $ */ +/* $OpenBSD: cpu.h,v 1.2 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: cpu.h,v 1.1 1996/09/30 16:34:21 ws Exp $ */ /* @@ -36,8 +36,6 @@ #include <powerpc/cpu.h> -void child_return __P((struct proc *)); - #define CACHELINESIZE 32 /* For now XXX */ static __inline void diff --git a/sys/arch/mvme68k/mvme68k/trap.c b/sys/arch/mvme68k/mvme68k/trap.c index 3c74d079b93..84c62fd0794 100644 --- a/sys/arch/mvme68k/mvme68k/trap.c +++ b/sys/arch/mvme68k/mvme68k/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.35 2001/09/14 09:15:19 art Exp $ */ +/* $OpenBSD: trap.c,v 1.36 2001/11/06 18:41:10 art Exp $ */ /* * Copyright (c) 1995 Theo de Raadt @@ -169,14 +169,14 @@ u_char next_sir; int writeback __P((struct frame *fp, int docachepush)); -static inline void userret __P((struct proc *p, struct frame *fp, +void userret __P((struct proc *p, struct frame *fp, u_quad_t oticks, u_int faultaddr, int fromtrap)); /* * trap and syscall both need the following work done before returning * to user mode. */ -static inline void +void userret(p, fp, oticks, faultaddr, fromtrap) register struct proc *p; register struct frame *fp; @@ -1104,23 +1104,6 @@ bad: #endif } -void -child_return(p, frame) - struct proc *p; - struct frame frame; -{ - - frame.f_regs[D0] = 0; - frame.f_sr &= ~PSL_C; - frame.f_format = FMT0; - - userret(p, &frame, 0, (u_int)0, 0); -#ifdef KTRACE - if (KTRPOINT(p, KTR_SYSRET)) - ktrsysret(p, SYS_fork, 0, 0); -#endif -} - /* * Allocation routines for software interrupts. */ diff --git a/sys/arch/mvme68k/mvme68k/vm_machdep.c b/sys/arch/mvme68k/mvme68k/vm_machdep.c index 091be388e0f..0600b7da920 100644 --- a/sys/arch/mvme68k/mvme68k/vm_machdep.c +++ b/sys/arch/mvme68k/mvme68k/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.30 2001/09/29 21:26:33 miod Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.31 2001/11/06 18:41:10 art Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -69,14 +69,16 @@ */ void -cpu_fork(p1, p2, stack, stacksize) - register struct proc *p1, *p2; +cpu_fork(p1, p2, stack, stacksize, func, arg) + struct proc *p1, *p2; void *stack; size_t stacksize; + void (*func)(void *); + void *arg; { - register struct pcb *pcb = &p2->p_addr->u_pcb; - register struct trapframe *tf; - register struct switchframe *sf; + struct pcb *pcb = &p2->p_addr->u_pcb; + struct trapframe *tf; + struct switchframe *sf; extern struct pcb *curpcb; extern void proc_trampoline(), child_return(); @@ -95,7 +97,7 @@ cpu_fork(p1, p2, stack, stacksize) /* * Copy the trap frame, and arrange for the child to return directly - * through return_to_user(). Note the inline version of cpu_set_kpc(). + * through return_to_user(). */ tf = (struct trapframe *)((u_int)p2->p_addr + USPACE) - 1; p2->p_md.md_regs = (int *)tf; @@ -109,21 +111,11 @@ cpu_fork(p1, p2, stack, stacksize) sf = (struct switchframe *)tf - 1; sf->sf_pc = (u_int)proc_trampoline; - pcb->pcb_regs[6] = (int)child_return; /* A2 */ - pcb->pcb_regs[7] = (int)p2; /* A3 */ + pcb->pcb_regs[6] = (int)func; /* A2 */ + pcb->pcb_regs[7] = (int)arg; /* A3 */ pcb->pcb_regs[11] = (int)sf; /* SSP */ } -void -cpu_set_kpc(p, pc, arg) - struct proc *p; - void (*pc) __P((void *)); - void *arg; -{ - p->p_addr->u_pcb.pcb_regs[6] = (int)pc; /* A2 */ - p->p_addr->u_pcb.pcb_regs[7] = (int)arg; /* A3 */ -} - /* * cpu_exit is called as the last action during exit. * We release the address space and machine-dependent resources, diff --git a/sys/arch/mvme88k/include/trap.h b/sys/arch/mvme88k/include/trap.h index 1cd82a99237..0da0e54175d 100644 --- a/sys/arch/mvme88k/include/trap.h +++ b/sys/arch/mvme88k/include/trap.h @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.h,v 1.11 2001/08/24 22:52:20 miod Exp $ */ +/* $OpenBSD: trap.h,v 1.12 2001/11/06 18:41:10 art Exp $ */ /* * Mach Operating System * Copyright (c) 1992 Carnegie Mellon University @@ -77,7 +77,6 @@ void panictrap(int type, struct m88100_saved_state *frame); void test_trap(struct m88100_saved_state *frame); void error_fault(struct m88100_saved_state *frame); void error_reset(struct m88100_saved_state *frame); -void child_return(struct proc *p); unsigned ss_get_value(struct proc *p, unsigned addr, int size); int ss_put_value(struct proc *p, unsigned addr, unsigned value, int size); unsigned ss_branch_taken(unsigned inst, unsigned pc, diff --git a/sys/arch/mvme88k/mvme88k/vm_machdep.c b/sys/arch/mvme88k/mvme88k/vm_machdep.c index ecaceda6367..00643a78c41 100644 --- a/sys/arch/mvme88k/mvme88k/vm_machdep.c +++ b/sys/arch/mvme88k/mvme88k/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.35 2001/09/23 02:51:36 miod Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.36 2001/11/06 18:41:10 art Exp $ */ /* * Copyright (c) 1998 Steve Murphree, Jr. @@ -89,7 +89,8 @@ int badpaddr __P((caddr_t, int)); */ void -cpu_fork(struct proc *p1, struct proc *p2, void *stack, size_t stacksize) +cpu_fork(struct proc *p1, struct proc *p2, void *stack, size_t stacksize, + void (*func)(void *), void *arg) { struct switchframe *p2sf; int cpu; @@ -136,7 +137,8 @@ cpu_fork(struct proc *p1, struct proc *p2, void *stack, size_t stacksize) ksfp = (struct ksigframe *)p2->p_addr->u_pcb.kernel_state.pcb_sp - 1; - ksfp->func = child_return; + ksfp->func = func; + ksfp->arg = arg; ksfp->proc = p2; /* @@ -151,24 +153,6 @@ cpu_fork(struct proc *p1, struct proc *p2, void *stack, size_t stacksize) p2->p_addr->u_pcb.kernel_state.pcb_pc = (u_int)proc_trampoline; } -void -cpu_set_kpc(struct proc *p, void (*func)(void *), void *arg) -{ - /* - * override func pointer in ksigframe with func. - */ - - struct ksigframe { - void (*func)(void *); - void *arg; - } *ksfp; - - ksfp = (struct ksigframe *)p->p_addr->u_pcb.kernel_state.pcb_sp; - - ksfp->func = func; - ksfp->arg = arg; -} - /* * cpu_exit is called as the last action during exit. * We release the address space and machine-dependent resources, diff --git a/sys/arch/powerpc/powerpc/vm_machdep.c b/sys/arch/powerpc/powerpc/vm_machdep.c index d647410b601..23cdd3f2407 100644 --- a/sys/arch/powerpc/powerpc/vm_machdep.c +++ b/sys/arch/powerpc/powerpc/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.24 2001/09/21 17:33:15 miod Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.25 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: vm_machdep.c,v 1.1 1996/09/30 16:34:57 ws Exp $ */ /* @@ -50,17 +50,18 @@ * Finish a fork operation, with process p2 nearly set up. */ void -cpu_fork(p1, p2, stack, stacksize) +cpu_fork(p1, p2, stack, stacksize, func, arg) struct proc *p1, *p2; void *stack; size_t stacksize; + void (*func)(void *); + void *arg; { struct trapframe *tf; struct callframe *cf; struct switchframe *sf; caddr_t stktop1, stktop2; extern void fork_trampoline __P((void)); - extern void child_return __P((struct proc *)); struct pcb *pcb = &p2->p_addr->u_pcb; if (p1 == fpuproc) @@ -100,8 +101,8 @@ cpu_fork(p1, p2, stack, stacksize) */ stktop2 -= 16; cf = (struct callframe *)stktop2; - cf->r31 = (register_t)child_return; - cf->r30 = (register_t)p2; + cf->r31 = (register_t)func; + cf->r30 = (register_t)arg; /* * Below that, we allocate the switch frame: @@ -115,23 +116,6 @@ cpu_fork(p1, p2, stack, stacksize) pcb->pcb_spl = 0; } -/* - * Set initial pc of process forked by above. - */ -void -cpu_set_kpc(p, pc, arg) - struct proc *p; - void (*pc) __P((void *)); - void *arg; -{ - struct switchframe *sf = (struct switchframe *)p->p_addr->u_pcb.pcb_sp; - struct callframe *cf = (struct callframe *)sf->sp; - - cf->r30 = (register_t)arg; - cf->r31 = (register_t)pc; - cf++->lr = (register_t)pc; -} - void cpu_swapin(p) struct proc *p; diff --git a/sys/arch/sparc/include/cpu.h b/sys/arch/sparc/include/cpu.h index b0268a2c0ce..a6082b68af8 100644 --- a/sys/arch/sparc/include/cpu.h +++ b/sys/arch/sparc/include/cpu.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.h,v 1.10 2000/06/05 11:02:52 art Exp $ */ +/* $OpenBSD: cpu.h,v 1.11 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: cpu.h,v 1.24 1997/03/15 22:25:15 pk Exp $ */ /* @@ -207,7 +207,6 @@ void remrunqueue __P((struct proc *)); /* trap.c */ void kill_user_windows __P((struct proc *)); int rwindow_save __P((struct proc *)); -void child_return __P((struct proc *)); /* amd7930intr.s */ void amd7930_trap __P((void)); /* cons.c */ diff --git a/sys/arch/sparc/sparc/vm_machdep.c b/sys/arch/sparc/sparc/vm_machdep.c index efaa90663c8..9c2f4c238d9 100644 --- a/sys/arch/sparc/sparc/vm_machdep.c +++ b/sys/arch/sparc/sparc/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.32 2001/09/19 20:50:57 mickey Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.33 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: vm_machdep.c,v 1.30 1997/03/10 23:55:40 pk Exp $ */ /* @@ -387,15 +387,17 @@ vunmapbuf(bp, sz) * the first element in struct user. */ void -cpu_fork(p1, p2, stack, stacksize) - register struct proc *p1, *p2; +cpu_fork(p1, p2, stack, stacksize, func, arg) + struct proc *p1, *p2; void *stack; size_t stacksize; + void (*func)(void *); + void *arg; { - register struct pcb *opcb = &p1->p_addr->u_pcb; - register struct pcb *npcb = &p2->p_addr->u_pcb; - register struct trapframe *tf2; - register struct rwindow *rp; + struct pcb *opcb = &p1->p_addr->u_pcb; + struct pcb *npcb = &p2->p_addr->u_pcb; + struct trapframe *tf2; + struct rwindow *rp; /* * Save all user registers to p1's stack or, in the case of @@ -464,8 +466,8 @@ cpu_fork(p1, p2, stack, stacksize) /* Construct kernel frame to return to in cpu_switch() */ rp = (struct rwindow *)((u_int)npcb + TOPFRAMEOFF); - rp->rw_local[0] = (int)child_return; /* Function to call */ - rp->rw_local[1] = (int)p2; /* and its argument */ + rp->rw_local[0] = (int)func; /* Function to call */ + rp->rw_local[1] = (int)arg; /* and its argument */ npcb->pcb_pc = (int)proc_trampoline - 8; npcb->pcb_sp = (int)rp; @@ -475,45 +477,6 @@ cpu_fork(p1, p2, stack, stacksize) } /* - * cpu_set_kpc: - * - * Arrange for in-kernel execution of a process to continue at the - * named pc, as if the code at that address were called as a function - * with the current process's process pointer as an argument. - * - * Note that it's assumed that when the named process returns, - * we immediately return to user mode. - * - * (Note that cpu_fork(), above, uses an open-coded version of this.) - */ -void -cpu_set_kpc(p, pc, arg) - struct proc *p; - void (*pc) __P((void *)); - void *arg; -{ - struct pcb *pcb; - struct rwindow *rp; - - pcb = &p->p_addr->u_pcb; - - rp = (struct rwindow *)((u_int)pcb + TOPFRAMEOFF); - rp->rw_local[0] = (int)pc; /* Function to call */ - rp->rw_local[1] = (int)arg; /* and its argument */ - - /* - * Frob PCB: - * - arrange to return to proc_trampoline() from cpu_switch() - * - point it at the stack frame constructed above - * - make it run in a clear set of register windows - */ - pcb->pcb_pc = (int)proc_trampoline - 8; - pcb->pcb_sp = (int)rp; - pcb->pcb_psr &= ~PSR_CWP; /* Run in window #0 */ - pcb->pcb_wim = 1; /* Fence at window #1 */ -} - -/* * cpu_exit is called as the last action during exit. * * We clean up a little and then call switchexit() with the old proc diff --git a/sys/arch/sparc64/include/cpu.h b/sys/arch/sparc64/include/cpu.h index 4e2a60e9ab0..04b9d78b71f 100644 --- a/sys/arch/sparc64/include/cpu.h +++ b/sys/arch/sparc64/include/cpu.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.h,v 1.5 2001/09/04 15:19:16 jason Exp $ */ +/* $OpenBSD: cpu.h,v 1.6 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: cpu.h,v 1.28 2001/06/14 22:56:58 thorpej Exp $ */ /* @@ -292,7 +292,6 @@ void remrq __P((struct proc *)); /* trap.c */ void kill_user_windows __P((struct proc *)); int rwindow_save __P((struct proc *)); -void child_return __P((struct proc *)); /* amd7930intr.s */ void amd7930_trap __P((void)); /* cons.c */ diff --git a/sys/arch/sparc64/sparc64/vm_machdep.c b/sys/arch/sparc64/sparc64/vm_machdep.c index 6dc851ef600..d7450d87008 100644 --- a/sys/arch/sparc64/sparc64/vm_machdep.c +++ b/sys/arch/sparc64/sparc64/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.3 2001/09/19 20:50:58 mickey Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.4 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: vm_machdep.c,v 1.38 2001/06/30 00:02:20 eeh Exp $ */ /* @@ -226,10 +226,12 @@ char cpu_forkname[] = "cpu_fork()"; * accordingly. */ void -cpu_fork(p1, p2, stack, stacksize) +cpu_fork(p1, p2, stack, stacksize, func, arg) struct proc *p1, *p2; void *stack; size_t stacksize; + void (*func)(void *); + void *arg; { struct pcb *opcb = &p1->p_addr->u_pcb; struct pcb *npcb = &p2->p_addr->u_pcb; @@ -321,8 +323,8 @@ cpu_fork(p1, p2, stack, stacksize) /* Construct kernel frame to return to in cpu_switch() */ rp = (struct rwindow *)((u_long)npcb + TOPFRAMEOFF); *rp = *(struct rwindow *)((u_long)opcb + TOPFRAMEOFF); - rp->rw_local[0] = (long)child_return; /* Function to call */ - rp->rw_local[1] = (long)p2; /* and its argument */ + rp->rw_local[0] = (long)func; /* Function to call */ + rp->rw_local[1] = (long)arg; /* and its argument */ npcb->pcb_pc = (long)proc_trampoline - 8; npcb->pcb_sp = (long)rp - STACK_OFFSET; @@ -344,31 +346,6 @@ cpu_fork(p1, p2, stack, stacksize) #endif } -void -cpu_set_kpc(p, pc, arg) - struct proc *p; - void (*pc) __P((void *)); - void *arg; -{ - struct pcb *pcb; - struct rwindow *rp; - - pcb = &p->p_addr->u_pcb; - - rp = (struct rwindow *)((u_long)pcb + TOPFRAMEOFF); - rp->rw_local[0] = (long)pc; /* Function to call */ - rp->rw_local[1] = (long)arg; /* and its argument */ - - /* - * Frob PCB: - * - arrange to return to proc_trampoline() from cpu_switch() - * - point it at the stack frame constructed above - * - make it run in a clear set of register windows - */ - pcb->pcb_pc = (long)proc_trampoline - 8; - pcb->pcb_sp = (long)rp - STACK_OFFSET; -} - /* * cpu_exit is called as the last action during exit. * diff --git a/sys/arch/sun3/include/cpu.h b/sys/arch/sun3/include/cpu.h index a9093530e2a..0c7d910b1e4 100644 --- a/sys/arch/sun3/include/cpu.h +++ b/sys/arch/sun3/include/cpu.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.h,v 1.13 2001/09/28 20:40:20 miod Exp $ */ +/* $OpenBSD: cpu.h,v 1.14 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: cpu.h,v 1.20 1995/12/21 05:02:10 mycroft Exp $ */ /* @@ -157,9 +157,6 @@ void savectx __P((struct pcb *)); void switch_exit __P((struct proc *)); void proc_trampoline __P((void)); -/* trap.c */ -void child_return __P((void *)); - #endif /* _KERNEL */ /* diff --git a/sys/arch/sun3/include/machdep.h b/sys/arch/sun3/include/machdep.h index ac195f63f87..51f20b4e3c4 100644 --- a/sys/arch/sun3/include/machdep.h +++ b/sys/arch/sun3/include/machdep.h @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.h,v 1.15 2001/08/25 11:37:26 espie Exp $ */ +/* $OpenBSD: machdep.h,v 1.16 2001/11/06 18:41:10 art Exp $ */ /* * Copyright (c) 1994 Gordon W. Ross @@ -84,8 +84,6 @@ void cache_flush_context(void); int cachectl __P((int req, caddr_t addr, int len)); -void child_return __P((void *)); - void cninit __P((void)); void dumpconf __P((void)); diff --git a/sys/arch/sun3/sun3/trap.c b/sys/arch/sun3/sun3/trap.c index f5f3c079285..f7242c0c6a5 100644 --- a/sys/arch/sun3/sun3/trap.c +++ b/sys/arch/sun3/sun3/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.26 2001/09/14 09:12:21 art Exp $ */ +/* $OpenBSD: trap.c,v 1.27 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: trap.c,v 1.63-1.65ish 1997/01/16 15:41:40 gwr Exp $ */ /* @@ -86,7 +86,7 @@ int nodb_trap __P((int type, struct frame *)); int astpending; int want_resched; -static void userret __P((struct proc *, struct frame *, u_quad_t)); +void userret __P((struct proc *, struct frame *, u_quad_t)); char *trap_type[] = { "Bus error", @@ -147,7 +147,7 @@ int mmupid = -1; * trap and syscall both need the following work done before * returning to user mode. */ -static void +void userret(p, fp, oticks) register struct proc *p; register struct frame *fp; @@ -748,32 +748,6 @@ syscall(code, frame) } /* - * Set up return-value registers as fork() libc stub expects, - * and do normal return-to-user-mode stuff. - */ -void -child_return(p) - void *p; -{ - struct frame *f; - - f = (struct frame *)((struct proc *)p)->p_md.md_regs; - f->f_regs[D0] = 0; - f->f_sr &= ~PSL_C; - f->f_format = FMT0; - - /* - * Old ticks (3rd arg) is zero so we will charge the child - * for any clock ticks that might happen before this point. - */ - userret((struct proc *)p, f, 0); -#ifdef KTRACE - if (KTRPOINT((struct proc *)p, KTR_SYSRET)) - ktrsysret(((struct proc *)p), SYS_fork, 0, 0); -#endif -} - -/* * This is used if we hit a kernel breakpoint or trace trap * when there is no debugger installed (or not attached). * Drop into the PROM temporarily... diff --git a/sys/arch/sun3/sun3/vm_machdep.c b/sys/arch/sun3/sun3/vm_machdep.c index bf7f4f59b99..9b6daee2307 100644 --- a/sys/arch/sun3/sun3/vm_machdep.c +++ b/sys/arch/sun3/sun3/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.20 2001/09/19 20:50:57 mickey Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.21 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: vm_machdep.c,v 1.35 1996/04/26 18:38:06 gwr Exp $ */ /* @@ -72,15 +72,22 @@ * than the parent. Returns 1 in the child process, 0 in the parent. */ void -cpu_fork(p1, p2, stack, stacksize) - register struct proc *p1, *p2; +cpu_fork(p1, p2, stack, stacksize, func, arg) + struct proc *p1, *p2; void *stack; size_t stacksize; + void (*func)(void *); + void *arg; { - register struct pcb *p1pcb = &p1->p_addr->u_pcb; - register struct pcb *p2pcb = &p2->p_addr->u_pcb; - register struct trapframe *p2tf; - register struct switchframe *p2sf; + struct pcb *p1pcb = &p1->p_addr->u_pcb; + struct pcb *p2pcb = &p2->p_addr->u_pcb; + struct trapframe *p2tf; + struct switchframe *p2sf; + struct ksigframe { + struct switchframe sf; + void (*func) (void *); + void *arg; + } *ksfp; /* * Before copying the PCB from the current process, @@ -130,53 +137,9 @@ cpu_fork(p1, p2, stack, stacksize) p2sf->sf_pc = (u_int)proc_do_uret; p2pcb->pcb_regs[11] = (int)p2sf; /* SSP */ - /* - * This will "push a call" to an arbitrary kernel function - * onto the stack of p2, very much like signal delivery. - * When p2 runs, it will find itself in child_return(). - */ - cpu_set_kpc(p2, child_return, p2); -} - -/* - * cpu_set_kpc: - * - * Arrange for in-kernel execution of a process to continue in the - * named function, as if that function were called with one argument, - * the current process's process pointer. - * - * Note that it's assumed that when the named process returns, - * rei() should be invoked, to return to user mode. That is - * accomplished by having cpu_fork set the initial frame with a - * return address pointing to proc_do_uret() which does the rte. - * - * The design allows this function to be implemented as a general - * "kernel sendsig" utility, that can "push" a call to a kernel - * function onto any other process kernel stack, in a way very - * similar to how signal delivery works on a user stack. When - * the named process is switched to, it will call the function - * we "pushed" and then proc_trampoline will pop the args that - * were pushed here and return to where it would have returned - * before we "pushed" this call. - */ -void -cpu_set_kpc(prc, func, arg) - struct proc *prc; - void (*func) (void *); - void *arg; -{ - struct pcb *pcbp; - struct ksigframe { - struct switchframe sf; - void (*func) (void *); - void *arg; - } *ksfp; - - pcbp = &prc->p_addr->u_pcb; - /* Push a ksig frame onto the kernel stack. */ - ksfp = (struct ksigframe *)pcbp->pcb_regs[11] - 1; - pcbp->pcb_regs[11] = (int)ksfp; + ksfp = (struct ksigframe *)p2pcb->pcb_regs[11] - 1; + p2pcb->pcb_regs[11] = (int)ksfp; /* Now fill it in for proc_trampoline. */ ksfp->sf.sf_pc = (u_int)proc_trampoline; diff --git a/sys/arch/vax/vax/vm_machdep.c b/sys/arch/vax/vax/vm_machdep.c index f3bd540ec52..2c19e441160 100644 --- a/sys/arch/vax/vax/vm_machdep.c +++ b/sys/arch/vax/vax/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.25 2001/11/06 02:49:23 art Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.26 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: vm_machdep.c,v 1.67 2000/06/29 07:14:34 mrg Exp $ */ /* @@ -91,8 +91,7 @@ pagemove(from, to, size) * directly to user level with an apparent return value of 0 from * fork(), while the parent process returns normally. * - * p1 is the process being forked; if p1 == &proc0, we are creating - * a kernel thread, and the return path will later be changed in cpu_set_kpc. + * p1 is the process being forked; * * If an alternate user-level stack is requested (with non-zero values * in both the stack and stacksize args), set up the user stack pointer @@ -107,10 +106,12 @@ pagemove(from, to, size) * forking. */ void -cpu_fork(p1, p2, stack, stacksize) +cpu_fork(p1, p2, stack, stacksize, func, arg) struct proc *p1, *p2; void *stack; size_t stacksize; + void (*func)(void *); + void *arg; { struct pte *pt; struct pcb *nyproc; diff --git a/sys/compat/linux/linux_sched.c b/sys/compat/linux/linux_sched.c index 7b0e050a011..4d47196b37f 100644 --- a/sys/compat/linux/linux_sched.c +++ b/sys/compat/linux/linux_sched.c @@ -1,4 +1,4 @@ -/* $OpenBSD: linux_sched.c,v 1.2 2001/05/15 09:34:44 jasoni Exp $ */ +/* $OpenBSD: linux_sched.c,v 1.3 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: linux_sched.c,v 1.6 2000/05/28 05:49:05 thorpej Exp $ */ /*- @@ -96,7 +96,7 @@ linux_sys_clone(p, v, retval) * or down. So, we pass a stack size of 0, so that the code * that makes this adjustment is a noop. */ - return (fork1(p, sig, flags, SCARG(uap, stack), 0, retval)); + return (fork1(p, sig, flags, SCARG(uap, stack), 0, NULL, NULL, retval)); } int diff --git a/sys/compat/netbsd/netbsd_misc.c b/sys/compat/netbsd/netbsd_misc.c index d6c22b6aa68..3489e366a8e 100644 --- a/sys/compat/netbsd/netbsd_misc.c +++ b/sys/compat/netbsd/netbsd_misc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: netbsd_misc.c,v 1.11 2001/04/03 20:37:16 niklas Exp $ */ +/* $OpenBSD: netbsd_misc.c,v 1.12 2001/11/06 18:41:10 art Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1991, 1993 @@ -60,7 +60,8 @@ netbsd_sys___vfork14(p, v, retval) void *v; register_t *retval; { - return (fork1(p, SIGCHLD, FORK_PPWAIT|FORK_SHAREVM, NULL, 0, retval)); + return (fork1(p, SIGCHLD, FORK_PPWAIT|FORK_SHAREVM, NULL, 0, NULL, + NULL, retval)); } /* XXX syncs whole file */ diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index fcb3083fa05..4d7f4265c74 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -1,4 +1,4 @@ -/* $OpenBSD: init_main.c,v 1.80 2001/11/06 13:36:52 art Exp $ */ +/* $OpenBSD: init_main.c,v 1.81 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: init_main.c,v 1.84.4.1 1996/06/02 09:08:06 mrg Exp $ */ /* @@ -400,10 +400,8 @@ main(framep) p->p_rtime.tv_sec = p->p_rtime.tv_usec = 0; /* Create process 1 (init(8)). */ - if (fork1(p, SIGCHLD, FORK_FORK, NULL, 0, rval)) + if (fork1(p, SIGCHLD, FORK_FORK, NULL, 0, start_init, NULL, rval)) panic("fork init"); - initproc = pfind(rval[0]); - cpu_set_kpc(initproc, start_init, initproc); /* Create process 2, the pageout daemon kernel thread. */ if (kthread_create(uvm_pageout, NULL, NULL, "pagedaemon")) @@ -487,6 +485,8 @@ start_init(arg) char flags[4], *flagsp; char **pathp, *path, *ucp, **uap, *arg0, *arg1 = NULL; + initproc = p; + /* * Now in process 1. */ diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 01393fee290..e3db4cdc4d5 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_fork.c,v 1.45 2001/11/06 13:36:52 art Exp $ */ +/* $OpenBSD: kern_fork.c,v 1.46 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: kern_fork.c,v 1.29 1996/02/09 18:59:34 christos Exp $ */ /* @@ -79,7 +79,7 @@ sys_fork(p, v, retval) void *v; register_t *retval; { - return (fork1(p, SIGCHLD, FORK_FORK, NULL, 0, retval)); + return (fork1(p, SIGCHLD, FORK_FORK, NULL, 0, NULL, NULL, retval)); } /*ARGSUSED*/ @@ -89,7 +89,8 @@ sys_vfork(p, v, retval) void *v; register_t *retval; { - return (fork1(p, SIGCHLD, FORK_VFORK|FORK_PPWAIT, NULL, 0, retval)); + return (fork1(p, SIGCHLD, FORK_VFORK|FORK_PPWAIT, NULL, 0, NULL, + NULL, retval)); } int @@ -130,16 +131,18 @@ sys_rfork(p, v, retval) if (rforkflags & RFMEM) flags |= FORK_VMNOSTACK; - return (fork1(p, SIGCHLD, flags, NULL, 0, retval)); + return (fork1(p, SIGCHLD, flags, NULL, 0, NULL, NULL, retval)); } int -fork1(p1, exitsig, flags, stack, stacksize, retval) - register struct proc *p1; +fork1(p1, exitsig, flags, stack, stacksize, func, arg, retval) + struct proc *p1; int exitsig; int flags; void *stack; size_t stacksize; + void (*func)(void *); + void *arg; register_t *retval; { struct proc *p2; @@ -360,7 +363,7 @@ again: * different path later. */ uvm_fork(p1, p2, ((flags & FORK_SHAREVM) ? TRUE : FALSE), stack, - stacksize); + stacksize, func ? func : child_return, arg ? arg : p2); vm = p2->p_vmspace; diff --git a/sys/kern/kern_kthread.c b/sys/kern/kern_kthread.c index ac09d23fdc8..bc392d5ca51 100644 --- a/sys/kern/kern_kthread.c +++ b/sys/kern/kern_kthread.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_kthread.c,v 1.14 2001/08/08 02:37:40 millert Exp $ */ +/* $OpenBSD: kern_kthread.c,v 1.15 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: kern_kthread.c,v 1.3 1998/12/22 21:21:36 kleink Exp $ */ /*- @@ -84,15 +84,12 @@ kthread_create(func, arg, newpp, fmt, va_alist) * parent to wait for. */ error = fork1(&proc0, 0, - FORK_SHAREVM|FORK_NOZOMBIE|FORK_SIGHAND, NULL, 0, rv); + FORK_SHAREVM|FORK_NOZOMBIE|FORK_SIGHAND, NULL, 0, func, arg, rv); if (error) return (error); p2 = pfind(rv[0]); - /* Arrange for it to start at the specified function. */ - cpu_set_kpc(p2, func, arg); - /* * Mark it as a system process and not a candidate for * swapping. diff --git a/sys/sys/proc.h b/sys/sys/proc.h index a28d7e0d4f4..e365e4c3767 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: proc.h,v 1.48 2001/08/22 10:29:42 niklas Exp $ */ +/* $OpenBSD: proc.h,v 1.49 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: proc.h,v 1.44 1996/04/22 01:23:21 christos Exp $ */ /*- @@ -377,13 +377,16 @@ void wakeup __P((void *chan)); void reaper __P((void)); void exit1 __P((struct proc *, int)); void exit2 __P((struct proc *)); -int fork1 __P((struct proc *, int, int, void *, size_t, register_t *)); +int fork1 __P((struct proc *, int, int, void *, size_t, void (*)(void *), + void *, register_t *)); void rqinit __P((void)); int groupmember __P((gid_t, struct ucred *)); void cpu_switch __P((struct proc *)); void cpu_wait __P((struct proc *)); void cpu_exit __P((struct proc *)); +void child_return __P((void *)); + int proc_cansugid __P((struct proc *)); void proc_zap __P((struct proc *)); #endif /* _KERNEL */ diff --git a/sys/sys/systm.h b/sys/sys/systm.h index 6e53938b79b..53b21ab0ba5 100644 --- a/sys/sys/systm.h +++ b/sys/sys/systm.h @@ -1,4 +1,4 @@ -/* $OpenBSD: systm.h,v 1.43 2001/08/26 04:10:56 deraadt Exp $ */ +/* $OpenBSD: systm.h,v 1.44 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: systm.h,v 1.50 1996/06/09 04:55:09 briggs Exp $ */ /*- @@ -288,7 +288,6 @@ void consinit __P((void)); void cpu_startup __P((void)); void cpu_configure __P((void)); -void cpu_set_kpc __P((struct proc *, void (*)(void *), void *)); extern void (*md_diskconf) __P((void)); diff --git a/sys/uvm/uvm_extern.h b/sys/uvm/uvm_extern.h index 249713f25f6..c294b3d2987 100644 --- a/sys/uvm/uvm_extern.h +++ b/sys/uvm/uvm_extern.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_extern.h,v 1.27 2001/11/06 13:36:52 art Exp $ */ +/* $OpenBSD: uvm_extern.h,v 1.28 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: uvm_extern.h,v 1.48 2000/08/12 22:41:55 thorpej Exp $ */ /* @@ -426,17 +426,6 @@ struct core; #ifdef _KERNEL -/* vm_machdep.c */ -void vmapbuf __P((struct buf *, vsize_t)); -void vunmapbuf __P((struct buf *, vsize_t)); -void pagemove __P((caddr_t, caddr_t, size_t)); -#ifndef cpu_swapin -void cpu_swapin __P((struct proc *)); -#endif -#ifndef cpu_swapout -void cpu_swapout __P((struct proc *)); -#endif - /* uvm_aobj.c */ struct uvm_object *uao_create __P((vsize_t, int)); void uao_detach __P((struct uvm_object *)); @@ -454,7 +443,7 @@ int uvm_fault __P((vm_map_t, vaddr_t, void uvm_chgkprot __P((caddr_t, size_t, int)); #endif void uvm_fork __P((struct proc *, struct proc *, boolean_t, - void *, size_t)); + void *, size_t, void (*)(void *), void *)); void uvm_exit __P((struct proc *)); void uvm_init_limits __P((struct proc *)); boolean_t uvm_kernacc __P((caddr_t, size_t, int)); @@ -581,7 +570,8 @@ void swstrategy __P((struct buf *)); void vmapbuf __P((struct buf *, vsize_t)); void vunmapbuf __P((struct buf *, vsize_t)); void pagemove __P((caddr_t, caddr_t, size_t)); -void cpu_fork __P((struct proc *, struct proc *, void *, size_t)); +void cpu_fork __P((struct proc *, struct proc *, void *, size_t, + void (*)(void *), void *)); #ifndef cpu_swapin void cpu_swapin __P((struct proc *)); #endif diff --git a/sys/uvm/uvm_glue.c b/sys/uvm/uvm_glue.c index ba10fa92b50..95f24367cc1 100644 --- a/sys/uvm/uvm_glue.c +++ b/sys/uvm/uvm_glue.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_glue.c,v 1.23 2001/11/06 13:36:52 art Exp $ */ +/* $OpenBSD: uvm_glue.c,v 1.24 2001/11/06 18:41:10 art Exp $ */ /* $NetBSD: uvm_glue.c,v 1.40 2000/08/21 02:29:32 thorpej Exp $ */ /* @@ -265,11 +265,13 @@ uvm_vsunlock(p, addr, len) * than just hang */ void -uvm_fork(p1, p2, shared, stack, stacksize) +uvm_fork(p1, p2, shared, stack, stacksize, func, arg) struct proc *p1, *p2; boolean_t shared; void *stack; size_t stacksize; + void (*func) __P((void *)); + void *arg; { struct user *up = p2->p_addr; int rv; @@ -306,11 +308,13 @@ uvm_fork(p1, p2, shared, stack, stacksize) (caddr_t)&up->u_stats.pstat_startcopy)); /* - * cpu_fork will copy and update the kernel stack and pcb, and make - * the child ready to run. The child will exit directly to user - * mode on its first time slice, and will not return here. + * cpu_fork() copy and update the pcb, and make the child ready + * to run. If this is a normal user fork, the child will exit + * directly to user mode via child_return() on its first time + * slice and will not return here. If this is a kernel thread, + * the specified entry point will be executed. */ - cpu_fork(p1, p2, stack, stacksize); + cpu_fork(p1, p2, stack, stacksize, func, arg); } /* |