extern "Rust" {
fn __rivet_arch_init();
fn __rivet_arch_idle();
fn __rivet_arch_request_reschedule();
fn __rivet_arch_irq_save() -> usize;
fn __rivet_arch_irq_restore(token: usize);
fn __rivet_arch_init_task_stack(
stack_ptr: *mut u8,
stack_len: usize,
entry_fn: usize,
arg: usize,
) -> usize;
fn __rivet_arch_start_first_task(sp: usize) -> !;
fn __rivet_arch_on_switch_to(stack_base: usize, stack_size: usize);
fn __rivet_arch_guard_register(guard_base: usize, slot: usize);
fn __rivet_arch_scratch_open(base: usize, size: usize);
fn __rivet_arch_scratch_close();
fn __rivet_arch_min_task_stack() -> usize;
fn __rivet_arch_min_guard_size() -> usize;
fn __rivet_arch_cycle_count() -> u64;
fn __rivet_arch_irq_enable(irq_num: u32);
fn __rivet_arch_irq_disable(irq_num: u32);
fn __rivet_arch_irq_set_priority(irq_num: u32, priority: u8);
fn __rivet_arch_hart_id() -> usize;
fn __rivet_arch_request_reschedule_on(hart: usize);
}
pub fn init() {
unsafe { __rivet_arch_init() }
}
pub fn idle() {
unsafe { __rivet_arch_idle() }
}
pub fn request_reschedule() {
unsafe { __rivet_arch_request_reschedule() }
}
#[inline]
pub fn critical_section<R>(f: impl FnOnce() -> R) -> R {
let token = unsafe { __rivet_arch_irq_save() };
let r = f();
unsafe { __rivet_arch_irq_restore(token) };
r
}
pub unsafe fn init_task_stack(stack: &mut [u8], entry_fn: usize, arg: usize) -> usize {
unsafe { __rivet_arch_init_task_stack(stack.as_mut_ptr(), stack.len(), entry_fn, arg) }
}
pub unsafe fn start_first_task(sp: usize) -> ! {
unsafe { __rivet_arch_start_first_task(sp) }
}
pub fn on_switch_to(stack_base: usize, stack_size: usize) {
unsafe { __rivet_arch_on_switch_to(stack_base, stack_size) }
}
pub fn guard_register(guard_base: usize, slot: usize) {
unsafe { __rivet_arch_guard_register(guard_base, slot) }
}
pub fn scratch_open(base: usize, size: usize) {
unsafe { __rivet_arch_scratch_open(base, size) }
}
pub fn scratch_close() {
unsafe { __rivet_arch_scratch_close() }
}
pub fn min_task_stack() -> usize {
unsafe { __rivet_arch_min_task_stack() }
}
pub fn min_guard_size() -> usize {
unsafe { __rivet_arch_min_guard_size() }
}
pub fn cycle_count() -> u64 {
unsafe { __rivet_arch_cycle_count() }
}
pub fn irq_enable(irq_num: u32) {
unsafe { __rivet_arch_irq_enable(irq_num) }
}
pub fn irq_disable(irq_num: u32) {
unsafe { __rivet_arch_irq_disable(irq_num) }
}
pub fn irq_set_priority(irq_num: u32, priority: u8) {
unsafe { __rivet_arch_irq_set_priority(irq_num, priority) }
}
pub fn hart_id() -> usize {
unsafe { __rivet_arch_hart_id() }
}
pub fn request_reschedule_on(hart: usize) {
unsafe { __rivet_arch_request_reschedule_on(hart) }
}