cpu: add irq depth counting

Add a way of checking if a cpu is in the middle of handling an irq and
how deep it is into it. This will allow for future code to conditionally
run only in/outside interrupts.
This commit is contained in:
Matheus
2026-10-06 10:58:37 -03:00
parent 6c65a90a5f
commit 011309d43d
3 changed files with 18 additions and 1 deletions
+12 -1
View File
@@ -45,6 +45,7 @@ static void dopending(context_t *ctx, void *) {
arch_interrupt_disable();
bool entrystatus = current_cpu()->intstatus;
current_cpu()->intstatus = false;
__atomic_fetch_add(&current_cpu()->irq_depth, 1, __ATOMIC_RELAXED);
isr_t *list = NULL;
isr_t *iterator = current_cpu()->isrqueue;
@@ -87,18 +88,25 @@ static void dopending(context_t *ctx, void *) {
}
cleanup:
__atomic_fetch_sub(&current_cpu()->irq_depth, 1, __ATOMIC_RELAXED);
if (entrystatus) {
current_cpu()->intstatus = true;
arch_interrupt_enable();
}
}
__attribute__((no_caller_saved_registers)) void sched_userspacecheck(context_t *context, bool syscall, uint64_t syscallret, uint64_t syscallerrno);
__attribute__((no_caller_saved_registers)) void sched_userspacecheck(context_t *context,
bool syscall,
uint64_t syscallret,
uint64_t syscallerrno);
void interrupt_isr(int vec, context_t *ctx) {
isr_t *isr = &current_cpu()->isr[vec];
current_cpu()->intstatus = false;
if (isr->priority != IPL_IGNORE)
__atomic_fetch_add(&current_cpu()->irq_depth, 1, __ATOMIC_RELAXED);
if (isr->func == NULL) {
char oops[64];
snprintf(oops, 64, "Unregistered interrupt %d\n", vec);
@@ -116,6 +124,9 @@ void interrupt_isr(int vec, context_t *ctx) {
if (isr->eoi)
isr->eoi(isr);
if (isr->priority != IPL_IGNORE)
__atomic_fetch_sub(&current_cpu()->irq_depth, 1, __ATOMIC_RELAXED);
if (ARCH_CONTEXT_ISUSER(ctx))
sched_userspacecheck(ctx, false, 0, 0);