VirtualBox

Changeset 66184 in vbox


Ignore:
Timestamp:
Mar 21, 2017 5:22:09 PM (8 years ago)
Author:
vboxsync
Message:

bs3-cpu-generated-1: Partially switched to max bit-count workers.

Location:
trunk/src/VBox/ValidationKit/bootsectors
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r66174 r66184  
    192192    /** The flat address corresponding to pbCodePg.  */
    193193    uintptr_t               uCodePgFlat;
     194    /** The 16-bit address corresponding to pbCodePg if relevant for bMode.  */
     195    RTFAR16                 CodePgFar;
     196    /** The IP/EIP/RIP value for pbCodePg[0] relative to CS (bMode). */
     197    uintptr_t               CodePgRip;
     198
    194199    /** Page for placing data operands in.  When paging is enabled, the page before
    195200     * and after are marked not-present.  */
     
    17801785    if (BS3_MODE_IS_PAGED(pThis->bMode))
    17811786    {
     1787#if ARCH_BITS != 16
    17821788        Bs3MemGuardedTestPageFree(pThis->pbCodePg);
    17831789        Bs3MemGuardedTestPageFree(pThis->pbDataPg);
     1790#endif
    17841791    }
    17851792    else
     
    17981805 * @param   bMode               The mode being tested.
    17991806 */
    1800 static bool Bs3Cg1Init(PBS3CG1STATE pThis, uint8_t bMode, uint8_t cRings, uint8_t iFirstRing)
     1807bool BS3_CMN_NM(Bs3Cg1Init)(PBS3CG1STATE pThis, uint8_t bMode, uint8_t cRings, uint8_t iFirstRing)
    18011808{
    18021809    BS3MEMKIND const    enmMemKind = BS3_MODE_IS_RM_OR_V86(bMode) ? BS3MEMKIND_REAL
     
    18171824    if (BS3_MODE_IS_PAGED(bMode))
    18181825    {
     1826#if ARCH_BITS != 16
    18191827        pThis->pbCodePg = Bs3MemGuardedTestPageAlloc(enmMemKind);
    18201828        if (!pThis->pbCodePg)
     
    18341842            return 0;
    18351843        }
     1844#else
     1845        return Bs3TestFailed("WTF?! #1");
     1846#endif
    18361847    }
    18371848    else
     
    18501861    pThis->uDataPgFlat = Bs3SelPtrToFlat(pThis->pbDataPg);
    18511862#if ARCH_BITS == 16
     1863    pThis->CodePgFar.sel = BS3_FP_SEG(pThis->pbCodePg);
     1864    pThis->CodePgFar.off = BS3_FP_OFF(pThis->pbCodePg);
     1865    pThis->CodePgRip     = BS3_FP_OFF(pThis->pbCodePg);
     1866    pThis->DataPgFar.sel = BS3_FP_SEG(pThis->pbDataPg);
    18521867    pThis->DataPgFar.off = BS3_FP_OFF(pThis->pbDataPg);
    1853     pThis->DataPgFar.sel = BS3_FP_SEG(pThis->pbDataPg);
    18541868#else
    18551869    if (BS3_MODE_IS_RM_OR_V86(bMode))
     1870    {
    18561871        *(uint32_t *)&pThis->DataPgFar = Bs3SelFlatDataToRealMode(pThis->uDataPgFlat);
    1857     else if (!BS3_MODE_IS_64BIT_CODE(bMode))
     1872        ASMCompilerBarrier();
     1873        pThis->CodePgFar.off = 0;
     1874        pThis->CodePgFar.sel = pThis->uDataPgFlat >> 4;
     1875        pThis->CodePgRip = pThis->CodePgFar.off;
     1876    }
     1877    else if (BS3_MODE_IS_16BIT_CODE(bMode))
     1878    {
    18581879        *(uint32_t *)&pThis->DataPgFar = Bs3SelFlatDataToProtFar16(pThis->uDataPgFlat);
     1880        ASMCompilerBarrier();
     1881        pThis->CodePgFar.sel = BS3_SEL_SPARE_00;
     1882        pThis->CodePgFar.off = 0;
     1883        pThis->CodePgRip     = 0;
     1884    }
     1885    else if (BS3_MODE_IS_32BIT_CODE(bMode))
     1886    {
     1887        *(uint32_t *)&pThis->DataPgFar = Bs3SelFlatDataToProtFar16(pThis->uDataPgFlat);
     1888        ASMCompilerBarrier();
     1889        pThis->CodePgFar.sel = 0;
     1890        pThis->CodePgFar.off = 0;
     1891        pThis->CodePgRip     = (uintptr_t)pThis->pbCodePg;
     1892    }
    18591893    else
    1860         *(uint32_t *)&pThis->DataPgFar = 0;
     1894    {
     1895        pThis->DataPgFar.off = 0;
     1896        pThis->DataPgFar.sel = 0;
     1897        pThis->CodePgFar.off = 0;
     1898        pThis->CodePgFar.sel = 0;
     1899        pThis->CodePgRip     = (uintptr_t)pThis->pbCodePg;
     1900    }
    18611901#endif
    18621902
     
    18661906    if (BS3_MODE_IS_RM_OR_V86(bMode))
    18671907    {
     1908        pThis->aInitialCtxs[iFirstRing].cs = pThis->CodePgFar.sel;
     1909        BS3_ASSERT(iFirstRing + 1 >= cRings);
     1910    }
     1911    else if (BS3_MODE_IS_16BIT_CODE(bMode))
     1912    {
    18681913#if ARCH_BITS == 16
    1869         pThis->aInitialCtxs[iFirstRing].cs = BS3_FP_SEG(pThis->pbCodePg);
     1914        uintptr_t const uFlatCodePgSeg = Bs3SelPtrToFlat(BS3_FP_MAKE(BS3_FP_SEG(pThis->pbCodePg), 0));
    18701915#else
    1871         pThis->aInitialCtxs[iFirstRing].cs = Bs3SelFlatCodeToRealMode((uintptr_t)pThis->pbCodePg) >> 16;
     1916        uintptr_t const uFlatCodePgSeg = (uintptr_t)pThis->pbCodePg;
    18721917#endif
    1873         BS3_ASSERT(iFirstRing + 1 >= cRings);
    1874     }
    1875     else if (BS3_MODE_IS_16BIT_CODE(bMode))
    1876     {
    1877 #if ARCH_BITS == 16
    1878         uintptr_t const uFlatCodePg = Bs3SelPtrToFlat(BS3_FP_MAKE(BS3_FP_SEG(pThis->pbCodePg), 0));
    1879 #else
    1880         uintptr_t const uFlatCodePg = (uintptr_t)pThis->pbCodePg;
    1881 #endif
    1882         BS3_ASSERT(ARCH_BITS == 16);
    18831918        for (iRing = iFirstRing + 1; iRing < cRings; iRing++)
    18841919        {
     
    18891924        {
    18901925            pThis->aInitialCtxs[iRing].cs = BS3_SEL_SPARE_00 + iRing * 8 + iRing;
    1891             Bs3SelSetup16BitCode(&Bs3GdteSpare00 + iRing, uFlatCodePg, iRing);
     1926            Bs3SelSetup16BitCode(&Bs3GdteSpare00 + iRing, uFlatCodePgSeg, iRing);
    18921927        }
    18931928    }
     
    19021937    }
    19031938
     1939    ASMCompilerBarrier();
    19041940    return true;
    19051941}
    19061942
    19071943
    1908 BS3_DECL_FAR(uint8_t) BS3_CMN_NM(Bs3Cg1Worker)(uint8_t bMode)
    1909 {
    1910     BS3CG1STATE                 ThisIsIt;
    1911     PBS3CG1STATE                pThis = &ThisIsIt;
    1912     unsigned const              iFirstRing = BS3_MODE_IS_V86(bMode)       ? 3 : 0;
    1913     uint8_t const               cRings     = BS3_MODE_IS_RM_OR_V86(bMode) ? 1 : 4;
    1914     uint8_t                     iRing;
    1915     unsigned                    iInstr;
     1944static uint8_t BS3_CMN_NM(Bs3Cg1WorkerInner)(PBS3CG1STATE pThis, uint8_t bMode, uint8_t const cRings, uint8_t const iFirstRing)
     1945{
     1946    uint8_t  iRing;
     1947    unsigned iInstr;
    19161948
    19171949#if 0
    1918     if (bMode != BS3_MODE_PP16_V86)
     1950    if (bMode != BS3_MODE_LM16)
    19191951        return BS3TESTDOMODE_SKIPPED;
    19201952#endif
    1921 
    1922     /*
    1923      * Initalize the state.
    1924      */
    1925     if (!Bs3Cg1Init(pThis, bMode, cRings, iFirstRing))
    1926         return 1;
    19271953
    19281954    /*
     
    20202046                    {
    20212047                        /* Okay, set up the execution context. */
     2048                        unsigned         offCode;
    20222049                        uint8_t BS3_FAR *pbCode;
    20232050
    20242051                        Bs3MemCpy(&pThis->Ctx, &pThis->aInitialCtxs[iRing], sizeof(pThis->Ctx));
    20252052                        if (BS3_MODE_IS_PAGED(bMode))
    2026                             pbCode = &pThis->pbCodePg[X86_PAGE_SIZE - pThis->cbCurInstr];
     2053                        {
     2054                            offCode = X86_PAGE_SIZE - pThis->cbCurInstr;
     2055                            pbCode = &pThis->pbCodePg[offCode];
     2056                        }
    20272057                        else
    20282058                        {
     
    20302060                            pbCode[pThis->cbCurInstr]     = 0x0f; /* UD2 */
    20312061                            pbCode[pThis->cbCurInstr + 1] = 0x0b;
     2062                            offCode = 0;
    20322063                        }
     2064                        pThis->Ctx.rip.u = pThis->CodePgRip + offCode;
    20332065                        Bs3MemCpy(pbCode, pThis->abCurInstr, pThis->cbCurInstr);
    2034                         pThis->Ctx.rip.u = BS3_FP_OFF(pbCode);
    20352066
    20362067                        if (Bs3Cg1RunContextModifier(pThis, &pThis->Ctx, pHdr, pHdr->cbSelector, pHdr->cbInput, NULL, pbCode))
     
    20782109    }
    20792110
    2080     /*
    2081      * Clean up.
    2082      */
    2083     Bs3Cg1Destroy(pThis);
    2084     Bs3TestSubDone();
    2085 
    20862111#if 0
    20872112    if (bMode >= BS3_MODE_PE16_32)
     
    20952120}
    20962121
     2122
     2123BS3_DECL_FAR(uint8_t) BS3_CMN_NM(Bs3Cg1Worker)(uint8_t bMode)
     2124{
     2125    unsigned const  iFirstRing = BS3_MODE_IS_V86(bMode)       ? 3 : 0;
     2126    uint8_t const   cRings     = BS3_MODE_IS_RM_OR_V86(bMode) ? 1 : 4;
     2127    uint8_t         bRet       = 1;
     2128#if 1
     2129    BS3CG1STATE     This       = {0};
     2130    if (BS3_CMN_NM(Bs3Cg1Init)(&This, bMode, cRings, iFirstRing))
     2131    {
     2132        bRet = BS3_CMN_NM(Bs3Cg1WorkerInner)(&This, bMode, iFirstRing, cRings);
     2133
     2134        Bs3Cg1Destroy(&This);
     2135        Bs3TestSubDone();
     2136    }
     2137#else
     2138    PBS3CG1STATE pThis = (PBS3CG1STATE)Bs3MemAlloc(BS3MEMKIND_REAL, sizeof(*pThis));
     2139    if (pThis)
     2140    {
     2141
     2142        if (BS3_CMN_NM(Bs3Cg1Init)(pThis, bMode, cRings, iFirstRing))
     2143        {
     2144            bRet = BS3_CMN_NM(Bs3Cg1WorkerInner)(pThis, bMode, iFirstRing, cRings);
     2145
     2146            Bs3Cg1Destroy(pThis);
     2147            Bs3TestSubDone();
     2148        }
     2149        Bs3MemFree(pThis, sizeof(*pThis));
     2150    }
     2151#endif
     2152    return bRet;
     2153}
     2154
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.c

    r65959 r66184  
    3636*   Internal Functions                                                                                                           *
    3737*********************************************************************************************************************************/
    38 BS3TESTMODE_PROTOTYPES_CMN(Bs3Cg1Worker);
     38BS3TESTMODEBYMAX_PROTOTYPES_CMN(Bs3Cg1Worker);
    3939
    4040
     
    4242*   Global Variables                                                                                                             *
    4343*********************************************************************************************************************************/
    44 static const BS3TESTMODEENTRY g_aModeTest[] =
     44static const BS3TESTMODEBYMAXENTRY g_aModeTest[] =
    4545{
    46     BS3TESTMODEENTRY_CMN(NULL, Bs3Cg1Worker),
     46    BS3TESTMODEBYMAXENTRY_CMN(NULL, Bs3Cg1Worker),
    4747};
    4848
     
    5353    Bs3TestInit("bs3-cpu-generated-1");
    5454
    55     Bs3TestDoModes_rm(g_aModeTest, RT_ELEMENTS(g_aModeTest));
     55    Bs3TestDoModesByMax_rm(g_aModeTest, RT_ELEMENTS(g_aModeTest));
    5656
    5757    Bs3TestTerm();
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