diff --git a/native_exec/simple_x64.py b/native_exec/simple_x64.py index b7ca92e..305eca7 100644 --- a/native_exec/simple_x64.py +++ b/native_exec/simple_x64.py @@ -616,6 +616,9 @@ class In(Instruction): (RawBits.from_int(16, 0x66ed), FixedRegister('AX'), FixedRegister('DX')), # Fuck-it hardcoded prefix for now (RawBits.from_int(8, 0xed), FixedRegister('EAX'), FixedRegister('DX'))] +class Cpuid(Instruction): + encoding = [(RawBits.from_int(16, 0x0fa2),)] + class JmpImm(object): accept_as_Ximmediat = (None) def __init__(self, sub): diff --git a/native_exec/simple_x86.py b/native_exec/simple_x86.py index 3cb9ba6..9321900 100644 --- a/native_exec/simple_x86.py +++ b/native_exec/simple_x86.py @@ -511,6 +511,9 @@ class Xchg(Instruction): class Call(Instruction): encoding = [(RawBits.from_int(8, 0xff), Slash(2))] +class Cpuid(Instruction): + encoding = [(RawBits.from_int(16, 0x0fa2),)] + class Ret(Instruction): encoding = [(RawBits.from_int(8, 0xc3),)] diff --git a/native_exec/test_simple_x64.py b/native_exec/test_simple_x64.py index 209b57c..7a5b517 100644 --- a/native_exec/test_simple_x64.py +++ b/native_exec/test_simple_x64.py @@ -96,6 +96,8 @@ TestInstr(Push)(0x42) TestInstr(Push)(-1) TestInstr(Call)('RAX') TestInstr(Call)(mem('[RAX + RCX * 8]')) +TestInstr(Cpuid)() + TestInstr(Xchg)('RAX', 'RSP') assert Xchg('RAX', 'RCX').get_code() == Xchg('RCX', 'RAX').get_code() \ No newline at end of file diff --git a/native_exec/test_simple_x86.py b/native_exec/test_simple_x86.py index 8d61fa1..829d084 100644 --- a/native_exec/test_simple_x86.py +++ b/native_exec/test_simple_x86.py @@ -82,6 +82,7 @@ TestInstr(Lea)('ECX', mem('[EDI + -0xff]')) TestInstr(Call)('EAX') TestInstr(Call)(mem('[EAX + ECX * 8]')) +TestInstr(Cpuid)() TestInstr(Xchg)('EAX', 'ESP') assert Xchg('EAX', 'ECX').get_code() == Xchg('ECX', 'EAX').get_code()