Skip to content

Commit

Permalink
libtock: yield_wait_for impl
Browse files Browse the repository at this point in the history
Use param A and B
  • Loading branch information
bradjc committed Jun 14, 2024
1 parent 09ca309 commit c734ec5
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 8 deletions.
31 changes: 24 additions & 7 deletions libtock/tock.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,22 +234,22 @@ 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");

__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;
}


Expand Down Expand Up @@ -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
Expand Down
14 changes: 13 additions & 1 deletion libtock/tock.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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));
Expand Down

0 comments on commit c734ec5

Please sign in to comment.