Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/ipc/ipc.h

    r5378f99 rab34cc9  
    3636#define KERN_IPC_H_
    3737
    38 /** Length of data being transfered with IPC call
    39  *
    40  * The uspace may not be able to utilize full length
    41  *
    42  */
    43 #define IPC_CALL_LEN  6
    44 
    45 /** Maximum active async calls per phone */
    46 #define IPC_MAX_ASYNC_CALLS  4
    47 
    48 /* Flags for calls */
    49 
    50 /** This is answer to a call */
    51 #define IPC_CALL_ANSWERED  (1 << 0)
    52 
    53 /** Answer will not be passed to userspace, will be discarded */
    54 #define IPC_CALL_DISCARD_ANSWER  (1 << 1)
    55 
    56 /** Call was forwarded */
    57 #define IPC_CALL_FORWARDED  (1 << 2)
    58 
    59 /** Identify connect_me_to answer */
    60 #define IPC_CALL_CONN_ME_TO  (1 << 3)
    61 
    62 /** Interrupt notification */
    63 #define IPC_CALL_NOTIF  (1 << 4)
    64 
    65 
    66 /** Bits used in call hashes.
    67  *
    68  * The addresses are aligned at least to 4 that is why we can use the 2 least
    69  * significant bits of the call address.
    70  *
    71  */
    72 
    73 /** Type of this call is 'answer' */
    74 #define IPC_CALLID_ANSWERED  1
    75 
    76 /** Type of this call is 'notification' */
    77 #define IPC_CALLID_NOTIFICATION  2
    78 
    79 /* Return values from sys_ipc_call_async(). */
    80 #define IPC_CALLRET_FATAL      -1
    81 #define IPC_CALLRET_TEMPORARY  -2
    82 
    83 
    84 /* Macros for manipulating calling data */
    85 #define IPC_SET_RETVAL(data, retval)  ((data).args[0] = (retval))
    86 #define IPC_SET_IMETHOD(data, val)    ((data).args[0] = (val))
    87 #define IPC_SET_ARG1(data, val)       ((data).args[1] = (val))
    88 #define IPC_SET_ARG2(data, val)       ((data).args[2] = (val))
    89 #define IPC_SET_ARG3(data, val)       ((data).args[3] = (val))
    90 #define IPC_SET_ARG4(data, val)       ((data).args[4] = (val))
    91 #define IPC_SET_ARG5(data, val)       ((data).args[5] = (val))
    92 
    93 #define IPC_GET_IMETHOD(data)  ((data).args[0])
    94 #define IPC_GET_RETVAL(data)   ((data).args[0])
    95 
    96 #define IPC_GET_ARG1(data)  ((data).args[1])
    97 #define IPC_GET_ARG2(data)  ((data).args[2])
    98 #define IPC_GET_ARG3(data)  ((data).args[3])
    99 #define IPC_GET_ARG4(data)  ((data).args[4])
    100 #define IPC_GET_ARG5(data)  ((data).args[5])
    101 
    102 /* Well known phone descriptors */
    103 #define PHONE_NS  0
    104 
    105 /* Forwarding flags. */
    106 #define IPC_FF_NONE  0
    107 
    108 /**
    109  * The call will be routed as though it was initially sent via the phone used to
    110  * forward it. This feature is intended to support the situation in which the
    111  * forwarded call needs to be handled by the same connection fibril as any other
    112  * calls that were initially sent by the forwarder to the same destination. This
    113  * flag has no imapct on routing replies.
    114  *
    115  */
    116 #define IPC_FF_ROUTE_FROM_ME  (1 << 0)
    117 
    118 /** Kernel IPC interfaces
    119  *
    120  */
    121 #define IPC_IF_KERNEL  0
    122 
    123 /** System-specific methods - only through special syscalls
    124  *
    125  * These methods have special behaviour. These methods also
    126  * have the implicit kernel interface 0.
    127  *
    128  */
    129 
    130 /** Clone connection.
    131  *
    132  * The calling task clones one of its phones for the callee.
    133  *
    134  * - ARG1 - The caller sets ARG1 to the phone of the cloned connection.
    135  *        - The callee gets the new phone from ARG1.
    136  *
    137  * - on answer, the callee acknowledges the new connection by sending EOK back
    138  *   or the kernel closes it
    139  *
    140  */
    141 #define IPC_M_CONNECTION_CLONE  1
    142 
    143 /** Protocol for CONNECT - ME
    144  *
    145  * Through this call, the recipient learns about the new cloned connection.
    146  *
    147  * - ARG5 - the kernel sets ARG5 to contain the hash of the used phone
    148  * - on asnwer, the callee acknowledges the new connection by sending EOK back
    149  *   or the kernel closes it
    150  *
    151  */
    152 #define IPC_M_CONNECT_ME  2
    153 
    154 /** Protocol for CONNECT - TO - ME
    155  *
    156  * Calling process asks the callee to create a callback connection,
    157  * so that it can start initiating new messages.
    158  *
    159  * The protocol for negotiating is:
    160  * - sys_connect_to_me - sends a message IPC_M_CONNECT_TO_ME
    161  * - recipient         - upon receipt tries to allocate new phone
    162  *                       - if it fails, responds with ELIMIT
    163  *                     - passes call to userspace. If userspace
    164  *                       responds with error, phone is deallocated and
    165  *                       error is sent back to caller. Otherwise
    166  *                       the call is accepted and the response is sent back.
    167  *                     - the hash of the client task is passed to userspace
    168  *                       (on the receiving side) as ARG4 of the call.
    169  *                     - the hash of the allocated phone is passed to userspace
    170  *                       (on the receiving side) as ARG5 of the call.
    171  *
    172  */
    173 #define IPC_M_CONNECT_TO_ME  3
    174 
    175 /** Protocol for CONNECT - ME - TO
    176  *
    177  * Calling process asks the callee to create for him a new connection.
    178  * E.g. the caller wants a name server to connect him to print server.
    179  *
    180  * The protocol for negotiating is:
    181  * - sys_connect_me_to - send a synchronous message to name server
    182  *                       indicating that it wants to be connected to some
    183  *                       service
    184  *                     - arg1/2/3 are user specified, arg5 contains
    185  *                       address of the phone that should be connected
    186  *                       (TODO: it leaks to userspace)
    187  *  - recipient        -  if ipc_answer == 0, then accept connection
    188  *                     -  otherwise connection refused
    189  *                     -  recepient may forward message.
    190  *
    191  */
    192 #define IPC_M_CONNECT_ME_TO  4
    193 
    194 /** This message is sent to answerbox when the phone is hung up
    195  *
    196  */
    197 #define IPC_M_PHONE_HUNGUP  5
    198 
    199 /** Send as_area over IPC.
    200  * - ARG1 - source as_area base address
    201  * - ARG2 - size of source as_area (filled automatically by kernel)
    202  * - ARG3 - flags of the as_area being sent
    203  *
    204  * on answer, the recipient must set:
    205  * - ARG1 - dst as_area base adress
    206  *
    207  */
    208 #define IPC_M_SHARE_OUT  6
    209 
    210 /** Receive as_area over IPC.
    211  * - ARG1 - destination as_area base address
    212  * - ARG2 - destination as_area size
    213  * - ARG3 - user defined argument
    214  *
    215  * on answer, the recipient must set:
    216  *
    217  * - ARG1 - source as_area base address
    218  * - ARG2 - flags that will be used for sharing
    219  *
    220  */
    221 #define IPC_M_SHARE_IN  7
    222 
    223 /** Send data to another address space over IPC.
    224  * - ARG1 - source address space virtual address
    225  * - ARG2 - size of data to be copied, may be overriden by the recipient
    226  *
    227  * on answer, the recipient must set:
    228  *
    229  * - ARG1 - final destination address space virtual address
    230  * - ARG2 - final size of data to be copied
    231  *
    232  */
    233 #define IPC_M_DATA_WRITE  8
    234 
    235 /** Receive data from another address space over IPC.
    236  * - ARG1 - destination virtual address in the source address space
    237  * - ARG2 - size of data to be received, may be cropped by the recipient
    238  *
    239  * on answer, the recipient must set:
    240  *
    241  * - ARG1 - source virtual address in the destination address space
    242  * - ARG2 - final size of data to be copied
    243  *
    244  */
    245 #define IPC_M_DATA_READ  9
    246 
    247 /** Debug the recipient.
    248  * - ARG1 - specifies the debug method (from udebug_method_t)
    249  * - other arguments are specific to the debug method
    250  *
    251  */
    252 #define IPC_M_DEBUG_ALL  10
    253 
    254 /* Well-known methods */
    255 #define IPC_M_LAST_SYSTEM  511
    256 #define IPC_M_PING         512
    257 
    258 /* User methods */
    259 #define IPC_FIRST_USER_METHOD  1024
    260 
    261 #ifdef KERNEL
    262 
    263 #define IPC_MAX_PHONES  32
    264 
     38#include <abi/ipc/ipc.h>
    26539#include <synch/spinlock.h>
    26640#include <synch/mutex.h>
    26741#include <synch/waitq.h>
     42#include <typedefs.h>
     43
     44#define IPC_MAX_PHONES  32
    26845
    26946struct answerbox;
     
    30380       
    30481        /** Phones connected to this answerbox. */
    305         link_t connected_phones;
     82        list_t connected_phones;
    30683        /** Received calls. */
    307         link_t calls;
    308         link_t dispatched_calls;  /* Should be hash table in the future */
     84        list_t calls;
     85        list_t dispatched_calls;  /* Should be hash table in the future */
    30986       
    31087        /** Answered calls. */
    311         link_t answers;
     88        list_t answers;
    31289       
    31390        IRQ_SPINLOCK_DECLARE(irq_lock);
    31491       
    31592        /** Notifications from IRQ handlers. */
    316         link_t irq_notifs;
     93        list_t irq_notifs;
    31794        /** IRQs with notifications to this answerbox. */
    318         link_t irq_head;
     95        list_t irq_list;
    31996} answerbox_t;
    32097
    32198typedef struct {
    32299        sysarg_t args[IPC_CALL_LEN];
    323         /** Task which made or forwarded the call with IPC_FF_ROUTE_FROM_ME. */
    324         struct task *task;
     100        /**
     101         * Task which made or forwarded the call with IPC_FF_ROUTE_FROM_ME,
     102         * or the task which answered the call.
     103         */
     104        task_id_t task_id;
    325105        /** Phone which made or last masqueraded this call. */
    326106        phone_t *phone;
     
    380160extern void ipc_backsend_err(phone_t *, call_t *, sysarg_t);
    381161extern void ipc_answerbox_slam_phones(answerbox_t *, bool);
    382 extern void ipc_cleanup_call_list(link_t *);
     162extern void ipc_cleanup_call_list(list_t *);
    383163
    384164extern void ipc_print_task(task_id_t);
    385 
    386 #endif /* KERNEL */
    387165
    388166#endif
Note: See TracChangeset for help on using the changeset viewer.