ion_test.c revision afd912394690cbf7d40b021c62d80ff0f3d40806
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;
22afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavinint test = -1;
23afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavinsize_t width = 1024*1024, height = 1024*1024;
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
34afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	ret = ion_alloc(*fd, len, align, 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'},
206afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"map", no_argument, 0, 'm'},
207afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"share", no_argument, 0, 's'},
208afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"len", required_argument, 0, 'l'},
209afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"align", required_argument, 0, 'g'},
210afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"map_flags", required_argument, 0, 'z'},
211afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"prot", required_argument, 0, 'p'},
212afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"width", required_argument, 0, 'w'},
213afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			{"height", required_argument, 0, 'h'},
214afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		};
215afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		int i = 0;
216afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		c = getopt_long(argc, argv, "af:h:l:mr:stw:", opts, &i);
217afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		if (c == -1)
218afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
219afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin
220afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		switch (c) {
221afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'l':
222afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			len = atol(optarg);
223afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
224afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'g':
225afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			align = atol(optarg);
226afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
227afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'z':
228afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			map_flags = 0;
229afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			map_flags |= strstr(optarg, "PROT_EXEC") ?
230afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin				PROT_EXEC : 0;
231afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			map_flags |= strstr(optarg, "PROT_READ") ?
232afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin				PROT_READ: 0;
233afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			map_flags |= strstr(optarg, "PROT_WRITE") ?
234afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin				PROT_WRITE: 0;
235afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			map_flags |= strstr(optarg, "PROT_NONE") ?
236afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin				PROT_NONE: 0;
237afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
238afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'p':
239afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			prot = 0;
240afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			prot |= strstr(optarg, "MAP_PRIVATE") ?
241afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin				MAP_PRIVATE	 : 0;
242afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			prot |= strstr(optarg, "MAP_SHARED") ?
243afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin				MAP_PRIVATE	 : 0;
244afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
245afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'f':
246afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			alloc_flags = atol(optarg);
247afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
248afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'a':
249afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			test = ALLOC_TEST;
250afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
251afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'm':
252afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			test = MAP_TEST;
253afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
254afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 's':
255afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			test = SHARE_TEST;
256afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
257afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'w':
258afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			width = atol(optarg);
259afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
260afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case 'h':
261afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			height = atol(optarg);
262afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
263afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		}
264afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	}
265afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	printf("test %d, len %u, width %u, height %u align %u, "
266afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		   "map_flags %d, prot %d, alloc_flags %d\n", test, len, width,
267afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		   height, align, map_flags, prot, alloc_flags);
268afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	switch (test) {
269afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case ALLOC_TEST:
270afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			ion_alloc_test();
271afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
272afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case MAP_TEST:
273afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			ion_map_test();
274afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
275afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		case SHARE_TEST:
276afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			ion_share_test();
277afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			break;
278afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin		default:
279afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin			printf("must specify a test (alloc, map, share)\n");
280afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	}
281afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin	return 0;
282afd912394690cbf7d40b021c62d80ff0f3d40806Rebecca Schultz Zavin}
283