Changeset 5f62ef9 in mainline
- Timestamp:
- 2006-03-14T23:47:04Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- d99d8c8
- Parents:
- 1065603e
- Location:
- generic
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
generic/include/ipc/ipc.h
r1065603e r5f62ef9 33 33 /* - the uspace may not be able to utilize full length */ 34 34 #define IPC_CALL_LEN 4 35 36 /** Maximum active async calls per thread */ 37 #define IPC_MAX_ASYNC_CALLS 4 35 38 36 39 /* Flags for calls */ -
generic/include/proc/task.h
r1065603e r5f62ef9 41 41 link_t tasks_link; /**< Link to other tasks within the system. */ 42 42 as_t *as; /**< Address space. */ 43 /* IPC stuff */ 43 44 answerbox_t answerbox; /**< Communication endpoint */ 44 45 phone_t phones[IPC_MAX_PHONES]; 46 atomic_t active_calls; /**< Active asynchronous messages */ 45 47 }; 46 48 -
generic/include/syscall/syscall.h
r1065603e r5f62ef9 34 34 SYS_IO, 35 35 SYS_MREMAP, 36 SYS_IPC_CALL_SYNC_FAST, 36 37 SYS_IPC_CALL_SYNC, 37 SYS_IPC_CALL_ SYNC_MEDIUM,38 SYS_IPC_CALL_ASYNC_FAST, 38 39 SYS_IPC_CALL_ASYNC, 39 40 SYS_IPC_ANSWER, -
generic/src/ipc/ns.c
r1065603e r5f62ef9 46 46 switch (IPC_GET_METHOD(call->data)) { 47 47 case NS_PING: 48 printf("Ping.\n"); 48 printf("Ping - %X, %X\n", IPC_GET_ARG1(call->data), 49 IPC_GET_ARG2(call->data)); 49 50 IPC_SET_RETVAL(call->data, 0); 51 IPC_SET_ARG1(call->data, 0xdeaddead); 52 IPC_SET_ARG2(call->data, 0xdeaddea2); 50 53 break; 51 54 default: -
generic/src/proc/task.c
r1065603e r5f62ef9 82 82 if (ipc_phone_0) 83 83 ipc_phone_init(&ta->phones[0], ipc_phone_0); 84 atomic_set(&ta->active_calls, 0); 84 85 85 86 ipl = interrupts_disable(); -
generic/src/syscall/syscall.c
r1065603e r5f62ef9 57 57 } 58 58 59 static phone_t * get_phone(__native phoneid) 60 { 61 phone_t *phone; 62 63 if (phoneid >= IPC_MAX_PHONES) 64 return NULL; 65 66 phone = &TASK->phones[phoneid]; 67 if (!phone->callee) 68 return NULL; 69 return phone; 70 } 71 59 72 /** Send a call over IPC, wait for reply, return to user 60 73 * … … 62 75 -2 on 'Too many async request, handle answers first 63 76 */ 64 static __native sys_ipc_call_sync (__native phoneid, __native method,65 __native arg1, __native *data)77 static __native sys_ipc_call_sync_fast(__native phoneid, __native method, 78 __native arg1, __native *data) 66 79 { 67 80 call_t call; … … 69 82 /* Special answerbox for synchronous messages */ 70 83 71 if (phoneid >= IPC_MAX_PHONES) 72 return IPC_CALLRET_FATAL; 73 74 phone = &TASK->phones[phoneid]; 75 if (!phone->callee) 84 phone = get_phone(phoneid); 85 if (!phone) 76 86 return IPC_CALLRET_FATAL; 77 87 … … 87 97 } 88 98 89 static __native sys_ipc_call_sync_medium(__native phoneid, __native *data) 99 /** Synchronous IPC call allowing to send whole message */ 100 static __native sys_ipc_call_sync(__native phoneid, __native *data) 90 101 { 91 102 call_t call; … … 93 104 /* Special answerbox for synchronous messages */ 94 105 95 if (phoneid >= IPC_MAX_PHONES) 96 return IPC_CALLRET_FATAL; 97 98 phone = &TASK->phones[phoneid]; 99 if (!phone->callee) 106 phone = get_phone(phoneid); 107 if (!phone) 100 108 return IPC_CALLRET_FATAL; 101 109 … … 110 118 } 111 119 120 /** Check that the task did not exceed allowed limit 121 * 122 * @return 0 - Limit OK, -1 - limit exceeded 123 */ 124 static int check_call_limit(void) 125 { 126 if (atomic_inc_post(&TASK->active_calls) > IPC_MAX_ASYNC_CALLS) { 127 atomic_dec(&TASK->active_calls); 128 return -1; 129 } 130 return 0; 131 } 112 132 113 133 /** Send an asynchronous call over ipc … … 116 136 -2 on 'Too many async request, handle answers first 117 137 */ 118 static __native sys_ipc_call_async(__native phoneid, __native method, 119 __native arg1, __native arg2) 120 { 121 call_t *call; 122 phone_t *phone; 123 124 if (phoneid >= IPC_MAX_PHONES) 125 return IPC_CALLRET_FATAL; 126 127 phone = &TASK->phones[phoneid]; 128 if (!phone->callee) 129 return IPC_CALLRET_FATAL; 130 131 /* TODO: Check that we did not exceed system imposed maximum 132 * of asynchrnously sent messages 133 * - the userspace should be able to handle it correctly 134 */ 138 static __native sys_ipc_call_async_fast(__native phoneid, __native method, 139 __native arg1, __native arg2) 140 { 141 call_t *call; 142 phone_t *phone; 143 144 phone = get_phone(phoneid); 145 if (!phone) 146 return IPC_CALLRET_FATAL; 147 148 if (check_call_limit()) 149 return IPC_CALLRET_TEMPORARY; 150 135 151 call = ipc_call_alloc(); 136 152 IPC_SET_METHOD(call->data, method); … … 143 159 } 144 160 161 /** Synchronous IPC call allowing to send whole message 162 * 163 * @return The same as sys_ipc_call_async 164 */ 165 static __native sys_ipc_call_async(__native phoneid, __native *data) 166 { 167 call_t *call; 168 phone_t *phone; 169 170 phone = get_phone(phoneid); 171 if (!phone) 172 return IPC_CALLRET_FATAL; 173 174 if (check_call_limit()) 175 return IPC_CALLRET_TEMPORARY; 176 177 call = ipc_call_alloc(); 178 copy_from_uspace(&call->data, data, sizeof(call->data)); 179 180 ipc_call(phone, call); 181 182 return (__native) call; 183 } 184 185 145 186 /** Send IPC answer */ 146 187 static __native sys_ipc_answer(__native callid, __native retval, __native arg1, … … 175 216 176 217 copy_to_uspace(calldata, &call->data, sizeof(call->data)); 218 177 219 if (call->flags & IPC_CALL_ANSWERED) { 178 220 ASSERT(! (call->flags & IPC_CALL_STATIC_ALLOC)); 179 221 ipc_call_free(call); 222 atomic_dec(&TASK->active_calls); 180 223 return ((__native)call) | IPC_CALLID_ANSWERED; 181 224 } … … 192 235 sys_io, 193 236 sys_mremap, 237 sys_ipc_call_sync_fast, 194 238 sys_ipc_call_sync, 195 sys_ipc_call_ sync_medium,239 sys_ipc_call_async_fast, 196 240 sys_ipc_call_async, 197 241 sys_ipc_answer,
Note:
See TracChangeset
for help on using the changeset viewer.