use core::arch::asm;
use super::{Pmu, PmuError, isb, registers};
impl Pmu {
pub fn disable_user_access(&mut self) {
write_reg!("PMUSERENR_EL0", 0);
isb();
}
pub unsafe fn enable_user_access(&mut self, readable: u64) -> Result<(), PmuError> {
if readable & !self.implemented_mask() != 0 {
return Err(PmuError::InvalidCounter);
}
if self.info.version >= 9 {
write_reg!("S3_0_C9_C14_4", readable); } else {
for index in 0..self.info.num_counters {
if readable & (1u64 << index) == 0 {
registers::write_counter(index, 0);
}
}
if readable & (1u64 << 31) == 0 {
write_reg!("PMCCNTR_EL0", 0);
}
if self.info.has_instruction_counter && readable & (1u64 << 32) == 0 {
write_reg!("S3_3_C9_C4_0", 0); }
}
write_reg!("PMUSERENR_EL0", (1u64 << 4) | (1 << 3) | (1 << 2));
isb();
Ok(())
}
}