summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDale Rahn <drahn@cvs.openbsd.org>2003-04-28 21:32:09 +0000
committerDale Rahn <drahn@cvs.openbsd.org>2003-04-28 21:32:09 +0000
commitc106c73dfd41f77fe797883162069614720a47f9 (patch)
tree181c1749c1f858436214069f2ce9f027ed804691
parent2050ddbc7001fceb763e62efe6d646ef12228f05 (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, booted, and 'make includes' before building ld.so with this change.
-rw-r--r--lib/libc/sys/mquery.c9
-rw-r--r--libexec/ld.so/i386/archdep.h11
-rw-r--r--libexec/ld.so/library_mquery.c15
-rw-r--r--sys/kern/syscalls.master8
-rw-r--r--sys/sys/mman.h4
-rw-r--r--sys/uvm/uvm_mmap.c87
6 files changed, 110 insertions, 24 deletions
diff --git a/lib/libc/sys/mquery.c b/lib/libc/sys/mquery.c
index c58d466ca20..f5277d49fe1 100644
--- a/lib/libc/sys/mquery.c
+++ b/lib/libc/sys/mquery.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mquery.c,v 1.3 2003/04/25 20:32:07 drahn Exp $ */
+/* $OpenBSD: mquery.c,v 1.4 2003/04/28 21:32:08 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 c7d003e2c89..29143adede9 100644
--- a/libexec/ld.so/i386/archdep.h
+++ b/libexec/ld.so/i386/archdep.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: archdep.h,v 1.6 2003/04/25 20:32:07 drahn Exp $ */
+/* $OpenBSD: archdep.h,v 1.7 2003/04/28 21:32:08 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 2a3cb267dd5..2ed736bd541 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.5 2003/04/25 20:32:07 drahn Exp $ */
+/* $OpenBSD: library_mquery.c,v 1.6 2003/04/28 21:32:08 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 878fcd0010b..2eaec396254 100644
--- a/sys/kern/syscalls.master
+++ b/sys/kern/syscalls.master
@@ -1,4 +1,4 @@
-; $OpenBSD: syscalls.master,v 1.55 2003/04/25 20:32:07 drahn Exp $
+; $OpenBSD: syscalls.master,v 1.56 2003/04/28 21:32:08 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 e4e2e0aca6f..f98b4995f77 100644
--- a/sys/sys/mman.h
+++ b/sys/sys/mman.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: mman.h,v 1.14 2003/04/25 20:32:07 drahn Exp $ */
+/* $OpenBSD: mman.h,v 1.15 2003/04/28 21:32:08 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 5da4bf71caa..728f10e4eb1 100644
--- a/sys/uvm/uvm_mmap.c
+++ b/sys/uvm/uvm_mmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uvm_mmap.c,v 1.44 2003/04/25 20:32:07 drahn Exp $ */
+/* $OpenBSD: uvm_mmap.c,v 1.45 2003/04/28 21:32:08 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;