use crate::{CsrError, Csrs};
use ab_riscv_primitives::privilege::PrivilegeLevel;
use ab_riscv_primitives::registers::general_purpose::Register;
#[inline(always)]
#[doc(hidden)]
pub fn check_csr_privilege_level<Reg, C, CustomError>(
csrs: &C,
csr_index: u16,
) -> Result<(), CsrError<CustomError>>
where
Reg: Register,
[(); Reg::N]:,
C: Csrs<Reg, CustomError>,
{
let current = csrs.privilege_level();
let required_bits = ((csr_index >> 8) & 0b11) as u8;
let required = PrivilegeLevel::from_bits(required_bits).unwrap_or(PrivilegeLevel::Machine);
if current >= required {
Ok(())
} else {
Err(CsrError::InsufficientPrivilege {
csr_index,
required,
current,
})
}
}