Changeset 2869 for trunk/kLdr/kLdrDyld.c


Ignore:
Timestamp:
Nov 12, 2006, 3:47:25 AM (19 years ago)
Author:
bird
Message:

the simple testcase works.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdrDyld.c

    r2868 r2869  
    7575 * successfully initialized. */
    7676PKLDRDYLDMOD    g_pkLdrDyldInitHead;
    77 /** Pointer to the tail module of the initalization list. */
     77/** Pointer to the tail module of the initalization list.*/
    7878PKLDRDYLDMOD    g_pkLdrDyldInitTail;
    79 /** Pointer to the head module of the termination order list. */
     79/** Pointer to the head module of the termination order list.
     80 * This is a LIFO just like the the init list. */
    8081PKLDRDYLDMOD    g_pkLdrDyldTermHead;
    8182/** Pointer to the tail module of the termination order list. */
     
    185186 * Initialize the dynamic loader.
    186187 */
    187 int kldrDyInit(void)
     188int kldrDyldInit(void)
    188189{
    189190    kLdrDyldHead = kLdrDyldTail = NULL;
     
    198199    g_cbkLdrDyldMainStack = 0;
    199200
    200     return 0;
     201    return kldrDyldFindInit();
    201202}
    202203
     
    205206 * Terminate the dynamic loader.
    206207 */
    207 void kldrDyTerm(void)
     208void kldrDyldTerm(void)
    208209{
    209210
     
    321322        g_cTotalLoadCalls++;
    322323        g_cActiveLoadCalls++;
    323         rc = kldrDyldDoLoad(pszDll, pszPrefix, pszSuffix, enmSearch, fFlags, phMod, pszErr, cchErr);
     324        rc = kldrDyldDoLoad(pszDll, pszPrefix, pszSuffix, enmSearch, fFlags, &pMod, pszErr, cchErr);
    324325        g_cActiveLoadCalls--;
    325326        kldrDyldDoModuleTerminationAndGarabageCollection();
     
    845846            if (cEntries < sizeof(s_aEntries) / sizeof(s_aEntries[0]))
    846847            {
    847                 s_aEntries[cEntries++].pMod = pMod->papPrereqs[pMod->cPrereqs - s_aEntries[i].cLeft];
     848                s_aEntries[cEntries].cLeft = ~(uint32_t)0;
     849                s_aEntries[cEntries].pMod = pMod->papPrereqs[pMod->cPrereqs - s_aEntries[i].cLeft];
    848850                s_aEntries[i].cLeft--;
     851                cEntries++;
    849852            }
    850853            else
     
    962965         * We'll have to load it from file.
    963966         */
    964         rc = kldrDyldFindNewModule(pszDll, pszPrefix, pszSuffix, enmSearch, fFlags, ppMod);
     967        rc = kldrDyldFindNewModule(pszDll, pszPrefix, pszSuffix, enmSearch, fFlags, &pMod);
    965968        if (!rc)
    966969            rc = kldrDyldModMap(pMod);
     
    11621165static void kldrDyldStackDropFrame(uint32_t iLoad1st, uint32_t iLoadEnd, int rc)
    11631166{
    1164     uint32_t iStack;
    1165     KLDRDYLD_ASSERT(iLoadEnd <= g_cStackMods);
    1166     KLDRDYLD_ASSERT(iLoad1st == g_cStackMods);
     1167    uint32_t i;
     1168    KLDRDYLD_ASSERT(iLoad1st <= g_cStackMods);
     1169    KLDRDYLD_ASSERT(iLoadEnd == g_cStackMods);
    11671170
    11681171    /*
    11691172     * First pass: Do all the cleanups we can, but don't destroy anything just yet.
    11701173     */
    1171     for (iStack = iLoadEnd; iStack < iLoad1st; iStack++)
    1172     {
    1173         PKLDRDYLDMOD pMod = g_papStackMods[--iLoad1st];
     1174    i = iLoadEnd;
     1175    while (i-- > iLoad1st)
     1176    {
     1177        PKLDRDYLDMOD pMod = g_papStackMods[i];
    11741178        kldrDyldStackCleanupOne(pMod, rc);
    11751179    }
     
    11791183     *              can be completely removed.
    11801184     */
    1181     while (iLoad1st > iLoadEnd)
    1182     {
    1183         /*
    1184          * Pop a module.
    1185          */
    1186         PKLDRDYLDMOD pMod = g_papStackMods[--iLoad1st];
    1187         g_cStackMods = iLoad1st;
     1185    for (i = iLoad1st; i < iLoadEnd ; i++)
     1186    {
     1187        PKLDRDYLDMOD pMod = g_papStackMods[i];
    11881188
    11891189        /*
     
    12101210        kldrDyldModDeref(pMod);
    12111211    }
     1212
     1213    /*
     1214     * Drop the stack frame.
     1215     */
     1216    g_cStackMods = iLoad1st;
    12121217}
    12131218
     
    12451250                case KLDRSTATE_GOOD:
    12461251                case KLDRSTATE_PENDING_GC:
     1252                case KLDRSTATE_PENDING_TERMINATION:
    12471253                    break;
    12481254
    12491255                case KLDRSTATE_INITIALIZATION_FAILED: /* just in case */
    12501256                case KLDRSTATE_PENDING_INITIALIZATION:
    1251                 case KLDRSTATE_PENDING_TERMINATION:
    12521257                    kldrDyldModUnloadPrerequisites(pMod);
    12531258                    break;
     
    13091314            case KLDRSTATE_INITIALIZATION_FAILED:
    13101315            case KLDRSTATE_PENDING_GC:
    1311                 KLDRDYLD_ASSERT(pMod->cRefs == 0); /* ??? */
     1316                KLDRDYLD_ASSERT(!pMod->cDepRefs);
     1317                KLDRDYLD_ASSERT(!pMod->cDynRefs);
    13121318                pMod->enmState = KLDRSTATE_GC;
    13131319                kldrDyldModUnmap(pMod);
     
    14281434int kldrDyldFailure(int rc, const char *pszFilename, ...)
    14291435{
    1430     kldrHlpExit(1);
     1436    /** @todo print it. */
     1437    if (g_fBootstrapping);
     1438        kldrHlpExit(1);
    14311439    return rc;
    14321440}
Note: See TracChangeset for help on using the changeset viewer.