Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_mmap.c
Show First 20 Lines • Show All 647 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
int | int | ||||
kern_mprotect(struct thread *td, uintptr_t addr0, size_t size, int prot) | kern_mprotect(struct thread *td, uintptr_t addr0, size_t size, int prot) | ||||
{ | { | ||||
vm_offset_t addr; | vm_offset_t addr; | ||||
vm_size_t pageoff; | vm_size_t pageoff; | ||||
int vm_error, max_prot; | int vm_error, max_prot; | ||||
int flags; | |||||
addr = addr0; | addr = addr0; | ||||
if ((prot & ~(_PROT_ALL | PROT_MAX(_PROT_ALL))) != 0) | if ((prot & ~(_PROT_ALL | PROT_MAX(_PROT_ALL))) != 0) | ||||
return (EINVAL); | return (EINVAL); | ||||
max_prot = PROT_MAX_EXTRACT(prot); | max_prot = PROT_MAX_EXTRACT(prot); | ||||
prot = PROT_EXTRACT(prot); | prot = PROT_EXTRACT(prot); | ||||
pageoff = (addr & PAGE_MASK); | pageoff = (addr & PAGE_MASK); | ||||
addr -= pageoff; | addr -= pageoff; | ||||
size += pageoff; | size += pageoff; | ||||
size = (vm_size_t) round_page(size); | size = (vm_size_t) round_page(size); | ||||
#ifdef COMPAT_FREEBSD32 | #ifdef COMPAT_FREEBSD32 | ||||
if (SV_PROC_FLAG(td->td_proc, SV_ILP32)) { | if (SV_PROC_FLAG(td->td_proc, SV_ILP32)) { | ||||
if (((addr + size) & 0xffffffff) < addr) | if (((addr + size) & 0xffffffff) < addr) | ||||
return (EINVAL); | return (EINVAL); | ||||
} else | } else | ||||
#endif | #endif | ||||
if (addr + size < addr) | if (addr + size < addr) | ||||
return (EINVAL); | return (EINVAL); | ||||
vm_error = KERN_SUCCESS; | flags = VM_MAP_PROTECT_SET_PROT; | ||||
if (max_prot != 0) { | if (max_prot != 0) | ||||
if ((max_prot & prot) != prot) | flags |= VM_MAP_PROTECT_SET_MAXPROT; | ||||
return (ENOTSUP); | |||||
vm_error = vm_map_protect(&td->td_proc->p_vmspace->vm_map, | vm_error = vm_map_protect(&td->td_proc->p_vmspace->vm_map, | ||||
addr, addr + size, max_prot, TRUE); | addr, addr + size, prot, max_prot, flags); | ||||
} | |||||
if (vm_error == KERN_SUCCESS) | |||||
vm_error = vm_map_protect(&td->td_proc->p_vmspace->vm_map, | |||||
addr, addr + size, prot, FALSE); | |||||
switch (vm_error) { | switch (vm_error) { | ||||
case KERN_SUCCESS: | case KERN_SUCCESS: | ||||
return (0); | return (0); | ||||
case KERN_PROTECTION_FAILURE: | case KERN_PROTECTION_FAILURE: | ||||
return (EACCES); | return (EACCES); | ||||
case KERN_RESOURCE_SHORTAGE: | case KERN_RESOURCE_SHORTAGE: | ||||
return (ENOMEM); | return (ENOMEM); | ||||
case KERN_OUT_OF_BOUNDS: | |||||
return (ENOTSUP); | |||||
} | } | ||||
return (EINVAL); | return (EINVAL); | ||||
} | } | ||||
#ifndef _SYS_SYSPROTO_H_ | #ifndef _SYS_SYSPROTO_H_ | ||||
struct minherit_args { | struct minherit_args { | ||||
void *addr; | void *addr; | ||||
size_t len; | size_t len; | ||||
▲ Show 20 Lines • Show All 988 Lines • Show Last 20 Lines |