Add mouse and clean virtio
This commit is contained in:
@@ -9,16 +9,16 @@ use log::info;
|
||||
use shared::syscall::SysCall;
|
||||
|
||||
use crate::{
|
||||
KBD_DRIVER,
|
||||
boot::sbi::{EextensionID, TimerFunctionID},
|
||||
clear_csr, println,
|
||||
KBD_DRIVER, MOUSE_DRIVER,
|
||||
boot::sbi::{ExtensionID, TimerFunctionID},
|
||||
clear_csr,
|
||||
process::{ExecutionContext, exit_process, sleep},
|
||||
read_csr,
|
||||
riscv::disable_interrupt,
|
||||
scheduler::SCHEDULER,
|
||||
set_csr, syscall,
|
||||
time::{IRQ_M_EXTERNAL, IRQ_M_TIMER, setup_next_timer_interrupt},
|
||||
virtio::input::S_MODE_CLAIM_COMPLETE,
|
||||
virtio::input::HANDLING_INTERRUPT,
|
||||
virtual_fs::{FILE_SYSTEM, VirtualFileSystem},
|
||||
write_csr,
|
||||
};
|
||||
@@ -58,7 +58,7 @@ unsafe extern "C" fn machine_trap_handler(
|
||||
|
||||
#[allow(clippy::single_match)]
|
||||
match eid {
|
||||
c if c == EextensionID::Time as usize => match fid {
|
||||
c if c == ExtensionID::Time as usize => match fid {
|
||||
c if c == TimerFunctionID::SetTimer as usize => {
|
||||
clear_csr!(mip, 1 << 5);
|
||||
}
|
||||
@@ -199,7 +199,7 @@ unsafe extern "C" fn supervisor_trap_handler(
|
||||
"ecall",
|
||||
in("a0") 0,
|
||||
in("a6") TimerFunctionID::SetTimer as u64,
|
||||
in("a7") EextensionID::Time as u64,
|
||||
in("a7") ExtensionID::Time as u64,
|
||||
clobber_abi("system")
|
||||
);
|
||||
}
|
||||
@@ -207,17 +207,21 @@ unsafe extern "C" fn supervisor_trap_handler(
|
||||
SCHEDULER.lock().schedule(&mut interrupt_state);
|
||||
}
|
||||
9 => {
|
||||
println!("click");
|
||||
let irq = core::ptr::read_volatile(S_MODE_CLAIM_COMPLETE);
|
||||
unsafe {
|
||||
let irq = core::ptr::read_volatile((HANDLING_INTERRUPT + 0x1004) as *const u32);
|
||||
|
||||
if irq != 0 {
|
||||
// ... Traiter l'interruption VirtIO ici ...
|
||||
if irq != 0 {
|
||||
if irq == 34 {
|
||||
KBD_DRIVER.handle_interrupt();
|
||||
} else if irq == 35 {
|
||||
MOUSE_DRIVER.handle_interrupt();
|
||||
}
|
||||
|
||||
// 2. Écrire l'IRQ (Complete) <--- INDISPENSABLE
|
||||
core::ptr::write_volatile(S_MODE_CLAIM_COMPLETE, irq);
|
||||
KBD_DRIVER.as_mut().unwrap().handle_interrupt();
|
||||
} else {
|
||||
panic!()
|
||||
// Complete interrupt
|
||||
core::ptr::write_volatile((HANDLING_INTERRUPT + 0x1004) as *mut u32, irq);
|
||||
} else {
|
||||
panic!()
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
|
||||
Reference in New Issue
Block a user