VirtualBox

Changeset 66462 in vbox


Ignore:
Timestamp:
Apr 6, 2017 1:38:13 PM (8 years ago)
Author:
vboxsync
Message:

IEM,bs3-cpu-generated-1: Made the current testcases pass on AMD.

Location:
trunk/src/VBox
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r66457 r66462  
    180180    uint32_t fEFlags = pCtx->eflags.u;
    181181    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 */
     198static 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);
    182204    pCtx->eflags.u &= ~(fToUpdate | fUndefined);
    183205    pCtx->eflags.u |= (fToUpdate | fUndefined) & fEFlags;
     
    64886510    PCPUMCTX pCtx = IEM_GET_CTX(pVCpu);
    64896511
    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);
    64976531    }
    64986532    else
    64996533    {
    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
    65066550    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    65076551    return VINF_SUCCESS;
     
    65166560    PCPUMCTX pCtx = IEM_GET_CTX(pVCpu);
    65176561
    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);
    65266581    }
    65276582    else
    65286583    {
    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
    65356600    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    65366601    return VINF_SUCCESS;
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h

    r66457 r66462  
    903903 * @opflundef   pf,zf,sf,of
    904904 * @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
    923936 */
    924937FNIEMOP_DEF(iemOp_aaa)
     
    10131026 * @opflundef   pf,zf,sf,of
    10141027 * @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
    10341063 */
    10351064FNIEMOP_DEF(iemOp_aas)
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r66457 r66462  
    12691269        self.fUnused        = False;    ##< Unused instruction.
    12701270        self.fInvalid       = False;    ##< Invalid instruction (like UD2).
    1271         self.sInvalidStyle  = None;     ##< Invalid behviour style
     1271        self.sInvalidStyle  = None;     ##< Invalid behviour style (g_kdInvalidStyles),
    12721272        self.sXcptType      = None;     ##< Exception type (g_kdXcptTypes).
    12731273        ## @}
     
    15571557            '@optestignore': self.parseTagOpTestIgnore,
    15581558            '@opcopytests': self.parseTagOpCopyTests,
     1559            '@oponly':      self.parseTagOpOnlyTest,
    15591560            '@oponlytest':  self.parseTagOpOnlyTest,
    15601561            '@opxcpttype':  self.parseTagOpXcptType,
     
    15631564            '@opdone':      self.parseTagOpDone,
    15641565        };
     1566        for i in range(48):
     1567            self.dTagHandlers['@optest%u' % (i,)]   = self.parseTagOpTestNum;
     1568            self.dTagHandlers['@optest[%u]' % (i,)] = self.parseTagOpTestNum;
    15651569
    15661570        self.asErrors = [];
     
    24902494        return True;
    24912495
     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
    24922512    def parseTagOpTestIgnore(self, sTag, aasSections, iTagLine, iEndLine):
    24932513        """
     
    25332553    def parseTagOpOnlyTest(self, sTag, aasSections, iTagLine, iEndLine):
    25342554        """
    2535         Tag:        \@oponlytest
     2555        Tag:        \@oponlytest | \@oponly
    25362556        Value:      none
    25372557
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r66457 r66462  
    59385938 *              APMv4 rev 3.17 page 509.
    59395939 * @todo        Test this instruction on AMD Ryzen.
    5940  * @oponlytest
    59415940 */
    59425941FNIEMOP_DEF_1(iemOp_VGrp15_vstmxcsr,  uint8_t, bRm)
     
    67866785 * @opcode      0xb9
    67876786 * @opinvalid   intel-modrm
    6788  * @optest      op1=1 op2=2 ->
     6787 * @optest      ->
    67896788 */
    67906789FNIEMOP_DEF(iemOp_Grp10)
     
    67946793     * too. See bs3-cpu-decoder-1.c32.  So, we can forward to iemOp_InvalidNeedRM.
    67956794     */
    6796     /** @todo fix bs3-cpu-generated-1 to deal with this on AMD! */
    67976795    Log(("iemOp_Grp10 aka UD1 -> #UD\n"));
    67986796    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  
    315315        elif oInstr.fInvalid:
    316316            self.asFlags.append('BS3CG1INSTR_F_INVALID');
     317        if oInstr.sInvalidStyle and oInstr.sInvalidStyle.startswith('intel-'):
     318            self.asFlags.append('BS3CG1INSTR_F_INTEL_DECODES_INVALID');
    317319
    318320        self.fAdvanceMnemonic   = True; ##< Set by the caller.
     
    350352    def getInstructionEntry(self):
    351353        """ Returns an array of BS3CG1INSTR member initializers. """
     354        sOperands = ', '.join([oOp.sType for oOp in self.oInstr.aoOperands]);
     355        if sOperands:
     356            sOperands = ' /* ' + sOperands + ' */';
    352357        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,),
    356361            '        /* fAdvanceMnemonic = */ %s,' % ('true' if self.fAdvanceMnemonic else 'false',),
    357362            '        /* offTests = */         %s,' % (self.oTests.offTests,),
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r66457 r66462  
    12641264        {
    12651265            BS3CG1_DPRINTF(("Bs3MemSet(%p,%#x,%#x)\n", &pThis->pbDataPg[X86_PAGE_SIZE - cbOp - cbMissalign], 0xcc, cbOp - cbMissalign));
    1266             ASMHalt();
    12671266            Bs3MemSet(&pThis->pbDataPg[X86_PAGE_SIZE - cbOp - cbMissalign], 0xcc, cbOp - cbMissalign);
    12681267            break;
     
    22012200
    22022201        default:
    2203             ASMHalt();
    22042202            Bs3TestFailedF("Invalid/unimplemented enmEncoding for instruction #%RU32 (%.*s): %d",
    22052203                           pThis->iInstr, pThis->cchMnemonic, pThis->pchMnemonic, pThis->enmEncoding);
     
    22072205    }
    22082206    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 */
     2216static 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    }
    22092227}
    22102228
     
    35083526        }
    35093527
     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
    35103535        /*
    35113536         * Check if the CPU supports the instruction.
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h

    r66457 r66462  
    243243 * @{ */
    244244/** Defaults to SS rather than DS. */
    245 #define BS3CG1INSTR_F_DEF_SS            UINT32_C(0x00000001)
     245#define BS3CG1INSTR_F_DEF_SS                UINT32_C(0x00000001)
    246246/** Invalid instruction in 64-bit mode. */
    247 #define BS3CG1INSTR_F_INVALID_64BIT     UINT32_C(0x00000002)
     247#define BS3CG1INSTR_F_INVALID_64BIT         UINT32_C(0x00000002)
    248248/** Unused instruction. */
    249 #define BS3CG1INSTR_F_UNUSED            UINT32_C(0x00000004)
     249#define BS3CG1INSTR_F_UNUSED                UINT32_C(0x00000004)
    250250/** 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)
    252255/** @} */
    253256
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette