mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 18:26:48 +00:00
修复内核的clippy检查报错 --------- Co-authored-by: Samuel Dai <947309196@qq.com> Co-authored-by: Donkey Kane <109840258+xiaolin2004@users.noreply.github.com> Co-authored-by: themildwind <107623059+themildwind@users.noreply.github.com> Co-authored-by: GnoCiYeH <heyicong@dragonos.org> Co-authored-by: MemoryShore <105195940+MemoryShore@users.noreply.github.com> Co-authored-by: 曾俊 <110876916+ZZJJWarth@users.noreply.github.com> Co-authored-by: sun5etop <146408999+sun5etop@users.noreply.github.com> Co-authored-by: hmt <114841534+1037827920@users.noreply.github.com> Co-authored-by: laokengwt <143977175+laokengwt@users.noreply.github.com> Co-authored-by: TTaq <103996388+TTaq@users.noreply.github.com> Co-authored-by: Jomo <2512364506@qq.com> Co-authored-by: Samuel Dai <samuka007@qq.com> Co-authored-by: sspphh <112558065+sspphh@users.noreply.github.com>
115 lines
2.5 KiB
Rust
115 lines
2.5 KiB
Rust
use riscv::register::{scause::Scause, sstatus::Sstatus};
|
|
use system_error::SystemError;
|
|
|
|
use crate::{
|
|
driver::irqchip::riscv_intc::riscv_intc_init,
|
|
exception::{InterruptArch, IrqFlags, IrqFlagsGuard, IrqNumber},
|
|
libs::align::align_up,
|
|
};
|
|
|
|
use super::cpu::STACK_ALIGN;
|
|
|
|
pub(super) mod entry;
|
|
mod handle;
|
|
pub mod ipi;
|
|
|
|
pub struct RiscV64InterruptArch;
|
|
|
|
impl InterruptArch for RiscV64InterruptArch {
|
|
unsafe fn arch_irq_init() -> Result<(), SystemError> {
|
|
riscv_intc_init()?;
|
|
|
|
Ok(())
|
|
}
|
|
unsafe fn interrupt_enable() {
|
|
riscv::interrupt::enable();
|
|
}
|
|
|
|
unsafe fn interrupt_disable() {
|
|
riscv::interrupt::disable();
|
|
}
|
|
|
|
fn is_irq_enabled() -> bool {
|
|
riscv::register::sstatus::read().sie()
|
|
}
|
|
|
|
unsafe fn save_and_disable_irq() -> IrqFlagsGuard {
|
|
let sie = riscv::register::sstatus::read().sie();
|
|
IrqFlagsGuard::new(IrqFlags::new(sie.into()))
|
|
}
|
|
|
|
unsafe fn restore_irq(flags: IrqFlags) {
|
|
let sie: bool = flags.flags() != 0;
|
|
if sie {
|
|
riscv::register::sstatus::set_sie();
|
|
} else {
|
|
riscv::register::sstatus::clear_sie();
|
|
}
|
|
}
|
|
|
|
fn probe_total_irq_num() -> u32 {
|
|
// todo: 获取中断总数
|
|
256
|
|
}
|
|
|
|
fn ack_bad_irq(irq: IrqNumber) {
|
|
todo!("ack_bad_irq: {}", irq.data());
|
|
}
|
|
}
|
|
|
|
/// 中断栈帧结构体
|
|
#[repr(C)]
|
|
#[derive(Debug, Copy, Clone)]
|
|
pub struct TrapFrame {
|
|
epc: usize,
|
|
ra: usize,
|
|
sp: usize,
|
|
gp: usize,
|
|
tp: usize,
|
|
t0: usize,
|
|
t1: usize,
|
|
t2: usize,
|
|
s0: usize,
|
|
s1: usize,
|
|
a0: usize,
|
|
a1: usize,
|
|
a2: usize,
|
|
a3: usize,
|
|
a4: usize,
|
|
a5: usize,
|
|
a6: usize,
|
|
a7: usize,
|
|
s2: usize,
|
|
s3: usize,
|
|
s4: usize,
|
|
s5: usize,
|
|
s6: usize,
|
|
s7: usize,
|
|
s8: usize,
|
|
s9: usize,
|
|
s10: usize,
|
|
s11: usize,
|
|
t3: usize,
|
|
t4: usize,
|
|
t5: usize,
|
|
t6: usize,
|
|
// 以下是中断发生时自动保存的寄存器
|
|
status: Sstatus,
|
|
badaddr: usize,
|
|
cause: Scause,
|
|
/// a0 value before the syscall
|
|
origin_a0: usize,
|
|
}
|
|
|
|
impl TrapFrame {
|
|
/// 中断栈帧结构体的大小
|
|
pub const SIZE: usize = core::mem::size_of::<TrapFrame>();
|
|
|
|
/// 中断栈帧在栈上的大小
|
|
pub const SIZE_ON_STACK: usize = align_up(Self::SIZE, STACK_ALIGN);
|
|
/// 判断当前中断是否来自用户模式
|
|
pub fn is_from_user(&self) -> bool {
|
|
self.status.spp() == riscv::register::sstatus::SPP::User
|
|
}
|
|
}
|