bddisasm 0.4.2

Bindings to bddisasm instruction decoder library
Documentation
/*
 * 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,
    APX,
    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,
    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,
    USER_MSR,
    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;

    #[allow(clippy::too_many_lines)]
    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_APX => Ok(Category::APX),
            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_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_USER_MSR => Ok(Category::USER_MSR),
            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),
        }
    }
}