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