You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
250 lines
9.6 KiB
250 lines
9.6 KiB
/*
|
|
* Copyright (c) 2021 Bitdefender
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
//! Instruction categories.
|
|
|
|
use super::decode_error::DecodeError;
|
|
use core::convert::TryFrom;
|
|
|
|
/// Instruction category.
|
|
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
|
|
#[allow(non_camel_case_types)]
|
|
pub enum Category {
|
|
I3DNOW,
|
|
AES,
|
|
AESKL,
|
|
AMX,
|
|
ARITH,
|
|
AVX,
|
|
AVX2,
|
|
AVX2GATHER,
|
|
AVX512,
|
|
AVX512BF16,
|
|
AVX512FP16,
|
|
AVX512VBMI,
|
|
AVX512VP2INTERSECT,
|
|
AVXIFMA,
|
|
AVXNECONVERT,
|
|
AVXVNNI,
|
|
AVXVNNIINT16,
|
|
AVXVNNIINT8,
|
|
BITBYTE,
|
|
BLEND,
|
|
BMI1,
|
|
BMI2,
|
|
BROADCAST,
|
|
CALL,
|
|
CET,
|
|
CLDEMOTE,
|
|
CMOV,
|
|
CMPCCXADD,
|
|
COMPRESS,
|
|
COND_BR,
|
|
CONFLICT,
|
|
CONVERT,
|
|
DATAXFER,
|
|
DECIMAL,
|
|
ENQCMD,
|
|
EXPAND,
|
|
FLAGOP,
|
|
FMA4,
|
|
GATHER,
|
|
GFNI,
|
|
HRESET,
|
|
I386,
|
|
IFMA,
|
|
INTERRUPT,
|
|
IO,
|
|
IOSTRINGOP,
|
|
KL,
|
|
KMASK,
|
|
KNL,
|
|
LKGS,
|
|
LOGIC,
|
|
LOGICAL,
|
|
LOGICAL_FP,
|
|
LWP,
|
|
LZCNT,
|
|
MISC,
|
|
MMX,
|
|
MOVDIR64B,
|
|
MOVDIRI,
|
|
MPX,
|
|
NOP,
|
|
PADLOCK,
|
|
PCLMULQDQ,
|
|
PCONFIG,
|
|
POP,
|
|
PREFETCH,
|
|
PTWRITE,
|
|
PUSH,
|
|
RAOINT,
|
|
RDPID,
|
|
RDRAND,
|
|
RDSEED,
|
|
RDWRFSGS,
|
|
RET,
|
|
ROTATE,
|
|
SCATTER,
|
|
SEGOP,
|
|
SEMAPHORE,
|
|
SGX,
|
|
SHA,
|
|
SHA512,
|
|
SHIFT,
|
|
SM3,
|
|
SM4,
|
|
SMAP,
|
|
SSE,
|
|
SSE2,
|
|
STRINGOP,
|
|
STTNI,
|
|
SYSCALL,
|
|
SYSRET,
|
|
SYSTEM,
|
|
TDX,
|
|
UD,
|
|
UINTR,
|
|
UNCOND_BR,
|
|
UNKNOWN,
|
|
VAES,
|
|
VFMA,
|
|
VFMAPS,
|
|
VNNI,
|
|
VNNIW,
|
|
VPCLMULQDQ,
|
|
VPOPCNT,
|
|
VTX,
|
|
WAITPKG,
|
|
WBNOINVD,
|
|
WIDENOP,
|
|
WIDE_KL,
|
|
X87_ALU,
|
|
XOP,
|
|
XSAVE,
|
|
}
|
|
|
|
#[doc(hidden)]
|
|
impl TryFrom<ffi::ND_INS_CATEGORY> for Category {
|
|
type Error = DecodeError;
|
|
|
|
fn try_from(value: ffi::ND_INS_CATEGORY) -> Result<Self, Self::Error> {
|
|
match value {
|
|
ffi::_ND_INS_TYPE::ND_CAT_INVALID => Err(DecodeError::InternalError(value as u64)),
|
|
ffi::_ND_INS_TYPE::ND_CAT_3DNOW => Ok(Category::I3DNOW),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AES => Ok(Category::AES),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AESKL => Ok(Category::AESKL),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AMX => Ok(Category::AMX),
|
|
ffi::_ND_INS_TYPE::ND_CAT_ARITH => Ok(Category::ARITH),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AVX => Ok(Category::AVX),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AVX2 => Ok(Category::AVX2),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AVX2GATHER => Ok(Category::AVX2GATHER),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AVX512 => Ok(Category::AVX512),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AVX512BF16 => Ok(Category::AVX512BF16),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AVX512FP16 => Ok(Category::AVX512FP16),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AVX512VBMI => Ok(Category::AVX512VBMI),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AVX512VP2INTERSECT => Ok(Category::AVX512VP2INTERSECT),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AVXIFMA => Ok(Category::AVXIFMA),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AVXNECONVERT => Ok(Category::AVXNECONVERT),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AVXVNNI => Ok(Category::AVXVNNI),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AVXVNNIINT16 => Ok(Category::AVXVNNIINT16),
|
|
ffi::_ND_INS_TYPE::ND_CAT_AVXVNNIINT8 => Ok(Category::AVXVNNIINT8),
|
|
ffi::_ND_INS_TYPE::ND_CAT_BITBYTE => Ok(Category::BITBYTE),
|
|
ffi::_ND_INS_TYPE::ND_CAT_BLEND => Ok(Category::BLEND),
|
|
ffi::_ND_INS_TYPE::ND_CAT_BMI1 => Ok(Category::BMI1),
|
|
ffi::_ND_INS_TYPE::ND_CAT_BMI2 => Ok(Category::BMI2),
|
|
ffi::_ND_INS_TYPE::ND_CAT_BROADCAST => Ok(Category::BROADCAST),
|
|
ffi::_ND_INS_TYPE::ND_CAT_CALL => Ok(Category::CALL),
|
|
ffi::_ND_INS_TYPE::ND_CAT_CET => Ok(Category::CET),
|
|
ffi::_ND_INS_TYPE::ND_CAT_CLDEMOTE => Ok(Category::CLDEMOTE),
|
|
ffi::_ND_INS_TYPE::ND_CAT_CMOV => Ok(Category::CMOV),
|
|
ffi::_ND_INS_TYPE::ND_CAT_CMPCCXADD => Ok(Category::CMPCCXADD),
|
|
ffi::_ND_INS_TYPE::ND_CAT_COMPRESS => Ok(Category::COMPRESS),
|
|
ffi::_ND_INS_TYPE::ND_CAT_COND_BR => Ok(Category::COND_BR),
|
|
ffi::_ND_INS_TYPE::ND_CAT_CONFLICT => Ok(Category::CONFLICT),
|
|
ffi::_ND_INS_TYPE::ND_CAT_CONVERT => Ok(Category::CONVERT),
|
|
ffi::_ND_INS_TYPE::ND_CAT_DATAXFER => Ok(Category::DATAXFER),
|
|
ffi::_ND_INS_TYPE::ND_CAT_DECIMAL => Ok(Category::DECIMAL),
|
|
ffi::_ND_INS_TYPE::ND_CAT_ENQCMD => Ok(Category::ENQCMD),
|
|
ffi::_ND_INS_TYPE::ND_CAT_EXPAND => Ok(Category::EXPAND),
|
|
ffi::_ND_INS_TYPE::ND_CAT_FLAGOP => Ok(Category::FLAGOP),
|
|
ffi::_ND_INS_TYPE::ND_CAT_FMA4 => Ok(Category::FMA4),
|
|
ffi::_ND_INS_TYPE::ND_CAT_GATHER => Ok(Category::GATHER),
|
|
ffi::_ND_INS_TYPE::ND_CAT_GFNI => Ok(Category::GFNI),
|
|
ffi::_ND_INS_TYPE::ND_CAT_HRESET => Ok(Category::HRESET),
|
|
ffi::_ND_INS_TYPE::ND_CAT_I386 => Ok(Category::I386),
|
|
ffi::_ND_INS_TYPE::ND_CAT_IFMA => Ok(Category::IFMA),
|
|
ffi::_ND_INS_TYPE::ND_CAT_INTERRUPT => Ok(Category::INTERRUPT),
|
|
ffi::_ND_INS_TYPE::ND_CAT_IO => Ok(Category::IO),
|
|
ffi::_ND_INS_TYPE::ND_CAT_IOSTRINGOP => Ok(Category::IOSTRINGOP),
|
|
ffi::_ND_INS_TYPE::ND_CAT_KL => Ok(Category::KL),
|
|
ffi::_ND_INS_TYPE::ND_CAT_KMASK => Ok(Category::KMASK),
|
|
ffi::_ND_INS_TYPE::ND_CAT_KNL => Ok(Category::KNL),
|
|
ffi::_ND_INS_TYPE::ND_CAT_LKGS => Ok(Category::LKGS),
|
|
ffi::_ND_INS_TYPE::ND_CAT_LOGIC => Ok(Category::LOGIC),
|
|
ffi::_ND_INS_TYPE::ND_CAT_LOGICAL => Ok(Category::LOGICAL),
|
|
ffi::_ND_INS_TYPE::ND_CAT_LOGICAL_FP => Ok(Category::LOGICAL_FP),
|
|
ffi::_ND_INS_TYPE::ND_CAT_LWP => Ok(Category::LWP),
|
|
ffi::_ND_INS_TYPE::ND_CAT_LZCNT => Ok(Category::LZCNT),
|
|
ffi::_ND_INS_TYPE::ND_CAT_MISC => Ok(Category::MISC),
|
|
ffi::_ND_INS_TYPE::ND_CAT_MMX => Ok(Category::MMX),
|
|
ffi::_ND_INS_TYPE::ND_CAT_MOVDIR64B => Ok(Category::MOVDIR64B),
|
|
ffi::_ND_INS_TYPE::ND_CAT_MOVDIRI => Ok(Category::MOVDIRI),
|
|
ffi::_ND_INS_TYPE::ND_CAT_MPX => Ok(Category::MPX),
|
|
ffi::_ND_INS_TYPE::ND_CAT_NOP => Ok(Category::NOP),
|
|
ffi::_ND_INS_TYPE::ND_CAT_PADLOCK => Ok(Category::PADLOCK),
|
|
ffi::_ND_INS_TYPE::ND_CAT_PCLMULQDQ => Ok(Category::PCLMULQDQ),
|
|
ffi::_ND_INS_TYPE::ND_CAT_PCONFIG => Ok(Category::PCONFIG),
|
|
ffi::_ND_INS_TYPE::ND_CAT_POP => Ok(Category::POP),
|
|
ffi::_ND_INS_TYPE::ND_CAT_PREFETCH => Ok(Category::PREFETCH),
|
|
ffi::_ND_INS_TYPE::ND_CAT_PTWRITE => Ok(Category::PTWRITE),
|
|
ffi::_ND_INS_TYPE::ND_CAT_PUSH => Ok(Category::PUSH),
|
|
ffi::_ND_INS_TYPE::ND_CAT_RAOINT => Ok(Category::RAOINT),
|
|
ffi::_ND_INS_TYPE::ND_CAT_RDPID => Ok(Category::RDPID),
|
|
ffi::_ND_INS_TYPE::ND_CAT_RDRAND => Ok(Category::RDRAND),
|
|
ffi::_ND_INS_TYPE::ND_CAT_RDSEED => Ok(Category::RDSEED),
|
|
ffi::_ND_INS_TYPE::ND_CAT_RDWRFSGS => Ok(Category::RDWRFSGS),
|
|
ffi::_ND_INS_TYPE::ND_CAT_RET => Ok(Category::RET),
|
|
ffi::_ND_INS_TYPE::ND_CAT_ROTATE => Ok(Category::ROTATE),
|
|
ffi::_ND_INS_TYPE::ND_CAT_SCATTER => Ok(Category::SCATTER),
|
|
ffi::_ND_INS_TYPE::ND_CAT_SEGOP => Ok(Category::SEGOP),
|
|
ffi::_ND_INS_TYPE::ND_CAT_SEMAPHORE => Ok(Category::SEMAPHORE),
|
|
ffi::_ND_INS_TYPE::ND_CAT_SGX => Ok(Category::SGX),
|
|
ffi::_ND_INS_TYPE::ND_CAT_SHA => Ok(Category::SHA),
|
|
ffi::_ND_INS_TYPE::ND_CAT_SHA512 => Ok(Category::SHA512),
|
|
ffi::_ND_INS_TYPE::ND_CAT_SHIFT => Ok(Category::SHIFT),
|
|
ffi::_ND_INS_TYPE::ND_CAT_SM3 => Ok(Category::SM3),
|
|
ffi::_ND_INS_TYPE::ND_CAT_SM4 => Ok(Category::SM4),
|
|
ffi::_ND_INS_TYPE::ND_CAT_SMAP => Ok(Category::SMAP),
|
|
ffi::_ND_INS_TYPE::ND_CAT_SSE => Ok(Category::SSE),
|
|
ffi::_ND_INS_TYPE::ND_CAT_SSE2 => Ok(Category::SSE2),
|
|
ffi::_ND_INS_TYPE::ND_CAT_STRINGOP => Ok(Category::STRINGOP),
|
|
ffi::_ND_INS_TYPE::ND_CAT_STTNI => Ok(Category::STTNI),
|
|
ffi::_ND_INS_TYPE::ND_CAT_SYSCALL => Ok(Category::SYSCALL),
|
|
ffi::_ND_INS_TYPE::ND_CAT_SYSRET => Ok(Category::SYSRET),
|
|
ffi::_ND_INS_TYPE::ND_CAT_SYSTEM => Ok(Category::SYSTEM),
|
|
ffi::_ND_INS_TYPE::ND_CAT_TDX => Ok(Category::TDX),
|
|
ffi::_ND_INS_TYPE::ND_CAT_UD => Ok(Category::UD),
|
|
ffi::_ND_INS_TYPE::ND_CAT_UINTR => Ok(Category::UINTR),
|
|
ffi::_ND_INS_TYPE::ND_CAT_UNCOND_BR => Ok(Category::UNCOND_BR),
|
|
ffi::_ND_INS_TYPE::ND_CAT_UNKNOWN => Ok(Category::UNKNOWN),
|
|
ffi::_ND_INS_TYPE::ND_CAT_VAES => Ok(Category::VAES),
|
|
ffi::_ND_INS_TYPE::ND_CAT_VFMA => Ok(Category::VFMA),
|
|
ffi::_ND_INS_TYPE::ND_CAT_VFMAPS => Ok(Category::VFMAPS),
|
|
ffi::_ND_INS_TYPE::ND_CAT_VNNI => Ok(Category::VNNI),
|
|
ffi::_ND_INS_TYPE::ND_CAT_VNNIW => Ok(Category::VNNIW),
|
|
ffi::_ND_INS_TYPE::ND_CAT_VPCLMULQDQ => Ok(Category::VPCLMULQDQ),
|
|
ffi::_ND_INS_TYPE::ND_CAT_VPOPCNT => Ok(Category::VPOPCNT),
|
|
ffi::_ND_INS_TYPE::ND_CAT_VTX => Ok(Category::VTX),
|
|
ffi::_ND_INS_TYPE::ND_CAT_WAITPKG => Ok(Category::WAITPKG),
|
|
ffi::_ND_INS_TYPE::ND_CAT_WBNOINVD => Ok(Category::WBNOINVD),
|
|
ffi::_ND_INS_TYPE::ND_CAT_WIDENOP => Ok(Category::WIDENOP),
|
|
ffi::_ND_INS_TYPE::ND_CAT_WIDE_KL => Ok(Category::WIDE_KL),
|
|
ffi::_ND_INS_TYPE::ND_CAT_X87_ALU => Ok(Category::X87_ALU),
|
|
ffi::_ND_INS_TYPE::ND_CAT_XOP => Ok(Category::XOP),
|
|
ffi::_ND_INS_TYPE::ND_CAT_XSAVE => Ok(Category::XSAVE),
|
|
}
|
|
}
|
|
}
|