Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-1-4]: src/sys/arch/sun3/sun3 That last commit left pagemove() ent...
details: https://anonhg.NetBSD.org/src/rev/845233acffd9
branches: netbsd-1-4
changeset: 468097:845233acffd9
user: gwr <gwr%NetBSD.org@localhost>
date: Wed Apr 07 06:08:00 1999 +0000
description:
That last commit left pagemove() entering random mappings...
diffstat:
sys/arch/sun3/sun3/vm_machdep.c | 406 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 406 insertions(+), 0 deletions(-)
diffs (truncated from 410 to 300 lines):
diff -r 2aa26c721d2d -r 845233acffd9 sys/arch/sun3/sun3/vm_machdep.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/sun3/sun3/vm_machdep.c Wed Apr 07 06:08:00 1999 +0000
@@ -0,0 +1,406 @@
+/* $NetBSD: vm_machdep.c,v 1.49.2.2 1999/04/07 06:08:00 gwr Exp $ */
+
+/*
+ * Copyright (c) 1994, 1995 Gordon W. Ross
+ * Copyright (c) 1993 Adam Glass
+ * Copyright (c) 1988 University of Utah.
+ * Copyright (c) 1982, 1986, 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * the Systems Programming Group of the University of Utah Computer
+ * Science Department.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * from: Utah $Hdr: vm_machdep.c 1.21 91/04/06$
+ * from: @(#)vm_machdep.c 8.6 (Berkeley) 1/12/94
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/malloc.h>
+#include <sys/buf.h>
+#include <sys/vnode.h>
+#include <sys/user.h>
+#include <sys/core.h>
+#include <sys/exec.h>
+
+#include <vm/vm.h>
+#include <vm/vm_kern.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <machine/cpu.h>
+#include <machine/reg.h>
+#include <machine/pte.h>
+#include <machine/pmap.h>
+
+#include <sun3/sun3/machdep.h>
+
+extern void proc_do_uret __P((void));
+extern void proc_trampoline __P((void));
+
+/*
+ * Finish a fork operation, with process p2 nearly set up.
+ * Copy and update the kernel stack and pcb, making the child
+ * ready to run, and marking it so that it can return differently
+ * than the parent. Returns 1 in the child process, 0 in the parent.
+ */
+void
+cpu_fork(p1, p2)
+ register struct proc *p1, *p2;
+{
+ 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;
+
+ /*
+ * Before copying the PCB from the current process,
+ * make sure it is up-to-date. (p1 == curproc)
+ */
+ if (p1 == curproc)
+ savectx(p1pcb);
+#ifdef DIAGNOSTIC
+ else if (p1 != &proc0)
+ panic("cpu_fork: curproc");
+#endif
+
+ /* copy over the machdep part of struct proc */
+ p2->p_md.md_flags = p1->p_md.md_flags;
+
+ /* Copy pcb from proc p1 to p2. */
+ bcopy(p1pcb, p2pcb, sizeof(*p2pcb));
+
+ /* Child can start with low IPL (XXX - right?) */
+ p2pcb->pcb_ps = PSL_LOWIPL;
+
+ /*
+ * Our cpu_switch MUST always call PMAP_ACTIVATE on a
+ * process switch so there is no need to do it here.
+ * (Our PMAP_ACTIVATE call allocates an MMU context.)
+ */
+
+ /*
+ * Create the child's kernel stack, from scratch.
+ * Pick a stack pointer, leaving room for a trapframe;
+ * copy trapframe from parent so return to user mode
+ * will be to right address, with correct registers.
+ * Leave one word unused at the end of the kernel stack
+ * so the system stack pointer stays within the page.
+ */
+ p2tf = (struct trapframe *)((char*)p2pcb + USPACE-4) - 1;
+ p2->p_md.md_regs = (int *)p2tf;
+ bcopy(p1->p_md.md_regs, p2tf, sizeof(*p2tf));
+
+ /*
+ * Create a "switch frame" such that when cpu_switch returns,
+ * this process will be in proc_do_uret() going to user mode.
+ */
+ p2sf = (struct switchframe *)p2tf - 1;
+ 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 the supplied
+ * argument.
+ *
+ * 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(proc, func, arg)
+ struct proc *proc;
+ void (*func) __P((void *));
+ void *arg;
+{
+ struct pcb *pcbp;
+ struct ksigframe {
+ struct switchframe sf;
+ void (*func) __P((void *));
+ void *arg;
+ } *ksfp;
+
+ pcbp = &proc->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;
+
+ /* Now fill it in for proc_trampoline. */
+ ksfp->sf.sf_pc = (u_int)proc_trampoline;
+ ksfp->func = func;
+ ksfp->arg = arg;
+}
+
+/*
+ * cpu_exit is called as the last action during exit.
+ *
+ * Block context switches and then call switch_exit() which will
+ * switch to another process thus we never return.
+ */
+void
+cpu_exit(p)
+ struct proc *p;
+{
+
+ (void) splhigh();
+ uvmexp.swtch++;
+ switch_exit(p);
+ /* NOTREACHED */
+}
+
+/*
+ * Do any additional state-saving necessary before swapout.
+ */
+void
+cpu_swapout(p)
+ register struct proc *p;
+{
+
+ /*
+ * This will have real work to do when we implement the
+ * context-switch optimization of not switching FPU state
+ * until the new process actually uses FPU instructions.
+ */
+}
+
+/*
+ * Do any additional state-restoration after swapin.
+ * The pcb will be at the same KVA, but it may now
+ * reside in different physical pages.
+ */
+void
+cpu_swapin(p)
+ register struct proc *p;
+{
+
+ /*
+ * XXX - Just for debugging... (later).
+ */
+}
+
+/*
+ * Dump the machine specific segment at the start of a core dump.
+ * This means the CPU and FPU registers. The format used here is
+ * the same one ptrace uses, so gdb can be machine independent.
+ *
+ * XXX - Generate Sun format core dumps for Sun executables?
+ */
+struct md_core {
+ struct reg intreg;
+ struct fpreg freg;
+};
+int
+cpu_coredump(p, vp, cred, chdr)
+ struct proc *p;
+ struct vnode *vp;
+ struct ucred *cred;
+ struct core *chdr;
+{
+ struct md_core md_core;
+ struct coreseg cseg;
+ int error;
+
+ /* XXX: Make sure savectx() was done? */
+
+ CORE_SETMAGIC(*chdr, COREMAGIC, MID_MACHINE, 0);
+ chdr->c_hdrsize = ALIGN(sizeof(*chdr));
+ chdr->c_seghdrsize = ALIGN(sizeof(cseg));
+ chdr->c_cpusize = sizeof(md_core);
+
+ /* Save integer registers. */
+ error = process_read_regs(p, &md_core.intreg);
+ if (error)
+ return error;
+
+ /* Save floating point registers. */
+ error = process_read_fpregs(p, &md_core.freg);
+ if (error)
+ return error;
+
+ CORE_SETMAGIC(cseg, CORESEGMAGIC, MID_MACHINE, CORE_CPU);
+ cseg.c_addr = 0;
+ cseg.c_size = chdr->c_cpusize;
+
+ error = vn_rdwr(UIO_WRITE, vp, (caddr_t)&cseg, chdr->c_seghdrsize,
+ (off_t)chdr->c_hdrsize, UIO_SYSSPACE,
+ IO_NODELOCKED|IO_UNIT, cred, NULL, p);
+ if (error)
+ return error;
+
+ error = vn_rdwr(UIO_WRITE, vp, (caddr_t)&md_core, sizeof(md_core),
+ (off_t)(chdr->c_hdrsize + chdr->c_seghdrsize), UIO_SYSSPACE,
+ IO_NODELOCKED|IO_UNIT, cred, NULL, p);
+ if (error)
+ return error;
+
+ chdr->c_nseg++;
+ return (0);
+}
+
+/*
+ * Move pages from one kernel virtual address to another.
+ * Both addresses are assumed to reside in the kernel map,
+ * and size must be a multiple of CLSIZE.
+ */
Home |
Main Index |
Thread Index |
Old Index