somehal 0.6.9

SomeHAL: A hardware abstraction layer for kernel development.
Documentation
use crate::common::PlatOp;

mod plic;

pub struct Plat;

pub fn register_current_cpu_id(cpu_idx: usize, reader: fn() -> usize) {
    plic::register_current_cpu_id(cpu_idx, reader);
}

pub(crate) fn claim_external_irq() -> Option<someboot::irq::IrqId> {
    plic::claim_external_irq()
}

pub(crate) fn complete_external_irq(irq: someboot::irq::IrqId) {
    plic::complete_external_irq(irq);
}

impl PlatOp for Plat {
    fn irq_set_enable(irq: rdrive::IrqId, enable: bool) {
        plic::irq_set_enable(irq, enable);
    }

    fn irq_handler() -> someboot::irq::IrqId {
        someboot::irq::IrqId::new(plic::systick_irq().raw())
    }

    fn irq_handler_with_raw(raw: usize) -> Option<someboot::irq::IrqId> {
        plic::irq_handler_with_raw(raw)
    }

    fn systick_irq() -> rdrive::IrqId {
        plic::systick_irq()
    }

    fn secondary_init() {}

    fn secondary_init_intc(cpu_idx: usize) {
        plic::secondary_init_intc(cpu_idx);
    }

    fn secondary_init_systick() {}

    fn send_ipi(_irq: rdrive::IrqId, target: crate::irq::IpiTarget) {
        match target {
            crate::irq::IpiTarget::Current { cpu_id } | crate::irq::IpiTarget::Other { cpu_id } => {
                plic::send_ipi_to_cpu(cpu_id);
            }
            crate::irq::IpiTarget::AllExceptCurrent { cpu_id, cpu_num } => {
                for target_cpu in 0..cpu_num {
                    if target_cpu != cpu_id {
                        plic::send_ipi_to_cpu(target_cpu);
                    }
                }
            }
        }
    }

    fn send_ipi_to_cpu(cpu_id: usize) {
        plic::send_ipi_to_cpu(cpu_id);
    }
}