Module Name: src Committed By: rmind Date: Sun Mar 29 01:10:28 UTC 2009
Modified Files: src/sys/arch/amd64/amd64: mem.c syscall.c vm_machdep.c src/sys/arch/i386/i386: core_machdep.c mem.c syscall.c vm_machdep.c Log Message: Reduce some differences between i386 and amd64. Mainly cosmetical changes - no functional changes intended. To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/sys/arch/amd64/amd64/mem.c cvs rdiff -u -r1.44 -r1.45 src/sys/arch/amd64/amd64/syscall.c cvs rdiff -u -r1.38 -r1.39 src/sys/arch/amd64/amd64/vm_machdep.c cvs rdiff -u -r1.1 -r1.2 src/sys/arch/i386/i386/core_machdep.c cvs rdiff -u -r1.71 -r1.72 src/sys/arch/i386/i386/mem.c cvs rdiff -u -r1.58 -r1.59 src/sys/arch/i386/i386/syscall.c cvs rdiff -u -r1.144 -r1.145 src/sys/arch/i386/i386/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/amd64/amd64/mem.c diff -u src/sys/arch/amd64/amd64/mem.c:1.18 src/sys/arch/amd64/amd64/mem.c:1.19 --- src/sys/arch/amd64/amd64/mem.c:1.18 Sat Mar 28 21:23:44 2009 +++ src/sys/arch/amd64/amd64/mem.c Sun Mar 29 01:10:28 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: mem.c,v 1.18 2009/03/28 21:23:44 rmind Exp $ */ +/* $NetBSD: mem.c,v 1.19 2009/03/29 01:10:28 rmind Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -101,15 +101,13 @@ * @(#)mem.c 8.3 (Berkeley) 1/12/94 */ -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mem.c,v 1.18 2009/03/28 21:23:44 rmind Exp $"); - -#include "opt_compat_netbsd.h" - /* * Memory special file */ +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: mem.c,v 1.19 2009/03/29 01:10:28 rmind Exp $"); + #include <sys/param.h> #include <sys/buf.h> #include <sys/systm.h> @@ -144,7 +142,6 @@ int check_pa_acc(paddr_t, vm_prot_t); -/* ARGSUSED */ int mmopen(dev_t dev, int flag, int mode, struct lwp *l) { @@ -158,9 +155,8 @@ } return (0); -} +} -/*ARGSUSED*/ int mmrw(dev_t dev, struct uio *uio, int flags) { @@ -180,8 +176,8 @@ continue; } switch (minor(dev)) { - case DEV_MEM: + /* lock against other uses of shared vmmap */ mutex_enter(&mm_lock); v = uio->uio_offset; prot = uio->uio_rw == UIO_READ ? VM_PROT_READ : @@ -242,12 +238,14 @@ return (ENXIO); } } + return (error); } paddr_t mmmmap(dev_t dev, off_t off, int prot) { + /* * /dev/mem is the only one that makes sense through this * interface. For /dev/kmem any physaddr we return here @@ -257,10 +255,10 @@ * pager in mmap(). */ if (minor(dev) != DEV_MEM) - return (-1); + return -1; if (check_pa_acc(off, prot) != 0) - return (-1); + return -1; - return (x86_btop(off)); + return x86_btop(off); } Index: src/sys/arch/amd64/amd64/syscall.c diff -u src/sys/arch/amd64/amd64/syscall.c:1.44 src/sys/arch/amd64/amd64/syscall.c:1.45 --- src/sys/arch/amd64/amd64/syscall.c:1.44 Tue Oct 21 12:16:59 2008 +++ src/sys/arch/amd64/amd64/syscall.c Sun Mar 29 01:10:28 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: syscall.c,v 1.44 2008/10/21 12:16:59 ad Exp $ */ +/* $NetBSD: syscall.c,v 1.45 2009/03/29 01:10:28 rmind Exp $ */ /*- * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.44 2008/10/21 12:16:59 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.45 2009/03/29 01:10:28 rmind Exp $"); #include "opt_sa.h" @@ -95,11 +95,9 @@ l = curlwp; p = l->l_proc; - - code = frame->tf_rax & (SYS_NSYSENT - 1); - LWP_CACHE_CREDS(l, p); + code = frame->tf_rax & (SYS_NSYSENT - 1); callp = p->p_emul->e_sysent + code; SYSCALL_COUNT(syscall_counts, code); @@ -130,6 +128,7 @@ || (error = trace_enter(code, args, callp->sy_narg)) == 0) { rval[0] = 0; rval[1] = 0; + KASSERT(l->l_holdcnt == 0); error = sy_call(callp, l, args, rval); } Index: src/sys/arch/amd64/amd64/vm_machdep.c diff -u src/sys/arch/amd64/amd64/vm_machdep.c:1.38 src/sys/arch/amd64/amd64/vm_machdep.c:1.39 --- src/sys/arch/amd64/amd64/vm_machdep.c:1.38 Sat Mar 28 21:34:17 2009 +++ src/sys/arch/amd64/amd64/vm_machdep.c Sun Mar 29 01:10:28 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: vm_machdep.c,v 1.38 2009/03/28 21:34:17 rmind Exp $ */ +/* $NetBSD: vm_machdep.c,v 1.39 2009/03/29 01:10:28 rmind Exp $ */ /*- * Copyright (c) 1982, 1986 The Regents of the University of California. @@ -80,9 +80,9 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.38 2009/03/28 21:34:17 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.39 2009/03/29 01:10:28 rmind Exp $"); -#include "opt_user_ldt.h" +#include "opt_mtrr.h" #include <sys/param.h> #include <sys/systm.h> @@ -105,22 +105,21 @@ #include <machine/mtrr.h> #endif -extern char x86_64_doubleflt_stack[]; - static void setredzone(struct lwp *); void cpu_proc_fork(struct proc *p1, struct proc *p2) { + p2->p_md.md_flags = p1->p_md.md_flags; if (p1->p_flag & PK_32) p2->p_flag |= PK_32; } /* - * Finish a new thread operation, with lwp l2 nearly set up. + * Finish a new thread operation, with LWP l2 nearly set up. * Copy and update the pcb and trap frame, making the child ready to run. - * + * * Rig the child's kernel stack so that it will start out in * lwp_trampoline() and call child_return() with l2 as an * argument. This causes the newly-created child process to go @@ -137,7 +136,7 @@ */ void cpu_lwp_fork(struct lwp *l1, struct lwp *l2, void *stack, size_t stacksize, - void (*func)(void *), void *arg) + void (*func)(void *), void *arg) { struct pcb *pcb = &l2->l_addr->u_pcb; struct trapframe *tf; @@ -159,11 +158,9 @@ if (l1 == curlwp) { /* Sync the PCB before we copy it. */ savectx(curpcb); + } else { + KASSERT(l1 == &lwp0); } -#ifdef DIAGNOSTIC - else if (l1 != &lwp0) - panic("cpu_fork: curproc"); -#endif *pcb = l1->l_addr->u_pcb; #if defined(XEN) pcb->pcb_iopl = SEL_KPL; @@ -177,6 +174,9 @@ pcb->pcb_rsp0 = (USER_TO_UAREA(l2->l_addr) + KSTACK_SIZE - 16) & ~0xf; + pcb->pcb_fs = l1->l_addr->u_pcb.pcb_fs; + pcb->pcb_gs = l1->l_addr->u_pcb.pcb_gs; + /* * Copy the trapframe. */ @@ -192,9 +192,6 @@ if (stack != NULL) tf->tf_rsp = (uint64_t)stack + stacksize; - pcb->pcb_fs = l1->l_addr->u_pcb.pcb_fs; - pcb->pcb_gs = l1->l_addr->u_pcb.pcb_gs; - cpu_setfunc(l2, func, arg); } @@ -218,6 +215,7 @@ void cpu_swapin(struct lwp *l) { + setredzone(l); } @@ -244,6 +242,10 @@ #endif } +/* + * cpu_lwp_free2 is called when an LWP is being reaped. This routine + * may block. + */ void cpu_lwp_free2(struct lwp *l) { @@ -283,7 +285,7 @@ /* * Map a user I/O request into kernel virtual address space. * Note: the pages are already locked by uvm_vslock(), so we - * do not need to pass an access_type to pmap_enter(). + * do not need to pass an access_type to pmap_enter(). */ void vmapbuf(struct buf *bp, vsize_t len) @@ -291,8 +293,8 @@ vaddr_t faddr, taddr, off; paddr_t fpa; - if ((bp->b_flags & B_PHYS) == 0) - panic("vmapbuf"); + KASSERT((bp->b_flags & B_PHYS) != 0); + bp->b_saveaddr = bp->b_data; faddr = trunc_page((vaddr_t)bp->b_data); off = (vaddr_t)bp->b_data - faddr; @@ -303,7 +305,7 @@ * The region is locked, so we expect that pmap_pte() will return * non-NULL. * XXX: unwise to expect this in a multithreaded environment. - * anything can happen to a pmap between the time we lock a + * anything can happen to a pmap between the time we lock a * region, release the pmap lock, and then relock it for * the pmap_extract(). * @@ -319,6 +321,7 @@ taddr += PAGE_SIZE; len -= PAGE_SIZE; } + pmap_update(pmap_kernel()); } /* @@ -329,8 +332,8 @@ { vaddr_t addr, off; - if ((bp->b_flags & B_PHYS) == 0) - panic("vunmapbuf"); + KASSERT((bp->b_flags & B_PHYS) != 0); + addr = trunc_page((vaddr_t)bp->b_data); off = (vaddr_t)bp->b_data - addr; len = round_page(off + len); Index: src/sys/arch/i386/i386/core_machdep.c diff -u src/sys/arch/i386/i386/core_machdep.c:1.1 src/sys/arch/i386/i386/core_machdep.c:1.2 --- src/sys/arch/i386/i386/core_machdep.c:1.1 Wed Nov 19 18:35:58 2008 +++ src/sys/arch/i386/i386/core_machdep.c Sun Mar 29 01:10:28 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: core_machdep.c,v 1.1 2008/11/19 18:35:58 ad Exp $ */ +/* $NetBSD: core_machdep.c,v 1.2 2009/03/29 01:10:28 rmind Exp $ */ /*- * Copyright (c) 1982, 1986 The Regents of the University of California. @@ -80,12 +80,11 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: core_machdep.c,v 1.1 2008/11/19 18:35:58 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: core_machdep.c,v 1.2 2009/03/29 01:10:28 rmind Exp $"); #include <sys/param.h> #include <sys/systm.h> #include <sys/proc.h> -#include <sys/malloc.h> #include <sys/vnode.h> #include <sys/buf.h> #include <sys/user.h> @@ -99,11 +98,11 @@ #include <machine/gdt.h> #include <machine/reg.h> #include <machine/specialreg.h> -#include <machine/mtrr.h> /* * Dump the machine specific segment at the start of a core dump. */ + struct md_core { struct reg intreg; struct fpreg freg; Index: src/sys/arch/i386/i386/mem.c diff -u src/sys/arch/i386/i386/mem.c:1.71 src/sys/arch/i386/i386/mem.c:1.72 --- src/sys/arch/i386/i386/mem.c:1.71 Fri Nov 14 13:59:10 2008 +++ src/sys/arch/i386/i386/mem.c Sun Mar 29 01:10:28 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: mem.c,v 1.71 2008/11/14 13:59:10 ad Exp $ */ +/* $NetBSD: mem.c,v 1.72 2009/03/29 01:10:28 rmind Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -106,9 +106,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mem.c,v 1.71 2008/11/14 13:59:10 ad Exp $"); - -#include "opt_compat_freebsd.h" +__KERNEL_RCSID(0, "$NetBSD: mem.c,v 1.72 2009/03/29 01:10:28 rmind Exp $"); #include <sys/param.h> #include <sys/buf.h> @@ -126,7 +124,7 @@ #define DEV_IO 14 /* iopl for compat_10 */ -extern char *vmmap; /* poor name! */ +extern void *vmmap; /* poor name! */ void *zeropage; static kmutex_t mm_lock; @@ -137,12 +135,11 @@ const struct cdevsw mem_cdevsw = { mmopen, nullclose, mmrw, mmrw, mmioctl, - nostop, notty, nopoll, mmmmap, nokqfilter, D_OTHER | D_MPSAFE, + nostop, notty, nopoll, mmmmap, nokqfilter, D_OTHER | D_MPSAFE }; int check_pa_acc(paddr_t, vm_prot_t); -/*ARGSUSED*/ int mmopen(dev_t dev, int flag, int mode, struct lwp *l) { @@ -153,7 +150,7 @@ again = true; mutex_init(&mm_lock, MUTEX_DEFAULT, IPL_NONE); zeropage = kmem_zalloc(PAGE_SIZE, KM_SLEEP); - } + } switch (minor(dev)) { /* This is done by i386_iopl(3) now. */ @@ -178,7 +175,6 @@ return (0); } -/*ARGSUSED*/ int mmrw(dev_t dev, struct uio *uio, int flags) { @@ -267,9 +263,8 @@ if (minor(dev) != DEV_MEM) return -1; - if (check_pa_acc(off, prot) != 0) { + if (check_pa_acc(off, prot) != 0) return -1; - } return x86_btop(off); } Index: src/sys/arch/i386/i386/syscall.c diff -u src/sys/arch/i386/i386/syscall.c:1.58 src/sys/arch/i386/i386/syscall.c:1.59 --- src/sys/arch/i386/i386/syscall.c:1.58 Sat Mar 14 15:36:07 2009 +++ src/sys/arch/i386/i386/syscall.c Sun Mar 29 01:10:28 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: syscall.c,v 1.58 2009/03/14 15:36:07 dsl Exp $ */ +/* $NetBSD: syscall.c,v 1.59 2009/03/29 01:10:28 rmind Exp $ */ /*- * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.58 2009/03/14 15:36:07 dsl Exp $"); +__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.59 2009/03/29 01:10:28 rmind Exp $"); #include "opt_vm86.h" #include "opt_sa.h" @@ -40,9 +40,9 @@ #include <sys/proc.h> #include <sys/user.h> #include <sys/signal.h> -#include <sys/ktrace.h> #include <sys/sa.h> #include <sys/savar.h> +#include <sys/ktrace.h> #include <sys/syscall.h> #include <sys/syscallvar.h> #include <sys/syscall_stats.h> @@ -53,13 +53,26 @@ #include <machine/psl.h> #include <machine/userret.h> -void syscall(struct trapframe *); +static void syscall(struct trapframe *); int x86_copyargs(void *, void *, size_t); #ifdef VM86 void syscall_vm86(struct trapframe *); #endif void +child_return(void *arg) +{ + struct lwp *l = arg; + struct trapframe *tf = l->l_md.md_regs; + + tf->tf_eax = 0; + tf->tf_eflags &= ~PSL_C; + + userret(l); + ktrsysret(SYS_fork, 0, 0); +} + +void syscall_intern(struct proc *p) { @@ -71,19 +84,21 @@ * System call request from POSIX system call gate interface to kernel. * Like trap(), argument is call by reference. */ -void +static void syscall(struct trapframe *frame) { const struct sysent *callp; + struct proc *p; struct lwp *l; int error; register_t code, args[2 + SYS_MAXSYSARGS], rval[2]; l = curlwp; - LWP_CACHE_CREDS(l, l->l_proc); + p = l->l_proc; + LWP_CACHE_CREDS(l, p); code = frame->tf_eax & (SYS_NSYSENT - 1); - callp = l->l_proc->p_emul->e_sysent + code; + callp = p->p_emul->e_sysent + code; SYSCALL_COUNT(syscall_counts, code); SYSCALL_TIME_SYS_ENTRY(l, syscall_times, code); @@ -101,7 +116,7 @@ goto bad; } - if (!__predict_false(l->l_proc->p_trace_enabled) + if (!__predict_false(p->p_trace_enabled) || __predict_false(callp->sy_flags & SYCALL_INDIRECT) || (error = trace_enter(frame->tf_eax & (SYS_NSYSENT - 1), args, callp->sy_narg)) == 0) { @@ -111,7 +126,7 @@ error = sy_call(callp, l, args, rval); } - if (__predict_false(l->l_proc->p_trace_enabled) + if (__predict_false(p->p_trace_enabled) && !__predict_false(callp->sy_flags & SYCALL_INDIRECT)) { code = frame->tf_eax & (SYS_NSYSENT - 1); trace_exit(code, rval, error); @@ -174,16 +189,3 @@ userret(l); } #endif - -void -child_return(void *arg) -{ - struct lwp *l = arg; - struct trapframe *tf = l->l_md.md_regs; - - tf->tf_eax = 0; - tf->tf_eflags &= ~PSL_C; - - userret(l); - ktrsysret(SYS_fork, 0, 0); -} Index: src/sys/arch/i386/i386/vm_machdep.c diff -u src/sys/arch/i386/i386/vm_machdep.c:1.144 src/sys/arch/i386/i386/vm_machdep.c:1.145 --- src/sys/arch/i386/i386/vm_machdep.c:1.144 Sat Mar 28 21:34:17 2009 +++ src/sys/arch/i386/i386/vm_machdep.c Sun Mar 29 01:10:28 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: vm_machdep.c,v 1.144 2009/03/28 21:34:17 rmind Exp $ */ +/* $NetBSD: vm_machdep.c,v 1.145 2009/03/29 01:10:28 rmind Exp $ */ /*- * Copyright (c) 1982, 1986 The Regents of the University of California. @@ -80,16 +80,13 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.144 2009/03/28 21:34:17 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.145 2009/03/29 01:10:28 rmind Exp $"); -#include "opt_user_ldt.h" #include "opt_mtrr.h" -#include "opt_execfmt.h" #include <sys/param.h> #include <sys/systm.h> #include <sys/proc.h> -#include <sys/malloc.h> #include <sys/vnode.h> #include <sys/buf.h> #include <sys/user.h> @@ -103,11 +100,13 @@ #include <machine/gdt.h> #include <machine/reg.h> #include <machine/specialreg.h> +#ifdef MTRR #include <machine/mtrr.h> +#endif #include "npx.h" -static void setredzone(struct lwp *l); +static void setredzone(struct lwp *); void cpu_proc_fork(struct proc *p1, struct proc *p2) @@ -155,24 +154,19 @@ if (l1 == curlwp) { /* Sync the PCB before we copy it. */ savectx(curpcb); + } else { + KASSERT(l1 == &lwp0); } -#ifdef DIAGNOSTIC - else if (l1 != &lwp0) - panic("cpu_lwp_fork: curlwp"); -#endif *pcb = l1->l_addr->u_pcb; #if defined(XEN) pcb->pcb_iopl = SEL_KPL; #endif /* defined(XEN) */ - /* - * Fix up the ring0 esp. - */ + l2->l_md.md_astpending = 0; + pcb->pcb_esp0 = USER_TO_UAREA(l2->l_addr) + KSTACK_SIZE - 16; pcb->pcb_iomap = NULL; - - l2->l_md.md_astpending = 0; memcpy(&pcb->pcb_fsd, curpcb->pcb_fsd, sizeof(pcb->pcb_fsd)); memcpy(&pcb->pcb_gsd, curpcb->pcb_gsd, sizeof(pcb->pcb_gsd)); @@ -206,7 +200,7 @@ sf->sf_eip = (int)lwp_trampoline; pcb->pcb_esp = (int)sf; pcb->pcb_ebp = (int)l; -} +} void cpu_swapin(struct lwp *l) @@ -271,7 +265,7 @@ addr = USER_TO_UAREA(l->l_addr); pmap_remove(pmap_kernel(), addr, addr + PAGE_SIZE); pmap_update(pmap_kernel()); -#endif /* DIAGNOSTIC */ +#endif } /* @@ -299,12 +293,13 @@ vaddr_t faddr, taddr, off; paddr_t fpa; - if ((bp->b_flags & B_PHYS) == 0) - panic("vmapbuf"); - faddr = trunc_page((vaddr_t)(bp->b_saveaddr = bp->b_data)); + KASSERT((bp->b_flags & B_PHYS) != 0); + + bp->b_saveaddr = bp->b_data; + faddr = trunc_page((vaddr_t)bp->b_data); off = (vaddr_t)bp->b_data - faddr; len = round_page(off + len); - taddr = uvm_km_alloc(phys_map, len, 0, UVM_KMF_VAONLY|UVM_KMF_WAITVA); + taddr = uvm_km_alloc(phys_map, len, 0, UVM_KMF_VAONLY | UVM_KMF_WAITVA); bp->b_data = (void *)(taddr + off); /* * The region is locked, so we expect that pmap_pte() will return @@ -337,8 +332,8 @@ { vaddr_t addr, off; - if ((bp->b_flags & B_PHYS) == 0) - panic("vunmapbuf"); + KASSERT((bp->b_flags & B_PHYS) != 0); + addr = trunc_page((vaddr_t)bp->b_data); off = (vaddr_t)bp->b_data - addr; len = round_page(off + len);