interrupt: split setipl into raiseipl and loweripl

This commit is contained in:
Matheus
2023-05-04 13:52:35 -03:00
parent 12ee7b5e31
commit 3987e7bca6
3 changed files with 24 additions and 12 deletions
+14 -4
View File
@@ -12,12 +12,12 @@ void interrupt_isr(int vec, context_t *ctx) {
_panic("Unregistered interrupt", ctx);
if (_cpu()->ipl > isr->priority) {
long oldipl = interrupt_setipl(isr->priority);
long oldipl = interrupt_raiseipl(isr->priority);
isr->func(isr, ctx);
interrupt_set(false);
interrupt_setipl(oldipl);
interrupt_loweripl(oldipl);
} else {
isr->pending = true;
}
@@ -51,10 +51,11 @@ isr_t *interrupt_allocate(void (*func)(isr_t *self, context_t *ctx), void (*eoi)
return isr;
}
long interrupt_setipl(long ipl) {
long interrupt_loweripl(long ipl) {
bool oldintstatus = interrupt_set(false);
long oldipl = _cpu()->ipl;
_cpu()->ipl = ipl;
if (oldipl > ipl)
_cpu()->ipl = ipl;
interrupt_set(oldintstatus);
// TODO do pending interrupts
@@ -62,6 +63,15 @@ long interrupt_setipl(long ipl) {
return oldipl;
}
long interrupt_raiseipl(long ipl) {
bool oldintstatus = interrupt_set(false);
long oldipl = _cpu()->ipl;
if (oldipl < ipl)
_cpu()->ipl = ipl;
interrupt_set(oldintstatus);
return oldipl;
}
void arch_interrupt_disable();
void arch_interrupt_enable();