1*4d495c6eSApple OSS Distributions #define PRIVATE
2*4d495c6eSApple OSS Distributions #include <System/sys/kdebug.h>
3*4d495c6eSApple OSS Distributions #include <darwintest.h>
4*4d495c6eSApple OSS Distributions #include <darwintest_utils.h>
5*4d495c6eSApple OSS Distributions #include <dispatch/dispatch.h>
6*4d495c6eSApple OSS Distributions #include <fcntl.h>
7*4d495c6eSApple OSS Distributions #include <inttypes.h>
8*4d495c6eSApple OSS Distributions #include <libproc.h>
9*4d495c6eSApple OSS Distributions #include <libgen.h>
10*4d495c6eSApple OSS Distributions #include <limits.h>
11*4d495c6eSApple OSS Distributions #include <mach/mach.h>
12*4d495c6eSApple OSS Distributions #include <mach/policy.h>
13*4d495c6eSApple OSS Distributions #include <mach/vm_param.h>
14*4d495c6eSApple OSS Distributions #include <os/assumes.h>
15*4d495c6eSApple OSS Distributions #include <os/overflow.h>
16*4d495c6eSApple OSS Distributions #include <pthread.h>
17*4d495c6eSApple OSS Distributions #include <pthread/qos_private.h>
18*4d495c6eSApple OSS Distributions #include <signal.h>
19*4d495c6eSApple OSS Distributions #include <stdint.h>
20*4d495c6eSApple OSS Distributions #include <stdio.h>
21*4d495c6eSApple OSS Distributions #include <stdlib.h>
22*4d495c6eSApple OSS Distributions #include <string.h>
23*4d495c6eSApple OSS Distributions #include <sys/event.h>
24*4d495c6eSApple OSS Distributions #include <sys/mman.h>
25*4d495c6eSApple OSS Distributions #include <sys/proc_info.h>
26*4d495c6eSApple OSS Distributions #include <sys/stat.h>
27*4d495c6eSApple OSS Distributions #include <sys/sysctl.h>
28*4d495c6eSApple OSS Distributions #include <sys/fileport.h>
29*4d495c6eSApple OSS Distributions #include <sys/vnode.h>
30*4d495c6eSApple OSS Distributions #include <sys/fileport.h>
31*4d495c6eSApple OSS Distributions #include <unistd.h>
32*4d495c6eSApple OSS Distributions #undef PRIVATE
33*4d495c6eSApple OSS Distributions
34*4d495c6eSApple OSS Distributions #include "recount/recount_test_utils.h"
35*4d495c6eSApple OSS Distributions
36*4d495c6eSApple OSS Distributions T_GLOBAL_META(T_META_RUN_CONCURRENTLY(true));
37*4d495c6eSApple OSS Distributions
38*4d495c6eSApple OSS Distributions #define ACT_CHANGE_UID 1
39*4d495c6eSApple OSS Distributions #define ACT_CHANGE_RUID 2
40*4d495c6eSApple OSS Distributions #define ACT_EXIT 127
41*4d495c6eSApple OSS Distributions
42*4d495c6eSApple OSS Distributions #define ACT_PHASE2 2
43*4d495c6eSApple OSS Distributions #define ACT_PHASE3 3
44*4d495c6eSApple OSS Distributions #define ACT_PHASE4 4
45*4d495c6eSApple OSS Distributions #define ACT_PHASE5 5
46*4d495c6eSApple OSS Distributions
47*4d495c6eSApple OSS Distributions #define PIPE_IN 0
48*4d495c6eSApple OSS Distributions #define PIPE_OUT 1
49*4d495c6eSApple OSS Distributions
50*4d495c6eSApple OSS Distributions #define CONF_THREAD_NAME "test_child_thread"
51*4d495c6eSApple OSS Distributions #define CONF_CMD_NAME getprogname()
52*4d495c6eSApple OSS Distributions #define CONF_PROC_COUNT 20
53*4d495c6eSApple OSS Distributions #define CONF_BLK_SIZE 4096
54*4d495c6eSApple OSS Distributions #define CONF_UID_VAL 999U
55*4d495c6eSApple OSS Distributions #define CONF_RUID_VAL 998U
56*4d495c6eSApple OSS Distributions #define CONF_GID_VAL 997U
57*4d495c6eSApple OSS Distributions #define CONF_NICE_VAL 5
58*4d495c6eSApple OSS Distributions #define CONF_NUM_THREADS 2
59*4d495c6eSApple OSS Distributions
60*4d495c6eSApple OSS Distributions #define BASEPRI_DEFAULT 31
61*4d495c6eSApple OSS Distributions #define MAXPRI_USER 63
62*4d495c6eSApple OSS Distributions
63*4d495c6eSApple OSS Distributions #define CONF_OPN_FILE_COUNT 3
64*4d495c6eSApple OSS Distributions #define CONF_TMP_FILE_PFX "/tmp/xnu.tests.proc_info."
65*4d495c6eSApple OSS Distributions static int
CONF_TMP_FILE_OPEN(char path[PATH_MAX])66*4d495c6eSApple OSS Distributions CONF_TMP_FILE_OPEN(char path[PATH_MAX])
67*4d495c6eSApple OSS Distributions {
68*4d495c6eSApple OSS Distributions static char stmp_path[PATH_MAX] = {};
69*4d495c6eSApple OSS Distributions char *nm;
70*4d495c6eSApple OSS Distributions if (path) {
71*4d495c6eSApple OSS Distributions nm = path;
72*4d495c6eSApple OSS Distributions } else {
73*4d495c6eSApple OSS Distributions nm = stmp_path;
74*4d495c6eSApple OSS Distributions }
75*4d495c6eSApple OSS Distributions strlcpy(nm, CONF_TMP_FILE_PFX "XXXXXXXXXX", PATH_MAX);
76*4d495c6eSApple OSS Distributions int fd = mkstemp(nm);
77*4d495c6eSApple OSS Distributions T_QUIET;
78*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(fd, "mkstemp(" CONF_TMP_FILE_PFX "XXXXXXXXXX)");
79*4d495c6eSApple OSS Distributions return fd;
80*4d495c6eSApple OSS Distributions }
81*4d495c6eSApple OSS Distributions
82*4d495c6eSApple OSS Distributions // Forward declarations for currently 'private' functions implemented by libproc.
83*4d495c6eSApple OSS Distributions int proc_list_uptrs(int pid, uint64_t *buf, uint32_t bufsz);
84*4d495c6eSApple OSS Distributions int proc_list_dynkqueueids(int pid, kqueue_id_t *buf, uint32_t bufsz);
85*4d495c6eSApple OSS Distributions int proc_piddynkqueueinfo(int pid, int flavor, kqueue_id_t kq_id, void *buffer, int buffersize);
86*4d495c6eSApple OSS Distributions
87*4d495c6eSApple OSS Distributions uint32_t get_tty_dev(void);
88*4d495c6eSApple OSS Distributions
89*4d495c6eSApple OSS Distributions #define WAIT_FOR_CHILDREN(pipefd, action, child_count) \
90*4d495c6eSApple OSS Distributions do { \
91*4d495c6eSApple OSS Distributions long ret; \
92*4d495c6eSApple OSS Distributions if (child_count == 1) { \
93*4d495c6eSApple OSS Distributions int child_ret_action = 999; \
94*4d495c6eSApple OSS Distributions while (child_ret_action != action) { \
95*4d495c6eSApple OSS Distributions ret = read(pipefd, &child_ret_action, sizeof(child_ret_action)); \
96*4d495c6eSApple OSS Distributions } \
97*4d495c6eSApple OSS Distributions } else { \
98*4d495c6eSApple OSS Distributions int child_ready_count = child_count * (int)sizeof(action); \
99*4d495c6eSApple OSS Distributions \
100*4d495c6eSApple OSS Distributions action = 0; \
101*4d495c6eSApple OSS Distributions while (child_ready_count) { \
102*4d495c6eSApple OSS Distributions ret = read(pipefd, &action, (int)sizeof(action)); \
103*4d495c6eSApple OSS Distributions if (ret != -1) { \
104*4d495c6eSApple OSS Distributions child_ready_count -= ret; \
105*4d495c6eSApple OSS Distributions } else { \
106*4d495c6eSApple OSS Distributions T_FAIL("ERROR: Could not read from pipe() : %d", errno); \
107*4d495c6eSApple OSS Distributions } \
108*4d495c6eSApple OSS Distributions if (action) { \
109*4d495c6eSApple OSS Distributions T_FAIL("ERROR: Child action failed with error %d", action); \
110*4d495c6eSApple OSS Distributions } \
111*4d495c6eSApple OSS Distributions } \
112*4d495c6eSApple OSS Distributions } \
113*4d495c6eSApple OSS Distributions } while (0)
114*4d495c6eSApple OSS Distributions
115*4d495c6eSApple OSS Distributions #define PROC_INFO_CALL(struct_name, pid, flavor, proc_arg) \
116*4d495c6eSApple OSS Distributions do { \
117*4d495c6eSApple OSS Distributions struct struct_name * struct_var = malloc(sizeof(struct struct_name)); \
118*4d495c6eSApple OSS Distributions T_QUIET; \
119*4d495c6eSApple OSS Distributions T_ASSERT_NOTNULL(struct_var, "malloc() for " #flavor); \
120*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, pid, flavor, (uint64_t)proc_arg, (user_addr_t)struct_var, \
121*4d495c6eSApple OSS Distributions (uint32_t)sizeof(struct struct_name)); \
122*4d495c6eSApple OSS Distributions \
123*4d495c6eSApple OSS Distributions T_QUIET; \
124*4d495c6eSApple OSS Distributions T_EXPECT_POSIX_SUCCESS(retval, "__proc_info call for " #flavor); \
125*4d495c6eSApple OSS Distributions T_ASSERT_EQ_INT(retval, (int)sizeof(struct struct_name), "__proc_info call for " #flavor); \
126*4d495c6eSApple OSS Distributions ret_structs[i] = (void *)struct_var; \
127*4d495c6eSApple OSS Distributions i++; \
128*4d495c6eSApple OSS Distributions } while (0)
129*4d495c6eSApple OSS Distributions
130*4d495c6eSApple OSS Distributions uint32_t
get_tty_dev()131*4d495c6eSApple OSS Distributions get_tty_dev()
132*4d495c6eSApple OSS Distributions {
133*4d495c6eSApple OSS Distributions struct stat buf;
134*4d495c6eSApple OSS Distributions stat(ttyname(1), &buf);
135*4d495c6eSApple OSS Distributions return (uint32_t)buf.st_rdev;
136*4d495c6eSApple OSS Distributions }
137*4d495c6eSApple OSS Distributions
138*4d495c6eSApple OSS Distributions /*
139*4d495c6eSApple OSS Distributions * Defined in libsyscall/wrappers/libproc/libproc.c
140*4d495c6eSApple OSS Distributions * For API test only. For normal use, please use the libproc API instead.
141*4d495c6eSApple OSS Distributions * DO NOT COPY
142*4d495c6eSApple OSS Distributions */
143*4d495c6eSApple OSS Distributions extern int __proc_info(int32_t callnum, int32_t pid, uint32_t flavor, uint64_t arg, user_addr_t buffer, int32_t buffersize);
144*4d495c6eSApple OSS Distributions struct proc_config_s {
145*4d495c6eSApple OSS Distributions int parent_pipe[2];
146*4d495c6eSApple OSS Distributions int child_count;
147*4d495c6eSApple OSS Distributions pid_t proc_grp_id;
148*4d495c6eSApple OSS Distributions int child_pipe[CONF_PROC_COUNT][2];
149*4d495c6eSApple OSS Distributions int child_pids[CONF_PROC_COUNT];
150*4d495c6eSApple OSS Distributions void * cow_map; /* memory for cow test */
151*4d495c6eSApple OSS Distributions };
152*4d495c6eSApple OSS Distributions typedef struct proc_config_s * proc_config_t;
153*4d495c6eSApple OSS Distributions
154*4d495c6eSApple OSS Distributions typedef void (^child_action_handler_t)(proc_config_t proc_config, int child_id);
155*4d495c6eSApple OSS Distributions
156*4d495c6eSApple OSS Distributions enum proc_info_opt {
157*4d495c6eSApple OSS Distributions P_UNIQIDINFO = 0x01,
158*4d495c6eSApple OSS Distributions C_UNIQIDINFO = 0x02,
159*4d495c6eSApple OSS Distributions PBSD_OLD = 0x04,
160*4d495c6eSApple OSS Distributions PBSD = 0x08,
161*4d495c6eSApple OSS Distributions PBSD_SHORT = 0x10,
162*4d495c6eSApple OSS Distributions PBSD_UNIQID = 0x20,
163*4d495c6eSApple OSS Distributions P_TASK_INFO = 0x40,
164*4d495c6eSApple OSS Distributions P_TASK_INFO_NEW = 0x80,
165*4d495c6eSApple OSS Distributions PALL = 0x100,
166*4d495c6eSApple OSS Distributions THREAD_ADDR = 0x200,
167*4d495c6eSApple OSS Distributions PTHINFO_OLD = 0x400,
168*4d495c6eSApple OSS Distributions PTHINFO = 0x800,
169*4d495c6eSApple OSS Distributions PTHINFO_64 = 0x1000,
170*4d495c6eSApple OSS Distributions PINFO_PATH = 0x2000,
171*4d495c6eSApple OSS Distributions PAI = 0x4000,
172*4d495c6eSApple OSS Distributions PREGINFO = 0x8000,
173*4d495c6eSApple OSS Distributions PREGINFO_PATH = 0x10000,
174*4d495c6eSApple OSS Distributions PREGINFO_PATH_2 = 0x20000,
175*4d495c6eSApple OSS Distributions PREGINFO_PATH_3 = 0x40000,
176*4d495c6eSApple OSS Distributions PVNINFO = 0x80000
177*4d495c6eSApple OSS Distributions };
178*4d495c6eSApple OSS Distributions
179*4d495c6eSApple OSS Distributions static int tmp_fd = -1;
180*4d495c6eSApple OSS Distributions
181*4d495c6eSApple OSS Distributions static child_action_handler_t proc_info_listpids_handler = ^void (proc_config_t proc_config, int child_id) {
182*4d495c6eSApple OSS Distributions close(proc_config->parent_pipe[PIPE_IN]);
183*4d495c6eSApple OSS Distributions close(proc_config->child_pipe[child_id][PIPE_OUT]);
184*4d495c6eSApple OSS Distributions long retval = 0;
185*4d495c6eSApple OSS Distributions int child_action = 0;
186*4d495c6eSApple OSS Distributions retval = write(proc_config->parent_pipe[PIPE_OUT], &child_action, sizeof(child_action));
187*4d495c6eSApple OSS Distributions if (retval != -1) {
188*4d495c6eSApple OSS Distributions while (child_action != ACT_EXIT) {
189*4d495c6eSApple OSS Distributions retval = read(proc_config->child_pipe[child_id][PIPE_IN], &child_action, sizeof(child_action));
190*4d495c6eSApple OSS Distributions if (retval == 0 || (retval == -1 && errno == EAGAIN)) {
191*4d495c6eSApple OSS Distributions continue;
192*4d495c6eSApple OSS Distributions }
193*4d495c6eSApple OSS Distributions if (retval != -1) {
194*4d495c6eSApple OSS Distributions switch (child_action) {
195*4d495c6eSApple OSS Distributions case ACT_CHANGE_UID:
196*4d495c6eSApple OSS Distributions /*
197*4d495c6eSApple OSS Distributions * Change uid
198*4d495c6eSApple OSS Distributions */
199*4d495c6eSApple OSS Distributions retval = setuid(CONF_UID_VAL);
200*4d495c6eSApple OSS Distributions break;
201*4d495c6eSApple OSS Distributions case ACT_CHANGE_RUID:
202*4d495c6eSApple OSS Distributions /*
203*4d495c6eSApple OSS Distributions * Change ruid
204*4d495c6eSApple OSS Distributions */
205*4d495c6eSApple OSS Distributions retval = setreuid(CONF_RUID_VAL, (uid_t)-1);
206*4d495c6eSApple OSS Distributions break;
207*4d495c6eSApple OSS Distributions case ACT_EXIT:
208*4d495c6eSApple OSS Distributions /*
209*4d495c6eSApple OSS Distributions * Exit
210*4d495c6eSApple OSS Distributions */
211*4d495c6eSApple OSS Distributions break;
212*4d495c6eSApple OSS Distributions }
213*4d495c6eSApple OSS Distributions }
214*4d495c6eSApple OSS Distributions if (child_action != ACT_EXIT) {
215*4d495c6eSApple OSS Distributions retval = write(proc_config->parent_pipe[PIPE_OUT], &retval, sizeof(retval));
216*4d495c6eSApple OSS Distributions if (retval == -1) {
217*4d495c6eSApple OSS Distributions break;
218*4d495c6eSApple OSS Distributions }
219*4d495c6eSApple OSS Distributions }
220*4d495c6eSApple OSS Distributions }
221*4d495c6eSApple OSS Distributions }
222*4d495c6eSApple OSS Distributions close(proc_config->parent_pipe[PIPE_OUT]);
223*4d495c6eSApple OSS Distributions close(proc_config->child_pipe[child_id][PIPE_IN]);
224*4d495c6eSApple OSS Distributions exit(0);
225*4d495c6eSApple OSS Distributions };
226*4d495c6eSApple OSS Distributions
227*4d495c6eSApple OSS Distributions static child_action_handler_t proc_info_call_pidinfo_handler = ^void (proc_config_t proc_config, int child_id) {
228*4d495c6eSApple OSS Distributions close(proc_config->parent_pipe[PIPE_IN]);
229*4d495c6eSApple OSS Distributions close(proc_config->child_pipe[child_id][PIPE_OUT]);
230*4d495c6eSApple OSS Distributions int action = 0;
231*4d495c6eSApple OSS Distributions long retval = 0;
232*4d495c6eSApple OSS Distributions int i;
233*4d495c6eSApple OSS Distributions void * tmp_map = NULL;
234*4d495c6eSApple OSS Distributions dispatch_queue_t q = NULL;
235*4d495c6eSApple OSS Distributions dispatch_semaphore_t sem = NULL;
236*4d495c6eSApple OSS Distributions /*
237*4d495c6eSApple OSS Distributions * PHASE 1: Child ready and waits for parent to send next action
238*4d495c6eSApple OSS Distributions */
239*4d495c6eSApple OSS Distributions T_LOG("Child ready to accept action from parent");
240*4d495c6eSApple OSS Distributions retval = write(proc_config->parent_pipe[PIPE_OUT], &action, sizeof(action));
241*4d495c6eSApple OSS Distributions if (retval != -1) {
242*4d495c6eSApple OSS Distributions while (action != ACT_EXIT) {
243*4d495c6eSApple OSS Distributions retval = read(proc_config->child_pipe[child_id][PIPE_IN], &action, sizeof(action));
244*4d495c6eSApple OSS Distributions
245*4d495c6eSApple OSS Distributions if (retval != -1) {
246*4d495c6eSApple OSS Distributions retval = 0;
247*4d495c6eSApple OSS Distributions switch (action) {
248*4d495c6eSApple OSS Distributions case ACT_PHASE2: {
249*4d495c6eSApple OSS Distributions /*
250*4d495c6eSApple OSS Distributions * Change uid, euid, guid, rgid, nice value
251*4d495c6eSApple OSS Distributions * Also change the svuid and svgid
252*4d495c6eSApple OSS Distributions */
253*4d495c6eSApple OSS Distributions T_LOG("Child changing uid, euid, rguid, svuid, svgid and nice value");
254*4d495c6eSApple OSS Distributions retval = nice(CONF_NICE_VAL);
255*4d495c6eSApple OSS Distributions if (retval == -1) {
256*4d495c6eSApple OSS Distributions T_LOG("(child) ERROR: nice() failed");
257*4d495c6eSApple OSS Distributions break;
258*4d495c6eSApple OSS Distributions }
259*4d495c6eSApple OSS Distributions retval = setgid(CONF_GID_VAL);
260*4d495c6eSApple OSS Distributions if (retval == -1) {
261*4d495c6eSApple OSS Distributions T_LOG("(child) ERROR: setgid() failed");
262*4d495c6eSApple OSS Distributions break;
263*4d495c6eSApple OSS Distributions }
264*4d495c6eSApple OSS Distributions retval = setreuid((uid_t)-1, CONF_RUID_VAL);
265*4d495c6eSApple OSS Distributions if (retval == -1) {
266*4d495c6eSApple OSS Distributions T_LOG("(child) ERROR: setreuid() failed");
267*4d495c6eSApple OSS Distributions break;
268*4d495c6eSApple OSS Distributions }
269*4d495c6eSApple OSS Distributions break;
270*4d495c6eSApple OSS Distributions }
271*4d495c6eSApple OSS Distributions case ACT_PHASE3: {
272*4d495c6eSApple OSS Distributions /*
273*4d495c6eSApple OSS Distributions * Allocate a page of memory
274*4d495c6eSApple OSS Distributions * Copy on write shared memory
275*4d495c6eSApple OSS Distributions *
276*4d495c6eSApple OSS Distributions * WARNING
277*4d495c6eSApple OSS Distributions * Don't add calls to T_LOG here as they can end up generating unwanted
278*4d495c6eSApple OSS Distributions * calls to mach_msg_send(). If curtask->messages_sent gets incremented
279*4d495c6eSApple OSS Distributions * at this point it will interfere with testing pti_messages_sent.
280*4d495c6eSApple OSS Distributions */
281*4d495c6eSApple OSS Distributions retval = 0;
282*4d495c6eSApple OSS Distributions tmp_map = mmap(0, PAGE_SIZE, PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
283*4d495c6eSApple OSS Distributions if (tmp_map == MAP_FAILED) {
284*4d495c6eSApple OSS Distributions T_LOG("(child) ERROR: mmap() failed");
285*4d495c6eSApple OSS Distributions retval = 1;
286*4d495c6eSApple OSS Distributions break;
287*4d495c6eSApple OSS Distributions }
288*4d495c6eSApple OSS Distributions /*
289*4d495c6eSApple OSS Distributions * Get the page allocated
290*4d495c6eSApple OSS Distributions */
291*4d495c6eSApple OSS Distributions int * map_ptr = (int *)tmp_map;
292*4d495c6eSApple OSS Distributions for (i = 0; i < (int)(PAGE_SIZE / sizeof(int)); i++) {
293*4d495c6eSApple OSS Distributions *map_ptr++ = i;
294*4d495c6eSApple OSS Distributions }
295*4d495c6eSApple OSS Distributions /*
296*4d495c6eSApple OSS Distributions * Cause copy on write to the page
297*4d495c6eSApple OSS Distributions */
298*4d495c6eSApple OSS Distributions *((int *)(proc_config->cow_map)) = 20;
299*4d495c6eSApple OSS Distributions
300*4d495c6eSApple OSS Distributions break;
301*4d495c6eSApple OSS Distributions }
302*4d495c6eSApple OSS Distributions case ACT_PHASE4: {
303*4d495c6eSApple OSS Distributions T_LOG("Child spending CPU cycles and changing thread name");
304*4d495c6eSApple OSS Distributions retval = 0;
305*4d495c6eSApple OSS Distributions int number = 1000;
306*4d495c6eSApple OSS Distributions unsigned long long factorial = 1;
307*4d495c6eSApple OSS Distributions int j;
308*4d495c6eSApple OSS Distributions for (j = 1; j <= number; j++) {
309*4d495c6eSApple OSS Distributions factorial *= (unsigned long long)j;
310*4d495c6eSApple OSS Distributions }
311*4d495c6eSApple OSS Distributions sysctlbyname("kern.threadname", NULL, 0, CONF_THREAD_NAME, strlen(CONF_THREAD_NAME));
312*4d495c6eSApple OSS Distributions break;
313*4d495c6eSApple OSS Distributions }
314*4d495c6eSApple OSS Distributions case ACT_PHASE5: {
315*4d495c6eSApple OSS Distributions /*
316*4d495c6eSApple OSS Distributions * Dispatch for Workq test
317*4d495c6eSApple OSS Distributions */
318*4d495c6eSApple OSS Distributions T_LOG("Child creating a dispatch queue, and dispatching blocks on it");
319*4d495c6eSApple OSS Distributions q = dispatch_queue_create("com.apple.test_proc_info.workqtest",
320*4d495c6eSApple OSS Distributions DISPATCH_QUEUE_CONCURRENT); // dispatch_get_global_queue(0, 0);
321*4d495c6eSApple OSS Distributions sem = dispatch_semaphore_create(0);
322*4d495c6eSApple OSS Distributions
323*4d495c6eSApple OSS Distributions for (i = 0; i < CONF_NUM_THREADS; i++) {
324*4d495c6eSApple OSS Distributions dispatch_async(q, ^{
325*4d495c6eSApple OSS Distributions /*
326*4d495c6eSApple OSS Distributions * Block the thread, do nothing
327*4d495c6eSApple OSS Distributions */
328*4d495c6eSApple OSS Distributions dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
329*4d495c6eSApple OSS Distributions });
330*4d495c6eSApple OSS Distributions }
331*4d495c6eSApple OSS Distributions break;
332*4d495c6eSApple OSS Distributions }
333*4d495c6eSApple OSS Distributions case ACT_EXIT: {
334*4d495c6eSApple OSS Distributions /*
335*4d495c6eSApple OSS Distributions * Exit
336*4d495c6eSApple OSS Distributions */
337*4d495c6eSApple OSS Distributions if (sem) {
338*4d495c6eSApple OSS Distributions for (i = 0; i < CONF_NUM_THREADS; i++) {
339*4d495c6eSApple OSS Distributions dispatch_semaphore_signal(sem);
340*4d495c6eSApple OSS Distributions }
341*4d495c6eSApple OSS Distributions }
342*4d495c6eSApple OSS Distributions
343*4d495c6eSApple OSS Distributions if (tmp_map) {
344*4d495c6eSApple OSS Distributions munmap(tmp_map, PAGE_SIZE);
345*4d495c6eSApple OSS Distributions }
346*4d495c6eSApple OSS Distributions
347*4d495c6eSApple OSS Distributions if (proc_config->cow_map) {
348*4d495c6eSApple OSS Distributions munmap(proc_config->cow_map, PAGE_SIZE);
349*4d495c6eSApple OSS Distributions }
350*4d495c6eSApple OSS Distributions
351*4d495c6eSApple OSS Distributions break;
352*4d495c6eSApple OSS Distributions }
353*4d495c6eSApple OSS Distributions }
354*4d495c6eSApple OSS Distributions }
355*4d495c6eSApple OSS Distributions if (action != ACT_EXIT) {
356*4d495c6eSApple OSS Distributions retval = write(proc_config->parent_pipe[PIPE_OUT], &action, sizeof(action));
357*4d495c6eSApple OSS Distributions if (retval == -1) {
358*4d495c6eSApple OSS Distributions break;
359*4d495c6eSApple OSS Distributions }
360*4d495c6eSApple OSS Distributions }
361*4d495c6eSApple OSS Distributions }
362*4d495c6eSApple OSS Distributions close(proc_config->parent_pipe[PIPE_OUT]);
363*4d495c6eSApple OSS Distributions close(proc_config->child_pipe[child_id][PIPE_IN]);
364*4d495c6eSApple OSS Distributions exit(0);
365*4d495c6eSApple OSS Distributions }
366*4d495c6eSApple OSS Distributions };
367*4d495c6eSApple OSS Distributions
368*4d495c6eSApple OSS Distributions static void
free_proc_config(proc_config_t proc_config)369*4d495c6eSApple OSS Distributions free_proc_config(proc_config_t proc_config)
370*4d495c6eSApple OSS Distributions {
371*4d495c6eSApple OSS Distributions free(proc_config);
372*4d495c6eSApple OSS Distributions }
373*4d495c6eSApple OSS Distributions
374*4d495c6eSApple OSS Distributions static void
send_action_to_child_processes(proc_config_t proc_config,int action)375*4d495c6eSApple OSS Distributions send_action_to_child_processes(proc_config_t proc_config, int action)
376*4d495c6eSApple OSS Distributions {
377*4d495c6eSApple OSS Distributions long err;
378*4d495c6eSApple OSS Distributions for (int i = 0; i < proc_config->child_count; i++) {
379*4d495c6eSApple OSS Distributions err = write(proc_config->child_pipe[i][PIPE_OUT], &action, sizeof(action));
380*4d495c6eSApple OSS Distributions T_QUIET;
381*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(err, "write() to child in send_action");
382*4d495c6eSApple OSS Distributions }
383*4d495c6eSApple OSS Distributions if (action != ACT_EXIT) {
384*4d495c6eSApple OSS Distributions WAIT_FOR_CHILDREN(proc_config->parent_pipe[PIPE_IN], action, proc_config->child_count);
385*4d495c6eSApple OSS Distributions }
386*4d495c6eSApple OSS Distributions }
387*4d495c6eSApple OSS Distributions
388*4d495c6eSApple OSS Distributions static void
kill_child_processes(proc_config_t proc_config)389*4d495c6eSApple OSS Distributions kill_child_processes(proc_config_t proc_config)
390*4d495c6eSApple OSS Distributions {
391*4d495c6eSApple OSS Distributions int ret = 0;
392*4d495c6eSApple OSS Distributions T_LOG("Killing child processes");
393*4d495c6eSApple OSS Distributions send_action_to_child_processes(proc_config, ACT_EXIT);
394*4d495c6eSApple OSS Distributions for (int child_id = 0; child_id < proc_config->child_count; child_id++) {
395*4d495c6eSApple OSS Distributions close(proc_config->child_pipe[child_id][PIPE_OUT]);
396*4d495c6eSApple OSS Distributions dt_waitpid(proc_config->child_pids[child_id], NULL, NULL, 5);
397*4d495c6eSApple OSS Distributions T_QUIET;
398*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "killed child %d", child_id);
399*4d495c6eSApple OSS Distributions }
400*4d495c6eSApple OSS Distributions close(proc_config->parent_pipe[PIPE_IN]);
401*4d495c6eSApple OSS Distributions munmap(proc_config->cow_map, PAGE_SIZE);
402*4d495c6eSApple OSS Distributions T_LOG("Killed child processes");
403*4d495c6eSApple OSS Distributions }
404*4d495c6eSApple OSS Distributions
405*4d495c6eSApple OSS Distributions static proc_config_t
spawn_child_processes(int child_count,child_action_handler_t child_handler)406*4d495c6eSApple OSS Distributions spawn_child_processes(int child_count, child_action_handler_t child_handler)
407*4d495c6eSApple OSS Distributions {
408*4d495c6eSApple OSS Distributions /*
409*4d495c6eSApple OSS Distributions * Spawn procs for Tests 1.2 and 1.3
410*4d495c6eSApple OSS Distributions */
411*4d495c6eSApple OSS Distributions T_LOG("Spawning child processes...");
412*4d495c6eSApple OSS Distributions proc_config_t proc_config = malloc(sizeof(*proc_config));
413*4d495c6eSApple OSS Distributions int action = 0;
414*4d495c6eSApple OSS Distributions int err;
415*4d495c6eSApple OSS Distributions
416*4d495c6eSApple OSS Distributions setpgid(0, 0);
417*4d495c6eSApple OSS Distributions proc_config->proc_grp_id = getpgid(0);
418*4d495c6eSApple OSS Distributions
419*4d495c6eSApple OSS Distributions proc_config->child_count = child_count;
420*4d495c6eSApple OSS Distributions
421*4d495c6eSApple OSS Distributions err = pipe(proc_config->parent_pipe);
422*4d495c6eSApple OSS Distributions T_QUIET;
423*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(err, "pipe() call");
424*4d495c6eSApple OSS Distributions
425*4d495c6eSApple OSS Distributions /*
426*4d495c6eSApple OSS Distributions * Needed for ACT_PHASE3 tests
427*4d495c6eSApple OSS Distributions */
428*4d495c6eSApple OSS Distributions proc_config->cow_map = mmap(0, PAGE_SIZE, PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
429*4d495c6eSApple OSS Distributions T_QUIET;
430*4d495c6eSApple OSS Distributions T_ASSERT_NE_PTR(proc_config->cow_map, MAP_FAILED, "cow_map mmap()");
431*4d495c6eSApple OSS Distributions *((int *)(proc_config->cow_map)) = 10;
432*4d495c6eSApple OSS Distributions
433*4d495c6eSApple OSS Distributions pid_t child_pid;
434*4d495c6eSApple OSS Distributions int i;
435*4d495c6eSApple OSS Distributions int child_id;
436*4d495c6eSApple OSS Distributions for (i = 0; i < child_count; i++) {
437*4d495c6eSApple OSS Distributions err = pipe(proc_config->child_pipe[i]);
438*4d495c6eSApple OSS Distributions T_QUIET;
439*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(err, "pipe() call");
440*4d495c6eSApple OSS Distributions
441*4d495c6eSApple OSS Distributions child_pid = fork();
442*4d495c6eSApple OSS Distributions child_id = i;
443*4d495c6eSApple OSS Distributions T_QUIET;
444*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(child_pid, "fork() in parent process for child %d", child_id);
445*4d495c6eSApple OSS Distributions
446*4d495c6eSApple OSS Distributions if (child_pid == 0) {
447*4d495c6eSApple OSS Distributions child_handler(proc_config, child_id);
448*4d495c6eSApple OSS Distributions } else {
449*4d495c6eSApple OSS Distributions proc_config->child_pids[child_id] = child_pid;
450*4d495c6eSApple OSS Distributions }
451*4d495c6eSApple OSS Distributions close(proc_config->child_pipe[child_id][PIPE_IN]);
452*4d495c6eSApple OSS Distributions }
453*4d495c6eSApple OSS Distributions /*
454*4d495c6eSApple OSS Distributions * Wait for the children processes to spawn
455*4d495c6eSApple OSS Distributions */
456*4d495c6eSApple OSS Distributions close(proc_config->parent_pipe[PIPE_OUT]);
457*4d495c6eSApple OSS Distributions WAIT_FOR_CHILDREN(proc_config->parent_pipe[PIPE_IN], action, child_count);
458*4d495c6eSApple OSS Distributions
459*4d495c6eSApple OSS Distributions return proc_config;
460*4d495c6eSApple OSS Distributions }
461*4d495c6eSApple OSS Distributions
462*4d495c6eSApple OSS Distributions /*
463*4d495c6eSApple OSS Distributions * All PROC_INFO_CALL_PIDINFO __proc_info calls fire from this function.
464*4d495c6eSApple OSS Distributions * T_DECLs require different combinations of structs and different actions
465*4d495c6eSApple OSS Distributions * must occur in the child to get the data. Instead of performing the setup
466*4d495c6eSApple OSS Distributions * in each T_DECL, this function accepts a bitmap and performs the necessary setup
467*4d495c6eSApple OSS Distributions * and cleanup work
468*4d495c6eSApple OSS Distributions */
469*4d495c6eSApple OSS Distributions
470*4d495c6eSApple OSS Distributions static void
proc_info_caller(int proc_info_opts,void ** ret_structs,int * ret_child_pid)471*4d495c6eSApple OSS Distributions proc_info_caller(int proc_info_opts, void ** ret_structs, int * ret_child_pid)
472*4d495c6eSApple OSS Distributions {
473*4d495c6eSApple OSS Distributions int retval, i = 0;
474*4d495c6eSApple OSS Distributions uint64_t * thread_addr = NULL;
475*4d495c6eSApple OSS Distributions void * map_tmp = NULL;
476*4d495c6eSApple OSS Distributions static char tmp_path[PATH_MAX] = {};
477*4d495c6eSApple OSS Distributions
478*4d495c6eSApple OSS Distributions proc_config_t proc_config = spawn_child_processes(1, proc_info_call_pidinfo_handler);
479*4d495c6eSApple OSS Distributions int child_pid = proc_config->child_pids[0];
480*4d495c6eSApple OSS Distributions /*
481*4d495c6eSApple OSS Distributions * These tests only require one child.
482*4d495c6eSApple OSS Distributions * Some DECLs need to know the child pid, so we pass that back if applicable
483*4d495c6eSApple OSS Distributions */
484*4d495c6eSApple OSS Distributions if (ret_child_pid != NULL) {
485*4d495c6eSApple OSS Distributions *ret_child_pid = child_pid;
486*4d495c6eSApple OSS Distributions }
487*4d495c6eSApple OSS Distributions
488*4d495c6eSApple OSS Distributions if (proc_info_opts & P_UNIQIDINFO) {
489*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_uniqidentifierinfo, getpid(), PROC_PIDUNIQIDENTIFIERINFO, 0);
490*4d495c6eSApple OSS Distributions }
491*4d495c6eSApple OSS Distributions if (proc_info_opts & C_UNIQIDINFO) {
492*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_uniqidentifierinfo, child_pid, PROC_PIDUNIQIDENTIFIERINFO, 0);
493*4d495c6eSApple OSS Distributions }
494*4d495c6eSApple OSS Distributions if (proc_info_opts & PBSD_OLD) {
495*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_bsdinfo, child_pid, PROC_PIDTBSDINFO, 0);
496*4d495c6eSApple OSS Distributions }
497*4d495c6eSApple OSS Distributions
498*4d495c6eSApple OSS Distributions /*
499*4d495c6eSApple OSS Distributions * Child Phase 2 Fires if opts require it
500*4d495c6eSApple OSS Distributions * Small nap after call to give child time to receive and execute the action
501*4d495c6eSApple OSS Distributions */
502*4d495c6eSApple OSS Distributions
503*4d495c6eSApple OSS Distributions if (proc_info_opts >= PBSD) {
504*4d495c6eSApple OSS Distributions send_action_to_child_processes(proc_config, ACT_PHASE2);
505*4d495c6eSApple OSS Distributions }
506*4d495c6eSApple OSS Distributions
507*4d495c6eSApple OSS Distributions if (proc_info_opts & PBSD) {
508*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_bsdinfo, child_pid, PROC_PIDTBSDINFO, 0);
509*4d495c6eSApple OSS Distributions }
510*4d495c6eSApple OSS Distributions
511*4d495c6eSApple OSS Distributions if (proc_info_opts & PBSD_SHORT) {
512*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_bsdshortinfo, child_pid, PROC_PIDT_SHORTBSDINFO, 0);
513*4d495c6eSApple OSS Distributions }
514*4d495c6eSApple OSS Distributions
515*4d495c6eSApple OSS Distributions if (proc_info_opts & PBSD_UNIQID) {
516*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_bsdinfowithuniqid, child_pid, PROC_PIDT_BSDINFOWITHUNIQID, 0);
517*4d495c6eSApple OSS Distributions }
518*4d495c6eSApple OSS Distributions if (proc_info_opts & P_TASK_INFO) {
519*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_taskinfo, child_pid, PROC_PIDTASKINFO, 0);
520*4d495c6eSApple OSS Distributions }
521*4d495c6eSApple OSS Distributions
522*4d495c6eSApple OSS Distributions /*
523*4d495c6eSApple OSS Distributions * Child Phase 3 Fires
524*4d495c6eSApple OSS Distributions */
525*4d495c6eSApple OSS Distributions if (proc_info_opts >= P_TASK_INFO_NEW) {
526*4d495c6eSApple OSS Distributions send_action_to_child_processes(proc_config, ACT_PHASE3);
527*4d495c6eSApple OSS Distributions }
528*4d495c6eSApple OSS Distributions
529*4d495c6eSApple OSS Distributions if (proc_info_opts & P_TASK_INFO_NEW) {
530*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_taskinfo, child_pid, PROC_PIDTASKINFO, 0);
531*4d495c6eSApple OSS Distributions }
532*4d495c6eSApple OSS Distributions
533*4d495c6eSApple OSS Distributions if (proc_info_opts & PALL) {
534*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_taskallinfo, child_pid, PROC_PIDTASKALLINFO, 0);
535*4d495c6eSApple OSS Distributions }
536*4d495c6eSApple OSS Distributions /*
537*4d495c6eSApple OSS Distributions * This case breaks the pattern in that its proc_info call requires PALL,
538*4d495c6eSApple OSS Distributions * its value is required in some other proc_info calls
539*4d495c6eSApple OSS Distributions * and we never put the retval into our ret_structs
540*4d495c6eSApple OSS Distributions */
541*4d495c6eSApple OSS Distributions if (proc_info_opts & THREAD_ADDR || proc_info_opts & PTHINFO_OLD || proc_info_opts & PTHINFO || proc_info_opts & PINFO_PATH) {
542*4d495c6eSApple OSS Distributions struct proc_taskallinfo * pall = malloc(sizeof(struct proc_taskallinfo));
543*4d495c6eSApple OSS Distributions T_QUIET;
544*4d495c6eSApple OSS Distributions T_ASSERT_NOTNULL(pall, "malloc() for PROC_TASKALLINFO");
545*4d495c6eSApple OSS Distributions
546*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, child_pid, PROC_PIDTASKALLINFO, (uint32_t)0, (user_addr_t)pall,
547*4d495c6eSApple OSS Distributions (uint32_t)sizeof(struct proc_taskallinfo));
548*4d495c6eSApple OSS Distributions T_QUIET;
549*4d495c6eSApple OSS Distributions T_ASSERT_EQ_INT(retval, (int)sizeof(struct proc_taskallinfo), "__proc_info call for PROC_PIDTASKALLINFO in THREAD_ADDR");
550*4d495c6eSApple OSS Distributions
551*4d495c6eSApple OSS Distributions thread_addr = malloc(sizeof(uint64_t) * (unsigned long)(pall->ptinfo.pti_threadnum + 1));
552*4d495c6eSApple OSS Distributions memset(thread_addr, 0, sizeof(uint64_t) * (unsigned long)(pall->ptinfo.pti_threadnum + 1));
553*4d495c6eSApple OSS Distributions T_QUIET;
554*4d495c6eSApple OSS Distributions T_ASSERT_NOTNULL(thread_addr, "malloc() for PROC_PIDLISTTHREADS");
555*4d495c6eSApple OSS Distributions
556*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, child_pid, PROC_PIDLISTTHREADS, (uint32_t)0, (user_addr_t)thread_addr,
557*4d495c6eSApple OSS Distributions (int32_t)(sizeof(uint64_t) * (unsigned long)(pall->ptinfo.pti_threadnum + 1)));
558*4d495c6eSApple OSS Distributions T_LOG("(int)((unsigned long)retval / PROC_PIDLISTTHREADS_SIZE: %d",
559*4d495c6eSApple OSS Distributions (int)((unsigned long)retval / PROC_PIDLISTTHREADS_SIZE));
560*4d495c6eSApple OSS Distributions T_ASSERT_GE_INT((int)((unsigned long)retval / PROC_PIDLISTTHREADS_SIZE), pall->ptinfo.pti_threadnum,
561*4d495c6eSApple OSS Distributions "__proc_info call for PROC_PIDLISTTHREADS");
562*4d495c6eSApple OSS Distributions
563*4d495c6eSApple OSS Distributions free(pall);
564*4d495c6eSApple OSS Distributions }
565*4d495c6eSApple OSS Distributions if (proc_info_opts & PTHINFO_OLD) {
566*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_threadinfo, child_pid, PROC_PIDTHREADINFO, thread_addr[0]);
567*4d495c6eSApple OSS Distributions }
568*4d495c6eSApple OSS Distributions
569*4d495c6eSApple OSS Distributions /*
570*4d495c6eSApple OSS Distributions * Child Phase 4 Fires
571*4d495c6eSApple OSS Distributions */
572*4d495c6eSApple OSS Distributions if (proc_info_opts >= PTHINFO) {
573*4d495c6eSApple OSS Distributions send_action_to_child_processes(proc_config, ACT_PHASE4);
574*4d495c6eSApple OSS Distributions }
575*4d495c6eSApple OSS Distributions
576*4d495c6eSApple OSS Distributions if (proc_info_opts & PTHINFO) {
577*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_threadinfo, child_pid, PROC_PIDTHREADINFO, thread_addr[0]);
578*4d495c6eSApple OSS Distributions }
579*4d495c6eSApple OSS Distributions if (proc_info_opts & PTHINFO_64) {
580*4d495c6eSApple OSS Distributions mach_port_name_t child_task = MACH_PORT_NULL;
581*4d495c6eSApple OSS Distributions thread_array_t child_threads = NULL;
582*4d495c6eSApple OSS Distributions mach_msg_type_number_t child_thread_count;
583*4d495c6eSApple OSS Distributions thread_identifier_info_data_t child_thread_threadinfo;
584*4d495c6eSApple OSS Distributions mach_msg_type_number_t thread_info_count = THREAD_IDENTIFIER_INFO_COUNT;
585*4d495c6eSApple OSS Distributions struct proc_threadinfo * pthinfo_64 = malloc(sizeof(struct proc_threadinfo));
586*4d495c6eSApple OSS Distributions T_QUIET;
587*4d495c6eSApple OSS Distributions T_ASSERT_NOTNULL(pthinfo_64, "malloc() for PROC_THREADINFO");
588*4d495c6eSApple OSS Distributions
589*4d495c6eSApple OSS Distributions retval = task_for_pid(mach_task_self(), child_pid, &child_task);
590*4d495c6eSApple OSS Distributions T_ASSERT_EQ_INT(retval, 0, "task_for_pid for PROC_PIDTHREADID64INFO");
591*4d495c6eSApple OSS Distributions
592*4d495c6eSApple OSS Distributions retval = task_threads(child_task, &child_threads, &child_thread_count);
593*4d495c6eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(retval, "task_threads() call for PROC_PIDTHREADID64INFO");
594*4d495c6eSApple OSS Distributions
595*4d495c6eSApple OSS Distributions retval = thread_info(child_threads[0], THREAD_IDENTIFIER_INFO, (thread_info_t)&child_thread_threadinfo, &thread_info_count);
596*4d495c6eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(retval, "thread_info call for PROC_PIDTHREADID64INFO");
597*4d495c6eSApple OSS Distributions
598*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, child_pid, PROC_PIDTHREADID64INFO, (uint64_t)child_thread_threadinfo.thread_id,
599*4d495c6eSApple OSS Distributions (user_addr_t)pthinfo_64, (uint32_t)sizeof(struct proc_threadinfo));
600*4d495c6eSApple OSS Distributions T_ASSERT_EQ_INT(retval, (int)sizeof(struct proc_threadinfo), "__proc_info call for PROC_PIDTHREADID64INFO");
601*4d495c6eSApple OSS Distributions
602*4d495c6eSApple OSS Distributions ret_structs[i] = (void *)pthinfo_64;
603*4d495c6eSApple OSS Distributions i++;
604*4d495c6eSApple OSS Distributions
605*4d495c6eSApple OSS Distributions mach_port_deallocate(mach_task_self(), child_task);
606*4d495c6eSApple OSS Distributions mach_port_deallocate(mach_task_self(), child_threads[0]);
607*4d495c6eSApple OSS Distributions child_threads[0] = MACH_PORT_NULL;
608*4d495c6eSApple OSS Distributions child_task = MACH_PORT_NULL;
609*4d495c6eSApple OSS Distributions }
610*4d495c6eSApple OSS Distributions if (proc_info_opts & PINFO_PATH) {
611*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_threadwithpathinfo, child_pid, PROC_PIDTHREADPATHINFO, thread_addr[0]);
612*4d495c6eSApple OSS Distributions }
613*4d495c6eSApple OSS Distributions
614*4d495c6eSApple OSS Distributions if (proc_info_opts & PAI) {
615*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_archinfo, getpid(), PROC_PIDARCHINFO, 0);
616*4d495c6eSApple OSS Distributions }
617*4d495c6eSApple OSS Distributions
618*4d495c6eSApple OSS Distributions vm_map_size_t map_tmp_sz = 0;
619*4d495c6eSApple OSS Distributions if ((proc_info_opts & PREGINFO) | (proc_info_opts & PREGINFO_PATH) | (proc_info_opts & PREGINFO_PATH_2) |
620*4d495c6eSApple OSS Distributions (proc_info_opts & PREGINFO_PATH_3)) {
621*4d495c6eSApple OSS Distributions tmp_fd = CONF_TMP_FILE_OPEN(tmp_path);
622*4d495c6eSApple OSS Distributions
623*4d495c6eSApple OSS Distributions /*
624*4d495c6eSApple OSS Distributions * subsequent checks assume that this data does *not* stay
625*4d495c6eSApple OSS Distributions * resident in the buffer cache, so set F_NOCACHE for direct
626*4d495c6eSApple OSS Distributions * to storage writing. NOTE: this works if the writes are
627*4d495c6eSApple OSS Distributions * page-aligned and > 2 pages in length.
628*4d495c6eSApple OSS Distributions */
629*4d495c6eSApple OSS Distributions retval = fcntl(tmp_fd, F_NOCACHE, 1);
630*4d495c6eSApple OSS Distributions T_QUIET;
631*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(retval, "fcntl(%d, F_NOCACHE) failed", tmp_fd);
632*4d495c6eSApple OSS Distributions
633*4d495c6eSApple OSS Distributions int npages_to_write = 10;
634*4d495c6eSApple OSS Distributions map_tmp_sz = (vm_map_size_t)npages_to_write * (vm_map_size_t)PAGE_SIZE;
635*4d495c6eSApple OSS Distributions
636*4d495c6eSApple OSS Distributions /*
637*4d495c6eSApple OSS Distributions * To make sure we don't go through the cached write paths in
638*4d495c6eSApple OSS Distributions * the VM, we allocate a PAGE-aligned buffer that is > 2
639*4d495c6eSApple OSS Distributions * pages, and perform a write of the entire buffer (not in
640*4d495c6eSApple OSS Distributions * small page-aligned chunks).
641*4d495c6eSApple OSS Distributions */
642*4d495c6eSApple OSS Distributions char *buf = valloc((size_t)map_tmp_sz);
643*4d495c6eSApple OSS Distributions T_QUIET;
644*4d495c6eSApple OSS Distributions T_ASSERT_NOTNULL(buf, "valloc(%d) failed", (int)map_tmp_sz);
645*4d495c6eSApple OSS Distributions
646*4d495c6eSApple OSS Distributions memset(buf, 0x5, map_tmp_sz);
647*4d495c6eSApple OSS Distributions ssize_t bw = write(tmp_fd, buf, (size_t)map_tmp_sz);
648*4d495c6eSApple OSS Distributions T_QUIET;
649*4d495c6eSApple OSS Distributions T_ASSERT_GT_INT((int)bw, 0, "write(%d, buf, %d) failed", tmp_fd, (int)map_tmp_sz);
650*4d495c6eSApple OSS Distributions
651*4d495c6eSApple OSS Distributions free(buf);
652*4d495c6eSApple OSS Distributions
653*4d495c6eSApple OSS Distributions map_tmp_sz -= PAGE_SIZE;
654*4d495c6eSApple OSS Distributions map_tmp = mmap(0, (size_t)map_tmp_sz, PROT_WRITE, MAP_PRIVATE, tmp_fd, (off_t)PAGE_SIZE);
655*4d495c6eSApple OSS Distributions T_ASSERT_NE_PTR(map_tmp, MAP_FAILED, "mmap() for PROC_PIDREGIONINFO");
656*4d495c6eSApple OSS Distributions
657*4d495c6eSApple OSS Distributions T_LOG("file: %s is opened as fd %d and mapped at %llx with size %lu", tmp_path, tmp_fd, (uint64_t)map_tmp,
658*4d495c6eSApple OSS Distributions (unsigned long)PAGE_SIZE);
659*4d495c6eSApple OSS Distributions
660*4d495c6eSApple OSS Distributions /*
661*4d495c6eSApple OSS Distributions * unlink() the file to be nice, but do it _after_ we've
662*4d495c6eSApple OSS Distributions * already flushed and mapped the file. This will ensure that
663*4d495c6eSApple OSS Distributions * we don't end up writing to the buffer cache because the
664*4d495c6eSApple OSS Distributions * file is unlinked.
665*4d495c6eSApple OSS Distributions */
666*4d495c6eSApple OSS Distributions if (!(proc_info_opts & PREGINFO_PATH_3)) {
667*4d495c6eSApple OSS Distributions retval = unlink(tmp_path);
668*4d495c6eSApple OSS Distributions T_QUIET;
669*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(retval, "unlink(%s) failed", tmp_path);
670*4d495c6eSApple OSS Distributions }
671*4d495c6eSApple OSS Distributions }
672*4d495c6eSApple OSS Distributions
673*4d495c6eSApple OSS Distributions if (proc_info_opts & PREGINFO) {
674*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_regioninfo, getpid(), PROC_PIDREGIONINFO, map_tmp);
675*4d495c6eSApple OSS Distributions ret_structs[i] = map_tmp;
676*4d495c6eSApple OSS Distributions i++;
677*4d495c6eSApple OSS Distributions ret_structs[i] = (void *)(uintptr_t)map_tmp_sz;
678*4d495c6eSApple OSS Distributions i++;
679*4d495c6eSApple OSS Distributions }
680*4d495c6eSApple OSS Distributions if (proc_info_opts & PREGINFO_PATH) {
681*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_regionwithpathinfo, getpid(), PROC_PIDREGIONPATHINFO, map_tmp);
682*4d495c6eSApple OSS Distributions ret_structs[i] = map_tmp;
683*4d495c6eSApple OSS Distributions i++;
684*4d495c6eSApple OSS Distributions ret_structs[i] = (void *)(uintptr_t)map_tmp_sz;
685*4d495c6eSApple OSS Distributions i++;
686*4d495c6eSApple OSS Distributions }
687*4d495c6eSApple OSS Distributions if (proc_info_opts & PREGINFO_PATH_2) {
688*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_regionwithpathinfo, getpid(), PROC_PIDREGIONPATHINFO2, map_tmp);
689*4d495c6eSApple OSS Distributions ret_structs[i] = map_tmp;
690*4d495c6eSApple OSS Distributions i++;
691*4d495c6eSApple OSS Distributions ret_structs[i] = (void *)(uintptr_t)map_tmp_sz;
692*4d495c6eSApple OSS Distributions i++;
693*4d495c6eSApple OSS Distributions }
694*4d495c6eSApple OSS Distributions
695*4d495c6eSApple OSS Distributions if (proc_info_opts & PREGINFO_PATH_3) {
696*4d495c6eSApple OSS Distributions struct proc_regionwithpathinfo * preginfo_path = malloc(sizeof(struct proc_regionwithpathinfo));
697*4d495c6eSApple OSS Distributions
698*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, getpid(), PROC_PIDREGIONPATHINFO2, (uint64_t)map_tmp,
699*4d495c6eSApple OSS Distributions (user_addr_t)preginfo_path, (uint32_t)sizeof(struct proc_regionwithpathinfo));
700*4d495c6eSApple OSS Distributions
701*4d495c6eSApple OSS Distributions T_ASSERT_EQ_INT(retval, (int)sizeof(struct proc_regionwithpathinfo), "__proc_info call for PROC_PIDREGIONPATHINFO2");
702*4d495c6eSApple OSS Distributions
703*4d495c6eSApple OSS Distributions T_LOG("preginfo_path.prp_vip.vip_vi.vi_fsid.val 0: %d", preginfo_path->prp_vip.vip_vi.vi_fsid.val[0]);
704*4d495c6eSApple OSS Distributions T_LOG("preginfo_path.prp_vip.vip_vi.vi_fsid.val 1: %d", preginfo_path->prp_vip.vip_vi.vi_fsid.val[1]);
705*4d495c6eSApple OSS Distributions ret_structs[3] = (void *)(uintptr_t)preginfo_path->prp_vip.vip_vi.vi_fsid.val[0];
706*4d495c6eSApple OSS Distributions ret_structs[4] = (void *)(uintptr_t)preginfo_path->prp_vip.vip_vi.vi_fsid.val[1];
707*4d495c6eSApple OSS Distributions
708*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, getpid(), PROC_PIDREGIONPATHINFO3,
709*4d495c6eSApple OSS Distributions (uint64_t)preginfo_path->prp_vip.vip_vi.vi_fsid.val[0] +
710*4d495c6eSApple OSS Distributions ((uint64_t)preginfo_path->prp_vip.vip_vi.vi_fsid.val[1] << 32),
711*4d495c6eSApple OSS Distributions (user_addr_t)preginfo_path,
712*4d495c6eSApple OSS Distributions (uint32_t)sizeof(struct proc_regionwithpathinfo));
713*4d495c6eSApple OSS Distributions T_ASSERT_EQ_INT(retval, (int)sizeof(struct proc_regionwithpathinfo), "__proc_info call for PROC_PIDREGIONPATHWITHINFO3");
714*4d495c6eSApple OSS Distributions ret_structs[0] = (void *)preginfo_path;
715*4d495c6eSApple OSS Distributions ret_structs[1] = (void *)map_tmp;
716*4d495c6eSApple OSS Distributions ret_structs[2] = (void *)(uintptr_t)map_tmp_sz;
717*4d495c6eSApple OSS Distributions
718*4d495c6eSApple OSS Distributions retval = unlink(tmp_path);
719*4d495c6eSApple OSS Distributions T_QUIET;
720*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(retval, "unlink(%s) failed", preginfo_path->prp_vip.vip_path);
721*4d495c6eSApple OSS Distributions }
722*4d495c6eSApple OSS Distributions
723*4d495c6eSApple OSS Distributions if (proc_info_opts & PVNINFO) {
724*4d495c6eSApple OSS Distributions PROC_INFO_CALL(proc_vnodepathinfo, getpid(), PROC_PIDVNODEPATHINFO, 0);
725*4d495c6eSApple OSS Distributions }
726*4d495c6eSApple OSS Distributions
727*4d495c6eSApple OSS Distributions kill_child_processes(proc_config);
728*4d495c6eSApple OSS Distributions free_proc_config(proc_config);
729*4d495c6eSApple OSS Distributions free(thread_addr);
730*4d495c6eSApple OSS Distributions thread_addr = NULL;
731*4d495c6eSApple OSS Distributions close(tmp_fd);
732*4d495c6eSApple OSS Distributions tmp_fd = -1;
733*4d495c6eSApple OSS Distributions }
734*4d495c6eSApple OSS Distributions
735*4d495c6eSApple OSS Distributions static void
free_proc_info(void ** proc_info,int num)736*4d495c6eSApple OSS Distributions free_proc_info(void ** proc_info, int num)
737*4d495c6eSApple OSS Distributions {
738*4d495c6eSApple OSS Distributions for (int i = 0; i < num; i++) {
739*4d495c6eSApple OSS Distributions free(proc_info[i]);
740*4d495c6eSApple OSS Distributions }
741*4d495c6eSApple OSS Distributions
742*4d495c6eSApple OSS Distributions return;
743*4d495c6eSApple OSS Distributions }
744*4d495c6eSApple OSS Distributions
745*4d495c6eSApple OSS Distributions /*
746*4d495c6eSApple OSS Distributions * Start DECLs
747*4d495c6eSApple OSS Distributions */
748*4d495c6eSApple OSS Distributions
749*4d495c6eSApple OSS Distributions T_DECL(proc_info_listpids_all_pids,
750*4d495c6eSApple OSS Distributions "proc_info API test to verify PROC_INFO_CALL_LISTPIDS",
751*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
752*4d495c6eSApple OSS Distributions {
753*4d495c6eSApple OSS Distributions /*
754*4d495c6eSApple OSS Distributions * Get the value of nprocs with no buffer sent in
755*4d495c6eSApple OSS Distributions */
756*4d495c6eSApple OSS Distributions int num_procs;
757*4d495c6eSApple OSS Distributions num_procs = __proc_info(PROC_INFO_CALL_LISTPIDS, PROC_ALL_PIDS, (uint32_t)getpid(), (uint32_t)0, (user_addr_t)0, (uint32_t)0);
758*4d495c6eSApple OSS Distributions T_ASSERT_GE_INT(num_procs, 1, "verify valid value for nprocs: %d", num_procs);
759*4d495c6eSApple OSS Distributions
760*4d495c6eSApple OSS Distributions proc_config_t proc_config = spawn_child_processes(CONF_PROC_COUNT, proc_info_listpids_handler);
761*4d495c6eSApple OSS Distributions
762*4d495c6eSApple OSS Distributions num_procs = __proc_info(PROC_INFO_CALL_LISTPIDS, PROC_ALL_PIDS, (uint32_t)getpid(), (uint32_t)0, (user_addr_t)0, (uint32_t)0);
763*4d495c6eSApple OSS Distributions
764*4d495c6eSApple OSS Distributions int proc_count = num_procs / (int)sizeof(pid_t);
765*4d495c6eSApple OSS Distributions int proc_count_all = num_procs / (int)sizeof(pid_t);
766*4d495c6eSApple OSS Distributions if (proc_count > (CONF_PROC_COUNT + 1)) {
767*4d495c6eSApple OSS Distributions proc_count = CONF_PROC_COUNT + 1;
768*4d495c6eSApple OSS Distributions }
769*4d495c6eSApple OSS Distributions pid_t * proc_ids = malloc(sizeof(pid_t) * (unsigned long)proc_count);
770*4d495c6eSApple OSS Distributions num_procs = __proc_info(PROC_INFO_CALL_LISTPIDS, PROC_ALL_PIDS, (uint32_t)getpid(), (uint32_t)0, (user_addr_t)proc_ids,
771*4d495c6eSApple OSS Distributions (int32_t)(proc_count * (int)sizeof(pid_t)));
772*4d495c6eSApple OSS Distributions num_procs = num_procs / (int)sizeof(pid_t);
773*4d495c6eSApple OSS Distributions T_ASSERT_GE_INT(num_procs, proc_count, "Valid number of pids obtained for PROC_ALL_PIDS.");
774*4d495c6eSApple OSS Distributions
775*4d495c6eSApple OSS Distributions free(proc_ids);
776*4d495c6eSApple OSS Distributions
777*4d495c6eSApple OSS Distributions /*
778*4d495c6eSApple OSS Distributions * Grab list of all procs and make sure our spawned children are in the list.
779*4d495c6eSApple OSS Distributions */
780*4d495c6eSApple OSS Distributions
781*4d495c6eSApple OSS Distributions proc_ids = malloc(sizeof(pid_t) * (unsigned long)proc_count_all);
782*4d495c6eSApple OSS Distributions num_procs = __proc_info(PROC_INFO_CALL_LISTPIDS, PROC_ALL_PIDS, (uint32_t)getpid(), (uint32_t)0, (user_addr_t)proc_ids,
783*4d495c6eSApple OSS Distributions (int32_t)(proc_count_all * (int)sizeof(pid_t)));
784*4d495c6eSApple OSS Distributions num_procs = num_procs / (int)sizeof(pid_t);
785*4d495c6eSApple OSS Distributions
786*4d495c6eSApple OSS Distributions int pid_match = 1;
787*4d495c6eSApple OSS Distributions
788*4d495c6eSApple OSS Distributions for (int i = 0; i < (CONF_PROC_COUNT - 1); i++) {
789*4d495c6eSApple OSS Distributions for (int j = 0; j < num_procs; j++) {
790*4d495c6eSApple OSS Distributions if (proc_ids[j] == proc_config->child_pids[i]) {
791*4d495c6eSApple OSS Distributions break;
792*4d495c6eSApple OSS Distributions } else if (j == (num_procs - 1)) {
793*4d495c6eSApple OSS Distributions pid_match = 0;
794*4d495c6eSApple OSS Distributions break;
795*4d495c6eSApple OSS Distributions }
796*4d495c6eSApple OSS Distributions }
797*4d495c6eSApple OSS Distributions
798*4d495c6eSApple OSS Distributions if (!pid_match) {
799*4d495c6eSApple OSS Distributions break;
800*4d495c6eSApple OSS Distributions }
801*4d495c6eSApple OSS Distributions }
802*4d495c6eSApple OSS Distributions
803*4d495c6eSApple OSS Distributions T_ASSERT_EQ(pid_match, 1, "PROC_INFO_CALL_LISTPIDS contains our spawned children's pids");
804*4d495c6eSApple OSS Distributions
805*4d495c6eSApple OSS Distributions free(proc_ids);
806*4d495c6eSApple OSS Distributions
807*4d495c6eSApple OSS Distributions kill_child_processes(proc_config);
808*4d495c6eSApple OSS Distributions free_proc_config(proc_config);
809*4d495c6eSApple OSS Distributions
810*4d495c6eSApple OSS Distributions errno = 0;
811*4d495c6eSApple OSS Distributions num_procs = __proc_info(PROC_INFO_CALL_LISTPIDS, PROC_ALL_PIDS, (uint32_t)getpid(), (uint32_t)0, (user_addr_t)proc_ids,
812*4d495c6eSApple OSS Distributions (uint32_t)(sizeof(pid_t) - 1));
813*4d495c6eSApple OSS Distributions T_EXPECT_POSIX_ERROR(errno, ENOMEM, "Valid proc_info behavior when bufsize < sizeof(pid_t).");
814*4d495c6eSApple OSS Distributions }
815*4d495c6eSApple OSS Distributions
816*4d495c6eSApple OSS Distributions T_DECL(proc_info_listpids_pgrp_only,
817*4d495c6eSApple OSS Distributions "proc_info API test to verify PROC_INFO_CALL_LISTPIDS",
818*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
819*4d495c6eSApple OSS Distributions {
820*4d495c6eSApple OSS Distributions proc_config_t proc_config = spawn_child_processes(CONF_PROC_COUNT, proc_info_listpids_handler);
821*4d495c6eSApple OSS Distributions T_LOG("Test to verify PROC_PGRP_ONLY returns correct value");
822*4d495c6eSApple OSS Distributions /*
823*4d495c6eSApple OSS Distributions * The number of obtained pids depends on size of buffer.
824*4d495c6eSApple OSS Distributions * count = childCount + 1(parent)
825*4d495c6eSApple OSS Distributions * So, we set it to one more than expected to capture any error.
826*4d495c6eSApple OSS Distributions */
827*4d495c6eSApple OSS Distributions int proc_count = CONF_PROC_COUNT + 2;
828*4d495c6eSApple OSS Distributions pid_t * proc_ids = malloc(sizeof(*proc_ids) * (unsigned long)proc_count);
829*4d495c6eSApple OSS Distributions int num_procs = __proc_info(PROC_INFO_CALL_LISTPIDS, PROC_PGRP_ONLY, (uint32_t)proc_config->proc_grp_id, (uint32_t)0,
830*4d495c6eSApple OSS Distributions (user_addr_t)proc_ids, (int32_t)(proc_count * (int)sizeof(*proc_ids)));
831*4d495c6eSApple OSS Distributions num_procs = num_procs / (int)sizeof(pid_t);
832*4d495c6eSApple OSS Distributions T_ASSERT_EQ_INT(num_procs, CONF_PROC_COUNT + 1, "Valid number of pids obtained for PROC_PGRP_ONLY.");
833*4d495c6eSApple OSS Distributions kill_child_processes(proc_config);
834*4d495c6eSApple OSS Distributions free_proc_config(proc_config);
835*4d495c6eSApple OSS Distributions free(proc_ids);
836*4d495c6eSApple OSS Distributions }
837*4d495c6eSApple OSS Distributions
838*4d495c6eSApple OSS Distributions T_DECL(proc_info_listpids_ppid_only,
839*4d495c6eSApple OSS Distributions "proc_info API test to verify PROC_INFO_CALL_LISTPIDS",
840*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
841*4d495c6eSApple OSS Distributions {
842*4d495c6eSApple OSS Distributions proc_config_t proc_config = spawn_child_processes(CONF_PROC_COUNT, proc_info_listpids_handler);
843*4d495c6eSApple OSS Distributions T_LOG("Test to verify PROC_PPID_ONLY returns correct value");
844*4d495c6eSApple OSS Distributions /*
845*4d495c6eSApple OSS Distributions * Pass in the same (bigger) buffer but expect only the pids where ppid is pid of current proc.
846*4d495c6eSApple OSS Distributions */
847*4d495c6eSApple OSS Distributions int proc_count = CONF_PROC_COUNT + 2;
848*4d495c6eSApple OSS Distributions pid_t * proc_ids = malloc(sizeof(*proc_ids) * (unsigned long)proc_count);
849*4d495c6eSApple OSS Distributions int num_procs = __proc_info(PROC_INFO_CALL_LISTPIDS, PROC_PPID_ONLY, (uint32_t)getpid(), (uint32_t)0, (user_addr_t)proc_ids,
850*4d495c6eSApple OSS Distributions (int32_t)(proc_count * (int)sizeof(*proc_ids)));
851*4d495c6eSApple OSS Distributions num_procs = num_procs / (int)sizeof(pid_t);
852*4d495c6eSApple OSS Distributions T_ASSERT_EQ_INT(num_procs, CONF_PROC_COUNT, "Valid number of pids obtained for PROC_PPID_ONLY.");
853*4d495c6eSApple OSS Distributions kill_child_processes(proc_config);
854*4d495c6eSApple OSS Distributions free_proc_config(proc_config);
855*4d495c6eSApple OSS Distributions free(proc_ids);
856*4d495c6eSApple OSS Distributions }
857*4d495c6eSApple OSS Distributions
858*4d495c6eSApple OSS Distributions T_DECL(proc_info_listpids_uid_only,
859*4d495c6eSApple OSS Distributions "proc_info API test to verify PROC_INFO_CALL_LISTPIDS",
860*4d495c6eSApple OSS Distributions T_META_ASROOT(true),
861*4d495c6eSApple OSS Distributions T_META_TAG_VM_PREFERRED,
862*4d495c6eSApple OSS Distributions T_META_ENABLED(false) /* rdar://134505671 */)
863*4d495c6eSApple OSS Distributions {
864*4d495c6eSApple OSS Distributions proc_config_t proc_config = spawn_child_processes(CONF_PROC_COUNT, proc_info_listpids_handler);
865*4d495c6eSApple OSS Distributions T_LOG("Test to verify PROC_UID_ONLY returns correct value");
866*4d495c6eSApple OSS Distributions int proc_count = CONF_PROC_COUNT + 2;
867*4d495c6eSApple OSS Distributions pid_t * proc_ids = malloc(sizeof(*proc_ids) * (unsigned long)proc_count);
868*4d495c6eSApple OSS Distributions send_action_to_child_processes(proc_config, ACT_CHANGE_UID);
869*4d495c6eSApple OSS Distributions usleep(10000);
870*4d495c6eSApple OSS Distributions int num_procs = __proc_info(PROC_INFO_CALL_LISTPIDS, PROC_UID_ONLY, CONF_UID_VAL, (uint32_t)0, (user_addr_t)proc_ids,
871*4d495c6eSApple OSS Distributions (int32_t)(proc_count * (int)sizeof(*proc_ids)));
872*4d495c6eSApple OSS Distributions T_ASSERT_GE_ULONG((unsigned long)num_procs / sizeof(pid_t), (unsigned long)CONF_PROC_COUNT,
873*4d495c6eSApple OSS Distributions "Valid number of pids obtained for PROC_UID_ONLY.");
874*4d495c6eSApple OSS Distributions kill_child_processes(proc_config);
875*4d495c6eSApple OSS Distributions free_proc_config(proc_config);
876*4d495c6eSApple OSS Distributions free(proc_ids);
877*4d495c6eSApple OSS Distributions }
878*4d495c6eSApple OSS Distributions
879*4d495c6eSApple OSS Distributions T_DECL(proc_info_listpids_ruid_only,
880*4d495c6eSApple OSS Distributions "proc_info API test to verify PROC_INFO_CALL_LISTPIDS",
881*4d495c6eSApple OSS Distributions T_META_ASROOT(true),
882*4d495c6eSApple OSS Distributions T_META_TAG_VM_PREFERRED,
883*4d495c6eSApple OSS Distributions T_META_ENABLED(false) /* rdar://134505671 */)
884*4d495c6eSApple OSS Distributions {
885*4d495c6eSApple OSS Distributions proc_config_t proc_config = spawn_child_processes(CONF_PROC_COUNT, proc_info_listpids_handler);
886*4d495c6eSApple OSS Distributions T_LOG("Test to verify PROC_RUID_ONLY returns correct value");
887*4d495c6eSApple OSS Distributions int proc_count = CONF_PROC_COUNT + 2;
888*4d495c6eSApple OSS Distributions pid_t * proc_ids = malloc(sizeof(*proc_ids) * (unsigned long)proc_count);
889*4d495c6eSApple OSS Distributions send_action_to_child_processes(proc_config, ACT_CHANGE_RUID);
890*4d495c6eSApple OSS Distributions usleep(10000);
891*4d495c6eSApple OSS Distributions int num_procs = __proc_info(PROC_INFO_CALL_LISTPIDS, PROC_RUID_ONLY, CONF_RUID_VAL, (uint32_t)0, (user_addr_t)proc_ids,
892*4d495c6eSApple OSS Distributions (int32_t)(proc_count * (int)sizeof(*proc_ids)));
893*4d495c6eSApple OSS Distributions T_ASSERT_GE_ULONG((unsigned long)num_procs / sizeof(pid_t), (unsigned long)CONF_PROC_COUNT,
894*4d495c6eSApple OSS Distributions "Valid number of pids obtained for PROC_RUID_ONLY.");
895*4d495c6eSApple OSS Distributions kill_child_processes(proc_config);
896*4d495c6eSApple OSS Distributions free_proc_config(proc_config);
897*4d495c6eSApple OSS Distributions free(proc_ids);
898*4d495c6eSApple OSS Distributions }
899*4d495c6eSApple OSS Distributions
900*4d495c6eSApple OSS Distributions T_DECL(proc_info_listpids_tty_only,
901*4d495c6eSApple OSS Distributions "proc_info API test to verify PROC_INFO_CALL_LISTPIDS",
902*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
903*4d495c6eSApple OSS Distributions {
904*4d495c6eSApple OSS Distributions int ret = isatty(STDOUT_FILENO);
905*4d495c6eSApple OSS Distributions if (ret != 1) {
906*4d495c6eSApple OSS Distributions T_SKIP("Not connected to tty...skipping test");
907*4d495c6eSApple OSS Distributions }
908*4d495c6eSApple OSS Distributions
909*4d495c6eSApple OSS Distributions proc_config_t proc_config = spawn_child_processes(CONF_PROC_COUNT, proc_info_listpids_handler);
910*4d495c6eSApple OSS Distributions
911*4d495c6eSApple OSS Distributions T_LOG("Test to verify PROC_TTY_ONLY returns correct value");
912*4d495c6eSApple OSS Distributions int proc_count = CONF_PROC_COUNT + 2;
913*4d495c6eSApple OSS Distributions pid_t * proc_ids = malloc(sizeof(*proc_ids) * (unsigned long)proc_count);
914*4d495c6eSApple OSS Distributions int num_procs = __proc_info(PROC_INFO_CALL_LISTPIDS, PROC_TTY_ONLY, get_tty_dev(), (uint32_t)0, (user_addr_t)proc_ids,
915*4d495c6eSApple OSS Distributions (int32_t)(proc_count * (int)sizeof(*proc_ids)));
916*4d495c6eSApple OSS Distributions num_procs = num_procs / (int)sizeof(pid_t);
917*4d495c6eSApple OSS Distributions T_ASSERT_GE_INT(num_procs, 0, "Valid number of pids returned by PROC_TTY_ONLY.");
918*4d495c6eSApple OSS Distributions kill_child_processes(proc_config);
919*4d495c6eSApple OSS Distributions free_proc_config(proc_config);
920*4d495c6eSApple OSS Distributions free(proc_ids);
921*4d495c6eSApple OSS Distributions }
922*4d495c6eSApple OSS Distributions
923*4d495c6eSApple OSS Distributions /*
924*4d495c6eSApple OSS Distributions * Most of the following PROC_INFO_CALL_PIDINFO tests rely on a helper function (proc_info_caller) to make the necessary proc_info
925*4d495c6eSApple OSS Distributions * calls on their behalf
926*4d495c6eSApple OSS Distributions * In a previous iteration, these tests were all in one giant T_DECL and the helper function handles inter-DECL dependencies such as
927*4d495c6eSApple OSS Distributions * a proc_info call relying on the results of a previous proc_info call or an assumed state that a child should be in.
928*4d495c6eSApple OSS Distributions */
929*4d495c6eSApple OSS Distributions
930*4d495c6eSApple OSS Distributions T_DECL(proc_info_pidinfo_proc_piduniqidentifierinfo,
931*4d495c6eSApple OSS Distributions "Test to identify PROC_PIDUNIQIDENTIFIERINFO returns correct unique identifiers for process",
932*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
933*4d495c6eSApple OSS Distributions {
934*4d495c6eSApple OSS Distributions void * proc_info[2];
935*4d495c6eSApple OSS Distributions proc_info_caller(P_UNIQIDINFO | C_UNIQIDINFO, proc_info, NULL);
936*4d495c6eSApple OSS Distributions struct proc_uniqidentifierinfo * p_uniqidinfo = (struct proc_uniqidentifierinfo *)proc_info[0];
937*4d495c6eSApple OSS Distributions struct proc_uniqidentifierinfo * c_uniqidinfo = (struct proc_uniqidentifierinfo *)proc_info[1];
938*4d495c6eSApple OSS Distributions
939*4d495c6eSApple OSS Distributions T_EXPECT_NE_ULLONG(c_uniqidinfo->p_uniqueid, p_uniqidinfo->p_uniqueid, "p_uniqueid not unique for the process");
940*4d495c6eSApple OSS Distributions
941*4d495c6eSApple OSS Distributions for (size_t i = 0; i < 16; i++) {
942*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UCHAR(c_uniqidinfo->p_uuid[i], p_uniqidinfo->p_uuid[i], "p_uuid should be the same unique id");
943*4d495c6eSApple OSS Distributions }
944*4d495c6eSApple OSS Distributions T_EXPECT_EQ_ULLONG(c_uniqidinfo->p_puniqueid, p_uniqidinfo->p_uniqueid,
945*4d495c6eSApple OSS Distributions "p_puniqueid of child should be same as p_uniqueid for parent");
946*4d495c6eSApple OSS Distributions
947*4d495c6eSApple OSS Distributions // The child's p_orig_ppidversion should be set to the p_idversion of the parent.
948*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(c_uniqidinfo->p_orig_ppidversion, p_uniqidinfo->p_idversion,
949*4d495c6eSApple OSS Distributions "child->p_pidversion == parent->p_idversion");
950*4d495c6eSApple OSS Distributions
951*4d495c6eSApple OSS Distributions free_proc_info(proc_info, 2);
952*4d495c6eSApple OSS Distributions }
953*4d495c6eSApple OSS Distributions
954*4d495c6eSApple OSS Distributions T_DECL(ensure_ppidversion_is_not_updated,
955*4d495c6eSApple OSS Distributions "A process's parent's idversion field should not be updated when the parent re-execs",
956*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
957*4d495c6eSApple OSS Distributions {
958*4d495c6eSApple OSS Distributions // Given a process (the test runner) which forks to create a child
959*4d495c6eSApple OSS Distributions pid_t original_pid = getpid();
960*4d495c6eSApple OSS Distributions if (!fork()) {
961*4d495c6eSApple OSS Distributions // And the child process waits for the parent to re-exec...
962*4d495c6eSApple OSS Distributions // (To get rid of this, we could exec something controlled that signals a semaphore.)
963*4d495c6eSApple OSS Distributions sleep(1);
964*4d495c6eSApple OSS Distributions
965*4d495c6eSApple OSS Distributions // When the child inspects the parent's current idversion
966*4d495c6eSApple OSS Distributions struct proc_uniqidentifierinfo parent_info;
967*4d495c6eSApple OSS Distributions int ret = proc_pidinfo(original_pid, PROC_PIDUNIQIDENTIFIERINFO, 0, &parent_info, sizeof(parent_info));
968*4d495c6eSApple OSS Distributions T_ASSERT_EQ((unsigned long)ret, sizeof(parent_info), "PROC_PIDUNIQIDENTIFIERINFO - parent");
969*4d495c6eSApple OSS Distributions
970*4d495c6eSApple OSS Distributions // And compares it to the child's stored idversion
971*4d495c6eSApple OSS Distributions struct proc_uniqidentifierinfo child_info;
972*4d495c6eSApple OSS Distributions ret = proc_pidinfo(getpid(), PROC_PIDUNIQIDENTIFIERINFO, 0, &child_info, sizeof(child_info));
973*4d495c6eSApple OSS Distributions T_ASSERT_EQ((unsigned long)ret, sizeof(child_info), "PROC_PIDUNIQIDENTIFIERINFO - child");
974*4d495c6eSApple OSS Distributions
975*4d495c6eSApple OSS Distributions // Then the child can see that the parent's idversion has changed from what was stored.
976*4d495c6eSApple OSS Distributions T_EXPECT_NE_INT(child_info.p_orig_ppidversion, parent_info.p_idversion,
977*4d495c6eSApple OSS Distributions "child->p_orig_ppidversion != parent->p_idversion after parent exec");
978*4d495c6eSApple OSS Distributions } else {
979*4d495c6eSApple OSS Distributions // And we (the parent process) re-exec into something else
980*4d495c6eSApple OSS Distributions const char* exec_cmd[] = { "sleep", "2", NULL };
981*4d495c6eSApple OSS Distributions execvp(exec_cmd[0], exec_cmd);
982*4d495c6eSApple OSS Distributions T_FAIL("execvp() failed");
983*4d495c6eSApple OSS Distributions }
984*4d495c6eSApple OSS Distributions }
985*4d495c6eSApple OSS Distributions
986*4d495c6eSApple OSS Distributions T_DECL(ensure_ppidversion_is_not_updated_after_exec,
987*4d495c6eSApple OSS Distributions "A child's parent pidversion field should not be updated when the child re-execs",
988*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
989*4d495c6eSApple OSS Distributions {
990*4d495c6eSApple OSS Distributions // Given a child
991*4d495c6eSApple OSS Distributions pid_t child_pid = fork();
992*4d495c6eSApple OSS Distributions if (!child_pid) {
993*4d495c6eSApple OSS Distributions // Give the parent a moment to record our initial p_orig_ppidversion
994*4d495c6eSApple OSS Distributions sleep(1);
995*4d495c6eSApple OSS Distributions
996*4d495c6eSApple OSS Distributions // When the child execs into something else
997*4d495c6eSApple OSS Distributions const char* exec_cmd[] = { "sleep", "2", NULL };
998*4d495c6eSApple OSS Distributions execvp(exec_cmd[0], exec_cmd);
999*4d495c6eSApple OSS Distributions T_FAIL("execvp() failed");
1000*4d495c6eSApple OSS Distributions } else {
1001*4d495c6eSApple OSS Distributions // And we save the child's original p_orig_ppidversion
1002*4d495c6eSApple OSS Distributions struct proc_uniqidentifierinfo child_parent_info;
1003*4d495c6eSApple OSS Distributions int ret = proc_pidinfo(child_pid, PROC_PIDUNIQIDENTIFIERINFO, 0, &child_parent_info, sizeof(child_parent_info));
1004*4d495c6eSApple OSS Distributions T_ASSERT_EQ((unsigned long)ret, sizeof(child_parent_info), "PROC_PIDUNIQIDENTIFIERINFO - child");
1005*4d495c6eSApple OSS Distributions int first_ppidversion = child_parent_info.p_orig_ppidversion;
1006*4d495c6eSApple OSS Distributions
1007*4d495c6eSApple OSS Distributions // And we give the child a moment to re-exec into something else
1008*4d495c6eSApple OSS Distributions sleep(2);
1009*4d495c6eSApple OSS Distributions
1010*4d495c6eSApple OSS Distributions // And we inspect the child's p_orig_ppidversion again
1011*4d495c6eSApple OSS Distributions ret = proc_pidinfo(child_pid, PROC_PIDUNIQIDENTIFIERINFO, 0, &child_parent_info, sizeof(child_parent_info));
1012*4d495c6eSApple OSS Distributions T_ASSERT_EQ((unsigned long)ret, sizeof(child_parent_info), "PROC_PIDUNIQIDENTIFIERINFO - child");
1013*4d495c6eSApple OSS Distributions int second_ppidversion = child_parent_info.p_orig_ppidversion;
1014*4d495c6eSApple OSS Distributions
1015*4d495c6eSApple OSS Distributions // Then the child's p_orig_ppidversion has not changed due to exec()
1016*4d495c6eSApple OSS Distributions T_ASSERT_EQ(first_ppidversion, second_ppidversion, "p_orig_ppidversion should not change after exec()");
1017*4d495c6eSApple OSS Distributions }
1018*4d495c6eSApple OSS Distributions }
1019*4d495c6eSApple OSS Distributions
1020*4d495c6eSApple OSS Distributions T_DECL(proc_info_pidinfo_proc_pidtbsdinfo,
1021*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDTBSDINFO returns valid information about the process",
1022*4d495c6eSApple OSS Distributions T_META_ASROOT(true),
1023*4d495c6eSApple OSS Distributions T_META_TAG_VM_PREFERRED,
1024*4d495c6eSApple OSS Distributions T_META_ENABLED(false) /* rdar://134505671 */)
1025*4d495c6eSApple OSS Distributions {
1026*4d495c6eSApple OSS Distributions void * proc_info[2];
1027*4d495c6eSApple OSS Distributions int child_pid = 0;
1028*4d495c6eSApple OSS Distributions proc_info_caller(PBSD_OLD | PBSD, proc_info, &child_pid);
1029*4d495c6eSApple OSS Distributions struct proc_bsdinfo * pbsd_old = (struct proc_bsdinfo *)proc_info[0];
1030*4d495c6eSApple OSS Distributions struct proc_bsdinfo * pbsd = (struct proc_bsdinfo *)proc_info[1];
1031*4d495c6eSApple OSS Distributions
1032*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((unsigned int)SRUN, pbsd->pbi_status, "PROC_PIDTBSDINFO shows Correct status");
1033*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(0U, pbsd->pbi_xstatus, "PROC_PIDTBSDINFO show Correct xstatus (exit status)");
1034*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd->pbi_pid, (unsigned int)child_pid, "PROC_PIDTBSDINFO returns valid pid");
1035*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd->pbi_ppid, (unsigned int)getpid(), "PROC_PIDTBSDINFO returns valid ppid");
1036*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd->pbi_uid, CONF_RUID_VAL, "PROC_PIDTBSDINFO returns valid uid");
1037*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd->pbi_gid, CONF_GID_VAL, "PROC_PIDTBSDINFO returns valid gid");
1038*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd->pbi_ruid, 0U, "PROC_PIDTBSDINFO returns valid ruid");
1039*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd->pbi_rgid, CONF_GID_VAL, "PROC_PIDTBSDINFO returns valid rgid");
1040*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd->pbi_svuid, CONF_RUID_VAL, "PROC_PIDTBSDINFO returns valid svuid");
1041*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd->pbi_svgid, CONF_GID_VAL, "PROC_PIDTBSDINFO returns valid svgid");
1042*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd->pbi_nice, CONF_NICE_VAL, "PROC_PIDTBSDINFO returns valid nice value");
1043*4d495c6eSApple OSS Distributions T_EXPECT_EQ_STR(pbsd->pbi_comm, CONF_CMD_NAME, "PROC_PIDTBSDINFO returns valid p_comm name");
1044*4d495c6eSApple OSS Distributions T_EXPECT_EQ_STR(pbsd->pbi_name, CONF_CMD_NAME, "PROC_PIDTBSDINFO returns valid p_name name");
1045*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd->pbi_flags, (pbsd_old->pbi_flags | PROC_FLAG_PSUGID), "PROC_PIDTBSDINFO returns valid flags");
1046*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd->pbi_nfiles, pbsd_old->pbi_nfiles, "PROC_PIDTBSDINFO returned valid pbi_nfiles");
1047*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd->pbi_pgid, (uint32_t)getpgid(getpid()), "PROC_PIDTBSDINFO returned valid pbi_pgid");
1048*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd->pbi_pjobc, pbsd->pbi_pjobc, "PROC_PIDTBSDINFO returned valid pbi_pjobc");
1049*4d495c6eSApple OSS Distributions T_EXPECT_NE_UINT(pbsd->e_tdev, 0U, "PROC_PIDTBSDINFO returned valid e_tdev");
1050*4d495c6eSApple OSS Distributions
1051*4d495c6eSApple OSS Distributions free_proc_info(proc_info, 2);
1052*4d495c6eSApple OSS Distributions }
1053*4d495c6eSApple OSS Distributions
1054*4d495c6eSApple OSS Distributions T_DECL(proc_info_pidt_shortbsdinfo,
1055*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDT_SHORTBSDINFO returns valid information about the process",
1056*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1057*4d495c6eSApple OSS Distributions {
1058*4d495c6eSApple OSS Distributions void * proc_info[2];
1059*4d495c6eSApple OSS Distributions int child_pid = 0;
1060*4d495c6eSApple OSS Distributions proc_info_caller(PBSD | PBSD_SHORT, proc_info, &child_pid);
1061*4d495c6eSApple OSS Distributions struct proc_bsdinfo * pbsd = (struct proc_bsdinfo *)proc_info[0];
1062*4d495c6eSApple OSS Distributions struct proc_bsdshortinfo * pbsd_short = (struct proc_bsdshortinfo *)proc_info[1];
1063*4d495c6eSApple OSS Distributions
1064*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_short->pbsi_pid, (unsigned int)child_pid, "PROC_PIDT_SHORTBSDINFO returns valid pid");
1065*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_short->pbsi_ppid, (unsigned int)getpid(), "PROC_PIDT_SHORTBSDINFO returns valid ppid");
1066*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_short->pbsi_pgid, (uint32_t)getpgid(getpid()), "PROC_PIDT_SHORTBSDINFO returned valid pbi_pgid");
1067*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((unsigned int)SRUN, pbsd_short->pbsi_status, "PROC_PIDT_SHORTBSDINFO shows Correct status");
1068*4d495c6eSApple OSS Distributions T_EXPECT_EQ_STR(pbsd_short->pbsi_comm, CONF_CMD_NAME, "PROC_PIDT_SHORTBSDINFO returns valid p_comm name");
1069*4d495c6eSApple OSS Distributions /*
1070*4d495c6eSApple OSS Distributions * The short variant returns all flags except session flags, hence ignoring them here.
1071*4d495c6eSApple OSS Distributions */
1072*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_short->pbsi_flags, (pbsd->pbi_flags & (unsigned int)(~PROC_FLAG_CTTY)),
1073*4d495c6eSApple OSS Distributions "PROC_PIDT_SHORTBSDINFO returns valid flags");
1074*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_short->pbsi_uid, CONF_RUID_VAL, "PROC_PIDT_SHORTBSDINFO returns valid uid");
1075*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_short->pbsi_gid, CONF_GID_VAL, "PROC_PIDT_SHORTBSDINFO returns valid gid");
1076*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_short->pbsi_ruid, 0U, "PROC_PIDT_SHORTBSDINFO returns valid ruid");
1077*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_short->pbsi_svuid, CONF_RUID_VAL, "PROC_PIDT_SHORTBSDINFO returns valid svuid");
1078*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_short->pbsi_svgid, CONF_GID_VAL, "PROC_PIDT_SHORTBSDINFO returns valid svgid");
1079*4d495c6eSApple OSS Distributions
1080*4d495c6eSApple OSS Distributions free_proc_info(proc_info, 2);
1081*4d495c6eSApple OSS Distributions }
1082*4d495c6eSApple OSS Distributions
1083*4d495c6eSApple OSS Distributions T_DECL(proc_info_pidt_bsdinfowithuniqid,
1084*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDT_BSDINFOWITHUNIQID returns valid information about the process",
1085*4d495c6eSApple OSS Distributions T_META_ASROOT(true),
1086*4d495c6eSApple OSS Distributions T_META_TAG_VM_PREFERRED,
1087*4d495c6eSApple OSS Distributions T_META_ENABLED(false) /* rdar://134505671 */)
1088*4d495c6eSApple OSS Distributions {
1089*4d495c6eSApple OSS Distributions void * proc_info[4];
1090*4d495c6eSApple OSS Distributions int child_pid = 0;
1091*4d495c6eSApple OSS Distributions proc_info_caller(P_UNIQIDINFO | PBSD_OLD | PBSD | PBSD_UNIQID, proc_info, &child_pid);
1092*4d495c6eSApple OSS Distributions struct proc_uniqidentifierinfo * p_uniqidinfo = (struct proc_uniqidentifierinfo *)proc_info[0];
1093*4d495c6eSApple OSS Distributions struct proc_bsdinfo * pbsd_old = (struct proc_bsdinfo *)proc_info[1];
1094*4d495c6eSApple OSS Distributions struct proc_bsdinfo * pbsd = (struct proc_bsdinfo *)proc_info[2];
1095*4d495c6eSApple OSS Distributions struct proc_bsdinfowithuniqid * pbsd_uniqid = (struct proc_bsdinfowithuniqid *)proc_info[3];
1096*4d495c6eSApple OSS Distributions
1097*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((unsigned int)SRUN, pbsd->pbi_status, "PROC_PIDT_BSDINFOWITHUNIQID shows Correct status");
1098*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(0U, pbsd->pbi_xstatus, "PROC_PIDT_BSDINFOWITHUNIQID show Correct xstatus");
1099*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_uniqid->pbsd.pbi_pid, (unsigned int)child_pid, "PROC_PIDT_BSDINFOWITHUNIQID returns valid pid");
1100*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_uniqid->pbsd.pbi_ppid, (unsigned int)getpid(), "PROC_PIDT_BSDINFOWITHUNIQID returns valid ppid");
1101*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_uniqid->pbsd.pbi_uid, CONF_RUID_VAL, "PROC_PIDT_BSDINFOWITHUNIQID returns valid uid");
1102*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_uniqid->pbsd.pbi_gid, CONF_GID_VAL, "PROC_PIDT_BSDINFOWITHUNIQID returns valid gid");
1103*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_uniqid->pbsd.pbi_ruid, 0U, "PROC_PIDT_BSDINFOWITHUNIQID returns valid ruid");
1104*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_uniqid->pbsd.pbi_rgid, CONF_GID_VAL, "PROC_PIDT_BSDINFOWITHUNIQID returns valid rgid");
1105*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_uniqid->pbsd.pbi_svuid, CONF_RUID_VAL, "PROC_PIDT_BSDINFOWITHUNIQID returns valid svuid");
1106*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_uniqid->pbsd.pbi_svgid, CONF_GID_VAL, "PROC_PIDT_BSDINFOWITHUNIQID returns valid svgid");
1107*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_uniqid->pbsd.pbi_nice, CONF_NICE_VAL, "PROC_PIDT_BSDINFOWITHUNIQID returns valid nice value");
1108*4d495c6eSApple OSS Distributions T_EXPECT_EQ_STR(pbsd_uniqid->pbsd.pbi_comm, CONF_CMD_NAME, "PROC_PIDT_BSDINFOWITHUNIQID returns valid p_comm name");
1109*4d495c6eSApple OSS Distributions T_EXPECT_EQ_STR(pbsd_uniqid->pbsd.pbi_name, CONF_CMD_NAME, "PROC_PIDT_BSDINFOWITHUNIQID returns valid p_name name");
1110*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_uniqid->pbsd.pbi_flags, (pbsd_old->pbi_flags | PROC_FLAG_PSUGID),
1111*4d495c6eSApple OSS Distributions "PROC_PIDT_BSDINFOWITHUNIQID returns valid flags");
1112*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_uniqid->pbsd.pbi_nfiles, pbsd_old->pbi_nfiles, "PROC_PIDT_BSDINFOWITHUNIQID returned valid pbi_nfiles");
1113*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_uniqid->pbsd.pbi_pgid, (uint32_t)getpgid(getpid()),
1114*4d495c6eSApple OSS Distributions "PROC_PIDT_BSDINFOWITHUNIQID returned valid pbi_pgid");
1115*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pbsd_uniqid->pbsd.pbi_pjobc, pbsd->pbi_pjobc, "PROC_PIDT_BSDINFOWITHUNIQID returned valid pbi_pjobc");
1116*4d495c6eSApple OSS Distributions T_EXPECT_NE_UINT(pbsd_uniqid->pbsd.e_tdev, 0U, "PROC_PIDT_BSDINFOWITHUNIQID returned valid e_tdev");
1117*4d495c6eSApple OSS Distributions T_EXPECT_NE_ULLONG(pbsd_uniqid->p_uniqidentifier.p_uniqueid, p_uniqidinfo->p_uniqueid,
1118*4d495c6eSApple OSS Distributions "PROC_PIDT_BSDINFOWITHUNIQID returned valid p_uniqueid");
1119*4d495c6eSApple OSS Distributions for (int i = 0; i < 16; i++) {
1120*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UCHAR(pbsd_uniqid->p_uniqidentifier.p_uuid[i], p_uniqidinfo->p_uuid[i],
1121*4d495c6eSApple OSS Distributions "PROC_PIDT_BSDINFOWITHUNIQID reported valid p_uniqueid");
1122*4d495c6eSApple OSS Distributions }
1123*4d495c6eSApple OSS Distributions T_EXPECT_EQ_ULLONG(pbsd_uniqid->p_uniqidentifier.p_puniqueid, p_uniqidinfo->p_uniqueid,
1124*4d495c6eSApple OSS Distributions "p_puniqueid of child should be same as p_uniqueid for parent");
1125*4d495c6eSApple OSS Distributions
1126*4d495c6eSApple OSS Distributions free_proc_info(proc_info, 4);
1127*4d495c6eSApple OSS Distributions }
1128*4d495c6eSApple OSS Distributions
1129*4d495c6eSApple OSS Distributions static void
_expect_increasing_taskinfo_times(const char * name,struct proc_taskinfo * early,struct proc_taskinfo * late)1130*4d495c6eSApple OSS Distributions _expect_increasing_taskinfo_times(const char *name, struct proc_taskinfo *early,
1131*4d495c6eSApple OSS Distributions struct proc_taskinfo *late)
1132*4d495c6eSApple OSS Distributions {
1133*4d495c6eSApple OSS Distributions if (has_user_system_times()) {
1134*4d495c6eSApple OSS Distributions T_EXPECT_GT(late->pti_total_system, early->pti_total_system,
1135*4d495c6eSApple OSS Distributions "%s returned increasing pti_total_system time", name);
1136*4d495c6eSApple OSS Distributions T_EXPECT_GT(late->pti_threads_system, early->pti_threads_system,
1137*4d495c6eSApple OSS Distributions "%s returned increasing pti_threads_system time", name);
1138*4d495c6eSApple OSS Distributions }
1139*4d495c6eSApple OSS Distributions
1140*4d495c6eSApple OSS Distributions T_EXPECT_GT(late->pti_threads_user, early->pti_threads_user,
1141*4d495c6eSApple OSS Distributions "%s returned increasing pti_threads_user time", name);
1142*4d495c6eSApple OSS Distributions T_EXPECT_GT(late->pti_total_user, early->pti_total_user,
1143*4d495c6eSApple OSS Distributions "%s returned increasing pti_total_user time", name);
1144*4d495c6eSApple OSS Distributions }
1145*4d495c6eSApple OSS Distributions
1146*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidtask_info,
1147*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDTASKINFO returns valid information about the process",
1148*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1149*4d495c6eSApple OSS Distributions {
1150*4d495c6eSApple OSS Distributions void * proc_info[2];
1151*4d495c6eSApple OSS Distributions proc_info_caller(P_TASK_INFO | P_TASK_INFO_NEW, proc_info, NULL);
1152*4d495c6eSApple OSS Distributions struct proc_taskinfo * p_task_info = (struct proc_taskinfo *)proc_info[0];
1153*4d495c6eSApple OSS Distributions struct proc_taskinfo * p_task_info_new = (struct proc_taskinfo *)proc_info[1];
1154*4d495c6eSApple OSS Distributions
1155*4d495c6eSApple OSS Distributions T_EXPECT_GE_ULLONG((p_task_info_new->pti_virtual_size - p_task_info->pti_virtual_size), (unsigned long long)PAGE_SIZE,
1156*4d495c6eSApple OSS Distributions "PROC_PIDTASKINFO returned valid value for pti_virtual_size");
1157*4d495c6eSApple OSS Distributions T_EXPECT_GE_ULLONG((p_task_info_new->pti_resident_size - p_task_info->pti_resident_size), (unsigned long long)PAGE_SIZE,
1158*4d495c6eSApple OSS Distributions "PROC_PIDTASKINFO returned valid value for pti_resident_size");
1159*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(p_task_info_new->pti_policy, POLICY_TIMESHARE, "PROC_PIDTASKINFO returned valid value for pti_policy");
1160*4d495c6eSApple OSS Distributions _expect_increasing_taskinfo_times("PROC_PIDTASKINFO", p_task_info, p_task_info_new);
1161*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT((p_task_info_new->pti_faults - p_task_info->pti_faults), 1,
1162*4d495c6eSApple OSS Distributions "PROC_PIDTASKINFO returned valid value for pti_faults");
1163*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT((p_task_info_new->pti_cow_faults - p_task_info->pti_cow_faults), 1,
1164*4d495c6eSApple OSS Distributions "PROC_PIDTASKINFO returned valid value for pti_cow_faults");
1165*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT((p_task_info_new->pti_syscalls_mach - p_task_info->pti_syscalls_mach), 0,
1166*4d495c6eSApple OSS Distributions "PROC_PIDTASKINFO returned valid value for pti_syscalls_mach");
1167*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT((p_task_info_new->pti_syscalls_unix - p_task_info->pti_syscalls_unix), 2,
1168*4d495c6eSApple OSS Distributions "PROC_PIDTASKINFO returned valid value for pti_syscalls_unix");
1169*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT((p_task_info_new->pti_messages_sent - p_task_info->pti_messages_sent), 0,
1170*4d495c6eSApple OSS Distributions "PROC_PIDTASKINFO returned valid value for pti_messages_sent");
1171*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT((p_task_info_new->pti_messages_received - p_task_info->pti_messages_received), 0,
1172*4d495c6eSApple OSS Distributions "PROC_PIDTASKINFO returned valid value for pti_messages_received");
1173*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(p_task_info_new->pti_priority, p_task_info->pti_priority,
1174*4d495c6eSApple OSS Distributions "PROC_PIDTASKINFO returned valid value for pti_priority");
1175*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT(p_task_info_new->pti_threadnum, 1, "PROC_PIDTASKINFO returned valid value for pti_threadnum");
1176*4d495c6eSApple OSS Distributions
1177*4d495c6eSApple OSS Distributions if (p_task_info_new->pti_threadnum > 1) {
1178*4d495c6eSApple OSS Distributions T_LOG("WARN: PROC_PIDTASKINFO returned threadnum greater than 1");
1179*4d495c6eSApple OSS Distributions }
1180*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT(p_task_info_new->pti_numrunning, 0, "PROC_PIDTASKINFO returned valid value for pti_numrunning");
1181*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT(p_task_info_new->pti_pageins, 0, "PROC_PIDTASKINFO returned valid value for pti_pageins");
1182*4d495c6eSApple OSS Distributions
1183*4d495c6eSApple OSS Distributions if (p_task_info_new->pti_pageins > 0) {
1184*4d495c6eSApple OSS Distributions T_LOG("WARN: PROC_PIDTASKINFO returned pageins greater than 0");
1185*4d495c6eSApple OSS Distributions }
1186*4d495c6eSApple OSS Distributions
1187*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT(p_task_info_new->pti_csw, p_task_info->pti_csw, "PROC_PIDTASKINFO returned valid value for pti_csw");
1188*4d495c6eSApple OSS Distributions
1189*4d495c6eSApple OSS Distributions free_proc_info(proc_info, 2);
1190*4d495c6eSApple OSS Distributions }
1191*4d495c6eSApple OSS Distributions
1192*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidtaskallinfo,
1193*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDTASKALLINFO returns valid information about the process",
1194*4d495c6eSApple OSS Distributions T_META_ASROOT(true),
1195*4d495c6eSApple OSS Distributions T_META_TAG_VM_PREFERRED,
1196*4d495c6eSApple OSS Distributions T_META_ENABLED(false) /* rdar://134505671 */)
1197*4d495c6eSApple OSS Distributions {
1198*4d495c6eSApple OSS Distributions void * proc_info[4];
1199*4d495c6eSApple OSS Distributions int child_pid = 0;
1200*4d495c6eSApple OSS Distributions proc_info_caller(PBSD | PBSD_OLD | P_TASK_INFO | PALL, proc_info, &child_pid);
1201*4d495c6eSApple OSS Distributions struct proc_bsdinfo * pbsd = (struct proc_bsdinfo *)proc_info[0];
1202*4d495c6eSApple OSS Distributions struct proc_bsdinfo * pbsd_old = (struct proc_bsdinfo *)proc_info[1];
1203*4d495c6eSApple OSS Distributions struct proc_taskinfo * p_task_info = (struct proc_taskinfo *)proc_info[2];
1204*4d495c6eSApple OSS Distributions struct proc_taskallinfo * pall = (struct proc_taskallinfo *)proc_info[3];
1205*4d495c6eSApple OSS Distributions
1206*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((unsigned int)SRUN, pbsd->pbi_status, "PROC_PIDTASKALLINFO shows Correct status");
1207*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(0U, pbsd->pbi_xstatus, "PROC_PIDTASKALLINFO show Correct xstatus");
1208*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pall->pbsd.pbi_pid, (unsigned int)child_pid, "PROC_PIDTASKALLINFO returns valid pid");
1209*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pall->pbsd.pbi_ppid, (unsigned int)getpid(), "PROC_PIDTASKALLINFO returns valid ppid");
1210*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pall->pbsd.pbi_uid, CONF_RUID_VAL, "PROC_PIDTASKALLINFO returns valid uid");
1211*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pall->pbsd.pbi_gid, CONF_GID_VAL, "PROC_PIDTASKALLINFO returns valid gid");
1212*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pall->pbsd.pbi_ruid, 0U, "PROC_PIDTASKALLINFO returns valid ruid");
1213*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pall->pbsd.pbi_rgid, CONF_GID_VAL, "PROC_PIDTASKALLINFO returns valid rgid");
1214*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pall->pbsd.pbi_svuid, CONF_RUID_VAL, "PROC_PIDTASKALLINFO returns valid svuid");
1215*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pall->pbsd.pbi_svgid, CONF_GID_VAL, "PROC_PIDTASKALLINFO returns valid svgid");
1216*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pall->pbsd.pbi_nice, CONF_NICE_VAL, "PROC_PIDTASKALLINFO returns valid nice value");
1217*4d495c6eSApple OSS Distributions T_EXPECT_EQ_STR(pall->pbsd.pbi_comm, CONF_CMD_NAME, "PROC_PIDTASKALLINFO returns valid p_comm name");
1218*4d495c6eSApple OSS Distributions T_EXPECT_EQ_STR(pall->pbsd.pbi_name, CONF_CMD_NAME, "PROC_PIDTASKALLINFO returns valid p_name name");
1219*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pall->pbsd.pbi_flags, (pbsd_old->pbi_flags | PROC_FLAG_PSUGID), "PROC_PIDTASKALLINFO returns valid flags");
1220*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pall->pbsd.pbi_nfiles, pbsd_old->pbi_nfiles, "PROC_PIDTASKALLINFO returned valid pbi_nfiles");
1221*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pall->pbsd.pbi_pgid, (uint32_t)getpgid(getpid()), "PROC_PIDTASKALLINFO returned valid pbi_pgid");
1222*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pall->pbsd.pbi_pjobc, pbsd->pbi_pjobc, "PROC_PIDTASKALLINFO returned valid pbi_pjobc");
1223*4d495c6eSApple OSS Distributions T_EXPECT_NE_UINT(pall->pbsd.e_tdev, 0U, "PROC_PIDTASKALLINFO returned valid e_tdev");
1224*4d495c6eSApple OSS Distributions
1225*4d495c6eSApple OSS Distributions T_EXPECT_GE_ULLONG((pall->ptinfo.pti_virtual_size - p_task_info->pti_virtual_size), (unsigned long long)PAGE_SIZE,
1226*4d495c6eSApple OSS Distributions "PROC_PIDTASKALLINFO returned valid value for pti_virtual_size");
1227*4d495c6eSApple OSS Distributions T_EXPECT_GE_ULLONG((pall->ptinfo.pti_resident_size - p_task_info->pti_resident_size), (unsigned long long)PAGE_SIZE,
1228*4d495c6eSApple OSS Distributions "PROC_PIDTASKALLINFO returned valid value for pti_resident_size");
1229*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pall->ptinfo.pti_policy, POLICY_TIMESHARE, "PROC_PIDTASKALLINFO returned valid value for pti_policy");
1230*4d495c6eSApple OSS Distributions _expect_increasing_taskinfo_times("PROC_PIDTASKALLLINFO", p_task_info, &pall->ptinfo);
1231*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT((pall->ptinfo.pti_faults - p_task_info->pti_faults), 1,
1232*4d495c6eSApple OSS Distributions "PROC_PIDTASKALLINFO returned valid value for pti_faults");
1233*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT((pall->ptinfo.pti_cow_faults - p_task_info->pti_cow_faults), 1,
1234*4d495c6eSApple OSS Distributions "PROC_PIDTASKALLINFO returned valid value for pti_cow_faults");
1235*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT((pall->ptinfo.pti_syscalls_mach - p_task_info->pti_syscalls_mach), 0,
1236*4d495c6eSApple OSS Distributions "PROC_PIDTASKALLINFO returned valid value for pti_syscalls_mach");
1237*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT((pall->ptinfo.pti_syscalls_unix - p_task_info->pti_syscalls_unix), 2,
1238*4d495c6eSApple OSS Distributions "PROC_PIDTASKALLINFO returned valid value for pti_syscalls_unix");
1239*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT((pall->ptinfo.pti_messages_sent - p_task_info->pti_messages_sent), 0,
1240*4d495c6eSApple OSS Distributions "PROC_PIDTASKALLINFO returned valid value for pti_messages_sent");
1241*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT((pall->ptinfo.pti_messages_received - p_task_info->pti_messages_received), 0,
1242*4d495c6eSApple OSS Distributions "PROC_PIDTASKALLINFO returned valid value for pti_messages_received");
1243*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pall->ptinfo.pti_priority, p_task_info->pti_priority,
1244*4d495c6eSApple OSS Distributions "PROC_PIDTASKALLINFO returned valid value for pti_priority");
1245*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT(pall->ptinfo.pti_threadnum, 1, "PROC_PIDTASKALLINFO returned valid value for pti_threadnum");
1246*4d495c6eSApple OSS Distributions if (pall->ptinfo.pti_threadnum > 1) {
1247*4d495c6eSApple OSS Distributions T_LOG("WARN: PROC_PIDTASKALLINFO returned threadnum greater than 1");
1248*4d495c6eSApple OSS Distributions }
1249*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT(pall->ptinfo.pti_numrunning, 0, "PROC_PIDTASKALLINFO returned valid value for pti_numrunning");
1250*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT(pall->ptinfo.pti_pageins, 0, "PROC_PIDTASKALLINFO returned valid value for pti_pageins");
1251*4d495c6eSApple OSS Distributions if (pall->ptinfo.pti_pageins > 0) {
1252*4d495c6eSApple OSS Distributions T_LOG("WARN: PROC_PIDTASKALLINFO returned pageins greater than 0");
1253*4d495c6eSApple OSS Distributions }
1254*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT(pall->ptinfo.pti_csw, p_task_info->pti_csw, "PROC_PIDTASKALLINFO returned valid value for pti_csw");
1255*4d495c6eSApple OSS Distributions
1256*4d495c6eSApple OSS Distributions free_proc_info(proc_info, 4);
1257*4d495c6eSApple OSS Distributions }
1258*4d495c6eSApple OSS Distributions
1259*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidlistthreads,
1260*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDLISTTHREADS returns valid information about process",
1261*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1262*4d495c6eSApple OSS Distributions {
1263*4d495c6eSApple OSS Distributions void * proc_info[1];
1264*4d495c6eSApple OSS Distributions proc_info_caller(THREAD_ADDR, proc_info, NULL);
1265*4d495c6eSApple OSS Distributions }
1266*4d495c6eSApple OSS Distributions
1267*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidthreadinfo,
1268*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDTHREADINFO returns valid information about the process",
1269*4d495c6eSApple OSS Distributions T_META_ASROOT(true),
1270*4d495c6eSApple OSS Distributions T_META_TAG_VM_PREFERRED,
1271*4d495c6eSApple OSS Distributions T_META_ENABLED(false) /* rdar://134505671 */)
1272*4d495c6eSApple OSS Distributions {
1273*4d495c6eSApple OSS Distributions void * proc_info[2];
1274*4d495c6eSApple OSS Distributions int child_pid = 0;
1275*4d495c6eSApple OSS Distributions proc_info_caller(PTHINFO_OLD | PTHINFO, proc_info, &child_pid);
1276*4d495c6eSApple OSS Distributions struct proc_threadinfo * pthinfo_old = (struct proc_threadinfo *)proc_info[0];
1277*4d495c6eSApple OSS Distributions struct proc_threadinfo * pthinfo = (struct proc_threadinfo *)proc_info[1];
1278*4d495c6eSApple OSS Distributions
1279*4d495c6eSApple OSS Distributions T_EXPECT_GT_ULLONG((pthinfo->pth_user_time - pthinfo_old->pth_user_time), 0ULL,
1280*4d495c6eSApple OSS Distributions "PROC_PIDTHREADINFO returns valid value for pth_user_time");
1281*4d495c6eSApple OSS Distributions T_EXPECT_GE_ULLONG((pthinfo->pth_system_time - pthinfo_old->pth_system_time), 0ULL,
1282*4d495c6eSApple OSS Distributions "PROC_PIDTHREADINFO returns valid value for pth_system_time");
1283*4d495c6eSApple OSS Distributions /*
1284*4d495c6eSApple OSS Distributions * This is the scaled cpu usage percentage, since we are not
1285*4d495c6eSApple OSS Distributions * doing a really long CPU bound task, it is (nearly) zero
1286*4d495c6eSApple OSS Distributions */
1287*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT(pthinfo->pth_cpu_usage, 0, "PROC_PIDTHREADINFO returns valid value for pth_cpu_usage");
1288*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pthinfo->pth_policy, POLICY_TIMESHARE, "PROC_PIDTHREADINFO returns valid value for pth_policy");
1289*4d495c6eSApple OSS Distributions if (!(pthinfo->pth_run_state == TH_STATE_WAITING) && !(pthinfo->pth_run_state == TH_STATE_RUNNING)) {
1290*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pthinfo->pth_run_state, -1, "PROC_PIDTHREADINFO returns valid value for pth_run_state");
1291*4d495c6eSApple OSS Distributions }
1292*4d495c6eSApple OSS Distributions /*
1293*4d495c6eSApple OSS Distributions * This value is hardcoded to 0 in the source, hence it will always
1294*4d495c6eSApple OSS Distributions * unconditionally return 0
1295*4d495c6eSApple OSS Distributions */
1296*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pthinfo->pth_sleep_time, 0, "PROC_PIDTHREADINFO returns valid value for pth_sleep_time");
1297*4d495c6eSApple OSS Distributions T_EXPECT_LE_INT(pthinfo->pth_curpri, (BASEPRI_DEFAULT - CONF_NICE_VAL),
1298*4d495c6eSApple OSS Distributions "PROC_PIDTHREADINFO returns valid value for pth_curpri");
1299*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pthinfo->pth_priority, (BASEPRI_DEFAULT - CONF_NICE_VAL),
1300*4d495c6eSApple OSS Distributions "PROC_PIDTHREADINFO returns valid value for pth_priority");
1301*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pthinfo->pth_maxpriority, MAXPRI_USER, "PROC_PIDTHREADINFO returns valid value for pth_maxpriority");
1302*4d495c6eSApple OSS Distributions T_EXPECT_EQ_STR(pthinfo->pth_name, CONF_THREAD_NAME, "PROC_PIDTHREADINFO returns valid value for pth_name");
1303*4d495c6eSApple OSS Distributions
1304*4d495c6eSApple OSS Distributions free_proc_info(proc_info, 2);
1305*4d495c6eSApple OSS Distributions }
1306*4d495c6eSApple OSS Distributions
1307*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_threadid64info,
1308*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDTHREADID64INFO returns valid information about the process",
1309*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1310*4d495c6eSApple OSS Distributions {
1311*4d495c6eSApple OSS Distributions void * proc_info[2];
1312*4d495c6eSApple OSS Distributions proc_info_caller(PTHINFO | PTHINFO_64, proc_info, NULL);
1313*4d495c6eSApple OSS Distributions struct proc_threadinfo pthinfo = *((struct proc_threadinfo *)proc_info[0]);
1314*4d495c6eSApple OSS Distributions struct proc_threadinfo pthinfo_64 = *((struct proc_threadinfo *)proc_info[1]);
1315*4d495c6eSApple OSS Distributions T_EXPECT_GE_ULLONG(pthinfo_64.pth_user_time, pthinfo.pth_user_time,
1316*4d495c6eSApple OSS Distributions "PROC_PIDTHREADID64INFO returns valid value for pth_user_time");
1317*4d495c6eSApple OSS Distributions T_EXPECT_GE_ULLONG(pthinfo_64.pth_system_time, pthinfo.pth_system_time,
1318*4d495c6eSApple OSS Distributions "PROC_PIDTHREADID64INFO returns valid value for pth_system_time");
1319*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT(pthinfo_64.pth_cpu_usage, pthinfo.pth_cpu_usage,
1320*4d495c6eSApple OSS Distributions "PROC_PIDTHREADID64INFO returns valid value for pth_cpu_usage");
1321*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pthinfo_64.pth_policy, POLICY_TIMESHARE, "PROC_PIDTHREADID64INFO returns valid value for pth_policy");
1322*4d495c6eSApple OSS Distributions if (!(pthinfo_64.pth_run_state == TH_STATE_WAITING) && !(pthinfo_64.pth_run_state == TH_STATE_RUNNING)) {
1323*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pthinfo_64.pth_run_state, -1, "PROC_PIDTHREADID64INFO returns valid value for pth_run_state");
1324*4d495c6eSApple OSS Distributions }
1325*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pthinfo_64.pth_sleep_time, 0, "PROC_PIDTHREADID64INFO returns valid value for pth_sleep_time");
1326*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pthinfo_64.pth_curpri, pthinfo.pth_curpri, "PROC_PIDTHREADID64INFO returns valid value for pth_curpri");
1327*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pthinfo_64.pth_priority, pthinfo.pth_priority, "PROC_PIDTHREADID64INFO returns valid value for pth_priority");
1328*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pthinfo_64.pth_maxpriority, pthinfo.pth_maxpriority,
1329*4d495c6eSApple OSS Distributions "PROC_PIDTHREADID64INFO returns valid value for pth_maxpriority");
1330*4d495c6eSApple OSS Distributions T_EXPECT_EQ_STR(pthinfo_64.pth_name, CONF_THREAD_NAME, "PROC_PIDTHREADID64INFO returns valid value for pth_name");
1331*4d495c6eSApple OSS Distributions
1332*4d495c6eSApple OSS Distributions free_proc_info(proc_info, 2);
1333*4d495c6eSApple OSS Distributions }
1334*4d495c6eSApple OSS Distributions
1335*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidthreadpathinfo,
1336*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDTHREADPATHINFO returns valid information about the process",
1337*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1338*4d495c6eSApple OSS Distributions {
1339*4d495c6eSApple OSS Distributions void * proc_info[2];
1340*4d495c6eSApple OSS Distributions proc_info_caller(PTHINFO | PINFO_PATH, proc_info, NULL);
1341*4d495c6eSApple OSS Distributions struct proc_threadinfo pthinfo = *((struct proc_threadinfo *)proc_info[0]);
1342*4d495c6eSApple OSS Distributions struct proc_threadwithpathinfo pinfo_path = *((struct proc_threadwithpathinfo *)proc_info[1]);
1343*4d495c6eSApple OSS Distributions
1344*4d495c6eSApple OSS Distributions T_EXPECT_GE_ULLONG(pinfo_path.pt.pth_user_time, pthinfo.pth_user_time,
1345*4d495c6eSApple OSS Distributions "PROC_PIDTHREADPATHINFO returns valid value for pth_user_time");
1346*4d495c6eSApple OSS Distributions T_EXPECT_GE_ULLONG(pinfo_path.pt.pth_system_time, pthinfo.pth_system_time,
1347*4d495c6eSApple OSS Distributions "PROC_PIDTHREADPATHINFO returns valid value for pth_system_time");
1348*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT(pinfo_path.pt.pth_cpu_usage, pthinfo.pth_cpu_usage,
1349*4d495c6eSApple OSS Distributions "PROC_PIDTHREADPATHINFO returns valid value for pth_cpu_usage");
1350*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pinfo_path.pt.pth_policy, POLICY_TIMESHARE, "PROC_PIDTHREADPATHINFO returns valid value for pth_policy");
1351*4d495c6eSApple OSS Distributions if (!(pinfo_path.pt.pth_run_state == TH_STATE_WAITING) && !(pinfo_path.pt.pth_run_state == TH_STATE_RUNNING)) {
1352*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pinfo_path.pt.pth_run_state, -1, "PROC_PIDTHREADPATHINFO returns valid value for pth_run_state");
1353*4d495c6eSApple OSS Distributions }
1354*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pinfo_path.pt.pth_sleep_time, 0, "PROC_PIDTHREADPATHINFO returns valid value for pth_sleep_time");
1355*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pinfo_path.pt.pth_curpri, pthinfo.pth_curpri, "PROC_PIDTHREADPATHINFO returns valid value for pth_curpri");
1356*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pinfo_path.pt.pth_priority, pthinfo.pth_priority,
1357*4d495c6eSApple OSS Distributions "PROC_PIDTHREADPATHINFO returns valid value for pth_priority");
1358*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pinfo_path.pt.pth_maxpriority, pthinfo.pth_maxpriority,
1359*4d495c6eSApple OSS Distributions "PROC_PIDTHREADPATHINFO returns valid value for pth_maxpriority");
1360*4d495c6eSApple OSS Distributions T_EXPECT_EQ_STR(pinfo_path.pt.pth_name, CONF_THREAD_NAME, "PROC_PIDTHREADPATHINFO returns valid value for pth_name");
1361*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pinfo_path.pvip.vip_vi.vi_type, VNON, "PROC_PIDTHREADPATHINFO valid vnode information");
1362*4d495c6eSApple OSS Distributions
1363*4d495c6eSApple OSS Distributions free_proc_info(proc_info, 2);
1364*4d495c6eSApple OSS Distributions }
1365*4d495c6eSApple OSS Distributions
1366*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidarchinfo,
1367*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDARCHINFO returns valid information about the process",
1368*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1369*4d495c6eSApple OSS Distributions {
1370*4d495c6eSApple OSS Distributions void * proc_info[1];
1371*4d495c6eSApple OSS Distributions proc_info_caller(PAI, proc_info, NULL);
1372*4d495c6eSApple OSS Distributions struct proc_archinfo pai = *((struct proc_archinfo *)proc_info[0]);
1373*4d495c6eSApple OSS Distributions
1374*4d495c6eSApple OSS Distributions #if defined(__arm64__)
1375*4d495c6eSApple OSS Distributions if (!((pai.p_cputype & CPU_TYPE_ARM) == CPU_TYPE_ARM) && !((pai.p_cputype & CPU_TYPE_ARM64) == CPU_TYPE_ARM64)) {
1376*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pai.p_cputype, CPU_TYPE_ARM, "PROC_PIDARCHINFO returned valid value for p_cputype");
1377*4d495c6eSApple OSS Distributions }
1378*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT((pai.p_cpusubtype & CPU_SUBTYPE_ARM_ALL), CPU_SUBTYPE_ARM_ALL,
1379*4d495c6eSApple OSS Distributions "PROC_PIDARCHINFO returned valid value for p_cpusubtype");
1380*4d495c6eSApple OSS Distributions #else
1381*4d495c6eSApple OSS Distributions if (!((pai.p_cputype & CPU_TYPE_X86) == CPU_TYPE_X86) && !((pai.p_cputype & CPU_TYPE_X86_64) == CPU_TYPE_X86_64)) {
1382*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pai.p_cputype, CPU_TYPE_X86, "PROC_PIDARCHINFO returned valid value for p_cputype");
1383*4d495c6eSApple OSS Distributions }
1384*4d495c6eSApple OSS Distributions #endif
1385*4d495c6eSApple OSS Distributions free_proc_info(proc_info, 1);
1386*4d495c6eSApple OSS Distributions }
1387*4d495c6eSApple OSS Distributions
1388*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidregioninfo,
1389*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDREGIONINFO returns valid information about the process",
1390*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1391*4d495c6eSApple OSS Distributions {
1392*4d495c6eSApple OSS Distributions void * proc_info[3];
1393*4d495c6eSApple OSS Distributions proc_info_caller(PREGINFO, proc_info, NULL);
1394*4d495c6eSApple OSS Distributions
1395*4d495c6eSApple OSS Distributions struct proc_regioninfo preginfo = *((struct proc_regioninfo *)proc_info[0]);
1396*4d495c6eSApple OSS Distributions /*
1397*4d495c6eSApple OSS Distributions * map_tmp isn't a struct like the rest of our ret_structs, but we sneak it back because we need it
1398*4d495c6eSApple OSS Distributions */
1399*4d495c6eSApple OSS Distributions void *map_tmp = proc_info[1];
1400*4d495c6eSApple OSS Distributions vm_map_size_t map_tmp_sz = (vm_map_size_t)(uintptr_t)proc_info[2];
1401*4d495c6eSApple OSS Distributions
1402*4d495c6eSApple OSS Distributions T_EXPECT_EQ_ULLONG(preginfo.pri_offset, (unsigned long long)PAGE_SIZE, "PROC_PIDREGIONINFO returns valid value for pri_offset");
1403*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((preginfo.pri_protection ^ (VM_PROT_READ | VM_PROT_WRITE)), 0U,
1404*4d495c6eSApple OSS Distributions "PROC_PIDREGIONINFO returns valid value for pri_protection, expected read/write only");
1405*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((preginfo.pri_max_protection & (VM_PROT_READ | VM_PROT_WRITE)), (unsigned int)(VM_PROT_READ | VM_PROT_WRITE),
1406*4d495c6eSApple OSS Distributions "PROC_PIDREGIONINFO returns valid value for pri_max_protection");
1407*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((preginfo.pri_inheritance ^ VM_INHERIT_COPY), 0U,
1408*4d495c6eSApple OSS Distributions "PROC_PIDREGIONINFO returns valid value for pri_inheritance");
1409*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((preginfo.pri_behavior ^ VM_BEHAVIOR_DEFAULT), 0U, "PROC_PIDREGIONINFO returns valid value for pri_behavior");
1410*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo.pri_user_wired_count, 0U, "PROC_PIDREGIONINFO returns valid value for pri_user_wired_count");
1411*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo.pri_user_tag, 0U, "PROC_PIDREGIONINFO returns valid value for pri_user_tag");
1412*4d495c6eSApple OSS Distributions T_EXPECT_NE_UINT((preginfo.pri_flags ^ (PROC_REGION_SUBMAP | PROC_REGION_SHARED)), 0U,
1413*4d495c6eSApple OSS Distributions "PROC_PIDREGIONINFO returns valid value for pri_flags");
1414*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo.pri_pages_resident, 0U, "PROC_PIDREGIONINFO returns valid value for pri_pages_resident");
1415*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo.pri_pages_shared_now_private, 0U,
1416*4d495c6eSApple OSS Distributions "PROC_PIDREGIONINFO returns valid value for pri_pages_shared_now_private");
1417*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo.pri_pages_swapped_out, 0U, "PROC_PIDREGIONINFO returns valid value for pri_pages_swapped_out");
1418*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo.pri_pages_dirtied, 0U, "PROC_PIDREGIONINFO returns valid value for pri_pages_dirtied");
1419*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo.pri_ref_count, 2U, "PROC_PIDREGIONINFO returns valid value for pri_ref_count");
1420*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo.pri_shadow_depth, 1U, "PROC_PIDREGIONINFO returns valid value for pri_shadow_depth");
1421*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo.pri_share_mode, (unsigned int)SM_COW, "PROC_PIDREGIONINFO returns valid value for pri_share_mode");
1422*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo.pri_private_pages_resident, 0U,
1423*4d495c6eSApple OSS Distributions "PROC_PIDREGIONINFO returns valid value for pri_private_pages_resident");
1424*4d495c6eSApple OSS Distributions T_EXPECT_GE_UINT(preginfo.pri_shared_pages_resident, 0U,
1425*4d495c6eSApple OSS Distributions "PROC_PIDREGIONINFO returns valid value for pri_shared_pages_resident");
1426*4d495c6eSApple OSS Distributions T_EXPECT_EQ_ULLONG(preginfo.pri_address, (uint64_t)map_tmp, "PROC_PIDREGIONINFO returns valid value for pri_addr");
1427*4d495c6eSApple OSS Distributions T_EXPECT_NE_UINT(preginfo.pri_obj_id, 0U, "PROC_PIDREGIONINFO returns valid value for pri_obj_id");
1428*4d495c6eSApple OSS Distributions T_EXPECT_EQ_ULLONG(preginfo.pri_size, (unsigned long long)map_tmp_sz, "PROC_PIDREGIONINFO returns valid value for pri_size");
1429*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo.pri_depth, 0U, "PROC_PIDREGIONINFO returns valid value for pri_depth");
1430*4d495c6eSApple OSS Distributions
1431*4d495c6eSApple OSS Distributions int ret = 0;
1432*4d495c6eSApple OSS Distributions ret = munmap(map_tmp, (size_t)map_tmp_sz);
1433*4d495c6eSApple OSS Distributions T_QUIET;
1434*4d495c6eSApple OSS Distributions T_EXPECT_POSIX_SUCCESS(ret, "munmap of map_tmp");
1435*4d495c6eSApple OSS Distributions free_proc_info(proc_info, 1);
1436*4d495c6eSApple OSS Distributions }
1437*4d495c6eSApple OSS Distributions
1438*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidregionpathinfo,
1439*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDREGIONPATHINFO returns valid information about the process",
1440*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1441*4d495c6eSApple OSS Distributions {
1442*4d495c6eSApple OSS Distributions void * proc_info[3];
1443*4d495c6eSApple OSS Distributions proc_info_caller(PREGINFO_PATH, proc_info, NULL);
1444*4d495c6eSApple OSS Distributions
1445*4d495c6eSApple OSS Distributions struct proc_regionwithpathinfo preginfo_path = *((struct proc_regionwithpathinfo *)proc_info[0]);
1446*4d495c6eSApple OSS Distributions /*
1447*4d495c6eSApple OSS Distributions * map_tmp isn't a struct like the rest of our ret_structs, but we sneak it back because we need it
1448*4d495c6eSApple OSS Distributions */
1449*4d495c6eSApple OSS Distributions void *map_tmp = proc_info[1];
1450*4d495c6eSApple OSS Distributions vm_map_size_t map_tmp_sz = (vm_map_size_t)(uintptr_t)proc_info[2];
1451*4d495c6eSApple OSS Distributions
1452*4d495c6eSApple OSS Distributions T_EXPECT_EQ_ULLONG(preginfo_path.prp_prinfo.pri_offset, (uint64_t)PAGE_SIZE,
1453*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_offset");
1454*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((preginfo_path.prp_prinfo.pri_protection ^ (VM_PROT_READ | VM_PROT_WRITE)), 0U,
1455*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_protection, expected read/write only");
1456*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((preginfo_path.prp_prinfo.pri_max_protection & (VM_PROT_READ | VM_PROT_WRITE)),
1457*4d495c6eSApple OSS Distributions (unsigned int)(VM_PROT_READ | VM_PROT_WRITE),
1458*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_max_protection");
1459*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((preginfo_path.prp_prinfo.pri_inheritance ^ VM_INHERIT_COPY), 0U,
1460*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_inheritance");
1461*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((preginfo_path.prp_prinfo.pri_behavior ^ VM_BEHAVIOR_DEFAULT), 0U,
1462*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_behavior");
1463*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_user_wired_count, 0U,
1464*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_user_wired_count");
1465*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_user_tag, 0U, "PROC_PIDREGIONPATHINFO returns valid value for pri_user_tag");
1466*4d495c6eSApple OSS Distributions T_EXPECT_NE_UINT((preginfo_path.prp_prinfo.pri_flags ^ (PROC_REGION_SUBMAP | PROC_REGION_SHARED)), 0U,
1467*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_flags");
1468*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_pages_resident, 0U,
1469*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_pages_resident");
1470*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_pages_shared_now_private, 0U,
1471*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_pages_shared_now_private");
1472*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_pages_swapped_out, 0U,
1473*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_pages_swapped_out");
1474*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_pages_dirtied, 0U,
1475*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_pages_dirtied");
1476*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_ref_count, 2U, "PROC_PIDREGIONPATHINFO returns valid value for pri_ref_count");
1477*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_shadow_depth, 1U,
1478*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_shadow_depth");
1479*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_share_mode, (unsigned int)SM_COW,
1480*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_share_mode");
1481*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_private_pages_resident, 0U,
1482*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_private_pages_resident");
1483*4d495c6eSApple OSS Distributions T_EXPECT_GE_UINT(preginfo_path.prp_prinfo.pri_shared_pages_resident, 0U,
1484*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_shared_pages_resident");
1485*4d495c6eSApple OSS Distributions T_EXPECT_EQ_ULLONG(preginfo_path.prp_prinfo.pri_address, (uint64_t)map_tmp,
1486*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_addr");
1487*4d495c6eSApple OSS Distributions T_EXPECT_NE_UINT(preginfo_path.prp_prinfo.pri_obj_id, 0U, "PROC_PIDREGIONPATHINFO returns valid value for pri_obj_id");
1488*4d495c6eSApple OSS Distributions T_EXPECT_EQ_ULLONG(preginfo_path.prp_prinfo.pri_size, (uint64_t)map_tmp_sz,
1489*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for pri_size");
1490*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_depth, 0U, "PROC_PIDREGIONPATHINFO returns valid value for pri_depth");
1491*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(preginfo_path.prp_vip.vip_vi.vi_type, VREG, "PROC_PIDREGIONPATHINFO returns valid value for vi_type");
1492*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(preginfo_path.prp_vip.vip_vi.vi_pad, 0, "PROC_PIDREGIONPATHINFO returns valid value for vi_pad");
1493*4d495c6eSApple OSS Distributions T_EXPECT_NE_INT(preginfo_path.prp_vip.vip_vi.vi_fsid.val[0], 0,
1494*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for vi_fsid.val[0]");
1495*4d495c6eSApple OSS Distributions T_EXPECT_NE_INT(preginfo_path.prp_vip.vip_vi.vi_fsid.val[1], 0,
1496*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for vi_fsid.val[1]");
1497*4d495c6eSApple OSS Distributions T_EXPECT_NE_PTR((void *)(strcasestr(preginfo_path.prp_vip.vip_path, CONF_TMP_FILE_PFX)), NULL,
1498*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for vi_path");
1499*4d495c6eSApple OSS Distributions /*
1500*4d495c6eSApple OSS Distributions * Basic sanity checks for vnode stat returned by the API
1501*4d495c6eSApple OSS Distributions */
1502*4d495c6eSApple OSS Distributions T_EXPECT_NE_UINT(preginfo_path.prp_vip.vip_vi.vi_stat.vst_dev, 0U, "PROC_PIDREGIONPATHINFO returns valid value for vst_dev");
1503*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(((preginfo_path.prp_vip.vip_vi.vi_stat.vst_mode & S_IFMT) ^ S_IFREG), 0,
1504*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for vst_mode");
1505*4d495c6eSApple OSS Distributions T_EXPECT_EQ_USHORT(preginfo_path.prp_vip.vip_vi.vi_stat.vst_nlink, (unsigned short)0, /* the file was unlink()'d! */
1506*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for vst_nlink");
1507*4d495c6eSApple OSS Distributions T_EXPECT_NE_ULLONG(preginfo_path.prp_vip.vip_vi.vi_stat.vst_ino, 0ULL,
1508*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for vst_ino");
1509*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_vip.vip_vi.vi_stat.vst_uid, 0U, "PROC_PIDREGIONPATHINFO returns valid value for vst_uid");
1510*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_vip.vip_vi.vi_stat.vst_gid, 0U, "PROC_PIDREGIONPATHINFO returns valid value for vst_gid");
1511*4d495c6eSApple OSS Distributions T_EXPECT_GE_LLONG(preginfo_path.prp_vip.vip_vi.vi_stat.vst_size, (off_t)CONF_BLK_SIZE,
1512*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for vst_size");
1513*4d495c6eSApple OSS Distributions T_EXPECT_GE_LLONG(preginfo_path.prp_vip.vip_vi.vi_stat.vst_blocks, 1LL,
1514*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for vst_blocks");
1515*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT(preginfo_path.prp_vip.vip_vi.vi_stat.vst_blksize, CONF_BLK_SIZE,
1516*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO returns valid value for vst_blksize");
1517*4d495c6eSApple OSS Distributions
1518*4d495c6eSApple OSS Distributions int ret = 0;
1519*4d495c6eSApple OSS Distributions ret = munmap(map_tmp, (size_t)map_tmp_sz);
1520*4d495c6eSApple OSS Distributions T_QUIET;
1521*4d495c6eSApple OSS Distributions T_EXPECT_POSIX_SUCCESS(ret, "munmap of map_tmp");
1522*4d495c6eSApple OSS Distributions free_proc_info(proc_info, 1);
1523*4d495c6eSApple OSS Distributions }
1524*4d495c6eSApple OSS Distributions
1525*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidregionpathinfo2,
1526*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDREGIONPATHINFO2 returns valid information about the process",
1527*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1528*4d495c6eSApple OSS Distributions {
1529*4d495c6eSApple OSS Distributions void * proc_info[3];
1530*4d495c6eSApple OSS Distributions proc_info_caller(PREGINFO_PATH_2, proc_info, NULL);
1531*4d495c6eSApple OSS Distributions
1532*4d495c6eSApple OSS Distributions struct proc_regionwithpathinfo preginfo_path = *((struct proc_regionwithpathinfo *)proc_info[0]);
1533*4d495c6eSApple OSS Distributions /*
1534*4d495c6eSApple OSS Distributions * map_tmp isn't a struct like the rest of our ret_structs, but we sneak it back because we need it
1535*4d495c6eSApple OSS Distributions */
1536*4d495c6eSApple OSS Distributions void *map_tmp = proc_info[1];
1537*4d495c6eSApple OSS Distributions vm_map_size_t map_tmp_sz = (vm_map_size_t)(uintptr_t)proc_info[2];
1538*4d495c6eSApple OSS Distributions
1539*4d495c6eSApple OSS Distributions T_EXPECT_EQ_ULLONG(preginfo_path.prp_prinfo.pri_offset, (uint64_t)PAGE_SIZE,
1540*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_offset");
1541*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((preginfo_path.prp_prinfo.pri_protection ^ (VM_PROT_READ | VM_PROT_WRITE)), 0U,
1542*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_protection, expected read/write only");
1543*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((preginfo_path.prp_prinfo.pri_max_protection & (VM_PROT_READ | VM_PROT_WRITE)),
1544*4d495c6eSApple OSS Distributions (unsigned int)(VM_PROT_READ | VM_PROT_WRITE),
1545*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_max_protection");
1546*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((preginfo_path.prp_prinfo.pri_inheritance ^ VM_INHERIT_COPY), 0U,
1547*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_inheritance");
1548*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT((preginfo_path.prp_prinfo.pri_behavior ^ VM_BEHAVIOR_DEFAULT), 0U,
1549*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_behavior");
1550*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_user_wired_count, 0U,
1551*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_user_wired_count");
1552*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_user_tag, 0U, "PROC_PIDREGIONPATHINFO2 returns valid value for pri_user_tag");
1553*4d495c6eSApple OSS Distributions T_EXPECT_NE_UINT((preginfo_path.prp_prinfo.pri_flags ^ (PROC_REGION_SUBMAP | PROC_REGION_SHARED)), 0U,
1554*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_flags");
1555*4d495c6eSApple OSS Distributions /*
1556*4d495c6eSApple OSS Distributions * Following values are hard-coded to be zero in source
1557*4d495c6eSApple OSS Distributions */
1558*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_pages_resident, 0U,
1559*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_pages_resident");
1560*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_pages_shared_now_private, 0U,
1561*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_pages_shared_now_private");
1562*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_pages_swapped_out, 0U,
1563*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_pages_swapped_out");
1564*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_pages_dirtied, 0U,
1565*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_pages_dirtied");
1566*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_ref_count, 0U, "PROC_PIDREGIONPATHINFO2 returns valid value for pri_ref_count");
1567*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_shadow_depth, 0U,
1568*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_shadow_depth");
1569*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_share_mode, 0U, "PROC_PIDREGIONPATHINFO2 returns valid value for pri_share_mode");
1570*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_private_pages_resident, 0U,
1571*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_private_pages_resident");
1572*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_shared_pages_resident, 0U,
1573*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_shared_pages_resident");
1574*4d495c6eSApple OSS Distributions T_EXPECT_EQ_ULLONG(preginfo_path.prp_prinfo.pri_address, (uint64_t)map_tmp,
1575*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_addr");
1576*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_obj_id, 0U, "PROC_PIDREGIONPATHINFO2 returns valid value for pri_obj_id");
1577*4d495c6eSApple OSS Distributions T_EXPECT_EQ_ULLONG(preginfo_path.prp_prinfo.pri_size, (unsigned long long)map_tmp_sz,
1578*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for pri_size");
1579*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_prinfo.pri_depth, 0U, "PROC_PIDREGIONPATHINFO2 returns valid value for pri_depth");
1580*4d495c6eSApple OSS Distributions
1581*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(preginfo_path.prp_vip.vip_vi.vi_type, VREG, "PROC_PIDREGIONPATHINFO2 returns valid value for vi_type");
1582*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(preginfo_path.prp_vip.vip_vi.vi_pad, 0, "PROC_PIDREGIONPATHINFO2 returns valid value for vi_pad");
1583*4d495c6eSApple OSS Distributions T_EXPECT_NE_INT(preginfo_path.prp_vip.vip_vi.vi_fsid.val[0], 0,
1584*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for vi_fsid.val[0]:%d",
1585*4d495c6eSApple OSS Distributions preginfo_path.prp_vip.vip_vi.vi_fsid.val[0]);
1586*4d495c6eSApple OSS Distributions T_EXPECT_NE_INT(preginfo_path.prp_vip.vip_vi.vi_fsid.val[1], 0,
1587*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for vi_fsid.val[1]:%d",
1588*4d495c6eSApple OSS Distributions preginfo_path.prp_vip.vip_vi.vi_fsid.val[1]);
1589*4d495c6eSApple OSS Distributions T_EXPECT_NE_PTR((void *)(strcasestr(preginfo_path.prp_vip.vip_path, CONF_TMP_FILE_PFX)), NULL,
1590*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for vi_path");
1591*4d495c6eSApple OSS Distributions /*
1592*4d495c6eSApple OSS Distributions * Basic sanity checks for vnode stat returned by the API
1593*4d495c6eSApple OSS Distributions */
1594*4d495c6eSApple OSS Distributions T_EXPECT_NE_UINT(preginfo_path.prp_vip.vip_vi.vi_stat.vst_dev, 0U, "PROC_PIDREGIONPATHINFO2 returns valid value for vst_dev");
1595*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(((preginfo_path.prp_vip.vip_vi.vi_stat.vst_mode & S_IFMT) ^ S_IFREG), 0,
1596*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for vst_mode");
1597*4d495c6eSApple OSS Distributions T_EXPECT_EQ_USHORT(preginfo_path.prp_vip.vip_vi.vi_stat.vst_nlink, (unsigned short)0, /* the file was unlink()'d! */
1598*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for vst_nlink");
1599*4d495c6eSApple OSS Distributions T_EXPECT_NE_ULLONG(preginfo_path.prp_vip.vip_vi.vi_stat.vst_ino, 0ULL,
1600*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for vst_ino");
1601*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_vip.vip_vi.vi_stat.vst_uid, 0U, "PROC_PIDREGIONPATHINFO2 returns valid value for vst_uid");
1602*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(preginfo_path.prp_vip.vip_vi.vi_stat.vst_gid, 0U, "PROC_PIDREGIONPATHINFO2 returns valid value for vst_gid");
1603*4d495c6eSApple OSS Distributions T_EXPECT_GE_LLONG(preginfo_path.prp_vip.vip_vi.vi_stat.vst_size, (off_t)CONF_BLK_SIZE,
1604*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for vst_size");
1605*4d495c6eSApple OSS Distributions T_EXPECT_GE_LLONG(preginfo_path.prp_vip.vip_vi.vi_stat.vst_blocks, 1LL,
1606*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for vst_blocks");
1607*4d495c6eSApple OSS Distributions T_EXPECT_GE_UINT(preginfo_path.prp_vip.vip_vi.vi_stat.vst_blksize, CONF_BLK_SIZE,
1608*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO2 returns valid value for vst_blksize");
1609*4d495c6eSApple OSS Distributions
1610*4d495c6eSApple OSS Distributions int ret = 0;
1611*4d495c6eSApple OSS Distributions ret = munmap(map_tmp, (size_t)map_tmp_sz);
1612*4d495c6eSApple OSS Distributions T_QUIET;
1613*4d495c6eSApple OSS Distributions T_EXPECT_POSIX_SUCCESS(ret, "munmap of map_tmp");
1614*4d495c6eSApple OSS Distributions free_proc_info(proc_info, 1);
1615*4d495c6eSApple OSS Distributions }
1616*4d495c6eSApple OSS Distributions
1617*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidregionpathinfo3,
1618*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDREGIONPATHINFO3 returns valid information about the process",
1619*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1620*4d495c6eSApple OSS Distributions {
1621*4d495c6eSApple OSS Distributions void * proc_info[5];
1622*4d495c6eSApple OSS Distributions proc_info_caller(PREGINFO_PATH_3, proc_info, NULL);
1623*4d495c6eSApple OSS Distributions
1624*4d495c6eSApple OSS Distributions struct proc_regionwithpathinfo preginfo_path = *((struct proc_regionwithpathinfo *)proc_info[0]);
1625*4d495c6eSApple OSS Distributions void *map_tmp = proc_info[1];
1626*4d495c6eSApple OSS Distributions vm_map_size_t map_tmp_sz = (vm_map_size_t)(uintptr_t)proc_info[2];
1627*4d495c6eSApple OSS Distributions
1628*4d495c6eSApple OSS Distributions /* The *info3 version of this call returns any open file that lives on the same file system */
1629*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(preginfo_path.prp_vip.vip_vi.vi_fsid.val[0], (int)(uintptr_t)proc_info[3],
1630*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO3 returns valid value for vi_fsid.val[0]");
1631*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(preginfo_path.prp_vip.vip_vi.vi_fsid.val[1], (int)(uintptr_t)proc_info[4],
1632*4d495c6eSApple OSS Distributions "PROC_PIDREGIONPATHINFO3 returns valid value for vi_fsid.val[1]");
1633*4d495c6eSApple OSS Distributions
1634*4d495c6eSApple OSS Distributions int ret = 0;
1635*4d495c6eSApple OSS Distributions ret = munmap(map_tmp, (size_t)map_tmp_sz);
1636*4d495c6eSApple OSS Distributions T_QUIET;
1637*4d495c6eSApple OSS Distributions T_EXPECT_POSIX_SUCCESS(ret, "munmap of map_tmp");
1638*4d495c6eSApple OSS Distributions free_proc_info(proc_info, 1);
1639*4d495c6eSApple OSS Distributions }
1640*4d495c6eSApple OSS Distributions
1641*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidvnodepathinfo,
1642*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDVNODEPATHINFO returns valid information about the process",
1643*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1644*4d495c6eSApple OSS Distributions {
1645*4d495c6eSApple OSS Distributions void * proc_info[1];
1646*4d495c6eSApple OSS Distributions proc_info_caller(PVNINFO, proc_info, NULL);
1647*4d495c6eSApple OSS Distributions struct proc_vnodepathinfo pvninfo = *((struct proc_vnodepathinfo *)proc_info[0]);
1648*4d495c6eSApple OSS Distributions
1649*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pvninfo.pvi_cdir.vip_vi.vi_type, VDIR, "PROC_PIDVNODEPATHINFO returns valid value for vi_type");
1650*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(pvninfo.pvi_cdir.vip_vi.vi_pad, 0, "PROC_PIDVNODEPATHINFO returns valid value for vi_pad");
1651*4d495c6eSApple OSS Distributions T_EXPECT_NE_INT(pvninfo.pvi_cdir.vip_vi.vi_fsid.val[0], 0, "PROC_PIDVNODEPATHINFO returns valid value for vi_fsid.val[0]");
1652*4d495c6eSApple OSS Distributions T_EXPECT_NE_INT(pvninfo.pvi_cdir.vip_vi.vi_fsid.val[1], 0, "PROC_PIDVNODEPATHINFO returns valid value for vi_fsid.val[1]");
1653*4d495c6eSApple OSS Distributions /*
1654*4d495c6eSApple OSS Distributions * Basic sanity checks for vnode stat returned by the API
1655*4d495c6eSApple OSS Distributions */
1656*4d495c6eSApple OSS Distributions T_EXPECT_NE_UINT(pvninfo.pvi_cdir.vip_vi.vi_stat.vst_dev, 0U, "PROC_PIDVNODEPATHINFO returns valid value for vst_dev");
1657*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(((pvninfo.pvi_cdir.vip_vi.vi_stat.vst_mode & S_IFMT) ^ S_IFDIR), 0,
1658*4d495c6eSApple OSS Distributions "PROC_PIDVNODEPATHINFO returns valid value for vst_mode");
1659*4d495c6eSApple OSS Distributions T_EXPECT_GE_USHORT(pvninfo.pvi_cdir.vip_vi.vi_stat.vst_nlink, (unsigned short)2,
1660*4d495c6eSApple OSS Distributions "PROC_PIDVNODEPATHINFO returns valid value for vst_nlink");
1661*4d495c6eSApple OSS Distributions T_EXPECT_NE_ULLONG(pvninfo.pvi_cdir.vip_vi.vi_stat.vst_ino, 0ULL, "PROC_PIDVNODEPATHINFO returns valid value for vst_ino");
1662*4d495c6eSApple OSS Distributions T_EXPECT_GE_UINT(pvninfo.pvi_cdir.vip_vi.vi_stat.vst_uid, 0U, "PROC_PIDVNODEPATHINFO returns valid value for vst_uid");
1663*4d495c6eSApple OSS Distributions T_EXPECT_GE_UINT(pvninfo.pvi_cdir.vip_vi.vi_stat.vst_gid, 0U, "PROC_PIDVNODEPATHINFO returns valid value for vst_gid");
1664*4d495c6eSApple OSS Distributions T_EXPECT_GT_LLONG(pvninfo.pvi_cdir.vip_vi.vi_stat.vst_size, 0LL, "PROC_PIDVNODEPATHINFO returns valid value for vst_size");
1665*4d495c6eSApple OSS Distributions T_EXPECT_GE_LLONG(pvninfo.pvi_cdir.vip_vi.vi_stat.vst_blocks, 0LL, "PROC_PIDVNODEPATHINFO returns valid value for vst_blocks");
1666*4d495c6eSApple OSS Distributions T_EXPECT_GE_UINT(pvninfo.pvi_cdir.vip_vi.vi_stat.vst_blksize, CONF_BLK_SIZE,
1667*4d495c6eSApple OSS Distributions "PROC_PIDVNODEPATHINFO returns valid value for vst_blksize");
1668*4d495c6eSApple OSS Distributions
1669*4d495c6eSApple OSS Distributions free_proc_info(proc_info, 1);
1670*4d495c6eSApple OSS Distributions }
1671*4d495c6eSApple OSS Distributions /*
1672*4d495c6eSApple OSS Distributions * The remaining tests break from the pattern of the other PROC_INFO_CALL_PIDINFO tests.
1673*4d495c6eSApple OSS Distributions * We call proc_info directly as it's more efficient
1674*4d495c6eSApple OSS Distributions */
1675*4d495c6eSApple OSS Distributions
1676*4d495c6eSApple OSS Distributions T_DECL(proc_info_pidinfo_proc_pidlistfds,
1677*4d495c6eSApple OSS Distributions "proc_info API tests to verify PROC_INFO_CALL_PIDINFO/PROC_PIDLISTFDS",
1678*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1679*4d495c6eSApple OSS Distributions {
1680*4d495c6eSApple OSS Distributions int retval;
1681*4d495c6eSApple OSS Distributions int orig_nfiles = 0;
1682*4d495c6eSApple OSS Distributions struct proc_fdinfo * fd_info = NULL;
1683*4d495c6eSApple OSS Distributions
1684*4d495c6eSApple OSS Distributions T_LOG("Test to verify PROC_PIDLISTFDS returns sane number of open files");
1685*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, getpid(), PROC_PIDLISTFDS, (uint32_t)0, (user_addr_t)0, (uint32_t)0);
1686*4d495c6eSApple OSS Distributions orig_nfiles = retval / (int)sizeof(struct proc_fdinfo);
1687*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT(orig_nfiles, CONF_OPN_FILE_COUNT, "The number of open files is lower than expected.");
1688*4d495c6eSApple OSS Distributions
1689*4d495c6eSApple OSS Distributions /*
1690*4d495c6eSApple OSS Distributions * Allocate a buffer of expected size + 1 to ensure that
1691*4d495c6eSApple OSS Distributions * the API still returns expected size
1692*4d495c6eSApple OSS Distributions * i.e. 3 + 1 = 4 open fds
1693*4d495c6eSApple OSS Distributions */
1694*4d495c6eSApple OSS Distributions T_LOG("Test to verify PROC_PIDLISTFDS returns valid fd information");
1695*4d495c6eSApple OSS Distributions fd_info = malloc(sizeof(*fd_info) * 5);
1696*4d495c6eSApple OSS Distributions tmp_fd = CONF_TMP_FILE_OPEN(NULL);
1697*4d495c6eSApple OSS Distributions T_LOG("tmp_fd val:%d", tmp_fd);
1698*4d495c6eSApple OSS Distributions T_QUIET;
1699*4d495c6eSApple OSS Distributions T_EXPECT_POSIX_SUCCESS(tmp_fd, "open() for PROC_PIDLISTFDS");
1700*4d495c6eSApple OSS Distributions
1701*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, getpid(), PROC_PIDLISTFDS, (uint32_t)0, (user_addr_t)fd_info,
1702*4d495c6eSApple OSS Distributions (uint32_t)(sizeof(*fd_info) * 5));
1703*4d495c6eSApple OSS Distributions retval = retval / (int)sizeof(struct proc_fdinfo);
1704*4d495c6eSApple OSS Distributions
1705*4d495c6eSApple OSS Distributions close(tmp_fd);
1706*4d495c6eSApple OSS Distributions
1707*4d495c6eSApple OSS Distributions for (int i = 0; i < retval; i++) {
1708*4d495c6eSApple OSS Distributions /*
1709*4d495c6eSApple OSS Distributions * Check only for the fd that we control.
1710*4d495c6eSApple OSS Distributions */
1711*4d495c6eSApple OSS Distributions if (tmp_fd != fd_info[i].proc_fd) {
1712*4d495c6eSApple OSS Distributions continue;
1713*4d495c6eSApple OSS Distributions }
1714*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(fd_info[i].proc_fdtype, (unsigned int)PROX_FDTYPE_VNODE, "Correct proc_fdtype for returned fd");
1715*4d495c6eSApple OSS Distributions }
1716*4d495c6eSApple OSS Distributions
1717*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT(retval, 4, "Correct number of fds was returned.");
1718*4d495c6eSApple OSS Distributions
1719*4d495c6eSApple OSS Distributions tmp_fd = -1;
1720*4d495c6eSApple OSS Distributions free(fd_info);
1721*4d495c6eSApple OSS Distributions fd_info = NULL;
1722*4d495c6eSApple OSS Distributions }
1723*4d495c6eSApple OSS Distributions
1724*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidpathinfo,
1725*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDPATHINFO returns valid information about the process",
1726*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1727*4d495c6eSApple OSS Distributions {
1728*4d495c6eSApple OSS Distributions char * pid_path = NULL;
1729*4d495c6eSApple OSS Distributions pid_path = malloc(sizeof(char) * PROC_PIDPATHINFO_MAXSIZE);
1730*4d495c6eSApple OSS Distributions T_EXPECT_NOTNULL(pid_path, "malloc for PROC_PIDPATHINFO");
1731*4d495c6eSApple OSS Distributions int retval = __proc_info(PROC_INFO_CALL_PIDINFO, getpid(), PROC_PIDPATHINFO, (uint64_t)0, (user_addr_t)pid_path,
1732*4d495c6eSApple OSS Distributions (uint32_t)PROC_PIDPATHINFO_MAXSIZE);
1733*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(retval, 0, "__proc_info call for PROC_PIDPATHINFO");
1734*4d495c6eSApple OSS Distributions
1735*4d495c6eSApple OSS Distributions T_EXPECT_NE_PTR((void *)(strcasestr(pid_path, CONF_CMD_NAME)), NULL, "PROC_PIDPATHINFOreturns valid value for pid_path");
1736*4d495c6eSApple OSS Distributions free(pid_path);
1737*4d495c6eSApple OSS Distributions pid_path = NULL;
1738*4d495c6eSApple OSS Distributions }
1739*4d495c6eSApple OSS Distributions
1740*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidlistfileports,
1741*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDLISTFILEPORTS returns valid information about the process",
1742*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1743*4d495c6eSApple OSS Distributions {
1744*4d495c6eSApple OSS Distributions struct proc_fileportinfo * fileport_info = NULL;
1745*4d495c6eSApple OSS Distributions mach_port_t tmp_file_port = MACH_PORT_NULL;
1746*4d495c6eSApple OSS Distributions proc_config_t proc_config = spawn_child_processes(1, proc_info_call_pidinfo_handler);
1747*4d495c6eSApple OSS Distributions int child_pid = proc_config->child_pids[0];
1748*4d495c6eSApple OSS Distributions
1749*4d495c6eSApple OSS Distributions /*
1750*4d495c6eSApple OSS Distributions * Create a file port
1751*4d495c6eSApple OSS Distributions */
1752*4d495c6eSApple OSS Distributions tmp_fd = CONF_TMP_FILE_OPEN(NULL);
1753*4d495c6eSApple OSS Distributions int retval = fileport_makeport(tmp_fd, &tmp_file_port);
1754*4d495c6eSApple OSS Distributions T_EXPECT_POSIX_SUCCESS(retval, "fileport_makeport() for PROC_PIDLISTFILEPORTS");
1755*4d495c6eSApple OSS Distributions
1756*4d495c6eSApple OSS Distributions /*
1757*4d495c6eSApple OSS Distributions * Like the other APIs, this returns the actual count + 20. Hence we expect it to be atleast 1 (that we created)
1758*4d495c6eSApple OSS Distributions */
1759*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, getpid(), PROC_PIDLISTFILEPORTS, (uint64_t)0, (user_addr_t)0, (uint32_t)0);
1760*4d495c6eSApple OSS Distributions T_EXPECT_GE_INT(retval / (int)sizeof(fileport_info), 1,
1761*4d495c6eSApple OSS Distributions "__proc_info call for PROC_PIDLISTFILEPORTS to get total ports in parent");
1762*4d495c6eSApple OSS Distributions
1763*4d495c6eSApple OSS Distributions /*
1764*4d495c6eSApple OSS Distributions * Child doesn't have any fileports, should return zero
1765*4d495c6eSApple OSS Distributions */
1766*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, child_pid, PROC_PIDLISTFILEPORTS, (uint64_t)0, (user_addr_t)0, (uint32_t)0);
1767*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(retval / (int)sizeof(fileport_info), 0,
1768*4d495c6eSApple OSS Distributions "__proc_info call for PROC_PIDLISTFILEPORTS to get total ports in child");
1769*4d495c6eSApple OSS Distributions
1770*4d495c6eSApple OSS Distributions fileport_info = malloc(sizeof(*fileport_info) * (size_t)retval);
1771*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, getpid(), PROC_PIDLISTFILEPORTS, (uint64_t)0, (user_addr_t)fileport_info,
1772*4d495c6eSApple OSS Distributions (uint32_t)sizeof(*fileport_info));
1773*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(retval, (int)sizeof(*fileport_info), "__proc_info call for PROC_PIDLISTFILEPORTS");
1774*4d495c6eSApple OSS Distributions
1775*4d495c6eSApple OSS Distributions T_EXPECT_NE_UINT(fileport_info->proc_fileport, (uint32_t)0, "PROC_PIDLISTFILEPORTS returns valid value for proc_fileport");
1776*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(fileport_info->proc_fdtype, (uint32_t)PROX_FDTYPE_VNODE,
1777*4d495c6eSApple OSS Distributions "PROC_PIDLISTFILEPORTS returns valid value for proc_fdtype");
1778*4d495c6eSApple OSS Distributions
1779*4d495c6eSApple OSS Distributions /*
1780*4d495c6eSApple OSS Distributions * Cleanup for the fileport
1781*4d495c6eSApple OSS Distributions */
1782*4d495c6eSApple OSS Distributions mach_port_deallocate(mach_task_self(), tmp_file_port);
1783*4d495c6eSApple OSS Distributions tmp_file_port = MACH_PORT_NULL;
1784*4d495c6eSApple OSS Distributions free(fileport_info);
1785*4d495c6eSApple OSS Distributions fileport_info = NULL;
1786*4d495c6eSApple OSS Distributions close(tmp_fd);
1787*4d495c6eSApple OSS Distributions tmp_fd = -1;
1788*4d495c6eSApple OSS Distributions free_proc_config(proc_config);
1789*4d495c6eSApple OSS Distributions }
1790*4d495c6eSApple OSS Distributions
1791*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidcoalitioninfo,
1792*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDCOALITIONINFO returns valid information about the process",
1793*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1794*4d495c6eSApple OSS Distributions {
1795*4d495c6eSApple OSS Distributions proc_config_t proc_config = spawn_child_processes(1, proc_info_call_pidinfo_handler);
1796*4d495c6eSApple OSS Distributions int child_pid = proc_config->child_pids[0];
1797*4d495c6eSApple OSS Distributions
1798*4d495c6eSApple OSS Distributions struct proc_pidcoalitioninfo pci_parent;
1799*4d495c6eSApple OSS Distributions struct proc_pidcoalitioninfo pci_child;
1800*4d495c6eSApple OSS Distributions int retval = __proc_info(PROC_INFO_CALL_PIDINFO, getpid(), PROC_PIDCOALITIONINFO, (uint64_t)0, (user_addr_t)&pci_parent,
1801*4d495c6eSApple OSS Distributions (uint32_t)sizeof(pci_parent));
1802*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(retval, (int)sizeof(pci_parent), "__proc_info call for PROC_PIDCOALITIONINFO (parent)");
1803*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, child_pid, PROC_PIDCOALITIONINFO, (uint64_t)0, (user_addr_t)&pci_child,
1804*4d495c6eSApple OSS Distributions (uint32_t)sizeof(pci_child));
1805*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(retval, (int)sizeof(pci_child), "__proc_info call for PROC_PIDCOALITIONINFO (child)");
1806*4d495c6eSApple OSS Distributions
1807*4d495c6eSApple OSS Distributions /*
1808*4d495c6eSApple OSS Distributions * Coalition IDs should match for child and parent
1809*4d495c6eSApple OSS Distributions */
1810*4d495c6eSApple OSS Distributions for (int i = 0; i < COALITION_NUM_TYPES; i++) {
1811*4d495c6eSApple OSS Distributions T_EXPECT_EQ_ULLONG(pci_parent.coalition_id[i], pci_child.coalition_id[i],
1812*4d495c6eSApple OSS Distributions "PROC_PIDCOALITIONINFO returns valid value for coalition_id");
1813*4d495c6eSApple OSS Distributions }
1814*4d495c6eSApple OSS Distributions
1815*4d495c6eSApple OSS Distributions free_proc_config(proc_config);
1816*4d495c6eSApple OSS Distributions }
1817*4d495c6eSApple OSS Distributions
1818*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidworkqueueinfo,
1819*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDWORKQUEUEINFO returns valid information about the process",
1820*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1821*4d495c6eSApple OSS Distributions {
1822*4d495c6eSApple OSS Distributions proc_config_t proc_config = spawn_child_processes(1, proc_info_call_pidinfo_handler);
1823*4d495c6eSApple OSS Distributions int child_pid = proc_config->child_pids[0];
1824*4d495c6eSApple OSS Distributions send_action_to_child_processes(proc_config, ACT_PHASE5);
1825*4d495c6eSApple OSS Distributions
1826*4d495c6eSApple OSS Distributions struct proc_workqueueinfo pwqinfo;
1827*4d495c6eSApple OSS Distributions usleep(10000);
1828*4d495c6eSApple OSS Distributions int retval = __proc_info(PROC_INFO_CALL_PIDINFO, child_pid, PROC_PIDWORKQUEUEINFO, (uint64_t)0, (user_addr_t)&pwqinfo,
1829*4d495c6eSApple OSS Distributions (uint32_t)sizeof(pwqinfo));
1830*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(retval, (int)sizeof(pwqinfo), "__proc_info call for PROC_PIDWORKQUEUEINFO");
1831*4d495c6eSApple OSS Distributions
1832*4d495c6eSApple OSS Distributions int ncpu = 0;
1833*4d495c6eSApple OSS Distributions size_t ncpu_size = sizeof(ncpu);
1834*4d495c6eSApple OSS Distributions retval = sysctlbyname("hw.ncpu", (void *)&ncpu, &ncpu_size, NULL, 0);
1835*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(retval, 0, "sysctl() for PROC_PIDWORKQUEUEINFO");
1836*4d495c6eSApple OSS Distributions T_EXPECT_GE_UINT(pwqinfo.pwq_nthreads, (uint32_t)1, "PROC_PIDWORKQUEUEINFO returns valid value for pwq_nthreads");
1837*4d495c6eSApple OSS Distributions T_EXPECT_GE_UINT(pwqinfo.pwq_blockedthreads + pwqinfo.pwq_runthreads, (uint32_t)1,
1838*4d495c6eSApple OSS Distributions "PROC_PIDWORKQUEUEINFO returns valid value for pwqinfo.pwq_runthreads/pwq_blockedthreads");
1839*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(pwqinfo.pwq_state, (uint32_t)0, "PROC_PIDWORKQUEUEINFO returns valid value for pwq_state");
1840*4d495c6eSApple OSS Distributions
1841*4d495c6eSApple OSS Distributions kill_child_processes(proc_config);
1842*4d495c6eSApple OSS Distributions free_proc_config(proc_config);
1843*4d495c6eSApple OSS Distributions }
1844*4d495c6eSApple OSS Distributions T_DECL(proc_info_proc_pidnoteexit,
1845*4d495c6eSApple OSS Distributions "Test to verify PROC_PIDNOTEEXIT returns valid information about the process",
1846*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1847*4d495c6eSApple OSS Distributions {
1848*4d495c6eSApple OSS Distributions /*
1849*4d495c6eSApple OSS Distributions * Ask the child to close pipe and quit, cleanup pipes for parent
1850*4d495c6eSApple OSS Distributions */
1851*4d495c6eSApple OSS Distributions proc_config_t proc_config = spawn_child_processes(1, proc_info_call_pidinfo_handler);
1852*4d495c6eSApple OSS Distributions int child_pid = proc_config->child_pids[0];
1853*4d495c6eSApple OSS Distributions send_action_to_child_processes(proc_config, ACT_EXIT);
1854*4d495c6eSApple OSS Distributions
1855*4d495c6eSApple OSS Distributions uint32_t exit_data = 0;
1856*4d495c6eSApple OSS Distributions int retval = __proc_info(PROC_INFO_CALL_PIDINFO, child_pid, PROC_PIDNOTEEXIT, (uint64_t)(NOTE_EXITSTATUS | NOTE_EXIT_DETAIL),
1857*4d495c6eSApple OSS Distributions (user_addr_t)&exit_data, (uint32_t)sizeof(exit_data));
1858*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(retval, (int)sizeof(exit_data), "__proc_info call for PROC_PIDNOTEEXIT");
1859*4d495c6eSApple OSS Distributions
1860*4d495c6eSApple OSS Distributions T_EXPECT_EQ_UINT(exit_data, 0U, "PROC_PIDNOTEEXIT returned valid value for exit_data");
1861*4d495c6eSApple OSS Distributions
1862*4d495c6eSApple OSS Distributions free_proc_config(proc_config);
1863*4d495c6eSApple OSS Distributions }
1864*4d495c6eSApple OSS Distributions
1865*4d495c6eSApple OSS Distributions T_DECL(proc_info_negative_tests,
1866*4d495c6eSApple OSS Distributions "Test to validate PROC_INFO_CALL_PIDINFO for invalid arguments",
1867*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED)
1868*4d495c6eSApple OSS Distributions {
1869*4d495c6eSApple OSS Distributions proc_config_t proc_config = spawn_child_processes(1, proc_info_call_pidinfo_handler);
1870*4d495c6eSApple OSS Distributions int child_pid = proc_config->child_pids[0];
1871*4d495c6eSApple OSS Distributions uint32_t exit_data = 0;
1872*4d495c6eSApple OSS Distributions
1873*4d495c6eSApple OSS Distributions int retval =
1874*4d495c6eSApple OSS Distributions __proc_info(PROC_INFO_CALL_PIDINFO, child_pid, PROC_PIDNOTEEXIT, (uint64_t)0, (user_addr_t)&exit_data, (uint32_t)0);
1875*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(errno, ENOMEM, "PROC_INFO_CALL_PIDINFO call should fail with ENOMEM if buffersize is zero");
1876*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, child_pid, PROC_PIDPATHINFO, (uint64_t)0, (user_addr_t)&exit_data,
1877*4d495c6eSApple OSS Distributions (uint32_t)PROC_PIDPATHINFO_MAXSIZE + 1);
1878*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(errno, EOVERFLOW,
1879*4d495c6eSApple OSS Distributions "PROC_INFO_CALL_PIDINFO call should fail with EOVERFLOW if buffersize is larger than PROC_PIDPATHINFO_MAXSIZE");
1880*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, -1, PROC_PIDNOTEEXIT, (uint64_t)0, (user_addr_t)&exit_data,
1881*4d495c6eSApple OSS Distributions (uint32_t)sizeof(exit_data));
1882*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(errno, ESRCH, "PROC_INFO_CALL_PIDINFO call should fail with ESRCH for invalid process id");
1883*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, child_pid, -1U, (uint64_t)0, (user_addr_t)&exit_data, (uint32_t)sizeof(exit_data));
1884*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(errno, EINVAL, "PROC_INFO_CALL_PIDINFO call should fail with EINVAL for invalid flavor");
1885*4d495c6eSApple OSS Distributions retval = __proc_info(PROC_INFO_CALL_PIDINFO, 0, PROC_PIDWORKQUEUEINFO, (uint64_t)0, (user_addr_t)0, (uint32_t)0);
1886*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(errno, EINVAL,
1887*4d495c6eSApple OSS Distributions "PROC_INFO_CALL_PIDINFO call should fail with EINVAL if flavor is PROC_PIDWORKQUEUEINFO and pid=0");
1888*4d495c6eSApple OSS Distributions
1889*4d495c6eSApple OSS Distributions free_proc_config(proc_config);
1890*4d495c6eSApple OSS Distributions }
1891*4d495c6eSApple OSS Distributions
1892*4d495c6eSApple OSS Distributions /*
1893*4d495c6eSApple OSS Distributions * END PROC_INFO_CALL_PIDINFO DECLs
1894*4d495c6eSApple OSS Distributions */
1895*4d495c6eSApple OSS Distributions
1896*4d495c6eSApple OSS Distributions #pragma mark proc_list_uptrs
1897*4d495c6eSApple OSS Distributions
1898*4d495c6eSApple OSS Distributions #define NUPTRS 4
1899*4d495c6eSApple OSS Distributions static uint64_t uptrs[NUPTRS] = {0x1122334455667788ULL, 0x99aabbccddeeff00ULL, 0xaabbaaddccaaffeeULL, 0xcc000011ccaa7755ULL};
1900*4d495c6eSApple OSS Distributions
1901*4d495c6eSApple OSS Distributions static const char * uptr_names[NUPTRS];
1902*4d495c6eSApple OSS Distributions
1903*4d495c6eSApple OSS Distributions static void
print_uptrs(int argc,char * const * argv)1904*4d495c6eSApple OSS Distributions print_uptrs(int argc, char * const * argv)
1905*4d495c6eSApple OSS Distributions {
1906*4d495c6eSApple OSS Distributions for (int i = 0; i < argc; i++) {
1907*4d495c6eSApple OSS Distributions char * end;
1908*4d495c6eSApple OSS Distributions unsigned long pid = strtoul(argv[i], &end, 0);
1909*4d495c6eSApple OSS Distributions if (pid > INT_MAX) {
1910*4d495c6eSApple OSS Distributions printf("error: pid '%lu' would overflow an integer\n", pid);
1911*4d495c6eSApple OSS Distributions }
1912*4d495c6eSApple OSS Distributions if (end == argv[i]) {
1913*4d495c6eSApple OSS Distributions printf("error: could not parse '%s' as a pid\n", argv[i]);
1914*4d495c6eSApple OSS Distributions continue;
1915*4d495c6eSApple OSS Distributions }
1916*4d495c6eSApple OSS Distributions int uptrs_count = proc_list_uptrs((int)pid, NULL, 0);
1917*4d495c6eSApple OSS Distributions if (uptrs_count == 0) {
1918*4d495c6eSApple OSS Distributions printf("no uptrs for process %d\n", (int)pid);
1919*4d495c6eSApple OSS Distributions return;
1920*4d495c6eSApple OSS Distributions }
1921*4d495c6eSApple OSS Distributions
1922*4d495c6eSApple OSS Distributions /* extra space */
1923*4d495c6eSApple OSS Distributions unsigned int uptrs_len = (unsigned int)uptrs_count + 32;
1924*4d495c6eSApple OSS Distributions
1925*4d495c6eSApple OSS Distributions uint64_t * uptrs_alloc = malloc(sizeof(uint64_t) * uptrs_len);
1926*4d495c6eSApple OSS Distributions os_assert(uptrs_alloc != NULL);
1927*4d495c6eSApple OSS Distributions
1928*4d495c6eSApple OSS Distributions uptrs_count = proc_list_uptrs((int)pid, uptrs_alloc, (uint32_t)(sizeof(uint64_t) * uptrs_len));
1929*4d495c6eSApple OSS Distributions printf("process %d has %d uptrs:\n", (int)pid, uptrs_count);
1930*4d495c6eSApple OSS Distributions if (uptrs_count > (int)uptrs_len) {
1931*4d495c6eSApple OSS Distributions uptrs_count = (int)uptrs_len;
1932*4d495c6eSApple OSS Distributions }
1933*4d495c6eSApple OSS Distributions for (int j = 0; j < uptrs_count; j++) {
1934*4d495c6eSApple OSS Distributions printf("%#17" PRIx64 "\n", uptrs_alloc[j]);
1935*4d495c6eSApple OSS Distributions }
1936*4d495c6eSApple OSS Distributions }
1937*4d495c6eSApple OSS Distributions }
1938*4d495c6eSApple OSS Distributions
1939*4d495c6eSApple OSS Distributions T_DECL(proc_list_uptrs, "the kernel should return any up-pointers it knows about", T_META_TAG_VM_PREFERRED)
1940*4d495c6eSApple OSS Distributions {
1941*4d495c6eSApple OSS Distributions if (argc > 0) {
1942*4d495c6eSApple OSS Distributions print_uptrs(argc, argv);
1943*4d495c6eSApple OSS Distributions T_SKIP("command line invocation of tool, not test");
1944*4d495c6eSApple OSS Distributions }
1945*4d495c6eSApple OSS Distributions
1946*4d495c6eSApple OSS Distributions unsigned int cur_uptr = 0;
1947*4d495c6eSApple OSS Distributions
1948*4d495c6eSApple OSS Distributions int kq = kqueue();
1949*4d495c6eSApple OSS Distributions T_QUIET;
1950*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(kq, "kqueue");
1951*4d495c6eSApple OSS Distributions
1952*4d495c6eSApple OSS Distributions /*
1953*4d495c6eSApple OSS Distributions * Should find uptrs on file-type knotes and generic knotes (two
1954*4d495c6eSApple OSS Distributions * different search locations, internally).
1955*4d495c6eSApple OSS Distributions */
1956*4d495c6eSApple OSS Distributions struct kevent64_s events[2];
1957*4d495c6eSApple OSS Distributions memset(events, 0, sizeof(events));
1958*4d495c6eSApple OSS Distributions
1959*4d495c6eSApple OSS Distributions uptr_names[cur_uptr] = "kqueue file-backed knote";
1960*4d495c6eSApple OSS Distributions events[0].filter = EVFILT_WRITE;
1961*4d495c6eSApple OSS Distributions events[0].ident = STDOUT_FILENO;
1962*4d495c6eSApple OSS Distributions events[0].flags = EV_ADD;
1963*4d495c6eSApple OSS Distributions events[0].udata = uptrs[cur_uptr++];
1964*4d495c6eSApple OSS Distributions
1965*4d495c6eSApple OSS Distributions uptr_names[cur_uptr] = "kqueue non-file-backed knote";
1966*4d495c6eSApple OSS Distributions events[1].filter = EVFILT_USER;
1967*4d495c6eSApple OSS Distributions events[1].ident = 1;
1968*4d495c6eSApple OSS Distributions events[1].flags = EV_ADD;
1969*4d495c6eSApple OSS Distributions events[1].udata = uptrs[cur_uptr++];
1970*4d495c6eSApple OSS Distributions
1971*4d495c6eSApple OSS Distributions int kev_err = kevent64(kq, events, sizeof(events) / sizeof(events[0]), NULL, 0, KEVENT_FLAG_IMMEDIATE, NULL);
1972*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(kev_err, "register events with kevent64");
1973*4d495c6eSApple OSS Distributions
1974*4d495c6eSApple OSS Distributions /*
1975*4d495c6eSApple OSS Distributions * Should find uptrs both on a kevent_id kqueue and in a workloop
1976*4d495c6eSApple OSS Distributions * kqueue's knote's udata field.
1977*4d495c6eSApple OSS Distributions */
1978*4d495c6eSApple OSS Distributions uptr_names[cur_uptr] = "dynamic kqueue non-file-backed knote";
1979*4d495c6eSApple OSS Distributions struct kevent_qos_s events_id[] = {{
1980*4d495c6eSApple OSS Distributions .filter = EVFILT_USER,
1981*4d495c6eSApple OSS Distributions .ident = 1,
1982*4d495c6eSApple OSS Distributions .flags = EV_ADD,
1983*4d495c6eSApple OSS Distributions .qos = (int)_pthread_qos_class_encode(QOS_CLASS_DEFAULT, 0, 0),
1984*4d495c6eSApple OSS Distributions .udata = uptrs[cur_uptr++]
1985*4d495c6eSApple OSS Distributions }};
1986*4d495c6eSApple OSS Distributions
1987*4d495c6eSApple OSS Distributions uptr_names[cur_uptr] = "dynamic kqueue ID";
1988*4d495c6eSApple OSS Distributions kev_err = kevent_id(uptrs[cur_uptr++], events_id, 1, NULL, 0, NULL, NULL, KEVENT_FLAG_WORKLOOP | KEVENT_FLAG_IMMEDIATE);
1989*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(kev_err, "register event with kevent_id");
1990*4d495c6eSApple OSS Distributions
1991*4d495c6eSApple OSS Distributions errno = 0;
1992*4d495c6eSApple OSS Distributions int uptrs_count = proc_list_uptrs(getpid(), NULL, 0);
1993*4d495c6eSApple OSS Distributions T_QUIET;
1994*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(uptrs_count, "proc_list_uptrs");
1995*4d495c6eSApple OSS Distributions T_QUIET;
1996*4d495c6eSApple OSS Distributions T_EXPECT_EQ(uptrs_count, NUPTRS, "should see correct number of up-pointers");
1997*4d495c6eSApple OSS Distributions
1998*4d495c6eSApple OSS Distributions uint64_t uptrs_obs[NUPTRS] = {0};
1999*4d495c6eSApple OSS Distributions uptrs_count = proc_list_uptrs(getpid(), uptrs_obs, sizeof(uptrs_obs));
2000*4d495c6eSApple OSS Distributions T_QUIET;
2001*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(uptrs_count, "proc_list_uptrs");
2002*4d495c6eSApple OSS Distributions
2003*4d495c6eSApple OSS Distributions for (int i = 0; i < uptrs_count; i++) {
2004*4d495c6eSApple OSS Distributions int found = -1;
2005*4d495c6eSApple OSS Distributions for (int j = 0; j < NUPTRS; j++) {
2006*4d495c6eSApple OSS Distributions if (uptrs_obs[i] == uptrs[j]) {
2007*4d495c6eSApple OSS Distributions found = j;
2008*4d495c6eSApple OSS Distributions goto next;
2009*4d495c6eSApple OSS Distributions }
2010*4d495c6eSApple OSS Distributions }
2011*4d495c6eSApple OSS Distributions T_FAIL("unexpected up-pointer found: %#" PRIx64, uptrs_obs[i]);
2012*4d495c6eSApple OSS Distributions next: ;
2013*4d495c6eSApple OSS Distributions if (found != -1) {
2014*4d495c6eSApple OSS Distributions T_PASS("found up-pointer for %s", uptr_names[found]);
2015*4d495c6eSApple OSS Distributions }
2016*4d495c6eSApple OSS Distributions }
2017*4d495c6eSApple OSS Distributions
2018*4d495c6eSApple OSS Distributions uint64_t up_overflow[2] = {0};
2019*4d495c6eSApple OSS Distributions uptrs_count = proc_list_uptrs(getpid(), up_overflow, sizeof(uint64_t) + 1);
2020*4d495c6eSApple OSS Distributions T_ASSERT_EQ(up_overflow[1], (uint64_t)0, "overflow check");
2021*4d495c6eSApple OSS Distributions }
2022*4d495c6eSApple OSS Distributions
2023*4d495c6eSApple OSS Distributions #pragma mark dynamic kqueue info
2024*4d495c6eSApple OSS Distributions
2025*4d495c6eSApple OSS Distributions #define EXPECTED_ID UINT64_C(0x1122334455667788)
2026*4d495c6eSApple OSS Distributions #define EXPECTED_UDATA UINT64_C(0x99aabbccddeeff00)
2027*4d495c6eSApple OSS Distributions #ifndef KQ_WORKLOOP
2028*4d495c6eSApple OSS Distributions #define KQ_WORKLOOP 0x80
2029*4d495c6eSApple OSS Distributions #endif
2030*4d495c6eSApple OSS Distributions
2031*4d495c6eSApple OSS Distributions static void
setup_kevent_id(kqueue_id_t id)2032*4d495c6eSApple OSS Distributions setup_kevent_id(kqueue_id_t id)
2033*4d495c6eSApple OSS Distributions {
2034*4d495c6eSApple OSS Distributions struct kevent_qos_s events_id[] = {{
2035*4d495c6eSApple OSS Distributions .filter = EVFILT_USER,
2036*4d495c6eSApple OSS Distributions .ident = 1,
2037*4d495c6eSApple OSS Distributions .flags = EV_ADD,
2038*4d495c6eSApple OSS Distributions .qos = (int)_pthread_qos_class_encode(QOS_CLASS_DEFAULT, 0, 0),
2039*4d495c6eSApple OSS Distributions .udata = EXPECTED_UDATA
2040*4d495c6eSApple OSS Distributions }};
2041*4d495c6eSApple OSS Distributions
2042*4d495c6eSApple OSS Distributions int err = kevent_id(id, events_id, 1, NULL, 0, NULL, NULL, KEVENT_FLAG_WORKLOOP | KEVENT_FLAG_IMMEDIATE);
2043*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(err, "register event with kevent_id");
2044*4d495c6eSApple OSS Distributions }
2045*4d495c6eSApple OSS Distributions
2046*4d495c6eSApple OSS Distributions static kqueue_id_t *
list_kqids(pid_t pid,int * nkqids_out)2047*4d495c6eSApple OSS Distributions list_kqids(pid_t pid, int * nkqids_out)
2048*4d495c6eSApple OSS Distributions {
2049*4d495c6eSApple OSS Distributions int kqids_len = 256;
2050*4d495c6eSApple OSS Distributions int nkqids;
2051*4d495c6eSApple OSS Distributions kqueue_id_t * kqids = NULL;
2052*4d495c6eSApple OSS Distributions uint32_t kqids_size;
2053*4d495c6eSApple OSS Distributions
2054*4d495c6eSApple OSS Distributions retry:
2055*4d495c6eSApple OSS Distributions if (os_mul_overflow(sizeof(kqueue_id_t), kqids_len, &kqids_size)) {
2056*4d495c6eSApple OSS Distributions T_QUIET;
2057*4d495c6eSApple OSS Distributions T_ASSERT_GT(kqids_len, PROC_PIDDYNKQUEUES_MAX, NULL);
2058*4d495c6eSApple OSS Distributions kqids_len = PROC_PIDDYNKQUEUES_MAX;
2059*4d495c6eSApple OSS Distributions goto retry;
2060*4d495c6eSApple OSS Distributions }
2061*4d495c6eSApple OSS Distributions if (!kqids) {
2062*4d495c6eSApple OSS Distributions kqids = malloc(kqids_size);
2063*4d495c6eSApple OSS Distributions T_QUIET;
2064*4d495c6eSApple OSS Distributions T_ASSERT_NOTNULL(kqids, "malloc(%" PRIu32 ")", kqids_size);
2065*4d495c6eSApple OSS Distributions }
2066*4d495c6eSApple OSS Distributions
2067*4d495c6eSApple OSS Distributions nkqids = proc_list_dynkqueueids(pid, kqids, kqids_size);
2068*4d495c6eSApple OSS Distributions if (nkqids > kqids_len && kqids_len < PROC_PIDDYNKQUEUES_MAX) {
2069*4d495c6eSApple OSS Distributions kqids_len *= 2;
2070*4d495c6eSApple OSS Distributions if (kqids_len > PROC_PIDDYNKQUEUES_MAX) {
2071*4d495c6eSApple OSS Distributions kqids_len = PROC_PIDDYNKQUEUES_MAX;
2072*4d495c6eSApple OSS Distributions }
2073*4d495c6eSApple OSS Distributions free(kqids);
2074*4d495c6eSApple OSS Distributions kqids = NULL;
2075*4d495c6eSApple OSS Distributions goto retry;
2076*4d495c6eSApple OSS Distributions }
2077*4d495c6eSApple OSS Distributions
2078*4d495c6eSApple OSS Distributions *nkqids_out = nkqids;
2079*4d495c6eSApple OSS Distributions return kqids;
2080*4d495c6eSApple OSS Distributions }
2081*4d495c6eSApple OSS Distributions
2082*4d495c6eSApple OSS Distributions T_DECL(list_dynamic_kqueues, "the kernel should list IDs of dynamic kqueues", T_META_ALL_VALID_ARCHS(true), T_META_TAG_VM_PREFERRED)
2083*4d495c6eSApple OSS Distributions {
2084*4d495c6eSApple OSS Distributions int nkqids;
2085*4d495c6eSApple OSS Distributions bool found = false;
2086*4d495c6eSApple OSS Distributions
2087*4d495c6eSApple OSS Distributions setup_kevent_id(EXPECTED_ID);
2088*4d495c6eSApple OSS Distributions kqueue_id_t * kqids = list_kqids(getpid(), &nkqids);
2089*4d495c6eSApple OSS Distributions T_ASSERT_GE(nkqids, 1, "at least one dynamic kqueue is listed");
2090*4d495c6eSApple OSS Distributions for (int i = 0; i < nkqids; i++) {
2091*4d495c6eSApple OSS Distributions if (kqids[i] == EXPECTED_ID) {
2092*4d495c6eSApple OSS Distributions found = true;
2093*4d495c6eSApple OSS Distributions T_PASS("found expected dynamic kqueue ID");
2094*4d495c6eSApple OSS Distributions } else {
2095*4d495c6eSApple OSS Distributions T_LOG("found another dynamic kqueue with ID %#" PRIx64, kqids[i]);
2096*4d495c6eSApple OSS Distributions }
2097*4d495c6eSApple OSS Distributions }
2098*4d495c6eSApple OSS Distributions
2099*4d495c6eSApple OSS Distributions if (!found) {
2100*4d495c6eSApple OSS Distributions T_FAIL("could not find dynamic ID of kqueue created");
2101*4d495c6eSApple OSS Distributions }
2102*4d495c6eSApple OSS Distributions
2103*4d495c6eSApple OSS Distributions free(kqids);
2104*4d495c6eSApple OSS Distributions }
2105*4d495c6eSApple OSS Distributions
2106*4d495c6eSApple OSS Distributions T_DECL(dynamic_kqueue_basic_info, "the kernel should report valid basic dynamic kqueue info", T_META_ALL_VALID_ARCHS(true), T_META_TAG_VM_PREFERRED)
2107*4d495c6eSApple OSS Distributions {
2108*4d495c6eSApple OSS Distributions struct kqueue_info kqinfo;
2109*4d495c6eSApple OSS Distributions int ret;
2110*4d495c6eSApple OSS Distributions
2111*4d495c6eSApple OSS Distributions setup_kevent_id(EXPECTED_ID);
2112*4d495c6eSApple OSS Distributions ret = proc_piddynkqueueinfo(getpid(), PROC_PIDDYNKQUEUE_INFO, EXPECTED_ID, &kqinfo, sizeof(kqinfo));
2113*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "proc_piddynkqueueinfo(... PROC_PIDDYNKQUEUE_INFO ...)");
2114*4d495c6eSApple OSS Distributions T_QUIET;
2115*4d495c6eSApple OSS Distributions T_ASSERT_GE(ret, (int)sizeof(kqinfo), "PROC_PIDDYNKQUEUE_INFO should return the right size");
2116*4d495c6eSApple OSS Distributions
2117*4d495c6eSApple OSS Distributions T_EXPECT_NE(kqinfo.kq_state & KQ_WORKLOOP, 0U, "kqueue info should be for a workloop kqueue");
2118*4d495c6eSApple OSS Distributions T_EXPECT_EQ(kqinfo.kq_stat.vst_ino, EXPECTED_ID, "inode field should be the kqueue's ID");
2119*4d495c6eSApple OSS Distributions }
2120*4d495c6eSApple OSS Distributions
2121*4d495c6eSApple OSS Distributions T_DECL(dynamic_kqueue_extended_info, "the kernel should report valid extended dynamic kqueue info", T_META_ALL_VALID_ARCHS(true), T_META_TAG_VM_PREFERRED)
2122*4d495c6eSApple OSS Distributions {
2123*4d495c6eSApple OSS Distributions struct kevent_extinfo kqextinfo[1];
2124*4d495c6eSApple OSS Distributions int ret;
2125*4d495c6eSApple OSS Distributions
2126*4d495c6eSApple OSS Distributions setup_kevent_id(EXPECTED_ID);
2127*4d495c6eSApple OSS Distributions ret = proc_piddynkqueueinfo(getpid(), PROC_PIDDYNKQUEUE_EXTINFO, EXPECTED_ID, kqextinfo, sizeof(kqextinfo));
2128*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "proc_piddynkqueueinfo(... PROC_PIDDYNKQUEUE_EXTINFO ...)");
2129*4d495c6eSApple OSS Distributions T_QUIET;
2130*4d495c6eSApple OSS Distributions T_ASSERT_EQ(ret, 1, "PROC_PIDDYNKQUEUE_EXTINFO should return a single knote");
2131*4d495c6eSApple OSS Distributions
2132*4d495c6eSApple OSS Distributions T_EXPECT_EQ(kqextinfo[0].kqext_kev.ident, 1ULL, "kevent identifier matches what was configured");
2133*4d495c6eSApple OSS Distributions T_EXPECT_EQ(kqextinfo[0].kqext_kev.filter, (short)EVFILT_USER, "kevent filter matches what was configured");
2134*4d495c6eSApple OSS Distributions T_EXPECT_EQ(kqextinfo[0].kqext_kev.udata, EXPECTED_UDATA, "kevent udata matches what was configured");
2135*4d495c6eSApple OSS Distributions }
2136*4d495c6eSApple OSS Distributions
2137*4d495c6eSApple OSS Distributions #pragma mark proc_listpids
2138*4d495c6eSApple OSS Distributions
2139*4d495c6eSApple OSS Distributions T_DECL(list_kdebug_pids, "the kernel should report processes that are filtered by kdebug",
2140*4d495c6eSApple OSS Distributions T_META_ASROOT(YES), T_META_RUN_CONCURRENTLY(false), T_META_TAG_VM_PREFERRED)
2141*4d495c6eSApple OSS Distributions {
2142*4d495c6eSApple OSS Distributions int mib[4] = {CTL_KERN, KERN_KDEBUG};
2143*4d495c6eSApple OSS Distributions int npids;
2144*4d495c6eSApple OSS Distributions int pids[1];
2145*4d495c6eSApple OSS Distributions int ret;
2146*4d495c6eSApple OSS Distributions kd_regtype reg;
2147*4d495c6eSApple OSS Distributions size_t regsize = sizeof(reg);
2148*4d495c6eSApple OSS Distributions
2149*4d495c6eSApple OSS Distributions mib[2] = KERN_KDREMOVE;
2150*4d495c6eSApple OSS Distributions ret = sysctl(mib, 3, NULL, NULL, NULL, 0);
2151*4d495c6eSApple OSS Distributions T_QUIET;
2152*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "KERN_KDREMOVE sysctl");
2153*4d495c6eSApple OSS Distributions
2154*4d495c6eSApple OSS Distributions mib[2] = KERN_KDSETBUF;
2155*4d495c6eSApple OSS Distributions mib[3] = 100000;
2156*4d495c6eSApple OSS Distributions ret = sysctl(mib, 4, NULL, NULL, NULL, 0);
2157*4d495c6eSApple OSS Distributions T_QUIET;
2158*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "KERN_KDSETBUF sysctl");
2159*4d495c6eSApple OSS Distributions
2160*4d495c6eSApple OSS Distributions mib[2] = KERN_KDSETUP;
2161*4d495c6eSApple OSS Distributions ret = sysctl(mib, 3, NULL, NULL, NULL, 0);
2162*4d495c6eSApple OSS Distributions T_QUIET;
2163*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "KERN_KDSETUP sysctl");
2164*4d495c6eSApple OSS Distributions
2165*4d495c6eSApple OSS Distributions npids = proc_listpids(PROC_KDBG_ONLY, 0, pids, sizeof(pids));
2166*4d495c6eSApple OSS Distributions T_EXPECT_EQ(npids, 0, "no processes should be filtered initially");
2167*4d495c6eSApple OSS Distributions
2168*4d495c6eSApple OSS Distributions reg.type = KDBG_TYPENONE;
2169*4d495c6eSApple OSS Distributions reg.value1 = (unsigned int)getpid();
2170*4d495c6eSApple OSS Distributions reg.value2 = 1; /* set the pid in the filter */
2171*4d495c6eSApple OSS Distributions mib[2] = KERN_KDPIDTR;
2172*4d495c6eSApple OSS Distributions ret = sysctl(mib, 3, ®, ®size, NULL, 0);
2173*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "KERN_KDPIDTR sysctl to set a pid in the filter");
2174*4d495c6eSApple OSS Distributions
2175*4d495c6eSApple OSS Distributions npids = proc_listpids(PROC_KDBG_ONLY, 0, pids, sizeof(pids));
2176*4d495c6eSApple OSS Distributions npids /= 4;
2177*4d495c6eSApple OSS Distributions T_EXPECT_EQ(npids, 1, "a process should be filtered");
2178*4d495c6eSApple OSS Distributions T_EXPECT_EQ(pids[0], getpid(), "process filtered should be the one that was set");
2179*4d495c6eSApple OSS Distributions
2180*4d495c6eSApple OSS Distributions mib[2] = KERN_KDREMOVE;
2181*4d495c6eSApple OSS Distributions ret = sysctl(mib, 3, NULL, NULL, NULL, 0);
2182*4d495c6eSApple OSS Distributions T_QUIET;
2183*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "KERN_KDREMOVE sysctl");
2184*4d495c6eSApple OSS Distributions }
2185*4d495c6eSApple OSS Distributions
2186*4d495c6eSApple OSS Distributions #pragma mark misc
2187*4d495c6eSApple OSS Distributions
2188*4d495c6eSApple OSS Distributions static int prf_fd;
2189*4d495c6eSApple OSS Distributions static char prf_path[PATH_MAX];
2190*4d495c6eSApple OSS Distributions static void
prf_end(void)2191*4d495c6eSApple OSS Distributions prf_end(void)
2192*4d495c6eSApple OSS Distributions {
2193*4d495c6eSApple OSS Distributions close(prf_fd);
2194*4d495c6eSApple OSS Distributions unlink(prf_path);
2195*4d495c6eSApple OSS Distributions }
2196*4d495c6eSApple OSS Distributions
2197*4d495c6eSApple OSS Distributions T_DECL(proc_regionfilename, "proc_regionfilename() should work", T_META_TAG_VM_PREFERRED)
2198*4d495c6eSApple OSS Distributions {
2199*4d495c6eSApple OSS Distributions static char expected[] = "'very rigorous maritime engineering standards' && the front fell off";
2200*4d495c6eSApple OSS Distributions static char real[sizeof(expected)];
2201*4d495c6eSApple OSS Distributions int rc;
2202*4d495c6eSApple OSS Distributions void *addr;
2203*4d495c6eSApple OSS Distributions
2204*4d495c6eSApple OSS Distributions prf_fd = CONF_TMP_FILE_OPEN(prf_path);
2205*4d495c6eSApple OSS Distributions T_ATEND(prf_end);
2206*4d495c6eSApple OSS Distributions
2207*4d495c6eSApple OSS Distributions rc = (int) write(prf_fd, expected, sizeof(expected));
2208*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(rc, "write to tmpfile");
2209*4d495c6eSApple OSS Distributions
2210*4d495c6eSApple OSS Distributions addr = mmap(0, 0x1000, PROT_READ, MAP_PRIVATE, prf_fd, 0);
2211*4d495c6eSApple OSS Distributions T_WITH_ERRNO;
2212*4d495c6eSApple OSS Distributions T_ASSERT_NE_PTR(addr, MAP_FAILED, "mmap of tmpfile");
2213*4d495c6eSApple OSS Distributions
2214*4d495c6eSApple OSS Distributions T_WITH_ERRNO;
2215*4d495c6eSApple OSS Distributions T_ASSERT_GT(proc_regionfilename(getpid(), (uint64_t) addr, real, MAXPATHLEN), 0, "proc_regionfilename");
2216*4d495c6eSApple OSS Distributions T_EXPECT_EQ_STR(basename(prf_path), basename(real), "filename");
2217*4d495c6eSApple OSS Distributions }
2218*4d495c6eSApple OSS Distributions
2219*4d495c6eSApple OSS Distributions T_DECL(proc_regionpath, "PROC_PIDREGIONPATH should return addr, length and path", T_META_TAG_VM_PREFERRED)
2220*4d495c6eSApple OSS Distributions {
2221*4d495c6eSApple OSS Distributions int rc;
2222*4d495c6eSApple OSS Distributions struct proc_regionpath path;
2223*4d495c6eSApple OSS Distributions static char some_text[] = "'very rigorous maritime engineering standards' && the front fell off";
2224*4d495c6eSApple OSS Distributions unsigned long rounded_length = (sizeof(some_text) & (unsigned long) ~(PAGE_SIZE - 1)) + PAGE_SIZE;
2225*4d495c6eSApple OSS Distributions void *addr;
2226*4d495c6eSApple OSS Distributions
2227*4d495c6eSApple OSS Distributions prf_fd = CONF_TMP_FILE_OPEN(prf_path);
2228*4d495c6eSApple OSS Distributions T_ATEND(prf_end);
2229*4d495c6eSApple OSS Distributions
2230*4d495c6eSApple OSS Distributions rc = (int) write(prf_fd, some_text, sizeof(some_text));
2231*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(rc, "write to tmpfile");
2232*4d495c6eSApple OSS Distributions
2233*4d495c6eSApple OSS Distributions addr = mmap(0, PAGE_SIZE, PROT_READ, MAP_PRIVATE, prf_fd, 0);
2234*4d495c6eSApple OSS Distributions T_WITH_ERRNO;
2235*4d495c6eSApple OSS Distributions T_ASSERT_NE_PTR(addr, MAP_FAILED, "mmap of tmpfile");
2236*4d495c6eSApple OSS Distributions
2237*4d495c6eSApple OSS Distributions rc = proc_pidinfo(getpid(), PROC_PIDREGIONPATH, (uint64_t)addr, &path, sizeof(struct proc_regionpath));
2238*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(rc, "proc_pidinfo");
2239*4d495c6eSApple OSS Distributions
2240*4d495c6eSApple OSS Distributions T_ASSERT_EQ((unsigned long) path.prpo_regionlength, rounded_length, "regionlength must match");
2241*4d495c6eSApple OSS Distributions T_ASSERT_EQ_PTR((void *) path.prpo_addr, addr, "addr must match");
2242*4d495c6eSApple OSS Distributions
2243*4d495c6eSApple OSS Distributions rc = proc_pidinfo(getpid(), PROC_PIDREGIONPATH, (uint64_t)((char *) addr + 20), &path, sizeof(struct proc_regionpath));
2244*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(rc, "proc_pidinfo 20 bytes past the base address");
2245*4d495c6eSApple OSS Distributions
2246*4d495c6eSApple OSS Distributions T_ASSERT_EQ((unsigned long) path.prpo_regionlength, rounded_length, "regionlength must match, even when 20 bytes past the base address");
2247*4d495c6eSApple OSS Distributions T_ASSERT_EQ_PTR((void *) path.prpo_addr, addr, "addr must match, even when 20 bytes past the base address");
2248*4d495c6eSApple OSS Distributions }
2249*4d495c6eSApple OSS Distributions
2250*4d495c6eSApple OSS Distributions #ifndef ARRAY_SIZE
2251*4d495c6eSApple OSS Distributions #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
2252*4d495c6eSApple OSS Distributions #endif
2253*4d495c6eSApple OSS Distributions T_DECL(proc_pidinfo_kernel_task_fail, "calling proc_pidinfo for certain flavors on the kernel task should fail",
2254*4d495c6eSApple OSS Distributions T_META_ASROOT(YES), T_META_TAG_VM_PREFERRED)
2255*4d495c6eSApple OSS Distributions {
2256*4d495c6eSApple OSS Distributions int flavors[] = {PROC_PIDREGIONPATH, PROC_PIDREGIONINFO, PROC_PIDREGIONPATHINFO, PROC_PIDREGIONPATHINFO2, PROC_PIDREGIONPATHINFO3};
2257*4d495c6eSApple OSS Distributions for (int f = 0; f < ARRAY_SIZE(flavors); f++) {
2258*4d495c6eSApple OSS Distributions int rc = proc_pidinfo(0, flavors[f], 0, 0, 0);
2259*4d495c6eSApple OSS Distributions T_ASSERT_EQ(rc, 0, "proc_pidinfo returned %d for flavor %d", rc, flavors[f]);
2260*4d495c6eSApple OSS Distributions T_EXPECT_EQ_INT(errno, EPERM, "proc_pidinfo errno expected=%d actual=%d", EPERM, errno);
2261*4d495c6eSApple OSS Distributions }
2262*4d495c6eSApple OSS Distributions }
2263