From fefde1793e2300dc74f57485f60c57b4e24892ce Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 23 Apr 2023 15:06:07 -0300 Subject: [PATCH] interrupt: interrupt_set() --- kernel-src/arch/x86-64/idt.c | 8 ++++++++ kernel-src/include/kernel/interrupt.h | 1 + kernel-src/include/x86-64/arch/cpu.h | 4 ++++ kernel-src/sys/interrupt.c | 13 +++++++++++++ 4 files changed, 26 insertions(+) diff --git a/kernel-src/arch/x86-64/idt.c b/kernel-src/arch/x86-64/idt.c index b1e97d45..3d48ac88 100644 --- a/kernel-src/arch/x86-64/idt.c +++ b/kernel-src/arch/x86-64/idt.c @@ -80,3 +80,11 @@ void arch_idt_reload() { for (int i = 0; i < 32; ++i) interrupt_register(i, exceptisr, NULL, 0); // TODO assign priority } + +void arch_interrupt_disable() { + asm("cli"); +} + +void arch_interrupt_enable() { + asm("sti"); +} diff --git a/kernel-src/include/kernel/interrupt.h b/kernel-src/include/kernel/interrupt.h index e7a57edb..b0481e85 100644 --- a/kernel-src/include/kernel/interrupt.h +++ b/kernel-src/include/kernel/interrupt.h @@ -24,5 +24,6 @@ void interrupt_register(int vector, void (*func)(isr_t *self, context_t *ctx), v isr_t *interrupt_allocate(void (*func)(isr_t *self, context_t *ctx), void (*eoi)(isr_t *self), long priority); void interrupt_raiseipl(long newipl); void interrupt_loweripl(long newipl); +bool interrupt_set(bool status); #endif diff --git a/kernel-src/include/x86-64/arch/cpu.h b/kernel-src/include/x86-64/arch/cpu.h index 1a04e754..20931605 100644 --- a/kernel-src/include/x86-64/arch/cpu.h +++ b/kernel-src/include/x86-64/arch/cpu.h @@ -6,8 +6,10 @@ #include #include +#include #include #include +#include typedef struct { uint64_t gdt[7]; @@ -16,6 +18,8 @@ typedef struct { isr_t isr[MAX_ISR_COUNT]; vmmcontext_t *vmmctx; int acpiid; + timer_t *timer; + bool intstatus; } cpu_t; static inline cpu_t *_cpu() { diff --git a/kernel-src/sys/interrupt.c b/kernel-src/sys/interrupt.c index 48f9ca3f..07b47ef4 100644 --- a/kernel-src/sys/interrupt.c +++ b/kernel-src/sys/interrupt.c @@ -47,3 +47,16 @@ void interrupt_raiseipl(long newipl) { void interrupt_loweripl(long newipl) { __assert(!"Unimplemented"); } + +void arch_interrupt_disable(); +void arch_interrupt_enable(); + +bool interrupt_set(bool status) { + if (status) + arch_interrupt_enable(); + else + arch_interrupt_disable(); + bool old = _cpu()->intstatus; + _cpu()->intstatus = status; + return old; +}