Add RDRAND/RDSEED instructions support (+ disasm)
Of course no true random numbers will be generated - use standard "C" rand() function as stub. In future it will be possible to improve (using another random generator) or even use real rdrand/rdseed intrinsics
This commit is contained in:
parent
1f7aa18003
commit
2638c1136a
@ -113,7 +113,8 @@ OBJS = \
|
||||
bit32.o \
|
||||
bmi32.o \
|
||||
string.o \
|
||||
paging.o
|
||||
paging.o \
|
||||
rdrand.o
|
||||
|
||||
# Objects which are only used for x86-64 code
|
||||
OBJS64 = \
|
||||
@ -749,3 +750,9 @@ xsave.o: xsave.@CPP_SUFFIX@ ../bochs.h ../config.h ../osdep.h ../bx_debug/debug.
|
||||
../instrument/stubs/instrument.h cpu.h cpuid.h crregs.h descriptor.h \
|
||||
instr.h ia_opcodes.h lazy_flags.h icache.h apic.h i387.h fpu/softfloat.h \
|
||||
fpu/tag_w.h fpu/status_w.h fpu/control_w.h xmm.h stack.h
|
||||
rdrand.o: rdrand.@CPP_SUFFIX@ ../bochs.h ../config.h ../osdep.h ../bx_debug/debug.h \
|
||||
../config.h ../osdep.h ../gui/siminterface.h ../cpudb.h \
|
||||
../gui/paramtree.h ../memory/memory.h ../pc_system.h ../gui/gui.h \
|
||||
../instrument/stubs/instrument.h cpu.h cpuid.h crregs.h descriptor.h \
|
||||
instr.h ia_opcodes.h lazy_flags.h icache.h apic.h i387.h fpu/softfloat.h \
|
||||
fpu/tag_w.h fpu/status_w.h fpu/control_w.h xmm.h stack.h
|
||||
|
@ -3218,6 +3218,19 @@ public: // for now...
|
||||
BX_SMF BX_INSF_TYPE STAC(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
||||
// SMAP
|
||||
|
||||
// RDRAND/RDSEED
|
||||
BX_SMF BX_INSF_TYPE RDRAND_Ew(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
||||
BX_SMF BX_INSF_TYPE RDRAND_Ed(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
||||
#if BX_SUPPORT_X86_64
|
||||
BX_SMF BX_INSF_TYPE RDRAND_Eq(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
||||
#endif
|
||||
|
||||
BX_SMF BX_INSF_TYPE RDSEED_Ew(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
||||
BX_SMF BX_INSF_TYPE RDSEED_Ed(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
||||
#if BX_SUPPORT_X86_64
|
||||
BX_SMF BX_INSF_TYPE RDSEED_Eq(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
||||
#endif
|
||||
|
||||
#if BX_SUPPORT_X86_64
|
||||
// 64 bit extensions
|
||||
BX_SMF BX_INSF_TYPE ADD_GqEqR(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
||||
@ -4900,7 +4913,7 @@ enum {
|
||||
#define BxGroup6 BxGroupN
|
||||
#define BxGroup7 BxFPEscape
|
||||
#define BxGroup8 BxGroupN
|
||||
#define BxGroup9 BxGroupN
|
||||
#define BxGroup9 BxSplitGroupN
|
||||
|
||||
#define BxGroup11 BxGroupN
|
||||
#define BxGroup12 BxGroupN
|
||||
|
@ -44,7 +44,7 @@ corei7_ivy_bridge_3770k_t::corei7_ivy_bridge_3770k_t(BX_CPU_C *cpu): bx_cpuid_t(
|
||||
if (! BX_SUPPORT_MONITOR_MWAIT)
|
||||
BX_INFO(("WARNING: MONITOR/MWAIT support is not compiled in !"));
|
||||
|
||||
BX_INFO(("WARNING: RDRAND is not implemented yet !"));
|
||||
BX_INFO(("WARNING: RDRAND would not produce true random numbers !"));
|
||||
}
|
||||
|
||||
void corei7_ivy_bridge_3770k_t::get_cpuid_leaf(Bit32u function, Bit32u subfunction, cpuid_function_t *leaf) const
|
||||
@ -151,6 +151,7 @@ Bit64u corei7_ivy_bridge_3770k_t::get_isa_extensions_bitmask(void) const
|
||||
BX_ISA_FSGSBASE |
|
||||
BX_ISA_AVX |
|
||||
BX_ISA_AVX_F16C |
|
||||
BX_ISA_RDRAND |
|
||||
BX_ISA_CMPXCHG16B |
|
||||
BX_ISA_LM_LAHF_SAHF;
|
||||
}
|
||||
@ -327,8 +328,8 @@ void corei7_ivy_bridge_3770k_t::get_std_cpuid_leaf_1(cpuid_function_t *leaf) con
|
||||
BX_CPUID_EXT_AES |
|
||||
BX_CPUID_EXT_XSAVE |
|
||||
BX_CPUID_EXT_AVX |
|
||||
BX_CPUID_EXT_AVX_F16C;
|
||||
// BX_CPUID_EXT_RDRAND not implemented yet
|
||||
BX_CPUID_EXT_AVX_F16C |
|
||||
BX_CPUID_EXT_RDRAND;
|
||||
if (cpu->cr4.get_OSXSAVE())
|
||||
leaf->ecx |= BX_CPUID_EXT_OSXSAVE;
|
||||
|
||||
|
@ -663,7 +663,7 @@ static const BxOpcodeInfo_t BxOpcodeInfo32[512*2] = {
|
||||
/* 0F C4 /w */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PINSRW_PqEwIb, BxOpcodeGroupSSE_0fc4 },
|
||||
/* 0F C5 /w */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PEXTRW_GdPqIb, BxOpcodeGroupSSE_0fc5R },
|
||||
/* 0F C6 /w */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_SHUFPS_VpsWpsIb, BxOpcodeGroupSSE_0fc6 },
|
||||
/* 0F C7 /w */ { BxGroup9, BX_IA_ERROR, BxOpcodeInfoG9M },
|
||||
/* 0F C7 /w */ { BxGroup9, BX_IA_ERROR, BxOpcodeInfoG9w },
|
||||
/* 0F C8 /w */ { 0, BX_IA_BSWAP_RX },
|
||||
/* 0F C9 /w */ { 0, BX_IA_BSWAP_RX },
|
||||
/* 0F CA /w */ { 0, BX_IA_BSWAP_RX },
|
||||
@ -1208,7 +1208,7 @@ static const BxOpcodeInfo_t BxOpcodeInfo32[512*2] = {
|
||||
/* 0F C4 /d */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PINSRW_PqEwIb, BxOpcodeGroupSSE_0fc4 },
|
||||
/* 0F C5 /d */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PEXTRW_GdPqIb, BxOpcodeGroupSSE_0fc5R },
|
||||
/* 0F C6 /d */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_SHUFPS_VpsWpsIb, BxOpcodeGroupSSE_0fc6 },
|
||||
/* 0F C7 /d */ { BxGroup9, BX_IA_ERROR, BxOpcodeInfoG9M },
|
||||
/* 0F C7 /d */ { BxGroup9, BX_IA_ERROR, BxOpcodeInfoG9d },
|
||||
/* 0F C8 /d */ { 0, BX_IA_BSWAP_ERX },
|
||||
/* 0F C9 /d */ { 0, BX_IA_BSWAP_ERX },
|
||||
/* 0F CA /d */ { 0, BX_IA_BSWAP_ERX },
|
||||
|
@ -641,7 +641,40 @@ static const BxOpcodeInfo_t BxOpcodeInfo64G8EqIb[8] = {
|
||||
/* Group 9 */
|
||||
/* ******* */
|
||||
|
||||
static const BxOpcodeInfo_t BxOpcodeInfoG9M[8] = {
|
||||
static const BxOpcodeInfo_t BxOpcodeInfoG9w[8*2] = {
|
||||
/* /r form */
|
||||
/* 0 */ { 0, BX_IA_ERROR },
|
||||
/* 1 */ { 0, BX_IA_ERROR },
|
||||
/* 2 */ { 0, BX_IA_ERROR },
|
||||
/* 3 */ { 0, BX_IA_ERROR },
|
||||
/* 4 */ { 0, BX_IA_ERROR },
|
||||
/* 5 */ { 0, BX_IA_ERROR },
|
||||
/* 6 */ { BxPrefixSSE, BX_IA_RDRAND_Ew, BxOpcodeGroupSSE_ERR },
|
||||
/* 7 */ { BxPrefixSSE, BX_IA_RDSEED_Ew, BxOpcodeGroupSSE_ERR },
|
||||
|
||||
/* /m form */
|
||||
/* 0 */ { 0, BX_IA_ERROR },
|
||||
/* 1 */ { BxLockable, BX_IA_CMPXCHG8B },
|
||||
/* 2 */ { 0, BX_IA_ERROR },
|
||||
/* 3 */ { 0, BX_IA_ERROR },
|
||||
/* 4 */ { 0, BX_IA_ERROR },
|
||||
/* 5 */ { 0, BX_IA_ERROR },
|
||||
/* 6 */ { BxPrefixSSE, BX_IA_VMPTRLD_Mq, BxOpcodeGroupSSE_G9VMX6 },
|
||||
/* 7 */ { BxPrefixSSE, BX_IA_VMPTRST_Mq, BxOpcodeGroupSSE_ERR }
|
||||
};
|
||||
|
||||
static const BxOpcodeInfo_t BxOpcodeInfoG9d[8*2] = {
|
||||
/* /r form */
|
||||
/* 0 */ { 0, BX_IA_ERROR },
|
||||
/* 1 */ { 0, BX_IA_ERROR },
|
||||
/* 2 */ { 0, BX_IA_ERROR },
|
||||
/* 3 */ { 0, BX_IA_ERROR },
|
||||
/* 4 */ { 0, BX_IA_ERROR },
|
||||
/* 5 */ { 0, BX_IA_ERROR },
|
||||
/* 6 */ { BxPrefixSSE, BX_IA_RDRAND_Ed, BxOpcodeGroupSSE_ERR },
|
||||
/* 7 */ { BxPrefixSSE, BX_IA_RDSEED_Ed, BxOpcodeGroupSSE_ERR },
|
||||
|
||||
/* /m form */
|
||||
/* 0 */ { 0, BX_IA_ERROR },
|
||||
/* 1 */ { BxLockable, BX_IA_CMPXCHG8B },
|
||||
/* 2 */ { 0, BX_IA_ERROR },
|
||||
@ -653,7 +686,18 @@ static const BxOpcodeInfo_t BxOpcodeInfoG9M[8] = {
|
||||
};
|
||||
|
||||
#if BX_SUPPORT_X86_64
|
||||
static const BxOpcodeInfo_t BxOpcodeInfo64G9qM[8] = {
|
||||
static const BxOpcodeInfo_t BxOpcodeInfo64G9q[8*2] = {
|
||||
/* /r form */
|
||||
/* 0 */ { 0, BX_IA_ERROR },
|
||||
/* 1 */ { 0, BX_IA_ERROR },
|
||||
/* 2 */ { 0, BX_IA_ERROR },
|
||||
/* 3 */ { 0, BX_IA_ERROR },
|
||||
/* 4 */ { 0, BX_IA_ERROR },
|
||||
/* 5 */ { 0, BX_IA_ERROR },
|
||||
/* 6 */ { BxPrefixSSE, BX_IA_RDRAND_Eq, BxOpcodeGroupSSE_ERR },
|
||||
/* 7 */ { BxPrefixSSE, BX_IA_RDSEED_Eq, BxOpcodeGroupSSE_ERR },
|
||||
|
||||
/* /m form */
|
||||
/* 0 */ { 0, BX_IA_ERROR },
|
||||
/* 1 */ { BxLockable, BX_IA_CMPXCHG16B },
|
||||
/* 2 */ { 0, BX_IA_ERROR },
|
||||
|
@ -595,7 +595,7 @@ static const BxOpcodeInfo_t BxOpcodeInfo64[512*3] = {
|
||||
/* 0F C4 /w */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PINSRW_PqEwIb, BxOpcodeGroupSSE_0fc4 },
|
||||
/* 0F C5 /w */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PEXTRW_GdPqIb, BxOpcodeGroupSSE_0fc5R },
|
||||
/* 0F C6 /w */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_SHUFPS_VpsWpsIb, BxOpcodeGroupSSE_0fc6 },
|
||||
/* 0F C7 /w */ { BxGroup9, BX_IA_ERROR, BxOpcodeInfoG9M },
|
||||
/* 0F C7 /w */ { BxGroup9, BX_IA_ERROR, BxOpcodeInfoG9w },
|
||||
/* 0F C8 /w */ { 0, BX_IA_BSWAP_RX },
|
||||
/* 0F C9 /w */ { 0, BX_IA_BSWAP_RX },
|
||||
/* 0F CA /w */ { 0, BX_IA_BSWAP_RX },
|
||||
@ -1110,7 +1110,7 @@ static const BxOpcodeInfo_t BxOpcodeInfo64[512*3] = {
|
||||
/* 0F C4 /d */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PINSRW_PqEwIb, BxOpcodeGroupSSE_0fc4 },
|
||||
/* 0F C5 /d */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PEXTRW_GdPqIb, BxOpcodeGroupSSE_0fc5R },
|
||||
/* 0F C6 /d */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_SHUFPS_VpsWpsIb, BxOpcodeGroupSSE_0fc6 },
|
||||
/* 0F C7 /d */ { BxGroup9, BX_IA_ERROR, BxOpcodeInfoG9M },
|
||||
/* 0F C7 /d */ { BxGroup9, BX_IA_ERROR, BxOpcodeInfoG9d },
|
||||
/* 0F C8 /d */ { 0, BX_IA_BSWAP_ERX },
|
||||
/* 0F C9 /d */ { 0, BX_IA_BSWAP_ERX },
|
||||
/* 0F CA /d */ { 0, BX_IA_BSWAP_ERX },
|
||||
@ -1625,7 +1625,7 @@ static const BxOpcodeInfo_t BxOpcodeInfo64[512*3] = {
|
||||
/* 0F C4 /q */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PINSRW_PqEwIb, BxOpcodeGroupSSE_0fc4 },
|
||||
/* 0F C5 /q */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_PEXTRW_GdPqIb, BxOpcodeGroupSSE_0fc5R },
|
||||
/* 0F C6 /q */ { BxPrefixSSE | BxImmediate_Ib, BX_IA_SHUFPS_VpsWpsIb, BxOpcodeGroupSSE_0fc6 },
|
||||
/* 0F C7 /q */ { BxGroup9, BX_IA_ERROR, BxOpcodeInfo64G9qM },
|
||||
/* 0F C7 /q */ { BxGroup9, BX_IA_ERROR, BxOpcodeInfo64G9q },
|
||||
/* 0F C8 /q */ { 0, BX_IA_BSWAP_RRX },
|
||||
/* 0F C9 /q */ { 0, BX_IA_BSWAP_RRX },
|
||||
/* 0F CA /q */ { 0, BX_IA_BSWAP_RRX },
|
||||
|
@ -2222,3 +2222,17 @@ bx_define_opcode(BX_IA_ADOX_GqEq, &BX_CPU_C::LOAD_Eq, &BX_CPU_C::ADOX_GqEqR, BX_
|
||||
// SMAP
|
||||
bx_define_opcode(BX_IA_STAC, NULL, &BX_CPU_C::STAC, BX_ISA_SMAP, BX_SRC_NONE, BX_SRC_NONE, BX_SRC_NONE, BX_SRC_NONE, 0)
|
||||
bx_define_opcode(BX_IA_CLAC, NULL, &BX_CPU_C::STAC, BX_ISA_SMAP, BX_SRC_NONE, BX_SRC_NONE, BX_SRC_NONE, BX_SRC_NONE, 0)
|
||||
|
||||
// RDRAND
|
||||
bx_define_opcode(BX_IA_RDRAND_Ew, NULL, &BX_CPU_C::RDRAND_Ew, BX_ISA_RDRAND, BX_SRC_RM, BX_SRC_NONE, BX_SRC_NONE, BX_SRC_NONE, 0)
|
||||
bx_define_opcode(BX_IA_RDRAND_Ed, NULL, &BX_CPU_C::RDRAND_Ew, BX_ISA_RDRAND, BX_SRC_RM, BX_SRC_NONE, BX_SRC_NONE, BX_SRC_NONE, 0)
|
||||
#if BX_SUPPORT_X86_64
|
||||
bx_define_opcode(BX_IA_RDRAND_Eq, NULL, &BX_CPU_C::RDRAND_Ew, BX_ISA_RDRAND, BX_SRC_RM, BX_SRC_NONE, BX_SRC_NONE, BX_SRC_NONE, 0)
|
||||
#endif
|
||||
|
||||
// RDSEED
|
||||
bx_define_opcode(BX_IA_RDSEED_Ew, NULL, &BX_CPU_C::RDSEED_Ew, BX_ISA_RDSEED, BX_SRC_RM, BX_SRC_NONE, BX_SRC_NONE, BX_SRC_NONE, 0)
|
||||
bx_define_opcode(BX_IA_RDSEED_Ed, NULL, &BX_CPU_C::RDSEED_Ew, BX_ISA_RDSEED, BX_SRC_RM, BX_SRC_NONE, BX_SRC_NONE, BX_SRC_NONE, 0)
|
||||
#if BX_SUPPORT_X86_64
|
||||
bx_define_opcode(BX_IA_RDSEED_Eq, NULL, &BX_CPU_C::RDSEED_Ew, BX_ISA_RDSEED, BX_SRC_RM, BX_SRC_NONE, BX_SRC_NONE, BX_SRC_NONE, 0)
|
||||
#endif
|
||||
|
234
bochs/cpu/rdrand.cc
Normal file
234
bochs/cpu/rdrand.cc
Normal file
@ -0,0 +1,234 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id$
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2012 The Bochs Project
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA B 02110-1301 USA
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define NEED_CPU_REG_SHORTCUTS 1
|
||||
#include "bochs.h"
|
||||
#include "cpu.h"
|
||||
#define LOG_THIS BX_CPU_THIS_PTR
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#define HW_RANDOM_GENERATOR_READY (1)
|
||||
|
||||
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::RDRAND_Ew(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_VMX
|
||||
if (BX_CPU_THIS_PTR in_vmx_guest) {
|
||||
if (SECONDARY_VMEXEC_CONTROL(VMX_VM_EXEC_CTRL3_RDRAND_VMEXIT)) {
|
||||
VMexit(VMX_VMEXIT_RDRAND, 0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Bit16u val_16 = 0;
|
||||
|
||||
if (HW_RANDOM_GENERATOR_READY) {
|
||||
val_16 |= rand() & 0xff; // hack using std C rand() function
|
||||
val_16 <<= 8;
|
||||
val_16 |= rand() & 0xff;
|
||||
|
||||
setEFlagsOSZAPC(EFlagsCFMask);
|
||||
}
|
||||
else {
|
||||
setEFlagsOSZAPC(0);
|
||||
}
|
||||
|
||||
BX_WRITE_16BIT_REG(i->dst(), val_16);
|
||||
|
||||
BX_NEXT_INSTR(i);
|
||||
}
|
||||
|
||||
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::RDRAND_Ed(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_VMX
|
||||
if (BX_CPU_THIS_PTR in_vmx_guest) {
|
||||
if (SECONDARY_VMEXEC_CONTROL(VMX_VM_EXEC_CTRL3_RDRAND_VMEXIT)) {
|
||||
VMexit(VMX_VMEXIT_RDRAND, 0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Bit32u val_32 = 0;
|
||||
|
||||
if (HW_RANDOM_GENERATOR_READY) {
|
||||
val_32 |= rand() & 0xff; // hack using std C rand() function
|
||||
val_32 <<= 8;
|
||||
val_32 |= rand() & 0xff;
|
||||
val_32 <<= 8;
|
||||
val_32 |= rand() & 0xff;
|
||||
val_32 <<= 8;
|
||||
val_32 |= rand() & 0xff;
|
||||
|
||||
setEFlagsOSZAPC(EFlagsCFMask);
|
||||
}
|
||||
else {
|
||||
setEFlagsOSZAPC(0);
|
||||
}
|
||||
|
||||
BX_WRITE_32BIT_REGZ(i->dst(), val_32);
|
||||
|
||||
BX_NEXT_INSTR(i);
|
||||
}
|
||||
|
||||
#if BX_SUPPORT_X86_64
|
||||
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::RDRAND_Eq(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_VMX
|
||||
if (BX_CPU_THIS_PTR in_vmx_guest) {
|
||||
if (SECONDARY_VMEXEC_CONTROL(VMX_VM_EXEC_CTRL3_RDRAND_VMEXIT)) {
|
||||
VMexit(VMX_VMEXIT_RDRAND, 0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Bit64u val_64 = 0;
|
||||
|
||||
if (HW_RANDOM_GENERATOR_READY) {
|
||||
val_64 |= rand() & 0xff; // hack using std C rand() function
|
||||
val_64 <<= 8;
|
||||
val_64 |= rand() & 0xff;
|
||||
val_64 <<= 8;
|
||||
val_64 |= rand() & 0xff;
|
||||
val_64 <<= 8;
|
||||
val_64 |= rand() & 0xff;
|
||||
val_64 <<= 8;
|
||||
val_64 |= rand() & 0xff;
|
||||
val_64 <<= 8;
|
||||
val_64 |= rand() & 0xff;
|
||||
val_64 <<= 8;
|
||||
val_64 |= rand() & 0xff;
|
||||
val_64 <<= 8;
|
||||
val_64 |= rand() & 0xff;
|
||||
|
||||
setEFlagsOSZAPC(EFlagsCFMask);
|
||||
}
|
||||
else {
|
||||
setEFlagsOSZAPC(0);
|
||||
}
|
||||
|
||||
BX_WRITE_64BIT_REG(i->dst(), val_64);
|
||||
|
||||
BX_NEXT_INSTR(i);
|
||||
}
|
||||
#endif
|
||||
|
||||
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::RDSEED_Ew(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_VMX
|
||||
if (BX_CPU_THIS_PTR in_vmx_guest) {
|
||||
if (SECONDARY_VMEXEC_CONTROL(VMX_VM_EXEC_CTRL3_RDSEED_VMEXIT)) {
|
||||
VMexit(VMX_VMEXIT_RDSEED, 0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Bit16u val_16 = 0;
|
||||
|
||||
if (HW_RANDOM_GENERATOR_READY) {
|
||||
val_16 |= rand() & 0xff; // hack using std C rand() function
|
||||
val_16 <<= 8;
|
||||
val_16 |= rand() & 0xff;
|
||||
|
||||
setEFlagsOSZAPC(EFlagsCFMask);
|
||||
}
|
||||
else {
|
||||
setEFlagsOSZAPC(0);
|
||||
}
|
||||
|
||||
BX_WRITE_16BIT_REG(i->dst(), val_16);
|
||||
|
||||
BX_NEXT_INSTR(i);
|
||||
}
|
||||
|
||||
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::RDSEED_Ed(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_VMX
|
||||
if (BX_CPU_THIS_PTR in_vmx_guest) {
|
||||
if (SECONDARY_VMEXEC_CONTROL(VMX_VM_EXEC_CTRL3_RDSEED_VMEXIT)) {
|
||||
VMexit(VMX_VMEXIT_RDSEED, 0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Bit32u val_32 = 0;
|
||||
|
||||
if (HW_RANDOM_GENERATOR_READY) {
|
||||
val_32 |= rand() & 0xff; // hack using std C rand() function
|
||||
val_32 <<= 8;
|
||||
val_32 |= rand() & 0xff;
|
||||
val_32 <<= 8;
|
||||
val_32 |= rand() & 0xff;
|
||||
val_32 <<= 8;
|
||||
val_32 |= rand() & 0xff;
|
||||
|
||||
setEFlagsOSZAPC(EFlagsCFMask);
|
||||
}
|
||||
else {
|
||||
setEFlagsOSZAPC(0);
|
||||
}
|
||||
|
||||
BX_WRITE_32BIT_REGZ(i->dst(), val_32);
|
||||
|
||||
BX_NEXT_INSTR(i);
|
||||
}
|
||||
|
||||
#if BX_SUPPORT_X86_64
|
||||
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::RDSEED_Eq(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_VMX
|
||||
if (BX_CPU_THIS_PTR in_vmx_guest) {
|
||||
if (SECONDARY_VMEXEC_CONTROL(VMX_VM_EXEC_CTRL3_RDSEED_VMEXIT)) {
|
||||
VMexit(VMX_VMEXIT_RDSEED, 0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Bit64u val_64 = 0;
|
||||
|
||||
if (HW_RANDOM_GENERATOR_READY) {
|
||||
val_64 |= rand() & 0xff; // hack using std C rand() function
|
||||
val_64 <<= 8;
|
||||
val_64 |= rand() & 0xff;
|
||||
val_64 <<= 8;
|
||||
val_64 |= rand() & 0xff;
|
||||
val_64 <<= 8;
|
||||
val_64 |= rand() & 0xff;
|
||||
val_64 <<= 8;
|
||||
val_64 |= rand() & 0xff;
|
||||
val_64 <<= 8;
|
||||
val_64 |= rand() & 0xff;
|
||||
val_64 <<= 8;
|
||||
val_64 |= rand() & 0xff;
|
||||
val_64 <<= 8;
|
||||
val_64 |= rand() & 0xff;
|
||||
|
||||
setEFlagsOSZAPC(EFlagsCFMask);
|
||||
}
|
||||
else {
|
||||
setEFlagsOSZAPC(0);
|
||||
}
|
||||
|
||||
BX_WRITE_64BIT_REG(i->dst(), val_64);
|
||||
|
||||
BX_NEXT_INSTR(i);
|
||||
}
|
||||
#endif
|
@ -487,6 +487,8 @@ void BX_CPU_C::init_vmx_capabilities(void)
|
||||
// [11] RDRAND Exiting (require RDRAND instruction support)
|
||||
// [12] Enable INVPCID instruction (require INVPCID instruction support)
|
||||
// [13] Enable VM Functions
|
||||
// ...
|
||||
// [16] RDSEED Exiting (require RDSEED instruction support)
|
||||
|
||||
cap->vmx_vmexec_ctrl2_supported_bits = 0;
|
||||
|
||||
@ -518,6 +520,10 @@ void BX_CPU_C::init_vmx_capabilities(void)
|
||||
if (BX_CPUID_SUPPORT_ISA_EXTENSION(BX_ISA_INVPCID))
|
||||
cap->vmx_vmexec_ctrl2_supported_bits |= VMX_VM_EXEC_CTRL3_INVPCID;
|
||||
#endif
|
||||
if (BX_CPUID_SUPPORT_ISA_EXTENSION(BX_ISA_RDRAND))
|
||||
cap->vmx_vmexec_ctrl2_supported_bits |= VMX_VM_EXEC_CTRL3_RDRAND_VMEXIT;
|
||||
if (BX_CPUID_SUPPORT_ISA_EXTENSION(BX_ISA_RDSEED))
|
||||
cap->vmx_vmexec_ctrl2_supported_bits |= VMX_VM_EXEC_CTRL3_RDSEED_VMEXIT;
|
||||
|
||||
// enable secondary vm exec controls if needed
|
||||
if (cap->vmx_vmexec_ctrl2_supported_bits != 0)
|
||||
|
@ -2,7 +2,7 @@
|
||||
// $Id$
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2005-2011 Stanislav Shwartsman
|
||||
// Copyright (c) 2005-2012 Stanislav Shwartsman
|
||||
// Written by Stanislav Shwartsman [sshwarts at sourceforge net]
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
@ -270,6 +270,14 @@ x86_insn disassembler::decode(bx_bool is_32, bx_bool is_64, bx_address base, bx_
|
||||
attr = 0;
|
||||
continue;
|
||||
|
||||
case _GRPSSENONE:
|
||||
/* SSE opcode group with no prefix only allowed */
|
||||
sse_opcode = 1;
|
||||
if (sse_prefix != SSE_PREFIX_NONE)
|
||||
entry = &(BxDisasmGroupSSE_ERR[sse_prefix]);
|
||||
attr = 0;
|
||||
continue;
|
||||
|
||||
case _GRPSSE:
|
||||
sse_opcode = 1;
|
||||
/* For SSE opcodes, look into another 4 entries table
|
||||
|
@ -2,7 +2,7 @@
|
||||
// $Id$
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2005-2011 Stanislav Shwartsman
|
||||
// Copyright (c) 2005-2012 Stanislav Shwartsman
|
||||
// Written by Stanislav Shwartsman [sshwarts at sourceforge net]
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
@ -31,10 +31,11 @@
|
||||
#define _GRPSSE66 6
|
||||
#define _GRPSSEF2 7
|
||||
#define _GRPSSEF3 8
|
||||
#define _GRPRM 9
|
||||
#define _GRP3BOP 10
|
||||
#define _GRP64B 11
|
||||
#define _GRPVEXW 12
|
||||
#define _GRPSSENONE 9
|
||||
#define _GRPRM 10
|
||||
#define _GRP3BOP 11
|
||||
#define _GRP64B 12
|
||||
#define _GRPVEXW 13
|
||||
|
||||
/* ************************************************************************ */
|
||||
#define GRPSSE(n) _GRPSSE, BxDisasmGroupSSE_##n
|
||||
@ -50,9 +51,10 @@
|
||||
/* ************************************************************************ */
|
||||
|
||||
/* ************************************************************************ */
|
||||
#define GRPSSE66(n) _GRPSSE66, &n
|
||||
#define GRPSSEF2(n) _GRPSSEF2, &n
|
||||
#define GRPSSEF3(n) _GRPSSEF3, &n
|
||||
#define GRPSSE66(n) _GRPSSE66, &n
|
||||
#define GRPSSEF2(n) _GRPSSEF2, &n
|
||||
#define GRPSSEF3(n) _GRPSSEF3, &n
|
||||
#define GRPSSENONE(n) _GRPSSENONE, &n
|
||||
/* ************************************************************************ */
|
||||
|
||||
#define Apw &disassembler::Apw
|
||||
|
@ -2,7 +2,7 @@
|
||||
// $Id$
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2005-2011 Stanislav Shwartsman
|
||||
// Copyright (c) 2005-2012 Stanislav Shwartsman
|
||||
// Written by Stanislav Shwartsman [sshwarts at sourceforge net]
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
@ -386,26 +386,18 @@ static BxDisasmOpcodeTable_t BxDisasmGroupRmINVLPG[8] = {
|
||||
/* VMX */
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupRmG7VMX[8] = {
|
||||
/* 0 */ { 0, &Ia_Invalid },
|
||||
/* 1 */ { 0, &Ia_vmcall },
|
||||
/* 2 */ { 0, &Ia_vmlaunch },
|
||||
/* 3 */ { 0, &Ia_vmresume },
|
||||
/* 4 */ { 0, &Ia_vmxoff },
|
||||
/* 1 */ { GRPSSENONE(Ia_vmcall) },
|
||||
/* 2 */ { GRPSSENONE(Ia_vmlaunch) },
|
||||
/* 3 */ { GRPSSENONE(Ia_vmresume) },
|
||||
/* 4 */ { GRPSSENONE(Ia_vmxoff) },
|
||||
/* 5 */ { 0, &Ia_Invalid },
|
||||
/* 6 */ { 0, &Ia_Invalid },
|
||||
/* 7 */ { 0, &Ia_Invalid }
|
||||
};
|
||||
|
||||
/* VMX */
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupSSE_G7VMX[4] = {
|
||||
/* -- */ { GRPRM(G7VMX) },
|
||||
/* 66 */ { 0, &Ia_Invalid },
|
||||
/* F3 */ { 0, &Ia_Invalid },
|
||||
/* F2 */ { 0, &Ia_Invalid }
|
||||
};
|
||||
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupRmMONITOR[8] = {
|
||||
/* 0 */ { 0, &Ia_monitor },
|
||||
/* 1 */ { 0, &Ia_mwait },
|
||||
/* 0 */ { GRPSSENONE(Ia_monitor) },
|
||||
/* 1 */ { GRPSSENONE(Ia_mwait) },
|
||||
/* 2 */ { 0, &Ia_clac },
|
||||
/* 3 */ { 0, &Ia_stac },
|
||||
/* 4 */ { 0, &Ia_Invalid },
|
||||
@ -415,11 +407,11 @@ static BxDisasmOpcodeTable_t BxDisasmGroupRmMONITOR[8] = {
|
||||
};
|
||||
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupRmXSETGET[8] = {
|
||||
/* 0 */ { 0, &Ia_xgetbv },
|
||||
/* 1 */ { 0, &Ia_xsetbv },
|
||||
/* 0 */ { GRPSSENONE(Ia_xgetbv) },
|
||||
/* 1 */ { GRPSSENONE(Ia_xsetbv) },
|
||||
/* 2 */ { 0, &Ia_Invalid },
|
||||
/* 3 */ { 0, &Ia_Invalid },
|
||||
/* 4 */ { 0, &Ia_vmfunc }, // VMX
|
||||
/* 4 */ { GRPSSENONE(Ia_vmfunc) },
|
||||
/* 5 */ { 0, &Ia_Invalid },
|
||||
/* 6 */ { 0, &Ia_Invalid },
|
||||
/* 7 */ { 0, &Ia_Invalid }
|
||||
@ -437,7 +429,7 @@ static BxDisasmOpcodeTable_t BxDisasmGroupRmG7SVM[8] = {
|
||||
};
|
||||
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupG7R[8] = {
|
||||
/* 0 */ { GRPSSE(G7VMX) }, // VMX
|
||||
/* 0 */ { GRPRM(G7VMX) }, // VMX
|
||||
/* 1 */ { GRPRM(MONITOR) },
|
||||
/* 2 */ { GRPRM(XSETGET) },
|
||||
/* 3 */ { GRPRM(G7SVM) }, // SVM
|
||||
@ -486,7 +478,9 @@ static BxDisasmOpcodeTable_t BxDisasmGroupG8EqIb[8] = {
|
||||
/* 7 */ { 0, &Ia_btcq_Eq_Ib }
|
||||
};
|
||||
|
||||
/* ****** */
|
||||
/* Group9 */
|
||||
/* ****** */
|
||||
|
||||
/* VMX */
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupSSE_G9VMX6[4] = {
|
||||
@ -496,36 +490,76 @@ static BxDisasmOpcodeTable_t BxDisasmGroupSSE_G9VMX6[4] = {
|
||||
/* F2 */ { 0, &Ia_Invalid }
|
||||
};
|
||||
|
||||
/* VMX */
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupSSE_G9VMX7[4] = {
|
||||
/* -- */ { 0, &Ia_vmptrst_Mq },
|
||||
/* 66 */ { 0, &Ia_Invalid },
|
||||
/* F3 */ { 0, &Ia_Invalid },
|
||||
/* F2 */ { 0, &Ia_Invalid }
|
||||
};
|
||||
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupG9[8] = {
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupG9M[8] = {
|
||||
/* 0 */ { 0, &Ia_Invalid },
|
||||
/* 1 */ { 0, &Ia_cmpxchg8b_Mq },
|
||||
/* 2 */ { 0, &Ia_Invalid },
|
||||
/* 3 */ { 0, &Ia_Invalid },
|
||||
/* 4 */ { 0, &Ia_Invalid },
|
||||
/* 5 */ { 0, &Ia_Invalid },
|
||||
/* 6 */ { GRPSSE(G9VMX6) }, // VMX
|
||||
/* 7 */ { GRPSSE(G9VMX7) } // VMX
|
||||
/* 6 */ { GRPSSE(G9VMX6) },
|
||||
/* 7 */ { GRPSSENONE(Ia_vmptrst_Mq) }
|
||||
};
|
||||
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupG9q[8] = {
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupG9Mq[8] = {
|
||||
/* 0 */ { 0, &Ia_Invalid },
|
||||
/* 1 */ { 0, &Ia_cmpxchg16b_Mdq },
|
||||
/* 2 */ { 0, &Ia_Invalid },
|
||||
/* 3 */ { 0, &Ia_Invalid },
|
||||
/* 4 */ { 0, &Ia_Invalid },
|
||||
/* 5 */ { 0, &Ia_Invalid },
|
||||
/* 6 */ { GRPSSE(G9VMX6) }, // VMX
|
||||
/* 7 */ { GRPSSE(G9VMX7) } // VMX
|
||||
/* 6 */ { GRPSSE(G9VMX6) },
|
||||
/* 7 */ { GRPSSENONE(Ia_vmptrst_Mq) }
|
||||
};
|
||||
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupG9Rw[8] = {
|
||||
/* 0 */ { 0, &Ia_Invalid },
|
||||
/* 1 */ { 0, &Ia_Invalid },
|
||||
/* 2 */ { 0, &Ia_Invalid },
|
||||
/* 3 */ { 0, &Ia_Invalid },
|
||||
/* 4 */ { 0, &Ia_Invalid },
|
||||
/* 5 */ { 0, &Ia_Invalid },
|
||||
/* 6 */ { GRPSSENONE(Ia_rdrand_Ew) },
|
||||
/* 7 */ { GRPSSENONE(Ia_rdseed_Ew) }
|
||||
};
|
||||
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupG9Rd[8] = {
|
||||
/* 0 */ { 0, &Ia_Invalid },
|
||||
/* 1 */ { 0, &Ia_Invalid },
|
||||
/* 2 */ { 0, &Ia_Invalid },
|
||||
/* 3 */ { 0, &Ia_Invalid },
|
||||
/* 4 */ { 0, &Ia_Invalid },
|
||||
/* 5 */ { 0, &Ia_Invalid },
|
||||
/* 6 */ { GRPSSENONE(Ia_rdrand_Ed) },
|
||||
/* 7 */ { GRPSSENONE(Ia_rdseed_Ed) }
|
||||
};
|
||||
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupG9Rq[8] = {
|
||||
/* 0 */ { 0, &Ia_Invalid },
|
||||
/* 1 */ { 0, &Ia_Invalid },
|
||||
/* 2 */ { 0, &Ia_Invalid },
|
||||
/* 3 */ { 0, &Ia_Invalid },
|
||||
/* 4 */ { 0, &Ia_Invalid },
|
||||
/* 5 */ { 0, &Ia_Invalid },
|
||||
/* 6 */ { GRPSSENONE(Ia_rdrand_Eq) },
|
||||
/* 7 */ { GRPSSENONE(Ia_rdseed_Eq) }
|
||||
};
|
||||
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupModG9w[2] = {
|
||||
/* R */ { GRPN(G9Rw) },
|
||||
/* M */ { GRPN(G9M) }
|
||||
};
|
||||
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupModG9d[2] = {
|
||||
/* R */ { GRPN(G9Rd) },
|
||||
/* M */ { GRPN(G9M) }
|
||||
};
|
||||
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupModG9q[2] = {
|
||||
/* R */ { GRPN(G9Rq) },
|
||||
/* M */ { GRPN(G9Mq) }
|
||||
};
|
||||
|
||||
/* Group11 */
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupG11Eb[8] = {
|
||||
/* 0 */ { 0, &Ia_movb_Eb_Ib },
|
||||
@ -1106,11 +1140,11 @@ static BxDisasmOpcodeTable_t BxDisasmOpcodes16[256*2] = {
|
||||
/* 0F C0 */ { 0, &Ia_xaddb_Eb_Gb },
|
||||
/* 0F C0 */ { 0, &Ia_xaddw_Ew_Gw },
|
||||
/* 0F C2 */ { GRPSSE(0fc2) },
|
||||
/* 0F C3 */ { GRPSSE(0fc3) },
|
||||
/* 0F C3 */ { GRPSSENONE(Ia_movnti_Md_Gd) },
|
||||
/* 0F C4 */ { GRPSSE(0fc4) },
|
||||
/* 0F C5 */ { GRPSSE(0fc5) },
|
||||
/* 0F C6 */ { GRPSSE(0fc6) },
|
||||
/* 0F C7 */ { GRPN(G9) },
|
||||
/* 0F C7 */ { GRPMOD(G9w) },
|
||||
/* 0F C8 */ { 0, &Ia_bswapl_ERX },
|
||||
/* 0F C9 */ { 0, &Ia_bswapl_ERX },
|
||||
/* 0F CA */ { 0, &Ia_bswapl_ERX },
|
||||
@ -1626,12 +1660,12 @@ static BxDisasmOpcodeTable_t BxDisasmOpcodes32[256*2] = {
|
||||
/* 0F BF */ { 0, &Ia_movswl_Gd_Ew },
|
||||
/* 0F C0 */ { 0, &Ia_xaddb_Eb_Gb },
|
||||
/* 0F C0 */ { 0, &Ia_xaddl_Ed_Gd },
|
||||
/* 0F C2 */ { GRPSSE(0fc2) },
|
||||
/* 0F C3 */ { GRPSSE(0fc3) },
|
||||
/* 0F C4 */ { GRPSSE(0fc4) },
|
||||
/* 0F C5 */ { GRPSSE(0fc5) },
|
||||
/* 0F C6 */ { GRPSSE(0fc6) },
|
||||
/* 0F C7 */ { GRPN(G9) },
|
||||
/* 0F C2 */ { GRPSSE(0fc2) },
|
||||
/* 0F C3 */ { GRPSSENONE(Ia_movnti_Md_Gd) },
|
||||
/* 0F C4 */ { GRPSSE(0fc4) },
|
||||
/* 0F C5 */ { GRPSSE(0fc5) },
|
||||
/* 0F C6 */ { GRPSSE(0fc6) },
|
||||
/* 0F C7 */ { GRPMOD(G9d) },
|
||||
/* 0F C8 */ { 0, &Ia_bswapl_ERX },
|
||||
/* 0F C9 */ { 0, &Ia_bswapl_ERX },
|
||||
/* 0F CA */ { 0, &Ia_bswapl_ERX },
|
||||
@ -2148,11 +2182,11 @@ static BxDisasmOpcodeTable_t BxDisasmOpcodes64w[256*2] = {
|
||||
/* 0F C0 */ { 0, &Ia_xaddb_Eb_Gb },
|
||||
/* 0F C0 */ { 0, &Ia_xaddw_Ew_Gw },
|
||||
/* 0F C2 */ { GRPSSE(0fc2) },
|
||||
/* 0F C3 */ { GRPSSE(0fc3) },
|
||||
/* 0F C3 */ { GRPSSENONE(Ia_movnti_Md_Gd) },
|
||||
/* 0F C4 */ { GRPSSE(0fc4) },
|
||||
/* 0F C5 */ { GRPSSE(0fc5) },
|
||||
/* 0F C6 */ { GRPSSE(0fc6) },
|
||||
/* 0F C7 */ { GRPN(G9) },
|
||||
/* 0F C7 */ { GRPMOD(G9w) },
|
||||
/* 0F C8 */ { 0, &Ia_bswapl_ERX },
|
||||
/* 0F C9 */ { 0, &Ia_bswapl_ERX },
|
||||
/* 0F CA */ { 0, &Ia_bswapl_ERX },
|
||||
@ -2665,12 +2699,12 @@ static BxDisasmOpcodeTable_t BxDisasmOpcodes64d[256*2] = {
|
||||
/* 0F BF */ { 0, &Ia_movswl_Gd_Ew },
|
||||
/* 0F C0 */ { 0, &Ia_xaddb_Eb_Gb },
|
||||
/* 0F C0 */ { 0, &Ia_xaddl_Ed_Gd },
|
||||
/* 0F C2 */ { GRPSSE(0fc2) },
|
||||
/* 0F C3 */ { GRPSSE(0fc3) },
|
||||
/* 0F C4 */ { GRPSSE(0fc4) },
|
||||
/* 0F C5 */ { GRPSSE(0fc5) },
|
||||
/* 0F C6 */ { GRPSSE(0fc6) },
|
||||
/* 0F C7 */ { GRPN(G9) },
|
||||
/* 0F C2 */ { GRPSSE(0fc2) },
|
||||
/* 0F C3 */ { GRPSSENONE(Ia_movnti_Md_Gd) },
|
||||
/* 0F C4 */ { GRPSSE(0fc4) },
|
||||
/* 0F C5 */ { GRPSSE(0fc5) },
|
||||
/* 0F C6 */ { GRPSSE(0fc6) },
|
||||
/* 0F C7 */ { GRPMOD(G9d) },
|
||||
/* 0F C8 */ { 0, &Ia_bswapl_ERX },
|
||||
/* 0F C9 */ { 0, &Ia_bswapl_ERX },
|
||||
/* 0F CA */ { 0, &Ia_bswapl_ERX },
|
||||
@ -3183,12 +3217,12 @@ static BxDisasmOpcodeTable_t BxDisasmOpcodes64q[256*2] = {
|
||||
/* 0F BF */ { 0, &Ia_movswq_Gq_Ew },
|
||||
/* 0F C0 */ { 0, &Ia_xaddb_Eb_Gb },
|
||||
/* 0F C0 */ { 0, &Ia_xaddq_Eq_Gq },
|
||||
/* 0F C2 */ { GRPSSE(0fc2) },
|
||||
/* 0F C3 */ { GRPSSE(0fc3Q) },
|
||||
/* 0F C4 */ { GRPSSE(0fc4) },
|
||||
/* 0F C5 */ { GRPSSE(0fc5) },
|
||||
/* 0F C6 */ { GRPSSE(0fc6) },
|
||||
/* 0F C7 */ { GRPN(G9q) },
|
||||
/* 0F C2 */ { GRPSSE(0fc2) },
|
||||
/* 0F C3 */ { GRPSSENONE(Ia_movntiq_Mq_Gq) },
|
||||
/* 0F C4 */ { GRPSSE(0fc4) },
|
||||
/* 0F C5 */ { GRPSSE(0fc5) },
|
||||
/* 0F C6 */ { GRPSSE(0fc6) },
|
||||
/* 0F C7 */ { GRPMOD(G9q) },
|
||||
/* 0F C8 */ { 0, &Ia_bswapq_RRX },
|
||||
/* 0F C9 */ { 0, &Ia_bswapq_RRX },
|
||||
/* 0F CA */ { 0, &Ia_bswapq_RRX },
|
||||
|
@ -2,7 +2,7 @@
|
||||
// $Id$
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2005-2011 Stanislav Shwartsman
|
||||
// Copyright (c) 2005-2012 Stanislav Shwartsman
|
||||
// Written by Stanislav Shwartsman [sshwarts at sourceforge net]
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
@ -479,20 +479,6 @@ static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fc2[4] = {
|
||||
/* F2 */ { 0, &Ia_cmpsd_Vsd_Wsd_Ib }
|
||||
};
|
||||
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fc3[4] = {
|
||||
/* -- */ { 0, &Ia_movnti_Md_Gd },
|
||||
/* 66 */ { 0, &Ia_Invalid },
|
||||
/* F3 */ { 0, &Ia_Invalid },
|
||||
/* F2 */ { 0, &Ia_Invalid }
|
||||
};
|
||||
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fc3Q[4] = {
|
||||
/* -- */ { 0, &Ia_movntiq_Mq_Gq },
|
||||
/* 66 */ { 0, &Ia_Invalid },
|
||||
/* F3 */ { 0, &Ia_Invalid },
|
||||
/* F2 */ { 0, &Ia_Invalid }
|
||||
};
|
||||
|
||||
static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fc4[4] = {
|
||||
/* -- */ { 0, &Ia_pinsrw_Pq_Ew_Ib },
|
||||
/* 66 */ { 0, &Ia_pinsrw_Vdq_Ew_Ib },
|
||||
|
@ -2,7 +2,7 @@
|
||||
// $Id$
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2005-2011 Stanislav Shwartsman
|
||||
// Copyright (c) 2005-2012 Stanislav Shwartsman
|
||||
// Written by Stanislav Shwartsman [sshwarts at sourceforge net]
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
|
@ -2,7 +2,7 @@
|
||||
// $Id$
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2005-2011 Stanislav Shwartsman
|
||||
// Copyright (c) 2005-2012 Stanislav Shwartsman
|
||||
// Written by Stanislav Shwartsman [sshwarts at sourceforge net]
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
@ -1134,6 +1134,12 @@ Ia_rdfsbase_Ry = { "rdfsbase", "rdfsbase", Ry, XX, XX, XX, IA_FSGSBASE },
|
||||
Ia_rdgsbase_Ry = { "rdgsbase", "rdgsbase", Ry, XX, XX, XX, IA_FSGSBASE },
|
||||
Ia_rdmsr = { "rdmsr", "rdmsr", XX, XX, XX, XX, IA_PENTIUM },
|
||||
Ia_rdpmc = { "rdpmc", "rdpmc", XX, XX, XX, XX, IA_P6 },
|
||||
Ia_rdrand_Ed = { "rdrand", "rdrandd", Ed, XX, XX, XX, IA_RDRAND },
|
||||
Ia_rdrand_Eq = { "rdrand", "rdrandq", Eq, XX, XX, XX, IA_RDRAND },
|
||||
Ia_rdrand_Ew = { "rdrand", "rdrandw", Ew, XX, XX, XX, IA_RDRAND },
|
||||
Ia_rdseed_Ed = { "rdseed", "rdseedd", Ed, XX, XX, XX, IA_RDSEED },
|
||||
Ia_rdseed_Eq = { "rdseed", "rdseedq", Eq, XX, XX, XX, IA_RDSEED },
|
||||
Ia_rdseed_Ew = { "rdseed", "rdseedw", Ew, XX, XX, XX, IA_RDSEED },
|
||||
Ia_rdtsc = { "rdtsc", "rdtsc", XX, XX, XX, XX, IA_PENTIUM },
|
||||
Ia_rdtscp = { "rdtscp", "rdtscp", XX, XX, XX, XX, IA_RDTSCP },
|
||||
Ia_ret = { "ret", "ret", XX, XX, XX, XX, 0 },
|
||||
@ -1844,7 +1850,7 @@ Ia_vunpcklpd_Vpd_Hpd_Wpd = { "vunpcklpd", "vunpcklpd", Vpd, Hpd, Wpd, XX, IA_AVX
|
||||
Ia_vunpcklps_Vps_Hps_Wps = { "vunpcklps", "vunpcklps", Vps, Hps, Wps, XX, IA_AVX },
|
||||
Ia_vxorpd_Vpd_Hpd_Wpd = { "vxorpd", "vxorpd", Vpd, Hpd, Wpd, XX, IA_AVX },
|
||||
Ia_vxorps_Vps_Hps_Wps = { "vxorps", "vxorps", Vps, Hps, Wps, XX, IA_AVX },
|
||||
Ia_vzerall = { "vzeroall", "vzeroall", XX, XX, XX, XX, IA_AVX },
|
||||
Ia_vzeroall = { "vzeroall", "vzeroall", XX, XX, XX, XX, IA_AVX },
|
||||
Ia_vzeroupper = { "vzeroupper", "vzeroupper", XX, XX, XX, XX, IA_AVX },
|
||||
Ia_wbinvd = { "wbinvd", "wbinvd", XX, XX, XX, XX, IA_486 },
|
||||
Ia_wrfsbase_Ry = { "wrfsbase", "wrfsbase", Ry, XX, XX, XX, IA_FSGSBASE },
|
||||
|
Loading…
x
Reference in New Issue
Block a user