L 5.14:  Long IPC code: ipc_long, second part.

(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