diff --git a/libtock/tock.c b/libtock/tock.c index eefb6010b..c487ee92c 100644 --- a/libtock/tock.c +++ b/libtock/tock.c @@ -234,11 +234,10 @@ int yield_no_wait(void) { } } -int yield_for_subscribable_upcall_returnr0_sync(uint32_t driver, uint32_t subscribe) { - register uint32_t wait __asm__ ("r0") = 2; // yield-waitfor-nocallback - register uint8_t* wait_field __asm__ ("r1") = NULL; // yield result ptr - register uint32_t r2 __asm__ ("r2") = driver; - register uint32_t r3 __asm__ ("r3") = subscribe; +yield_waitfor_return_t yield_wait_for(uint32_t driver, uint32_t subscribe) { + register uint32_t waitfor __asm__ ("r0") = 2; // yield-waitfor + register uint32_t r1 __asm__ ("r1") = driver; + register uint32_t r2 __asm__ ("r2") = subscribe; register int rv0 __asm__ ("r0"); register int rv1 __asm__ ("r1"); register int rv2 __asm__ ("r2"); @@ -246,10 +245,11 @@ int yield_for_subscribable_upcall_returnr0_sync(uint32_t driver, uint32_t subscr __asm__ volatile ( "svc 0 \n" : "=r" (rv0), "=r" (rv1), "=r" (rv2) - : "r" (wait), "r" (wait_field), "r" (r2), "r" (r3) + : "r" (waitfor), "r" (r1), "r" (r2) : "memory" ); - return rv0; + yield_waitfor_return_t rv = {rv0, rv1, rv2}; + return rv; } @@ -478,6 +478,23 @@ int yield_no_wait(void) { } } +yield_waitfor_return_t yield_wait_for(uint32_t driver, uint32_t subscribe) { + register uint32_t waitfor __asm__ ("a0") = 2; // yield-waitfor + register uint32_t a1 __asm__ ("a1") = driver; + register uint32_t a2 __asm__ ("a2") = subscribe; + register uint32_t a4 __asm__ ("a4") = 0; // Yield + register int rv0 __asm__ ("a0"); + register int rv1 __asm__ ("a1"); + register int rv2 __asm__ ("a2"); + __asm__ volatile ( + "ecall\n" + : "=r" (rv0), "=r" (rv1), "=r" (rv2) + : "r" (waitfor), "r" (a1), "r" (a2), "r" (a4) + : "memory"); + yield_waitfor_return_t rv = {rv0, rv1, rv2}; + return rv; +} + void tock_restart(uint32_t completion_code) { register uint32_t a0 __asm__ ("a0") = 1; // exit-restart diff --git a/libtock/tock.h b/libtock/tock.h index ca17877e3..09f6b564b 100644 --- a/libtock/tock.h +++ b/libtock/tock.h @@ -127,6 +127,18 @@ typedef struct { uint32_t data; } memop_return_t; +// Return structure for a Yield-WaitFor syscall. The return value are the +// arguments that would have been passed to the upcall the the Yield-WaitFor was +// waiting on. +typedef struct { + // Upcall argument 1. + uint32_t data0; + // Upcall argument 2. + uint32_t data1; + // Upcall argument 3. + uint32_t data2; +} yield_waitfor_return_t; + //////////////////////////////////////////////////////////////////////////////// /// /// HELPER FUNCTIONS @@ -180,7 +192,7 @@ int yield_check_tasks(void); int yield_no_wait(void); void yield(void); void yield_for(bool*); -int yield_for_subscribable_upcall_returnr0_sync(uint32_t driver, uint32_t subscribe); +yield_waitfor_return_t yield_wait_for(uint32_t driver, uint32_t subscribe); void tock_exit(uint32_t completion_code) __attribute__ ((noreturn)); void tock_restart(uint32_t completion_code) __attribute__ ((noreturn));