From 11ce930421ba8b534024f6695dff8fdfd7e47ff0 Mon Sep 17 00:00:00 2001 From: iximeow Date: Sat, 3 Jul 2021 14:41:09 -0700 Subject: support AMD `sev_snp` --- README.md | 2 +- src/long_mode/display.rs | 8 ++++++++ src/long_mode/mod.rs | 37 +++++++++++++++++++++++++++++++++++-- src/protected_mode/display.rs | 8 ++++++++ src/protected_mode/mod.rs | 37 +++++++++++++++++++++++++++++++++++-- test/long_mode/mod.rs | 8 ++++++++ test/protected_mode/mod.rs | 8 ++++++++ 7 files changed, 103 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e19b8a7..33e88f4 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ the decoders provided by `yaxpeax-x86` are designed to be usable in a `no_std` s yaxpeax-x86 decodes long-mode (`amd64`/`x86_64`), protected-mode (`x86`/`x86_32`), and real-mode (`x86_16`) instructions. the most part, ISA extensions decode equivalently across modes; this is the full list of extensions that are supported: -`3dnow`\*, `sse`\*, `sse2`\*, `sse3`, `ssse3`, `sse4.1`, `sse4.2`, `sse4a`, `avx`, `avx2`, `avx512`\*\*, `syscall`, `cmpxchg16b`, `fma3`, `aesni`, `popcnt`, `rdrand`, `xsave`, `sgx`, `monitor`, `movbe`, `sgx`, `bmi1`, `bmi2`, `invpcid`, `mpx`, `adx`, `clflushopt`, `pcommit`, `sha`, `gfni`, `pclmulqdq`, `rdtscp`, `abm`, `xop`, `skinit`, `tbm`, `svm`, `f16c`, `fma4`, `tsx`, `enqcmd`\*\*\*, `uintr`\*\*\*, `keylocker`\*\*\*, `store_direct`\*\*\*, `cet`\*\*\* +`3dnow`\*, `sse`\*, `sse2`\*, `sse3`, `ssse3`, `sse4.1`, `sse4.2`, `sse4a`, `avx`, `avx2`, `avx512`\*\*, `syscall`, `cmpxchg16b`, `fma3`, `aesni`, `popcnt`, `rdrand`, `xsave`, `sgx`, `monitor`, `movbe`, `sgx`, `bmi1`, `bmi2`, `invpcid`, `mpx`, `adx`, `clflushopt`, `pcommit`, `sha`, `gfni`, `pclmulqdq`, `rdtscp`, `abm`, `xop`, `skinit`, `tbm`, `svm`, `f16c`, `fma4`, `tsx`, `enqcmd`\*\*\*, `uintr`\*\*\*, `keylocker`\*\*\*, `store_direct`\*\*\*, `cet`\*\*\*, `sev/snp`\*\*\* \*: `3dnow`, `sse`, and `sse2` are non-optional in `x86_64`, so it is not permitted to construct a decoder that rejects them. `x86_32` and `x86_16` could have features to reject these instructions for true `8086` and `i386` compatibility, but currently do not. diff --git a/src/long_mode/display.rs b/src/long_mode/display.rs index b9e4a92..b1fb7f8 100644 --- a/src/long_mode/display.rs +++ b/src/long_mode/display.rs @@ -1800,6 +1800,10 @@ const MNEMONICS: &[&'static str] = &[ "vpandnq", "vpandd", "vpandq", + "psmash", + "pvalidate", + "rmpadjust", + "rmpupdate", ]; impl Opcode { @@ -3091,6 +3095,10 @@ impl Colorize for Opcode { Opcode::INVLPGA | Opcode::INVLPGB | Opcode::TLBSYNC | + Opcode::PSMASH | + Opcode::PVALIDATE | + Opcode::RMPADJUST | + Opcode::RMPUPDATE | Opcode::CPUID | Opcode::WBINVD | Opcode::INVD | diff --git a/src/long_mode/mod.rs b/src/long_mode/mod.rs index 8ed68fb..9111faa 100644 --- a/src/long_mode/mod.rs +++ b/src/long_mode/mod.rs @@ -2515,6 +2515,11 @@ pub enum Opcode { VPANDNQ, VPANDD, VPANDQ, + + PSMASH, + PVALIDATE, + RMPADJUST, + RMPUPDATE, } impl PartialEq for Instruction { @@ -9502,7 +9507,21 @@ fn unlikely_operands::Address, ::Address, Colorize for Opcode { Opcode::INVLPGA | Opcode::INVLPGB | Opcode::TLBSYNC | + Opcode::PSMASH | + Opcode::PVALIDATE | + Opcode::RMPADJUST | + Opcode::RMPUPDATE | Opcode::CPUID | Opcode::WBINVD | Opcode::INVD | diff --git a/src/protected_mode/mod.rs b/src/protected_mode/mod.rs index 936dc08..0497db6 100644 --- a/src/protected_mode/mod.rs +++ b/src/protected_mode/mod.rs @@ -2441,6 +2441,11 @@ pub enum Opcode { VPANDNQ, VPANDD, VPANDQ, + + PSMASH, + PVALIDATE, + RMPADJUST, + RMPUPDATE, } impl PartialEq for Instruction { @@ -9322,7 +9327,21 @@ fn unlikely_operands::Address, ::Address,