Subversion Repositories HelenOS

Rev

Rev 2106 | Rev 2493 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2106 Rev 2471
Line 35... Line 35...
35
#ifndef KERN_IPC_H_
35
#ifndef KERN_IPC_H_
36
#define KERN_IPC_H_
36
#define KERN_IPC_H_
37
 
37
 
38
/* Length of data being transfered with IPC call */
38
/* Length of data being transfered with IPC call */
39
/* - the uspace may not be able to utilize full length */
39
/* - the uspace may not be able to utilize full length */
40
#define IPC_CALL_LEN    4
40
#define IPC_CALL_LEN        4
41
 
41
 
42
/** Maximum active async calls per thread */
42
/** Maximum active async calls per thread */
43
#ifdef CONFIG_DEBUG
43
#ifdef CONFIG_DEBUG
44
# define IPC_MAX_ASYNC_CALLS  4
44
#define IPC_MAX_ASYNC_CALLS 4
45
#else
45
#else
46
# define IPC_MAX_ASYNC_CALLS  4000
46
#define IPC_MAX_ASYNC_CALLS 4000
47
#endif
47
#endif
48
 
48
 
49
/* Flags for calls */
49
/* Flags for calls */
50
 
50
 
51
/** This is answer to a call */
51
/** This is answer to a call */
Line 59... Line 59...
59
/** Identify connect_me_to answer */
59
/** Identify connect_me_to answer */
60
#define IPC_CALL_CONN_ME_TO (1 << 4)
60
#define IPC_CALL_CONN_ME_TO (1 << 4)
61
/** Interrupt notification */
61
/** Interrupt notification */
62
#define IPC_CALL_NOTIF      (1 << 5)
62
#define IPC_CALL_NOTIF      (1 << 5)
63
 
63
 
-
 
64
/*
-
 
65
 * Bits used in call hashes.
64
/* Flags of callid (the addresses are aligned at least to 4,
66
 * The addresses are aligned at least to 4 that is why we can use the 2 least
65
 * that is why we can use bottom 2 bits of the call address
67
 * significant bits of the call address.
66
 */
68
 */
67
/** Type of this msg is 'answer' */
69
/** Type of this call is 'answer' */
68
#define IPC_CALLID_ANSWERED 1
70
#define IPC_CALLID_ANSWERED 1
69
/** Type of this msg is 'notification' */
71
/** Type of this call is 'notification' */
70
#define IPC_CALLID_NOTIFICATION 2
72
#define IPC_CALLID_NOTIFICATION 2
71
 
73
 
72
/* Return values from IPC_ASYNC */
74
/* Return values from sys_ipc_call_async(). */
73
#define IPC_CALLRET_FATAL   -1
75
#define IPC_CALLRET_FATAL   -1
74
#define IPC_CALLRET_TEMPORARY   -2
76
#define IPC_CALLRET_TEMPORARY   -2
75
 
77
 
76
 
78
 
77
/* Macros for manipulating calling data */
79
/* Macros for manipulating calling data */
Line 109... Line 111...
109
 *                       the call is accepted and the response is sent back.
111
 *                       the call is accepted and the response is sent back.
110
 *                     - the allocated phoneid is passed to userspace
112
 *                     - the allocated phoneid is passed to userspace
111
 *                       (on the receiving sid) as ARG3 of the call.
113
 *                       (on the receiving sid) as ARG3 of the call.
112
 *                     - the caller obtains taskid of the called thread
114
 *                     - the caller obtains taskid of the called thread
113
 */
115
 */
114
#define IPC_M_CONNECT_TO_ME     1
116
#define IPC_M_CONNECT_TO_ME 1
115
/** Protocol for CONNECT - ME - TO
117
/** Protocol for CONNECT - ME - TO
116
 *
118
 *
117
 * Calling process asks the callee to create for him a new connection.
119
 * Calling process asks the callee to create for him a new connection.
118
 * E.g. the caller wants a name server to connect him to print server.
120
 * E.g. the caller wants a name server to connect him to print server.
119
 *
121
 *
Line 128... Line 130...
128
 *                     -  otherwise connection refused
130
 *                     -  otherwise connection refused
129
 *                     -  recepient may forward message. Forwarding
131
 *                     -  recepient may forward message. Forwarding
130
 *                        system message
132
 *                        system message
131
 *
133
 *
132
 */
134
 */
133
#define IPC_M_CONNECT_ME_TO     2
135
#define IPC_M_CONNECT_ME_TO 2
134
/** This message is sent to answerbox when the phone
136
/** This message is sent to answerbox when the phone
135
 * is hung up
137
 * is hung up
136
 */
138
 */
137
#define IPC_M_PHONE_HUNGUP      3
139
#define IPC_M_PHONE_HUNGUP  3
138
 
140
 
