source: mainline/init/init.c@ f30e6a0b

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

Userspace suport for SYS_GET_TASK_ID syscall.

  • Property mode set to 100644
File size: 8.8 KB
Line 
1/*
2 * Copyright (C) 2005 Martin Decky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include "version.h"
30#include <ipc.h>
31#include <stdio.h>
32#include <unistd.h>
33#include <stdlib.h>
34#include <ns.h>
35#include <thread.h>
36#include <task.h>
37#include <psthread.h>
38#include <futex.h>
39
40int a;
41atomic_t ftx;
42
43int __thread stage;
44
45extern void utest(void *arg);
46void utest(void *arg)
47{
48 printf("Uspace thread started.\n");
49 if (futex_down(&ftx) < 0)
50 printf("Futex failed.\n");
51 if (futex_up(&ftx) < 0)
52 printf("Futex failed.\n");
53
54 printf("%s in good condition.\n", __FUNCTION__);
55
56 for (;;)
57 ;
58}
59
60static void test_printf(void)
61{
62 printf("Simple text.\n");
63 printf("Now insert '%s' string.\n","this");
64 printf("Signed formats on uns. numbers: '%d', '%+d', '% d', '%u' (,+, ,u)\n", 321, 321, 321, 321);
65 printf("Signed formats on sig. numbers: '%d', '%+d', '% d', '%u' (,+, ,u)\n", -321, -321, -321, -321);
66 printf("Signed with different sized: '%hhd', '%hd', '%d', '%ld', %lld;\n", -3, -32, -321, -32101l, -3210123ll);
67 printf("And now... '%hhd' byte! '%hd' word! '%d' int! \n", 11, 11111, 1111111111);
68 printf("Different bases: %#hx, %#hu, %#ho and %#hb\n", 123, 123, 123, 123);
69 printf("Different bases signed: %#hx, %#hu, %#ho and %#hb\n", -123, -123, -123, -123);
70 printf("'%llX' llX! Another '%llx' llx! \n", 0x1234567887654321ll, 0x1234567887654321ll);
71 printf("'%llX' with 64bit value and '%x' with 32 bit value. \n", 0x1234567887654321ll, 0x12345678 );
72 printf("'%llx' 64bit, '%x' 32bit, '%hhx' 8bit, '%hx' 16bit, '%llX' 64bit and '%s' string.\n", 0x1234567887654321ll, 0x12345678, 0x12, 0x1234, 0x1234567887654321ull, "Lovely string" );
73
74 printf("Thats all, folks!\n");
75}
76
77
78extern char _heap;
79static void test_mremap(void)
80{
81 printf("Writing to good memory\n");
82 mremap(&_heap, 120000, 0);
83 printf("%P\n", ((char *)&_heap));
84 printf("%P\n", ((char *)&_heap) + 80000);
85 *(((char *)&_heap) + 80000) = 10;
86 printf("Making small\n");
87 mremap(&_heap, 16000, 0);
88 printf("Failing..\n");
89 *((&_heap) + 80000) = 10;
90
91 printf("memory done\n");
92}
93/*
94static void test_sbrk(void)
95{
96 printf("Writing to good memory\n");
97 printf("Got: %P\n", sbrk(120000));
98 printf("%P\n", ((char *)&_heap));
99 printf("%P\n", ((char *)&_heap) + 80000);
100 *(((char *)&_heap) + 80000) = 10;
101 printf("Making small, got: %P\n",sbrk(-120000));
102 printf("Testing access to heap\n");
103 _heap = 10;
104 printf("Failing..\n");
105 *((&_heap) + 80000) = 10;
106
107 printf("memory done\n");
108}
109*/
110/*
111static void test_malloc(void)
112{
113 char *data;
114
115 data = malloc(10);
116 printf("Heap: %P, data: %P\n", &_heap, data);
117 data[0] = 'a';
118 free(data);
119}
120*/
121
122
123static void test_ping(void)
124{
125 ipcarg_t result;
126 int retval;
127
128 printf("Pinging\n");
129 retval = ipc_call_sync(PHONE_NS, NS_PING, 0xbeef,&result);
130 printf("Retval: %d - received: %P\n", retval, result);
131}
132
133static void got_answer(void *private, int retval, ipc_call_t *data)
134{
135 printf("Retval: %d...%s...%zX, %zX\n", retval, private,
136 IPC_GET_ARG1(*data), IPC_GET_ARG2(*data));
137}
138static void test_async_ipc(void)
139{
140 ipc_call_t data;
141 int i;
142
143 printf("Sending ping\n");
144 ipc_call_async_2(PHONE_NS, NS_PING, 1, 0xbeefbee2,
145 "Pong1", got_answer);
146 ipc_call_async_2(PHONE_NS, NS_PING, 2, 0xbeefbee4,
147 "Pong2", got_answer);
148 ipc_call_async_2(PHONE_NS, NS_PING, 3, 0xbeefbee4,
149 "Pong3", got_answer);
150 ipc_call_async_2(PHONE_NS, NS_PING, 4, 0xbeefbee4,
151 "Pong4", got_answer);
152 ipc_call_async_2(PHONE_NS, NS_PING, 5, 0xbeefbee4,
153 "Pong5", got_answer);
154 ipc_call_async_2(PHONE_NS, NS_PING, 6, 0xbeefbee4,
155 "Pong6", got_answer);
156 printf("Waiting forever...\n");
157 for (i=0; i<100;i++)
158 printf(".");
159 printf("\n");
160 ipc_wait_for_call(&data, NULL);
161 printf("Received call???\n");
162}
163
164
165static void got_answer_2(void *private, int retval, ipc_call_t *data)
166{
167 printf("Pong\n");
168}
169static void test_advanced_ipc(void)
170{
171 int res;
172 ipcarg_t phonead;
173 ipc_callid_t callid;
174 ipc_call_t data;
175 int i;
176
177 printf("Asking 0 to connect to me...\n");
178 res = ipc_connect_to_me(0, 1, 2, &phonead);
179 printf("Result: %d - phonead: %llu\n", res, phonead);
180 for (i=0; i < 100; i++) {
181 printf("----------------\n");
182 ipc_call_async(PHONE_NS, NS_PING_SVC, 0, "prov",
183 got_answer_2);
184 callid = ipc_wait_for_call(&data, NULL);
185 printf("Received ping\n");
186 ipc_answer(callid, 0, 0, 0);
187 }
188// callid = ipc_wait_for_call(&data, NULL);
189}
190
191static void test_connection_ipc(void)
192{
193 int res;
194 ipcarg_t result;
195 int phoneid;
196
197 printf("Starting connect...\n");
198 res = ipc_connect_me_to(PHONE_NS, 10, 20);
199 printf("Connected: %d\n", res);
200 printf("pinging.\n");
201 res = ipc_call_sync(res, NS_PING, 0xbeef,&result);
202 printf("Retval: %d - received: %X\n", res, result);
203
204}
205
206static void test_hangup(void)
207{
208 int phoneid;
209 ipc_call_t data;
210 ipc_callid_t callid;
211 int i;
212
213 printf("Starting connect...\n");
214 phoneid = ipc_connect_me_to(PHONE_NS, 10, 20);
215 printf("Phoneid: %d, pinging\n", phoneid);
216 ipc_call_async_2(PHONE_NS, NS_PING, 1, 0xbeefbee2,
217 "Pong1", got_answer);
218 printf("Hangin up\n");
219 ipc_hangup(phoneid);
220 printf("Connecting\n");
221 phoneid = ipc_connect_me_to(PHONE_NS, 10, 20);
222 printf("Newphid: %d\n", phoneid);
223 for (i=0; i < 1000; i++) {
224 if ((callid=ipc_wait_for_call(&data, IPC_WAIT_NONBLOCKING)))
225 printf("callid: %d\n");
226 }
227 printf("New new phoneid: %d\n", ipc_connect_me_to(PHONE_NS, 10, 20));
228}
229
230static void test_slam(void)
231{
232 int i;
233 ipc_call_t data;
234 ipc_callid_t callid;
235
236 printf("ping");
237 ipc_call_async_2(PHONE_NS, NS_PING, 1, 0xbeefbee2,
238 "Pong1", got_answer);
239 printf("slam");
240 ipc_call_async_2(PHONE_NS, NS_HANGUP, 1, 0xbeefbee2,
241 "Hang", got_answer);
242 printf("ping2\n");
243 ipc_call_async_2(PHONE_NS, NS_PING, 1, 0xbeefbee2,
244 "Ping2", got_answer);
245
246 for (i=0; i < 1000; i++) {
247 if ((callid=ipc_wait_for_call(&data, IPC_WAIT_NONBLOCKING)))
248 printf("callid: %d\n");
249 }
250 ipc_call_async_2(PHONE_NS, NS_PING, 1, 0xbeefbee2,
251 "Pong1", got_answer);
252 printf("Closing file\n");
253 ipc_hangup(PHONE_NS);
254 ipc_call_async_2(PHONE_NS, NS_PING, 1, 0xbeefbee2,
255 "Pong1", got_answer);
256 ipc_wait_for_call(&data, 0);
257}
258
259static int ptest(void *arg)
260{
261 stage = 1;
262 printf("Pseudo thread stage%d.\n", stage);
263 stage++;
264 psthread_schedule_next();
265 printf("Pseudo thread stage%d.\n", stage);
266 stage++;
267 psthread_schedule_next();
268 printf("Pseudo thread stage%d.\n", stage);
269 psthread_schedule_next();
270 stage++;
271 printf("Pseudo thread stage%d.\n", stage);
272 psthread_schedule_next();
273 printf("Pseudo thread exiting.\n");
274 return 0;
275}
276
277int main(int argc, char *argv[])
278{
279 pstid_t ptid;
280 int tid;
281
282 version_print();
283
284// test_printf();
285// test_ping();
286// test_async_ipc();
287// test_advanced_ipc();
288// test_connection_ipc();
289// test_hangup();
290// test_slam();
291
292 printf("Userspace task, taskid=%llX\n", get_task_id());
293
294 futex_initialize(&ftx, 1);
295 if (futex_down(&ftx) < 0)
296 printf("Futex failed.\n");
297 if (futex_up(&ftx) < 0)
298 printf("Futex failed.\n");
299
300 if (futex_down(&ftx) < 0)
301 printf("Futex failed.\n");
302
303 if ((tid = thread_create(utest, NULL, "utest")) != -1) {
304 printf("Created thread tid=%d\n", tid);
305 }
306
307 if ((tid = thread_create(utest, NULL, "utest")) != -1) {
308 printf("Created thread tid=%d\n", tid);
309 }
310
311 int i;
312
313 for (i = 0; i < 50000000; i++)
314 ;
315
316 if (futex_up(&ftx) < 0)
317 printf("Futex failed.\n");
318
319
320 printf("Creating pseudo thread.\n");
321 stage = 1;
322 ptid = psthread_create(ptest, NULL);
323 printf("Main thread stage%d.\n", stage);
324 stage++;
325 psthread_schedule_next();;
326 printf("Main thread stage%d.\n", stage);
327 stage++;
328 psthread_schedule_next();;
329 printf("Main thread stage%d.\n", stage);
330
331 psthread_join(ptid);
332
333 printf("Main thread exiting.\n");
334 return 0;
335}
Note: See TracBrowser for help on using the repository browser.