Bochs/bochs/cpu/decoder/fetchdecode_opmap_0f38.h
Stanislav Shwartsman f90e5f4f44 Add initial implementation of the CET (Control Flow Enforcement Technology) emulation according to SDM071
Only missing items (to be added soon):
  - Supervisor Shadow Stack EPT Control is not implemented yet
  - SMM placing for SSP
Currently have to be added manually to some CPUID model, for example to ICL-U
To enable configure with --enable-cet
2019-12-20 07:42:07 +00:00

221 lines
10 KiB
C

/////////////////////////////////////////////////////////////////////////
// $Id$
/////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2017-2019 Stanislav Shwartsman
// Written by Stanislav Shwartsman [sshwarts at sourceforge net]
//
// 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
//
/////////////////////////////////////////////////////////////////////////
#ifndef BX_FETCHDECODE_OPMAP_0F38_H
#define BX_FETCHDECODE_OPMAP_0F38_H
#if BX_CPU_LEVEL >= 6
/* ************************************************************************ */
/* 3-byte opcode table (Table A-4, 0F 38) */
// opcode 0F 38 00
static const Bit64u BxOpcodeTable0F3800[] = {
form_opcode(ATTR_SSE_NO_PREFIX, BX_IA_PSHUFB_PqQq),
last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PSHUFB_VdqWdq),
};
// opcode 0F 38 01
static const Bit64u BxOpcodeTable0F3801[] = {
form_opcode(ATTR_SSE_NO_PREFIX, BX_IA_PHADDW_PqQq),
last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PHADDW_VdqWdq),
};
// opcode 0F 38 02
static const Bit64u BxOpcodeTable0F3802[] = {
form_opcode(ATTR_SSE_NO_PREFIX, BX_IA_PHADDD_PqQq),
last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PHADDD_VdqWdq),
};
// opcode 0F 38 03
static const Bit64u BxOpcodeTable0F3803[] = {
form_opcode(ATTR_SSE_NO_PREFIX, BX_IA_PHADDSW_PqQq),
last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PHADDSW_VdqWdq),
};
// opcode 0F 38 04
static const Bit64u BxOpcodeTable0F3804[] = {
form_opcode(ATTR_SSE_NO_PREFIX, BX_IA_PMADDUBSW_PqQq),
last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMADDUBSW_VdqWdq),
};
// opcode 0F 38 05
static const Bit64u BxOpcodeTable0F3805[] = {
form_opcode(ATTR_SSE_NO_PREFIX, BX_IA_PHSUBW_PqQq),
last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PHSUBW_VdqWdq),
};
// opcode 0F 38 06
static const Bit64u BxOpcodeTable0F3806[] = {
form_opcode(ATTR_SSE_NO_PREFIX, BX_IA_PHSUBD_PqQq),
last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PHSUBD_VdqWdq),
};
// opcode 0F 38 07
static const Bit64u BxOpcodeTable0F3807[] = {
form_opcode(ATTR_SSE_NO_PREFIX, BX_IA_PHSUBSW_PqQq),
last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PHSUBSW_VdqWdq),
};
// opcode 0F 38 08
static const Bit64u BxOpcodeTable0F3808[] = {
form_opcode(ATTR_SSE_NO_PREFIX, BX_IA_PSIGNB_PqQq),
last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PSIGNB_VdqWdq),
};
// opcode 0F 38 09
static const Bit64u BxOpcodeTable0F3809[] = {
form_opcode(ATTR_SSE_NO_PREFIX, BX_IA_PSIGNW_PqQq),
last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PSIGNW_VdqWdq),
};
// opcode 0F 38 0A
static const Bit64u BxOpcodeTable0F380A[] = {
form_opcode(ATTR_SSE_NO_PREFIX, BX_IA_PSIGND_PqQq),
last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PSIGND_VdqWdq),
};
// opcode 0F 38 0B
static const Bit64u BxOpcodeTable0F380B[] = {
form_opcode(ATTR_SSE_NO_PREFIX, BX_IA_PMULHRSW_PqQq),
last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMULHRSW_VdqWdq),
};
static const Bit64u BxOpcodeTable0F3810[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PBLENDVB_VdqWdq) };
static const Bit64u BxOpcodeTable0F3814[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_BLENDVPS_VpsWps) };
static const Bit64u BxOpcodeTable0F3815[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_BLENDVPD_VpdWpd) };
static const Bit64u BxOpcodeTable0F3817[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PTEST_VdqWdq) };
// opcode 0F 38 1C
static const Bit64u BxOpcodeTable0F381C[] = {
form_opcode(ATTR_SSE_NO_PREFIX, BX_IA_PABSB_PqQq),
last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PABSB_VdqWdq),
};
// opcode 0F 38 1D
static const Bit64u BxOpcodeTable0F381D[] = {
form_opcode(ATTR_SSE_NO_PREFIX, BX_IA_PABSW_PqQq),
last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PABSW_VdqWdq),
};
// opcode 0F 38 1E
static const Bit64u BxOpcodeTable0F381E[] = {
form_opcode(ATTR_SSE_NO_PREFIX, BX_IA_PABSD_PqQq),
last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PABSD_VdqWdq),
};
static const Bit64u BxOpcodeTable0F3820[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMOVSXBW_VdqWq) };
static const Bit64u BxOpcodeTable0F3821[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMOVSXBD_VdqWd) };
static const Bit64u BxOpcodeTable0F3822[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMOVSXBQ_VdqWw) };
static const Bit64u BxOpcodeTable0F3823[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMOVSXWD_VdqWq) };
static const Bit64u BxOpcodeTable0F3824[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMOVSXWQ_VdqWd) };
static const Bit64u BxOpcodeTable0F3825[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMOVSXDQ_VdqWq) };
static const Bit64u BxOpcodeTable0F3828[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMULDQ_VdqWdq) };
static const Bit64u BxOpcodeTable0F3829[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PCMPEQQ_VdqWdq) };
static const Bit64u BxOpcodeTable0F382A[] = { last_opcode(ATTR_SSE_PREFIX_66 | ATTR_MOD_MEM, BX_IA_MOVNTDQA_VdqMdq) };
static const Bit64u BxOpcodeTable0F382B[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PACKUSDW_VdqWdq) };
static const Bit64u BxOpcodeTable0F3830[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMOVZXBW_VdqWq) };
static const Bit64u BxOpcodeTable0F3831[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMOVZXBD_VdqWd) };
static const Bit64u BxOpcodeTable0F3832[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMOVZXBQ_VdqWw) };
static const Bit64u BxOpcodeTable0F3833[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMOVZXWD_VdqWq) };
static const Bit64u BxOpcodeTable0F3834[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMOVZXWQ_VdqWd) };
static const Bit64u BxOpcodeTable0F3835[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMOVZXDQ_VdqWq) };
static const Bit64u BxOpcodeTable0F3837[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PCMPGTQ_VdqWdq) };
static const Bit64u BxOpcodeTable0F3838[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMINSB_VdqWdq) };
static const Bit64u BxOpcodeTable0F3839[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMINSD_VdqWdq) };
static const Bit64u BxOpcodeTable0F383A[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMINUW_VdqWdq) };
static const Bit64u BxOpcodeTable0F383B[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMINUD_VdqWdq) };
static const Bit64u BxOpcodeTable0F383C[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMAXSB_VdqWdq) };
static const Bit64u BxOpcodeTable0F383D[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMAXSD_VdqWdq) };
static const Bit64u BxOpcodeTable0F383E[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMAXUW_VdqWdq) };
static const Bit64u BxOpcodeTable0F383F[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMAXUD_VdqWdq) };
static const Bit64u BxOpcodeTable0F3840[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PMULLD_VdqWdq) };
static const Bit64u BxOpcodeTable0F3841[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_PHMINPOSUW_VdqWdq) };
static const Bit64u BxOpcodeTable0F3880[] = { last_opcode(ATTR_SSE_PREFIX_66 | ATTR_MOD_MEM, BX_IA_INVEPT) };
static const Bit64u BxOpcodeTable0F3881[] = { last_opcode(ATTR_SSE_PREFIX_66 | ATTR_MOD_MEM, BX_IA_INVVPID) };
static const Bit64u BxOpcodeTable0F3882[] = { last_opcode(ATTR_SSE_PREFIX_66 | ATTR_MOD_MEM, BX_IA_INVPCID) };
static const Bit64u BxOpcodeTable0F38C8[] = { last_opcode(ATTR_SSE_NO_PREFIX, BX_IA_SHA1NEXTE_VdqWdq) };
static const Bit64u BxOpcodeTable0F38C9[] = { last_opcode(ATTR_SSE_NO_PREFIX, BX_IA_SHA1MSG1_VdqWdq) };
static const Bit64u BxOpcodeTable0F38CA[] = { last_opcode(ATTR_SSE_NO_PREFIX, BX_IA_SHA1MSG2_VdqWdq) };
static const Bit64u BxOpcodeTable0F38CB[] = { last_opcode(ATTR_SSE_NO_PREFIX, BX_IA_SHA256RNDS2_VdqWdq) };
static const Bit64u BxOpcodeTable0F38CC[] = { last_opcode(ATTR_SSE_NO_PREFIX, BX_IA_SHA256MSG1_VdqWdq) };
static const Bit64u BxOpcodeTable0F38CD[] = { last_opcode(ATTR_SSE_NO_PREFIX, BX_IA_SHA256MSG2_VdqWdq) };
static const Bit64u BxOpcodeTable0F38CF[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_GF2P8MULB_VdqWdq) };
static const Bit64u BxOpcodeTable0F38DB[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_AESIMC_VdqWdq) };
static const Bit64u BxOpcodeTable0F38DC[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_AESENC_VdqWdq) };
static const Bit64u BxOpcodeTable0F38DD[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_AESENCLAST_VdqWdq) };
static const Bit64u BxOpcodeTable0F38DE[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_AESDEC_VdqWdq) };
static const Bit64u BxOpcodeTable0F38DF[] = { last_opcode(ATTR_SSE_PREFIX_66, BX_IA_AESDECLAST_VdqWdq) };
// opcode 0F 38 F0
static const Bit64u BxOpcodeTable0F38F0[] = {
form_opcode(ATTR_NO_SSE_PREFIX_F2_F3 | ATTR_OS16 | ATTR_MOD_MEM, BX_IA_MOVBE_GwMw),
form_opcode(ATTR_NO_SSE_PREFIX_F2_F3 | ATTR_OS32 | ATTR_MOD_MEM, BX_IA_MOVBE_GdMd),
#if BX_SUPPORT_X86_64
form_opcode(ATTR_NO_SSE_PREFIX_F2_F3 | ATTR_OS64 | ATTR_MOD_MEM, BX_IA_MOVBE_GqMq),
#endif
last_opcode(ATTR_SSE_PREFIX_F2, BX_IA_CRC32_GdEb)
};
// opcode 0F 38 F1
static const Bit64u BxOpcodeTable0F38F1[] = {
#if BX_SUPPORT_X86_64
form_opcode(ATTR_NO_SSE_PREFIX_F2_F3 | ATTR_OS64 | ATTR_MOD_MEM, BX_IA_MOVBE_MqGq),
#endif
form_opcode(ATTR_NO_SSE_PREFIX_F2_F3 | ATTR_OS32 | ATTR_MOD_MEM, BX_IA_MOVBE_MdGd),
form_opcode(ATTR_NO_SSE_PREFIX_F2_F3 | ATTR_OS16 | ATTR_MOD_MEM, BX_IA_MOVBE_MwGw),
#if BX_SUPPORT_X86_64
form_opcode(ATTR_SSE_PREFIX_F2 | ATTR_OS64, BX_IA_CRC32_GdEq),
#endif
form_opcode(ATTR_SSE_PREFIX_F2 | ATTR_OS32, BX_IA_CRC32_GdEd),
last_opcode(ATTR_SSE_PREFIX_F2 | ATTR_OS16, BX_IA_CRC32_GdEw)
};
// opcode 0F 38 F6
#if BX_SUPPORT_CET
static const Bit64u BxOpcodeTable0F38F5[] = {
form_opcode(ATTR_OS64 | ATTR_MOD_MEM | ATTR_SSE_PREFIX_66, BX_IA_WRUSSQ),
last_opcode(ATTR_OS16_32 | ATTR_MOD_MEM | ATTR_SSE_PREFIX_66, BX_IA_WRUSSD),
};
#endif
// opcode 0F 38 F6
static const Bit64u BxOpcodeTable0F38F6[] = {
#if BX_SUPPORT_CET
form_opcode(ATTR_OS64 | ATTR_MOD_MEM | ATTR_SSE_NO_PREFIX, BX_IA_WRSSQ),
form_opcode(ATTR_OS16_32 | ATTR_MOD_MEM | ATTR_SSE_NO_PREFIX, BX_IA_WRSSD),
#endif
#if BX_SUPPORT_X86_64
form_opcode(ATTR_SSE_PREFIX_66 | ATTR_OS64, BX_IA_ADCX_GqEq),
form_opcode(ATTR_SSE_PREFIX_F3 | ATTR_OS64, BX_IA_ADOX_GqEq),
#endif
form_opcode(ATTR_SSE_PREFIX_66, BX_IA_ADCX_GdEd),
last_opcode(ATTR_SSE_PREFIX_F3, BX_IA_ADOX_GdEd)
};
#endif // BX_CPU_LEVEL >= 6
#endif // BX_FETCHDECODE_OPMAP_0F38_H