139
/** Send as_area over IPC
141
/** Send as_area over IPC
140
 * - ARG1 - src as_area base address
142
 * - ARG1 - src as_area base address
141
 * - ARG2 - size of src as_area (filled automatically by kernel)
143
 * - ARG2 - size of src as_area (filled automatically by kernel)
142
 * - ARG3 - flags of the as_area being sent
144
 * - ARG3 - flags of the as_area being sent
143
 *
145
 *
144
 * on answer:
146
 * on answer:
145
 * - ARG1 - dst as_area base adress
147
 * - ARG1 - dst as_area base adress
146
 */
148
 */
147
#define IPC_M_AS_AREA_SEND      5
149
#define IPC_M_AS_AREA_SEND  5
148
 
150
 
149
/** Get as_area over IPC
151
/** Get as_area over IPC
150
 * - ARG1 - dst as_area base address
152
 * - ARG1 - dst as_area base address
151
 * - ARG2 - dst as_area size
153
 * - ARG2 - dst as_area size
152
 * - ARG3 - user defined argument
154
 * - ARG3 - user defined argument
Line 154... Line 156...
154
 * on answer, the server must set:
156
 * on answer, the server must set:
155
 *
157
 *
156
 * - ARG1 - src as_area base address
158
 * - ARG1 - src as_area base address
157
 * - ARG2 - flags that will be used for sharing
159
 * - ARG2 - flags that will be used for sharing
158
 */
160
 */
159
#define IPC_M_AS_AREA_RECV      6
161
#define IPC_M_AS_AREA_RECV  6
160
 
162
 
161
 
163
 
162
/* Well-known methods */
164
/* Well-known methods */
163
#define IPC_M_LAST_SYSTEM     511
165
#define IPC_M_LAST_SYSTEM   511
164
#define IPC_M_PING            512
166
#define IPC_M_PING      512
165
/* User methods */
167
/* User methods */
166
#define FIRST_USER_METHOD     1024
168
#define FIRST_USER_METHOD   1024
167
 
169
 
168
#ifdef KERNEL
170
#ifdef KERNEL
169
 
171
 
170
#define IPC_MAX_PHONES  16
172
#define IPC_MAX_PHONES  16
171
 
173
 
Line 201... Line 203...
201
 
203
 
202
    struct task *task;
204
    struct task *task;
203
 
205
 
204
    waitq_t wq;
206
    waitq_t wq;
205
 
207
 
206
    /** Phones connected to this answerbox */
208
    /** Phones connected to this answerbox. */
207
    link_t connected_phones;
209
    link_t connected_phones;
208
    /** Received calls */
210
    /** Received calls. */
209
    link_t calls;          
211
    link_t calls;          
210
    link_t dispatched_calls;    /* Should be hash table in the future */
212
    link_t dispatched_calls;    /* Should be hash table in the future */
211
 
213
 
212
    /** Answered calls */
214
    /** Answered calls. */
213
    link_t answers;
215
    link_t answers;
214
 
216
 
215
    SPINLOCK_DECLARE(irq_lock);
217
    SPINLOCK_DECLARE(irq_lock);
216
    /** Notifications from IRQ handlers */
218
    /** Notifications from IRQ handlers. */
217
    link_t irq_notifs;
219
    link_t irq_notifs;
218
    /** IRQs with notifications to this answerbox. */
220
    /** IRQs with notifications to this answerbox. */
219
    link_t irq_head;
221
    link_t irq_head;
220
} answerbox_t;
222
} answerbox_t;
221
 
223
 
Line 227... Line 229...
227
typedef struct {
229
typedef struct {
228
    link_t link;
230
    link_t link;
229
 
231
 
230
    int flags;
232
    int flags;
231
 
233
 
232
    /* Identification of the caller */
234
    /** Identification of the caller. */
233
    struct task *sender;
235
    struct task *sender;
234
    /* The caller box is different from sender->answerbox
236
    /** The caller box is different from sender->answerbox for synchronous
235
     * for synchronous calls
237
     *  calls. */
236
     */
-
 
237
    answerbox_t *callerbox;
238
    answerbox_t *callerbox;
238
 
239
 
239
    /** Private data to internal IPC */
240
    /** Private data to internal IPC. */
240
    unative_t priv;
241
    unative_t priv;
241
 
242
 
242
    /** Data passed from/to userspace */
243
    /** Data passed from/to userspace. */
243
    ipc_data_t data;
244
    ipc_data_t data;
244
} call_t;
245
} call_t;
245
 
246
 
246
extern void ipc_init(void);
247
extern void ipc_init(void);
247
extern call_t * ipc_wait_for_call(answerbox_t *box, uint32_t usec, int flags);
248
extern call_t * ipc_wait_for_call(answerbox_t *box, uint32_t usec, int flags);