Ignore:
File:
1 edited

Legend:

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

    r19fc04c rf6bffee  
    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/* Data transfer flags. */
     119#define IPC_XF_NONE             0
     120
     121/** Restrict the transfer size if necessary. */
     122#define IPC_XF_RESTRICT         (1 << 0)
     123
     124/** Kernel IPC interfaces
     125 *
     126 */
     127#define IPC_IF_KERNEL  0
     128
     129/** System-specific methods - only through special syscalls
     130 *
     131 * These methods have special behaviour. These methods also
     132 * have the implicit kernel interface 0.
     133 *
     134 */
     135
     136/** Clone connection.
     137 *
     138 * The calling task clones one of its phones for the callee.
     139 *
     140 * - ARG1 - The caller sets ARG1 to the phone of the cloned connection.
     141 *        - The callee gets the new phone from ARG1.
     142 *
     143 * - on answer, the callee acknowledges the new connection by sending EOK back
     144 *   or the kernel closes it
     145 *
     146 */
     147#define IPC_M_CONNECTION_CLONE  1
     148
     149/** Protocol for CONNECT - ME
     150 *
     151 * Through this call, the recipient learns about the new cloned connection.
     152 *
     153 * - ARG5 - the kernel sets ARG5 to contain the hash of the used phone
     154 * - on asnwer, the callee acknowledges the new connection by sending EOK back
     155 *   or the kernel closes it
     156 *
     157 */
     158#define IPC_M_CONNECT_ME  2
     159
     160/** Protocol for CONNECT - TO - ME
     161 *
     162 * Calling process asks the callee to create a callback connection,
     163 * so that it can start initiating new messages.
     164 *
     165 * The protocol for negotiating is:
     166 * - sys_connect_to_me - sends a message IPC_M_CONNECT_TO_ME
     167 * - recipient         - upon receipt tries to allocate new phone
     168 *                       - if it fails, responds with ELIMIT
     169 *                     - passes call to userspace. If userspace
     170 *                       responds with error, phone is deallocated and
     171 *                       error is sent back to caller. Otherwise
     172 *                       the call is accepted and the response is sent back.
     173 *                     - the hash of the client task is passed to userspace
     174 *                       (on the receiving side) as ARG4 of the call.
     175 *                     - the hash of the allocated phone is passed to userspace
     176 *                       (on the receiving side) as ARG5 of the call.
     177 *
     178 */
     179#define IPC_M_CONNECT_TO_ME  3
     180
     181/** Protocol for CONNECT - ME - TO
     182 *
     183 * Calling process asks the callee to create for him a new connection.
     184 * E.g. the caller wants a name server to connect him to print server.
     185 *
     186 * The protocol for negotiating is:
     187 * - sys_connect_me_to - send a synchronous message to name server
     188 *                       indicating that it wants to be connected to some
     189 *                       service
     190 *                     - arg1/2/3 are user specified, arg5 contains
     191 *                       address of the phone that should be connected
     192 *                       (TODO: it leaks to userspace)
     193 *  - recipient        -  if ipc_answer == 0, then accept connection
     194 *                     -  otherwise connection refused
     195 *                     -  recepient may forward message.
     196 *
     197 */
     198#define IPC_M_CONNECT_ME_TO  4
     199
     200/** This message is sent to answerbox when the phone is hung up
     201 *
     202 */
     203#define IPC_M_PHONE_HUNGUP  5
     204
     205/** Send as_area over IPC.
     206 * - ARG1 - source as_area base address
     207 * - ARG2 - size of source as_area (filled automatically by kernel)
     208 * - ARG3 - flags of the as_area being sent
     209 *
     210 * on answer, the recipient must set:
     211 * - ARG1 - dst as_area base adress
     212 *
     213 */
     214#define IPC_M_SHARE_OUT  6
     215
     216/** Receive as_area over IPC.
     217 * - ARG1 - destination as_area base address
     218 * - ARG2 - destination as_area size
     219 * - ARG3 - user defined argument
     220 *
     221 * on answer, the recipient must set:
     222 *
     223 * - ARG1 - source as_area base address
     224 * - ARG2 - flags that will be used for sharing
     225 *
     226 */
     227#define IPC_M_SHARE_IN  7
     228
     229/** Send data to another address space over IPC.
     230 * - ARG1 - source address space virtual address
     231 * - ARG2 - size of data to be copied, may be overriden by the recipient
     232 *
     233 * on answer, the recipient must set:
     234 *
     235 * - ARG1 - final destination address space virtual address
     236 * - ARG2 - final size of data to be copied
     237 *
     238 */
     239#define IPC_M_DATA_WRITE  8
     240
     241/** Receive data from another address space over IPC.
     242 * - ARG1 - destination virtual address in the source address space
     243 * - ARG2 - size of data to be received, may be cropped by the recipient
     244 *
     245 * on answer, the recipient must set:
     246 *
     247 * - ARG1 - source virtual address in the destination address space
     248 * - ARG2 - final size of data to be copied
     249 *
     250 */
     251#define IPC_M_DATA_READ  9
     252
     253/** Debug the recipient.
     254 * - ARG1 - specifies the debug method (from udebug_method_t)
     255 * - other arguments are specific to the debug method
     256 *
     257 */
     258#define IPC_M_DEBUG_ALL  10
     259
     260/* Well-known methods */
     261#define IPC_M_LAST_SYSTEM  511
     262#define IPC_M_PING         512
     263
     264/* User methods */
     265#define IPC_FIRST_USER_METHOD  1024
     266
     267#ifdef KERNEL
     268
     269#define IPC_MAX_PHONES  32
     270
    38271#include <synch/spinlock.h>
    39272#include <synch/mutex.h>
    40273#include <synch/waitq.h>
    41 #include <abi/ipc/ipc.h>
    42 #include <abi/proc/task.h>
    43 #include <typedefs.h>
    44 
    45 #define IPC_MAX_PHONES  64
    46274
    47275struct answerbox;
     
    81309       
    82310        /** Phones connected to this answerbox. */
    83         list_t connected_phones;
     311        link_t connected_phones;
    84312        /** Received calls. */
    85         list_t calls;
    86         list_t dispatched_calls;  /* Should be hash table in the future */
     313        link_t calls;
     314        link_t dispatched_calls;  /* Should be hash table in the future */
    87315       
    88316        /** Answered calls. */
    89         list_t answers;
     317        link_t answers;
    90318       
    91319        IRQ_SPINLOCK_DECLARE(irq_lock);
    92320       
    93321        /** Notifications from IRQ handlers. */
    94         list_t irq_notifs;
     322        link_t irq_notifs;
    95323        /** IRQs with notifications to this answerbox. */
    96         list_t irq_list;
     324        link_t irq_head;
    97325} answerbox_t;
    98326
    99327typedef struct {
    100328        sysarg_t args[IPC_CALL_LEN];
    101         /**
    102          * Task which made or forwarded the call with IPC_FF_ROUTE_FROM_ME,
    103          * or the task which answered the call.
    104          */
    105         task_id_t task_id;
     329        /** Task which made or forwarded the call with IPC_FF_ROUTE_FROM_ME. */
     330        struct task *task;
    106331        /** Phone which made or last masqueraded this call. */
    107332        phone_t *phone;
     
    161386extern void ipc_backsend_err(phone_t *, call_t *, sysarg_t);
    162387extern void ipc_answerbox_slam_phones(answerbox_t *, bool);
    163 extern void ipc_cleanup_call_list(list_t *);
     388extern void ipc_cleanup_call_list(link_t *);
    164389
    165390extern void ipc_print_task(task_id_t);
    166391
     392#endif /* KERNEL */
     393
    167394#endif
    168395
Note: See TracChangeset for help on using the changeset viewer.