#[inline]
pub fn read_counter() -> u64 {
let ticks;
unsafe {
core::arch::asm!("csrr {ticks}, time", ticks = out(reg) ticks, options(nomem, nostack));
}
ticks
}
#[inline]
pub fn read_cycle_counter() -> u64 {
let value;
unsafe {
core::arch::asm!("csrr {}, cycle", out(reg) value, options(nostack));
}
value
}
#[inline]
pub fn read_instruction_counter() -> u64 {
let value;
unsafe {
core::arch::asm!("csrr {}, instret", out(reg) value, options(nostack));
}
value
}
pub fn irq_enabled() -> bool {
let sie: usize;
unsafe {
core::arch::asm!("csrr {}, sie", out(reg) sie, options(nostack));
}
sie & (1 << 5) != 0
}
pub unsafe fn set_irq_enabled(enabled: bool) {
unsafe {
if enabled {
core::arch::asm!("csrs sie, {}", in(reg) 1usize << 5, options(nostack));
} else {
core::arch::asm!("csrc sie, {}", in(reg) 1usize << 5, options(nostack));
}
}
}