/* rdispatch_send_msg: Sends msgs from PDAEMON processes to HOST
* 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
mov b32 $r1 $r10
mov b32 $r2 $r11
mov b32 $r3 $r12
movw $r12 #const_rdispatch_size
wait_for_size_available_loop:
/*while( RING_SIZE - memoryUsed() < payload_size + 3);*/
call #rdispatch_memory_used
sub b32 $r10 $r12 $r10
add b32 $r11 $r3 3
cmpu b32 $r10 $r11
bra l #wait_for_size_available_loop
/* $r4 = $r10 = RFIFO_PUT */
IOADDR(`#io_RFIFO_PUT', `$r15')
iord $r4 I[$r15]
mov $r10 $r4
/* D[*PUT] = pid; D[*PUT+1] = msg_id; D[*PUT+2] = payload_size; */
st b8 D[$r10] $r1
movw $r11 1
movw $r12 #const_rdispatch_size
call #rdispatch_wrap_around
st b8 D[$r10] $r2
call #rdispatch_wrap_around
st b8 D[$r10] $r3
/* $r14 = payload_size */
mov $r14 $r3
call #memcpy_ring
cont: /* Inc PUT. *PUT = wrap_around(*PUT, payload_size+3, RING_SIZE); */
add b32 $r11 $r3 3
call #rdispatch_wrap_around
iowrs I[$r15] $r4
pop $r4
pop $r3
pop $r2
pop $r1
ret
/* memcpy:
* In: $r10: dst
* $r11: unused
* $r12: ring_size
* $r13: src
* $r14: length
* Out: None
*/
memcpy_ring:
/* return when length == 0 */
cmpu b32 $r14 0
bra e #memcpy_ring_exit
movw $r11 1
call #rdispatch_wrap_around
/* dst[0] = src[0] */
ld b8 $r15 D[$r13]
st b8 D[$r10] $r15
/* inc $r11 then dec $r14 */
add b32 $r11 1
sub b32 $r14 1
bra #memcpy_ring
memcpy_ring_exit:
ret
/* rdispatch_wrap_around: calculate the wrap-around for rdispatch
* In: $r10: current position
* $r11: bump increment
* $r12: ring size
* Out: $r10: new position
*/
rdispatch_wrap_around:
add b32 $r10 $r10 $r11
mod $r10 $r10 $r12
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
movw $r12 #const_rdispatch_size
st b32 D[$r0 + 8] $r12
rdispatch_memory_used_put_greater:
sub b32 $r10 $r10 $r11
ret