use sgx_types::impl_enum;
use crate::enclave;
pub fn check_for(fid: Feature) -> bool {
let bit = fid.get_feature_bit();
(bit & enclave::rsgx_get_cpu_feature()) != 0
}
#[macro_export]
macro_rules! is_cpu_feature_supported {
($feature:expr) => ( (($feature & $crate::enclave::rsgx_get_cpu_feature()) != 0) )
}
#[macro_export]
macro_rules! is_x86_feature_detected {
("ia32") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::ia32)
};
("fpu") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::fpu)
};
("cmov") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::cmov)
};
("mmx") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::mmx)
};
("fxsave") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::fxsave)
};
("sse") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::sse)
};
("sse2") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::sse2)
};
("sse3") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::sse3)
};
("ssse3") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::ssse3)
};
("sse4.1") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::sse4_1)
};
("sse4.2") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::sse4_2)
};
("movbe") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::movbe)
};
("popcnt") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::popcnt)
};
("pclmulqdq") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::pclmulqdq)
};
("aes") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::aes)
};
("f16c") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::f16c)
};
("avx") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx)
};
("rdrand") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::rdrand)
};
("fma") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::fma)
};
("bmi") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::bmi)
};
("lzcnt") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::lzcnt)
};
("hle") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::hle)
};
("rtm") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::rtm)
};
("avx2") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx2)
};
("avx512dq") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx512dq)
};
("ptwrite") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::ptwrite)
};
("kncni") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::kncni)
};
("avx512f") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx512f)
};
("adx") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::adx)
};
("rdseed") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::rdseed)
};
("avx512ifma") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx512ifma)
};
("inorder") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::full_inorder)
};
("avx512er") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx512er)
};
("avx512pf") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx512pf)
};
("avx512cd") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx512cd)
};
("sha") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::sha)
};
("mpx") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::mpx)
};
("avx512bw") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx512bw)
};
("avx512vl") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx512vl)
};
("avx512vbmi") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx512vbmi)
};
("avx5124fmaps") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx512_4fmaps)
};
("avx5124vnniw") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx512_4vnniw)
};
("avx512vpopcntdq") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx512_vpopcntdq)
};
("avx512bitalg") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx512_bitalg)
};
("avx512vbmi2") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx512vbmi2)
};
("gfni") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::gfni)
};
("vaes") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::vaes)
};
("vpclmulqdq") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::vpclmulqdq)
};
("avx512vnni") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::avx512vnni)
};
("clwb") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::clwb)
};
("rdpid") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::rdpid)
};
("ibt") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::ibt)
};
("shstk") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::shstk)
};
("sgx") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::sgx)
};
("wbnoinvd") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::wbnoinvd)
};
("pconfig") => {
$crate::cpu_feature::check_for($crate::cpu_feature::Feature::pconfig)
};
($t:tt,) => {
is_x86_feature_detected!($t);
};
($t:tt) => {
compile_error!(concat!("unknown cpu feature: ", $t))
};
}
impl_enum! {
#[repr(u32)]
#[derive(Copy, Clone, PartialEq, Eq)]
pub enum Feature {
none = 0,
ia32 = 1,
fpu = 2,
cmov = 3,
mmx = 4,
fxsave = 5,
sse = 6,
sse2 = 7,
sse3 = 8,
ssse3 = 9,
sse4_1 = 10,
sse4_2 = 11,
movbe = 12,
popcnt = 13,
pclmulqdq = 14,
aes = 15,
f16c = 16,
avx = 17,
rdrand = 18,
fma = 19,
bmi = 20,
lzcnt = 21,
hle = 22,
rtm = 23,
avx2 = 24,
avx512dq = 25,
ptwrite = 26,
kncni = 27,
avx512f = 28,
adx = 29,
rdseed = 30,
avx512ifma = 31,
full_inorder = 32,
avx512er = 33,
avx512pf = 34,
avx512cd = 35,
sha = 36,
mpx = 37,
avx512bw = 38,
avx512vl = 39,
avx512vbmi = 40,
avx512_4fmaps = 41,
avx512_4vnniw = 42,
avx512_vpopcntdq = 43,
avx512_bitalg = 44,
avx512vbmi2 = 45,
gfni = 46,
vaes = 47,
vpclmulqdq = 48,
avx512vnni = 49,
clwb = 50,
rdpid = 51,
ibt = 52,
shstk = 53,
sgx = 54,
wbnoinvd = 55,
pconfig = 56,
end = 57,
}
}
impl Feature {
pub fn get_feature_bit(&self) -> u64 {
let id = *self as u32;
if (id > Self::none as u32) && (id < Self::end as u32) {
1 << (id - 1)
} else {
0
}
}
}