#![allow(non_camel_case_types)]
#![allow(non_upper_case_globals)]
use core::sync::atomic::{AtomicBool, AtomicU32, Ordering};
#[cfg(any(target_os = "linux", target_os = "android"))]
use super::get_auxv;
#[no_mangle]
pub static mut OPENSSL_mips_cap_P: u32 = 0;
pub static INITIALIZED: AtomicBool = AtomicBool::new(false);
#[cfg(any(target_arch = "mips", target_arch = "mips32r6"))]
const IS_64BIT: bool = false;
#[cfg(any(target_arch = "mips64", target_arch = "mips64r6"))]
const IS_64BIT: bool = true;
fn detect_mips_capabilities(hwcap: usize) -> u32 {
let mut caps = 0u32;
const HWCAP_MIPS_R6: usize = 1 << 0;
const HWCAP_MIPS_MSA: usize = 1 << 1;
const HWCAP_MIPS_DSP: usize = 1 << 2;
const HWCAP_MIPS_DSP2: usize = 1 << 3;
const MIPS_CPU_R6: u32 = 1 << 0;
const MIPS_CPU_MSA: u32 = 1 << 1;
const MIPS_CPU_DSP: u32 = 1 << 2;
const MIPS_CPU_DSP2: u32 = 1 << 3;
if hwcap & HWCAP_MIPS_R6 != 0 {
caps |= MIPS_CPU_R6;
}
if hwcap & HWCAP_MIPS_MSA != 0 {
caps |= MIPS_CPU_MSA;
}
if hwcap & HWCAP_MIPS_DSP != 0 {
caps |= MIPS_CPU_DSP;
}
if hwcap & HWCAP_MIPS_DSP2 != 0 {
caps |= MIPS_CPU_DSP2;
}
caps
}
pub fn init() {
if INITIALIZED.swap(true, Ordering::Relaxed) {
return;
}
{
let hwcap = get_auxv(16).unwrap_or(0); let caps = detect_mips_capabilities(hwcap);
unsafe {
OPENSSL_mips_cap_P = caps;
}
}
INITIALIZED.store(true, Ordering::Release);
}