Changeset 47b7006 in mainline
- Timestamp:
- 2011-01-29T23:02:39Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 197ef43
- Parents:
- fd483ce
- Location:
- uspace
- Files:
-
- 4 added
- 38 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/arch/abs32le/src/entry.c
rfd483ce r47b7006 37 37 { 38 38 __main(NULL); 39 __exit();40 39 } 41 40 -
uspace/lib/c/arch/abs32le/src/thread_entry.c
rfd483ce r47b7006 30 30 */ 31 31 32 #include <unistd.h>33 #include <thread.h>34 35 32 void __thread_entry(void) 36 33 { -
uspace/lib/c/arch/amd64/src/entry.s
rfd483ce r47b7006 47 47 # Pass PCB pointer to __main (no operation) 48 48 call __main 49 50 call __exit -
uspace/lib/c/arch/arm32/src/entry.s
rfd483ce r47b7006 42 42 ldr r0, =ras_page 43 43 str r2, [r0] 44 44 45 45 # 46 46 # Create the first stack frame. … … 50 50 push {fp, ip, lr, pc} 51 51 sub fp, ip, #4 52 52 53 53 # Pass pcb_ptr to __main as the first argument (in r0) 54 54 mov r0, r1 55 55 bl __main 56 57 bl __exit58 56 59 57 .data … … 62 60 ras_page: 63 61 .long 0 64 -
uspace/lib/c/arch/ia32/src/entry.s
rfd483ce r47b7006 46 46 mov %ax, %fs 47 47 # Do not set %gs, it contains descriptor that can see TLS 48 48 49 49 # Detect the mechanism used for making syscalls 50 50 movl $(INTEL_CPUID_STANDARD), %eax … … 58 58 # Create the first stack frame. 59 59 # 60 pushl $0 60 pushl $0 61 61 movl %esp, %ebp 62 62 63 63 # Pass the PCB pointer to __main as the first argument 64 64 pushl %edi 65 65 call __main 66 67 call __exit -
uspace/lib/c/arch/ia64/src/entry.s
rfd483ce r47b7006 40 40 alloc loc0 = ar.pfs, 0, 1, 2, 0 41 41 movl gp = _gp 42 42 43 43 # Pass PCB pointer as the first argument to __main 44 44 mov out0 = r2 45 45 br.call.sptk.many b0 = __main 46 0:47 br.call.sptk.many b0 = __exit -
uspace/lib/c/arch/mips32/src/entry.s
rfd483ce r47b7006 56 56 jal __main 57 57 nop 58 59 jal __exit60 nop61 58 .end 62 59 -
uspace/lib/c/arch/ppc32/src/entry.s
rfd483ce r47b7006 44 44 stw %r3, 0(%r1) 45 45 stwu %r1, -16(%r1) 46 46 47 47 # Pass the PCB pointer to __main() as the first argument. 48 48 # The first argument is passed in r3. 49 49 mr %r3, %r6 50 50 bl __main 51 52 bl __exit -
uspace/lib/c/arch/sparc64/src/entry.s
rfd483ce r47b7006 45 45 flushw 46 46 add %g0, -0x7ff, %fp 47 47 48 48 # Pass pcb_ptr as the first argument to __main() 49 49 mov %i1, %o0 … … 51 51 call __main 52 52 or %l7, %lo(_gp), %l7 53 54 call __exit55 nop -
uspace/lib/c/generic/async.c
rfd483ce r47b7006 42 42 * You should be able to write very simple multithreaded programs, the async 43 43 * framework will automatically take care of most synchronization problems. 44 *45 * Default semantics:46 * - async_send_*(): Send asynchronously. If the kernel refuses to send47 * more messages, [ try to get responses from kernel, if48 * nothing found, might try synchronous ]49 44 * 50 45 * Example of use (pseudo C): … … 127 122 128 123 /** 129 * Structures of this type are used to group information about a call and a130 * message queue link.124 * Structures of this type are used to group information about 125 * a call and about a message queue link. 131 126 */ 132 127 typedef struct { … … 156 151 /** Link to the client tracking structure. */ 157 152 client_t *client; 158 153 159 154 /** Messages that should be delivered to this fibril. */ 160 155 link_t msg_queue; … … 173 168 174 169 /** Identifier of the incoming connection handled by the current fibril. */ 175 fibril_local connection_t *FIBRIL_connection;170 static fibril_local connection_t *FIBRIL_connection; 176 171 177 172 static void *default_client_data_constructor(void) … … 202 197 { 203 198 assert(FIBRIL_connection); 204 205 199 return FIBRIL_connection->client->data; 206 200 } 207 201 208 static void default_client_connection(ipc_callid_t callid, ipc_call_t *call); 209 static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call); 202 /** Default fibril function that gets called to handle new connection. 203 * 204 * This function is defined as a weak symbol - to be redefined in user code. 205 * 206 * @param callid Hash of the incoming call. 207 * @param call Data of the incoming call. 208 * 209 */ 210 static void default_client_connection(ipc_callid_t callid, ipc_call_t *call) 211 { 212 ipc_answer_0(callid, ENOENT); 213 } 210 214 211 215 /** … … 213 217 */ 214 218 static async_client_conn_t client_connection = default_client_connection; 219 220 /** Default fibril function that gets called to handle interrupt notifications. 221 * 222 * This function is defined as a weak symbol - to be redefined in user code. 223 * 224 * @param callid Hash of the incoming call. 225 * @param call Data of the incoming call. 226 * 227 */ 228 static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call) 229 { 230 } 215 231 216 232 /** … … 224 240 static LIST_INITIALIZE(timeout_list); 225 241 226 #define CLIENT_HASH_TABLE_BUCKETS 227 #define CONN_HASH_TABLE_BUCKETS 228 229 static hash_index_t client_hash(unsigned long *key)242 #define CLIENT_HASH_TABLE_BUCKETS 32 243 #define CONN_HASH_TABLE_BUCKETS 32 244 245 static hash_index_t client_hash(unsigned long key[]) 230 246 { 231 247 assert(key); 232 return ((( *key) >> 4) % CLIENT_HASH_TABLE_BUCKETS);248 return (((key[0]) >> 4) % CLIENT_HASH_TABLE_BUCKETS); 233 249 } 234 250 235 251 static int client_compare(unsigned long key[], hash_count_t keys, link_t *item) 236 252 { 237 client_t *cl = hash_table_get_instance(item, client_t, link);238 return (key[0] == cl ->in_task_hash);253 client_t *client = hash_table_get_instance(item, client_t, link); 254 return (key[0] == client->in_task_hash); 239 255 } 240 256 … … 257 273 * 258 274 */ 259 static hash_index_t conn_hash(unsigned long *key)275 static hash_index_t conn_hash(unsigned long key[]) 260 276 { 261 277 assert(key); 262 return ((( *key) >> 4) % CONN_HASH_TABLE_BUCKETS);278 return (((key[0]) >> 4) % CONN_HASH_TABLE_BUCKETS); 263 279 } 264 280 … … 274 290 static int conn_compare(unsigned long key[], hash_count_t keys, link_t *item) 275 291 { 276 connection_t * hs= hash_table_get_instance(item, connection_t, link);277 return (key[0] == hs->in_phone_hash);292 connection_t *conn = hash_table_get_instance(item, connection_t, link); 293 return (key[0] == conn->in_phone_hash); 278 294 } 279 295 … … 290 306 free(hash_table_get_instance(item, connection_t, link)); 291 307 } 292 293 308 294 309 /** Operations for the connection hash table. */ … … 311 326 link_t *tmp = timeout_list.next; 312 327 while (tmp != &timeout_list) { 313 awaiter_t *cur ;314 315 cur = list_get_instance(tmp, awaiter_t, to_event.link);328 awaiter_t *cur 329 = list_get_instance(tmp, awaiter_t, to_event.link); 330 316 331 if (tv_gteq(&cur->to_event.expires, &wd->to_event.expires)) 317 332 break; 333 318 334 tmp = tmp->next; 319 335 } … … 332 348 * 333 349 * @return False if the call doesn't match any connection. 334 * 350 * @return True if the call was passed to the respective connection fibril. 335 351 * 336 352 */ … … 469 485 * the first IPC_M_PHONE_HUNGUP call and continues to 470 486 * call async_get_call_timeout(). Repeat 471 * IPC_M_PHONE_HUNGUP until the caller notices. 487 * IPC_M_PHONE_HUNGUP until the caller notices. 472 488 */ 473 489 memset(call, 0, sizeof(ipc_call_t)); … … 476 492 return conn->close_callid; 477 493 } 478 494 479 495 if (usecs) 480 496 async_insert_timeout(&conn->wdata); … … 514 530 } 515 531 516 /** Default fibril function that gets called to handle new connection.517 *518 * This function is defined as a weak symbol - to be redefined in user code.519 *520 * @param callid Hash of the incoming call.521 * @param call Data of the incoming call.522 *523 */524 static void default_client_connection(ipc_callid_t callid, ipc_call_t *call)525 {526 ipc_answer_0(callid, ENOENT);527 }528 529 /** Default fibril function that gets called to handle interrupt notifications.530 *531 * This function is defined as a weak symbol - to be redefined in user code.532 *533 * @param callid Hash of the incoming call.534 * @param call Data of the incoming call.535 *536 */537 static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call)538 {539 }540 541 532 /** Wrapper for client connection fibril. 542 533 * … … 551 542 static int connection_fibril(void *arg) 552 543 { 553 unsigned long key;554 client_t *cl;555 link_t *lnk;556 bool destroy = false;557 558 544 /* 559 545 * Setup fibril-local connection pointer. 560 546 */ 561 547 FIBRIL_connection = (connection_t *) arg; 562 548 549 futex_down(&async_futex); 550 563 551 /* 564 552 * Add our reference for the current connection in the client task … … 566 554 * hash in a new tracking structure. 567 555 */ 568 futex_down(&async_futex); 569 key = FIBRIL_connection->in_task_hash; 570 lnk = hash_table_find(&client_hash_table, &key); 556 557 unsigned long key = FIBRIL_connection->in_task_hash; 558 link_t *lnk = hash_table_find(&client_hash_table, &key); 559 560 client_t *client; 561 571 562 if (lnk) { 572 cl = hash_table_get_instance(lnk, client_t, link);573 cl ->refcnt++;563 client = hash_table_get_instance(lnk, client_t, link); 564 client->refcnt++; 574 565 } else { 575 cl = malloc(sizeof(client_t));576 if (!cl ) {566 client = malloc(sizeof(client_t)); 567 if (!client) { 577 568 ipc_answer_0(FIBRIL_connection->callid, ENOMEM); 578 569 futex_up(&async_futex); 579 570 return 0; 580 571 } 581 cl->in_task_hash = FIBRIL_connection->in_task_hash; 572 573 client->in_task_hash = FIBRIL_connection->in_task_hash; 574 582 575 async_serialize_start(); 583 cl ->data = async_client_data_create();576 client->data = async_client_data_create(); 584 577 async_serialize_end(); 585 cl->refcnt = 1; 586 hash_table_insert(&client_hash_table, &key, &cl->link); 587 } 578 579 client->refcnt = 1; 580 hash_table_insert(&client_hash_table, &key, &client->link); 581 } 582 588 583 futex_up(&async_futex); 589 590 FIBRIL_connection->client = cl ;591 584 585 FIBRIL_connection->client = client; 586 592 587 /* 593 588 * Call the connection handler function. … … 599 594 * Remove the reference for this client task connection. 600 595 */ 596 bool destroy; 597 601 598 futex_down(&async_futex); 602 if (--cl->refcnt == 0) { 599 600 if (--client->refcnt == 0) { 603 601 hash_table_remove(&client_hash_table, &key, 1); 604 602 destroy = true; 605 } 603 } else 604 destroy = false; 605 606 606 futex_up(&async_futex); 607 607 608 608 if (destroy) { 609 if (cl->data) 610 async_client_data_destroy(cl->data); 611 free(cl); 612 } 613 609 if (client->data) 610 async_client_data_destroy(client->data); 611 612 free(client); 613 } 614 614 615 /* 615 616 * Remove myself from the connection hash table. … … 624 625 */ 625 626 while (!list_empty(&FIBRIL_connection->msg_queue)) { 626 msg_t *msg ;627 628 msg = list_get_instance(FIBRIL_connection->msg_queue.next,629 msg_t, link);627 msg_t *msg = 628 list_get_instance(FIBRIL_connection->msg_queue.next, msg_t, 629 link); 630 630 631 list_remove(&msg->link); 631 632 ipc_answer_0(msg->callid, EHANGUP); … … 670 671 if (callid) 671 672 ipc_answer_0(callid, ENOMEM); 673 672 674 return (uintptr_t) NULL; 673 675 } … … 717 719 static void handle_call(ipc_callid_t callid, ipc_call_t *call) 718 720 { 719 /* Unrouted call - do some default behaviour*/721 /* Unrouted call - take some default action */ 720 722 if ((callid & IPC_CALLID_NOTIFICATION)) { 721 723 process_notification(callid, call); 722 goto out;724 return; 723 725 } 724 726 … … 726 728 case IPC_M_CONNECT_ME: 727 729 case IPC_M_CONNECT_ME_TO: 728 /* Open new connection with fibril etc. */730 /* Open new connection with fibril, etc. */ 729 731 async_new_connection(call->in_task_hash, IPC_GET_ARG5(*call), 730 732 callid, call, client_connection); 731 goto out;733 return; 732 734 } 733 735 734 736 /* Try to route the call through the connection hash table */ 735 737 if (route_call(callid, call)) 736 goto out;738 return; 737 739 738 740 /* Unknown call from unknown phone - hang it up */ 739 741 ipc_answer_0(callid, EHANGUP); 740 return;741 742 out:743 ;744 742 } 745 743 … … 754 752 link_t *cur = timeout_list.next; 755 753 while (cur != &timeout_list) { 756 awaiter_t *waiter ;757 758 waiter = list_get_instance(cur, awaiter_t, to_event.link);754 awaiter_t *waiter = 755 list_get_instance(cur, awaiter_t, to_event.link); 756 759 757 if (tv_gt(&waiter->to_event.expires, &tv)) 760 758 break; 761 759 762 760 cur = cur->next; 763 761 764 762 list_remove(&waiter->to_event.link); 765 763 waiter->to_event.inlist = false; … … 788 786 while (true) { 789 787 if (fibril_switch(FIBRIL_FROM_MANAGER)) { 790 futex_up(&async_futex); 788 futex_up(&async_futex); 791 789 /* 792 790 * async_futex is always held when entering a manager … … 811 809 continue; 812 810 } else 813 timeout = tv_sub(&waiter->to_event.expires, 814 &tv); 811 timeout = tv_sub(&waiter->to_event.expires, &tv); 815 812 } else 816 813 timeout = SYNCH_NO_TIMEOUT; 817 814 818 815 futex_up(&async_futex); 819 816 820 817 atomic_inc(&threads_in_ipc_wait); 821 818 … … 825 822 826 823 atomic_dec(&threads_in_ipc_wait); 827 824 828 825 if (!callid) { 829 826 handle_expired_timeouts(); … … 875 872 /** Initialize the async framework. 876 873 * 877 * @return Zero on success or an error code. 878 */ 879 int __async_init(void) 874 */ 875 void __async_init(void) 880 876 { 881 877 if (!hash_table_create(&client_hash_table, CLIENT_HASH_TABLE_BUCKETS, 1, 882 &client_hash_table_ops) || !hash_table_create(&conn_hash_table, 883 CONN_HASH_TABLE_BUCKETS, 1, &conn_hash_table_ops)) { 884 return ENOMEM; 885 } 886 887 _async_sess_init(); 888 889 return 0; 878 &client_hash_table_ops)) 879 abort(); 880 881 if (!hash_table_create(&conn_hash_table, CONN_HASH_TABLE_BUCKETS, 1, 882 &conn_hash_table_ops)) 883 abort(); 890 884 } 891 885 … … 900 894 * @param retval Value returned in the answer. 901 895 * @param data Call data of the answer. 896 * 902 897 */ 903 898 static void reply_received(void *arg, int retval, ipc_call_t *data) … … 947 942 sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, ipc_call_t *dataptr) 948 943 { 949 amsg_t *msg = malloc(sizeof( *msg));944 amsg_t *msg = malloc(sizeof(amsg_t)); 950 945 951 946 if (!msg) … … 956 951 957 952 msg->wdata.to_event.inlist = false; 958 /* We may sleep in the next method, but it will use its own mechanism */ 953 954 /* 955 * We may sleep in the next method, 956 * but it will use its own means 957 */ 959 958 msg->wdata.active = true; 960 959 … … 987 986 ipc_call_t *dataptr) 988 987 { 989 amsg_t *msg = malloc(sizeof( *msg));988 amsg_t *msg = malloc(sizeof(amsg_t)); 990 989 991 990 if (!msg) … … 996 995 997 996 msg->wdata.to_event.inlist = false; 998 /* We may sleep in next method, but it will use its own mechanism */ 997 998 /* 999 * We may sleep in the next method, 1000 * but it will use its own means 1001 */ 999 1002 msg->wdata.active = true; 1000 1003 … … 1095 1098 void async_usleep(suseconds_t timeout) 1096 1099 { 1097 amsg_t *msg = malloc(sizeof( *msg));1100 amsg_t *msg = malloc(sizeof(amsg_t)); 1098 1101 1099 1102 if (!msg) … … 1307 1310 } 1308 1311 1309 int async_forward_fast(ipc_callid_t callid, int phoneid, int imethod,1310 sysarg_t arg1, sysarg_t arg2, int mode)1312 int async_forward_fast(ipc_callid_t callid, int phoneid, sysarg_t imethod, 1313 sysarg_t arg1, sysarg_t arg2, unsigned int mode) 1311 1314 { 1312 1315 return ipc_forward_fast(callid, phoneid, imethod, arg1, arg2, mode); 1313 1316 } 1314 1317 1315 int async_forward_slow(ipc_callid_t callid, int phoneid, int imethod,1318 int async_forward_slow(ipc_callid_t callid, int phoneid, sysarg_t imethod, 1316 1319 sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t arg5, 1317 int mode)1320 unsigned int mode) 1318 1321 { 1319 1322 return ipc_forward_slow(callid, phoneid, imethod, arg1, arg2, arg3, arg4, … … 1428 1431 } 1429 1432 1430 /** Wrapper for makingIPC_M_SHARE_IN calls using the async framework.1431 * 1432 * @param phoneid 1433 * @param dst 1434 * @param size 1435 * @param arg 1436 * @param flags Storage where the received flags will be stored. Can be1437 * NULL.1438 * 1439 * @return Zero on success or a negative error code from errno.h.1433 /** Wrapper for IPC_M_SHARE_IN calls using the async framework. 1434 * 1435 * @param phoneid Phone that will be used to contact the receiving side. 1436 * @param dst Destination address space area base. 1437 * @param size Size of the destination address space area. 1438 * @param arg User defined argument. 1439 * @param flags Storage for the received flags. Can be NULL. 1440 * 1441 * @return Zero on success or a negative error code from errno.h. 1442 * 1440 1443 */ 1441 1444 int async_share_in_start(int phoneid, void *dst, size_t size, sysarg_t arg, 1442 int *flags) 1443 { 1444 int res; 1445 unsigned int *flags) 1446 { 1445 1447 sysarg_t tmp_flags; 1446 res = async_req_3_2(phoneid, IPC_M_SHARE_IN, (sysarg_t) dst,1448 int res = async_req_3_2(phoneid, IPC_M_SHARE_IN, (sysarg_t) dst, 1447 1449 (sysarg_t) size, arg, NULL, &tmp_flags); 1450 1448 1451 if (flags) 1449 *flags = tmp_flags; 1452 *flags = (unsigned int) tmp_flags; 1453 1450 1454 return res; 1451 1455 } … … 1453 1457 /** Wrapper for receiving the IPC_M_SHARE_IN calls using the async framework. 1454 1458 * 1455 * This wrapper only makes it more comfortable to receive IPC_M_SHARE_IN calls 1456 * so that the user doesn't have to remember the meaning of each IPC argument. 1459 * This wrapper only makes it more comfortable to receive IPC_M_SHARE_IN 1460 * calls so that the user doesn't have to remember the meaning of each IPC 1461 * argument. 1457 1462 * 1458 1463 * So far, this wrapper is to be used from within a connection fibril. 1459 1464 * 1460 * @param callid Storage where the hash of the IPC_M_SHARE_IN call will 1461 * be stored. 1462 * @param size Destination address space area size. 1463 * 1464 * @return Non-zero on success, zero on failure. 1465 */ 1466 int async_share_in_receive(ipc_callid_t *callid, size_t *size) 1467 { 1468 ipc_call_t data; 1469 1465 * @param callid Storage for the hash of the IPC_M_SHARE_IN call. 1466 * @param size Destination address space area size. 1467 * 1468 * @return True on success, false on failure. 1469 * 1470 */ 1471 bool async_share_in_receive(ipc_callid_t *callid, size_t *size) 1472 { 1470 1473 assert(callid); 1471 1474 assert(size); 1472 1475 1476 ipc_call_t data; 1473 1477 *callid = async_get_call(&data); 1478 1474 1479 if (IPC_GET_IMETHOD(data) != IPC_M_SHARE_IN) 1475 return 0; 1480 return false; 1481 1476 1482 *size = (size_t) IPC_GET_ARG2(data); 1477 return 1;1483 return true; 1478 1484 } 1479 1485 1480 1486 /** Wrapper for answering the IPC_M_SHARE_IN calls using the async framework. 1481 1487 * 1482 * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ calls 1483 * so that the user doesn't have to remember the meaning of each IPC argument. 1484 * 1485 * @param callid Hash of the IPC_M_DATA_READ call to answer. 1486 * @param src Source address space base. 1487 * @param flags Flags to be used for sharing. Bits can be only cleared. 1488 * 1489 * @return Zero on success or a value from @ref errno.h on failure. 1490 */ 1491 int async_share_in_finalize(ipc_callid_t callid, void *src, int flags) 1488 * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ 1489 * calls so that the user doesn't have to remember the meaning of each IPC 1490 * argument. 1491 * 1492 * @param callid Hash of the IPC_M_DATA_READ call to answer. 1493 * @param src Source address space base. 1494 * @param flags Flags to be used for sharing. Bits can be only cleared. 1495 * 1496 * @return Zero on success or a value from @ref errno.h on failure. 1497 * 1498 */ 1499 int async_share_in_finalize(ipc_callid_t callid, void *src, unsigned int flags) 1492 1500 { 1493 1501 return ipc_share_in_finalize(callid, src, flags); 1494 1502 } 1495 1503 1496 /** Wrapper for making IPC_M_SHARE_OUT calls using the async framework. 1497 * 1498 * @param phoneid Phone that will be used to contact the receiving side. 1499 * @param src Source address space area base address. 1500 * @param flags Flags to be used for sharing. Bits can be only cleared. 1501 * 1502 * @return Zero on success or a negative error code from errno.h. 1503 */ 1504 int async_share_out_start(int phoneid, void *src, int flags) 1504 /** Wrapper for IPC_M_SHARE_OUT calls using the async framework. 1505 * 1506 * @param phoneid Phone that will be used to contact the receiving side. 1507 * @param src Source address space area base address. 1508 * @param flags Flags to be used for sharing. Bits can be only cleared. 1509 * 1510 * @return Zero on success or a negative error code from errno.h. 1511 * 1512 */ 1513 int async_share_out_start(int phoneid, void *src, unsigned int flags) 1505 1514 { 1506 1515 return async_req_3_0(phoneid, IPC_M_SHARE_OUT, (sysarg_t) src, 0, … … 1510 1519 /** Wrapper for receiving the IPC_M_SHARE_OUT calls using the async framework. 1511 1520 * 1512 * This wrapper only makes it more comfortable to receive IPC_M_SHARE_OUT calls 1513 * so that the user doesn't have to remember the meaning of each IPC argument. 1521 * This wrapper only makes it more comfortable to receive IPC_M_SHARE_OUT 1522 * calls so that the user doesn't have to remember the meaning of each IPC 1523 * argument. 1514 1524 * 1515 1525 * So far, this wrapper is to be used from within a connection fibril. 1516 1526 * 1517 * @param callid Storage where the hash of the IPC_M_SHARE_OUT call will 1518 * be stored. 1519 * @param size Storage where the source address space area size will be 1520 * stored. 1521 * @param flags Storage where the sharing flags will be stored. 1522 * 1523 * @return Non-zero on success, zero on failure. 1524 */ 1525 int async_share_out_receive(ipc_callid_t *callid, size_t *size, int *flags) 1526 { 1527 ipc_call_t data; 1528 1527 * @param callid Storage for the hash of the IPC_M_SHARE_OUT call. 1528 * @param size Storage for the source address space area size. 1529 * @param flags Storage for the sharing flags. 1530 * 1531 * @return True on success, false on failure. 1532 * 1533 */ 1534 bool async_share_out_receive(ipc_callid_t *callid, size_t *size, unsigned int *flags) 1535 { 1529 1536 assert(callid); 1530 1537 assert(size); 1531 1538 assert(flags); 1532 1539 1540 ipc_call_t data; 1533 1541 *callid = async_get_call(&data); 1542 1534 1543 if (IPC_GET_IMETHOD(data) != IPC_M_SHARE_OUT) 1535 return 0; 1544 return false; 1545 1536 1546 *size = (size_t) IPC_GET_ARG2(data); 1537 *flags = ( int) IPC_GET_ARG3(data);1538 return 1;1547 *flags = (unsigned int) IPC_GET_ARG3(data); 1548 return true; 1539 1549 } 1540 1550 1541 1551 /** Wrapper for answering the IPC_M_SHARE_OUT calls using the async framework. 1542 1552 * 1543 * This wrapper only makes it more comfortable to answer IPC_M_SHARE_OUT calls 1544 * so that the user doesn't have to remember the meaning of each IPC argument. 1545 * 1546 * @param callid Hash of the IPC_M_DATA_WRITE call to answer. 1547 * @param dst Destination address space area base address. 1548 * 1549 * @return Zero on success or a value from @ref errno.h on failure. 1553 * This wrapper only makes it more comfortable to answer IPC_M_SHARE_OUT 1554 * calls so that the user doesn't have to remember the meaning of each IPC 1555 * argument. 1556 * 1557 * @param callid Hash of the IPC_M_DATA_WRITE call to answer. 1558 * @param dst Destination address space area base address. 1559 * 1560 * @return Zero on success or a value from @ref errno.h on failure. 1561 * 1550 1562 */ 1551 1563 int async_share_out_finalize(ipc_callid_t callid, void *dst) … … 1554 1566 } 1555 1567 1556 1557 /** Wrapper for making IPC_M_DATA_READ calls using the async framework. 1558 * 1559 * @param phoneid Phone that will be used to contact the receiving side.1560 * @param dst Address of the beginningof the destination buffer.1561 * @param size Size of the destination buffer.1562 * 1563 * @return Zero on success or a negative error code from errno.h.1568 /** Wrapper for IPC_M_DATA_READ calls using the async framework. 1569 * 1570 * @param phoneid Phone that will be used to contact the receiving side. 1571 * @param dst Address of the beginning of the destination buffer. 1572 * @param size Size of the destination buffer. 1573 * 1574 * @return Zero on success or a negative error code from errno.h. 1575 * 1564 1576 */ 1565 1577 int async_data_read_start(int phoneid, void *dst, size_t size) … … 1571 1583 /** Wrapper for receiving the IPC_M_DATA_READ calls using the async framework. 1572 1584 * 1573 * This wrapper only makes it more comfortable to receive IPC_M_DATA_READ calls 1574 * so that the user doesn't have to remember the meaning of each IPC argument. 1585 * This wrapper only makes it more comfortable to receive IPC_M_DATA_READ 1586 * calls so that the user doesn't have to remember the meaning of each IPC 1587 * argument. 1575 1588 * 1576 1589 * So far, this wrapper is to be used from within a connection fibril. 1577 1590 * 1578 * @param callid Storage where the hash of the IPC_M_DATA_READ call will 1579 * be stored. 1580 * @param size Storage where the maximum size will be stored. Can be 1581 * NULL. 1582 * 1583 * @return Non-zero on success, zero on failure. 1584 */ 1585 int async_data_read_receive(ipc_callid_t *callid, size_t *size) 1586 { 1591 * @param callid Storage for the hash of the IPC_M_DATA_READ. 1592 * @param size Storage for the maximum size. Can be NULL. 1593 * 1594 * @return True on success, false on failure. 1595 * 1596 */ 1597 bool async_data_read_receive(ipc_callid_t *callid, size_t *size) 1598 { 1599 assert(callid); 1600 1587 1601 ipc_call_t data; 1588 1589 assert(callid);1590 1591 1602 *callid = async_get_call(&data); 1603 1592 1604 if (IPC_GET_IMETHOD(data) != IPC_M_DATA_READ) 1593 return 0; 1605 return false; 1606 1594 1607 if (size) 1595 1608 *size = (size_t) IPC_GET_ARG2(data); 1596 return 1; 1609 1610 return true; 1597 1611 } 1598 1612 1599 1613 /** Wrapper for answering the IPC_M_DATA_READ calls using the async framework. 1600 1614 * 1601 * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ calls 1602 * so that the user doesn't have to remember the meaning of each IPC argument. 1603 * 1604 * @param callid Hash of the IPC_M_DATA_READ call to answer. 1605 * @param src Source address for the IPC_M_DATA_READ call. 1606 * @param size Size for the IPC_M_DATA_READ call. Can be smaller than 1607 * the maximum size announced by the sender. 1608 * 1609 * @return Zero on success or a value from @ref errno.h on failure. 1615 * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ 1616 * calls so that the user doesn't have to remember the meaning of each IPC 1617 * argument. 1618 * 1619 * @param callid Hash of the IPC_M_DATA_READ call to answer. 1620 * @param src Source address for the IPC_M_DATA_READ call. 1621 * @param size Size for the IPC_M_DATA_READ call. Can be smaller than 1622 * the maximum size announced by the sender. 1623 * 1624 * @return Zero on success or a value from @ref errno.h on failure. 1625 * 1610 1626 */ 1611 1627 int async_data_read_finalize(ipc_callid_t callid, const void *src, size_t size) … … 1647 1663 } 1648 1664 1649 /** Wrapper for makingIPC_M_DATA_WRITE calls using the async framework.1665 /** Wrapper for IPC_M_DATA_WRITE calls using the async framework. 1650 1666 * 1651 1667 * @param phoneid Phone that will be used to contact the receiving side. … … 1664 1680 /** Wrapper for receiving the IPC_M_DATA_WRITE calls using the async framework. 1665 1681 * 1666 * This wrapper only makes it more comfortable to receive IPC_M_DATA_WRITE calls 1667 * so that the user doesn't have to remember the meaning of each IPC argument. 1682 * This wrapper only makes it more comfortable to receive IPC_M_DATA_WRITE 1683 * calls so that the user doesn't have to remember the meaning of each IPC 1684 * argument. 1668 1685 * 1669 1686 * So far, this wrapper is to be used from within a connection fibril. 1670 1687 * 1671 * @param callid Storage where the hash of the IPC_M_DATA_WRITE call will1672 * be stored.1673 * @param size Storage where the suggested size will be stored. May be1674 * NULL1675 * 1676 * @return Non-zero on success, zero on failure.1677 * 1678 */ 1679 int async_data_write_receive(ipc_callid_t *callid, size_t *size) 1680 { 1688 * @param callid Storage for the hash of the IPC_M_DATA_WRITE. 1689 * @param size Storage for the suggested size. May be NULL. 1690 * 1691 * @return True on success, false on failure. 1692 * 1693 */ 1694 bool async_data_write_receive(ipc_callid_t *callid, size_t *size) 1695 { 1696 assert(callid); 1697 1681 1698 ipc_call_t data; 1682 1683 assert(callid);1684 1685 1699 *callid = async_get_call(&data); 1700 1686 1701 if (IPC_GET_IMETHOD(data) != IPC_M_DATA_WRITE) 1687 return 0;1702 return false; 1688 1703 1689 1704 if (size) 1690 1705 *size = (size_t) IPC_GET_ARG2(data); 1691 1706 1692 return 1;1707 return true; 1693 1708 } 1694 1709 1695 1710 /** Wrapper for answering the IPC_M_DATA_WRITE calls using the async framework. 1696 1711 * 1697 * This wrapper only makes it more comfortable to answer IPC_M_DATA_WRITE calls 1698 * so that the user doesn't have to remember the meaning of each IPC argument. 1712 * This wrapper only makes it more comfortable to answer IPC_M_DATA_WRITE 1713 * calls so that the user doesn't have to remember the meaning of each IPC 1714 * argument. 1699 1715 * 1700 1716 * @param callid Hash of the IPC_M_DATA_WRITE call to answer. … … 1792 1808 * 1793 1809 */ 1794 void async_data_write_void( const int retval)1810 void async_data_write_void(sysarg_t retval) 1795 1811 { 1796 1812 ipc_callid_t callid; -
uspace/lib/c/generic/async_sess.c
rfd483ce r47b7006 105 105 #include <errno.h> 106 106 #include <assert.h> 107 #include "private/async_sess.h" 107 108 108 109 /** An inactive open connection. */ … … 137 138 * 138 139 * Needs to be called prior to any other interface in this file. 139 */ 140 void _async_sess_init(void) 140 * 141 */ 142 void __async_sess_init(void) 141 143 { 142 144 fibril_mutex_initialize(&async_sess_mutex); -
uspace/lib/c/generic/fibril_synch.c
rfd483ce r47b7006 105 105 106 106 if (fibril_get_sercount() != 0) 107 core();107 abort(); 108 108 109 109 futex_down(&async_futex); … … 198 198 199 199 if (fibril_get_sercount() != 0) 200 core();200 abort(); 201 201 202 202 futex_down(&async_futex); … … 226 226 227 227 if (fibril_get_sercount() != 0) 228 core();228 abort(); 229 229 230 230 futex_down(&async_futex); -
uspace/lib/c/generic/io/io.c
rfd483ce r47b7006 46 46 #include <ipc/devmap.h> 47 47 #include <adt/list.h> 48 #include "../private/io.h" 48 49 49 50 static void _ffillbuf(FILE *stream); -
uspace/lib/c/generic/libc.c
rfd483ce r47b7006 43 43 #include <stdio.h> 44 44 #include <unistd.h> 45 #include <stdlib.h> 45 46 #include <malloc.h> 46 47 #include <tls.h> 47 #include <thread.h>48 48 #include <fibril.h> 49 #include < as.h>49 #include <task.h> 50 50 #include <loader/pcb.h> 51 51 #include "private/libc.h" 52 52 #include "private/async.h" 53 #include "private/async_sess.h" 54 #include "private/malloc.h" 55 #include "private/io.h" 53 56 54 void _exit(int status) 55 { 56 thread_exit(status); 57 } 57 static bool env_setup = false; 58 58 59 59 void __main(void *pcb_ptr) 60 60 { 61 61 /* Initialize user task run-time environment */ 62 __ heap_init();62 __malloc_init(); 63 63 __async_init(); 64 __async_sess_init(); 65 64 66 fibril_t *fibril = fibril_setup(); 67 if (fibril == NULL) 68 abort(); 69 65 70 __tcb_set(fibril->tcb); 66 71 … … 68 73 __pcb = (pcb_t *) pcb_ptr; 69 74 75 /* The basic run-time environment is setup */ 76 env_setup = true; 77 70 78 int argc; 71 79 char **argv; 72 80 73 /* Get command line arguments and initialize 74 standard input and output */ 81 /* 82 * Get command line arguments and initialize 83 * standard input and output 84 */ 75 85 if (__pcb == NULL) { 76 86 argc = 0; … … 84 94 } 85 95 86 /* Run main() and set task return value 87 according the result */ 88 (void) task_retval(main(argc, argv)); 96 /* 97 * Run main() and set task return value 98 * according the result 99 */ 100 int retval = main(argc, argv); 101 exit(retval); 89 102 } 90 103 91 void __exit(void)104 void exit(int status) 92 105 { 93 __stdio_done(); 94 fibril_teardown(__tcb_get()->fibril_data); 95 _exit(0); 106 if (env_setup) { 107 __stdio_done(); 108 task_retval(status); 109 fibril_teardown(__tcb_get()->fibril_data); 110 } 111 112 __SYSCALL1(SYS_TASK_EXIT, false); 113 114 /* Unreachable */ 115 while (1); 116 } 117 118 void abort(void) 119 { 120 __SYSCALL1(SYS_TASK_EXIT, true); 121 122 /* Unreachable */ 123 while (1); 96 124 } 97 125 -
uspace/lib/c/generic/malloc.c
rfd483ce r47b7006 45 45 #include <futex.h> 46 46 #include <adt/gcdlcm.h> 47 #include "private/malloc.h" 47 48 48 49 /* Magic used in heap headers. */ … … 215 216 /** Initialize the heap allocator 216 217 * 217 * Find how much physical memory we have and create 218 * the heap management structures that mark the whole 219 * physical memory as a single free block. 220 * 221 */ 222 void __heap_init(void) 223 { 224 futex_down(&malloc_futex); 225 226 if (as_area_create((void *) &_heap, PAGE_SIZE, 227 AS_AREA_WRITE | AS_AREA_READ)) { 228 heap_pages = 1; 229 heap_start = (void *) ALIGN_UP((uintptr_t) &_heap, BASE_ALIGN); 230 heap_end = 231 (void *) ALIGN_DOWN(((uintptr_t) &_heap) + PAGE_SIZE, BASE_ALIGN); 232 233 /* Make the entire area one large block. */ 234 block_init(heap_start, heap_end - heap_start, true); 235 } 236 237 futex_up(&malloc_futex); 218 * Create initial heap memory area. This routine is 219 * only called from libc initialization, thus we do not 220 * take any locks. 221 * 222 */ 223 void __malloc_init(void) 224 { 225 if (!as_area_create((void *) &_heap, PAGE_SIZE, 226 AS_AREA_WRITE | AS_AREA_READ)) 227 abort(); 228 229 heap_pages = 1; 230 heap_start = (void *) ALIGN_UP((uintptr_t) &_heap, BASE_ALIGN); 231 heap_end = 232 (void *) ALIGN_DOWN(((uintptr_t) &_heap) + PAGE_SIZE, BASE_ALIGN); 233 234 /* Make the entire area one large block. */ 235 block_init(heap_start, heap_end - heap_start, true); 238 236 } 239 237 -
uspace/lib/c/generic/private/async.h
rfd483ce r47b7006 79 79 } awaiter_t; 80 80 81 extern int__async_init(void);81 extern void __async_init(void); 82 82 extern void async_insert_timeout(awaiter_t *); 83 83 -
uspace/lib/c/generic/private/libc.h
rfd483ce r47b7006 37 37 38 38 extern int main(int, char *[]); 39 extern void __main(void *); 40 extern void __exit(void); 39 extern void __main(void *) __attribute__((noreturn)); 41 40 42 41 #endif -
uspace/lib/c/generic/thread.c
rfd483ce r47b7006 31 31 */ 32 32 /** @file 33 */ 33 */ 34 34 35 35 #include <thread.h> … … 41 41 #include <str.h> 42 42 #include <async.h> 43 #include "private/thread.h" 43 44 44 45 #ifndef THREAD_INITIAL_STACK_PAGES_NO … … 50 51 * This function is called from __thread_entry() and is used 51 52 * to call the thread's implementing function and perform cleanup 52 * and exit when thread returns back. Do not call this function 53 * directly. 53 * and exit when thread returns back. 54 54 * 55 55 * @param uarg Pointer to userspace argument structure. 56 * 56 57 */ 57 58 void __thread_main(uspace_arg_t *uarg) 58 59 { 59 fibril_t *f; 60 61 f = fibril_setup(); 62 __tcb_set(f->tcb); 63 60 fibril_t *fibril = fibril_setup(); 61 if (fibril == NULL) 62 thread_exit(0); 63 64 __tcb_set(fibril->tcb); 65 64 66 uarg->uspace_thread_function(uarg->uspace_thread_arg); 65 /* XXX: we cannot free the userspace stack while running on it */ 66 // free(uarg->uspace_stack); 67 // free(uarg); 68 67 /* XXX: we cannot free the userspace stack while running on it 68 free(uarg->uspace_stack); 69 free(uarg); 70 */ 71 69 72 /* If there is a manager, destroy it */ 70 73 async_destroy_manager(); 71 fibril_teardown(f );72 74 fibril_teardown(fibril); 75 73 76 thread_exit(0); 74 77 } … … 127 130 * 128 131 * @param status Exit status. Currently not used. 132 * 129 133 */ 130 134 void thread_exit(int status) 131 135 { 132 136 __SYSCALL1(SYS_THREAD_EXIT, (sysarg_t) status); 133 for (;;) 134 ; 137 138 /* Unreachable */ 139 while (1); 135 140 } 136 141 -
uspace/lib/c/include/async.h
rfd483ce r47b7006 57 57 extern atomic_t threads_in_ipc_wait; 58 58 59 #define async_manager() \ 60 fibril_switch(FIBRIL_TO_MANAGER) 61 62 #define async_get_call(data) \ 63 async_get_call_timeout(data, 0) 64 59 65 extern ipc_callid_t async_get_call_timeout(ipc_call_t *, suseconds_t); 60 61 static inline ipc_callid_t async_get_call(ipc_call_t *data)62 {63 return async_get_call_timeout(data, 0);64 }65 66 static inline void async_manager(void)67 {68 fibril_switch(FIBRIL_TO_MANAGER);69 }70 66 71 67 /* … … 142 138 */ 143 139 144 extern int async_forward_fast(ipc_callid_t, int, int, sysarg_t, sysarg_t, int); 145 extern int async_forward_slow(ipc_callid_t, int, int, sysarg_t, sysarg_t, 146 sysarg_t, sysarg_t, sysarg_t, int); 140 extern int async_forward_fast(ipc_callid_t, int, sysarg_t, sysarg_t, sysarg_t, 141 unsigned int); 142 extern int async_forward_slow(ipc_callid_t, int, sysarg_t, sysarg_t, sysarg_t, 143 sysarg_t, sysarg_t, sysarg_t, unsigned int); 147 144 148 145 /* … … 305 302 async_share_in_start((phoneid), (dst), (size), (arg), (flags)) 306 303 307 extern int async_share_in_start(int, void *, size_t, sysarg_t, int *); 308 extern int async_share_in_receive(ipc_callid_t *, size_t *); 309 extern int async_share_in_finalize(ipc_callid_t, void *, int ); 310 extern int async_share_out_start(int, void *, int); 311 extern int async_share_out_receive(ipc_callid_t *, size_t *, int *); 304 extern int async_share_in_start(int, void *, size_t, sysarg_t, unsigned int *); 305 extern bool async_share_in_receive(ipc_callid_t *, size_t *); 306 extern int async_share_in_finalize(ipc_callid_t, void *, unsigned int); 307 308 extern int async_share_out_start(int, void *, unsigned int); 309 extern bool async_share_out_receive(ipc_callid_t *, size_t *, unsigned int *); 312 310 extern int async_share_out_finalize(ipc_callid_t, void *); 313 311 … … 343 341 344 342 extern int async_data_read_start(int, void *, size_t); 345 extern intasync_data_read_receive(ipc_callid_t *, size_t *);343 extern bool async_data_read_receive(ipc_callid_t *, size_t *); 346 344 extern int async_data_read_finalize(ipc_callid_t, const void *, size_t); 347 345 … … 382 380 383 381 extern int async_data_write_start(int, const void *, size_t); 384 extern intasync_data_write_receive(ipc_callid_t *, size_t *);382 extern bool async_data_write_receive(ipc_callid_t *, size_t *); 385 383 extern int async_data_write_finalize(ipc_callid_t, void *, size_t); 386 384 387 385 extern int async_data_write_accept(void **, const bool, const size_t, 388 386 const size_t, const size_t, size_t *); 389 extern void async_data_write_void( const int);387 extern void async_data_write_void(sysarg_t); 390 388 391 389 extern int async_data_write_forward_fast(int, sysarg_t, sysarg_t, sysarg_t, -
uspace/lib/c/include/async_sess.h
rfd483ce r47b7006 45 45 } async_sess_t; 46 46 47 extern void _async_sess_init(void);48 47 extern void async_session_create(async_sess_t *, int, sysarg_t); 49 48 extern void async_session_destroy(async_sess_t *); -
uspace/lib/c/include/byteorder.h
rfd483ce r47b7006 80 80 #endif 81 81 82 #define htons(n) 83 #define htonl(n) 84 #define ntohs(n) 85 #define ntohl(n) 82 #define htons(n) host2uint16_t_be((n)) 83 #define htonl(n) host2uint32_t_be((n)) 84 #define ntohs(n) uint16_t_be2host((n)) 85 #define ntohl(n) uint32_t_be2host((n)) 86 86 87 87 static inline uint64_t uint64_t_byteorder_swap(uint64_t n) -
uspace/lib/c/include/err.h
rfd483ce r47b7006 39 39 40 40 #define errx(status, fmt, ...) \ 41 { \41 do { \ 42 42 printf((fmt), ##__VA_ARGS__); \ 43 _exit(status); \44 } 43 exit(status); \ 44 } while (0) 45 45 46 46 #endif -
uspace/lib/c/include/errno.h
rfd483ce r47b7006 39 39 #include <fibril.h> 40 40 41 #define errno _errno 42 41 43 extern int _errno; 42 43 #define errno _errno44 44 45 45 #define EMFILE (-18) … … 57 57 58 58 /** An API function is called while another blocking function is in progress. */ 59 #define EINPROGRESS 59 #define EINPROGRESS (-10036) 60 60 61 61 /** The socket identifier is not valid. */ 62 #define ENOTSOCK 62 #define ENOTSOCK (-10038) 63 63 64 64 /** The destination address required. */ 65 #define EDESTADDRREQ 65 #define EDESTADDRREQ (-10039) 66 66 67 67 /** Protocol is not supported. */ 68 #define EPROTONOSUPPORT 68 #define EPROTONOSUPPORT (-10043) 69 69 70 70 /** Socket type is not supported. */ 71 #define ESOCKTNOSUPPORT 71 #define ESOCKTNOSUPPORT (-10044) 72 72 73 73 /** Protocol family is not supported. */ 74 #define EPFNOSUPPORT 74 #define EPFNOSUPPORT (-10046) 75 75 76 76 /** Address family is not supported. */ 77 #define EAFNOSUPPORT 77 #define EAFNOSUPPORT (-10047) 78 78 79 79 /** Address is already in use. */ 80 #define EADDRINUSE 80 #define EADDRINUSE (-10048) 81 81 82 82 /** The socket is not connected or bound. */ 83 #define ENOTCONN 83 #define ENOTCONN (-10057) 84 84 85 85 /** The requested operation was not performed. Try again later. */ 86 #define EAGAIN 86 #define EAGAIN (-11002) 87 87 88 /** No data. 89 */ 90 #define NO_DATA (-11004) 88 /** No data. */ 89 #define NO_DATA (-11004) 91 90 92 91 #endif -
uspace/lib/c/include/loader/pcb.h
rfd483ce r47b7006 52 52 /** Program entry point. */ 53 53 entry_point_t entry; 54 54 55 55 /** Current working directory. */ 56 56 char *cwd; -
uspace/lib/c/include/malloc.h
rfd483ce r47b7006 38 38 #include <sys/types.h> 39 39 40 extern void __heap_init(void);41 40 extern uintptr_t get_max_heap_addr(void); 42 41 -
uspace/lib/c/include/setjmp.h
rfd483ce r47b7006 41 41 42 42 extern int setjmp(jmp_buf env); 43 extern void longjmp(jmp_buf env, int val) __attribute__((__noreturn__));43 extern void longjmp(jmp_buf env, int val) __attribute__((noreturn)); 44 44 45 45 #endif -
uspace/lib/c/include/stdlib.h
rfd483ce r47b7006 40 40 #include <stacktrace.h> 41 41 42 #define abort() \ 43 do { \ 44 stacktrace_print(); \ 45 _exit(1); \ 46 } while (0) 42 #define RAND_MAX 714025 47 43 48 #define core() \ 49 *((int *) 0) = 0xbadbad; 50 51 #define exit(status) _exit((status)) 52 53 #define RAND_MAX 714025 44 #define rand() random() 45 #define srand(seed) srandom(seed) 54 46 55 47 extern long int random(void); 56 48 extern void srandom(unsigned int seed); 57 49 58 static inline int rand(void) 59 { 60 return random(); 61 } 62 63 static inline void srand(unsigned int seed) 64 { 65 srandom(seed); 66 } 50 extern void abort(void) __attribute__((noreturn)); 67 51 68 52 #endif -
uspace/lib/c/include/syscall.h
rfd483ce r47b7006 32 32 /** 33 33 * @file 34 * @brief 35 * 36 * 34 * @brief Syscall function declaration for architectures that don't 35 * inline syscalls or architectures that handle syscalls 36 * according to the number of arguments. 37 37 */ 38 38 … … 40 40 #define LIBC_SYSCALL_H_ 41 41 42 #ifndef 43 #error "You can't include this file directly." 42 #ifndef LIBARCH_SYSCALL_GENERIC 43 #error You cannot include this file directly 44 44 #endif 45 45 … … 47 47 #include <kernel/syscall/syscall.h> 48 48 49 #define __syscall0 50 #define __syscall1 51 #define __syscall2 52 #define __syscall3 53 #define __syscall4 54 #define __syscall5 55 #define __syscall6 49 #define __syscall0 __syscall 50 #define __syscall1 __syscall 51 #define __syscall2 __syscall 52 #define __syscall3 __syscall 53 #define __syscall4 __syscall 54 #define __syscall5 __syscall 55 #define __syscall6 __syscall 56 56 57 57 extern sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, -
uspace/lib/c/include/thread.h
rfd483ce r47b7006 36 36 #define LIBC_THREAD_H_ 37 37 38 #include <kernel/proc/uarg.h>39 38 #include <libarch/thread.h> 40 39 #include <sys/types.h> … … 42 41 typedef uint64_t thread_id_t; 43 42 44 extern void __thread_entry(void);45 extern void __thread_main(uspace_arg_t *);46 47 43 extern int thread_create(void (*)(void *), void *, const char *, thread_id_t *); 48 extern void thread_exit(int) __attribute__ 44 extern void thread_exit(int) __attribute__((noreturn)); 49 45 extern void thread_detach(thread_id_t); 50 46 extern int thread_join(thread_id_t); -
uspace/lib/c/include/tls.h
rfd483ce r47b7006 57 57 extern void tls_free_variant_1(tcb_t *, size_t); 58 58 #endif 59 59 60 #ifdef CONFIG_TLS_VARIANT_2 60 61 extern tcb_t *tls_alloc_variant_2(void **, size_t); -
uspace/lib/c/include/unistd.h
rfd483ce r47b7006 41 41 42 42 #ifndef NULL 43 #define NULL 43 #define NULL ((void *) 0) 44 44 #endif 45 45 … … 74 74 extern int chdir(const char *); 75 75 76 extern void _exit(int) __attribute__((noreturn));76 extern void exit(int) __attribute__((noreturn)); 77 77 extern int usleep(useconds_t); 78 78 extern unsigned int sleep(unsigned int); -
uspace/lib/c/include/vfs/vfs.h
rfd483ce r47b7006 57 57 extern int unmount(const char *); 58 58 59 extern void __stdio_init(int filc, fdi_node_t *filv[]);60 extern void __stdio_done(void);61 62 59 extern int open_node(fdi_node_t *, int); 63 60 extern int fd_phone(int); -
uspace/srv/bd/ata_bd/ata_bd.c
rfd483ce r47b7006 265 265 sysarg_t method; 266 266 devmap_handle_t dh; 267 int flags;267 unsigned int flags; 268 268 int retval; 269 269 uint64_t ba; -
uspace/srv/bd/file_bd/file_bd.c
rfd483ce r47b7006 177 177 sysarg_t method; 178 178 size_t comm_size; 179 int flags;179 unsigned int flags; 180 180 int retval; 181 181 uint64_t ba; -
uspace/srv/bd/gxe_bd/gxe_bd.c
rfd483ce r47b7006 160 160 sysarg_t method; 161 161 devmap_handle_t dh; 162 int flags;162 unsigned int flags; 163 163 int retval; 164 164 uint64_t ba; -
uspace/srv/bd/part/guid_part/guid_part.c
rfd483ce r47b7006 315 315 sysarg_t method; 316 316 devmap_handle_t dh; 317 int flags;317 unsigned int flags; 318 318 int retval; 319 319 aoff64_t ba; -
uspace/srv/bd/part/mbr_part/mbr_part.c
rfd483ce r47b7006 393 393 sysarg_t method; 394 394 devmap_handle_t dh; 395 int flags;395 unsigned int flags; 396 396 int retval; 397 397 uint64_t ba; -
uspace/srv/bd/rd/rd.c
rfd483ce r47b7006 102 102 * Now we wait for the client to send us its communication as_area. 103 103 */ 104 int flags;104 unsigned int flags; 105 105 if (async_share_out_receive(&callid, &comm_size, &flags)) { 106 106 fs_va = as_get_mappable_page(comm_size);
Note:
See TracChangeset
for help on using the changeset viewer.