source: mainline/init/init.c@ afa6e74

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

Earliest version of Userspace Framebuffer driver, with stream support in libc.
Also Virtual framebuffers made as split on main fb and its usage by streams

(please test it and report)

  • Property mode set to 100644
File size: 11.5 KB
RevLine 
[3eddaff]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
[350514c]29#include "version.h"
[38edb96]30#include <ipc/ipc.h>
31#include <ipc/services.h>
32#include <ipc/ns.h>
[00c4994]33#include <stdio.h>
34#include <unistd.h>
35#include <stdlib.h>
[c05290e]36#include <thread.h>
[f30e6a0b]37#include <task.h>
[29a9f62]38#include <psthread.h>
[1cef26f]39#include <futex.h>
[5a4c754]40#include <as.h>
[fa3561f]41#include <ddi.h>
[8a568e3]42#include <string.h>
[250717cc]43#include <errno.h>
[51d6f80]44#include <kbd.h>
[afa6e74]45#include <ipc/fb.h>
[936351c1]46
[7048773]47int a;
[1cef26f]48atomic_t ftx;
[7048773]49
[0319a8f6]50int __thread stage;
[c4c5de5]51
[c05290e]52extern void utest(void *arg);
53void utest(void *arg)
54{
[81e55099]55 printf("Uspace thread started.\n");
[1cef26f]56 if (futex_down(&ftx) < 0)
57 printf("Futex failed.\n");
58 if (futex_up(&ftx) < 0)
59 printf("Futex failed.\n");
60
61 printf("%s in good condition.\n", __FUNCTION__);
62
[c05290e]63 for (;;)
64 ;
65}
[48627ab]66
[523fad8]67/* test different parameters types and modifiers */
[56972c81]68static void test_printf(void)
69{
70 printf("Simple text.\n");
71 printf("Now insert '%s' string.\n","this");
[11a4fbf]72 printf("Signed formats on uns. numbers: '%d', '%+d', '% d', '%u' (,+, ,u)\n", 321, 321, 321, 321);
73 printf("Signed formats on sig. numbers: '%d', '%+d', '% d', '%u' (,+, ,u)\n", -321, -321, -321, -321);
74 printf("Signed with different sized: '%hhd', '%hd', '%d', '%ld', %lld;\n", -3, -32, -321, -32101l, -3210123ll);
75 printf("And now... '%hhd' byte! '%hd' word! '%d' int! \n", 11, 11111, 1111111111);
76 printf("Different bases: %#hx, %#hu, %#ho and %#hb\n", 123, 123, 123, 123);
77 printf("Different bases signed: %#hx, %#hu, %#ho and %#hb\n", -123, -123, -123, -123);
78 printf("'%llX' llX! Another '%llx' llx! \n", 0x1234567887654321ll, 0x1234567887654321ll);
79 printf("'%llX' with 64bit value and '%x' with 32 bit value. \n", 0x1234567887654321ll, 0x12345678 );
80 printf("'%llx' 64bit, '%x' 32bit, '%hhx' 8bit, '%hx' 16bit, '%llX' 64bit and '%s' string.\n", 0x1234567887654321ll, 0x12345678, 0x12, 0x1234, 0x1234567887654321ull, "Lovely string" );
[48627ab]81
[56972c81]82 printf("Thats all, folks!\n");
83}
[48627ab]84
[523fad8]85/* test width and precision modifiers */
86static void test_printf2(void)
87{
88 printf(" text 10.8s %*.*s \n", 5, 3, "text");
89 printf(" very long text 10.8s %10.8s \n", "very long text");
90 printf(" text 8.10s %8.10s \n", "text");
91 printf(" very long text 8.10s %8.10s \n", "very long text");
92
93 printf(" char: c '%c', 3.2c '%3.2c', -3.2c '%-3.2c', 2.3c '%2.3c', -2.3c '%-2.3c' \n",'a', 'b', 'c', 'd', 'e' );
94 printf(" int: d '%d', 3.2d '%3.2d', -3.2d '%-3.2d', 2.3d '%2.3d', -2.3d '%-2.3d' \n",1, 1, 1, 1, 1 );
95 printf(" -int: d '%d', 3.2d '%3.2d', -3.2d '%-3.2d', 2.3d '%2.3d', -2.3d '%-2.3d' \n",-1, -1, -1, -1, -1 );
96 printf(" 0xint: x '%x', 5.3x '%#5.3x', -5.3x '%#-5.3x', 3.5x '%#3.5x', -3.5x '%#-3.5x' \n",17, 17, 17, 17, 17 );
97
98}
[936351c1]99
[5106e98]100extern char _heap;
[4241683]101static void test_mremap(void)
[00c4994]102{
103 printf("Writing to good memory\n");
[d3b8c1f]104 as_area_resize(&_heap, 120000, 0);
[00c4994]105 printf("%P\n", ((char *)&_heap));
106 printf("%P\n", ((char *)&_heap) + 80000);
107 *(((char *)&_heap) + 80000) = 10;
108 printf("Making small\n");
[d3b8c1f]109 as_area_resize(&_heap, 16000, 0);
[00c4994]110 printf("Failing..\n");
111 *((&_heap) + 80000) = 10;
112
113 printf("memory done\n");
114}
115/*
116static void test_sbrk(void)
117{
118 printf("Writing to good memory\n");
119 printf("Got: %P\n", sbrk(120000));
120 printf("%P\n", ((char *)&_heap));
121 printf("%P\n", ((char *)&_heap) + 80000);
122 *(((char *)&_heap) + 80000) = 10;
123 printf("Making small, got: %P\n",sbrk(-120000));
124 printf("Testing access to heap\n");
125 _heap = 10;
126 printf("Failing..\n");
127 *((&_heap) + 80000) = 10;
128
129 printf("memory done\n");
130}
131*/
132/*
133static void test_malloc(void)
134{
135 char *data;
136
137 data = malloc(10);
138 printf("Heap: %P, data: %P\n", &_heap, data);
139 data[0] = 'a';
140 free(data);
141}
142*/
[3eddaff]143
[5106e98]144
145static void test_ping(void)
146{
147 ipcarg_t result;
148 int retval;
149
[4c61e60]150 printf("Pinging\n");
[5106e98]151 retval = ipc_call_sync(PHONE_NS, NS_PING, 0xbeef,&result);
152 printf("Retval: %d - received: %P\n", retval, result);
153}
154
[4c61e60]155static void got_answer(void *private, int retval, ipc_call_t *data)
[936351c1]156{
[11a4fbf]157 printf("Retval: %d...%s...%zX, %zX\n", retval, private,
[936351c1]158 IPC_GET_ARG1(*data), IPC_GET_ARG2(*data));
159}
160static void test_async_ipc(void)
161{
[5106e98]162 ipc_call_t data;
[936351c1]163 int i;
164
165 printf("Sending ping\n");
166 ipc_call_async_2(PHONE_NS, NS_PING, 1, 0xbeefbee2,
167 "Pong1", got_answer);
168 ipc_call_async_2(PHONE_NS, NS_PING, 2, 0xbeefbee4,
169 "Pong2", got_answer);
170 ipc_call_async_2(PHONE_NS, NS_PING, 3, 0xbeefbee4,
171 "Pong3", got_answer);
172 ipc_call_async_2(PHONE_NS, NS_PING, 4, 0xbeefbee4,
173 "Pong4", got_answer);
174 ipc_call_async_2(PHONE_NS, NS_PING, 5, 0xbeefbee4,
175 "Pong5", got_answer);
176 ipc_call_async_2(PHONE_NS, NS_PING, 6, 0xbeefbee4,
177 "Pong6", got_answer);
178 printf("Waiting forever...\n");
179 for (i=0; i<100;i++)
180 printf(".");
181 printf("\n");
182 ipc_wait_for_call(&data, NULL);
183 printf("Received call???\n");
184}
185
[5106e98]186
[4c61e60]187static void got_answer_2(void *private, int retval, ipc_call_t *data)
[5106e98]188{
189 printf("Pong\n");
190}
191static void test_advanced_ipc(void)
[3eddaff]192{
[5106e98]193 int res;
[4c61e60]194 ipcarg_t phonead;
[5106e98]195 ipc_callid_t callid;
196 ipc_call_t data;
[11eae82]197 int i;
[936351c1]198
[5106e98]199 printf("Asking 0 to connect to me...\n");
[4c61e60]200 res = ipc_connect_to_me(0, 1, 2, &phonead);
201 printf("Result: %d - phonead: %llu\n", res, phonead);
[11eae82]202 for (i=0; i < 100; i++) {
[5106e98]203 printf("----------------\n");
204 ipc_call_async(PHONE_NS, NS_PING_SVC, 0, "prov",
205 got_answer_2);
206 callid = ipc_wait_for_call(&data, NULL);
207 printf("Received ping\n");
[250717cc]208 ipc_answer_fast(callid, 0, 0, 0);
[11eae82]209 }
[7048773]210// callid = ipc_wait_for_call(&data, NULL);
[11eae82]211}
212
213static void test_connection_ipc(void)
214{
215 int res;
216 ipcarg_t result;
[4c61e60]217 int phoneid;
[11eae82]218
219 printf("Starting connect...\n");
220 res = ipc_connect_me_to(PHONE_NS, 10, 20);
221 printf("Connected: %d\n", res);
222 printf("pinging.\n");
223 res = ipc_call_sync(res, NS_PING, 0xbeef,&result);
[7048773]224 printf("Retval: %d - received: %X\n", res, result);
225
226}
227
228static void test_hangup(void)
229{
230 int phoneid;
231 ipc_call_t data;
232 ipc_callid_t callid;
233 int i;
234
235 printf("Starting connect...\n");
236 phoneid = ipc_connect_me_to(PHONE_NS, 10, 20);
237 printf("Phoneid: %d, pinging\n", phoneid);
238 ipc_call_async_2(PHONE_NS, NS_PING, 1, 0xbeefbee2,
239 "Pong1", got_answer);
240 printf("Hangin up\n");
241 ipc_hangup(phoneid);
242 printf("Connecting\n");
243 phoneid = ipc_connect_me_to(PHONE_NS, 10, 20);
244 printf("Newphid: %d\n", phoneid);
245 for (i=0; i < 1000; i++) {
246 if ((callid=ipc_wait_for_call(&data, IPC_WAIT_NONBLOCKING)))
247 printf("callid: %d\n");
248 }
249 printf("New new phoneid: %d\n", ipc_connect_me_to(PHONE_NS, 10, 20));
250}
251
252static void test_slam(void)
253{
254 int i;
255 ipc_call_t data;
256 ipc_callid_t callid;
257
258 printf("ping");
259 ipc_call_async_2(PHONE_NS, NS_PING, 1, 0xbeefbee2,
260 "Pong1", got_answer);
261 printf("slam");
262 ipc_call_async_2(PHONE_NS, NS_HANGUP, 1, 0xbeefbee2,
263 "Hang", got_answer);
264 printf("ping2\n");
265 ipc_call_async_2(PHONE_NS, NS_PING, 1, 0xbeefbee2,
266 "Ping2", got_answer);
[11eae82]267
[7048773]268 for (i=0; i < 1000; i++) {
269 if ((callid=ipc_wait_for_call(&data, IPC_WAIT_NONBLOCKING)))
270 printf("callid: %d\n");
271 }
272 ipc_call_async_2(PHONE_NS, NS_PING, 1, 0xbeefbee2,
273 "Pong1", got_answer);
274 printf("Closing file\n");
275 ipc_hangup(PHONE_NS);
276 ipc_call_async_2(PHONE_NS, NS_PING, 1, 0xbeefbee2,
277 "Pong1", got_answer);
278 ipc_wait_for_call(&data, 0);
[5106e98]279}
280
[29a9f62]281static int ptest(void *arg)
282{
[0319a8f6]283 stage = 1;
284 printf("Pseudo thread stage%d.\n", stage);
285 stage++;
[520492a]286 psthread_schedule_next();
[0319a8f6]287 printf("Pseudo thread stage%d.\n", stage);
288 stage++;
[520492a]289 psthread_schedule_next();
[0319a8f6]290 printf("Pseudo thread stage%d.\n", stage);
[520492a]291 psthread_schedule_next();
[0319a8f6]292 stage++;
293 printf("Pseudo thread stage%d.\n", stage);
[520492a]294 psthread_schedule_next();
295 printf("Pseudo thread exiting.\n");
[29a9f62]296 return 0;
297}
[1cef26f]298
[51d6f80]299static void test_kbd()
300{
301 int res;
302 ipcarg_t result;
303 int phoneid;
304
305 printf("Test: Starting connect...\n");
[250717cc]306 while ((phoneid = ipc_connect_me_to(PHONE_NS, SERVICE_KEYBOARD, 0)) < 0) {
[51d6f80]307 };
308
309 printf("Test: Connected: %d\n", res);
310 printf("Test: pinging.\n");
311 while (1) {
312 res = ipc_call_sync(phoneid, KBD_GETCHAR, 0xbeef,&result);
313// printf("Test: Retval: %d - received: %c\n", res, result);
314 printf("%c", result);
315 }
316
317 printf("Test: Hangin up\n");
318 ipc_hangup(phoneid);
319}
320
[250717cc]321static void test_pci()
322{
323 int phone;
324 while ((phone = ipc_connect_me_to(PHONE_NS, SERVICE_PCI, 0)) < 0)
325 ;
326 printf("Connected to PCI service through phone %d.\n", phone);
327}
328
[6efe0ddf]329static int test_as_area_send()
[8a568e3]330{
[6efe0ddf]331 char *as_area;
[8a568e3]332 int retval;
333 ipcarg_t result;
334
[6efe0ddf]335 as_area = as_area_create((void *)(1024*1024), 16384, AS_AREA_READ | AS_AREA_WRITE);
336 if (!as_area) {
337 printf("Error creating as_area.\n");
[8a568e3]338 return 0;
339 }
340
[6efe0ddf]341 memcpy(as_area, "Hello world.\n", 14);
[8a568e3]342
[6efe0ddf]343 retval = ipc_call_sync_2(PHONE_NS, IPC_M_AS_AREA_SEND, 0, (sysarg_t) as_area,
[8a568e3]344 NULL, NULL);
345 if (retval) {
[6efe0ddf]346 printf("AS_AREA_SEND failed.\n");
[8a568e3]347 return 0;
348 }
349 printf("Done\n");
350}
351
[afa6e74]352static void test_fb()
353{
354 int res;
355 ipcarg_t result;
356 int phoneid;
357
358// printf("Test: Starting connect...\n");
359
360 phoneid = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0);
361
362 while ((phoneid = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0)) < 0) {
363 volatile int a;
364 for(a=0;a<1048576;a++);
365 };
366
367// printf("Test: Connected: %d\n", res);
368// printf("Test: pinging.\n");
369 while (1) {
370 res = ipc_call_sync(phoneid, FB_GET_VFB, 0xbeef,&result);
371// printf("Test: Retval: %d - received: %c\n", res, result);
372// printf("%c", result);
373 }
374
375// printf("Test: Hangin up\n");
376 ipc_hangup(phoneid);
377}
378
379
[5106e98]380int main(int argc, char *argv[])
381{
[29a9f62]382 pstid_t ptid;
[c05290e]383 int tid;
[523fad8]384
[afa6e74]385// version_print();
[b419162]386
[86d05fae]387// test_printf();
[523fad8]388// test_printf2();
[5106e98]389// test_ping();
390// test_async_ipc();
[11eae82]391// test_advanced_ipc();
[7048773]392// test_connection_ipc();
393// test_hangup();
[4c61e60]394// test_slam();
[51d6f80]395// test_as_send();
[a1c7827]396// test_pci();
[afa6e74]397// test_kbd();
398// test_fb();
399
400 printf("Hello\nThis is Init\n\nBye.");
401
[51d6f80]402
[8a568e3]403/*
[d3b8c1f]404 printf("Userspace task, taskid=%llX\n", task_get_id());
[f30e6a0b]405
[1cef26f]406 futex_initialize(&ftx, 1);
407 if (futex_down(&ftx) < 0)
408 printf("Futex failed.\n");
409 if (futex_up(&ftx) < 0)
410 printf("Futex failed.\n");
411
412 if (futex_down(&ftx) < 0)
413 printf("Futex failed.\n");
[0319a8f6]414
[86d05fae]415 if ((tid = thread_create(utest, NULL, "utest")) != -1) {
416 printf("Created thread tid=%d\n", tid);
417 }
418
419 if ((tid = thread_create(utest, NULL, "utest")) != -1) {
[4c61e60]420 printf("Created thread tid=%d\n", tid);
421 }
[0319a8f6]422
[1cef26f]423 int i;
[250717cc]424
[86d05fae]425 for (i = 0; i < 50000000; i++)
[1cef26f]426 ;
427
428 if (futex_up(&ftx) < 0)
429 printf("Futex failed.\n");
430
[c4c5de5]431
[0319a8f6]432 printf("Creating pseudo thread.\n");
433 stage = 1;
[29a9f62]434 ptid = psthread_create(ptest, NULL);
[0319a8f6]435 printf("Main thread stage%d.\n", stage);
436 stage++;
[520492a]437 psthread_schedule_next();;
[0319a8f6]438 printf("Main thread stage%d.\n", stage);
439 stage++;
[520492a]440 psthread_schedule_next();;
[0319a8f6]441 printf("Main thread stage%d.\n", stage);
[520492a]442
443 psthread_join(ptid);
[29a9f62]444
[1cef26f]445 printf("Main thread exiting.\n");
[8a568e3]446*/
[250717cc]447
[3eddaff]448 return 0;
449}
Note: See TracBrowser for help on using the repository browser.