| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: kern_proc.c,v 1.216 2018/09/04 15:48:44 maxv Exp $ */ | | 1 | /* $NetBSD: kern_proc.c,v 1.217 2018/09/04 16:03:56 maxv Exp $ */ |
2 | | | 2 | |
3 | /*- | | 3 | /*- |
4 | * Copyright (c) 1999, 2006, 2007, 2008 The NetBSD Foundation, Inc. | | 4 | * Copyright (c) 1999, 2006, 2007, 2008 The NetBSD Foundation, Inc. |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * This code is derived from software contributed to The NetBSD Foundation | | 7 | * This code is derived from software contributed to The NetBSD Foundation |
8 | * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, | | 8 | * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, |
9 | * NASA Ames Research Center, and by Andrew Doran. | | 9 | * NASA Ames Research Center, and by Andrew Doran. |
10 | * | | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | | 11 | * Redistribution and use in source and binary forms, with or without |
12 | * modification, are permitted provided that the following conditions | | 12 | * modification, are permitted provided that the following conditions |
13 | * are met: | | 13 | * are met: |
14 | * 1. Redistributions of source code must retain the above copyright | | 14 | * 1. Redistributions of source code must retain the above copyright |
| @@ -52,27 +52,27 @@ | | | @@ -52,27 +52,27 @@ |
52 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | | 52 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
53 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | 53 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
54 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | | 54 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
55 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | | 55 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
56 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | 56 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
57 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | 57 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
58 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | | 58 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
59 | * SUCH DAMAGE. | | 59 | * SUCH DAMAGE. |
60 | * | | 60 | * |
61 | * @(#)kern_proc.c 8.7 (Berkeley) 2/14/95 | | 61 | * @(#)kern_proc.c 8.7 (Berkeley) 2/14/95 |
62 | */ | | 62 | */ |
63 | | | 63 | |
64 | #include <sys/cdefs.h> | | 64 | #include <sys/cdefs.h> |
65 | __KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.216 2018/09/04 15:48:44 maxv Exp $"); | | 65 | __KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.217 2018/09/04 16:03:56 maxv Exp $"); |
66 | | | 66 | |
67 | #ifdef _KERNEL_OPT | | 67 | #ifdef _KERNEL_OPT |
68 | #include "opt_kstack.h" | | 68 | #include "opt_kstack.h" |
69 | #include "opt_maxuprc.h" | | 69 | #include "opt_maxuprc.h" |
70 | #include "opt_dtrace.h" | | 70 | #include "opt_dtrace.h" |
71 | #include "opt_compat_netbsd32.h" | | 71 | #include "opt_compat_netbsd32.h" |
72 | #endif | | 72 | #endif |
73 | | | 73 | |
74 | #if defined(__HAVE_COMPAT_NETBSD32) && !defined(COMPAT_NETBSD32) \ | | 74 | #if defined(__HAVE_COMPAT_NETBSD32) && !defined(COMPAT_NETBSD32) \ |
75 | && !defined(_RUMPKERNEL) | | 75 | && !defined(_RUMPKERNEL) |
76 | #define COMPAT_NETBSD32 | | 76 | #define COMPAT_NETBSD32 |
77 | #endif | | 77 | #endif |
78 | | | 78 | |
| @@ -2150,42 +2150,55 @@ copy_procargs(struct proc *p, int oid, s | | | @@ -2150,42 +2150,55 @@ copy_procargs(struct proc *p, int oid, s |
2150 | len += xlen; | | 2150 | len += xlen; |
2151 | base += xlen; | | 2151 | base += xlen; |
2152 | } | | 2152 | } |
2153 | } | | 2153 | } |
2154 | *limit = len; | | 2154 | *limit = len; |
2155 | | | 2155 | |
2156 | done: | | 2156 | done: |
2157 | kmem_free(argv, PAGE_SIZE); | | 2157 | kmem_free(argv, PAGE_SIZE); |
2158 | kmem_free(arg, PAGE_SIZE); | | 2158 | kmem_free(arg, PAGE_SIZE); |
2159 | uvmspace_free(vmspace); | | 2159 | uvmspace_free(vmspace); |
2160 | return error; | | 2160 | return error; |
2161 | } | | 2161 | } |
2162 | | | 2162 | |
| | | 2163 | #define SET_KERN_ADDR(dst, src, allow) \ |
| | | 2164 | do { \ |
| | | 2165 | if (allow) \ |
| | | 2166 | dst = src; \ |
| | | 2167 | } while (0); |
| | | 2168 | |
2163 | /* | | 2169 | /* |
2164 | * Fill in an eproc structure for the specified process. | | 2170 | * Fill in an eproc structure for the specified process. |
2165 | */ | | 2171 | */ |
2166 | void | | 2172 | void |
2167 | fill_eproc(struct proc *p, struct eproc *ep, bool zombie) | | 2173 | fill_eproc(struct proc *p, struct eproc *ep, bool zombie) |
2168 | { | | 2174 | { |
| | | 2175 | bool allowaddr; |
2169 | struct tty *tp; | | 2176 | struct tty *tp; |
2170 | struct lwp *l; | | 2177 | struct lwp *l; |
| | | 2178 | int error; |
2171 | | | 2179 | |
2172 | KASSERT(mutex_owned(proc_lock)); | | 2180 | KASSERT(mutex_owned(proc_lock)); |
2173 | KASSERT(mutex_owned(p->p_lock)); | | 2181 | KASSERT(mutex_owned(p->p_lock)); |
2174 | | | 2182 | |
2175 | memset(ep, 0, sizeof(*ep)); | | 2183 | memset(ep, 0, sizeof(*ep)); |
2176 | | | 2184 | |
2177 | ep->e_paddr = p; | | 2185 | /* If not privileged, don't expose kernel addresses. */ |
2178 | ep->e_sess = p->p_session; | | 2186 | error = kauth_authorize_process(kauth_cred_get(), KAUTH_PROCESS_CANSEE, |
| | | 2187 | curproc, KAUTH_ARG(KAUTH_REQ_PROCESS_CANSEE_KPTR), NULL, NULL); |
| | | 2188 | allowaddr = (error == 0); |
| | | 2189 | |
| | | 2190 | SET_KERN_ADDR(ep->e_paddr, p, allowaddr); |
| | | 2191 | SET_KERN_ADDR(ep->e_sess, p->p_session, allowaddr); |
2179 | if (p->p_cred) { | | 2192 | if (p->p_cred) { |
2180 | kauth_cred_topcred(p->p_cred, &ep->e_pcred); | | 2193 | kauth_cred_topcred(p->p_cred, &ep->e_pcred); |
2181 | kauth_cred_toucred(p->p_cred, &ep->e_ucred); | | 2194 | kauth_cred_toucred(p->p_cred, &ep->e_ucred); |
2182 | } | | 2195 | } |
2183 | if (p->p_stat != SIDL && !P_ZOMBIE(p) && !zombie) { | | 2196 | if (p->p_stat != SIDL && !P_ZOMBIE(p) && !zombie) { |
2184 | struct vmspace *vm = p->p_vmspace; | | 2197 | struct vmspace *vm = p->p_vmspace; |
2185 | | | 2198 | |
2186 | ep->e_vm.vm_rssize = vm_resident_count(vm); | | 2199 | ep->e_vm.vm_rssize = vm_resident_count(vm); |
2187 | ep->e_vm.vm_tsize = vm->vm_tsize; | | 2200 | ep->e_vm.vm_tsize = vm->vm_tsize; |
2188 | ep->e_vm.vm_dsize = vm->vm_dsize; | | 2201 | ep->e_vm.vm_dsize = vm->vm_dsize; |
2189 | ep->e_vm.vm_ssize = vm->vm_ssize; | | 2202 | ep->e_vm.vm_ssize = vm->vm_ssize; |
2190 | ep->e_vm.vm_map.size = vm->vm_map.size; | | 2203 | ep->e_vm.vm_map.size = vm->vm_map.size; |
2191 | | | 2204 | |
| @@ -2196,94 +2209,101 @@ fill_eproc(struct proc *p, struct eproc | | | @@ -2196,94 +2209,101 @@ fill_eproc(struct proc *p, struct eproc |
2196 | if (l->l_wchan) | | 2209 | if (l->l_wchan) |
2197 | strncpy(ep->e_wmesg, l->l_wmesg, WMESGLEN); | | 2210 | strncpy(ep->e_wmesg, l->l_wmesg, WMESGLEN); |
2198 | lwp_unlock(l); | | 2211 | lwp_unlock(l); |
2199 | } | | 2212 | } |
2200 | ep->e_ppid = p->p_ppid; | | 2213 | ep->e_ppid = p->p_ppid; |
2201 | if (p->p_pgrp && p->p_session) { | | 2214 | if (p->p_pgrp && p->p_session) { |
2202 | ep->e_pgid = p->p_pgrp->pg_id; | | 2215 | ep->e_pgid = p->p_pgrp->pg_id; |
2203 | ep->e_jobc = p->p_pgrp->pg_jobc; | | 2216 | ep->e_jobc = p->p_pgrp->pg_jobc; |
2204 | ep->e_sid = p->p_session->s_sid; | | 2217 | ep->e_sid = p->p_session->s_sid; |
2205 | if ((p->p_lflag & PL_CONTROLT) && | | 2218 | if ((p->p_lflag & PL_CONTROLT) && |
2206 | (tp = p->p_session->s_ttyp)) { | | 2219 | (tp = p->p_session->s_ttyp)) { |
2207 | ep->e_tdev = tp->t_dev; | | 2220 | ep->e_tdev = tp->t_dev; |
2208 | ep->e_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID; | | 2221 | ep->e_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID; |
2209 | ep->e_tsess = tp->t_session; | | 2222 | SET_KERN_ADDR(ep->e_tsess, tp->t_session, allowaddr); |
2210 | } else | | 2223 | } else |
2211 | ep->e_tdev = (uint32_t)NODEV; | | 2224 | ep->e_tdev = (uint32_t)NODEV; |
2212 | ep->e_flag = p->p_session->s_ttyvp ? EPROC_CTTY : 0; | | 2225 | ep->e_flag = p->p_session->s_ttyvp ? EPROC_CTTY : 0; |
2213 | if (SESS_LEADER(p)) | | 2226 | if (SESS_LEADER(p)) |
2214 | ep->e_flag |= EPROC_SLEADER; | | 2227 | ep->e_flag |= EPROC_SLEADER; |
2215 | strncpy(ep->e_login, p->p_session->s_login, MAXLOGNAME); | | 2228 | strncpy(ep->e_login, p->p_session->s_login, MAXLOGNAME); |
2216 | } | | 2229 | } |
2217 | ep->e_xsize = ep->e_xrssize = 0; | | 2230 | ep->e_xsize = ep->e_xrssize = 0; |
2218 | ep->e_xccount = ep->e_xswrss = 0; | | 2231 | ep->e_xccount = ep->e_xswrss = 0; |
2219 | } | | 2232 | } |
2220 | | | 2233 | |
2221 | /* | | 2234 | /* |
2222 | * Fill in a kinfo_proc2 structure for the specified process. | | 2235 | * Fill in a kinfo_proc2 structure for the specified process. |
2223 | */ | | 2236 | */ |
2224 | void | | 2237 | void |
2225 | fill_kproc2(struct proc *p, struct kinfo_proc2 *ki, bool zombie) | | 2238 | fill_kproc2(struct proc *p, struct kinfo_proc2 *ki, bool zombie) |
2226 | { | | 2239 | { |
2227 | struct tty *tp; | | 2240 | struct tty *tp; |
2228 | struct lwp *l, *l2; | | 2241 | struct lwp *l, *l2; |
2229 | struct timeval ut, st, rt; | | 2242 | struct timeval ut, st, rt; |
2230 | sigset_t ss1, ss2; | | 2243 | sigset_t ss1, ss2; |
2231 | struct rusage ru; | | 2244 | struct rusage ru; |
2232 | struct vmspace *vm; | | 2245 | struct vmspace *vm; |
| | | 2246 | bool allowaddr; |
| | | 2247 | int error; |
2233 | | | 2248 | |
2234 | KASSERT(mutex_owned(proc_lock)); | | 2249 | KASSERT(mutex_owned(proc_lock)); |
2235 | KASSERT(mutex_owned(p->p_lock)); | | 2250 | KASSERT(mutex_owned(p->p_lock)); |
2236 | | | 2251 | |
| | | 2252 | /* If not privileged, don't expose kernel addresses. */ |
| | | 2253 | error = kauth_authorize_process(kauth_cred_get(), KAUTH_PROCESS_CANSEE, |
| | | 2254 | curproc, KAUTH_ARG(KAUTH_REQ_PROCESS_CANSEE_KPTR), NULL, NULL); |
| | | 2255 | allowaddr = (error == 0); |
| | | 2256 | |
2237 | sigemptyset(&ss1); | | 2257 | sigemptyset(&ss1); |
2238 | sigemptyset(&ss2); | | 2258 | sigemptyset(&ss2); |
2239 | memset(ki, 0, sizeof(*ki)); | | 2259 | memset(ki, 0, sizeof(*ki)); |
2240 | | | 2260 | |
2241 | ki->p_paddr = PTRTOUINT64(p); | | 2261 | SET_KERN_ADDR(ki->p_paddr, PTRTOUINT64(p), allowaddr); |
2242 | ki->p_fd = PTRTOUINT64(p->p_fd); | | 2262 | SET_KERN_ADDR(ki->p_fd, PTRTOUINT64(p->p_fd), allowaddr); |
2243 | ki->p_cwdi = PTRTOUINT64(p->p_cwdi); | | 2263 | SET_KERN_ADDR(ki->p_cwdi, PTRTOUINT64(p->p_cwdi), allowaddr); |
2244 | ki->p_stats = PTRTOUINT64(p->p_stats); | | 2264 | SET_KERN_ADDR(ki->p_stats, PTRTOUINT64(p->p_stats), allowaddr); |
2245 | ki->p_limit = PTRTOUINT64(p->p_limit); | | 2265 | SET_KERN_ADDR(ki->p_limit, PTRTOUINT64(p->p_limit), allowaddr); |
2246 | ki->p_vmspace = PTRTOUINT64(p->p_vmspace); | | 2266 | SET_KERN_ADDR(ki->p_vmspace, PTRTOUINT64(p->p_vmspace), allowaddr); |
2247 | ki->p_sigacts = PTRTOUINT64(p->p_sigacts); | | 2267 | SET_KERN_ADDR(ki->p_sigacts, PTRTOUINT64(p->p_sigacts), allowaddr); |
2248 | ki->p_sess = PTRTOUINT64(p->p_session); | | 2268 | SET_KERN_ADDR(ki->p_sess, PTRTOUINT64(p->p_session), allowaddr); |
2249 | ki->p_tsess = 0; /* may be changed if controlling tty below */ | | 2269 | ki->p_tsess = 0; /* may be changed if controlling tty below */ |
2250 | ki->p_ru = PTRTOUINT64(&p->p_stats->p_ru); | | 2270 | SET_KERN_ADDR(ki->p_ru, PTRTOUINT64(&p->p_stats->p_ru), allowaddr); |
2251 | ki->p_eflag = 0; | | 2271 | ki->p_eflag = 0; |
2252 | ki->p_exitsig = p->p_exitsig; | | 2272 | ki->p_exitsig = p->p_exitsig; |
2253 | ki->p_flag = L_INMEM; /* Process never swapped out */ | | 2273 | ki->p_flag = L_INMEM; /* Process never swapped out */ |
2254 | ki->p_flag |= sysctl_map_flags(sysctl_flagmap, p->p_flag); | | 2274 | ki->p_flag |= sysctl_map_flags(sysctl_flagmap, p->p_flag); |
2255 | ki->p_flag |= sysctl_map_flags(sysctl_sflagmap, p->p_sflag); | | 2275 | ki->p_flag |= sysctl_map_flags(sysctl_sflagmap, p->p_sflag); |
2256 | ki->p_flag |= sysctl_map_flags(sysctl_slflagmap, p->p_slflag); | | 2276 | ki->p_flag |= sysctl_map_flags(sysctl_slflagmap, p->p_slflag); |
2257 | ki->p_flag |= sysctl_map_flags(sysctl_lflagmap, p->p_lflag); | | 2277 | ki->p_flag |= sysctl_map_flags(sysctl_lflagmap, p->p_lflag); |
2258 | ki->p_flag |= sysctl_map_flags(sysctl_stflagmap, p->p_stflag); | | 2278 | ki->p_flag |= sysctl_map_flags(sysctl_stflagmap, p->p_stflag); |
2259 | ki->p_pid = p->p_pid; | | 2279 | ki->p_pid = p->p_pid; |
2260 | ki->p_ppid = p->p_ppid; | | 2280 | ki->p_ppid = p->p_ppid; |
2261 | ki->p_uid = kauth_cred_geteuid(p->p_cred); | | 2281 | ki->p_uid = kauth_cred_geteuid(p->p_cred); |
2262 | ki->p_ruid = kauth_cred_getuid(p->p_cred); | | 2282 | ki->p_ruid = kauth_cred_getuid(p->p_cred); |
2263 | ki->p_gid = kauth_cred_getegid(p->p_cred); | | 2283 | ki->p_gid = kauth_cred_getegid(p->p_cred); |
2264 | ki->p_rgid = kauth_cred_getgid(p->p_cred); | | 2284 | ki->p_rgid = kauth_cred_getgid(p->p_cred); |
2265 | ki->p_svuid = kauth_cred_getsvuid(p->p_cred); | | 2285 | ki->p_svuid = kauth_cred_getsvuid(p->p_cred); |
2266 | ki->p_svgid = kauth_cred_getsvgid(p->p_cred); | | 2286 | ki->p_svgid = kauth_cred_getsvgid(p->p_cred); |
2267 | ki->p_ngroups = kauth_cred_ngroups(p->p_cred); | | 2287 | ki->p_ngroups = kauth_cred_ngroups(p->p_cred); |
2268 | kauth_cred_getgroups(p->p_cred, ki->p_groups, | | 2288 | kauth_cred_getgroups(p->p_cred, ki->p_groups, |
2269 | uimin(ki->p_ngroups, sizeof(ki->p_groups) / sizeof(ki->p_groups[0])), | | 2289 | uimin(ki->p_ngroups, sizeof(ki->p_groups) / sizeof(ki->p_groups[0])), |
2270 | UIO_SYSSPACE); | | 2290 | UIO_SYSSPACE); |
2271 | | | 2291 | |
2272 | ki->p_uticks = p->p_uticks; | | 2292 | ki->p_uticks = p->p_uticks; |
2273 | ki->p_sticks = p->p_sticks; | | 2293 | ki->p_sticks = p->p_sticks; |
2274 | ki->p_iticks = p->p_iticks; | | 2294 | ki->p_iticks = p->p_iticks; |
2275 | ki->p_tpgid = NO_PGID; /* may be changed if controlling tty below */ | | 2295 | ki->p_tpgid = NO_PGID; /* may be changed if controlling tty below */ |
2276 | ki->p_tracep = PTRTOUINT64(p->p_tracep); | | 2296 | SET_KERN_ADDR(ki->p_tracep, PTRTOUINT64(p->p_tracep), allowaddr); |
2277 | ki->p_traceflag = p->p_traceflag; | | 2297 | ki->p_traceflag = p->p_traceflag; |
2278 | | | 2298 | |
2279 | memcpy(&ki->p_sigignore, &p->p_sigctx.ps_sigignore,sizeof(ki_sigset_t)); | | 2299 | memcpy(&ki->p_sigignore, &p->p_sigctx.ps_sigignore,sizeof(ki_sigset_t)); |
2280 | memcpy(&ki->p_sigcatch, &p->p_sigctx.ps_sigcatch, sizeof(ki_sigset_t)); | | 2300 | memcpy(&ki->p_sigcatch, &p->p_sigctx.ps_sigcatch, sizeof(ki_sigset_t)); |
2281 | | | 2301 | |
2282 | ki->p_cpticks = 0; | | 2302 | ki->p_cpticks = 0; |
2283 | ki->p_pctcpu = p->p_pctcpu; | | 2303 | ki->p_pctcpu = p->p_pctcpu; |
2284 | ki->p_estcpu = 0; | | 2304 | ki->p_estcpu = 0; |
2285 | ki->p_stat = p->p_stat; /* Will likely be overridden by LWP status */ | | 2305 | ki->p_stat = p->p_stat; /* Will likely be overridden by LWP status */ |
2286 | ki->p_realstat = p->p_stat; | | 2306 | ki->p_realstat = p->p_stat; |
2287 | ki->p_nice = p->p_nice; | | 2307 | ki->p_nice = p->p_nice; |
2288 | ki->p_xstat = P_WAITSTATUS(p); | | 2308 | ki->p_xstat = P_WAITSTATUS(p); |
2289 | ki->p_acflag = p->p_acflag; | | 2309 | ki->p_acflag = p->p_acflag; |
| @@ -2307,40 +2327,40 @@ fill_kproc2(struct proc *p, struct kinfo | | | @@ -2307,40 +2327,40 @@ fill_kproc2(struct proc *p, struct kinfo |
2307 | * PROT_NONE and grown as needed, adjust the "mapped size" | | 2327 | * PROT_NONE and grown as needed, adjust the "mapped size" |
2308 | * to skip the unused stack portion. | | 2328 | * to skip the unused stack portion. |
2309 | */ | | 2329 | */ |
2310 | ki->p_vm_msize = | | 2330 | ki->p_vm_msize = |
2311 | atop(vm->vm_map.size) - vm->vm_issize + vm->vm_ssize; | | 2331 | atop(vm->vm_map.size) - vm->vm_issize + vm->vm_ssize; |
2312 | | | 2332 | |
2313 | /* Pick the primary (first) LWP */ | | 2333 | /* Pick the primary (first) LWP */ |
2314 | l = proc_active_lwp(p); | | 2334 | l = proc_active_lwp(p); |
2315 | KASSERT(l != NULL); | | 2335 | KASSERT(l != NULL); |
2316 | lwp_lock(l); | | 2336 | lwp_lock(l); |
2317 | ki->p_nrlwps = p->p_nrlwps; | | 2337 | ki->p_nrlwps = p->p_nrlwps; |
2318 | ki->p_forw = 0; | | 2338 | ki->p_forw = 0; |
2319 | ki->p_back = 0; | | 2339 | ki->p_back = 0; |
2320 | ki->p_addr = PTRTOUINT64(l->l_addr); | | 2340 | SET_KERN_ADDR(ki->p_addr, PTRTOUINT64(l->l_addr), allowaddr); |
2321 | ki->p_stat = l->l_stat; | | 2341 | ki->p_stat = l->l_stat; |
2322 | ki->p_flag |= sysctl_map_flags(sysctl_lwpflagmap, l->l_flag); | | 2342 | ki->p_flag |= sysctl_map_flags(sysctl_lwpflagmap, l->l_flag); |
2323 | ki->p_swtime = l->l_swtime; | | 2343 | ki->p_swtime = l->l_swtime; |
2324 | ki->p_slptime = l->l_slptime; | | 2344 | ki->p_slptime = l->l_slptime; |
2325 | if (l->l_stat == LSONPROC) | | 2345 | if (l->l_stat == LSONPROC) |
2326 | ki->p_schedflags = l->l_cpu->ci_schedstate.spc_flags; | | 2346 | ki->p_schedflags = l->l_cpu->ci_schedstate.spc_flags; |
2327 | else | | 2347 | else |
2328 | ki->p_schedflags = 0; | | 2348 | ki->p_schedflags = 0; |
2329 | ki->p_priority = lwp_eprio(l); | | 2349 | ki->p_priority = lwp_eprio(l); |
2330 | ki->p_usrpri = l->l_priority; | | 2350 | ki->p_usrpri = l->l_priority; |
2331 | if (l->l_wchan) | | 2351 | if (l->l_wchan) |
2332 | strncpy(ki->p_wmesg, l->l_wmesg, sizeof(ki->p_wmesg)); | | 2352 | strncpy(ki->p_wmesg, l->l_wmesg, sizeof(ki->p_wmesg)); |
2333 | ki->p_wchan = PTRTOUINT64(l->l_wchan); | | 2353 | SET_KERN_ADDR(ki->p_wchan, PTRTOUINT64(l->l_wchan), allowaddr); |
2334 | ki->p_cpuid = cpu_index(l->l_cpu); | | 2354 | ki->p_cpuid = cpu_index(l->l_cpu); |
2335 | lwp_unlock(l); | | 2355 | lwp_unlock(l); |
2336 | LIST_FOREACH(l, &p->p_lwps, l_sibling) { | | 2356 | LIST_FOREACH(l, &p->p_lwps, l_sibling) { |
2337 | /* This is hardly correct, but... */ | | 2357 | /* This is hardly correct, but... */ |
2338 | sigplusset(&l->l_sigpend.sp_set, &ss1); | | 2358 | sigplusset(&l->l_sigpend.sp_set, &ss1); |
2339 | sigplusset(&l->l_sigmask, &ss2); | | 2359 | sigplusset(&l->l_sigmask, &ss2); |
2340 | ki->p_cpticks += l->l_cpticks; | | 2360 | ki->p_cpticks += l->l_cpticks; |
2341 | ki->p_pctcpu += l->l_pctcpu; | | 2361 | ki->p_pctcpu += l->l_pctcpu; |
2342 | ki->p_estcpu += l->l_estcpu; | | 2362 | ki->p_estcpu += l->l_estcpu; |
2343 | } | | 2363 | } |
2344 | } | | 2364 | } |
2345 | sigplusset(&p->p_sigpend.sp_set, &ss2); | | 2365 | sigplusset(&p->p_sigpend.sp_set, &ss2); |
2346 | memcpy(&ki->p_siglist, &ss1, sizeof(ki_sigset_t)); | | 2366 | memcpy(&ki->p_siglist, &ss1, sizeof(ki_sigset_t)); |
| @@ -2349,27 +2369,28 @@ fill_kproc2(struct proc *p, struct kinfo | | | @@ -2349,27 +2369,28 @@ fill_kproc2(struct proc *p, struct kinfo |
2349 | if (p->p_session != NULL) { | | 2369 | if (p->p_session != NULL) { |
2350 | ki->p_sid = p->p_session->s_sid; | | 2370 | ki->p_sid = p->p_session->s_sid; |
2351 | ki->p__pgid = p->p_pgrp->pg_id; | | 2371 | ki->p__pgid = p->p_pgrp->pg_id; |
2352 | if (p->p_session->s_ttyvp) | | 2372 | if (p->p_session->s_ttyvp) |
2353 | ki->p_eflag |= EPROC_CTTY; | | 2373 | ki->p_eflag |= EPROC_CTTY; |
2354 | if (SESS_LEADER(p)) | | 2374 | if (SESS_LEADER(p)) |
2355 | ki->p_eflag |= EPROC_SLEADER; | | 2375 | ki->p_eflag |= EPROC_SLEADER; |
2356 | strncpy(ki->p_login, p->p_session->s_login, | | 2376 | strncpy(ki->p_login, p->p_session->s_login, |
2357 | uimin(sizeof ki->p_login - 1, sizeof p->p_session->s_login)); | | 2377 | uimin(sizeof ki->p_login - 1, sizeof p->p_session->s_login)); |
2358 | ki->p_jobc = p->p_pgrp->pg_jobc; | | 2378 | ki->p_jobc = p->p_pgrp->pg_jobc; |
2359 | if ((p->p_lflag & PL_CONTROLT) && (tp = p->p_session->s_ttyp)) { | | 2379 | if ((p->p_lflag & PL_CONTROLT) && (tp = p->p_session->s_ttyp)) { |
2360 | ki->p_tdev = tp->t_dev; | | 2380 | ki->p_tdev = tp->t_dev; |
2361 | ki->p_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID; | | 2381 | ki->p_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID; |
2362 | ki->p_tsess = PTRTOUINT64(tp->t_session); | | 2382 | SET_KERN_ADDR(ki->p_tsess, PTRTOUINT64(tp->t_session), |
| | | 2383 | allowaddr); |
2363 | } else { | | 2384 | } else { |
2364 | ki->p_tdev = (int32_t)NODEV; | | 2385 | ki->p_tdev = (int32_t)NODEV; |
2365 | } | | 2386 | } |
2366 | } | | 2387 | } |
2367 | | | 2388 | |
2368 | if (!P_ZOMBIE(p) && !zombie) { | | 2389 | if (!P_ZOMBIE(p) && !zombie) { |
2369 | ki->p_uvalid = 1; | | 2390 | ki->p_uvalid = 1; |
2370 | ki->p_ustart_sec = p->p_stats->p_start.tv_sec; | | 2391 | ki->p_ustart_sec = p->p_stats->p_start.tv_sec; |
2371 | ki->p_ustart_usec = p->p_stats->p_start.tv_usec; | | 2392 | ki->p_ustart_usec = p->p_stats->p_start.tv_usec; |
2372 | | | 2393 | |
2373 | calcru(p, &ut, &st, NULL, &rt); | | 2394 | calcru(p, &ut, &st, NULL, &rt); |
2374 | ki->p_rtime_sec = rt.tv_sec; | | 2395 | ki->p_rtime_sec = rt.tv_sec; |
2375 | ki->p_rtime_usec = rt.tv_usec; | | 2396 | ki->p_rtime_usec = rt.tv_usec; |