diff options
author | Dale Rahn <drahn@cvs.openbsd.org> | 2003-04-25 18:30:19 +0000 |
---|---|---|
committer | Dale Rahn <drahn@cvs.openbsd.org> | 2003-04-25 18:30:19 +0000 |
commit | 8841d81531b38e0ec365213db0159742de302e6a (patch) | |
tree | 347da186972c9f7b017672935e5023ef3390cb6d | |
parent | a5d055cd3e7192e8ab92e3d23f447d6e7e92855e (diff) |
change mquery() function call signature to be the same a mmap(). It
needs the prot/flags info and passing the addresses via arg/return allows
it to be traced via ktrace better than an in/out paramter.
This adds a new mquery syscall and renames the old one to omquery.
New kernel _MUST_ be built and installed before building ld.so with this change.
ok millert@ tedu@
-rw-r--r-- | lib/libc/sys/mquery.c | 9 | ||||
-rw-r--r-- | libexec/ld.so/i386/archdep.h | 11 | ||||
-rw-r--r-- | libexec/ld.so/library_mquery.c | 15 | ||||
-rw-r--r-- | sys/kern/syscalls.master | 8 | ||||
-rw-r--r-- | sys/sys/mman.h | 4 | ||||
-rw-r--r-- | sys/uvm/uvm_mmap.c | 87 |
6 files changed, 110 insertions, 24 deletions
diff --git a/lib/libc/sys/mquery.c b/lib/libc/sys/mquery.c index 2cb28e27a9b..92856a2c70a 100644 --- a/lib/libc/sys/mquery.c +++ b/lib/libc/sys/mquery.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mquery.c,v 1.1 2003/04/14 04:53:50 art Exp $ */ +/* $OpenBSD: mquery.c,v 1.2 2003/04/25 18:30:18 drahn Exp $ */ /* * Written by Artur Grabowski <art@openbsd.org> Public Domain */ @@ -10,8 +10,9 @@ /* * This function provides 64-bit offset padding. */ -int -mquery(int flags, void **addr, size_t size, int fd, off_t off) +void * +mquery(void *addr, size_t len, int prot, int flags, int fd, off_t offset) { - return(__syscall((quad_t)SYS_mquery, flags, addr, size, fd, off)); + return((void *)(long)__syscall((quad_t)SYS_mquery, addr, len, prot, + flags, fd, 0, offset)); } diff --git a/libexec/ld.so/i386/archdep.h b/libexec/ld.so/i386/archdep.h index 6efcf183cc9..8d2bc4c1b8c 100644 --- a/libexec/ld.so/i386/archdep.h +++ b/libexec/ld.so/i386/archdep.h @@ -1,4 +1,4 @@ -/* $OpenBSD: archdep.h,v 1.4 2003/04/17 03:40:49 drahn Exp $ */ +/* $OpenBSD: archdep.h,v 1.5 2003/04/25 18:30:18 drahn Exp $ */ /* * Copyright (c) 1998 Per Fogelstrom, Opsycon AB @@ -56,12 +56,15 @@ _dl_mmap(void *addr, unsigned int len, unsigned int prot, flags, fd, 0, offset)); } -static inline int -_dl_mquery(int flags, void **addr, size_t size, int fd, off_t off) +static inline void * +_dl_mquery(void *addr, unsigned int len, unsigned int prot, + unsigned int flags, int fd, off_t offset) { - return(_dl__syscall((quad_t)SYS_mquery, flags, addr, size, fd, off)); + return((void *)_dl__syscall((quad_t)SYS_mquery, addr, len, prot, + flags, fd, 0, offset)); } + static inline void RELOC_REL(Elf32_Rel *r, const Elf32_Sym *s, Elf32_Addr *p, unsigned long v) { diff --git a/libexec/ld.so/library_mquery.c b/libexec/ld.so/library_mquery.c index cec2fa9c366..84bf421d046 100644 --- a/libexec/ld.so/library_mquery.c +++ b/libexec/ld.so/library_mquery.c @@ -1,4 +1,4 @@ -/* $OpenBSD: library_mquery.c,v 1.3 2003/04/21 14:35:50 drahn Exp $ */ +/* $OpenBSD: library_mquery.c,v 1.4 2003/04/25 18:30:18 drahn Exp $ */ /* * Copyright (c) 2002 Dale Rahn @@ -445,7 +445,6 @@ retry: for (ld = lowld; ld != NULL; ld = ld->next) { off_t foff; int fd, flags; - int error; /* * We don't want to provide the fd/off hint for anything @@ -473,13 +472,13 @@ retry: * adjust the base mapping address to match this free mapping * and restart the process again. */ - error = _dl_mquery(flags, &ld->start, ROUND_PG(ld->size), fd, - foff); - if (_dl_check_error(error)) { + ld->start = _dl_mquery(ld->start, ROUND_PG(ld->size), ld->prot, + flags, fd, foff); + if (_dl_check_error(ld->start)) { ld->start = (void *)(LOFF + ld->moff); - error = _dl_mquery(0, &ld->start, ROUND_PG(ld->size), - fd, foff); - if (_dl_check_error(error)) + ld->start = _dl_mquery(ld->start, ROUND_PG(ld->size), + ld->prot, flags & ~MAP_FIXED, fd, foff); + if (_dl_check_error(ld->start)) goto fail; } diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index e414ac0e100..6d216318a76 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -1,4 +1,4 @@ -; $OpenBSD: syscalls.master,v 1.53 2003/04/14 04:53:50 art Exp $ +; $OpenBSD: syscalls.master,v 1.54 2003/04/25 18:30:18 drahn Exp $ ; $NetBSD: syscalls.master,v 1.32 1996/04/23 10:24:21 mycroft Exp $ ; @(#)syscalls.master 8.2 (Berkeley) 1/13/94 @@ -570,5 +570,7 @@ gid_t *sgid); } 284 STD { int sys_setresgid(gid_t rgid, gid_t egid, \ gid_t sgid); } -285 STD { int sys_mquery(int flags, void **addr, size_t size, \ - int fd, off_t off); } +285 STD { int sys_omquery(int flags, void **addr, \ + size_t size, int fd, off_t off); } +286 STD { void *sys_mquery(void *addr, size_t len, int prot, \ + int flags, int fd, long pad, off_t pos); } diff --git a/sys/sys/mman.h b/sys/sys/mman.h index 180c57726a8..adbe900f950 100644 --- a/sys/sys/mman.h +++ b/sys/sys/mman.h @@ -1,4 +1,4 @@ -/* $OpenBSD: mman.h,v 1.12 2003/04/14 04:53:50 art Exp $ */ +/* $OpenBSD: mman.h,v 1.13 2003/04/25 18:30:18 drahn Exp $ */ /* $NetBSD: mman.h,v 1.11 1995/03/26 20:24:23 jtc Exp $ */ /*- @@ -123,7 +123,7 @@ int munlockall(void); int madvise(void *, size_t, int); int mincore(void *, size_t, char *); int minherit(void *, size_t, int); -int mquery(int flags, void **addr, size_t size, int fd, off_t off); +void * mquery(void *, size_t, int, int, int, off_t); __END_DECLS #endif /* !_KERNEL */ diff --git a/sys/uvm/uvm_mmap.c b/sys/uvm/uvm_mmap.c index c8ed69d8bbe..1a8676a241c 100644 --- a/sys/uvm/uvm_mmap.c +++ b/sys/uvm/uvm_mmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_mmap.c,v 1.42 2003/04/18 23:47:59 drahn Exp $ */ +/* $OpenBSD: uvm_mmap.c,v 1.43 2003/04/25 18:30:18 drahn Exp $ */ /* $NetBSD: uvm_mmap.c,v 1.49 2001/02/18 21:19:08 chs Exp $ */ /* @@ -127,11 +127,92 @@ sys_sstk(p, v, retval) * off: offset within the file */ -/* ARGSUSED */ int -sys_mquery(struct proc *p, void *v, register_t *retval) +sys_mquery(p, v, retval) + struct proc *p; + void *v; + register_t *retval; { struct sys_mquery_args /* { + syscallarg(caddr_t) addr; + syscallarg(size_t) len; + syscallarg(int) prot; + syscallarg(int) flags; + syscallarg(int) fd; + syscallarg(long) pad; + syscallarg(off_t) pos; + } */ *uap = v; + struct file *fp; + struct uvm_object *uobj; + voff_t uoff; + int error; + vaddr_t vaddr; + int flags = 0; + vsize_t size; + vm_prot_t prot; + int fd; + + vaddr = (vaddr_t) SCARG(uap, addr); + prot = SCARG(uap, prot) & VM_PROT_ALL; + size = (vsize_t) SCARG(uap, len); + fd = SCARG(uap, fd); + + if (SCARG(uap, flags) & MAP_FIXED) + flags |= UVM_FLAG_FIXED; + + if (fd >= 0) { + if ((error = getvnode(p->p_fd, fd, &fp)) != 0) + return (error); + uobj = &((struct vnode *)fp->f_data)->v_uvm.u_obj; + uoff = SCARG(uap, pos); + } else { + fp = NULL; + uobj = NULL; + uoff = 0; + } + + if (vaddr == 0) + vaddr = uvm_map_hint(p, prot); + + /* prevent a user requested address from falling in heap space */ + if ((vaddr + size > (vaddr_t)p->p_vmspace->vm_daddr) && + (vaddr < (vaddr_t)p->p_vmspace->vm_daddr + MAXDSIZ)) { + if (flags & UVM_FLAG_FIXED) { + error = EINVAL; + goto done; + } + vaddr = round_page((vaddr_t)p->p_vmspace->vm_daddr + MAXDSIZ); + } +again: + + if (uvm_map_findspace(&p->p_vmspace->vm_map, vaddr, size, + &vaddr, uobj, uoff, 0, flags) == NULL) { + if (flags & UVM_FLAG_FIXED) + error = EINVAL; + else + error = ENOMEM; + } else { + /* prevent a returned address from falling in heap space */ + if ((vaddr + size > (vaddr_t)p->p_vmspace->vm_daddr) + && (vaddr < (vaddr_t)p->p_vmspace->vm_daddr + MAXDSIZ)) { + vaddr = round_page((vaddr_t)p->p_vmspace->vm_daddr + + MAXDSIZ); + goto again; + } + error = 0; + *retval = (register_t)(vaddr); + } +done: + if (fp != NULL) + FRELE(fp); + return (error); +} + +/* ARGSUSED */ +int +sys_omquery(struct proc *p, void *v, register_t *retval) +{ + struct sys_omquery_args /* { syscallarg(int) flags; syscallarg(void **) addr; syscallarg(size_t) size; |