Rev 3370 | Rev 3441 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3370 | Rev 3438 | ||
---|---|---|---|
Line 40... | Line 40... | ||
40 | #include <debug.h> |
40 | #include <debug.h> |
41 | #include <ipc/ipc.h> |
41 | #include <ipc/ipc.h> |
42 | #include <ipc/sysipc.h> |
42 | #include <ipc/sysipc.h> |
43 | #include <ipc/irq.h> |
43 | #include <ipc/irq.h> |
44 | #include <ipc/ipcrsc.h> |
44 | #include <ipc/ipcrsc.h> |
- | 45 | #include <ipc/ipc_kbox.h> |
|
- | 46 | #include <udebug/udebug_ipc.h> |
|
45 | #include <arch/interrupt.h> |
47 | #include <arch/interrupt.h> |
46 | #include <print.h> |
48 | #include <print.h> |
47 | #include <syscall/copy.h> |
49 | #include <syscall/copy.h> |
48 | #include <security/cap.h> |
50 | #include <security/cap.h> |
49 | #include <mm/as.h> |
51 | #include <mm/as.h> |
Line 293... | Line 295... | ||
293 | } |
295 | } |
294 | 296 | ||
295 | /** Called before the request is sent. |
297 | /** Called before the request is sent. |
296 | * |
298 | * |
297 | * @param call Call structure with the request. |
299 | * @param call Call structure with the request. |
- | 300 | * @param phone Phone that the call will be sent through. |
|
298 | * |
301 | * |
299 | * @return Return 0 on success, ELIMIT or EPERM on error. |
302 | * @return Return 0 on success, ELIMIT or EPERM on error. |
300 | */ |
303 | */ |
301 | static int request_preprocess(call_t *call) |
304 | static int request_preprocess(call_t *call, phone_t *phone) |
302 | { |
305 | { |
303 | int newphid; |
306 | int newphid; |
304 | size_t size; |
307 | size_t size; |
305 | uintptr_t src; |
308 | uintptr_t src; |
306 | int rc; |
309 | int rc; |
Line 338... | Line 341... | ||
338 | if (rc != 0) { |
341 | if (rc != 0) { |
339 | free(call->buffer); |
342 | free(call->buffer); |
340 | return rc; |
343 | return rc; |
341 | } |
344 | } |
342 | break; |
345 | break; |
- | 346 | #ifdef CONFIG_UDEBUG |
|
- | 347 | case IPC_M_DEBUG_ALL: |
|
- | 348 | return udebug_request_preprocess(call, phone); |
|
- | 349 | #endif |
|
343 | default: |
350 | default: |
344 | break; |
351 | break; |
345 | } |
352 | } |
346 | return 0; |
353 | return 0; |
347 | } |
354 | } |
Line 367... | Line 374... | ||
367 | IPC_SET_ARG5(call->data, call->priv); |
374 | IPC_SET_ARG5(call->data, call->priv); |
368 | } |
375 | } |
369 | 376 | ||
370 | if (call->buffer) { |
377 | if (call->buffer) { |
371 | /* This must be an affirmative answer to IPC_M_DATA_READ. */ |
378 | /* This must be an affirmative answer to IPC_M_DATA_READ. */ |
- | 379 | /* or IPC_M_DEBUG_ALL/UDEBUG_M_MEM_READ... */ |
|
372 | uintptr_t dst = IPC_GET_ARG1(call->data); |
380 | uintptr_t dst = IPC_GET_ARG1(call->data); |
373 | size_t size = IPC_GET_ARG2(call->data); |
381 | size_t size = IPC_GET_ARG2(call->data); |
374 | int rc = copy_to_uspace((void *) dst, call->buffer, size); |
382 | int rc = copy_to_uspace((void *) dst, call->buffer, size); |
375 | if (rc) |
383 | if (rc) |
376 | IPC_SET_RETVAL(call->data, rc); |
384 | IPC_SET_RETVAL(call->data, rc); |
Line 397... | Line 405... | ||
397 | IPC_SET_RETVAL(call->data, ELIMIT); |
405 | IPC_SET_RETVAL(call->data, ELIMIT); |
398 | ipc_answer(box, call); |
406 | ipc_answer(box, call); |
399 | return -1; |
407 | return -1; |
400 | } |
408 | } |
401 | IPC_SET_ARG5(call->data, phoneid); |
409 | IPC_SET_ARG5(call->data, phoneid); |
402 | } |
410 | } |
- | 411 | switch (IPC_GET_METHOD(call->data)) { |
|
- | 412 | case IPC_M_DEBUG_ALL: |
|
- | 413 | return -1; |
|
- | 414 | default: |
|
- | 415 | break; |
|
- | 416 | } |
|
403 | return 0; |
417 | return 0; |
404 | } |
418 | } |
405 | 419 | ||
406 | /** Make a fast call over IPC, wait for reply and return to user. |
420 | /** Make a fast call over IPC, wait for reply and return to user. |
407 | * |
421 | * |
Line 439... | Line 453... | ||
439 | * the limits of the fast version. |
453 | * the limits of the fast version. |
440 | */ |
454 | */ |
441 | IPC_SET_ARG4(call.data, 0); |
455 | IPC_SET_ARG4(call.data, 0); |
442 | IPC_SET_ARG5(call.data, 0); |
456 | IPC_SET_ARG5(call.data, 0); |
443 | 457 | ||
444 | if (!(res = request_preprocess(&call))) { |
458 | if (!(res = request_preprocess(&call, phone))) { |
445 | rc = ipc_call_sync(phone, &call); |
459 | rc = ipc_call_sync(phone, &call); |
446 | if (rc != EOK) |
460 | if (rc != EOK) |
447 | return rc; |
461 | return rc; |
448 | process_answer(&call); |
462 | process_answer(&call); |
449 | } else { |
463 | } else { |
Line 479... | Line 493... | ||
479 | if (rc != 0) |
493 | if (rc != 0) |
480 | return (unative_t) rc; |
494 | return (unative_t) rc; |
481 | 495 | ||
482 | GET_CHECK_PHONE(phone, phoneid, return ENOENT); |
496 | GET_CHECK_PHONE(phone, phoneid, return ENOENT); |
483 | 497 | ||
484 | if (!(res = request_preprocess(&call))) { |
498 | if (!(res = request_preprocess(&call, phone))) { |
485 | rc = ipc_call_sync(phone, &call); |
499 | rc = ipc_call_sync(phone, &call); |
486 | if (rc != EOK) |
500 | if (rc != EOK) |
487 | return rc; |
501 | return rc; |
488 | process_answer(&call); |
502 | process_answer(&call); |
489 | } else |
503 | } else |
Line 548... | Line 562... | ||
548 | * To achieve deterministic behavior, zero out arguments that are beyond |
562 | * To achieve deterministic behavior, zero out arguments that are beyond |
549 | * the limits of the fast version. |
563 | * the limits of the fast version. |
550 | */ |
564 | */ |
551 | IPC_SET_ARG5(call->data, 0); |
565 | IPC_SET_ARG5(call->data, 0); |
552 | 566 | ||
553 | if (!(res = request_preprocess(call))) |
567 | if (!(res = request_preprocess(call, phone))) |
554 | ipc_call(phone, call); |
568 | ipc_call(phone, call); |
555 | else |
569 | else |
556 | ipc_backsend_err(phone, call, res); |
570 | ipc_backsend_err(phone, call, res); |
557 | 571 | ||
558 | return (unative_t) call; |
572 | return (unative_t) call; |
Line 582... | Line 596... | ||
582 | sizeof(call->data.args)); |
596 | sizeof(call->data.args)); |
583 | if (rc != 0) { |
597 | if (rc != 0) { |
584 | ipc_call_free(call); |
598 | ipc_call_free(call); |
585 | return (unative_t) rc; |
599 | return (unative_t) rc; |
586 | } |
600 | } |
587 | if (!(res = request_preprocess(call))) |
601 | if (!(res = request_preprocess(call, phone))) |
588 | ipc_call(phone, call); |
602 | ipc_call(phone, call); |
589 | else |
603 | else |
590 | ipc_backsend_err(phone, call, res); |
604 | ipc_backsend_err(phone, call, res); |
591 | 605 | ||
592 | return (unative_t) call; |
606 | return (unative_t) call; |
Line 866... | Line 880... | ||
866 | ipc_irq_unregister(&TASK->answerbox, inr, devno); |
880 | ipc_irq_unregister(&TASK->answerbox, inr, devno); |
867 | 881 | ||
868 | return 0; |
882 | return 0; |
869 | } |
883 | } |
870 | 884 | ||
- | 885 | #include <console/console.h> |
|
- | 886 | ||
- | 887 | /** |
|
- | 888 | * Syscall connect to a task by id. |
|
- | 889 | * |
|
- | 890 | * @return Phone id on success, or negative error code. |
|
- | 891 | */ |
|
- | 892 | unative_t sys_ipc_connect_kbox(sysarg64_t *uspace_taskid_arg) |
|
- | 893 | { |
|
- | 894 | #ifdef CONFIG_UDEBUG |
|
- | 895 | sysarg64_t taskid_arg; |
|
- | 896 | int rc; |
|
- | 897 | ||
- | 898 | rc = copy_from_uspace(&taskid_arg, uspace_taskid_arg, sizeof(sysarg64_t)); |
|
- | 899 | if (rc != 0) |
|
- | 900 | return (unative_t) rc; |
|
- | 901 | ||
- | 902 | printf("sys_ipc_connect_kbox(%lld, %d)\n", taskid_arg.value); |
|
- | 903 | ||
- | 904 | return ipc_connect_kbox(taskid_arg.value); |
|
- | 905 | #else |
|
- | 906 | return (unative_t) ENOTSUP; |
|
- | 907 | #endif |
|
- | 908 | } |
|
- | 909 | ||
871 | /** @} |
910 | /** @} |
872 | */ |
911 | */ |