Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement