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寄存器。
为什么要相加?
在RISC-V架构中,stvec寄存器的低2位用于存储陷阱模式(Trap Mode),其余位用于存储入口地址。因此,当我们设置stvec寄存器时,需要将处理函数地址与陷阱模式组合在一起:
入口地址:高位(去掉低2位)部分保存处理函数地址。
陷阱模式:低2位保存陷阱模式。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。