summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2013-09-09 18:11:59 +0000
committerjhb <jhb@FreeBSD.org>2013-09-09 18:11:59 +0000
commit04bb6e10cd2cbd0ee0de7fef3f81e88ebd43e6b4 (patch)
tree42d2ff2e91fcca16534848427856c6243db2126a /sys/kern
parent2a48fed0b32ceb1567f3b7e33835bacfdf3e0971 (diff)
downloadFreeBSD-src-04bb6e10cd2cbd0ee0de7fef3f81e88ebd43e6b4.zip
FreeBSD-src-04bb6e10cd2cbd0ee0de7fef3f81e88ebd43e6b4.tar.gz
Add a mmap flag (MAP_32BIT) on 64-bit platforms to request that a mapping use
an address in the first 2GB of the process's address space. This flag should have the same semantics as the same flag on Linux. To facilitate this, add a new parameter to vm_map_find() that specifies an optional maximum virtual address. While here, fix several callers of vm_map_find() to use a VMFS_* constant for the findspace argument instead of TRUE and FALSE. Reviewed by: alc Approved by: re (kib)
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/imgact_elf.c5
-rw-r--r--sys/kern/imgact_gzip.c9
-rw-r--r--sys/kern/init_main.c4
-rw-r--r--sys/kern/link_elf.c2
-rw-r--r--sys/kern/link_elf_obj.c3
-rw-r--r--sys/kern/sys_pipe.c2
-rw-r--r--sys/kern/sysv_shm.c2
-rw-r--r--sys/kern/uipc_shm.c2
8 files changed, 14 insertions, 15 deletions
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c
index 61a2aef..f6da68e 100644
--- a/sys/kern/imgact_elf.c
+++ b/sys/kern/imgact_elf.c
@@ -417,8 +417,9 @@ __elfN(map_insert)(vm_map_t map, vm_object_t object, vm_ooffset_t offset,
* The mapping is not page aligned. This means we have
* to copy the data. Sigh.
*/
- rv = vm_map_find(map, NULL, 0, &start, end - start,
- FALSE, prot | VM_PROT_WRITE, VM_PROT_ALL, 0);
+ rv = vm_map_find(map, NULL, 0, &start, end - start, 0,
+ VMFS_NO_SPACE, prot | VM_PROT_WRITE, VM_PROT_ALL,
+ 0);
if (rv)
return (rv);
if (object == NULL)
diff --git a/sys/kern/imgact_gzip.c b/sys/kern/imgact_gzip.c
index 230854b..ab77a88 100644
--- a/sys/kern/imgact_gzip.c
+++ b/sys/kern/imgact_gzip.c
@@ -269,12 +269,9 @@ do_aout_hdr(struct imgact_gzip * gz)
*/
vmaddr = gz->virtual_offset + gz->a_out.a_text +
gz->a_out.a_data;
- error = vm_map_find(&vmspace->vm_map,
- NULL,
- 0,
- &vmaddr,
- gz->bss_size,
- FALSE, VM_PROT_ALL, VM_PROT_ALL, 0);
+ error = vm_map_find(&vmspace->vm_map, NULL, 0, &vmaddr,
+ gz->bss_size, 0, VMFS_NO_SPACE, VM_PROT_ALL, VM_PROT_ALL,
+ 0);
if (error) {
gz->where = __LINE__;
return (error);
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index 40eff02..0828e48 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -709,8 +709,8 @@ start_init(void *dummy)
* Need just enough stack to hold the faked-up "execve()" arguments.
*/
addr = p->p_sysent->sv_usrstack - PAGE_SIZE;
- if (vm_map_find(&p->p_vmspace->vm_map, NULL, 0, &addr, PAGE_SIZE,
- FALSE, VM_PROT_ALL, VM_PROT_ALL, 0) != 0)
+ if (vm_map_find(&p->p_vmspace->vm_map, NULL, 0, &addr, PAGE_SIZE, 0,
+ VMFS_NO_SPACE, VM_PROT_ALL, VM_PROT_ALL, 0) != 0)
panic("init: couldn't allocate argument space");
p->p_vmspace->vm_maxsaddr = (caddr_t)addr;
p->p_vmspace->vm_ssize = 1;
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
index 6252a8d..631ba75 100644
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -891,7 +891,7 @@ link_elf_load_file(linker_class_t cls, const char* filename,
}
ef->address = (caddr_t) vm_map_min(kernel_map);
error = vm_map_find(kernel_map, ef->object, 0,
- (vm_offset_t *) &ef->address, mapsize, 1,
+ (vm_offset_t *) &ef->address, mapsize, 0, VMFS_OPTIMAL_SPACE,
VM_PROT_ALL, VM_PROT_ALL, 0);
if (error != 0) {
vm_object_deallocate(ef->object);
diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c
index a9208df..0334779 100644
--- a/sys/kern/link_elf_obj.c
+++ b/sys/kern/link_elf_obj.c
@@ -689,7 +689,8 @@ link_elf_load_file(linker_class_t cls, const char *filename,
mapbase = VM_MIN_KERNEL_ADDRESS;
#endif
error = vm_map_find(kernel_map, ef->object, 0, &mapbase,
- round_page(mapsize), TRUE, VM_PROT_ALL, VM_PROT_ALL, FALSE);
+ round_page(mapsize), 0, VMFS_OPTIMAL_SPACE, VM_PROT_ALL,
+ VM_PROT_ALL, 0);
if (error) {
vm_object_deallocate(ef->object);
ef->object = 0;
diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c
index 76c295e..6ba52e3 100644
--- a/sys/kern/sys_pipe.c
+++ b/sys/kern/sys_pipe.c
@@ -524,7 +524,7 @@ retry:
buffer = (caddr_t) vm_map_min(pipe_map);
error = vm_map_find(pipe_map, NULL, 0,
- (vm_offset_t *) &buffer, size, 1,
+ (vm_offset_t *) &buffer, size, 0, VMFS_ANY_SPACE,
VM_PROT_ALL, VM_PROT_ALL, 0);
if (error != KERN_SUCCESS) {
if ((cpipe->pipe_buffer.buffer == NULL) &&
diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c
index 90f5d77..ea44deb 100644
--- a/sys/kern/sysv_shm.c
+++ b/sys/kern/sysv_shm.c
@@ -413,7 +413,7 @@ kern_shmat(td, shmid, shmaddr, shmflg)
vm_object_reference(shmseg->object);
rv = vm_map_find(&p->p_vmspace->vm_map, shmseg->object,
- 0, &attach_va, size, (flags & MAP_FIXED) ? VMFS_NO_SPACE :
+ 0, &attach_va, size, 0, (flags & MAP_FIXED) ? VMFS_NO_SPACE :
VMFS_OPTIMAL_SPACE, prot, prot, MAP_INHERIT_SHARE);
if (rv != KERN_SUCCESS) {
vm_object_deallocate(shmseg->object);
diff --git a/sys/kern/uipc_shm.c b/sys/kern/uipc_shm.c
index 54366af..70829f3 100644
--- a/sys/kern/uipc_shm.c
+++ b/sys/kern/uipc_shm.c
@@ -954,7 +954,7 @@ shm_map(struct file *fp, size_t size, off_t offset, void **memp)
ofs = offset & PAGE_MASK;
offset = trunc_page(offset);
size = round_page(size + ofs);
- rv = vm_map_find(kernel_map, obj, offset, &kva, size,
+ rv = vm_map_find(kernel_map, obj, offset, &kva, size, 0,
VMFS_OPTIMAL_SPACE, VM_PROT_READ | VM_PROT_WRITE,
VM_PROT_READ | VM_PROT_WRITE, 0);
if (rv == KERN_SUCCESS) {
OpenPOWER on IntegriCloud