Changeset 66462 in vbox
- Timestamp:
- Apr 6, 2017 1:38:13 PM (8 years ago)
- Location:
- trunk/src/VBox
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h
r66457 r66462 180 180 uint32_t fEFlags = pCtx->eflags.u; 181 181 iemAImpl_test_u8(&u8Result, u8Result, &fEFlags); 182 pCtx->eflags.u &= ~(fToUpdate | fUndefined); 183 pCtx->eflags.u |= (fToUpdate | fUndefined) & fEFlags; 184 #ifdef IEM_VERIFICATION_MODE_FULL 185 pVCpu->iem.s.fUndefinedEFlags |= fUndefined; 186 #endif 187 } 188 189 190 /** 191 * Updates the specified flags according to a 16-bit result. 192 * 193 * @param pVCpu The cross context virtual CPU structure of the calling thread. 194 * @param u16Result The result to set the flags according to. 195 * @param fToUpdate The flags to update. 196 * @param fUndefined The flags that are specified as undefined. 197 */ 198 static void iemHlpUpdateArithEFlagsU16(PVMCPU pVCpu, uint16_t u16Result, uint32_t fToUpdate, uint32_t fUndefined) 199 { 200 PCPUMCTX pCtx = IEM_GET_CTX(pVCpu); 201 202 uint32_t fEFlags = pCtx->eflags.u; 203 iemAImpl_test_u16(&u16Result, u16Result, &fEFlags); 182 204 pCtx->eflags.u &= ~(fToUpdate | fUndefined); 183 205 pCtx->eflags.u |= (fToUpdate | fUndefined) & fEFlags; … … 6488 6510 PCPUMCTX pCtx = IEM_GET_CTX(pVCpu); 6489 6511 6490 uint8_t const uMaskedAl = pCtx->al & 0xf; 6491 if ( pCtx->eflags.Bits.u1AF 6492 || uMaskedAl >= 10) 6493 { 6494 pCtx->ax = (pCtx->ax + UINT16_C(0x106)) & UINT16_C(0xff0f); 6495 pCtx->eflags.Bits.u1AF = 1; 6496 pCtx->eflags.Bits.u1CF = 1; 6512 if (IEM_IS_GUEST_CPU_AMD(pVCpu)) 6513 { 6514 if ( pCtx->eflags.Bits.u1AF 6515 || (pCtx->ax & 0xf) >= 10) 6516 { 6517 iemAImpl_add_u16(&pCtx->ax, 0x106, &pCtx->eflags.u32); 6518 pCtx->eflags.Bits.u1AF = 1; 6519 pCtx->eflags.Bits.u1CF = 1; 6520 #ifdef IEM_VERIFICATION_MODE_FULL 6521 pVCpu->iem.s.fUndefinedEFlags |= X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF; 6522 #endif 6523 } 6524 else 6525 { 6526 iemHlpUpdateArithEFlagsU16(pVCpu, pCtx->ax, X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF); 6527 pCtx->eflags.Bits.u1AF = 0; 6528 pCtx->eflags.Bits.u1CF = 0; 6529 } 6530 pCtx->ax &= UINT16_C(0xff0f); 6497 6531 } 6498 6532 else 6499 6533 { 6500 pCtx->al = uMaskedAl; 6501 pCtx->eflags.Bits.u1AF = 0; 6502 pCtx->eflags.Bits.u1CF = 0; 6503 } 6504 6505 iemHlpUpdateArithEFlagsU8(pVCpu, pCtx->al, X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF); 6534 if ( pCtx->eflags.Bits.u1AF 6535 || (pCtx->ax & 0xf) >= 10) 6536 { 6537 pCtx->ax += UINT16_C(0x106); 6538 pCtx->eflags.Bits.u1AF = 1; 6539 pCtx->eflags.Bits.u1CF = 1; 6540 } 6541 else 6542 { 6543 pCtx->eflags.Bits.u1AF = 0; 6544 pCtx->eflags.Bits.u1CF = 0; 6545 } 6546 pCtx->ax &= UINT16_C(0xff0f); 6547 iemHlpUpdateArithEFlagsU8(pVCpu, pCtx->al, X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF); 6548 } 6549 6506 6550 iemRegAddToRipAndClearRF(pVCpu, cbInstr); 6507 6551 return VINF_SUCCESS; … … 6516 6560 PCPUMCTX pCtx = IEM_GET_CTX(pVCpu); 6517 6561 6518 uint8_t const uMaskedAl = pCtx->al & 0xf; 6519 if ( pCtx->eflags.Bits.u1AF 6520 || uMaskedAl >= 10) 6521 { 6522 pCtx->ax = (pCtx->ax - 6) & UINT16_C(0xff0f); 6523 pCtx->ah -= 1; 6524 pCtx->eflags.Bits.u1AF = 1; 6525 pCtx->eflags.Bits.u1CF = 1; 6562 if (IEM_IS_GUEST_CPU_AMD(pVCpu)) 6563 { 6564 if ( pCtx->eflags.Bits.u1AF 6565 || (pCtx->ax & 0xf) >= 10) 6566 { 6567 iemAImpl_sub_u16(&pCtx->ax, 0x106, &pCtx->eflags.u32); 6568 pCtx->eflags.Bits.u1AF = 1; 6569 pCtx->eflags.Bits.u1CF = 1; 6570 #ifdef IEM_VERIFICATION_MODE_FULL 6571 pVCpu->iem.s.fUndefinedEFlags |= X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF; 6572 #endif 6573 } 6574 else 6575 { 6576 iemHlpUpdateArithEFlagsU16(pVCpu, pCtx->ax, X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF); 6577 pCtx->eflags.Bits.u1AF = 0; 6578 pCtx->eflags.Bits.u1CF = 0; 6579 } 6580 pCtx->ax &= UINT16_C(0xff0f); 6526 6581 } 6527 6582 else 6528 6583 { 6529 pCtx->al = uMaskedAl; 6530 pCtx->eflags.Bits.u1AF = 0; 6531 pCtx->eflags.Bits.u1CF = 0; 6532 } 6533 6534 iemHlpUpdateArithEFlagsU8(pVCpu, pCtx->al, X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF); 6584 if ( pCtx->eflags.Bits.u1AF 6585 || (pCtx->ax & 0xf) >= 10) 6586 { 6587 pCtx->ax -= UINT16_C(0x106); 6588 pCtx->eflags.Bits.u1AF = 1; 6589 pCtx->eflags.Bits.u1CF = 1; 6590 } 6591 else 6592 { 6593 pCtx->eflags.Bits.u1AF = 0; 6594 pCtx->eflags.Bits.u1CF = 0; 6595 } 6596 pCtx->ax &= UINT16_C(0xff0f); 6597 iemHlpUpdateArithEFlagsU8(pVCpu, pCtx->al, X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF); 6598 } 6599 6535 6600 iemRegAddToRipAndClearRF(pVCpu, cbInstr); 6536 6601 return VINF_SUCCESS; -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h
r66457 r66462 903 903 * @opflundef pf,zf,sf,of 904 904 * @opgroup og_gen_arith_dec 905 * @optest efl&~=af ax=9 -> efl&|=nc,po,na,nz,pl,nv 906 * @optest efl&~=af ax=0 -> efl&|=nc,po,na,zf,pl,nv 907 * @optest efl&~=af ax=0x00f0 -> ax=0x0000 efl&|=nc,po,na,zf,pl,nv 908 * @optest efl&~=af ax=0x00f9 -> ax=0x0009 efl&|=nc,po,na,nz,pl,nv 909 * @optest efl|=af ax=0 -> ax=0x0106 efl&|=cf,po,af,nz,pl,nv 910 * @optest efl|=af ax=0x0100 -> ax=0x0206 efl&|=cf,po,af,nz,pl,nv 911 * @optest efl|=af ax=0x000a -> ax=0x0100 efl&|=cf,po,af,zf,pl,nv 912 * @optest efl|=af ax=0x010a -> ax=0x0200 efl&|=cf,po,af,zf,pl,nv 913 * @optest efl|=af ax=0x0f0a -> ax=0x1000 efl&|=cf,po,af,zf,pl,nv 914 * @optest efl|=af ax=0x7f0a -> ax=0x8000 efl&|=cf,po,af,zf,pl,nv 915 * @optest efl|=af ax=0xff0a -> ax=0x0000 efl&|=cf,po,af,zf,pl,nv 916 * @optest efl&~=af ax=0xff0a -> ax=0x0000 efl&|=cf,po,af,zf,pl,nv 917 * @optest efl&~=af ax=0x000b -> ax=0x0101 efl&|=cf,pe,af,nz,pl,nv 918 * @optest efl&~=af ax=0x000c -> ax=0x0102 efl&|=cf,pe,af,nz,pl,nv 919 * @optest efl&~=af ax=0x000d -> ax=0x0103 efl&|=cf,po,af,nz,pl,nv 920 * @optest efl&~=af ax=0x000e -> ax=0x0104 efl&|=cf,pe,af,nz,pl,nv 921 * @optest efl&~=af ax=0x000f -> ax=0x0105 efl&|=cf,po,af,nz,pl,nv 922 * @optest efl&~=af ax=0x020f -> ax=0x0305 efl&|=cf,po,af,nz,pl,nv 905 * @optest efl&~=af ax=9 -> efl&|=nc,po,na,nz,pl,nv 906 * @optest efl&~=af ax=0 -> efl&|=nc,po,na,zf,pl,nv 907 * @optest intel / efl&~=af ax=0x00f0 -> ax=0x0000 efl&|=nc,po,na,zf,pl,nv 908 * @optest amd / efl&~=af ax=0x00f0 -> ax=0x0000 efl&|=nc,po,na,nz,pl,nv 909 * @optest efl&~=af ax=0x00f9 -> ax=0x0009 efl&|=nc,po,na,nz,pl,nv 910 * @optest efl|=af ax=0 -> ax=0x0106 efl&|=cf,po,af,nz,pl,nv 911 * @optest efl|=af ax=0x0100 -> ax=0x0206 efl&|=cf,po,af,nz,pl,nv 912 * @optest intel / efl|=af ax=0x000a -> ax=0x0100 efl&|=cf,po,af,zf,pl,nv 913 * @optest amd / efl|=af ax=0x000a -> ax=0x0100 efl&|=cf,pe,af,nz,pl,nv 914 * @optest intel / efl|=af ax=0x010a -> ax=0x0200 efl&|=cf,po,af,zf,pl,nv 915 * @optest amd / efl|=af ax=0x010a -> ax=0x0200 efl&|=cf,pe,af,nz,pl,nv 916 * @optest intel / efl|=af ax=0x0f0a -> ax=0x1000 efl&|=cf,po,af,zf,pl,nv 917 * @optest amd / efl|=af ax=0x0f0a -> ax=0x1000 efl&|=cf,pe,af,nz,pl,nv 918 * @optest intel / efl|=af ax=0x7f0a -> ax=0x8000 efl&|=cf,po,af,zf,pl,nv 919 * @optest amd / efl|=af ax=0x7f0a -> ax=0x8000 efl&|=cf,pe,af,nz,ng,ov 920 * @optest intel / efl|=af ax=0xff0a -> ax=0x0000 efl&|=cf,po,af,zf,pl,nv 921 * @optest amd / efl|=af ax=0xff0a -> ax=0x0000 efl&|=cf,pe,af,nz,pl,nv 922 * @optest intel / efl&~=af ax=0xff0a -> ax=0x0000 efl&|=cf,po,af,zf,pl,nv 923 * @optest amd / efl&~=af ax=0xff0a -> ax=0x0000 efl&|=cf,pe,af,nz,pl,nv 924 * @optest intel / efl&~=af ax=0x000b -> ax=0x0101 efl&|=cf,pe,af,nz,pl,nv 925 * @optest amd / efl&~=af ax=0x000b -> ax=0x0101 efl&|=cf,po,af,nz,pl,nv 926 * @optest intel / efl&~=af ax=0x000c -> ax=0x0102 efl&|=cf,pe,af,nz,pl,nv 927 * @optest amd / efl&~=af ax=0x000c -> ax=0x0102 efl&|=cf,po,af,nz,pl,nv 928 * @optest intel / efl&~=af ax=0x000d -> ax=0x0103 efl&|=cf,po,af,nz,pl,nv 929 * @optest amd / efl&~=af ax=0x000d -> ax=0x0103 efl&|=cf,pe,af,nz,pl,nv 930 * @optest intel / efl&~=af ax=0x000e -> ax=0x0104 efl&|=cf,pe,af,nz,pl,nv 931 * @optest amd / efl&~=af ax=0x000e -> ax=0x0104 efl&|=cf,po,af,nz,pl,nv 932 * @optest intel / efl&~=af ax=0x000f -> ax=0x0105 efl&|=cf,po,af,nz,pl,nv 933 * @optest amd / efl&~=af ax=0x000f -> ax=0x0105 efl&|=cf,pe,af,nz,pl,nv 934 * @optest intel / efl&~=af ax=0x020f -> ax=0x0305 efl&|=cf,po,af,nz,pl,nv 935 * @optest amd / efl&~=af ax=0x020f -> ax=0x0305 efl&|=cf,pe,af,nz,pl,nv 923 936 */ 924 937 FNIEMOP_DEF(iemOp_aaa) … … 1013 1026 * @opflundef pf,zf,sf,of 1014 1027 * @opgroup og_gen_arith_dec 1015 * @optest efl&~=af ax=0x0009 -> efl&|=nc,po,na,nz,pl,nv 1016 * @optest efl&~=af ax=0x0000 -> efl&|=nc,po,na,zf,pl,nv 1017 * @optest efl&~=af ax=0x00f0 -> ax=0x0000 efl&|=nc,po,na,zf,pl,nv 1018 * @optest efl&~=af ax=0x00f9 -> ax=0x0009 efl&|=nc,po,na,nz,pl,nv 1019 * @optest efl|=af ax=0x0000 -> ax=0xfe0a efl&|=cf,po,af,nz,pl,nv 1020 * @optest efl|=af ax=0x0100 -> ax=0xff0a efl&|=cf,po,af,nz,pl,nv 1021 * @optest efl|=af ax=0x000a -> ax=0xff04 efl&|=cf,pe,af,nz,pl,nv 1022 * @optest efl|=af ax=0x010a -> ax=0x0004 efl&|=cf,pe,af,nz,pl,nv 1023 * @optest efl|=af ax=0x020a -> ax=0x0104 efl&|=cf,pe,af,nz,pl,nv 1024 * @optest efl|=af ax=0x0f0a -> ax=0x0e04 efl&|=cf,pe,af,nz,pl,nv 1025 * @optest efl|=af ax=0x7f0a -> ax=0x7e04 efl&|=cf,pe,af,nz,pl,nv 1026 * @optest efl|=af ax=0xff0a -> ax=0xfe04 efl&|=cf,pe,af,nz,pl,nv 1027 * @optest efl&~=af ax=0xff0a -> ax=0xfe04 efl&|=cf,pe,af,nz,pl,nv 1028 * @optest efl&~=af ax=0xff09 -> ax=0xff09 efl&|=nc,po,na,nz,pl,nv 1029 * @optest efl&~=af ax=0x000b -> ax=0xff05 efl&|=cf,po,af,nz,pl,nv 1030 * @optest efl&~=af ax=0x000c -> ax=0xff06 efl&|=cf,po,af,nz,pl,nv 1031 * @optest efl&~=af ax=0x000d -> ax=0xff07 efl&|=cf,pe,af,nz,pl,nv 1032 * @optest efl&~=af ax=0x000e -> ax=0xff08 efl&|=cf,pe,af,nz,pl,nv 1033 * @optest efl&~=af ax=0x000f -> ax=0xff09 efl&|=cf,po,af,nz,pl,nv 1028 * @optest / efl&~=af ax=0x0009 -> efl&|=nc,po,na,nz,pl,nv 1029 * @optest / efl&~=af ax=0x0000 -> efl&|=nc,po,na,zf,pl,nv 1030 * @optest intel / efl&~=af ax=0x00f0 -> ax=0x0000 efl&|=nc,po,na,zf,pl,nv 1031 * @optest amd / efl&~=af ax=0x00f0 -> ax=0x0000 efl&|=nc,po,na,nz,pl,nv 1032 * @optest / efl&~=af ax=0x00f9 -> ax=0x0009 efl&|=nc,po,na,nz,pl,nv 1033 * @optest intel / efl|=af ax=0x0000 -> ax=0xfe0a efl&|=cf,po,af,nz,pl,nv 1034 * @optest amd / efl|=af ax=0x0000 -> ax=0xfe0a efl&|=cf,po,af,nz,ng,nv 1035 * @optest intel / efl|=af ax=0x0100 -> ax=0xff0a efl&|=cf,po,af,nz,pl,nv 1036 * @optest8 amd / efl|=af ax=0x0100 -> ax=0xff0a efl&|=cf,po,af,nz,ng,nv 1037 * @optest intel / efl|=af ax=0x000a -> ax=0xff04 efl&|=cf,pe,af,nz,pl,nv 1038 * @optest10 amd / efl|=af ax=0x000a -> ax=0xff04 efl&|=cf,pe,af,nz,ng,nv 1039 * @optest / efl|=af ax=0x010a -> ax=0x0004 efl&|=cf,pe,af,nz,pl,nv 1040 * @optest / efl|=af ax=0x020a -> ax=0x0104 efl&|=cf,pe,af,nz,pl,nv 1041 * @optest / efl|=af ax=0x0f0a -> ax=0x0e04 efl&|=cf,pe,af,nz,pl,nv 1042 * @optest / efl|=af ax=0x7f0a -> ax=0x7e04 efl&|=cf,pe,af,nz,pl,nv 1043 * @optest intel / efl|=af ax=0xff0a -> ax=0xfe04 efl&|=cf,pe,af,nz,pl,nv 1044 * @optest amd / efl|=af ax=0xff0a -> ax=0xfe04 efl&|=cf,pe,af,nz,ng,nv 1045 * @optest intel / efl&~=af ax=0xff0a -> ax=0xfe04 efl&|=cf,pe,af,nz,pl,nv 1046 * @optest amd / efl&~=af ax=0xff0a -> ax=0xfe04 efl&|=cf,pe,af,nz,ng,nv 1047 * @optest intel / efl&~=af ax=0xff09 -> ax=0xff09 efl&|=nc,po,na,nz,pl,nv 1048 * @optest amd / efl&~=af ax=0xff09 -> ax=0xff09 efl&|=nc,po,na,nz,ng,nv 1049 * @optest intel / efl&~=af ax=0x000b -> ax=0xff05 efl&|=cf,po,af,nz,pl,nv 1050 * @optest22 amd / efl&~=af ax=0x000b -> ax=0xff05 efl&|=cf,po,af,nz,ng,nv 1051 * @optest intel / efl&~=af ax=0x000c -> ax=0xff06 efl&|=cf,po,af,nz,pl,nv 1052 * @optest24 amd / efl&~=af ax=0x000c -> ax=0xff06 efl&|=cf,po,af,nz,ng,nv 1053 * @optest intel / efl&~=af ax=0x000d -> ax=0xff07 efl&|=cf,pe,af,nz,pl,nv 1054 * @optest26 amd / efl&~=af ax=0x000d -> ax=0xff07 efl&|=cf,pe,af,nz,ng,nv 1055 * @optest intel / efl&~=af ax=0x000e -> ax=0xff08 efl&|=cf,pe,af,nz,pl,nv 1056 * @optest28 amd / efl&~=af ax=0x000e -> ax=0xff08 efl&|=cf,pe,af,nz,ng,nv 1057 * @optest intel / efl&~=af ax=0x000f -> ax=0xff09 efl&|=cf,po,af,nz,pl,nv 1058 * @optest30 amd / efl&~=af ax=0x000f -> ax=0xff09 efl&|=cf,po,af,nz,ng,nv 1059 * @optest31 intel / efl&~=af ax=0x00fa -> ax=0xff04 efl&|=cf,pe,af,nz,pl,nv 1060 * @optest32 amd / efl&~=af ax=0x00fa -> ax=0xff04 efl&|=cf,pe,af,nz,ng,nv 1061 * @optest33 intel / efl&~=af ax=0xfffa -> ax=0xfe04 efl&|=cf,pe,af,nz,pl,nv 1062 * @optest34 amd / efl&~=af ax=0xfffa -> ax=0xfe04 efl&|=cf,pe,af,nz,ng,nv 1034 1063 */ 1035 1064 FNIEMOP_DEF(iemOp_aas) -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py
r66457 r66462 1269 1269 self.fUnused = False; ##< Unused instruction. 1270 1270 self.fInvalid = False; ##< Invalid instruction (like UD2). 1271 self.sInvalidStyle = None; ##< Invalid behviour style 1271 self.sInvalidStyle = None; ##< Invalid behviour style (g_kdInvalidStyles), 1272 1272 self.sXcptType = None; ##< Exception type (g_kdXcptTypes). 1273 1273 ## @} … … 1557 1557 '@optestignore': self.parseTagOpTestIgnore, 1558 1558 '@opcopytests': self.parseTagOpCopyTests, 1559 '@oponly': self.parseTagOpOnlyTest, 1559 1560 '@oponlytest': self.parseTagOpOnlyTest, 1560 1561 '@opxcpttype': self.parseTagOpXcptType, … … 1563 1564 '@opdone': self.parseTagOpDone, 1564 1565 }; 1566 for i in range(48): 1567 self.dTagHandlers['@optest%u' % (i,)] = self.parseTagOpTestNum; 1568 self.dTagHandlers['@optest[%u]' % (i,)] = self.parseTagOpTestNum; 1565 1569 1566 1570 self.asErrors = []; … … 2490 2494 return True; 2491 2495 2496 def parseTagOpTestNum(self, sTag, aasSections, iTagLine, iEndLine): 2497 """ 2498 Numbered \@optest tag. Either \@optest42 or \@optest[42]. 2499 """ 2500 oInstr = self.ensureInstructionForOpTag(iTagLine); 2501 2502 iTest = 0; 2503 if sTag[-1] == ']': 2504 iTest = int(sTag[8:-1]); 2505 else: 2506 iTest = int(sTag[7:]); 2507 2508 if iTest != len(oInstr.aoTests): 2509 self.errorComment(iTagLine, '%s: incorrect test number: %u, actual %u' % (sTag, iTest, len(oInstr.aoTests),)); 2510 return self.parseTagOpTest(sTag, aasSections, iTagLine, iEndLine); 2511 2492 2512 def parseTagOpTestIgnore(self, sTag, aasSections, iTagLine, iEndLine): 2493 2513 """ … … 2533 2553 def parseTagOpOnlyTest(self, sTag, aasSections, iTagLine, iEndLine): 2534 2554 """ 2535 Tag: \@oponlytest 2555 Tag: \@oponlytest | \@oponly 2536 2556 Value: none 2537 2557 -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h
r66457 r66462 5938 5938 * APMv4 rev 3.17 page 509. 5939 5939 * @todo Test this instruction on AMD Ryzen. 5940 * @oponlytest5941 5940 */ 5942 5941 FNIEMOP_DEF_1(iemOp_VGrp15_vstmxcsr, uint8_t, bRm) … … 6786 6785 * @opcode 0xb9 6787 6786 * @opinvalid intel-modrm 6788 * @optest op1=1 op2=2->6787 * @optest -> 6789 6788 */ 6790 6789 FNIEMOP_DEF(iemOp_Grp10) … … 6794 6793 * too. See bs3-cpu-decoder-1.c32. So, we can forward to iemOp_InvalidNeedRM. 6795 6794 */ 6796 /** @todo fix bs3-cpu-generated-1 to deal with this on AMD! */6797 6795 Log(("iemOp_Grp10 aka UD1 -> #UD\n")); 6798 6796 IEMOP_MNEMONIC2EX(ud1, "ud1", RM, UD1, ud1, Gb, Eb, DISOPTYPE_INVALID, IEMOPHINT_IGNORES_OP_SIZE); /* just picked Gb,Eb here. */ -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-data.py
r66334 r66462 315 315 elif oInstr.fInvalid: 316 316 self.asFlags.append('BS3CG1INSTR_F_INVALID'); 317 if oInstr.sInvalidStyle and oInstr.sInvalidStyle.startswith('intel-'): 318 self.asFlags.append('BS3CG1INSTR_F_INTEL_DECODES_INVALID'); 317 319 318 320 self.fAdvanceMnemonic = True; ##< Set by the caller. … … 350 352 def getInstructionEntry(self): 351 353 """ Returns an array of BS3CG1INSTR member initializers. """ 354 sOperands = ', '.join([oOp.sType for oOp in self.oInstr.aoOperands]); 355 if sOperands: 356 sOperands = ' /* ' + sOperands + ' */'; 352 357 return [ 353 ' /* cbOpcodes = */ %s, ' % (len(self.asOpcodes),),354 ' /* cOperands = */ %s, ' % (len(self.oInstr.aoOperands),),355 ' /* cchMnemonic = */ %s, ' % (len(self.oInstr.sMnemonic),),358 ' /* cbOpcodes = */ %s, /* %s */' % (len(self.asOpcodes), ' '.join(self.asOpcodes),), 359 ' /* cOperands = */ %s,%s' % (len(self.oInstr.aoOperands), sOperands,), 360 ' /* cchMnemonic = */ %s, /* %s */' % (len(self.oInstr.sMnemonic), self.oInstr.sMnemonic,), 356 361 ' /* fAdvanceMnemonic = */ %s,' % ('true' if self.fAdvanceMnemonic else 'false',), 357 362 ' /* offTests = */ %s,' % (self.oTests.offTests,), -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c
r66457 r66462 1264 1264 { 1265 1265 BS3CG1_DPRINTF(("Bs3MemSet(%p,%#x,%#x)\n", &pThis->pbDataPg[X86_PAGE_SIZE - cbOp - cbMissalign], 0xcc, cbOp - cbMissalign)); 1266 ASMHalt();1267 1266 Bs3MemSet(&pThis->pbDataPg[X86_PAGE_SIZE - cbOp - cbMissalign], 0xcc, cbOp - cbMissalign); 1268 1267 break; … … 2201 2200 2202 2201 default: 2203 ASMHalt();2204 2202 Bs3TestFailedF("Invalid/unimplemented enmEncoding for instruction #%RU32 (%.*s): %d", 2205 2203 pThis->iInstr, pThis->cchMnemonic, pThis->pchMnemonic, pThis->enmEncoding); … … 2207 2205 } 2208 2206 return true; 2207 } 2208 2209 2210 /** 2211 * Calculates the appropriate non-intel invalid instruction encoding. 2212 * 2213 * @returns the encoding to use instead. 2214 * @param enmEncoding The intel invalid instruction encoding. 2215 */ 2216 static BS3CG1ENC Bs3Cg1CalcNoneIntelInvalidEncoding(BS3CG1ENC enmEncoding) 2217 { 2218 switch (enmEncoding) 2219 { 2220 case BS3CG1ENC_MODRM_Gb_Eb: 2221 case BS3CG1ENC_FIXED: 2222 return BS3CG1ENC_FIXED; 2223 default: 2224 Bs3TestFailedF("Bs3Cg1CalcNoneIntelInvalidEncoding: Unsupported encoding: %d\n", enmEncoding); 2225 return BS3CG1ENC_FIXED; 2226 } 2209 2227 } 2210 2228 … … 3508 3526 } 3509 3527 3528 /* Switch the encoder for some of the invalid instructions on non-intel CPUs. */ 3529 if ( (pThis->fFlags & BS3CG1INSTR_F_INTEL_DECODES_INVALID) 3530 && pThis->bCpuVendor != BS3CPUVENDOR_INTEL 3531 && ( (pThis->fFlags & (BS3CG1INSTR_F_UNUSED | BS3CG1INSTR_F_INVALID)) 3532 || (BS3_MODE_IS_64BIT_CODE(pThis->bMode) && (pThis->fFlags & BS3CG1INSTR_F_INVALID_64BIT)) ) ) 3533 pThis->enmEncoding = Bs3Cg1CalcNoneIntelInvalidEncoding(pThis->enmEncoding); 3534 3510 3535 /* 3511 3536 * Check if the CPU supports the instruction. -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h
r66457 r66462 243 243 * @{ */ 244 244 /** Defaults to SS rather than DS. */ 245 #define BS3CG1INSTR_F_DEF_SS UINT32_C(0x00000001)245 #define BS3CG1INSTR_F_DEF_SS UINT32_C(0x00000001) 246 246 /** Invalid instruction in 64-bit mode. */ 247 #define BS3CG1INSTR_F_INVALID_64BIT UINT32_C(0x00000002)247 #define BS3CG1INSTR_F_INVALID_64BIT UINT32_C(0x00000002) 248 248 /** Unused instruction. */ 249 #define BS3CG1INSTR_F_UNUSED UINT32_C(0x00000004)249 #define BS3CG1INSTR_F_UNUSED UINT32_C(0x00000004) 250 250 /** Invalid instruction. */ 251 #define BS3CG1INSTR_F_INVALID UINT32_C(0x00000008) 251 #define BS3CG1INSTR_F_INVALID UINT32_C(0x00000008) 252 /** Only intel does full ModR/M(, ++) decoding for invalid instruction. 253 * Always used with BS3CG1INSTR_F_INVALID or BS3CG1INSTR_F_UNUSED. */ 254 #define BS3CG1INSTR_F_INTEL_DECODES_INVALID UINT32_C(0x00000010) 252 255 /** @} */ 253 256
Note:
See TracChangeset
for help on using the changeset viewer.