macros.rs

macro_rules! write_csr {
    ($csr_number:literal) => {
        /// Writes the CSR
        #[inline]
        #[allow(unused_variables)]
        unsafe fn _write(bits: usize) {
            match () {
                #[cfg(riscv)]
                () => core::arch::asm!(concat!("csrrw x0, ", stringify!($csr_number), ", {0}"), in(reg) bits),

                #[cfg(not(riscv))]
                () => unimplemented!(),
            }
        }
    };
}

stvec.rs


read_csr_as!(Stvec, 0x105);
write_csr!(0x105);

/// Writes the CSR
#[inline]
pub unsafe fn write(addr: usize, mode: TrapMode) {
    _write(addr + mode as usize);
}

//write_csr 这个宏通过使用Rust的宏机制生成一个内联、允许未使用变量并且不安全的函数 _write。这个函数将执行一个RISC-V特权指令,将某个值写入指定的CSR寄存器。

image.png


为什么要相加?
在RISC-V架构中,stvec寄存器的低2位用于存储陷阱模式(Trap Mode),其余位用于存储入口地址。因此,当我们设置stvec寄存器时,需要将处理函数地址与陷阱模式组合在一起:

入口地址:高位(去掉低2位)部分保存处理函数地址。
陷阱模式:低2位保存陷阱模式。


putao
8 声望1 粉丝

推动世界向前发展,改善民生。