Skip to content

Commit 8bd3e45

Browse files
ppannutoalevy
authored andcommitted
libtock: add yield-waitfor function
1 parent 4f18914 commit 8bd3e45

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

libtock/tock.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,25 @@ int yield_no_wait(void) {
184184
return (int)result;
185185
}
186186

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+
187206
void tock_exit(uint32_t completion_code) {
188207
register uint32_t r0 __asm__ ("r0") = 0; // Terminate
189208
register uint32_t r1 __asm__ ("r1") = completion_code;
@@ -400,6 +419,23 @@ int yield_no_wait(void) {
400419
return (int)result;
401420
}
402421

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+
403439

404440
void tock_restart(uint32_t completion_code) {
405441
register uint32_t a0 __asm__ ("a0") = 1; // exit-restart

libtock/tock.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,18 @@ typedef struct {
127127
uint32_t data;
128128
} memop_return_t;
129129

130+
// Return structure for a Yield-WaitFor syscall. The return value are the
131+
// arguments that would have been passed to the upcall the the Yield-WaitFor was
132+
// waiting on.
133+
typedef struct {
134+
// Upcall argument 1.
135+
uint32_t data0;
136+
// Upcall argument 2.
137+
uint32_t data1;
138+
// Upcall argument 3.
139+
uint32_t data2;
140+
} yield_waitfor_return_t;
141+
130142
////////////////////////////////////////////////////////////////////////////////
131143
///
132144
/// HELPER FUNCTIONS
@@ -177,6 +189,7 @@ int tock_allow_userspace_r_return_to_returncode(allow_userspace_r_return_t);
177189
void yield(void);
178190
void yield_for(bool*);
179191
int yield_no_wait(void);
192+
yield_waitfor_return_t yield_wait_for(uint32_t driver, uint32_t subscribe);
180193

181194
void tock_exit(uint32_t completion_code) __attribute__ ((noreturn));
182195
void tock_restart(uint32_t completion_code) __attribute__ ((noreturn));

0 commit comments

Comments
 (0)