summaryrefslogtreecommitdiffstats
path: root/sys/kern/exec_elf.c
diff options
context:
space:
mode:
authorariane <ariane@openbsd.org>2011-06-06 17:10:23 +0000
committerariane <ariane@openbsd.org>2011-06-06 17:10:23 +0000
commit97581e8a0a11f01a47d6770c7128a59e7705ac0a (patch)
treeae5dfa1059412b2100527a457aa3ec56e96a260e /sys/kern/exec_elf.c
parentpush kernel malloc(9) and kernel stacks into non-dma memory, since that (diff)
downloadwireguard-openbsd-97581e8a0a11f01a47d6770c7128a59e7705ac0a.tar.xz
wireguard-openbsd-97581e8a0a11f01a47d6770c7128a59e7705ac0a.zip
Backout vmmap in order to repair virtual address selection algorithms
outside the tree.
Diffstat (limited to 'sys/kern/exec_elf.c')
-rw-r--r--sys/kern/exec_elf.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/sys/kern/exec_elf.c b/sys/kern/exec_elf.c
index d4bdfd1ba7e..542d9295839 100644
--- a/sys/kern/exec_elf.c
+++ b/sys/kern/exec_elf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: exec_elf.c,v 1.82 2011/05/24 15:27:36 ariane Exp $ */
+/* $OpenBSD: exec_elf.c,v 1.83 2011/06/06 17:10:23 ariane Exp $ */
/*
* Copyright (c) 1996 Per Fogelstrom
@@ -333,7 +333,6 @@ ELFNAME(load_file)(struct proc *p, char *path, struct exec_package *epp,
int nload, idx = 0;
Elf_Addr pos = *last;
int file_align;
- int loop;
NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, path, p);
if ((error = namei(&nd)) != 0) {
@@ -390,7 +389,6 @@ ELFNAME(load_file)(struct proc *p, char *path, struct exec_package *epp,
pos = ELF_ROUND(pos, file_align);
*last = epp->ep_interp_pos = pos;
- loop = 0;
for (i = 0; i < nload;/**/) {
vaddr_t addr;
struct uvm_object *uobj;
@@ -418,17 +416,17 @@ ELFNAME(load_file)(struct proc *p, char *path, struct exec_package *epp,
addr = round_page((vaddr_t)p->p_vmspace->vm_daddr +
BRKSIZ);
- if (uvm_map_mquery(&p->p_vmspace->vm_map, &addr, size,
- (i == 0 ? uoff : UVM_UNKNOWN_OFFSET), 0) != 0) {
- if (loop == 0) {
- loop = 1;
- i = 0;
- *last = epp->ep_interp_pos = pos = 0;
- continue;
+ vm_map_lock(&p->p_vmspace->vm_map);
+ if (uvm_map_findspace(&p->p_vmspace->vm_map, addr, size,
+ &addr, uobj, uoff, 0, UVM_FLAG_FIXED) == NULL) {
+ if (uvm_map_findspace(&p->p_vmspace->vm_map, addr, size,
+ &addr, uobj, uoff, 0, 0) == NULL) {
+ error = ENOMEM; /* XXX */
+ vm_map_unlock(&p->p_vmspace->vm_map);
+ goto bad1;
}
- error = ENOMEM;
- goto bad1;
- }
+ }
+ vm_map_unlock(&p->p_vmspace->vm_map);
if (addr != pos + loadmap[i].vaddr) {
/* base changed. */
pos = addr - trunc_page(loadmap[i].vaddr);