|
31 | 31 | use crate::{gdt, halt_loop, println, time};
|
32 | 32 | use lazy_static::lazy_static;
|
33 | 33 | use pic8259::ChainedPics;
|
| 34 | +use x86_64::instructions::interrupts; |
34 | 35 | use x86_64::registers::control::Cr2;
|
35 | 36 | use x86_64::structures::idt::{InterruptDescriptorTable, InterruptStackFrame, PageFaultErrorCode};
|
36 | 37 |
|
@@ -130,11 +131,8 @@ fn irq_handler_none(_frame: InterruptStackFrame, _irq: u8) {}
|
130 | 131 |
|
131 | 132 | #[inline]
|
132 | 133 | fn irq_handler_generic(frame: InterruptStackFrame, irq: u8) {
|
133 |
| - let irqs = IRQS.try_lock(); |
134 |
| - if let Some(irqs) = irqs { |
135 |
| - let handler = irqs[irq as usize]; |
136 |
| - handler(frame, irq); |
137 |
| - } |
| 134 | + let handler = IRQS.lock()[irq as usize]; |
| 135 | + handler(frame, irq); |
138 | 136 |
|
139 | 137 | unsafe {
|
140 | 138 | PICS.lock()
|
@@ -218,16 +216,18 @@ static IRQS: spin::Mutex<[IrqHandler; 16]> = spin::Mutex::new([irq_handler_none;
|
218 | 216 | /// panics.
|
219 | 217 | ///
|
220 | 218 | pub fn register_irq(irq: u8, handler: IrqHandler) {
|
221 |
| - let mut irqs = IRQS.lock(); |
222 | 219 | if irq > 15 {
|
223 | 220 | panic!("invalid IRQ {} passed to register_irq", irq);
|
224 | 221 | }
|
225 | 222 |
|
226 |
| - if irqs[irq as usize] != irq_handler_none { |
227 |
| - panic!("IRQ {} has already been registered", irq); |
228 |
| - } |
| 223 | + interrupts::without_interrupts(|| { |
| 224 | + let mut irqs = IRQS.lock(); |
| 225 | + if irqs[irq as usize] != irq_handler_none { |
| 226 | + panic!("IRQ {} has already been registered", irq); |
| 227 | + } |
229 | 228 |
|
230 |
| - irqs[irq as usize] = handler; |
| 229 | + irqs[irq as usize] = handler; |
| 230 | + }); |
231 | 231 | }
|
232 | 232 |
|
233 | 233 | // Tests
|
|
0 commit comments