source: mainline/ipcc/ipcc.c@ ce5bcb4

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since ce5bcb4 was f4b961f, checked in by Jakub Vana <jakub.vana@…>, 19 years ago

Unaligned userspace test

  • Property mode set to 100644
File size: 4.6 KB
Line 
1#include <stdio.h>
2#include <async.h>
3#include <ipc/ipc.h>
4#include <ipc/services.h>
5#include <errno.h>
6
7#define TEST_START 10000
8#define MAXLIST 4
9
10#define MSG_HANG_ME_UP 2000
11
12static int connections[50];
13static ipc_callid_t callids[50];
14static int phones[20];
15static int myservice = 0;
16
17static void client_connection(ipc_callid_t iid, ipc_call_t *icall)
18{
19 ipc_callid_t callid;
20 ipc_call_t call;
21 ipcarg_t phonehash = icall->in_phone_hash;
22 int retval;
23 int i;
24
25 printf("Connected phone: %P, accepting\n", icall->in_phone_hash);
26 ipc_answer_fast(iid, 0, 0, 0);
27 for (i=0;i < 1024;i++)
28 if (!connections[i]) {
29 connections[i] = phonehash;
30 break;
31 }
32
33 while (1) {
34 callid = async_get_call(&call);
35 switch (IPC_GET_METHOD(call)) {
36 case IPC_M_PHONE_HUNGUP:
37 printf("Phone (%P) hung up.\n", phonehash);
38 retval = 0;
39 break;
40 default:
41 printf("Received message from %P: %X\n", phonehash,callid);
42 for (i=0; i < 1024; i++)
43 if (!callids[i]) {
44 callids[i] = callid;
45 break;
46 }
47 continue;
48 }
49 ipc_answer_fast(callid, retval, 0, 0);
50 }
51}
52
53static void printhelp(void)
54{
55 printf("? - help\n");
56 printf("c - connect to other service\n");
57 printf("h - hangup connection\n");
58 printf("a - send async message to other service\n");
59 printf("s - send sync message to other service\n");
60 printf("d - answer message that we have received\n");
61 printf("j - jump to endless loop\n");
62 printf("p - page fault\n");
63 printf("u - unaligned read\n");
64}
65
66static void callback(void *private, int retval, ipc_call_t *data)
67{
68 printf("Received response to msg %d - retval: %d.\n", private,
69 retval);
70}
71
72static void do_answer_msg(void)
73{
74 int i,cnt, errn;
75 char c;
76 ipc_callid_t callid;
77
78 cnt = 0;
79 for (i=0;i < 50;i++) {
80 if (callids[i]) {
81 printf("%d: %P\n", cnt, callids[i]);
82 cnt++;
83 }
84 if (cnt >= 10)
85 break;
86 }
87 if (!cnt)
88 return;
89 printf("Choose message:\n");
90 do {
91 c = getchar();
92 } while (c < '0' || (c-'0') >= cnt);
93 cnt = c - '0' + 1;
94
95 for (i=0;cnt;i++)
96 if (callids[i])
97 cnt--;
98 i -= 1;
99
100 printf("Normal (n) or hangup (h) or error(e) message?\n");
101 do {
102 c = getchar();
103 } while (c != 'n' && c != 'h' && c != 'e');
104 if (c == 'n')
105 errn = 0;
106 else if (c == 'h')
107 errn = EHANGUP;
108 else if (c == 'e')
109 errn = ENOENT;
110 printf("Answering %P\n", callids[i]);
111 ipc_answer_fast(callids[i], errn, 0, 0);
112 callids[i] = 0;
113}
114
115static void do_send_msg(int async)
116{
117 int phoneid;
118 int res;
119 static int msgid = 1;
120 char c;
121
122 printf("Select phoneid to send msg: 2-9\n");
123 do {
124 c = getchar();
125 } while (c < '2' || c > '9');
126 phoneid = c - '0';
127
128 if (async) {
129 ipc_call_async(phoneid, 2000, 0, (void *)msgid, callback, 1);
130 printf("Async sent - msg %d\n", msgid);
131 msgid++;
132 } else {
133 printf("Sending msg...");
134 res = ipc_call_sync_2(phoneid, 2000, 0, 0, NULL, NULL);
135 printf("done: %d\n", res);
136 }
137}
138
139static void do_hangup(void)
140{
141 char c;
142 int res;
143 int phoneid;
144
145 printf("Select phoneid to hangup: 2-9\n");
146 do {
147 c = getchar();
148 } while (c < '2' || c > '9');
149 phoneid = c - '0';
150
151 printf("Hanging up...");
152 res = ipc_hangup(phoneid);
153 printf("done: %d\n", phoneid);
154}
155
156static void do_connect(void)
157{
158 char c;
159 int svc;
160 int phid;
161
162 printf("Choose one service: 0:10000....9:10009\n");
163 do {
164 c = getchar();
165 } while (c < '0' || c > '9');
166 svc = TEST_START + c - '0';
167 if (svc == myservice) {
168 printf("Currently cannot connect to myself, update test\n");
169 return;
170 }
171 printf("Connecting to %d..", svc);
172 phid = ipc_connect_me_to(PHONE_NS, svc, 0);
173 if (phid > 0) {
174 printf("phoneid: %d\n", phid);
175 phones[phid] = 1;
176 } else
177 printf("error: %d\n", phid);
178}
179
180
181
182int main(void)
183{
184 ipcarg_t phonead;
185 int i;
186 char c;
187 int res;
188 volatile long long var;
189 volatile int var1;
190
191 printf("********************************\n");
192 printf("***********IPC Tester***********\n");
193 printf("********************************\n");
194
195
196 async_set_client_connection(client_connection);
197
198 for (i=TEST_START;i < TEST_START+10;i++) {
199 res = ipc_connect_to_me(PHONE_NS, i, 0, &phonead);
200 if (!res)
201 break;
202 printf("Failed registering as %d..:%d\n", i, res);
203 }
204 printf("Registered as service: %d\n", i);
205 myservice = i;
206
207 printhelp();
208 while (1) {
209 c = getchar();
210 switch (c) {
211 case '?':
212 printhelp();
213 break;
214 case 'h':
215 do_hangup();
216 break;
217 case 'c':
218 do_connect();
219 break;
220 case 'a':
221 do_send_msg(1);
222 break;
223 case 's':
224 do_send_msg(0);
225 break;
226 case 'd':
227 do_answer_msg();
228 break;
229 case 'j':
230 while (1)
231 ;
232 case 'p':
233 printf("Doing page fault\n");
234 *((char *)0) = 1;
235 printf("done\n");
236 case 'u':
237 var1=*( (int *) ( ( (char *)(&var) ) + 1 ) );
238 break;
239 }
240 }
241}
Note: See TracBrowser for help on using the repository browser.