Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_proc.c
Show First 20 Lines • Show All 3,209 Lines • ▼ Show 20 Lines | sysctl_kern_proc_vm_layout(SYSCTL_HANDLER_ARGS) | ||||
name = (int *)arg1; | name = (int *)arg1; | ||||
if ((u_int)arg2 != 1) | if ((u_int)arg2 != 1) | ||||
return (EINVAL); | return (EINVAL); | ||||
error = pget((pid_t)name[0], PGET_CANDEBUG, &p); | error = pget((pid_t)name[0], PGET_CANDEBUG, &p); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
#ifdef COMPAT_FREEBSD32 | |||||
if (SV_CURPROC_FLAG(SV_ILP32)) { | |||||
if (!SV_PROC_FLAG(p, SV_ILP32)) { | |||||
PROC_UNLOCK(p); | |||||
return (EINVAL); | |||||
} | |||||
} | |||||
#endif | |||||
vmspace = vmspace_acquire_ref(p); | vmspace = vmspace_acquire_ref(p); | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
memset(&kvm, 0, sizeof(kvm)); | memset(&kvm, 0, sizeof(kvm)); | ||||
kvm.kvm_min_user_addr = vm_map_min(&vmspace->vm_map); | kvm.kvm_min_user_addr = vm_map_min(&vmspace->vm_map); | ||||
kvm.kvm_max_user_addr = vm_map_max(&vmspace->vm_map); | kvm.kvm_max_user_addr = vm_map_max(&vmspace->vm_map); | ||||
kvm.kvm_text_addr = (uintptr_t)vmspace->vm_taddr; | kvm.kvm_text_addr = (uintptr_t)vmspace->vm_taddr; | ||||
kvm.kvm_text_size = vmspace->vm_tsize; | kvm.kvm_text_size = vmspace->vm_tsize; | ||||
kvm.kvm_data_addr = (uintptr_t)vmspace->vm_daddr; | kvm.kvm_data_addr = (uintptr_t)vmspace->vm_daddr; | ||||
kvm.kvm_data_size = vmspace->vm_dsize; | kvm.kvm_data_size = vmspace->vm_dsize; | ||||
kvm.kvm_stack_addr = (uintptr_t)vmspace->vm_maxsaddr; | kvm.kvm_stack_addr = (uintptr_t)vmspace->vm_maxsaddr; | ||||
kvm.kvm_stack_size = vmspace->vm_ssize; | kvm.kvm_stack_size = vmspace->vm_ssize; | ||||
if ((vmspace->vm_map.flags & MAP_WIREFUTURE) != 0) | if ((vmspace->vm_map.flags & MAP_WIREFUTURE) != 0) | ||||
kvm.kvm_map_flags |= KMAP_FLAG_WIREFUTURE; | kvm.kvm_map_flags |= KMAP_FLAG_WIREFUTURE; | ||||
if ((vmspace->vm_map.flags & MAP_ASLR) != 0) | if ((vmspace->vm_map.flags & MAP_ASLR) != 0) | ||||
kvm.kvm_map_flags |= KMAP_FLAG_ASLR; | kvm.kvm_map_flags |= KMAP_FLAG_ASLR; | ||||
if ((vmspace->vm_map.flags & MAP_ASLR_IGNSTART) != 0) | if ((vmspace->vm_map.flags & MAP_ASLR_IGNSTART) != 0) | ||||
kvm.kvm_map_flags |= KMAP_FLAG_ASLR_IGNSTART; | kvm.kvm_map_flags |= KMAP_FLAG_ASLR_IGNSTART; | ||||
if ((vmspace->vm_map.flags & MAP_WXORX) != 0) | if ((vmspace->vm_map.flags & MAP_WXORX) != 0) | ||||
kvm.kvm_map_flags |= KMAP_FLAG_WXORX; | kvm.kvm_map_flags |= KMAP_FLAG_WXORX; | ||||
if ((vmspace->vm_map.flags & MAP_ASLR_STACK) != 0) | if ((vmspace->vm_map.flags & MAP_ASLR_STACK) != 0) | ||||
kvm.kvm_map_flags |= KMAP_FLAG_ASLR_STACK; | kvm.kvm_map_flags |= KMAP_FLAG_ASLR_STACK; | ||||
#ifdef COMPAT_FREEBSD32 | |||||
if (SV_CURPROC_FLAG(SV_ILP32)) { | |||||
struct kinfo_vm_layout32 kvm32; | |||||
memset(&kvm32, 0, sizeof(kvm32)); | |||||
kvm32.kvm_min_user_addr = (uint32_t)kvm.kvm_min_user_addr; | |||||
kvm32.kvm_max_user_addr = (uint32_t)kvm.kvm_max_user_addr; | |||||
kvm32.kvm_text_addr = (uint32_t)kvm.kvm_text_addr; | |||||
kvm32.kvm_text_size = (uint32_t)kvm.kvm_text_size; | |||||
kvm32.kvm_data_addr = (uint32_t)kvm.kvm_data_addr; | |||||
kvm32.kvm_data_size = (uint32_t)kvm.kvm_data_size; | |||||
kvm32.kvm_stack_addr = (uint32_t)kvm.kvm_stack_addr; | |||||
kvm32.kvm_stack_size = (uint32_t)kvm.kvm_stack_size; | |||||
kvm32.kvm_map_flags = kvm.kvm_map_flags; | |||||
vmspace_free(vmspace); | |||||
error = SYSCTL_OUT(req, &kvm32, sizeof(kvm32)); | |||||
goto out; | |||||
} | |||||
#endif | |||||
error = SYSCTL_OUT(req, &kvm, sizeof(kvm)); | error = SYSCTL_OUT(req, &kvm, sizeof(kvm)); | ||||
#ifdef COMPAT_FREEBSD32 | |||||
out: | |||||
#endif | |||||
vmspace_free(vmspace); | vmspace_free(vmspace); | ||||
return (error); | return (error); | ||||
} | } | ||||
SYSCTL_NODE(_kern, KERN_PROC, proc, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, | SYSCTL_NODE(_kern, KERN_PROC, proc, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, | ||||
"Process table"); | "Process table"); | ||||
SYSCTL_PROC(_kern_proc, KERN_PROC_ALL, all, CTLFLAG_RD|CTLTYPE_STRUCT| | SYSCTL_PROC(_kern_proc, KERN_PROC_ALL, all, CTLFLAG_RD|CTLTYPE_STRUCT| | ||||
▲ Show 20 Lines • Show All 257 Lines • Show Last 20 Lines |