hardware 0.0.9

A no_std bare-metal hardware abstraction layer — all port I/O, memory and swap allocations are guarded at runtime. Do not consider this dependency stable before x.1.x
Documentation
use core::sync::atomic::{AtomicUsize, Ordering};

const MAX_CAPS: usize = 16;

static CAPS: [AtomicUsize; MAX_CAPS] = [const { AtomicUsize::new(0) }; MAX_CAPS];

static CAP_COUNT: AtomicUsize = AtomicUsize::new(0);

pub fn register_capability(id: usize, value: usize) -> bool {
    if id >= MAX_CAPS {
        return false;
    }
    CAPS[id].store(value, Ordering::Release);
    let cur = CAP_COUNT.load(Ordering::Acquire);
    if id >= cur {
        CAP_COUNT.store(id + 1, Ordering::Release);
    }
    true
}

pub fn read_capability(id: usize) -> Option<usize> {
    if id >= MAX_CAPS {
        return None;
    }
    if id >= CAP_COUNT.load(Ordering::Acquire) {
        return None;
    }
    Some(CAPS[id].load(Ordering::Acquire))
}

pub fn capability_count() -> usize {
    CAP_COUNT.load(Ordering::Acquire)
}