Rev 2913 | Rev 3014 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2913 | Rev 2919 | ||
---|---|---|---|
Line 54... | Line 54... | ||
54 | void *buffer; |
54 | void *buffer; |
55 | 55 | ||
56 | klog_printf("debug_regs_write()"); |
56 | klog_printf("debug_regs_write()"); |
57 | 57 | ||
58 | uspace_data = (void *)IPC_GET_ARG3(call->data); |
58 | uspace_data = (void *)IPC_GET_ARG3(call->data); |
59 | to_copy = IPC_GET_ARG4(call->data); |
59 | to_copy = sizeof(istate_t); |
60 | if (to_copy > sizeof(istate_t)) to_copy = sizeof(istate_t); |
- | |
61 | - | ||
62 | buffer = malloc(to_copy, 0); |
60 | buffer = malloc(to_copy, 0); |
63 | 61 | ||
64 | rc = copy_from_uspace(buffer, uspace_data, to_copy); |
62 | rc = copy_from_uspace(buffer, uspace_data, to_copy); |
65 | if (rc != 0) { |
63 | if (rc != 0) { |
66 | klog_printf("debug_regs_write() - copy failed"); |
64 | klog_printf("debug_regs_write() - copy failed"); |
Line 275... | Line 273... | ||
275 | static void udebug_receive_regs_read(call_t *call) |
273 | static void udebug_receive_regs_read(call_t *call) |
276 | { |
274 | { |
277 | thread_t *t; |
275 | thread_t *t; |
278 | unative_t uspace_addr; |
276 | unative_t uspace_addr; |
279 | unative_t to_copy; |
277 | unative_t to_copy; |
280 | unative_t buf_size; |
- | |
281 | unative_t total_bytes; |
- | |
282 | void *buffer; |
278 | void *buffer; |
283 | int rc; |
279 | int rc; |
284 | size_t n; |
- | |
285 | 280 | ||
286 | klog_printf("debug_regs_read()"); |
281 | klog_printf("debug_regs_read()"); |
287 | 282 | ||
288 | t = (thread_t *) IPC_GET_ARG2(call->data); |
283 | t = (thread_t *) IPC_GET_ARG2(call->data); |
- | 284 | buffer = malloc(sizeof(istate_t), 0); |
|
289 | 285 | ||
290 | rc = udebug_regs_read(t, &buffer, &n); |
286 | rc = udebug_regs_read(t, buffer); |
291 | if (rc < 0) { |
287 | if (rc < 0) { |
292 | IPC_SET_RETVAL(call->data, rc); |
288 | IPC_SET_RETVAL(call->data, rc); |
293 | ipc_answer(&TASK->kernel_box, call); |
289 | ipc_answer(&TASK->kernel_box, call); |
294 | return; |
290 | return; |
295 | } |
291 | } |
Line 297... | Line 293... | ||
297 | /* |
293 | /* |
298 | * Make use of call->buffer to transfer data to caller's userspace |
294 | * Make use of call->buffer to transfer data to caller's userspace |
299 | */ |
295 | */ |
300 | 296 | ||
301 | uspace_addr = IPC_GET_ARG3(call->data); |
297 | uspace_addr = IPC_GET_ARG3(call->data); |
302 | buf_size = IPC_GET_ARG4(call->data); |
- | |
303 | - | ||
304 | total_bytes = n; |
- | |
305 | - | ||
306 | if (buf_size > total_bytes) |
- | |
307 | to_copy = total_bytes; |
298 | to_copy = sizeof(istate_t); |
308 | else |
- | |
309 | to_copy = buf_size; |
- | |
310 | 299 | ||
311 | IPC_SET_RETVAL(call->data, 0); |
300 | IPC_SET_RETVAL(call->data, 0); |
312 | /* ARG1=dest, ARG2=size as in IPC_M_DATA_READ so that |
301 | /* ARG1=dest, ARG2=size as in IPC_M_DATA_READ so that |
313 | same code in process_answer() can be used |
302 | same code in process_answer() can be used |
314 | (no way to distinguish method in answer) */ |
303 | (no way to distinguish method in answer) */ |
315 | IPC_SET_ARG1(call->data, uspace_addr); |
304 | IPC_SET_ARG1(call->data, uspace_addr); |
316 | IPC_SET_ARG2(call->data, to_copy); |
305 | IPC_SET_ARG2(call->data, to_copy); |
317 | 306 | ||
318 | IPC_SET_ARG3(call->data, total_bytes); |
- | |
319 | call->buffer = buffer; |
307 | call->buffer = buffer; |
320 | 308 | ||
321 | ipc_answer(&TASK->kernel_box, call); |
309 | ipc_answer(&TASK->kernel_box, call); |
322 | } |
310 | } |
323 | 311 | ||
324 | static void udebug_receive_regs_write(call_t *call) |
312 | static void udebug_receive_regs_write(call_t *call) |
325 | { |
313 | { |
326 | thread_t *t; |
314 | thread_t *t; |
327 | void *uspace_data; |
315 | void *uspace_data; |
328 | unative_t to_copy; |
- | |
329 | int rc; |
316 | int rc; |
330 | 317 | ||
331 | uspace_data = (void *)IPC_GET_ARG3(call->data); |
- | |
332 | to_copy = IPC_GET_ARG4(call->data); |
- | |
333 | - | ||
334 | t = (thread_t *) IPC_GET_ARG2(call->data); |
318 | t = (thread_t *) IPC_GET_ARG2(call->data); |
- | 319 | uspace_data = (void *)IPC_GET_ARG3(call->data); |
|
335 | 320 | ||
336 | rc = udebug_regs_write(t, call->buffer); |
321 | rc = udebug_regs_write(t, call->buffer); |
337 | if (rc < 0) { |
322 | if (rc < 0) { |
338 | IPC_SET_RETVAL(call->data, rc); |
323 | IPC_SET_RETVAL(call->data, rc); |
339 | ipc_answer(&TASK->kernel_box, call); |
324 | ipc_answer(&TASK->kernel_box, call); |
340 | return; |
325 | return; |
341 | } |
326 | } |
342 | 327 | ||
343 | /* Set answer values */ |
328 | /* Set answer values */ |
344 | 329 | ||
345 | IPC_SET_ARG1(call->data, to_copy); |
- | |
346 | IPC_SET_ARG2(call->data, sizeof(istate_t)); |
- | |
347 | - | ||
348 | IPC_SET_RETVAL(call->data, 0); |
330 | IPC_SET_RETVAL(call->data, 0); |
349 | free(call->buffer); |
331 | free(call->buffer); |
350 | call->buffer = NULL; |
332 | call->buffer = NULL; |
351 | 333 | ||
352 | ipc_answer(&TASK->kernel_box, call); |
334 | ipc_answer(&TASK->kernel_box, call); |