Skip to main content

os/boards/
qemu.rs

1pub const MEMORY_END: usize = 0x8800_0000;
2
3pub const MMIO: &[(usize, usize)] = &[
4    (0x0010_0000, 0x00_2000), // VIRT_TEST/RTC  in virt machine
5    (0x2000000, 0x10000),
6    (0xc000000, 0x210000), // VIRT_PLIC in virt machine
7    (0x10000000, 0x9000),  // VIRT_UART0 with GPU  in virt machine
8];
9
10pub type BlockDeviceImpl = crate::drivers::block::VirtIOBlock;
11pub type CharDeviceImpl = crate::drivers::chardev::NS16550a<VIRT_UART>;
12
13pub const VIRT_PLIC: usize = 0xC00_0000;
14pub const VIRT_UART: usize = 0x1000_0000;
15#[allow(unused)]
16pub const VIRTGPU_XRES: u32 = 1280;
17#[allow(unused)]
18pub const VIRTGPU_YRES: u32 = 800;
19
20use crate::drivers::block::BLOCK_DEVICE;
21use crate::drivers::chardev::{CharDevice, UART};
22use crate::drivers::plic::{IntrTargetPriority, PLIC};
23use crate::drivers::{KEYBOARD_DEVICE, MOUSE_DEVICE};
24
25pub fn device_init() {
26    use riscv::register::sie;
27    let mut plic = unsafe { PLIC::new(VIRT_PLIC) };
28    let hart_id: usize = 0;
29    let supervisor = IntrTargetPriority::Supervisor;
30    let machine = IntrTargetPriority::Machine;
31    plic.set_threshold(hart_id, supervisor, 0);
32    plic.set_threshold(hart_id, machine, 1);
33    //irq nums: 5 keyboard, 6 mouse, 8 block, 10 uart
34    for intr_src_id in [5usize, 6, 8, 10] {
35        plic.enable(hart_id, supervisor, intr_src_id);
36        plic.set_priority(intr_src_id, 1);
37    }
38    unsafe {
39        sie::set_sext();
40    }
41}
42
43pub fn irq_handler() {
44    let mut plic = unsafe { PLIC::new(VIRT_PLIC) };
45    let intr_src_id = plic.claim(0, IntrTargetPriority::Supervisor);
46    match intr_src_id {
47        5 => KEYBOARD_DEVICE.handle_irq(),
48        6 => MOUSE_DEVICE.handle_irq(),
49        8 => BLOCK_DEVICE.handle_irq(),
50        10 => UART.handle_irq(),
51        _ => panic!("unsupported IRQ {}", intr_src_id),
52    }
53    plic.complete(0, IntrTargetPriority::Supervisor, intr_src_id);
54}