moa_cache 0.1.4

CPU 缓存维护操作(D-cache / I-cache)
Documentation
//! RISC-V 缓存维护
//!
//! base ISA 没有缓存维护指令(真正的清/无效化需 Zicbom 的 `cbo.clean/flush/inval`,本内核未启用),
//! 因此这里**假设平台缓存一致**(如 QEMU virt:CPU 与 DMA 处于同一一致性域):
//! D-cache 系列仅发 `fence rw, rw` 做访存定序,**不真正清/无效化任何 cache 行**,并忽略 `addr/size`。
//! 若将来要支持非一致性 DMA 设备,必须改为 Zicbom CMO 指令并按行操作。
//!
//! I-cache 系列用 `fence.i` 同步取指流。注意 `fence.i` **仅作用于本 hart**;SMP 下让其它 hart
//! 看到新代码需经 IPI 或 SBI `REMOTE_FENCE_I` 广播(当前两个 icache 函数均无调用方)。

#[inline(always)]
pub(super) fn arch_cache_init() {}

/// 标称 D-cache line 大小。riscv 不按行维护(见模块文档),此值仅供需要对齐粒度的调用方参考。
#[inline(always)]
pub(super) fn arch_dcache_line_size() -> usize {
    64
}

#[inline(always)]
pub(super) fn arch_clean_dcache_area(_addr: usize, _size: usize) {
    unsafe { core::arch::asm!("fence rw, rw") };
}

#[inline(always)]
pub(super) fn arch_inval_dcache_area(_addr: usize, _size: usize) {
    unsafe { core::arch::asm!("fence rw, rw") };
}

#[inline(always)]
pub(super) fn arch_flush_dcache_area(_addr: usize, _size: usize) {
    unsafe { core::arch::asm!("fence rw, rw") };
}

#[inline(always)]
pub(super) fn arch_flush_icache_all() {
    unsafe { core::arch::asm!("fence.i") };
}

#[inline(always)]
pub(super) fn arch_flush_icache_range(_start: usize, _end: usize) {
    unsafe { core::arch::asm!("fence.i") };
}