summaryrefslogtreecommitdiff
path: root/libcr/coroutine.c
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2024-12-09 12:24:52 -0700
committerLuke T. Shumaker <lukeshu@lukeshu.com>2024-12-09 12:24:52 -0700
commit87646c7959726bc0556d28f78fb730edd8365410 (patch)
tree087f074391f4beccc08626f966d945d0cad60aba /libcr/coroutine.c
parent96a751d8a5d20b2acea5ae8d10ac3d051466c2c3 (diff)
parentb1414723ab4171a7ca5fc5e8a5ac7c4eb43331e2 (diff)
Merge commit 'b1414723ab4171a7ca5fc5e8a5ac7c4eb43331e2'
Diffstat (limited to 'libcr/coroutine.c')
-rw-r--r--libcr/coroutine.c49
1 files changed, 32 insertions, 17 deletions
diff --git a/libcr/coroutine.c b/libcr/coroutine.c
index a947ae9..aa23d58 100644
--- a/libcr/coroutine.c
+++ b/libcr/coroutine.c
@@ -165,7 +165,7 @@
#define _CR_SIG_GDB SIGWINCH
#endif
- bool cr_is_in_intrhandler(void) {
+ bool cr_plat_is_in_intrhandler(void) {
sigset_t cur_mask;
sigfillset(&cur_mask);
sigprocmask(0, NULL, &cur_mask);
@@ -179,7 +179,7 @@
return false;
}
static inline bool _cr_plat_are_interrupts_enabled(void) {
- assert(!cr_is_in_intrhandler());
+ assert(!cr_plat_is_in_intrhandler());
sigset_t cur_mask;
sigfillset(&cur_mask);
sigprocmask(0, NULL, &cur_mask);
@@ -187,7 +187,7 @@
}
static inline void cr_plat_wait_for_interrupt(void) {
- assert(!cr_is_in_intrhandler());
+ assert(!cr_plat_is_in_intrhandler());
assert(!_cr_plat_are_interrupts_enabled());
sigset_t set;
sigemptyset(&set);
@@ -197,14 +197,14 @@
sigprocmask(SIG_SETMASK, &set, NULL);
}
bool _cr_plat_save_and_disable_interrupts(void) {
- assert(!cr_is_in_intrhandler());
+ assert(!cr_plat_is_in_intrhandler());
sigset_t all, old;
sigfillset(&all);
sigprocmask(SIG_SETMASK, &all, &old);
return !sigismember(&old, _CR_SIG_SENTINEL);
}
void _cr_plat_enable_interrupts(void) {
- assert(!cr_is_in_intrhandler());
+ assert(!cr_plat_is_in_intrhandler());
assert(!_cr_plat_are_interrupts_enabled());
sigset_t zero;
sigemptyset(&zero);
@@ -224,7 +224,7 @@
#endif
}
#elif __ARM_ARCH_6M__ && __ARM_EABI__
- bool cr_is_in_intrhandler(void) {
+ bool cr_plat_is_in_intrhandler(void) {
uint32_t isr_number;
asm volatile ("mrs %0, ipsr"
: /* %0 */"=l"(isr_number)
@@ -232,7 +232,7 @@
return isr_number != 0;
}
ALWAYS_INLINE static bool _cr_plat_are_interrupts_enabled(void) {
- assert(!cr_is_in_intrhandler());
+ assert(!cr_plat_is_in_intrhandler());
uint32_t primask;
asm volatile ("mrs %0, PRIMASK"
: /* %0 */"=l"(primask)
@@ -241,7 +241,7 @@
}
ALWAYS_INLINE static void cr_plat_wait_for_interrupt(void) {
- assert(!cr_is_in_intrhandler());
+ assert(!cr_plat_is_in_intrhandler());
assert(!_cr_plat_are_interrupts_enabled());
asm volatile ("wfi\n"
"cpsie i\n"
@@ -250,13 +250,13 @@
:::"memory");
}
bool _cr_plat_save_and_disable_interrupts(void) {
- assert(!cr_is_in_intrhandler());
+ assert(!cr_plat_is_in_intrhandler());
bool were_enabled = _cr_plat_are_interrupts_enabled();
asm volatile ("cpsid i");
return were_enabled;
}
void _cr_plat_enable_interrupts(void) {
- assert(!cr_is_in_intrhandler());
+ assert(!cr_plat_is_in_intrhandler());
assert(!_cr_plat_are_interrupts_enabled());
asm volatile ("cpsie i");
}
@@ -633,8 +633,14 @@ void coroutine_main(void) {
}
bool saved = cr_save_and_disable_interrupts();
assert(saved);
- assert(!cr_is_in_intrhandler());
+ assert(!cr_plat_is_in_intrhandler());
coroutine_running = 0;
+#if CONFIG_COROUTINE_GDB
+ /* Some pointless call to prevent cr_gdb_readjmp() from
+ * getting pruned out of the firmware image. */
+ if (coroutine_table[0].state != CR_NONE)
+ cr_gdb_readjmp(&coroutine_table[0].env);
+#endif
while (coroutine_cnt) {
cid_t next;
while ( !((next = coroutine_ringbuf_pop())) ) {
@@ -697,7 +703,7 @@ static inline void _cr_yield() {
void cr_yield(void) {
debugf("cid=%zu: cr_yield()", coroutine_running);
- assert(!cr_is_in_intrhandler());
+ assert(!cr_plat_is_in_intrhandler());
assert_cid_state(coroutine_running, state == CR_RUNNING);
bool saved = cr_save_and_disable_interrupts();
@@ -709,7 +715,7 @@ void cr_yield(void) {
void cr_pause_and_yield(void) {
debugf("cid=%zu: cr_pause_and_yield()", coroutine_running);
- assert(!cr_is_in_intrhandler());
+ assert(!cr_plat_is_in_intrhandler());
assert_cid_state(coroutine_running, state == CR_RUNNING);
bool saved = cr_save_and_disable_interrupts();
@@ -720,7 +726,7 @@ void cr_pause_and_yield(void) {
[[noreturn]] void cr_exit(void) {
debugf("cid=%zu: cr_exit()", coroutine_running);
- assert(!cr_is_in_intrhandler());
+ assert(!cr_plat_is_in_intrhandler());
assert_cid_state(coroutine_running, state == CR_RUNNING);
(void)cr_save_and_disable_interrupts();
@@ -737,7 +743,7 @@ static void _cr_unpause(cid_t cid) {
void cr_unpause(cid_t cid) {
debugf("cr_unpause(%zu)", cid);
- assert(!cr_is_in_intrhandler());
+ assert(!cr_plat_is_in_intrhandler());
assert_cid_state(coroutine_running, state == CR_RUNNING);
bool saved = cr_save_and_disable_interrupts();
@@ -747,17 +753,26 @@ void cr_unpause(cid_t cid) {
void cr_unpause_from_intrhandler(cid_t cid) {
debugf("cr_unpause_from_intrhandler(%zu)", cid);
- assert(cr_is_in_intrhandler());
+ assert(cr_plat_is_in_intrhandler());
_cr_unpause(cid);
}
cid_t cr_getcid(void) {
- assert(!cr_is_in_intrhandler());
+ assert(!cr_plat_is_in_intrhandler());
assert_cid_state(coroutine_running, state == CR_RUNNING);
return coroutine_running;
}
+void cr_assert_in_coroutine(void) {
+ assert(!cr_plat_is_in_intrhandler());
+ assert_cid_state(coroutine_running, state == CR_RUNNING);
+}
+
+void cr_assert_in_intrhandler(void) {
+ assert(cr_plat_is_in_intrhandler());
+}
+
/* cr_cid_info() **************************************************************/
#if CONFIG_COROUTINE_MEASURE_STACK