version 1.86, 2005/01/01 21:00:06 |
version 1.86.2.1, 2005/04/29 11:29:45 |
Line 297 sys_mmap(l, v, retval) |
|
Line 297 sys_mmap(l, v, retval) |
|
vsize_t size, pageoff; |
vsize_t size, pageoff; |
vm_prot_t prot, maxprot; |
vm_prot_t prot, maxprot; |
int flags, fd; |
int flags, fd; |
vaddr_t vm_min_address = VM_MIN_ADDRESS; |
vaddr_t vm_min_address = VM_MIN_ADDRESS, defaddr; |
struct filedesc *fdp = p->p_fd; |
struct filedesc *fdp = p->p_fd; |
struct file *fp; |
struct file *fp; |
struct vnode *vp; |
struct vnode *vp; |
Line 335 sys_mmap(l, v, retval) |
|
Line 335 sys_mmap(l, v, retval) |
|
if ((ssize_t) size < 0) |
if ((ssize_t) size < 0) |
return (EINVAL); /* don't allow wrap */ |
return (EINVAL); /* don't allow wrap */ |
|
|
#ifndef pmap_wired_count |
|
/* |
|
* if we're going to wire the mapping, restrict it to superuser. |
|
*/ |
|
|
|
if ((flags & MAP_WIRED) != 0 && |
|
(error = suser(p->p_ucred, &p->p_acflag)) != 0) |
|
return (error); |
|
#endif |
|
|
|
/* |
/* |
* now check (MAP_FIXED) or get (!MAP_FIXED) the "addr" |
* now check (MAP_FIXED) or get (!MAP_FIXED) the "addr" |
*/ |
*/ |
Line 373 sys_mmap(l, v, retval) |
|
Line 363 sys_mmap(l, v, retval) |
|
* VAC, etc) |
* VAC, etc) |
*/ |
*/ |
|
|
|
defaddr = p->p_emul->e_vm_default_addr(p, |
|
(vaddr_t)p->p_vmspace->vm_daddr, size); |
|
|
if (addr == 0 || |
if (addr == 0 || |
!(p->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN)) |
!(p->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN)) |
addr = MAX(addr, |
addr = MAX(addr, defaddr); |
VM_DEFAULT_ADDRESS(p->p_vmspace->vm_daddr, size)); |
|
else |
else |
addr = MIN(addr, |
addr = MIN(addr, defaddr); |
VM_DEFAULT_ADDRESS(p->p_vmspace->vm_daddr, size)); |
|
} |
} |
|
|
/* |
/* |
Line 686 sys_munmap(l, v, retval) |
|
Line 677 sys_munmap(l, v, retval) |
|
return (EINVAL); |
return (EINVAL); |
} |
} |
#endif |
#endif |
uvm_unmap_remove(map, addr, addr + size, &dead_entries, NULL); |
uvm_unmap_remove(map, addr, addr + size, &dead_entries, NULL, 0); |
vm_map_unlock(map); |
vm_map_unlock(map); |
if (dead_entries != NULL) |
if (dead_entries != NULL) |
uvm_unmap_detach(dead_entries, 0); |
uvm_unmap_detach(dead_entries, 0); |
Line 924 sys_mlock(l, v, retval) |
|
Line 915 sys_mlock(l, v, retval) |
|
if (atop(size) + uvmexp.wired > uvmexp.wiredmax) |
if (atop(size) + uvmexp.wired > uvmexp.wiredmax) |
return (EAGAIN); |
return (EAGAIN); |
|
|
#ifdef pmap_wired_count |
|
if (size + ptoa(pmap_wired_count(vm_map_pmap(&p->p_vmspace->vm_map))) > |
if (size + ptoa(pmap_wired_count(vm_map_pmap(&p->p_vmspace->vm_map))) > |
p->p_rlimit[RLIMIT_MEMLOCK].rlim_cur) |
p->p_rlimit[RLIMIT_MEMLOCK].rlim_cur) |
return (EAGAIN); |
return (EAGAIN); |
#else |
|
if ((error = suser(p->p_ucred, &p->p_acflag)) != 0) |
|
return (error); |
|
#endif |
|
|
|
error = uvm_map_pageable(&p->p_vmspace->vm_map, addr, addr+size, FALSE, |
error = uvm_map_pageable(&p->p_vmspace->vm_map, addr, addr+size, FALSE, |
0); |
0); |
Line 979 sys_munlock(l, v, retval) |
|
Line 965 sys_munlock(l, v, retval) |
|
if (addr + size < addr) |
if (addr + size < addr) |
return (EINVAL); |
return (EINVAL); |
|
|
#ifndef pmap_wired_count |
|
if ((error = suser(p->p_ucred, &p->p_acflag)) != 0) |
|
return (error); |
|
#endif |
|
|
|
error = uvm_map_pageable(&p->p_vmspace->vm_map, addr, addr+size, TRUE, |
error = uvm_map_pageable(&p->p_vmspace->vm_map, addr, addr+size, TRUE, |
0); |
0); |
if (error == EFAULT) |
if (error == EFAULT) |
Line 1013 sys_mlockall(l, v, retval) |
|
Line 994 sys_mlockall(l, v, retval) |
|
(flags & ~(MCL_CURRENT|MCL_FUTURE)) != 0) |
(flags & ~(MCL_CURRENT|MCL_FUTURE)) != 0) |
return (EINVAL); |
return (EINVAL); |
|
|
#ifndef pmap_wired_count |
|
if ((error = suser(p->p_ucred, &p->p_acflag)) != 0) |
|
return (error); |
|
#endif |
|
|
|
error = uvm_map_pageable_all(&p->p_vmspace->vm_map, flags, |
error = uvm_map_pageable_all(&p->p_vmspace->vm_map, flags, |
p->p_rlimit[RLIMIT_MEMLOCK].rlim_cur); |
p->p_rlimit[RLIMIT_MEMLOCK].rlim_cur); |
return (error); |
return (error); |
Line 1105 uvm_mmap(map, addr, size, prot, maxprot, |
|
Line 1081 uvm_mmap(map, addr, size, prot, maxprot, |
|
align = 1L << align; |
align = 1L << align; |
if (align < PAGE_SIZE) |
if (align < PAGE_SIZE) |
return(EINVAL); |
return(EINVAL); |
if (align >= map->max_offset) |
if (align >= vm_map_max(map)) |
return(ENOMEM); |
return(ENOMEM); |
if (flags & MAP_FIXED) { |
if (flags & MAP_FIXED) { |
if ((*addr & (align-1)) != 0) |
if ((*addr & (align-1)) != 0) |
Line 1207 uvm_mmap(map, addr, size, prot, maxprot, |
|
Line 1183 uvm_mmap(map, addr, size, prot, maxprot, |
|
} |
} |
vm_map_lock(map); |
vm_map_lock(map); |
if ((flags & MAP_WIRED) != 0 || (map->flags & VM_MAP_WIREFUTURE) != 0) { |
if ((flags & MAP_WIRED) != 0 || (map->flags & VM_MAP_WIREFUTURE) != 0) { |
if ((atop(size) + uvmexp.wired) > uvmexp.wiredmax |
if (atop(size) + uvmexp.wired > uvmexp.wiredmax || |
#ifdef pmap_wired_count |
(locklimit != 0 && |
|| (locklimit != 0 && (size + |
size + ptoa(pmap_wired_count(vm_map_pmap(map))) > |
ptoa(pmap_wired_count(vm_map_pmap(map)))) > |
locklimit)) { |
locklimit) |
|
#endif |
|
) { |
|
vm_map_unlock(map); |
vm_map_unlock(map); |
uvm_unmap(map, *addr, *addr + size); |
uvm_unmap(map, *addr, *addr + size); |
return ENOMEM; |
return ENOMEM; |
Line 1234 uvm_mmap(map, addr, size, prot, maxprot, |
|
Line 1207 uvm_mmap(map, addr, size, prot, maxprot, |
|
vm_map_unlock(map); |
vm_map_unlock(map); |
return 0; |
return 0; |
} |
} |
|
|
|
vaddr_t |
|
uvm_default_mapaddr(struct proc *p, vaddr_t base, vsize_t sz) |
|
{ |
|
return VM_DEFAULT_ADDRESS(base, sz); |
|
} |