summaryrefslogtreecommitdiff
path: root/libhw
diff options
context:
space:
mode:
Diffstat (limited to 'libhw')
-rw-r--r--libhw/host_alarmclock.c8
-rw-r--r--libhw/rp2040_hwtimer.c17
-rw-r--r--libhw/w5500.c4
3 files changed, 15 insertions, 14 deletions
diff --git a/libhw/host_alarmclock.c b/libhw/host_alarmclock.c
index 4f43fc7..1d26f1a 100644
--- a/libhw/host_alarmclock.c
+++ b/libhw/host_alarmclock.c
@@ -110,7 +110,7 @@ static bool hostclock_add_trigger(implements_alarmclock *_alarmclock,
trigger->cb = cb;
trigger->cb_arg = cb_arg;
- cr_disable_interrupts();
+ bool saved = cr_save_and_disable_interrupts();
struct alarmclock_trigger **dst = &alarmclock->queue;
while (*dst && fire_at_ns >= (*dst)->fire_at_ns)
dst = &(*dst)->next;
@@ -145,7 +145,7 @@ static bool hostclock_add_trigger(implements_alarmclock *_alarmclock,
if (timer_settime(alarmclock->timer_id, TIMER_ABSTIME, &alarmspec, NULL) != 0)
error(1, errno, "timer_settime");
}
- cr_enable_interrupts();
+ cr_restore_interrupts(saved);
return false;
}
@@ -158,7 +158,7 @@ static void hostclock_del_trigger(implements_alarmclock *_alarmclock,
assert(alarmclock);
assert(trigger);
- cr_disable_interrupts();
+ bool saved = cr_save_and_disable_interrupts();
if (trigger->alarmclock == alarmclock) {
if (!trigger->prev)
alarmclock->queue = trigger->next;
@@ -170,5 +170,5 @@ static void hostclock_del_trigger(implements_alarmclock *_alarmclock,
trigger->prev = NULL;
trigger->next = NULL;
}
- cr_enable_interrupts();
+ cr_restore_interrupts(saved);
}
diff --git a/libhw/rp2040_hwtimer.c b/libhw/rp2040_hwtimer.c
index 6f37d85..9f0d901 100644
--- a/libhw/rp2040_hwtimer.c
+++ b/libhw/rp2040_hwtimer.c
@@ -115,7 +115,7 @@ static bool rp2040_hwtimer_add_trigger(implements_alarmclock *_alarmclock,
trigger->cb = cb;
trigger->cb_arg = cb_arg;
- cr_disable_interrupts();
+ bool saved = cr_save_and_disable_interrupts();
struct alarmclock_trigger **dst = &alarmclock->queue;
while (*dst && fire_at_ns >= (*dst)->fire_at_ns)
dst = &(*dst)->next;
@@ -135,14 +135,15 @@ static bool rp2040_hwtimer_add_trigger(implements_alarmclock *_alarmclock,
/* Force the interrupt handler to trigger as soon as
* we enable interrupts. This handles the case of
* when fire_at_ns is before when we called
- * cr_disable_interrupts(). We could check
+ * cr_save_and_disable_interrupts(). We could check
* timer_time_us_64() again after calling
- * cr_disable_interrupts() and do this conditionally,
- * but I don't think that would be any more efficient
- * than just letting the interrupt fire. */
+ * cr_save_and_disable_interrupts() and do this
+ * conditionally, but I don't think that would be any
+ * more efficient than just letting the interrupt
+ * fire. */
hw_set_bits(&timer_hw->intf, 1 << alarmclock->alarm_num);
}
- cr_enable_interrupts();
+ cr_restore_interrupts(saved);
return false;
}
@@ -154,7 +155,7 @@ static void rp2040_hwtimer_del_trigger(implements_alarmclock *_alarmclock,
assert(alarmclock);
assert(trigger);
- cr_disable_interrupts();
+ bool saved = cr_save_and_disable_interrupts();
if (trigger->alarmclock == alarmclock) {
if (!trigger->prev)
alarmclock->queue = trigger->next;
@@ -166,5 +167,5 @@ static void rp2040_hwtimer_del_trigger(implements_alarmclock *_alarmclock,
trigger->prev = NULL;
trigger->next = NULL;
}
- cr_enable_interrupts();
+ cr_restore_interrupts(saved);
}
diff --git a/libhw/w5500.c b/libhw/w5500.c
index 08486d4..5678ffd 100644
--- a/libhw/w5500.c
+++ b/libhw/w5500.c
@@ -340,14 +340,14 @@ void _w5500_init(struct w5500 *chip,
w5500_hard_reset(chip);
/* Finally, wire in the interrupt handler. */
- cr_disable_interrupts();
+ bool saved = cr_save_and_disable_interrupts();
for (size_t i = 0; i < ARRAY_LEN(w5500_chips); i++) {
if (w5500_chips[i] == NULL) {
w5500_chips[i] = chip;
break;
}
}
- cr_enable_interrupts();
+ cr_restore_interrupts(saved);
coroutine_add("w5500_irq", w5500_irq_cr, chip);
}