|
|
@@ -3,7 +3,6 @@ use super::timer::{should_reschedule, timer_interrupt};
|
|
|
use crate::kernel::constants::EINVAL;
|
|
|
use crate::prelude::*;
|
|
|
use alloc::sync::Arc;
|
|
|
-use eonix_hal::processor::CPU;
|
|
|
use eonix_hal::traits::fault::Fault;
|
|
|
use eonix_hal::traits::trap::{RawTrapContext, TrapType};
|
|
|
use eonix_hal::trap::TrapContext;
|
|
|
@@ -24,19 +23,6 @@ pub fn default_irq_handler(irqno: usize) {
|
|
|
handler();
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- #[cfg(target_arch = "x86_64")]
|
|
|
- {
|
|
|
- use eonix_hal::arch_exported::io::Port8;
|
|
|
-
|
|
|
- const PIC1_COMMAND: Port8 = Port8::new(0x20);
|
|
|
- const PIC2_COMMAND: Port8 = Port8::new(0xA0);
|
|
|
-
|
|
|
- PIC1_COMMAND.write(0x20); // EOI
|
|
|
- if irqno >= 8 {
|
|
|
- PIC2_COMMAND.write(0x20); // EOI
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
pub fn default_fault_handler(fault_type: Fault, trap_ctx: &mut TrapContext) {
|
|
|
@@ -64,9 +50,9 @@ pub fn interrupt_handler(trap_ctx: &mut TrapContext) {
|
|
|
match trap_ctx.trap_type() {
|
|
|
TrapType::Syscall { no, .. } => unreachable!("Syscall {} in kernel space.", no),
|
|
|
TrapType::Fault(fault) => default_fault_handler(fault, trap_ctx),
|
|
|
- TrapType::Irq(no) => default_irq_handler(no),
|
|
|
- TrapType::Timer => {
|
|
|
- timer_interrupt();
|
|
|
+ TrapType::Irq { callback } => callback(default_irq_handler),
|
|
|
+ TrapType::Timer { callback } => {
|
|
|
+ callback(timer_interrupt);
|
|
|
|
|
|
if eonix_preempt::count() == 0 && should_reschedule() {
|
|
|
// To make scheduler satisfied.
|
|
|
@@ -88,7 +74,3 @@ where
|
|
|
IRQ_HANDLERS.lock_irq()[irqno as usize].push(Arc::new(handler));
|
|
|
Ok(())
|
|
|
}
|
|
|
-
|
|
|
-pub fn end_of_interrupt() {
|
|
|
- CPU::local().as_mut().end_of_interrupt();
|
|
|
-}
|