/* * 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 for Category { type Error = DecodeError; fn try_from(value: ffi::ND_INS_CATEGORY) -> Result { 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), } } }