Rev 955 | Rev 977 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 955 | Rev 959 | ||
---|---|---|---|
Line 53... | Line 53... | ||
53 | putchar(((char *) buf)[i]); |
53 | putchar(((char *) buf)[i]); |
54 | 54 | ||
55 | return count; |
55 | return count; |
56 | } |
56 | } |
57 | 57 | ||
58 | /** Send a call over syscall |
58 | /** Send a call over IPC, wait for reply, return to user |
59 | * |
59 | * |
60 | * @return Call identification, returns -1 on fatal error, |
60 | * @return Call identification, returns -1 on fatal error, |
61 | -2 on 'Too many async request, handle answers first |
61 | -2 on 'Too many async request, handle answers first |
62 | */ |
62 | */ |
63 | static __native sys_ipc_call(__native phoneid, __native arg1, __native arg2) |
63 | static __native sys_ipc_call_sync(__native phoneid, __native arg1, |
- | 64 | __native arg2, __native *respdata) |
|
- | 65 | { |
|
- | 66 | call_t *call; |
|
- | 67 | phone_t *phone; |
|
- | 68 | /* Special answerbox for synchronous messages */ |
|
- | 69 | ||
- | 70 | if (phoneid >= IPC_MAX_PHONES) |
|
- | 71 | return -ENOENT; |
|
- | 72 | ||
- | 73 | phone = &TASK->phones[phoneid]; |
|
- | 74 | if (!phone->callee) |
|
- | 75 | return -ENOENT; |
|
- | 76 | ||
- | 77 | call = ipc_call_alloc(); |
|
- | 78 | call->data[0] = arg1; |
|
- | 79 | call->data[1] = arg2; |
|
- | 80 | ||
- | 81 | ipc_call_sync(phone, call); |
|
- | 82 | ||
- | 83 | copy_to_uspace(respdata, &call->data, sizeof(__native) * IPC_CALL_LEN); |
|
- | 84 | ||
- | 85 | return 0; |
|
- | 86 | } |
|
- | 87 | ||
- | 88 | /** Send an asynchronous call over ipc |
|
- | 89 | * |
|
- | 90 | * @return Call identification, returns -1 on fatal error, |
|
- | 91 | -2 on 'Too many async request, handle answers first |
|
- | 92 | */ |
|
- | 93 | static __native sys_ipc_call_async(__native phoneid, __native arg1, |
|
- | 94 | __native arg2) |
|
64 | { |
95 | { |
65 | call_t *call; |
96 | call_t *call; |
66 | phone_t *phone; |
97 | phone_t *phone; |
67 | 98 | ||
68 | if (phoneid >= IPC_MAX_PHONES) |
99 | if (phoneid >= IPC_MAX_PHONES) |
Line 122... | Line 153... | ||
122 | 153 | ||
123 | 154 | ||
124 | syshandler_t syscall_table[SYSCALL_END] = { |
155 | syshandler_t syscall_table[SYSCALL_END] = { |
125 | sys_ctl, |
156 | sys_ctl, |
126 | sys_io, |
157 | sys_io, |
127 | sys_ipc_call, |
158 | sys_ipc_call_sync, |
- | 159 | sys_ipc_call_async, |
|
128 | sys_ipc_answer, |
160 | sys_ipc_answer, |
129 | sys_ipc_wait_for_call |
161 | sys_ipc_wait_for_call |
130 | }; |
162 | }; |