@@ -184,6 +184,25 @@ int yield_no_wait(void) {
184
184
return (int )result ;
185
185
}
186
186
187
+ yield_waitfor_return_t yield_wait_for (uint32_t driver , uint32_t subscribe ) {
188
+ register uint32_t waitfor __asm__ ("r0" ) = 2 ; // yield-waitfor
189
+ register uint32_t r1 __asm__ ("r1" ) = driver ;
190
+ register uint32_t r2 __asm__ ("r2" ) = subscribe ;
191
+ register int rv0 __asm__ ("r0" );
192
+ register int rv1 __asm__ ("r1" );
193
+ register int rv2 __asm__ ("r2" );
194
+
195
+ __asm__ volatile (
196
+ "svc 0 \n"
197
+ : "=r" (rv0 ), "=r" (rv1 ), "=r" (rv2 )
198
+ : "r" (waitfor ), "r" (r1 ), "r" (r2 )
199
+ : "memory"
200
+ );
201
+ yield_waitfor_return_t rv = {rv0 , rv1 , rv2 };
202
+ return rv ;
203
+ }
204
+
205
+
187
206
void tock_exit (uint32_t completion_code ) {
188
207
register uint32_t r0 __asm__ ("r0" ) = 0 ; // Terminate
189
208
register uint32_t r1 __asm__ ("r1" ) = completion_code ;
@@ -400,6 +419,23 @@ int yield_no_wait(void) {
400
419
return (int )result ;
401
420
}
402
421
422
+ yield_waitfor_return_t yield_wait_for (uint32_t driver , uint32_t subscribe ) {
423
+ register uint32_t waitfor __asm__ ("a0" ) = 2 ; // yield-waitfor
424
+ register uint32_t a1 __asm__ ("a1" ) = driver ;
425
+ register uint32_t a2 __asm__ ("a2" ) = subscribe ;
426
+ register uint32_t a4 __asm__ ("a4" ) = 0 ; // Yield
427
+ register int rv0 __asm__ ("a0" );
428
+ register int rv1 __asm__ ("a1" );
429
+ register int rv2 __asm__ ("a2" );
430
+ __asm__ volatile (
431
+ "ecall\n"
432
+ : "=r" (rv0 ), "=r" (rv1 ), "=r" (rv2 )
433
+ : "r" (waitfor ), "r" (a1 ), "r" (a2 ), "r" (a4 )
434
+ : "memory" );
435
+ yield_waitfor_return_t rv = {rv0 , rv1 , rv2 };
436
+ return rv ;
437
+ }
438
+
403
439
404
440
void tock_restart (uint32_t completion_code ) {
405
441
register uint32_t a0 __asm__ ("a0" ) = 1 ; // exit-restart
0 commit comments