/* rdispatch_send_msg: Sends msgs from PDAEMON processes to HOST
* WARNING: Do not try to push a message larger than rdispatch_size - 3!
* In: $r10: pid (Process Id)
* $r11: msg_id (Message Id)
* $r12: payload_size (Size of the message payload being sent)
* $r13: start of payload
*/
rdispatch_send_msg:
push $r1
push $r2
push $r3
push $r4
push $r5
mov b32 $r1 $r10
mov b32 $r2 $r11
mov b32 $r3 $r12
mov b32 $r4 $r13
wait_for_size_available_loop:
/*while( RING_SIZE - memoryUsed() < payload_size + 3) { */
/* $r10 = rdispatch_memory_used */
call #rdispatch_memory_used
/* $r12 = rdispatch_size */
mov $r12 #const_rdispatch_size
/* $r10 = rdispatch_size - rdispatch_memory_used */
sub b32 $r10 $r12 $r10
/* $r11 = header_size + payload_size */
add b32 $r11 $r3 3
cmp b32 $r10 $r11
bra l #wait_for_size_available_loop
/* } */
/* $r10 = RFIFO_PUT */
IOADDR(`#io_RFIFO_PUT', `$r15')
iord $r10 I[$r15]
/* $r11 = rdispatch_ring */
mov $r11 #rdispatch_ring
/* $r12 = rdispatch_size */
mov $r12 #const_rdispatch_size
/* D[*PUT] = pid; D[*PUT+1] = msg_id; D[*PUT+2] = payload_size
* $r10 = wrap(RFIFO_PUT + 3)
*/
st b8 D[$r10] $r1
RING_WRAP_AROUND(`$r10', `1', `$r11', `$r12', `$r10')
st b8 D[$r10] $r2
RING_WRAP_AROUND(`$r10', `1', `$r11', `$r12', `$r10')
st b8 D[$r10] $r3
RING_WRAP_AROUND(`$r10', `1', `$r11', `$r12', `$r10')
/* $r13 = payload_src */
mov b32 $r13 $r4
/* $r14 = payload_size */
mov b32 $r14 $r3
/* $r5 = wrap(RFIFO_PUT + header_size + payload_size) */
IOADDR(`#io_RFIFO_PUT', `$r15')
iord $r15 I[$r15]
add b32 $r5 $r3 3
RING_WRAP_AROUND(`$r15', `$r5', `$r11', `$r12', `$r5')
/* copy the payload to the ring */
call #memcpy_ring
/* update RFIFO_PUT */
IOADDR(`#io_RFIFO_PUT', `$r15')
iowrs I[$r15] $r5
pop $r5
pop $r4
pop $r3
pop $r2
pop $r1
ret
/* rdispatch_memory_used: return the number of bytes used by rdispatch
* In: None
* Out: $r10: number of bytes used by rdispatch
*/
rdispatch_memory_used:
IOADDR(`#io_RFIFO_PUT', `$r12')
iord $r10 I[$r12]
IOADDR(`#io_RFIFO_GET', `$r12')
iord $r11 I[$r12]
cmpu b32 $r10 $r11
bra ae #rdispatch_memory_used_put_greater
add b32 $r10 $r10 #const_rdispatch_size
rdispatch_memory_used_put_greater:
sub b32 $r10 $r10 $r11
ret