Subversion Repositories HelenOS

Rev

Rev 1418 | Rev 1435 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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