Rev 4345 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4345 | Rev 4348 | ||
---|---|---|---|
Line 118... | Line 118... | ||
118 | static bool service_clonable(int service) |
118 | static bool service_clonable(int service) |
119 | { |
119 | { |
120 | return (service == SERVICE_LOAD); |
120 | return (service == SERVICE_LOAD); |
121 | } |
121 | } |
122 | 122 | ||
123 | static void get_as_area(ipc_callid_t callid, ipc_call_t *call, char *name, void **addr) |
123 | static void get_as_area(ipc_callid_t callid, ipc_call_t *call, void *ph_addr, count_t pages, void **addr) |
124 | { |
124 | { |
125 | void *ph_addr; |
125 | if (ph_addr == NULL) { |
- | 126 | ipc_answer_0(callid, ENOENT); |
|
- | 127 | return; |
|
- | 128 | } |
|
126 | 129 | ||
127 | if (!*addr) { |
130 | if (*addr == NULL) { |
128 | ph_addr = (void *) sysinfo_value(name); |
131 | *addr = as_get_mappable_page(pages * PAGE_SIZE); |
- | 132 | ||
129 | if (!ph_addr) { |
133 | if (*addr == NULL) { |
130 | ipc_answer_0(callid, ENOENT); |
134 | ipc_answer_0(callid, ENOENT); |
131 | return; |
135 | return; |
132 | } |
136 | } |
133 | *addr = as_get_mappable_page(PAGE_SIZE); |
- | |
- | 137 | ||
134 | if (physmem_map(ph_addr, *addr, 1, |
138 | if (physmem_map(ph_addr, *addr, pages, |
135 | AS_AREA_READ | AS_AREA_CACHEABLE) != 0) { |
139 | AS_AREA_READ | AS_AREA_CACHEABLE) != 0) { |
136 | ipc_answer_0(callid, ENOENT); |
140 | ipc_answer_0(callid, ENOENT); |
137 | return; |
141 | return; |
138 | } |
142 | } |
139 | } |
143 | } |
- | 144 | ||
140 | ipc_answer_2(callid, EOK, (ipcarg_t) *addr, AS_AREA_READ); |
145 | ipc_answer_2(callid, EOK, (ipcarg_t) *addr, AS_AREA_READ); |
141 | } |
146 | } |
142 | 147 | ||
143 | /** Process pending connection requests */ |
148 | /** Process pending connection requests */ |
144 | static void process_pending_req() |
149 | static void process_pending_req() |
Line 195... | Line 200... | ||
195 | 200 | ||
196 | switch (IPC_GET_METHOD(call)) { |
201 | switch (IPC_GET_METHOD(call)) { |
197 | case IPC_M_SHARE_IN: |
202 | case IPC_M_SHARE_IN: |
198 | switch (IPC_GET_ARG3(call)) { |
203 | switch (IPC_GET_ARG3(call)) { |
199 | case SERVICE_MEM_REALTIME: |
204 | case SERVICE_MEM_REALTIME: |
200 | get_as_area(callid, &call, "clock.faddr", &clockaddr); |
205 | get_as_area(callid, &call, sysinfo_value("clock.faddr"), 1, &clockaddr); |
201 | break; |
206 | break; |
202 | case SERVICE_MEM_KLOG: |
207 | case SERVICE_MEM_KLOG: |
203 | get_as_area(callid, &call, "klog.faddr", &klogaddr); |
208 | get_as_area(callid, &call, sysinfo_value("klog.faddr"), sysinfo_value("klog.pages"), &klogaddr); |
204 | break; |
209 | break; |
205 | default: |
210 | default: |
206 | ipc_answer_0(callid, ENOENT); |
211 | ipc_answer_0(callid, ENOENT); |
207 | } |
212 | } |
208 | continue; |
213 | continue; |
Line 322... | Line 327... | ||
322 | } |
327 | } |
323 | 328 | ||
324 | hashed_service_t *hs = hash_table_get_instance(link, hashed_service_t, link); |
329 | hashed_service_t *hs = hash_table_get_instance(link, hashed_service_t, link); |
325 | retval = ipc_forward_fast(callid, hs->phone, IPC_GET_ARG2(*call), |
330 | retval = ipc_forward_fast(callid, hs->phone, IPC_GET_ARG2(*call), |
326 | IPC_GET_ARG3(*call), 0, IPC_FF_NONE); |
331 | IPC_GET_ARG3(*call), 0, IPC_FF_NONE); |
327 | - | ||
328 | out: |
332 | out: |
329 | if (!(callid & IPC_CALLID_NOTIFICATION)) |
333 | if (!(callid & IPC_CALLID_NOTIFICATION)) |
330 | ipc_answer_0(callid, retval); |
334 | ipc_answer_0(callid, retval); |
331 | } |
335 | } |
332 | 336 | ||
Line 355... | Line 359... | ||
355 | 359 | ||
356 | ipc_answer_0(callid, EOK); |
360 | ipc_answer_0(callid, EOK); |
357 | 361 | ||
358 | int rc = ipc_forward_fast(csr->callid, phone, IPC_GET_ARG2(csr->call), |
362 | int rc = ipc_forward_fast(csr->callid, phone, IPC_GET_ARG2(csr->call), |
359 | IPC_GET_ARG3(csr->call), 0, IPC_FF_NONE); |
363 | IPC_GET_ARG3(csr->call), 0, IPC_FF_NONE); |
360 | 364 | ||
361 | free(csr); |
365 | free(csr); |
- | 366 | ipc_hangup(phone); |
|
362 | } |
367 | } |
363 | 368 | ||
364 | /** Connect client to clonable service. |
369 | /** Connect client to clonable service. |
365 | * |
370 | * |
366 | * @param service Service to be connected to. |
371 | * @param service Service to be connected to. |