Changeset 66412 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Apr 4, 2017 8:50:54 AM (8 years ago)
- Location:
- trunk/src/VBox/VMM/VMMAll
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py
r66404 r66412 1422 1422 'vexgrp13': InstructionMap('vexgrp13', sEncoding = 'vex1', asLeadOpcodes = ['0x72',], sSelector = 'mod /r'), 1423 1423 'vexgrp14': InstructionMap('vexgrp14', sEncoding = 'vex1', asLeadOpcodes = ['0x73',], sSelector = 'mod /r'), 1424 'vexgrp15': InstructionMap('vexgrp15', sEncoding = 'vex1', asLeadOpcodes = ['0xae',], sSelector = 'm od/r'),1424 'vexgrp15': InstructionMap('vexgrp15', sEncoding = 'vex1', asLeadOpcodes = ['0xae',], sSelector = 'memreg /r'), 1425 1425 'vexgrp17': InstructionMap('vexgrp17', sEncoding = 'vex1', asLeadOpcodes = ['0xf3',], sSelector = '/r'), 1426 1426 -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h
r66409 r66412 5899 5899 5900 5900 5901 /** 5902 * @opmaps vexgrp15 5903 * @opcode !11/3 5904 * @oppfx none 5905 * @opcpuid sse 5906 * @opgroup og_avx_mxcsrsm 5907 * @optestign mxcsr=0 -> op1=0 5908 * @optestign mxcsr=0x2083 -> op1=0x2083 5909 * @optestign mxcsr=0x2084 cr0|=ts -> value.xcpt=0x7 5910 * @optestign mxcsr=0x2085 cr0|=em -> value.xcpt=0x6 5911 * @optestign mxcsr=0x2086 cr0|=mp -> op1=0x2086 5912 * @optestign mxcsr=0x2087 cr4&~=osfxsr -> value.xcpt=0x6 5913 * @optestign mxcsr=0x2088 cr0|=ts,em -> value.xcpt=0x6 5914 * @optestign mxcsr=0x2089 cr0|=em cr4&~=osfxsr -> value.xcpt=0x6 5915 * @optestign mxcsr=0x208a cr0|=ts,em cr4&~=osfxsr -> value.xcpt=0x6 5916 * @optestign mxcsr=0x208b cr0|=ts,em,mp cr4&~=osfxsr -> value.xcpt=0x6 5917 */ 5918 FNIEMOP_DEF_1(iemOp_VGrp15_vstmxcsr, uint8_t, bRm) 5919 { 5920 IEMOP_MNEMONIC1(M_MEM, VSTMXCSR, vstmxcsr, MdWO, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE); 5921 if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAvx) 5922 return IEMOP_RAISE_INVALID_OPCODE(); 5923 5924 IEM_MC_BEGIN(2, 0); 5925 IEM_MC_ARG(uint8_t, iEffSeg, 0); 5926 IEM_MC_ARG(RTGCPTR, GCPtrEff, 1); 5927 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0); 5928 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 5929 IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ(); 5930 IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg); 5931 IEM_MC_CALL_CIMPL_2(iemCImpl_stmxcsr, iEffSeg, GCPtrEff); 5932 IEM_MC_END(); 5933 return VINF_SUCCESS; 5934 } 5935 5936 5901 5937 /** Opcode 0x0f 0xae mem/4. */ 5902 5938 FNIEMOP_UD_STUB_1(iemOp_Grp15_xsave, uint8_t, bRm); … … 6078 6114 return FNIEMOP_CALL_1(g_apfnGroup15MemReg[ ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) * 4 6079 6115 + pVCpu->iem.s.idxPrefix], bRm); 6116 } 6117 6118 6119 /** 6120 * Vex group 15 jump table for register variant. 6121 * @todo work in progress 6122 */ 6123 IEM_STATIC const PFNIEMOPRM g_apfnVexGroup15RegReg[] = 6124 { /* pfx: none, 066h, 0f3h, 0f2h */ 6125 /* /0 */ iemOp_InvalidWithRM, iemOp_InvalidWithRM, iemOp_Grp15_rdfsbase, iemOp_InvalidWithRM, 6126 /* /1 */ iemOp_InvalidWithRM, iemOp_InvalidWithRM, iemOp_Grp15_rdgsbase, iemOp_InvalidWithRM, 6127 /* /2 */ iemOp_InvalidWithRM, iemOp_InvalidWithRM, iemOp_Grp15_wrfsbase, iemOp_InvalidWithRM, 6128 /* /3 */ iemOp_InvalidWithRM, iemOp_InvalidWithRM, iemOp_Grp15_wrgsbase, iemOp_InvalidWithRM, 6129 /* /4 */ IEMOP_X4(iemOp_InvalidWithRM), 6130 /* /5 */ iemOp_Grp15_lfence, iemOp_InvalidWithRM, iemOp_InvalidWithRM, iemOp_InvalidWithRM, 6131 /* /6 */ iemOp_Grp15_mfence, iemOp_InvalidWithRM, iemOp_InvalidWithRM, iemOp_InvalidWithRM, 6132 /* /7 */ iemOp_Grp15_sfence, iemOp_InvalidWithRM, iemOp_InvalidWithRM, iemOp_InvalidWithRM, 6133 }; 6134 AssertCompile(RT_ELEMENTS(g_apfnVexGroup15RegReg) == 8*4); 6135 6136 6137 /** 6138 * Vex group 15 jump table for memory variant. 6139 * @todo work in progress 6140 */ 6141 IEM_STATIC const PFNIEMOPRM g_apfnVexGroup15MemReg[] = 6142 { /* pfx: none, 066h, 0f3h, 0f2h */ 6143 /* /0 */ iemOp_Grp15_fxsave, iemOp_InvalidWithRM, iemOp_InvalidWithRM, iemOp_InvalidWithRM, 6144 /* /1 */ iemOp_Grp15_fxrstor, iemOp_InvalidWithRM, iemOp_InvalidWithRM, iemOp_InvalidWithRM, 6145 /* /2 */ iemOp_Grp15_ldmxcsr, iemOp_InvalidWithRM, iemOp_InvalidWithRM, iemOp_InvalidWithRM, 6146 /* /3 */ iemOp_VGrp15_vstmxcsr, iemOp_InvalidWithRM, iemOp_InvalidWithRM, iemOp_InvalidWithRM, 6147 /* /4 */ iemOp_Grp15_xsave, iemOp_InvalidWithRM, iemOp_InvalidWithRM, iemOp_InvalidWithRM, 6148 /* /5 */ iemOp_Grp15_xrstor, iemOp_InvalidWithRM, iemOp_InvalidWithRM, iemOp_InvalidWithRM, 6149 /* /6 */ iemOp_Grp15_xsaveopt, iemOp_InvalidWithRM, iemOp_InvalidWithRM, iemOp_InvalidWithRM, 6150 /* /7 */ iemOp_Grp15_clflush, iemOp_Grp15_clflushopt, iemOp_InvalidWithRM, iemOp_InvalidWithRM, 6151 }; 6152 AssertCompile(RT_ELEMENTS(g_apfnVexGroup15MemReg) == 8*4); 6153 6154 6155 /** Opcode vex. 0xae. */ 6156 FNIEMOP_DEF(iemOp_VGrp15) 6157 { 6158 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 6159 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 6160 /* register, register */ 6161 return FNIEMOP_CALL_1(g_apfnVexGroup15RegReg[ ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) * 4 6162 + pVCpu->iem.s.idxPrefix], bRm); 6163 /* memory, register */ 6164 return FNIEMOP_CALL_1(g_apfnVexGroup15MemReg[ ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) * 4 6165 + pVCpu->iem.s.idxPrefix], bRm); 6080 6166 } 6081 6167 … … 8663 8749 /* 0xac */ IEMOP_X4(iemOp_InvalidNeedRM), 8664 8750 /* 0xad */ IEMOP_X4(iemOp_InvalidNeedRM), 8665 /* 0xae */ IEMOP_X4(iemOp_ Grp15), /** @todo groups and vex */8751 /* 0xae */ IEMOP_X4(iemOp_VGrp15), 8666 8752 /* 0xaf */ IEMOP_X4(iemOp_InvalidNeedRM), 8667 8753
Note:
See TracChangeset
for help on using the changeset viewer.