document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. /* rdispatch_send_msg: Sends msgs from PDAEMON processes to HOST
  2. * WARNING: Do not try to push a message larger than rdispatch_size - 3!
  3. * In: $r10: pid (Process Id)
  4. * $r11: msg_id (Message Id)
  5. * $r12: payload_size (Size of the message payload being sent)
  6. * $r13: start of payload
  7. */
  8. rdispatch_send_msg:
  9. push $r1
  10. push $r2
  11. push $r3
  12. push $r4
  13. push $r5
  14.  
  15. mov b32 $r1 $r10
  16. mov b32 $r2 $r11
  17. mov b32 $r3 $r12
  18. mov b32 $r4 $r13
  19.  
  20. wait_for_size_available_loop:
  21.  
  22. /*while( RING_SIZE - memoryUsed() < payload_size + 3) { */
  23. /* $r10 = rdispatch_memory_used */
  24. call #rdispatch_memory_used
  25.  
  26. /* $r12 = rdispatch_size */
  27. mov $r12 #const_rdispatch_size
  28.  
  29. /* $r10 = rdispatch_size - rdispatch_memory_used */
  30. sub b32 $r10 $r12 $r10
  31.  
  32. /* $r11 = header_size + payload_size */
  33. add b32 $r11 $r3 3
  34.  
  35. cmp b32 $r10 $r11
  36. bra l #wait_for_size_available_loop
  37. /* } */
  38.  
  39. /* $r10 = RFIFO_PUT */
  40. IOADDR(`#io_RFIFO_PUT', `$r15')
  41. iord $r10 I[$r15]
  42.  
  43. /* $r11 = rdispatch_ring */
  44. mov $r11 #rdispatch_ring
  45.  
  46. /* $r12 = rdispatch_size */
  47. mov $r12 #const_rdispatch_size
  48.  
  49. /* D[*PUT] = pid; D[*PUT+1] = msg_id; D[*PUT+2] = payload_size
  50. * $r10 = wrap(RFIFO_PUT + 3)
  51. */
  52. st b8 D[$r10] $r1
  53. RING_WRAP_AROUND(`$r10', `1', `$r11', `$r12', `$r10')
  54. st b8 D[$r10] $r2
  55. RING_WRAP_AROUND(`$r10', `1', `$r11', `$r12', `$r10')
  56. st b8 D[$r10] $r3
  57. RING_WRAP_AROUND(`$r10', `1', `$r11', `$r12', `$r10')
  58.  
  59. /* $r13 = payload_src */
  60. mov b32 $r13 $r4
  61.  
  62. /* $r14 = payload_size */
  63. mov b32 $r14 $r3
  64.  
  65. /* $r5 = wrap(RFIFO_PUT + header_size + payload_size) */
  66. IOADDR(`#io_RFIFO_PUT', `$r15')
  67. iord $r15 I[$r15]
  68. add b32 $r5 $r3 3
  69. RING_WRAP_AROUND(`$r15', `$r5', `$r11', `$r12', `$r5')
  70.  
  71. /* copy the payload to the ring */
  72. call #memcpy_ring
  73.  
  74. /* update RFIFO_PUT */
  75. IOADDR(`#io_RFIFO_PUT', `$r15')
  76. iowrs I[$r15] $r5
  77.  
  78. pop $r5
  79. pop $r4
  80. pop $r3
  81. pop $r2
  82. pop $r1
  83.  
  84. ret
  85.  
  86.  
  87. /* rdispatch_memory_used: return the number of bytes used by rdispatch
  88. * In: None
  89. * Out: $r10: number of bytes used by rdispatch
  90. */
  91. rdispatch_memory_used:
  92.  
  93. IOADDR(`#io_RFIFO_PUT', `$r12')
  94. iord $r10 I[$r12]
  95.  
  96. IOADDR(`#io_RFIFO_GET', `$r12')
  97. iord $r11 I[$r12]
  98.  
  99. cmpu b32 $r10 $r11
  100. bra ae #rdispatch_memory_used_put_greater
  101.  
  102. add b32 $r10 $r10 #const_rdispatch_size
  103.  
  104. rdispatch_memory_used_put_greater:
  105. sub b32 $r10 $r10 $r11
  106. ret
');