1afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#include <errno.h>
2afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#include <fcntl.h>
3afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#include <getopt.h>
4afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#include <string.h>
5afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#include <stdlib.h>
6afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#include <stdio.h>
7afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#include <sys/mman.h>
8afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#include <sys/ioctl.h>
9afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#include <sys/socket.h>
10afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#include <sys/stat.h>
11afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#include <sys/types.h>
12afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#include <unistd.h>
13afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
14afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#include <ion/ion.h>
15afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#include <linux/ion.h>
16afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#include <linux/omap_ion.h>
17afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
18afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavinsize_t len = 1024*1024, align = 0;
19afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavinint prot = PROT_READ | PROT_WRITE;
20afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavinint map_flags = MAP_SHARED;
21afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavinint alloc_flags = 0;
22a50fd5568ea72ea1ad662207ccea512735803174Rebecca Schultz Zavinint heap_mask = 1;
23afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavinint test = -1;
24afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavinsize_t stride;
25afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
26afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavinint _ion_alloc_test(int *fd, struct ion_handle **handle)
27afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin{
28afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	int ret;
29afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
30afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	*fd = ion_open();
31afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	if (*fd < 0)
32afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		return *fd;
33afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
34a50fd5568ea72ea1ad662207ccea512735803174Rebecca Schultz Zavin	ret = ion_alloc(*fd, len, align, heap_mask, alloc_flags, handle);
35afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
36afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	if (ret)
37afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		printf("%s failed: %s\n", __func__, strerror(ret));
38afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	return ret;
39afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin}
40afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
41afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavinvoid ion_alloc_test()
42afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin{
43afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	int fd, ret;
44afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	struct ion_handle *handle;
45afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
46afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	if(_ion_alloc_test(&fd, &handle))
47afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			return;
48afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
49afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	ret = ion_free(fd, handle);
50afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	if (ret) {
51afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		printf("%s failed: %s %p\n", __func__, strerror(ret), handle);
52afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		return;
53afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	}
54afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	ion_close(fd);
55afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	printf("ion alloc test: passed\n");
56afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin}
57afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
58afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavinvoid ion_map_test()
59afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin{
60afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	int fd, map_fd, ret;
61afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	size_t i;
62afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	struct ion_handle *handle;
63afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	unsigned char *ptr;
64afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
65afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	if(_ion_alloc_test(&fd, &handle))
66afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		return;
67afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
68afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	ret = ion_map(fd, handle, len, prot, map_flags, 0, &ptr, &map_fd);
69afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	if (ret)
70afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		return;
71afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
72afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	for (i = 0; i < len; i++) {
73afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		ptr[i] = (unsigned char)i;
74afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	}
75afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	for (i = 0; i < len; i++)
76afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		if (ptr[i] != (unsigned char)i)
77afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			printf("%s failed wrote %d read %d from mapped "
78afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			       "memory\n", __func__, i, ptr[i]);
79afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	/* clean up properly */
80afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	ret = ion_free(fd, handle);
81afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	ion_close(fd);
82afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	munmap(ptr, len);
83afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	close(map_fd);
84afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
85afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	_ion_alloc_test(&fd, &handle);
86afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	close(fd);
87afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
88afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#if 0
89afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	munmap(ptr, len);
90afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	close(map_fd);
91afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	ion_close(fd);
92afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
93afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	_ion_alloc_test(len, align, flags, &fd, &handle);
94afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	close(map_fd);
95afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	ret = ion_map(fd, handle, len, prot, flags, 0, &ptr, &map_fd);
96afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	/* don't clean up */
97afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin#endif
98afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin}
99afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
100afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavinvoid ion_share_test()
101afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
102afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin{
103afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	struct ion_handle *handle;
104afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	int sd[2];
105afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	int num_fd = 1;
106afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	struct iovec count_vec = {
107afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		.iov_base = &num_fd,
108afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		.iov_len = sizeof num_fd,
109afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	};
110afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	char buf[CMSG_SPACE(sizeof(int))];
111afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	socketpair(AF_UNIX, SOCK_STREAM, 0, sd);
112afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	if (fork()) {
113afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		struct msghdr msg = {
114afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			.msg_control = buf,
115afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			.msg_controllen = sizeof buf,
116afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			.msg_iov = &count_vec,
117afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			.msg_iovlen = 1,
118afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		};
119afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
120afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		struct cmsghdr *cmsg;
121afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		int fd, share_fd, ret;
122afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		char *ptr;
123afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		/* parent */
124afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		if(_ion_alloc_test(&fd, &handle))
125afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			return;
126afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		ret = ion_share(fd, handle, &share_fd);
127afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		if (ret)
128afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			printf("share failed %s\n", strerror(errno));
129afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		ptr = mmap(NULL, len, prot, map_flags, share_fd, 0);
130afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		if (ptr == MAP_FAILED) {
131afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			return;
132afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		}
133afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		strcpy(ptr, "master");
134afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		cmsg = CMSG_FIRSTHDR(&msg);
135afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		cmsg->cmsg_level = SOL_SOCKET;
136afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		cmsg->cmsg_type = SCM_RIGHTS;
137afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		cmsg->cmsg_len = CMSG_LEN(sizeof(int));
138afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		*(int *)CMSG_DATA(cmsg) = share_fd;
139afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		/* send the fd */
140afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		printf("master? [%10s] should be [master]\n", ptr);
141afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		printf("master sending msg 1\n");
142afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		sendmsg(sd[0], &msg, 0);
143afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		if (recvmsg(sd[0], &msg, 0) < 0)
144afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			perror("master recv msg 2");
145afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		printf("master? [%10s] should be [child]\n", ptr);
146afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
147afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		/* send ping */
148afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		sendmsg(sd[0], &msg, 0);
149afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		printf("master->master? [%10s]\n", ptr);
150afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		if (recvmsg(sd[0], &msg, 0) < 0)
151afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			perror("master recv 1");
152afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	} else {
153afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		struct msghdr msg;
154afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		struct cmsghdr *cmsg;
155afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		char* ptr;
156afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		int fd, recv_fd;
157afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		char* child_buf[100];
158afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		/* child */
159afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		struct iovec count_vec = {
160afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			.iov_base = child_buf,
161afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			.iov_len = sizeof child_buf,
162afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		};
163afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
164afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		struct msghdr child_msg = {
165afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			.msg_control = buf,
166afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			.msg_controllen = sizeof buf,
167afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			.msg_iov = &count_vec,
168afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			.msg_iovlen = 1,
169afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		};
170afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
171afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		if (recvmsg(sd[1], &child_msg, 0) < 0)
172afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			perror("child recv msg 1");
173afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		cmsg = CMSG_FIRSTHDR(&child_msg);
174afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		if (cmsg == NULL) {
175afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			printf("no cmsg rcvd in child");
176afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			return;
177afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		}
178afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		recv_fd = *(int*)CMSG_DATA(cmsg);
179afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		if (recv_fd < 0) {
180afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			printf("could not get recv_fd from socket");
181afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			return;
182afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		}
183afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		printf("child %d\n", recv_fd);
184afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		fd = ion_open();
185afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		ptr = mmap(NULL, len, prot, map_flags, recv_fd, 0);
186afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		if (ptr == MAP_FAILED) {
187afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			return;
188afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		}
189afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		printf("child? [%10s] should be [master]\n", ptr);
190afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		strcpy(ptr, "child");
191afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		printf("child sending msg 2\n");
192afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		sendmsg(sd[1], &child_msg, 0);
193afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	}
194afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin}
195afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
196afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavinint main(int argc, char* argv[]) {
197afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	int c;
198afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	enum tests {
199afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		ALLOC_TEST = 0, MAP_TEST, SHARE_TEST,
200afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	};
201afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
202afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	while (1) {
203afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		static struct option opts[] = {
204afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"alloc", no_argument, 0, 'a'},
205afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"alloc_flags", required_argument, 0, 'f'},
206a50fd5568ea72ea1ad662207ccea512735803174Rebecca Schultz Zavin			{"heap_mask", required_argument, 0, 'h'},
207afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"map", no_argument, 0, 'm'},
208afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"share", no_argument, 0, 's'},
209afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"len", required_argument, 0, 'l'},
210afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"align", required_argument, 0, 'g'},
211afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"map_flags", required_argument, 0, 'z'},
212afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"prot", required_argument, 0, 'p'},
213afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		};
214afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		int i = 0;
215a50fd5568ea72ea1ad662207ccea512735803174Rebecca Schultz Zavin		c = getopt_long(argc, argv, "af:h:l:mr:st", opts, &i);
216afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		if (c == -1)
217afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
218afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
219afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		switch (c) {
220afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'l':
221afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			len = atol(optarg);
222afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
223afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'g':
224afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			align = atol(optarg);
225afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
226afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'z':
227afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			map_flags = 0;
228afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			map_flags |= strstr(optarg, "PROT_EXEC") ?
229afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin				PROT_EXEC : 0;
230afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			map_flags |= strstr(optarg, "PROT_READ") ?
231afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin				PROT_READ: 0;
232afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			map_flags |= strstr(optarg, "PROT_WRITE") ?
233afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin				PROT_WRITE: 0;
234afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			map_flags |= strstr(optarg, "PROT_NONE") ?
235afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin				PROT_NONE: 0;
236afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
237afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'p':
238afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			prot = 0;
239afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			prot |= strstr(optarg, "MAP_PRIVATE") ?
240afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin				MAP_PRIVATE	 : 0;
241afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			prot |= strstr(optarg, "MAP_SHARED") ?
242afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin				MAP_PRIVATE	 : 0;
243afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
244afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'f':
245afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			alloc_flags = atol(optarg);
246afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
247a50fd5568ea72ea1ad662207ccea512735803174Rebecca Schultz Zavin		case 'h':
248a50fd5568ea72ea1ad662207ccea512735803174Rebecca Schultz Zavin			heap_mask = atol(optarg);
249a50fd5568ea72ea1ad662207ccea512735803174Rebecca Schultz Zavin			break;
250afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'a':
251afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			test = ALLOC_TEST;
252afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
253afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'm':
254afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			test = MAP_TEST;
255afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
256afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 's':
257afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			test = SHARE_TEST;
258afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
259afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		}
260afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	}
261a50fd5568ea72ea1ad662207ccea512735803174Rebecca Schultz Zavin	printf("test %d, len %u, align %u, map_flags %d, prot %d, heap_mask %d,"
262a50fd5568ea72ea1ad662207ccea512735803174Rebecca Schultz Zavin	       " alloc_flags %d\n", test, len, align, map_flags, prot,
263a50fd5568ea72ea1ad662207ccea512735803174Rebecca Schultz Zavin	       heap_mask, alloc_flags);
264afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	switch (test) {
265afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case ALLOC_TEST:
266afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			ion_alloc_test();
267afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
268afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case MAP_TEST:
269afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			ion_map_test();
270afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
271afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case SHARE_TEST:
272afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			ion_share_test();
273afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
274afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		default:
275afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			printf("must specify a test (alloc, map, share)\n");
276afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	}
277afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	return 0;
278afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin}
279