VirtualBox

Changeset 40174 in vbox for trunk/src


Ignore:
Timestamp:
Feb 18, 2012 9:19:07 PM (13 years ago)
Author:
vboxsync
Message:

checked out some todos.

Location:
trunk/src/VBox/VMM
Files:
5 edited

Legend:

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

    r40169 r40174  
    61136113
    61146114/** The instruction allows no lock prefixing (in this encoding), throw #UD if
    6115  * lock prefixed. */
     6115 * lock prefixed.
     6116 * @deprecated  IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX */
    61166117#define IEMOP_HLP_NO_LOCK_PREFIX() \
    61176118    do \
     
    61386139    } while (0)
    61396140
     6141/**
     6142 * Done decoding.
     6143 */
     6144#define IEMOP_HLP_DONE_DECODING() \
     6145    do \
     6146    { \
     6147        /*nothing for now, maybe later... */ \
     6148    } while (0)
     6149
     6150/**
     6151 * Done decoding, raise \#UD exception if lock prefix present.
     6152 */
     6153#define IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX() \
     6154    do \
     6155    { \
     6156        if (pIemCpu->fPrefixes & IEM_OP_PRF_LOCK) \
     6157            return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     6158    } while (0)
    61406159
    61416160
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r40169 r40174  
    10741074        pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_32BIT;
    10751075
    1076     /** @todo Verify that the the invalid lock sequence exception (\#UD) is raised
    1077      *        before the privilege level violation (\#GP). */
    10781076    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    10791077    uint8_t iCrReg = ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg;
     
    10821080        /* The lock prefix can be used to encode CR8 accesses on some CPUs. */
    10831081        if (!IEM_IS_AMD_CPUID_FEATURE_PRESENT_ECX(X86_CPUID_AMD_FEATURE_ECX_CR8L))
    1084             return IEMOP_RAISE_INVALID_LOCK_PREFIX();
     1082            return IEMOP_RAISE_INVALID_LOCK_PREFIX(); /* #UD takes precedence over #GP(), see test. */
    10851083        iCrReg |= 8;
    10861084    }
     
    10921090            return IEMOP_RAISE_INVALID_OPCODE();
    10931091    }
     1092    IEMOP_HLP_DONE_DECODING();
    10941093
    10951094    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Rd_Cd, (X86_MODRM_RM_MASK & bRm) | pIemCpu->uRexB, iCrReg);
     
    11211120        pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_32BIT;
    11221121
    1123     /** @todo Verify that the the invalid lock sequence exception (\#UD) is raised
    1124      *        before the privilege level violation (\#GP). */
    11251122    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    11261123    uint8_t iCrReg = ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg;
     
    11291126        /* The lock prefix can be used to encode CR8 accesses on some CPUs. */
    11301127        if (!IEM_IS_AMD_CPUID_FEATURE_PRESENT_ECX(X86_CPUID_AMD_FEATURE_ECX_CR8L))
    1131             return IEMOP_RAISE_INVALID_LOCK_PREFIX();
     1128            return IEMOP_RAISE_INVALID_LOCK_PREFIX(); /* #UD takes precedence over #GP(), see test. */
    11321129        iCrReg |= 8;
    11331130    }
     
    11391136            return IEMOP_RAISE_INVALID_OPCODE();
    11401137    }
     1138    IEMOP_HLP_DONE_DECODING();
    11411139
    11421140    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Cd_Rd, iCrReg, (X86_MODRM_RM_MASK & bRm) | pIemCpu->uRexB);
     
    11491147    IEMOP_MNEMONIC("mov Dd,Rd");
    11501148    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1151     IEMOP_HLP_NO_LOCK_PREFIX();
     1149    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    11521150    if (pIemCpu->fPrefixes & IEM_OP_PRF_REX_R)
    11531151        return IEMOP_RAISE_INVALID_OPCODE();
     
    11621160{
    11631161    IEMOP_MNEMONIC("mov Rd,Td");
    1164 /** @todo Is the invalid opcode raise before parsing any R/M byte? */
     1162    /* The RM byte is not considered, see testcase. */
    11651163    return IEMOP_RAISE_INVALID_OPCODE();
    11661164}
    1167 
    11681165
    11691166
     
    11721169{
    11731170    IEMOP_MNEMONIC("mov Td,Rd");
     1171    /* The RM byte is not considered, see testcase. */
    11741172    return IEMOP_RAISE_INVALID_OPCODE();
    11751173}
     
    1258112579    /* Registers? How?? */
    1258212580    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    12583     {
    12584         /** @todo How the heck does a 'callf eax' work? Probably just have to
    12585          *        search the docs... */
    12586         AssertFailedReturn(VERR_IEM_ASPECT_NOT_IMPLEMENTED);
    12587     }
     12581        return IEMOP_RAISE_INVALID_OPCODE(); /* callf eax is not legal */
    1258812582
    1258912583    /* Far pointer loaded from memory. */
     
    1273012724       implementation. */
    1273112725    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    12732     {
    12733         /** @todo How the heck does a 'callf eax' work? Probably just have to
    12734          *        search the docs... */
    12735         AssertFailedReturn(VERR_IEM_ASPECT_NOT_IMPLEMENTED);
    12736     }
     12726        return IEMOP_RAISE_INVALID_OPCODE(); /* jmpf eax is not legal */
    1273712727
    1273812728    /* Far pointer loaded from memory. */
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r40169 r40174  
    9191#define IEMOP_HLP_NO_64BIT()                                do { } while (0)
    9292#define IEMOP_HLP_DEFAULT_64BIT_OP_SIZE()                   do { } while (0)
     93#define IEMOP_HLP_DONE_DECODING()                           do { } while (0)
     94#define IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX()            do { } while (0)
    9395#define IEMOP_RAISE_DIVIDE_ERROR()                          VERR_TRPM_ACTIVE_TRAP
    9496#define IEMOP_RAISE_INVALID_OPCODE()                        VERR_TRPM_ACTIVE_TRAP
  • trunk/src/VBox/VMM/testcase/tstX86-1.cpp

    r40138 r40174  
    7272DECLASM(int32_t) x861_Test5(void);
    7373DECLASM(int32_t) x861_Test6(void);
     74DECLASM(int32_t) x861_Test7(void);
    7475DECLASM(int32_t) x861_TestFPUInstr1(void);
    7576
     
    241242        if (rc != 0)
    242243            RTTestFailed(hTest, "x861_Test4 -> %d", rc);
    243 
     244#endif
     245
     246        RTTestSub(hTest, "Odd encodings and odd ends");
     247        rc = x861_Test5();
     248        if (rc != 0)
     249            RTTestFailed(hTest, "x861_Test5 -> %d", rc);
     250
     251#if 0
    244252        RTTestSub(hTest, "Odd floating point encodings");
    245         rc = x861_Test5();
     253        rc = x861_Test6();
    246254        if (rc != 0)
    247255            RTTestFailed(hTest, "x861_Test5 -> %d", rc);
    248256
    249257        RTTestSub(hTest, "Floating point exceptions ++");
    250         rc = x861_Test6();
     258        rc = x861_Test7();
    251259        if (rc != 0)
    252260            RTTestFailed(hTest, "x861_Test6 -> %d", rc);
    253 #endif
    254261
    255262        rc = x861_TestFPUInstr1();
    256263        if (rc != 0)
    257264            RTTestFailed(hTest, "x861_TestFPUInstr1 -> %d", rc);
     265#endif
    258266    }
    259267
  • trunk/src/VBox/VMM/testcase/tstX86-1A.asm

    r40164 r40174  
    180180iend
    181181BEGINCODE
     182%%resume:
     183%endmacro
     184
     185;;
     186; Macro for recording a trapping instruction in the exec page.
     187;
     188; @uses     xAX, xDX
     189; @param        1       The trap number.
     190; @param        2       The offset into the exec page.
     191%macro ShouldTrapExecPage 2
     192        lea     xDX, [REF(NAME(g_aTrapInfoExecPage))]
     193        lea     xAX, [REF(%%resume)]
     194        mov     byte [xDX + TRAPINFO.cbInstr],  PAGE_SIZE - (%2)
     195        mov     byte [xDX + TRAPINFO.u8TrapNo], %1
     196        mov     [xDX + TRAPINFO.uResumePC],     xAX
     197        mov     xAX, [REF_EXTERN(g_pbEfExecPage)]
     198        lea     xAX, [xAX + (%2)]
     199        mov     [xDX + TRAPINFO.uTrapPC],       xAX
     200        jmp     xAX
    182201%%resume:
    183202%endmacro
     
    17061725        ret
    17071726ENDPROC     x861_Test4
     1727
     1728
     1729;;
     1730; Tests various odd/weird/bad encodings.
     1731;
     1732BEGINPROC   x861_Test5
     1733        SAVE_ALL_PROLOGUE
     1734        call    x861_ClearRegisters
     1735
     1736%if 0
     1737        ; callf eax...
     1738        ShouldTrap X86_XCPT_UD, db 0xff, 11011000b
     1739        ShouldTrap X86_XCPT_UD, db 0xff, 11011001b
     1740        ShouldTrap X86_XCPT_UD, db 0xff, 11011010b
     1741        ShouldTrap X86_XCPT_UD, db 0xff, 11011011b
     1742        ShouldTrap X86_XCPT_UD, db 0xff, 11011100b
     1743        ShouldTrap X86_XCPT_UD, db 0xff, 11011101b
     1744        ShouldTrap X86_XCPT_UD, db 0xff, 11011110b
     1745        ShouldTrap X86_XCPT_UD, db 0xff, 11011111b
     1746
     1747        ; jmpf eax...
     1748        ShouldTrap X86_XCPT_UD, db 0xff, 11101000b
     1749        ShouldTrap X86_XCPT_UD, db 0xff, 11101001b
     1750        ShouldTrap X86_XCPT_UD, db 0xff, 11101010b
     1751        ShouldTrap X86_XCPT_UD, db 0xff, 11101011b
     1752        ShouldTrap X86_XCPT_UD, db 0xff, 11101100b
     1753        ShouldTrap X86_XCPT_UD, db 0xff, 11101101b
     1754        ShouldTrap X86_XCPT_UD, db 0xff, 11101110b
     1755        ShouldTrap X86_XCPT_UD, db 0xff, 11101111b
     1756
     1757        ; #GP(0) vs #UD.
     1758        ShouldTrap X86_XCPT_GP, mov xAX, cr0
     1759        ShouldTrap X86_XCPT_UD, lock mov xAX, cr0
     1760        ShouldTrap X86_XCPT_GP, mov cr0, xAX
     1761        ShouldTrap X86_XCPT_UD, lock mov cr0, xAX
     1762        ShouldTrap X86_XCPT_UD, db 0x0f, 0x20,11001000b ; mov xAX, cr1
     1763        ShouldTrap X86_XCPT_UD, db 0x0f, 0x20,11101000b ; mov xAX, cr5
     1764        ShouldTrap X86_XCPT_UD, db 0x0f, 0x20,11110000b ; mov xAX, cr6
     1765        ShouldTrap X86_XCPT_UD, db 0x0f, 0x20,11111000b ; mov xAX, cr7
     1766        ShouldTrap X86_XCPT_GP, mov xAX, dr7
     1767        ShouldTrap X86_XCPT_UD, lock mov xAX, dr7
     1768
     1769        ; The MOD is ignored by MOV CRx,GReg and MOV GReg,CRx
     1770        ShouldTrap X86_XCPT_GP, db 0x0f, 0x20,00000000b ; mov xAX, cr0
     1771        ShouldTrap X86_XCPT_GP, db 0x0f, 0x20,01000000b ; mov xAX, cr0
     1772        ShouldTrap X86_XCPT_GP, db 0x0f, 0x20,10000000b ; mov xAX, cr0
     1773        ShouldTrap X86_XCPT_GP, db 0x0f, 0x20,11000000b ; mov xAX, cr0
     1774        ShouldTrap X86_XCPT_GP, db 0x0f, 0x22,00000000b ; mov cr0, xAX
     1775        ShouldTrap X86_XCPT_GP, db 0x0f, 0x22,01000000b ; mov cr0, xAX
     1776        ShouldTrap X86_XCPT_GP, db 0x0f, 0x22,10000000b ; mov cr0, xAX
     1777        ShouldTrap X86_XCPT_GP, db 0x0f, 0x22,11000000b ; mov cr0, xAX
     1778%endif
     1779
     1780        ; mov eax, tr0, 0x0f 0x24
     1781        ShouldTrap X86_XCPT_UD, db 0x0f, 0x24, 0xc0     ; mov xAX, tr1
     1782
     1783        mov     xAX, [REF_EXTERN(g_pbEfExecPage)]
     1784        add     xAX, PAGE_SIZE - 3
     1785        mov     byte [xAX    ], 0x0f
     1786        mov     byte [xAX + 1], 0x24
     1787        mov     byte [xAX + 2], 0xc0
     1788        ShouldTrapExecPage X86_XCPT_UD, PAGE_SIZE - 3
     1789
     1790        mov     xAX, [REF_EXTERN(g_pbEfExecPage)]
     1791        add     xAX, PAGE_SIZE - 2
     1792        mov     byte [xAX    ], 0x0f
     1793        mov     byte [xAX + 1], 0x24
     1794        ShouldTrapExecPage X86_XCPT_UD, PAGE_SIZE - 2
     1795
     1796.success:
     1797        xor     eax, eax
     1798.return:
     1799        SAVE_ALL_EPILOGUE
     1800        ret
     1801ENDPROC     x861_Test5
    17081802
    17091803
     
    19552049; Tests some odd floating point instruction encodings.
    19562050;
    1957 BEGINPROC   x861_Test5
     2051BEGINPROC   x861_Test6
    19582052        SAVE_ALL_PROLOGUE
    19592053
     
    21672261        ret
    21682262
    2169 ENDPROC     x861_Test5
     2263ENDPROC     x861_Test6
    21702264
    21712265
     
    21752269;
    21762270;
    2177 BEGINPROC   x861_Test6
     2271BEGINPROC   x861_Test7
    21782272        SAVE_ALL_PROLOGUE
    21792273        sub     xSP, 2048
     
    22922386        SAVE_ALL_EPILOGUE
    22932387        ret
    2294 ENDPROC     x861_Test6
     2388ENDPROC     x861_Test7
    22952389
    22962390
     
    28542948; Terminate the trap info array with a NIL entry.
    28552949BEGINDATA
     2950GLOBALNAME g_aTrapInfoExecPage
     2951istruc TRAPINFO
     2952        at TRAPINFO.uTrapPC,    RTCCPTR_DEF     1
     2953        at TRAPINFO.uResumePC,  RTCCPTR_DEF     1
     2954        at TRAPINFO.u8TrapNo,   db              16
     2955        at TRAPINFO.cbInstr,    db              3
     2956iend
    28562957GLOBALNAME g_aTrapInfoEnd
    28572958istruc TRAPINFO
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