(Revision 0 - 27 November 2000)
overview ipc_long handles ipc calls that involve deceiving, in memory messages or mappings. The second part checks for whether the message can be delivered now, and if so, it saves registers it needs on the stack and the timeout in the tcb, sets up arguments for and calls do_long_ipc to process memory mappings, memory messages and direct and indirect strings in long ipc. On return, depending on whether there was an error, it jumps to send_only_short or k_ipc deliver code to finish up.
input v1 sender (virtual or actual) from first v0 info for result vector part
data L4_IPC_ERROR_MASK 0xf0 (error code in result word)
| 22-24 | if destination not waiting goto pending |
| 25,26 | if destination has an open wait goto line 28 |
| 27 | if destination not waiting for a message from source goto pending |
| 28-46 | save needed registers on stack and timeout in caller's tcb |
| 47-52 | set up arguments for do_long_ipc and jump to it (note a2 gets address of s0) |
| 53-63 | on return from do_long_ipc, save previous v0, restore registers from stack including getting stcb pointing to high core end of tcb again |
| 64-66 | OR previous v0 and v0 value returned by do_long_ipc and if there's no error goto deliver part of k_ipc |
| 67 | else, if there's an error, goto send_only_short to wrap things up quickly |