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::{AtomicU32, Ordering};

static FEATURES: AtomicU32 = AtomicU32::new(0);

pub const FEATURE_SSE: u32 = 1 << 0;
pub const FEATURE_AVX: u32 = 1 << 1;
pub const FEATURE_NEON: u32 = 1 << 2;
pub const FEATURE_IOMMU: u32 = 1 << 3;
pub const FEATURE_DMA: u32 = 1 << 4;
pub const FEATURE_GPU: u32 = 1 << 5;
pub const FEATURE_TPU: u32 = 1 << 6;
pub const FEATURE_LPU: u32 = 1 << 7;
pub const FEATURE_ACPI: u32 = 1 << 8;
pub const FEATURE_UEFI: u32 = 1 << 9;
pub const FEATURE_SMBIOS: u32 = 1 << 10;
pub const FEATURE_DEVICETREE: u32 = 1 << 11;
pub const FEATURE_HPET: u32 = 1 << 12;
pub const FEATURE_PCIE_ECAM: u32 = 1 << 13;
pub const FEATURE_VTD: u32 = 1 << 14;
pub const FEATURE_GOP: u32 = 1 << 15;

pub fn enable(feature: u32) {
    FEATURES.fetch_or(feature, Ordering::AcqRel);
}

pub fn disable(feature: u32) {
    FEATURES.fetch_and(!feature, Ordering::AcqRel);
}

pub fn is_enabled(feature: u32) -> bool {
    FEATURES.load(Ordering::Acquire) & feature != 0
}

pub fn all_enabled() -> u32 {
    FEATURES.load(Ordering::Acquire)
}

pub fn set_all(mask: u32) {
    FEATURES.store(mask, Ordering::Release);
}