Changeset e74cb73 in mainline for generic/src/syscall/syscall.c
- Timestamp:
- 2006-03-14T09:30:07Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- d1f8a87
- Parents:
- 27810c5
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
generic/src/syscall/syscall.c
r27810c5 re74cb73 61 61 -2 on 'Too many async request, handle answers first 62 62 */ 63 static __native sys_ipc_call_sync(__native phoneid, __native arg1,64 __native arg 2, __native *respdata)63 static __native sys_ipc_call_sync(__native phoneid, __native method, 64 __native arg1, __native *data) 65 65 { 66 call_t *call;66 call_t call; 67 67 phone_t *phone; 68 68 /* Special answerbox for synchronous messages */ 69 69 70 70 if (phoneid >= IPC_MAX_PHONES) 71 return -ENOENT;71 return IPC_CALLRET_FATAL; 72 72 73 73 phone = &TASK->phones[phoneid]; 74 74 if (!phone->callee) 75 return -ENOENT;75 return IPC_CALLRET_FATAL; 76 76 77 call = ipc_call_alloc();78 call->data[0] = arg1;79 call->data[1] = arg2;77 ipc_call_init(&call); 78 IPC_SET_METHOD(call.data, method); 79 IPC_SET_ARG1(call.data, arg1); 80 80 81 ipc_call_sync(phone, call);81 ipc_call_sync(phone, &call); 82 82 83 copy_to_uspace( respdata, &call->data, sizeof(__native) * IPC_CALL_LEN);83 copy_to_uspace(data, &call.data, sizeof(call.data)); 84 84 85 85 return 0; 86 86 } 87 88 static __native sys_ipc_call_sync_medium(__native phoneid, __native *data) 89 { 90 call_t call; 91 phone_t *phone; 92 /* Special answerbox for synchronous messages */ 93 94 if (phoneid >= IPC_MAX_PHONES) 95 return IPC_CALLRET_FATAL; 96 97 phone = &TASK->phones[phoneid]; 98 if (!phone->callee) 99 return IPC_CALLRET_FATAL; 100 101 ipc_call_init(&call); 102 copy_from_uspace(&call.data, data, sizeof(call.data)); 103 104 ipc_call_sync(phone, &call); 105 106 copy_to_uspace(data, &call.data, sizeof(call.data)); 107 108 return 0; 109 } 110 87 111 88 112 /** Send an asynchronous call over ipc … … 91 115 -2 on 'Too many async request, handle answers first 92 116 */ 93 static __native sys_ipc_call_async(__native phoneid, __native arg1,94 __native arg 2)117 static __native sys_ipc_call_async(__native phoneid, __native method, 118 __native arg1, __native arg2) 95 119 { 96 120 call_t *call; … … 98 122 99 123 if (phoneid >= IPC_MAX_PHONES) 100 return -ENOENT;124 return IPC_CALLRET_FATAL; 101 125 102 126 phone = &TASK->phones[phoneid]; 103 127 if (!phone->callee) 104 return -ENOENT; 105 128 return IPC_CALLRET_FATAL; 106 129 107 130 /* TODO: Check that we did not exceed system imposed maximum … … 110 133 */ 111 134 call = ipc_call_alloc(); 112 call->data[0] = arg1; 113 call->data[1] = arg2; 135 IPC_SET_METHOD(call->data, method); 136 IPC_SET_ARG1(call->data, arg1); 137 IPC_SET_ARG2(call->data, arg2); 138 114 139 ipc_call(phone, call); 115 140 … … 118 143 119 144 /** Send IPC answer */ 120 static __native sys_ipc_answer(__native callid, __native arg1, __native arg2) 145 static __native sys_ipc_answer(__native callid, __native retval, __native arg1, 146 __native arg2) 121 147 { 122 148 call_t *call; … … 127 153 call = (call_t *) callid; 128 154 129 call->data[0] = arg1; 130 call->data[1] = arg2; 155 IPC_SET_RETVAL(call->data, retval); 156 IPC_SET_ARG1(call->data, arg1); 157 IPC_SET_ARG2(call->data, arg2); 131 158 132 159 ipc_answer(&TASK->answerbox, call); … … 145 172 146 173 call = ipc_wait_for_call(&TASK->answerbox, flags); 147 copy_to_uspace(calldata, &call->data, sizeof(__native) * IPC_CALL_LEN);148 174 149 if (call->flags & IPC_CALL_ANSWERED) 150 return ((__native)call) | 1; 175 copy_to_uspace(calldata, &call->data, sizeof(call->data)); 176 if (call->flags & IPC_CALL_ANSWERED) { 177 ASSERT(! (call->flags & IPC_CALL_STATIC_ALLOC)); 178 ipc_call_free(call); 179 return ((__native)call) | IPC_CALLID_ANSWERED; 180 } 151 181 return (__native)call; 152 182 } … … 157 187 sys_io, 158 188 sys_ipc_call_sync, 189 sys_ipc_call_sync_medium, 159 190 sys_ipc_call_async, 160 191 sys_ipc_answer,
Note:
See TracChangeset
for help on using the changeset viewer.