diff options
author | iximeow <me@iximeow.net> | 2019-12-15 21:19:44 -0800 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2020-01-12 16:10:14 -0800 |
commit | 8d8cb8d594217a630dea605348211539afe3f940 (patch) | |
tree | a356783767a009d9fe554dd1f88254937ed6cf32 /src/lib.rs | |
parent | 552ad43802a0152f4a0c3d503bb041cb3c6160d9 (diff) |
test fence instructions against different quirks modes
add enclv instruction
add sse3, ssse3, sse4.1, and sse4.2 feature flags, plus a host of
missing opcodes
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 103 |
1 files changed, 92 insertions, 11 deletions
@@ -659,6 +659,7 @@ pub enum Opcode { CLAC, STAC, ENCLS, + ENCLV, XGETBV, XSETBV, VMFUNC, @@ -1109,6 +1110,82 @@ pub enum Opcode { VXORPD, VXORPS, VZEROUPPER, + + PCLMULQDQ, + AESKEYGENASSIST, + AESIMC, + AESENC, + AESENCLAST, + AESDEC, + AESDECLAST, + PCMPGTQ, + PCMPISTRM, + PCMPISTRI, + PCMPESTRI, + PACKUSDW, + PCMPESTRM, + PCMPEQQ, + PTEST, + PHMINPOSUW, + MPSADBW, + PMOVZXDQ, + PMOVSXDQ, + PMOVZXBD, + PMOVSXBD, + PMOVZXWQ, + PMOVSXWQ, + PMOVZXBQ, + PMOVSXBQ, + PMOVSXWD, + PMOVZXWD, + PEXTRQ, + PEXTRB, + PMOVSXBW, + PMOVZXBW, + PINSRQ, + PINSRD, + PINSRB, + EXTRACTPS, + INSERTPS, + ROUNDSS, + ROUNDSD, + ROUNDPS, + ROUNDPD, + PMAXSB, + PMAXUW, + PMAXUD, + PMINSD, + PMINSB, + PMINUD, + PMINUW, + BLENDW, + BLENDDVB, + BLENDVPS, + BLENDVPD, + BLENDPS, + BLENDPD, + PMULDQ, + MOVNTDQA, + PMULLD, + PALIGNR, + PSIGNW, + PSIGND, + PSIGNB, + PSHUFB, + PMULHRSU, + PMADDUBSW, + PABSD, + PABSW, + PABSB, + PHSUBSW, + PHSUBW, + PHSUBD, + PHADDD, + PHADDSW, + PHADDW, + HSUBPD, + HADDPD, + ADDSUBPD, } #[derive(Debug)] @@ -1921,6 +1998,7 @@ impl InstDecoder { return Err(()); } }*/ + Opcode::ENCLV | Opcode::ENCLS | Opcode::ENCLU => { if !self.sgx() { @@ -5194,6 +5272,9 @@ fn unlikely_operands<T: Iterator<Item=u8>>(decoder: &InstDecoder, mut bytes_iter if mod_bits == 0b11 { instruction.operand_count = 0; match m { + 0b000 => { + instruction.opcode = Opcode::ENCLV; + }, 0b001 => { instruction.opcode = Opcode::VMCALL; }, @@ -5324,10 +5405,10 @@ fn unlikely_operands<T: Iterator<Item=u8>>(decoder: &InstDecoder, mut bytes_iter let mod_bits = modrm >> 6; let m = modrm & 7; if mod_bits == 0b11 { - if m == 1 { + if m == 0 { instruction.opcode = Opcode::SWAPGS; instruction.operand_count = 0; - } else if m == 2 { + } else if m == 1 { instruction.opcode = Opcode::RDTSCP; instruction.operand_count = 0; } else { @@ -5359,9 +5440,9 @@ fn unlikely_operands<T: Iterator<Item=u8>>(decoder: &InstDecoder, mut bytes_iter }, 5 => { instruction.opcode = Opcode::LFENCE; - // TODO: verify on real hardware - // AMD's manual suggests their chips reject *FENCE with non-zero r/m - if decoder.amd_quirks() && !decoder.intel_quirks() { + // Intel's manual accepts m != 0, AMD supports m != 0 though the manual + // doesn't say (tested on threadripper) + if !decoder.amd_quirks() && !decoder.intel_quirks() { if m != 0 { instruction.opcode = Opcode::Invalid; return Err(()); @@ -5370,9 +5451,9 @@ fn unlikely_operands<T: Iterator<Item=u8>>(decoder: &InstDecoder, mut bytes_iter }, 6 => { instruction.opcode = Opcode::MFENCE; - // TODO: verify on real hardware - // AMD's manual suggests their chips reject *FENCE with non-zero r/m - if decoder.amd_quirks() && !decoder.intel_quirks() { + // Intel's manual accepts m != 0, AMD supports m != 0 though the manual + // doesn't say (tested on threadripper) + if !decoder.amd_quirks() && !decoder.intel_quirks() { if m != 0 { instruction.opcode = Opcode::Invalid; return Err(()); @@ -5381,9 +5462,9 @@ fn unlikely_operands<T: Iterator<Item=u8>>(decoder: &InstDecoder, mut bytes_iter }, 7 => { instruction.opcode = Opcode::SFENCE; - // TODO: verify on real hardware - // AMD's manual suggests their chips reject *FENCE with non-zero r/m - if decoder.amd_quirks() && !decoder.intel_quirks() { + // Intel's manual accepts m != 0, AMD supports m != 0 though the manual + // doesn't say (tested on threadripper) + if !decoder.amd_quirks() && !decoder.intel_quirks() { if m != 0 { instruction.opcode = Opcode::Invalid; return Err(()); |