Annotation of prex-old/doc/html/doc/kapi.html, Revision 1.1
1.1 ! nbrk 1: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
! 2: <html>
! 3: <head>
! 4: <title>Prex Kernel API Reference</title>
! 5: <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
! 6: <meta name="keywords" content="Prex, embedded, real-time, operating system, RTOS, open source, free">
! 7: <meta name="author" content="Kohsuke Ohtani">
! 8: <link rel="stylesheet" type="text/css" href="../default.css" media="screen">
! 9: <link rel="stylesheet" type="text/css" href="../print.css" media="print">
! 10: </head>
! 11: <body>
! 12: <div id="top">
! 13: </div>
! 14: <div id="middle">
! 15:
! 16: <table id="content" cellpadding="0" cellspacing="0">
! 17: <tbody>
! 18:
! 19: <tr>
! 20: <td id="header" colspan="2" valign="top">
! 21: <table width="100%" border="0" cellspacing="0" cellpadding="0">
! 22: <tr>
! 23: <td id="logo">
! 24: <a href="http://prex.sourceforge.net/">
! 25: <img alt="Prex logo" src="../img/logo.gif" border="0"
! 26: style="width: 281px; height: 56px;"></a>
! 27: </td>
! 28: <td id="brief" align="right" valign="bottom">
! 29: An Open Source, Royalty-free,<br>
! 30: Real-time Operating System
! 31: </td>
! 32: </tr>
! 33: </table>
! 34: </td>
! 35: </tr
! 36:
! 37: <tr>
! 38: <td id="directory" style="vertical-align: top;">
! 39: <a href="http://prex.sourceforge.net/">Prex Home</a> >
! 40: <a href="index.html">Document Index</a> >
! 41: Kernel API Reference
! 42: </tr>
! 43: <tr><td class="pad" colspan="2" style="vertical-align: top;"></td></tr>
! 44:
! 45: <tr>
! 46: <td id="main" style="vertical-align: top;">
! 47: <h1>Prex Kernel API Reference</h1>
! 48:
! 49: <i>Version 1.7.0, 2007/12/24</i><br>
! 50: <br>
! 51:
! 52: <h3>Table of Contents</h3>
! 53:
! 54: <ul>
! 55: <li><a href="#intro">Introduction</a></li>
! 56: </ul>
! 57:
! 58: <ul>
! 59: <li><a href="#gen">General Information</a>
! 60: <ul>
! 61: <li><a href="#type">Data Types</a></li>
! 62: <li><a href="#err">Error Numbers</a></li>
! 63: </ul>
! 64: </li>
! 65: </ul>
! 66:
! 67: <ul>
! 68: <li><a href="#obj">Object</a>
! 69: <ul>
! 70: <li><a href="#obj0">object_create</a></li>
! 71: <li><a href="#obj1">object_delete</a></li>
! 72: <li><a href="#obj2">object_lookup</a></li>
! 73: </ul>
! 74: </li>
! 75: </ul>
! 76:
! 77: <ul>
! 78: <li><a href="#msg">Message</a>
! 79: <ul>
! 80: <li><a href="#msg0">msg_send</a></li>
! 81: <li><a href="#msg1">msg_receive</a></li>
! 82: <li><a href="#msg2">msg_reply</a></li>
! 83: </ul>
! 84: </li>
! 85: </ul>
! 86:
! 87: <ul>
! 88: <li><a href="#task">Task</a>
! 89: <ul>
! 90: <li><a href="#task0">task_create</a></li>
! 91: <li><a href="#task1">task_terminate</a></li>
! 92: <li><a href="#task2">task_self</a></li>
! 93: <li><a href="#task3">task_suspend</a></li>
! 94: <li><a href="#task4">task_resume</a></li>
! 95: <li><a href="#task5">task_name</a></li>
! 96: <li><a href="#task6">task_getcap</a></li>
! 97: <li><a href="#task7">task_setcap</a></li>
! 98: </ul>
! 99: </li>
! 100: </ul>
! 101:
! 102: <ul>
! 103: <li><a href="#thr">Thread</a>
! 104: <ul>
! 105: <li><a href="#thr0">thread_create</a></li>
! 106: <li><a href="#thr1">thread_terminate</a></li>
! 107: <li><a href="#thr2">thread_load</a></li>
! 108: <li><a href="#thr3">thread_self</a></li>
! 109: <li><a href="#thr4">thread_yield</a></li>
! 110: <li><a href="#thr5">thread_suspend</a></li>
! 111: <li><a href="#thr6">thread_resume</a></li>
! 112: <li><a href="#thr7">thread_schedparam</a></li>
! 113: </ul>
! 114: </li>
! 115: </ul>
! 116:
! 117: <ul>
! 118: <li><a href="#vm">Virtual Memory</a>
! 119: <ul>
! 120: <li><a href="#vm0">vm_allocate</a></li>
! 121: <li><a href="#vm1">vm_free</a></li>
! 122: <li><a href="#vm2">vm_attribute</a></li>
! 123: <li><a href="#vm3">vm_map</a></li>
! 124: </ul>
! 125: </li>
! 126: </ul>
! 127:
! 128: <ul>
! 129: <li><a href="#tmr">Timer</a>
! 130: <ul>
! 131: <li><a href="#tmr0">timer_sleep</a></li>
! 132: <li><a href="#tmr1">timer_alarm</a></li>
! 133: <li><a href="#tmr2">timer_periodic</a></li>
! 134: <li><a href="#tmr3">timer_waitperiod</a></li>
! 135: </ul>
! 136: </li>
! 137: </ul>
! 138:
! 139: <ul>
! 140: <li><a href="#ex">Exception</a>
! 141: <ul>
! 142: <li><a href="#ex0">exception_setup</a></li>
! 143: <li><a href="#ex1">exception_return</a></li>
! 144: <li><a href="#ex2">exception_raise</a></li>
! 145: <li><a href="#ex3">exception_wait</a></li>
! 146: </ul>
! 147: </li>
! 148: </ul>
! 149:
! 150: <ul>
! 151: <li><a href="#dev">Device</a>
! 152: <ul>
! 153: <li><a href="#dev0">device_open</a></li>
! 154: <li><a href="#dev1">device_close</a></li>
! 155: <li><a href="#dev2">device_read</a></li>
! 156: <li><a href="#dev3">device_write</a></li>
! 157: <li><a href="#dev4">device_ioctl</a></li>
! 158: </ul>
! 159: </li>
! 160: </ul>
! 161:
! 162: <ul>
! 163: <li><a href="#mu">Mutex</a>
! 164: <ul>
! 165: <li><a href="#mu0">mutex_init</a></li>
! 166: <li><a href="#mu1">mutex_destroy</a></li>
! 167: <li><a href="#mu2">mutex_trylock</a></li>
! 168: <li><a href="#mu3">mutex_lock</a></li>
! 169: <li><a href="#mu4">mutex_unlock</a></li>
! 170: </ul>
! 171: </li>
! 172: </ul>
! 173:
! 174: <ul>
! 175: <li><a href="#cv">Condition Variable</a>
! 176: <ul>
! 177: <li><a href="#cv0">cond_init</a></li>
! 178: <li><a href="#cv1">cond_destroy</a></li>
! 179: <li><a href="#cv2">cond_wait</a></li>
! 180: <li><a href="#cv3">cond_signal</a></li>
! 181: <li><a href="#cv4">cond_broadcast</a></li>
! 182: </ul>
! 183: </li>
! 184: </ul>
! 185:
! 186: <ul>
! 187: <li><a href="#sem">Semaphore</a>
! 188: <ul>
! 189: <li><a href="#sem0">sem_init</a></li>
! 190: <li><a href="#sem1">sem_destroy</a></li>
! 191: <li><a href="#sem2">sem_wait</a></li>
! 192: <li><a href="#sem3">sem_trywait</a></li>
! 193: <li><a href="#sem4">sem_post</a></li>
! 194: <li><a href="#sem5">sem_getvalue</a></li>
! 195: </ul>
! 196: </li>
! 197: </ul>
! 198:
! 199: <ul>
! 200: <li><a href="#sys">System</a>
! 201: <ul>
! 202: <li><a href="#sys0">sys_log</a></li>
! 203: <li><a href="#sys1">sys_panic</a></li>
! 204: <li><a href="#sys2">sys_info</a></li>
! 205: <li><a href="#sys3">sys_time</a></li>
! 206: <li><a href="#sys4">sys_debug</a></li>
! 207: </ul>
! 208:
! 209: </ul>
! 210:
! 211:
! 212: <h2 id="intro">Introduction</h2>
! 213: <p>
! 214: The Prex Kernel API Reference define a programming interface
! 215: for the Prex applications.
! 216: This document includes the complete set of kernel services and the detailed
! 217: description.
! 218: </p>
! 219:
! 220:
! 221: <h2 id="gen">General Information</h2>
! 222:
! 223: <h3 id="type">Data Types</h3>
! 224: <p>
! 225: The following data types are supported by the Prex kernel.
! 226: Each type represents ID of the kernel element.
! 227: </p>
! 228:
! 229: <table border="1" width="60%" cellspacing="0">
! 230: <tbody>
! 231: <tr>
! 232: <th>Data type</th>
! 233: <th>Description</th>
! 234: </tr>
! 235: <tr>
! 236: <td>object_t</td>
! 237: <td>Used to identify a object.</td>
! 238: </tr>
! 239: <tr>
! 240: <td>task_t</td>
! 241: <td>Used to identify a task.</td>
! 242: </tr>
! 243: <tr>
! 244: <td>thread_t</td>
! 245: <td>Used to identify a thread.</td>
! 246: </tr>
! 247: <tr>
! 248: <td>device_t</td>
! 249: <td>Used to identify a device.</td>
! 250: </tr>
! 251: <tr>
! 252: <td>mutex_t</td>
! 253: <td>Used to identify a mutex.</td>
! 254: </tr>
! 255: <tr>
! 256: <td>cond_t</td>
! 257: <td>Used to identify a condition variable.</td>
! 258: </tr>
! 259: <tr>
! 260: <td>sem_t</td>
! 261: <td>Used to identify a semaphore.</td>
! 262: </tr>
! 263: <tr>
! 264: <td>cap_t</td>
! 265: <td>Used to represent a task capability.</td>
! 266: </tr>
! 267:
! 268: </tbody>
! 269: </table>
! 270:
! 271:
! 272: <h3 id="err">Error Numbers</h3>
! 273: <p>
! 274: The definition of the Prex kernel error is compatible with the POSIX
! 275: error number. However, unlike POSIX, Prex does not use an errno variable
! 276: because errno is not MT-safe. So, most functions in kernel API will
! 277: provide an error number as a return value.
! 278: </p>
! 279: <p>
! 280: The following error names are used as the possible error number.
! 281: </p>
! 282: <dl>
! 283: <dt>[EPERM]</dt>
! 284: <dd>Operation not permitted.</dd>
! 285: <dt>[ENOENT]</dt>
! 286: <dd>No such file or directory.</dd>
! 287: <dt>[ESRCH]</dt>
! 288: <dd>No such process.</dd>
! 289: <dt>[EINTR]</dt>
! 290: <dd>Interrupted system call.</dd>
! 291: <dt>[EIO]</dt>
! 292: <dd>I/O error.</dd>
! 293: <dt>[ENXIO]</dt>
! 294: <dd>No such device or address.</dd>
! 295: <dt>[EAGAIN]</dt>
! 296: <dd>Try again.</dd>
! 297: <dt>[ENOMEM]</dt>
! 298: <dd>Out of memory.</dd>
! 299: <dt>[EACCES]</dt>
! 300: <dd>Permission denied.</dd>
! 301: <dt>[EFAULT]</dt>
! 302: <dd>Bad address.</dd>
! 303: <dt>[EBUSY]</dt>
! 304: <dd>Device or resource busy.</dd>
! 305: <dt>[EEXIST]</dt>
! 306: <dd>File exists.</dd>
! 307: <dt>[ENODEV]</dt>
! 308: <dd>No such device.</dd>
! 309: <dt>[EINVAL]</dt>
! 310: <dd>Invalid argument.</dd>
! 311: <dt>[ERANGE]</dt>
! 312: <dd>Math result not representable.</dd>
! 313: <dt>[EDEADLK]</dt>
! 314: <dd>Resource deadlock avoided.</dd>
! 315: <dt>[ENOSYS]</dt>
! 316: <dd>Function not implemented.</dd>
! 317: <dt>[ENAMETOOLONG]</dt>
! 318: <dd>File name too long.</dd>
! 319: <dt>[ETIMEDOUT]</dt>
! 320: <dd>Timed out.</dd>
! 321:
! 322: </dl>
! 323:
! 324: <h2 id="obj">Object</h2>
! 325:
! 326: <h3 id="obj0">NAME</h3>
! 327: object_create() - create a new object
! 328:
! 329: <h3>SYNOPSIS</h3>
! 330: <pre>
! 331: int object_create(const char *name, object_t *obj);
! 332: </pre>
! 333:
! 334: <h3>DESCRIPTION</h3>
! 335: The object_create() function creates a new object.
! 336: The ID of the new object is stored in <i>obj</i> on success.
! 337: <br><br>
! 338: The name of the object must be unique in the system.
! 339: Or, the object can be created without name by setting NULL
! 340: as <i>name</i> argument. This object can be used as a private object
! 341: which can be accessed only by threads in the same task.
! 342:
! 343: <h3>ERRORS</h3>
! 344: <dl>
! 345: <dt>[EFAULT]</dt>
! 346: <dd>The address of <i>name</i> or <i>obj</i> is inaccessible.</dd>
! 347: <dt>[ENAMETOOLONG]</dt>
! 348: <dd>The length of the <i>name</i> argument exceeds MAX_OBJNAME.</dd>
! 349: <dt>[EEXIST]</dt>
! 350: <dd>The named object already exists.</dd>
! 351: <dt>[ENOMEM]</dt>
! 352: <dd>The system is unable to allocate resources.</dd>
! 353: </dl>
! 354: <br>
! 355: <hr size="1">
! 356:
! 357:
! 358: <h3 id="obj1">NAME</h3>
! 359: object_delete() - delete an object
! 360:
! 361: <h3>SYNOPSIS</h3>
! 362: <pre>
! 363: int object_delete(object_t obj);
! 364: </pre>
! 365:
! 366: <h3>DESCRIPTION</h3>
! 367: The object_delete() function deletes the object specified by <i>obj</i>.
! 368: <br><br>
! 369: A thread can delete the object only when the target object is created
! 370: by the thread of the same task.
! 371: All pending messages related to the deleted object are automatically canceled.
! 372:
! 373: <h3>ERRORS</h3>
! 374: <dl>
! 375: <dt>[EINVAL]</dt>
! 376: <dd>The specified <i>obj</i> is not a valid object ID.</dd>
! 377: <dt>[EACCESS]</dt>
! 378: <dd>The thread is not allowed to delete the object.</dd>
! 379: </dl>
! 380: <br>
! 381: <hr size="1">
! 382:
! 383:
! 384: <h3 id="obj2">NAME</h3>
! 385: object_lookup() - lookup an object
! 386:
! 387: <h3>SYNOPSIS</h3>
! 388: <pre>
! 389: int object_lookup(const char *name, object_t *obj);
! 390: </pre>
! 391:
! 392: <h3>DESCRIPTION</h3>
! 393: The object_lookup() function searches an object in the object name space.
! 394: The <i>name</i> argument is the null-terminated string.
! 395: The object ID is returned in <i>obj</i> on success.
! 396:
! 397: <h3>ERRORS</h3>
! 398: <dl>
! 399: <dt>[EFAULT]</dt>
! 400: <dd>The address of <i>name</i> or <i>obj</i> is inaccessible.</dd>
! 401: <dt>[ESRCH]</dt>
! 402: <dd>The length of the <i>name</i> argument exceeds MAX_OBJNAME.</dd>
! 403: <dt>[ENOENT]</dt>
! 404: <dd>The specified object does not exist.</dd>
! 405: </dl>
! 406: <br>
! 407:
! 408:
! 409: <h2 id="msg">Message</h2>
! 410:
! 411: <h3 id="msg0">NAME</h3>
! 412: msg_send() - send a message
! 413:
! 414: <h3>SYNOPSIS</h3>
! 415: <pre>
! 416: int msg_send(object_t obj, void *msg, size_t size);
! 417: </pre>
! 418:
! 419: <h3>DESCRIPTION</h3>
! 420: The msg_send() function sends a message to an object.
! 421: The caller thread will be blocked until any other thread receives
! 422: the message and calls msg_reply() for this object.
! 423: A thread can send a message to any object if it knows the object ID.
! 424: <br><br>
! 425: The <i>size</i> argument specifies the size of the message buffer to send.
! 426: <br><br>
! 427: The message is the binary data block which includes a message header.
! 428: The kernel does not touch the message body, and it is
! 429: necessary to recognize the predefined message format between sender
! 430: and receiver.
! 431:
! 432: <h3>ERRORS</h3>
! 433: <dl>
! 434: <dt>[EINVAL]</dt>
! 435: <dd>The specified <i>obj</i> is not a valid object ID.</dd>
! 436: <dt>[EFAULT]</dt>
! 437: <dd>The buffer of <i>msg</i> is inaccessible.</dd>
! 438: <dt>[EDEADLK]</dt>
! 439: <dd><i>obj</i> is the object that the caller thread is receiving from now.</dd>
! 440: <dt>[EAGAIN]</dt>
! 441: <dd>The receiver thread has been terminated.</dd>
! 442: <dt>[EINTR]</dt>
! 443: <dd>The function was interrupted by an exception.</dd>
! 444: <dt>[EPERM]</dt>
! 445: <dd>The caller task is not an owner of the <i>obj</i>, but it
! 446: does not have CAP_IPC capability.</dd>
! 447: </dl>
! 448: <br>
! 449: <hr size="1">
! 450:
! 451:
! 452: <h3 id="msg1">NAME</h3>
! 453: msg_receive() - receive a message
! 454:
! 455: <h3>SYNOPSIS</h3>
! 456: <pre>
! 457: int msg_receive(object_t obj, void *msg, size_t size);
! 458: </pre>
! 459:
! 460: <h3>DESCRIPTION</h3>
! 461: The msg_receive() function receives a message from an object.
! 462: A thread can receive a message from the object which was created
! 463: by the thread in the same task. If the message has not arrived, the
! 464: caller thread blocks until any message comes in.
! 465: <br><br>
! 466: The <i>size</i> argument specifies the "maximum" size of the message
! 467: buffer to receive. If the sent message is larger than this size,
! 468: the kernel will automatically clip the message to the receive buffer size.
! 469: <br><br>
! 470: A thread can not receive the multiple messages at once.
! 471:
! 472: <h3>ERRORS</h3>
! 473: <dl>
! 474: <dt>[EINVAL]</dt>
! 475: <dd>The specified <i>obj</i> is not a valid object ID.</dd>
! 476: <dt>[EACCESS]</dt>
! 477: <dd>The caller task is not the owner of the target object.</dd>
! 478: <dt>[EBUSY]</dt>
! 479: <dd>The caller thread does not finish the previous receive operation.</dd>
! 480: <dt>[EFAULT]</dt>
! 481: <dd>The buffer of <i>msg</i> is inaccessible.</dd>
! 482: <dt>[EINTR]</dt>
! 483: <dd>The function was interrupted by an exception.</dd>
! 484: </dl>
! 485: <br>
! 486: <hr size="1">
! 487:
! 488:
! 489: <h3 id="msg2">NAME</h3>
! 490: msg_reply() - reply to an object
! 491:
! 492: <h3>SYNOPSIS</h3>
! 493: <pre>
! 494: int msg_reply(object_t obj, void *msg, size_t size);
! 495: </pre>
! 496:
! 497: <h3>DESCRIPTION</h3>
! 498: The msg_reply() function sends a reply message to the object.
! 499: A thread must reply to the correct object that the thread
! 500: preciously received from. Otherwise, this function will be failed.
! 501: <br><br>
! 502: The <i>size</i> argument specifies the size of the message buffer to reply.
! 503:
! 504: <h3>ERRORS</h3>
! 505: <dl>
! 506: <dt>[EINVAL]</dt>
! 507: <dd>The specified <i>obj</i> is not a valid object ID. Or, the sender
! 508: thread has been terminated.</dd>
! 509: <dt>[EFAULT]</dt>
! 510: <dd>The buffer of <i>msg</i> is inaccessible.</dd>
! 511: </dl>
! 512: <br>
! 513:
! 514:
! 515: <h2 id="task">Task</h2>
! 516:
! 517: <h3 id="task0">NAME</h3>
! 518: task_create() - create a new task
! 519:
! 520: <h3>SYNOPSIS</h3>
! 521: <pre>
! 522: int task_create(task_t parent, int vm_option, task_t *child);
! 523: </pre>
! 524:
! 525: <h3>DESCRIPTION</h3>
! 526: The task_create() function create a new task.
! 527: If <i>vm_option</i> option can be one of the following:
! 528: <ul>
! 529: <li>VM_NEW - The new task has clean memory image.</li>
! 530: <li>VM_COPY - The new task will have the duplicated memory image with the parent task.</li>
! 531: <li>VM_SHARE - The new task will share the same memory image with the parent task.</li>
! 532: </ul>
! 533: The child task initially contains no threads.
! 534: So, the caller task must create new thread under the child task to
! 535: run it.
! 536: <br><br>
! 537: <i>vm_option</i> flag is supported only with MMU system. The created
! 538: task has always new memory map with NOMMU system.
! 539: <br><br>
! 540: The function returns the created task ID in <i>child</i>,
! 541: and child task will receive 0 as <i>child</i>.
! 542:
! 543: <h3>ERRORS</h3>
! 544: <dl>
! 545: <dt>[ESRCH]</dt>
! 546: <dd>The specified <i>parent</i> is not a valid task ID.</dd>
! 547: <dt>[EFAULT]</dt>
! 548: <dd>The address of <i>child</i> is inaccessible.</dd>
! 549: <dt>[ENOMEM]</dt>
! 550: <dd>The system is unable to allocate resources.</dd>
! 551: <dt>[EPERM]</dt>
! 552: <dd>The specified <i>parent</i> is not a current task, but the caller
! 553: task does not have CAP_TASK capability.</dd>
! 554: </dl>
! 555: <br>
! 556: <hr size="1">
! 557:
! 558:
! 559: <h3 id="task1">NAME</h3>
! 560: task_terminate() - terminate a task
! 561:
! 562: <h3>SYNOPSIS</h3>
! 563: <pre>
! 564: int task_terminate(task_t task);
! 565: </pre>
! 566:
! 567: <h3>DESCRIPTION</h3>
! 568: The task_terminate() function terminates a task and deallocates all resource
! 569: for the task.
! 570: <br><br>
! 571: If the <i>task</i> argument point to the current task, this routine never returns.
! 572:
! 573: <h3>ERRORS</h3>
! 574: <dl>
! 575: <dt>[ESRCH]</dt>
! 576: <dd>The specified <i>task</i> is not a valid task ID.</dd>
! 577: <dt>[EPERM]</dt>
! 578: <dd>The specified <i>task</i> is not a current task, but the caller
! 579: task does not have CAP_TASK capability.</dd>
! 580: </dl>
! 581: <br>
! 582: <hr size="1">
! 583:
! 584:
! 585: <h3 id="task2">NAME</h3>
! 586: task_self() - return task ID
! 587:
! 588: <h3>SYNOPSIS</h3>
! 589: <pre>
! 590: task_t task_self(void);
! 591: </pre>
! 592:
! 593: <h3>DESCRIPTION</h3>
! 594: The task_self() function returns ID of the current task.
! 595:
! 596: <h3>RETURN VALUE</h3>
! 597: Current task ID.
! 598: <br>
! 599: <br>
! 600: <hr size="1">
! 601:
! 602:
! 603: <h3 id="task3">NAME</h3>
! 604: task_suspend() - suspend a task
! 605:
! 606: <h3>SYNOPSIS</h3>
! 607: <pre>
! 608: int task_suspend(task_t task);
! 609: </pre>
! 610:
! 611: <h3>DESCRIPTION</h3>
! 612: The task_suspend() function suspends all threads within the specified task.
! 613:
! 614: <h3>ERRORS</h3>
! 615: <dl>
! 616: <dt>[EINVAL]</dt>
! 617: <dd>The specified <i>task</i> is not a valid task ID.</dd>
! 618: <dt>[ESRCH]</dt>
! 619: <dd>The specified <i>task</i> is not a current task, but the caller
! 620: task does not have CAP_TASK capability.</dd>
! 621: </dl>
! 622: <br>
! 623: <hr size="1">
! 624:
! 625:
! 626: <h3 id="task4">NAME</h3>
! 627: task_resume() - resume a task
! 628:
! 629: <h3>SYNOPSIS</h3>
! 630: <pre>
! 631: int task_resume(task_t task);
! 632: </pre>
! 633:
! 634: <h3>DESCRIPTION</h3>
! 635: The task_resume() function resumes all threads within the specified task.
! 636:
! 637: <h3>ERRORS</h3>
! 638: <dl>
! 639: <dt>[ESRCH]</dt>
! 640: <dd>The specified <i>task</i> is not a valid task ID.</dd>
! 641: <dt>[EINVAL]</dt>
! 642: <dd>The specified <i>task</i> is not suspended now.</dd>
! 643: <dt>[EPERM]</dt>
! 644: <dd>The specified <i>task</i> is not a current task, but the caller
! 645: task does not have CAP_TASK capability.</dd>
! 646: </dl>
! 647: <br>
! 648: <hr size="1">
! 649:
! 650:
! 651: <h3 id="task5">NAME</h3>
! 652: task_name() - set task name
! 653:
! 654: <h3>SYNOPSIS</h3>
! 655: <pre>
! 656: int task_name(task_t task, const char *name);
! 657: </pre>
! 658:
! 659: <h3>DESCRIPTION</h3>
! 660: The task_name() function set the name of the specified task. The task name can
! 661: be changed at any time.
! 662: <br><br>
! 663: This function does not returns error even if the same task name already
! 664: exists in the system.
! 665:
! 666: <h3>ERRORS</h3>
! 667: <dl>
! 668: <dt>[ESRCH]</dt>
! 669: <dd>The specified <i>task</i> is not a valid task ID.</dd>
! 670: <dt>[EFAULT]</dt>
! 671: <dd>The address of <i>name</i> is inaccessible.</dd>
! 672: <dt>[ENAMETOOLONG]</dt>
! 673: <dd>The length of the <i>name</i> argument exceeds MAX_TASKNAME.</dd>
! 674: <dt>[EPERM]</dt>
! 675: <dd>The specified <i>task</i> is not a current task, but the caller
! 676: task does not have CAP_TASK capability.</dd>
! 677: </dl>
! 678: <br>
! 679: <hr size="1">
! 680:
! 681: <h3 id="task6">NAME</h3>
! 682: task_getcap() - get a task capability
! 683:
! 684: <h3>SYNOPSIS</h3>
! 685: <pre>
! 686: int task_getcap(task_t task, cap_t *cap);
! 687: </pre>
! 688:
! 689: <h3>DESCRIPTION</h3>
! 690: <p>
! 691: The task_getcap() function returns the capability of the
! 692: specified task.
! 693: </p>
! 694:
! 695:
! 696: <h3>ERRORS</h3>
! 697: <dl>
! 698: <dt>[ESRCH]</dt>
! 699: <dd>The specified <i>task</i> is not a valid task ID.</dd>
! 700: <dt>[EFAULT]</dt>
! 701: <dd>The address of <i>cap</i> is inaccessible.</dd>
! 702: </dl>
! 703: <br>
! 704:
! 705:
! 706: <hr size="1">
! 707:
! 708: <h3 id="task7">NAME</h3>
! 709: task_setcap() - set a task capability
! 710:
! 711: <h3>SYNOPSIS</h3>
! 712: <pre>
! 713: int task_setcap(task_t task, cap_t *cap);
! 714: </pre>
! 715:
! 716: <h3>DESCRIPTION</h3>
! 717: <p>
! 718: The task_setcap() function set the capability of the
! 719: specified task.
! 720: </p>
! 721: <p>
! 722: The following task capabilities are supported.
! 723: </p>
! 724: <dl>
! 725: <dt>CAP_SETPCAP</dt>
! 726: <dd>Allow setting capability.</dd>
! 727: <dt>CAP_TASK</dt>
! 728: <dd>Allow controlling another task's execution.</dd>
! 729: <dt>CAP_MEMORY</dt>
! 730: <dd>Allow touching another task's memory.</dd>
! 731: <dt>CAP_KILL</dt>
! 732: <dd>Allow raising exception to another task.</dd>
! 733: <dt>CAP_SEMAPHORE</dt>
! 734: <dd>Allow accessing another task's semaphore.</dd>
! 735: <dt>CAP_NICE</dt>
! 736: <dd>Allow changing scheduling parameter.</dd>
! 737: <dt>CAP_IPC</dt>
! 738: <dd>Allow accessing another task's IPC object.</dd>
! 739: <dt>CAP_DEVIO</dt>
! 740: <dd>Allow device I/O operations.</dd>
! 741: <dt>CAP_POWER</dt>
! 742: <dd>Allow power control including shutdown.</dd>
! 743: <dt>CAP_TIME</dt>
! 744: <dd>Allow setting system time.</dd>
! 745: <dt>CAP_RAWIO</dt>
! 746: <dd>Allow direct I/O access.</dd>
! 747: <dt>CAP_MOUNT</dt>
! 748: <dd>Allow mounting a file system.</dd>
! 749: <dt>CAP_CHROOT</dt>
! 750: <dd>Allow changing a root directory.</dd>
! 751: </dl>
! 752:
! 753: <h3>ERRORS</h3>
! 754: <dl>
! 755: <dt>[ESRCH]</dt>
! 756: <dd>The specified <i>task</i> is not a valid task ID.</dd>
! 757: <dt>[EFAULT]</dt>
! 758: <dd>The address of <i>cap</i> is inaccessible.</dd>
! 759: <dt>[EPERM]</dt>
! 760: <dd>The caller task does not have CAP_SETPCAP capability.</dd>
! 761: </dl>
! 762: <br>
! 763:
! 764:
! 765: <h2 id="thr">Thread</h2>
! 766:
! 767: <h3 id="thr0">NAME</h3>
! 768: thread_create() - create a new thread
! 769:
! 770: <h3>SYNOPSIS</h3>
! 771: <pre>
! 772: int thread_create(task_t task, thread_t *th);
! 773: </pre>
! 774:
! 775: <h3>DESCRIPTION</h3>
! 776: The thread_create() function creates a new thread within <i>task</i>.
! 777: The new thread will start at the return address of the thread_create() call.
! 778: <br><br>
! 779: Since the created thread is initially set to the suspended state,
! 780: thread_resume() must be called to start it.
! 781:
! 782: <h3>ERRORS</h3>
! 783: <dl>
! 784: <dt>[ESRCH]</dt>
! 785: <dd>The specified <i>task</i> is not a valid task ID.</dd>
! 786: <dt>[EFAULT]</dt>
! 787: <dd>The address of <i>th</i> is inaccessible.</dd>
! 788: <dt>[ENOMEM]</dt>
! 789: <dd>The system is unable to allocate resources.</dd>
! 790: <dt>[EPERM]</dt>
! 791: <dd>The specified <i>task</i> is not a current task, but the caller
! 792: task does not have CAP_TASK capability.</dd>
! 793: </dl>
! 794: <br>
! 795: <hr size="1">
! 796:
! 797:
! 798: <h3 id="thr1">NAME</h3>
! 799: thread_terminate() - terminate a thread
! 800:
! 801: <h3>SYNOPSIS</h3>
! 802: <pre>
! 803: int thread_terminate(thread_t th);
! 804: </pre>
! 805:
! 806: <h3>DESCRIPTION</h3>
! 807: The thread_terminate() function terminates a thread.
! 808: It will release all resources used by the target thread.
! 809: <br><br>
! 810: If specified <i>th</i> is the current thread, this routine never returns.
! 811:
! 812: <h3>ERRORS</h3>
! 813: <dl>
! 814: <dt>[ESRCH]</dt>
! 815: <dd>The specified thread <i>th</i> is not a valid thread ID.</dd>
! 816: <dt>[EPERM]</dt>
! 817: <dd>The caller task is not an owner of the specified <i>th</i>, but the caller
! 818: task does not have CAP_TASK capability.</dd>
! 819: </dl>
! 820: <br>
! 821: <hr size="1">
! 822:
! 823:
! 824: <h3 id="thr2">NAME</h3>
! 825: thread_load() - load the thread state
! 826:
! 827: <h3>SYNOPSIS</h3>
! 828: <pre>
! 829: int thread_load(thread_t th, void *entry, void *stack);
! 830: </pre>
! 831:
! 832: <h3>DESCRIPTION</h3>
! 833: The thread_load() function loads the thread state (program counter and
! 834: stack pointer).
! 835: <br><br>
! 836: The <i>entry</i> or <i>stack</i> argument can be set to NULL. In this
! 837: case, the previous state is used.
! 838:
! 839: <h3>ERRORS</h3>
! 840: <dl>
! 841: <dt>[ESRCH]</dt>
! 842: <dd>The specified <i>th</i> is not a valid thread ID.</dd>
! 843: <dt>[EINVAL]</dt>
! 844: <dd><i>entry</i> or <i>stack</i> is not a valid address.</dd>
! 845: <dt>[EPERM]</dt>
! 846: <dd>The caller task is not an owner of the specified <i>th</i>, but the caller
! 847: task does not have CAP_TASK capability.</dd>
! 848: </dl>
! 849: <br>
! 850: <hr size="1">
! 851:
! 852:
! 853: <h3 id="thr3">NAME</h3>
! 854: thread_self() - return thread ID
! 855:
! 856: <h3>SYNOPSIS</h3>
! 857: <pre>
! 858: thread_t thread_self(void);
! 859: </pre>
! 860:
! 861: <h3>DESCRIPTION</h3>
! 862: The thread_self() function returns ID of the current thread.
! 863:
! 864: <h3>RETURN VALUE</h3>
! 865: Current thread ID.
! 866: <br>
! 867: <br>
! 868: <hr size="1">
! 869:
! 870:
! 871: <h3 id="thr4">NAME</h3>
! 872: thread_yield() - yield the processor
! 873:
! 874: <h3>SYNOPSIS</h3>
! 875: <pre>
! 876: void thread_yield(void);
! 877: </pre>
! 878:
! 879: <h3>DESCRIPTION</h3>
! 880: The thread_yield() function forces the current thread to release
! 881: the processor.
! 882:
! 883: <h3>ERRORS</h3>
! 884: No errors are defined.
! 885: <br>
! 886: <br>
! 887: <hr size="1">
! 888:
! 889:
! 890: <h3 id="thr5">NAME</h3>
! 891: thread_suspend() - suspend a thread
! 892:
! 893: <h3>SYNOPSIS</h3>
! 894: <pre>
! 895: int thread_suspend(thread_t th);
! 896: </pre>
! 897:
! 898: <h3>DESCRIPTION</h3>
! 899: The thread_suspend() function suspends the specified thread.
! 900: Although a thread can be suspended any number of times,
! 901: it does not start to run unless it is resumed by the same
! 902: number of suspend.
! 903:
! 904: <h3>ERRORS</h3>
! 905: <dl>
! 906: <dt>[ESRCH]</dt>
! 907: <dd>The specified <i>th</i> is not a valid thread ID.</dd>
! 908: <dt>[EPERM]</dt>
! 909: <dd>The caller task is not an owner of the specified <i>th</i>, but the caller
! 910: task does not have CAP_TASK capability.</dd>
! 911: </dl>
! 912: <br>
! 913: <hr size="1">
! 914:
! 915:
! 916: <h3 id="thr6">NAME</h3>
! 917: thread_resume() - resume a thread
! 918:
! 919: <h3>SYNOPSIS</h3>
! 920: <pre>
! 921: int thread_resume(thread_t th);
! 922: </pre>
! 923:
! 924: <h3>DESCRIPTION</h3>
! 925: The thread_resume() function resumes the specified thread.
! 926: A thread does not begin to run, unless both a thread suspend
! 927: count and a task suspend count are set to 0.
! 928:
! 929: <h3>ERRORS</h3>
! 930: <dl>
! 931: <dt>[ESRCH]</dt>
! 932: <dd>The specified <i>th</i> is not a valid thread ID.</dd>
! 933: <dt>[EINVAL]</dt>
! 934: <dd>The specified <i>th</i> is not suspended now.</dd>
! 935: <dt>[EPERM]</dt>
! 936: <dd>The caller task is not an owner of the specified <i>th</i>, but the caller
! 937: task does not have CAP_TASK capability.</dd>
! 938: </dl>
! 939: <br>
! 940: <hr size="1">
! 941:
! 942:
! 943: <h3 id="thr7">NAME</h3>
! 944: thread_schedparam() - get/set scheduling parameters
! 945:
! 946: <h3>SYNOPSIS</h3>
! 947: <pre>
! 948: int thread_schedparam(thread_t th, int op, int *param);
! 949: </pre>
! 950:
! 951: <h3>DESCRIPTION</h3>
! 952: The thread_schedparam() function gets/sets the various scheduling parameter.
! 953: <i>op</i> argument is an operation ID which is one of the following value.
! 954: <ul>
! 955: <li>OP_GETPRIO - get the scheduling priority</li>
! 956: <li>OP_SETPRIO - set the scheduling priority</li>
! 957: <li>OP_GETPOLICY - get the scheduling policy</li>
! 958: <li>OP_SETPOLICY - set the scheduling policy</li>
! 959: </ul>
! 960: The kernel supports the following scheduling policy.
! 961: <ul>
! 962: <li>SCHED_FIFO - First-in First-out</li>
! 963: <li>SCHED_RR - Round Robin</li>
! 964: </ul>
! 965:
! 966: <h3>ERRORS</h3>
! 967: <dl>
! 968: <dt>[ESRCH]</dt>
! 969: <dd>The specified <i>th</i> is not a valid thread ID.</dd>
! 970: <dt>[EFAULT]</dt>
! 971: <dd>The address of <i>param</i> is inaccessible.</dd>
! 972: <dt>[EINVAL]</dt>
! 973: <dd>The kernel does not support the specified policy.</dd>
! 974: <dt>[EPERM]</dt>
! 975: <dd>The caller task is not an owner of the specified <i>th</i>, or the caller
! 976: task does not have CAP_NICE capability to change the parameter.</dd>
! 977: </dl>
! 978: <br>
! 979:
! 980:
! 981:
! 982: <h2 id="vm">Virtual Memory</h2>
! 983:
! 984: <h3 id="vm0">NAME</h3>
! 985: vm_allocate() - allocate memory
! 986:
! 987: <h3>SYNOPSIS</h3>
! 988: <pre>
! 989: int vm_allocate(task_t task, void **addr, size_t size, int anywhere);
! 990: </pre>
! 991:
! 992: <h3>DESCRIPTION</h3>
! 993: The vm_allocate() function allocates a zero-filled memory in the <i>task</i>'s
! 994: memory space.
! 995: If the <i>anywhere</i> option is false, the kernel try to allocate the
! 996: memory to the address specified by <i>addr</i>. If <i>addr</i> is not
! 997: aligned to the page boundary, it will be automatically round down to one.
! 998: <i>size</i> argument is an allocation size in byte. It will also be adjusted
! 999: to the page boundary.
! 1000:
! 1001: <h3>ERRORS</h3>
! 1002: <dl>
! 1003: <dt>[ESRCH]</dt>
! 1004: <dd>The specified <i>task</i> is not a valid task ID.</dd>
! 1005: <dt>[EACCESS]</dt>
! 1006: <dd>The task is not allowed to allocate the memory to the specified address.</dd>
! 1007: <dt>[EFAULT]</dt>
! 1008: <dd>The address of <i>addr</i> is inaccessible.</dd>
! 1009: <dt>[ENOMEM]</dt>
! 1010: <dd>Not enough space.</dd>
! 1011: <dt>[EINVAL]</dt>
! 1012: <dd>The specified location is already allocated.</dd>
! 1013: <dt>[EPERM]</dt>
! 1014: <dd>The specified <i>task</i> is not a current task, but the caller
! 1015: task does not have CAP_MEMORY capability.</dd>
! 1016: </dl>
! 1017: <hr size="1">
! 1018:
! 1019:
! 1020: <h3 id="vm1">NAME</h3>
! 1021: vm_free() - free memory
! 1022:
! 1023: <h3>SYNOPSIS</h3>
! 1024: <pre>
! 1025: int vm_free(task_t task, void *addr);
! 1026: </pre>
! 1027:
! 1028: <h3>DESCRIPTION</h3>
! 1029: The vm_free() function deallocates the memory region.
! 1030: The <i>addr</i> argument must point to the memory region previously
! 1031: allocated by vm_allocate() or vm_map().
! 1032:
! 1033: <h3>ERRORS</h3>
! 1034: <dl>
! 1035: <dt>[ESRCH]</dt>
! 1036: <dd>The specified <i>task</i> is not a valid task ID.</dd>
! 1037: <dt>[EFAULT]</dt>
! 1038: <dd>The address of <i>addr</i> is inaccessible.</dd>
! 1039: <dt>[EINVAL]</dt>
! 1040: <dd>The specified location is not allocated.</dd>
! 1041: <dt>[EPERM]</dt>
! 1042: <dd>The specified <i>task</i> is not a current task, but the caller
! 1043: task does not have CAP_MEMORY capability.</dd>
! 1044: </dl>
! 1045: <hr size="1">
! 1046:
! 1047:
! 1048: <h3 id="vm2">NAME</h3>
! 1049: vm_attribute() - change memory attribute
! 1050:
! 1051: <h3>SYNOPSIS</h3>
! 1052: <pre>
! 1053: int vm_attribute(task_t task, void *addr, int attr);
! 1054: </pre>
! 1055:
! 1056: <h3>DESCRIPTION</h3>
! 1057: The vm_attribute() function changes the memory attribute.
! 1058: The <i>addr</i> argument must point to the memory region previously
! 1059: allocated by vm_allocate() or vm_map().
! 1060: The attribute type can be chosen a combination of
! 1061: ATTR_READ, ATTR_WRITE.
! 1062: Note: ATTR_EXEC is not supported, yet.
! 1063:
! 1064: <h3>ERRORS</h3>
! 1065: <dl>
! 1066: <dt>[ESRCH]</dt>
! 1067: <dd>The specified <i>task</i> is not a valid task ID.</dd>
! 1068: <dt>[EFAULT]</dt>
! 1069: <dd>The address of <i>addr</i> is inaccessible.</dd>
! 1070: <dt>[EINVAL]</dt>
! 1071: <dd>The specified location is not allocated. Or, the kernel does not
! 1072: support the specified attribute.</dd>
! 1073: <dt>[EPERM]</dt>
! 1074: <dd>The specified <i>task</i> is not a current task, but the caller
! 1075: task does not have CAP_MEMORY capability.</dd>
! 1076: </dl>
! 1077: <hr size="1">
! 1078:
! 1079:
! 1080: <h3 id="vm3">NAME</h3>
! 1081: vm_map() - map memory
! 1082:
! 1083: <h3>SYNOPSIS</h3>
! 1084: <pre>
! 1085: int vm_map(task_t task, void *addr, size_t size, void **alloc);
! 1086: </pre>
! 1087:
! 1088: <h3>DESCRIPTION</h3>
! 1089: The vm_map() function maps another task's memory to the current
! 1090: task.
! 1091: The <i>task</i> argument is the memory owner to map. The memory is
! 1092: automatically mapped to the free area of current task. The mapped
! 1093: address is stored in <i>alloc</i> on success.
! 1094:
! 1095: <h3>ERRORS</h3>
! 1096: <dl>
! 1097: <dt>[ESRCH]</dt>
! 1098: <dd>The specified <i>task</i> is not a valid task ID.</dd>
! 1099: <dt>[EFAULT]</dt>
! 1100: <dd>The address of <i>addr</i> or <i>alloc</i> is inaccessible.</dd>
! 1101: <dt>[EINVAL]</dt>
! 1102: <dd>The specified location is not allocated.</dd>
! 1103: <dt>[ENOMEM]</dt>
! 1104: <dd>Not enough space.</dd>
! 1105: <dt>[EPERM]</dt>
! 1106: <dd>The specified <i>task</i> is not a current task, but the caller
! 1107: task does not have CAP_MEMORY capability.</dd>
! 1108: </dl>
! 1109: <br>
! 1110:
! 1111: <h2 id="tmr">Timer</h2>
! 1112:
! 1113:
! 1114: <h3 id="tmr0">NAME</h3>
! 1115: timer_sleep() - sleep for a while
! 1116:
! 1117: <h3>SYNOPSIS</h3>
! 1118: <pre>
! 1119: int timer_sleep(u_long delay, u_long *remain);
! 1120: </pre>
! 1121:
! 1122: <h3>DESCRIPTION</h3>
! 1123: The timer_sleep() function stops execution of the current thread
! 1124: until specified time passed.
! 1125: The <i>delay</i> argument is the delay time in milli second.
! 1126: If this function is canceled by some reason, the remaining time
! 1127: is stored in <i>remain</i>.
! 1128:
! 1129: <h3>ERRORS</h3>
! 1130: <dl>
! 1131: <dt>[EFAULT]</dt>
! 1132: <dd>The address of <i>remain</i> is inaccessible.</dd>
! 1133: <dt>[EINTR]</dt>
! 1134: <dd>The function was interrupted by an exception.</dd>
! 1135: </dl>
! 1136: <br>
! 1137: <hr size="1">
! 1138:
! 1139:
! 1140: <h3 id="tmr1">NAME</h3>
! 1141: timer_alarm() - schedule an alarm exception
! 1142:
! 1143: <h3>SYNOPSIS</h3>
! 1144: <pre>
! 1145: int timer_alarm(u_long delay, u_long *remain);
! 1146: </pre>
! 1147:
! 1148: <h3>DESCRIPTION</h3>
! 1149: The timer_alarm() function sends EXC_ALRM exception to the caller task
! 1150: after the specified <i>delay</i> milli seconds is passed.
! 1151: If <i>delay</i> is 0, it stops the alarm timer. When the previous alarm
! 1152: timer is already working, the remaining time is stored in <i>remain</i>.
! 1153:
! 1154: <h3>ERRORS</h3>
! 1155: <dl>
! 1156: <dt>[EFAULT]</dt>
! 1157: <dd>The address of <i>remain</i> is inaccessible.</dd>
! 1158: </dl>
! 1159: <br>
! 1160: <hr size="1">
! 1161:
! 1162:
! 1163: <h3 id="tmr2">NAME</h3>
! 1164: timer_periodic() - set a periodic timer
! 1165:
! 1166: <h3>SYNOPSIS</h3>
! 1167: <pre>
! 1168: int timer_periodic(thread_t th, u_long start, u_long period);
! 1169: </pre>
! 1170:
! 1171: <h3>DESCRIPTION</h3>
! 1172: The specified thread will be woken up in specified time interval.
! 1173: The <i>start</i> argument is the first wakeup time. If <i>start</i> is 0,
! 1174: current periodic timer is stopped. <i>period</i> is the time interval
! 1175: to wakeup. The unit of <i>start</i>/<i>period</i> is milli seconds.
! 1176:
! 1177: <h3>ERRORS</h3>
! 1178: <dl>
! 1179: <dt>[ESRCH]</dt>
! 1180: <dd>The specified thread <i>th</i> is not a valid thread ID.</dd>
! 1181: <dt>[EINVAL]</dt>
! 1182: <dd><i>start</i> is 0 even when the timer is not started.</dd>
! 1183: <dt>[ENOMEM]</dt>
! 1184: <dd>The system is unable to allocate resources.</dd>
! 1185: <dt>[EPERM]</dt>
! 1186: <dd>The specified thread <i>th</i> is not in the current task.</dd>
! 1187: </dl>
! 1188: <br>
! 1189: <hr size="1">
! 1190:
! 1191:
! 1192: <h3 id="tmr3">NAME</h3>
! 1193: timer_waitperiod() - wait timer period
! 1194:
! 1195: <h3>SYNOPSIS</h3>
! 1196: <pre>
! 1197: int timer_waitperiod(void);
! 1198: </pre>
! 1199:
! 1200: <h3>DESCRIPTION</h3>
! 1201: The timer_waitperiod() function waits the next period of the current
! 1202: running periodic timer.
! 1203: <br><br>
! 1204: Since this routine returns by any exception, the control
! 1205: may return at non-period time. So, the caller must retry
! 1206: immediately if the error status is EINTR.
! 1207:
! 1208: <h3>ERRORS</h3>
! 1209: <dl>
! 1210: <dt>[EINVAL]</dt>
! 1211: <dd>The periodic timer is not started for current thread.</dd>
! 1212: <dt>[EINTR]</dt>
! 1213: <dd>The function was interrupted by an exception.</dd>
! 1214: </dl>
! 1215: <br>
! 1216:
! 1217:
! 1218:
! 1219: <h2 id="ex">Exception</h2>
! 1220:
! 1221: <h3 id="ex0">NAME</h3>
! 1222: exception_setup() - setup exception handler
! 1223:
! 1224: <h3>SYNOPSIS</h3>
! 1225: <pre>
! 1226: int exception_setup(void (*handler)(int, void *));
! 1227: </pre>
! 1228:
! 1229: <h3>DESCRIPTION</h3>
! 1230: Setup an exception handler for the current task.
! 1231: NULL can be specified as <i>handler</i> to remove current handler.
! 1232: If the handler is removed, all pending exceptions are discarded
! 1233: and all exception_wait() are canceled.
! 1234: Only one exception handler can be set per task. If the previous
! 1235: handler exists in task, exception_setup() just overwrite the handler.
! 1236: <br><br>
! 1237: The exception handler must have the following arguments.<br>
! 1238: <br>
! 1239: void exception_handler(int excpt, void *regs);<br>
! 1240: <br>
! 1241: <i>excpt</i> is an exception number, and <i>regs</i> are the machine
! 1242: dependent registers. The exception handler must call the exception_return()
! 1243: function after it processes the exception.
! 1244:
! 1245: <h3>ERRORS</h3>
! 1246: <dl>
! 1247: <dt>[EFAULT]</dt>
! 1248: <dd>The address of <i>handler</i> is inaccessible.</dd>
! 1249: </dl>
! 1250: <br>
! 1251: <hr size="1">
! 1252:
! 1253:
! 1254: <h3 id="ex1">NAME</h3>
! 1255: exception_return() - return from exception handler
! 1256:
! 1257: <h3>SYNOPSIS</h3>
! 1258: <pre>
! 1259: int exception_return(void *regs);
! 1260: </pre>
! 1261:
! 1262: <h3>DESCRIPTION</h3>
! 1263: The exception_return() function is used to return from the exception
! 1264: handler. <i>regs</i> argument must be the same value which is passed
! 1265: to the handler.
! 1266:
! 1267: <h3>ERRORS</h3>
! 1268: <dl>
! 1269: <dt>[EFAULT]</dt>
! 1270: <dd>The address of <i>regs</i> is inaccessible.</dd>
! 1271: </dl>
! 1272: <br>
! 1273: <hr size="1">
! 1274:
! 1275:
! 1276: <h3 id="ex2">NAME</h3>
! 1277: exception_raise() - raise an exception
! 1278:
! 1279: <h3>SYNOPSIS</h3>
! 1280: <pre>
! 1281: int exception_raise(task_t task, int excpt);
! 1282: </pre>
! 1283:
! 1284: <h3>DESCRIPTION</h3>
! 1285: The exception_raise() function raises an exception for the specified task.
! 1286:
! 1287: <h3>ERRORS</h3>
! 1288: <dl>
! 1289: <dt>[ESRCH]</dt>
! 1290: <dd>The specified <i>task</i> is not a valid task ID.</dd>
! 1291: <dt>[EINVAL]</dt>
! 1292: <dd>The specified <i>excpt</i> is not a valid exception.</dd>
! 1293: <dt>[EPERM]</dt>
! 1294: <dd><i>task</i> is a kernel task, or the task does not register an
! 1295: exception handler.
! 1296: <dt>[EPERM]</dt>
! 1297: <dd>The specified <i>task</i> is not a current task, but the caller
! 1298: task does not have CAP_KILL capability.</dd>
! 1299: </dl>
! 1300: <br>
! 1301: <hr size="1">
! 1302:
! 1303:
! 1304: <h3 id="ex3">NAME</h3>
! 1305: exception_wait() - wait an exception
! 1306:
! 1307: <h3>SYNOPSIS</h3>
! 1308: <pre>
! 1309: int exception_wait(int *excpt);
! 1310: </pre>
! 1311:
! 1312: <h3>DESCRIPTION</h3>
! 1313: The exception_wait() function blocks the caller thread until
! 1314: any exception is raised to the thread.
! 1315: <br><br>
! 1316: This routine returns EINTR on success.
! 1317:
! 1318: <h3>ERRORS</h3>
! 1319: <dl>
! 1320: <dt>[EFAULT]</dt>
! 1321: <dd>The address of <i>excpt</i> is inaccessible.</dd>
! 1322: <dt>[EINVAL]</dt>
! 1323: <dd>The caller thread does not register an exception handler.</dd>
! 1324: </dl>
! 1325: <br>
! 1326:
! 1327:
! 1328: <h2 id="dev">Device</h2>
! 1329:
! 1330: <h3 id="dev0">NAME</h3>
! 1331: device_open() - open a device
! 1332:
! 1333: <h3>SYNOPSIS</h3>
! 1334: <pre>
! 1335: int device_open(const char *name, int mode, device_t *dev);
! 1336: </pre>
! 1337:
! 1338: <h3>DESCRIPTION</h3>
! 1339: The device_open() function opens the specified device.
! 1340: <i>mode</i> is one of the following open mode.
! 1341: <ul>
! 1342: <li>O_RDONLY - Read only</li>
! 1343: <li>O_WRONLY - Write only</li>
! 1344: <li>O_RDWR - Read & Write</li>
! 1345: </ul>
! 1346: The ID of the opened device is stored in <i>dev</i> on success.
! 1347:
! 1348: <h3>ERRORS</h3>
! 1349: <dl>
! 1350: <dt>[EFAULT]</dt>
! 1351: <dd>The address of <i>name</i> is inaccessible.</dd>
! 1352: <dt>[ENAMETOOLONG]</dt>
! 1353: <dd>The length of the <i>name</i> argument exceeds MAX_DEVNAME.</dd>
! 1354: <dt>[ENOENT]</dt>
! 1355: <dd>The length of the <i>name</i> argument is 0.</dd>
! 1356: <dt>[ENXIO]</dt>
! 1357: <dd>The device was not found.</dd>
! 1358: <dt>[EPERM]</dt>
! 1359: <dd>The caller task does not have CAP_DEVIO capability.</dd>
! 1360: </dl>
! 1361: Other device specific error may be returned.
! 1362: <br><br>
! 1363: <hr size="1">
! 1364:
! 1365:
! 1366: <h3 id="dev1">NAME</h3>
! 1367: device_close() - close a device
! 1368:
! 1369: <h3>SYNOPSIS</h3>
! 1370: <pre>
! 1371: int device_close(device_t dev);
! 1372: </pre>
! 1373:
! 1374: <h3>DESCRIPTION</h3>
! 1375: The device_close() function close the specified device.
! 1376:
! 1377: <h3>ERRORS</h3>
! 1378: <dl>
! 1379: <dt>[ENODEV]</dt>
! 1380: <dd>The specified device is not valid device.</dd>
! 1381: <dt>[EBADF]</dt>
! 1382: <dd>The specified device is not a valid device opened.</dd>
! 1383: <dt>[EPERM]</dt>
! 1384: <dd>The caller task does not have CAP_DEVIO capability.</dd>
! 1385: </dl>
! 1386: Other device specific error may be returned.
! 1387: <br><br>
! 1388: <hr size="1">
! 1389:
! 1390:
! 1391: <h3 id="dev2">NAME</h3>
! 1392: device_read() - read from a device
! 1393:
! 1394: <h3>SYNOPSIS</h3>
! 1395: <pre>
! 1396: int device_read(device_t dev, void *buf, size_t *nbyte, int blkno);
! 1397: </pre>
! 1398:
! 1399: <h3>DESCRIPTION</h3>
! 1400: The device_read() function reads data from the specified device.
! 1401: <i>nbyte</i> is a read size in byte, and <i>blkno</i> is a start block
! 1402: of the target device. The unit of <i>blkno</i> is device specific.
! 1403:
! 1404: <h3>ERRORS</h3>
! 1405: <dl>
! 1406: <dt>[ENODEV]</dt>
! 1407: <dd>The specified device is not valid device.</dd>
! 1408: <dt>[EBADF]</dt>
! 1409: <dd>The specified device is not a valid device opened for read.</dd>
! 1410: <dt>[EFAULT]</dt>
! 1411: <dd>The specified buffer is inaccessible, or not writable.</dd>
! 1412: <dt>[EPERM]</dt>
! 1413: <dd>The caller task does not have CAP_DEVIO capability.</dd>
! 1414: </dl>
! 1415: Other device specific error may be returned.
! 1416: <br><br>
! 1417: <hr size="1">
! 1418:
! 1419:
! 1420: <h3 id="dev3">NAME</h3>
! 1421: device_write() - write to a device
! 1422:
! 1423: <h3>SYNOPSIS</h3>
! 1424: <pre>
! 1425: int device_write(device_t dev, void *buf, size_t *nbyte, int blkno);
! 1426: </pre>
! 1427:
! 1428: <h3>DESCRIPTION</h3>
! 1429: The device_read() function writes data to the specified device.
! 1430: <i>nbytes</i> is a write size in byte, and <i>blkno</i> is a start block
! 1431: of the target device. The unit of <i>blkno</i> is device specific.
! 1432:
! 1433: <h3>ERRORS</h3>
! 1434: <dl>
! 1435: <dt>[ENODEV]</dt>
! 1436: <dd>The specified device is not valid device.</dd>
! 1437: <dt>[EBADF]</dt>
! 1438: <dd>The specified device is not a valid device opened for write.</dd>
! 1439: <dt>[EFAULT]</dt>
! 1440: <dd>The specified buffer is inaccessible</dd>
! 1441: <dt>[EPERM]</dt>
! 1442: <dd>The caller task does not have CAP_DEVIO capability.</dd>
! 1443: </dl>
! 1444: Other device specific error may be returned.
! 1445: <br><br>
! 1446: <hr size="1">
! 1447:
! 1448:
! 1449: <h3 id="dev4">NAME</h3>
! 1450: device_ioctl() - control a device
! 1451:
! 1452: <h3>SYNOPSIS</h3>
! 1453: <pre>
! 1454: int device_ioctl(device_t dev, int cmd, u_long arg);
! 1455: </pre>
! 1456:
! 1457: <h3>DESCRIPTION</h3>
! 1458: The device_ioctl() function sends a command to the specified device.
! 1459: <i>cmd</i> and <i>arg</i> are device dependent.
! 1460:
! 1461: <h3>ERRORS</h3>
! 1462: <dl>
! 1463: <dt>[ENODEV]</dt>
! 1464: <dd>The specified device is not valid device.</dd>
! 1465: <dt>[EBADF]</dt>
! 1466: <dd>The specified device is not a valid device opened for ioctl.</dd>
! 1467: <dt>[EPERM]</dt>
! 1468: <dd>The caller task does not have CAP_DEVIO capability.</dd>
! 1469: </dl>
! 1470: <br>
! 1471:
! 1472:
! 1473:
! 1474: <h2 id="mu">Mutex</h2>
! 1475:
! 1476: <h3 id="mu0">NAME</h3>
! 1477: mutex_init() - initialize a mutex
! 1478:
! 1479: <h3>SYNOPSIS</h3>
! 1480: <pre>
! 1481: int mutex_init(mutex_t *mu);
! 1482: </pre>
! 1483:
! 1484: <h3>DESCRIPTION</h3>
! 1485: The mutex_init() function creates a new mutex and initializes it.
! 1486: The ID of the new mutex is stored in <i>mu</i> on success.
! 1487: <br><br>
! 1488: If an initialized mutex is reinitialized, undefined behavior results.
! 1489:
! 1490: <h3>ERRORS</h3>
! 1491: <dl>
! 1492: <dt>[ENOMEM]</dt>
! 1493: <dd>The system is unable to allocate resources.</dd>
! 1494: <dt>[EFAULT]</dt>
! 1495: <dd>The address of <i>mu</i> is inaccessible.</dd>
! 1496: </dl>
! 1497: <br>
! 1498: <hr size="1">
! 1499:
! 1500:
! 1501: <h3 id="mu1">NAME</h3>
! 1502: mutex_destroy() - destroy a mutex
! 1503:
! 1504: <h3>SYNOPSIS</h3>
! 1505: <pre>
! 1506: int mutex_destroy(mutex_t *mu);
! 1507: </pre>
! 1508:
! 1509: <h3>DESCRIPTION</h3>
! 1510: The mutex_destroy() function destroys the specified mutex.
! 1511: The mutex must be unlock state, otherwise it fails with EBUSY.
! 1512:
! 1513: <h3>ERRORS</h3>
! 1514: <dl>
! 1515: <dt>[EINVAL]</dt>
! 1516: <dd>The specified mutex is not a valid mutex.</dd>
! 1517: <dt>[EBUSY]</dt>
! 1518: <dd>The mutex is still locked by some thread.</dd>
! 1519: </dl>
! 1520: <br>
! 1521: <hr size="1">
! 1522:
! 1523:
! 1524: <h3 id="mu2">NAME</h3>
! 1525: mutex_trylock() - try to lock a mutex
! 1526:
! 1527: <h3>SYNOPSIS</h3>
! 1528: <pre>
! 1529: int mutex_trylock(mutex_t *mu);
! 1530: </pre>
! 1531:
! 1532: <h3>DESCRIPTION</h3>
! 1533: The mutex_trylock() tries to lock a mutex without blocking.
! 1534:
! 1535: <h3>ERRORS</h3>
! 1536: <dl>
! 1537: <dt>[EINVAL]</dt>
! 1538: <dd>The specified mutex is not a valid mutex.</dd>
! 1539: <dt>[EBUSY]</dt>
! 1540: <dd>The mutex is already locked.</dd>
! 1541: </dl>
! 1542: <br>
! 1543: <hr size="1">
! 1544:
! 1545:
! 1546: <h3 id="mu3">NAME</h3>
! 1547: mutex_lock() - lock a mutex
! 1548:
! 1549: <h3>SYNOPSIS</h3>
! 1550: <pre>
! 1551: int mutex_lock(mutex_t *mu);
! 1552: </pre>
! 1553:
! 1554: <h3>DESCRIPTION</h3>
! 1555: The mutex_lock() locks the specified mutex.
! 1556: The caller thread is blocked if the mutex has already been locked.
! 1557: If the caller thread receives any exception while waiting a mutex,
! 1558: this routine returns with EINTR.
! 1559: The mutex is "recursive". It means a thread can lock the same mutex
! 1560: any number of times.
! 1561: <h3>ERRORS</h3>
! 1562: <dl>
! 1563: <dt>[EINVAL]</dt>
! 1564: <dd>The specified mutex is not a valid mutex.</dd>
! 1565: <dt>[EINTR]</dt>
! 1566: <dd>The function was interrupted by an exception.</dd>
! 1567: </dl>
! 1568: <br>
! 1569: <hr size="1">
! 1570:
! 1571:
! 1572: <h3 id="mu4">NAME</h3>
! 1573: mutex_unlock() - unlock a mutex
! 1574:
! 1575: <h3>SYNOPSIS</h3>
! 1576: <pre>
! 1577: int mutex_unlock(mutex_t *mu);
! 1578: </pre>
! 1579:
! 1580: <h3>DESCRIPTION</h3>
! 1581: The mutex_unlock() function unlocks the specified mutex.
! 1582: The caller thread must be the current mutex owner.
! 1583:
! 1584: <h3>ERRORS</h3>
! 1585: <dl>
! 1586: <dt>[EINVAL]</dt>
! 1587: <dd>The specified mutex is not a valid mutex.</dd>
! 1588: <dt>[EPERM]</dt>
! 1589: <dd>The caller thread is not the mutex owner.</dd>
! 1590: </dl>
! 1591: <br>
! 1592:
! 1593:
! 1594:
! 1595: <h2 id="cv">Condition Variable</h2>
! 1596:
! 1597: <h3 id="cv0">NAME</h3>
! 1598: cond_init() - initialize a condition variable
! 1599:
! 1600: <h3>SYNOPSIS</h3>
! 1601: <pre>
! 1602: int cond_init(cond_t *cond);
! 1603: </pre>
! 1604:
! 1605: <h3>DESCRIPTION</h3>
! 1606: The cond_init() function creates a new condition variable and initializes it.
! 1607: <br><br>
! 1608: If an initialized condition variable is reinitialized, undefined behavior results.
! 1609:
! 1610: <h3>ERRORS</h3>
! 1611: <dl>
! 1612: <dt>[EFAULT]</dt>
! 1613: <dd>The address of <i>cond</i> is inaccessible.</dd>
! 1614: <dt>[ENOMEM]</dt>
! 1615: <dd>The system is unable to allocate resources.</dd>
! 1616: </dl>
! 1617: <br>
! 1618: <hr size="1">
! 1619:
! 1620:
! 1621: <h3 id="cv1">NAME</h3>
! 1622: cond_destroy() - destroy a condition variable
! 1623:
! 1624: <h3>SYNOPSIS</h3>
! 1625: <pre>
! 1626: int cond_destroy(cond_t *cond);
! 1627: </pre>
! 1628:
! 1629: <h3>DESCRIPTION</h3>
! 1630: The cond_destroy() function destroys the specified condition variable.
! 1631: If there are any blocked thread waiting for the specified CV, it
! 1632: returns EBUSY.
! 1633:
! 1634: <h3>ERRORS</h3>
! 1635: <dl>
! 1636: <dt>[EINVAL]</dt>
! 1637: <dd>The specified condition variable is not valid.</dd>
! 1638: <dt>[EBUSY]</dt>
! 1639: <dd>The condition variable is still locked by some thread.</dd>
! 1640: </dl>
! 1641: <br>
! 1642: <hr size="1">
! 1643:
! 1644:
! 1645: <h3 id="cv2">NAME</h3>
! 1646: cond_wait() - wait on a condition
! 1647:
! 1648: <h3>SYNOPSIS</h3>
! 1649: <pre>
! 1650: int cond_wait(cond_t *cond, mutex_t *mu);
! 1651: </pre>
! 1652:
! 1653: <h3>DESCRIPTION</h3>
! 1654: The cond_wait() function waits on the specified condition.
! 1655: If the caller thread receives any exception, this routine returns
! 1656: with EINTR.
! 1657:
! 1658: <h3>ERRORS</h3>
! 1659: <dl>
! 1660: <dt>[EINVAL]</dt>
! 1661: <dd>The specified condition variable is not valid.</dd>
! 1662: <dt>[EINTR]</dt>
! 1663: <dd>The function was interrupted by an exception.</dd>
! 1664: </dl>
! 1665: <br>
! 1666: <hr size="1">
! 1667:
! 1668:
! 1669: <h3 id="cv3">NAME</h3>
! 1670: cond_signal() - signal condition
! 1671:
! 1672: <h3>SYNOPSIS</h3>
! 1673: <pre>
! 1674: int cond_signal(cond_t *cond);
! 1675: </pre>
! 1676:
! 1677: <h3>DESCRIPTION</h3>
! 1678: The cond_signal() function unblocks the thread that is waiting
! 1679: on the specified condition variable.
! 1680:
! 1681: <h3>ERRORS</h3>
! 1682: <dl>
! 1683: <dt>[EINVAL]</dt>
! 1684: <dd>The specified condition variable is not valid.</dd>
! 1685: </dl>
! 1686: <br>
! 1687: <hr size="1">
! 1688:
! 1689:
! 1690: <h3 id="cv4">NAME</h3>
! 1691: cond_broadcast() - broadcast a condition
! 1692:
! 1693: <h3>SYNOPSIS</h3>
! 1694: <pre>
! 1695: int cond_broadcast(cond_t *cond);
! 1696: </pre>
! 1697:
! 1698: <h3>DESCRIPTION</h3>
! 1699: The cond_broadcast() function unblocks all threads that are blocked
! 1700: on the specified condition variable.
! 1701:
! 1702: <h3>ERRORS</h3>
! 1703: <dl>
! 1704: <dt>[EINVAL]</dt>
! 1705: <dd>The specified condition variable is not valid.</dd>
! 1706: </dl>
! 1707: <br>
! 1708:
! 1709:
! 1710:
! 1711: <h2 id="sem">Semaphore</h2>
! 1712:
! 1713: <h3 id="sem0">NAME</h3>
! 1714: sem_init() - initialize a semaphore
! 1715:
! 1716: <h3>SYNOPSIS</h3>
! 1717: <pre>
! 1718: int sem_init(sem_t *sem, u_int value);
! 1719: </pre>
! 1720:
! 1721: <h3>DESCRIPTION</h3>
! 1722: The sem_init() function initializes a semaphore. It will create a
! 1723: new semaphore if the specified <i>sem</i> does not exist. If the
! 1724: specified semaphore <i>sem</i> already exists, it is re-initialized
! 1725: only if nobody is waiting for it.
! 1726: The initial semaphore value is set to <i>value</i> value.
! 1727: The ID of the new semaphore is stored in <i>sem</i> on success.
! 1728:
! 1729: <h3>ERRORS</h3>
! 1730: <dl>
! 1731: <dt>[EINVAL]</dt>
! 1732: <dd><i>value</i> value is larger than SEM_MAX.</dd>
! 1733: <dt>[ENOSPC]</dt>
! 1734: <dd>The system is unable to allocate resources.</dd>
! 1735: <dt>[EFAULT]</dt>
! 1736: <dd>The address of <i>sem</i> is inaccessible.</dd>
! 1737: <dt>[EBUSY]</dt>
! 1738: <dd>There are currently threads blocked on the semaphore.</dd>
! 1739: <dt>[EPERM]</dt>
! 1740: <dd>The caller task is not an owner of the <i>sem</i>, but it
! 1741: does not have CAP_SEMAPHORE capability.</dd>
! 1742: </dl>
! 1743: <br>
! 1744: <hr size="1">
! 1745:
! 1746:
! 1747: <h3 id="sem1">NAME</h3>
! 1748: sem_destroy() - destroy a semaphore
! 1749:
! 1750: <h3>SYNOPSIS</h3>
! 1751: <pre>
! 1752: int sem_destroy(sem_t *sem);
! 1753: </pre>
! 1754:
! 1755: <h3>DESCRIPTION</h3>
! 1756: The sem_destroy() function destroys the specified semaphore.
! 1757: If some thread is waiting for the specified semaphore, this routine
! 1758: fails with EBUSY.
! 1759:
! 1760: <h3>ERRORS</h3>
! 1761: <dl>
! 1762: <dt>[EINVAL]</dt>
! 1763: <dd>The specified semaphore is not a valid semaphore.</dd>
! 1764: <dt>[EBUSY]</dt>
! 1765: <dd>There are currently threads blocked on the semaphore.</dd>
! 1766: </dl>
! 1767: <br>
! 1768: <hr size="1">
! 1769:
! 1770:
! 1771: <h3 id="sem2">NAME</h3>
! 1772: sem_wait() - lock a semaphore
! 1773:
! 1774: <h3>SYNOPSIS</h3>
! 1775: <pre>
! 1776: int sem_wait(sem_t *sem, u_long timeout);
! 1777: </pre>
! 1778:
! 1779: <h3>DESCRIPTION</h3>
! 1780: The sem_wait() function locks the semaphore referred by <i>sem</i>
! 1781: only if the semaphore value is currently positive. The thread
! 1782: will sleep while the semaphore value is zero.
! 1783: It decrements the semaphore value in return.
! 1784: If <i>timeout</i> value is set if it is not 0.
! 1785:
! 1786: <h3>ERRORS</h3>
! 1787: <dl>
! 1788: <dt>[EINVAL]</dt>
! 1789: <dd>The specified semaphore is not a valid semaphore.</dd>
! 1790: <dt>[ETIMEDOUT]</dt>
! 1791: <dd>Time out.</dd>
! 1792: <dt>[EINTR]</dt>
! 1793: <dd>The function was interrupted by an exception.</dd>
! 1794: <dt>[EPERM]</dt>
! 1795: <dd>The caller task is not an owner of the <i>sem</i>, but it
! 1796: does not have CAP_SEMAPHORE capability.</dd>
! 1797: </dl>
! 1798: <br>
! 1799: <hr size="1">
! 1800:
! 1801:
! 1802: <h3 id="sem3">NAME</h3>
! 1803: sem_trywait() - try to lock a semaphore
! 1804:
! 1805: <h3>SYNOPSIS</h3>
! 1806: <pre>
! 1807: int sem_trywait(sem_t *sem);
! 1808: </pre>
! 1809:
! 1810: <h3>DESCRIPTION</h3>
! 1811: The sem_trylock() tries to lock a semaphore without blocking.
! 1812:
! 1813: <h3>ERRORS</h3>
! 1814: <dl>
! 1815: <dt>[EINVAL]</dt>
! 1816: <dd>The specified semaphore is not a valid semaphore.</dd>
! 1817: <dt>[EAGAIN]</dt>
! 1818: <dd>The semaphore is already locked.</dd>
! 1819: <dt>[EPERM]</dt>
! 1820: <dd>The caller task is not an owner of the <i>sem</i>, but it
! 1821: does not have CAP_SEMAPHORE capability.</dd>
! 1822: </dl>
! 1823: <br>
! 1824: <hr size="1">
! 1825:
! 1826:
! 1827: <h3 id="sem4">NAME</h3>
! 1828: sem_post() - unlock a semaphore
! 1829:
! 1830: <h3>SYNOPSIS</h3>
! 1831: <pre>
! 1832: int sem_post(sem_t *sem);
! 1833: </pre>
! 1834:
! 1835: <h3>DESCRIPTION</h3>
! 1836: The sem_post() function unlock the specified semaphore.
! 1837: It increments the semaphore value.
! 1838: If the semaphore value becomes positive, one of the threads waiting
! 1839: to lock will be unblocked.
! 1840: The caller thread is not blocked by this function.
! 1841:
! 1842: <h3>ERRORS</h3>
! 1843: <dl>
! 1844: <dt>[EINVAL]</dt>
! 1845: <dd>The specified semaphore is not a valid semaphore.</dd>
! 1846: <dt>[ERANGE]</dt>
! 1847: <dd>The semaphore value exceeds SEM_MAX.</dd>
! 1848: <dt>[EPERM]</dt>
! 1849: <dd>The caller task is not an owner of the <i>sem</i>, but it
! 1850: does not have CAP_SEMAPHORE capability.</dd>
! 1851: </dl>
! 1852: <br>
! 1853: <hr size="1">
! 1854:
! 1855:
! 1856: <h3 id="sem5">NAME</h3>
! 1857: sem_getvalue() - get the value of a semaphore
! 1858:
! 1859: <h3>SYNOPSIS</h3>
! 1860: <pre>
! 1861: int sem_getvalue(sem_t *sem, u_int *value);
! 1862: </pre>
! 1863:
! 1864: <h3>DESCRIPTION</h3>
! 1865: The sem_getvalue() function returns the current value of the specified semaphore.
! 1866:
! 1867: <h3>ERRORS</h3>
! 1868: <dl>
! 1869: <dt>[EINVAL]</dt>
! 1870: <dd>The specified semaphore is not a valid semaphore.</dd>
! 1871: <dt>[EFAULT]</dt>
! 1872: <dd>The address of <i>sem</i> is inaccessible.</dd>
! 1873: <dt>[EPERM]</dt>
! 1874: <dd>The caller task is not an owner of the <i>sem</i>, but it
! 1875: does not have CAP_SEMAPHORE capability.</dd>
! 1876: </dl>
! 1877: <br>
! 1878:
! 1879:
! 1880:
! 1881: <h2 id="sys">System</h2>
! 1882:
! 1883: <h3 id="sys0">NAME</h3>
! 1884: sys_log() - log a message
! 1885:
! 1886: <h3>SYNOPSIS</h3>
! 1887: <pre>
! 1888: void sys_log(const char *buf);
! 1889: </pre>
! 1890:
! 1891: <h3>DESCRIPTION</h3>
! 1892: The sys_log() function puts the specified text message to the
! 1893: predefined device.
! 1894: This function is available only when the kernel is built with debug flag.
! 1895:
! 1896: <h3>ERRORS</h3>
! 1897: <dl>
! 1898: <dt>[EINVAL]</dt>
! 1899: <dd>The message is too long.</dd>
! 1900: <dt>[EFAULT]</dt>
! 1901: <dd>The address of <i>buf</i> is inaccessible.</dd>
! 1902: </dl>
! 1903: <br>
! 1904: <hr size="1">
! 1905:
! 1906:
! 1907: <h3 id="sys1">NAME</h3>
! 1908: sys_panic() - fatal error
! 1909:
! 1910: <h3>SYNOPSIS</h3>
! 1911: <pre>
! 1912: void sys_panic(const char *buf);
! 1913: </pre>
! 1914:
! 1915: <h3>DESCRIPTION</h3>
! 1916: The sys_panic() function shows the panic message and stops the system.
! 1917: The application should use this call only when it detects the unrecoverable
! 1918: error.
! 1919:
! 1920: <h3>ERRORS</h3>
! 1921: No errors are defined.
! 1922: <br>
! 1923: <br>
! 1924: <hr size="1">
! 1925:
! 1926:
! 1927:
! 1928: <h3 id="sys2">NAME</h3>
! 1929: sys_info() - return system information
! 1930:
! 1931: <h3>SYNOPSIS</h3>
! 1932: <pre>
! 1933: int sys_info(int type, void *buf);
! 1934: </pre>
! 1935:
! 1936: <h3>DESCRIPTION</h3>
! 1937: The sys_info() function returns the specified system information.
! 1938: The kernel supports the following system infomation.
! 1939: <ul>
! 1940: <li>INFO_KERNEL - Get kernel information</li>
! 1941: <li>INFO_MEMORY - Get memory information</li>
! 1942: <li>INFO_SCHED - Get scheduling information</li>
! 1943: <li>INFO_THREAD - Get thread information</li>
! 1944: <li>INFO_DEVICE - Get device information</li>
! 1945: </ul>
! 1946:
! 1947: <h3>ERRORS</h3>
! 1948: <dl>
! 1949: <dt>[EINVAL]</dt>
! 1950: <dd><i>type</i> is not a valid type.</dd>
! 1951: <dt>[EFAULT]</dt>
! 1952: <dd>The address of <i>buf</i> is inaccessible.</dd>
! 1953: </dl>
! 1954: <br>
! 1955: <hr size="1">
! 1956:
! 1957:
! 1958:
! 1959: <h3 id="sys3">NAME</h3>
! 1960: sys_time() - return system ticks
! 1961:
! 1962: <h3>SYNOPSIS</h3>
! 1963: <pre>
! 1964: int sys_time(u_long *ticks);
! 1965: </pre>
! 1966:
! 1967: <h3>DESCRIPTION</h3>
! 1968: The sys_time() function returns the current system ticks.
! 1969:
! 1970: <h3>ERRORS</h3>
! 1971: <dl>
! 1972: <dt>[EFAULT]</dt>
! 1973: <dd>The address of <i>ticks</i> is inaccessible.</dd>
! 1974: </dl>
! 1975: <br>
! 1976: <hr size="1">
! 1977:
! 1978:
! 1979:
! 1980: <h3 id="sys4">NAME</h3>
! 1981: sys_debug() - kernel debugging interface
! 1982:
! 1983: <h3>SYNOPSIS</h3>
! 1984: <pre>
! 1985: int sys_debug(int cmd, int param);
! 1986: </pre>
! 1987:
! 1988: <h3>DESCRIPTION</h3>
! 1989: The sys_debug() controls the kernel built-in debug functions.
! 1990: The kernel supports the following commands.
! 1991: <ul>
! 1992: <li>DBGCMD_DUMP - Dump kernel information</li>
! 1993: </ul>
! 1994:
! 1995: <h3>ERRORS</h3>
! 1996: <dl>
! 1997: <dt>[EINVAL]</dt>
! 1998: <dd><i>cmd</i> is not a valid command.</dd>
! 1999: <dt>[ENOSYS]</dt>
! 2000: <dd>The function is not supported.</dd>
! 2001: </dl>
! 2002: <br>
! 2003:
! 2004: </td>
! 2005: </tr>
! 2006: <tr>
! 2007: <td id="footer" colspan="2" style="vertical-align: top;">
! 2008: <a href="http://sourceforge.net">
! 2009: <img src="http://sourceforge.net/sflogo.php?group_id=132028&type=1"
! 2010: alt="SourceForge.net Logo" border="0" height="31" width="88"></a><br>
! 2011: Copyright© 2005-2007 Kohsuke Ohtani
! 2012: </td>
! 2013: </tr>
! 2014:
! 2015: </tbody>
! 2016: </table>
! 2017:
! 2018: </div>
! 2019: <div id="bottom"></div>
! 2020:
! 2021: </body>
! 2022: </html>
CVSweb