Annotation of ntddk/src/video/displays/xga/mm.c, revision 1.1

1.1     ! root        1: /*****************************************************************************
        !             2:  * XGA Memory Manager
        !             3:  *
        !             4:  * Copyright (c) 1992 Microsoft Corporation
        !             5:  ****************************************************************************/
        !             6: 
        !             7: #include "driver.h"
        !             8: 
        !             9: 
        !            10: 
        !            11: 
        !            12: /******************************************************************************
        !            13:  * CpAlloc - Coprocessor Memory Alloc
        !            14:  *
        !            15:  *  ENTRY:  nSize   -   The requested allocation size.
        !            16:  *          ulFlags -   Allocation control flags.
        !            17:  *
        !            18:  *                      XGA_ZERO_MEM    - Zero allocated memory.
        !            19:  *                      XGA_LOCK_MEM    - Lock the allocated memory.
        !            20:  *                                        The returned handle is really a
        !            21:  *                                        pointer to allocation node.
        !            22:  *
        !            23:  *  EXIT:   hXgaMem -   A handle for the memory just allocated.
        !            24:  *                      If XGA_LOCK_MEM is set then this is a pointer
        !            25:  *                      to the allocation node.
        !            26:  *
        !            27:  *                      On an error, this will be NULL.
        !            28:  *****************************************************************************/
        !            29: HANDLE hCpAlloc(PPDEV ppdev, ULONG nSize, ULONG ulFlags)
        !            30: {
        !            31: PCPALLOCNODE    pcpan,
        !            32:                 pcpanSearch,
        !            33:                 pcpanNew,
        !            34:                 pcpanLast ;
        !            35: 
        !            36: 
        !            37:         // This will be returned as the handle.
        !            38: 
        !            39:         pcpanNew = NULL ;
        !            40: 
        !            41:         // Note: Is is possible that the previous allocation was the
        !            42:         //       the last piece of memory available from the free list,
        !            43:         //       and it was an exact fit.  In this case the free list root
        !            44:         //       will be NULL.  In this case we should fail the allocation
        !            45:         //       request.
        !            46: 
        !            47:         if (ppdev->pFreeListRoot == NULL)
        !            48:         {
        !            49:             DISPDBG((1, "XGA.DLL!CpAlloc - pFreeListRoot NULL (normal condition)\n")) ;
        !            50:             return (NULL) ;
        !            51:         }
        !            52: 
        !            53:         // Traverse the free list, looking for the first piece of memory
        !            54:         // that is larger enough to satisfy the memory request.
        !            55: 
        !            56:         pcpanSearch = ppdev->pFreeListRoot ;
        !            57:         pcpanLast   = pcpanSearch ;
        !            58:         do
        !            59:         {
        !            60:             if (pcpanSearch->ulLength >= nSize)
        !            61:             {
        !            62: 
        !            63:                 // Take care of the case when the node we find is exactly
        !            64:                 // the size we need.
        !            65: 
        !            66:                 if (pcpanSearch->ulLength > nSize)
        !            67:                 {
        !            68:                     // Allocate a new node to hold the information about this
        !            69:                     // memory request.
        !            70: 
        !            71:                     pcpanNew = (PCPALLOCNODE) LocalAlloc(LPTR, sizeof(CPALLOCNODE)) ;
        !            72:                     if (pcpanNew == NULL)
        !            73:                     {
        !            74:                         DISPDBG((1, "XGA.DLL!CpAlloc - LocalAlloc failed\n")) ;
        !            75:                         return (NULL) ;
        !            76:                     }
        !            77: 
        !            78:                     // Initialize the new node.  We take memory the beginning
        !            79:                     // of the piece of memory we found.
        !            80: 
        !            81:                     pcpanNew->pcpanNext          = NULL ;
        !            82:                     pcpanNew->ulFlags            = 0 ;
        !            83:                     pcpanNew->hCpAllocNode       = pcpanNew ;
        !            84:                     pcpanNew->ulLength           = nSize ;
        !            85:                     pcpanNew->pCpLinearMemory    = pcpanSearch->pCpLinearMemory ;
        !            86:                     pcpanNew->ulCpPhysicalMemory = pcpanSearch->ulCpPhysicalMemory ;
        !            87: 
        !            88:                     // Reduce the size of this node, the amount of memory
        !            89:                     // we're taking.
        !            90: 
        !            91:                     pcpanSearch->ulLength                -= nSize ;
        !            92:                     (PBYTE) pcpanSearch->pCpLinearMemory += nSize ;
        !            93:                     pcpanSearch->ulCpPhysicalMemory      += nSize ;
        !            94:                 }
        !            95:                 else
        !            96:                 {
        !            97:                     // We found a node that is exactly the size we need.
        !            98:                     // Remove it from the Free List and initialize it's links.
        !            99: 
        !           100:                     if (pcpanLast == ppdev->pFreeListRoot)
        !           101:                     {
        !           102:                         ppdev->pFreeListRoot = (PCPALLOCNODE) pcpanSearch->pcpanNext ;
        !           103:                     }
        !           104:                     else
        !           105:                     {
        !           106:                         pcpanLast->pcpanNext = pcpanSearch->pcpanNext ;
        !           107:                     }
        !           108: 
        !           109:                     pcpanNew             = pcpanSearch ;
        !           110:                     pcpanNew->pcpanNext  = NULL ;
        !           111:                 }
        !           112: 
        !           113:                 // Set the flags, and take care of initialization of the
        !           114:                 // Allocated XGA memory if necessary.
        !           115: 
        !           116:                 pcpanNew->ulFlags = ulFlags ;
        !           117:                 if (ulFlags & XGA_ZERO_INIT)
        !           118:                 {
        !           119:                     memset(pcpanNew->pCpLinearMemory, 0, nSize) ;
        !           120:                 }
        !           121: 
        !           122:                 // Add (or move) the new (or existing) node to the
        !           123:                 // Allocated list.
        !           124:                 // Note: New nodes are always added to the end of the Allocated
        !           125:                 // list.
        !           126: 
        !           127:                 if (ppdev->pAllocatedListRoot == NULL)
        !           128:                 {
        !           129:                     ppdev->pAllocatedListRoot = pcpanNew ;
        !           130:                 }
        !           131:                 else
        !           132:                 {
        !           133:                     for (pcpan = ppdev->pAllocatedListRoot ;
        !           134:                          pcpan->pcpanNext != NULL ;
        !           135:                          pcpan = pcpan->pcpanNext) ;
        !           136: 
        !           137:                     pcpan->pcpanNext = pcpanNew ;
        !           138: 
        !           139:                 }
        !           140: 
        !           141:                 break ;
        !           142:             }
        !           143: 
        !           144:             pcpanLast   = pcpanSearch ;
        !           145:             pcpanSearch = pcpanSearch->pcpanNext ;
        !           146: 
        !           147:         } while (pcpanSearch != NULL) ;
        !           148: 
        !           149:         return(pcpanNew) ;
        !           150: 
        !           151: 
        !           152: 
        !           153: }
        !           154: 
        !           155: 
        !           156: /******************************************************************************
        !           157:  * CpFree - Coprocessor Memory Free
        !           158:  *  ENTRY:  hXgaMem -   A handle for an allocated node of memory.
        !           159:  *                      The node may be locked.
        !           160:  *
        !           161:  *  EXIT:   hXgaMem -   If the Free was successfull then this will be NULL.
        !           162:  *                      If there is any erro the original hXgaMem will be
        !           163:  *                      returned.
        !           164:  *****************************************************************************/
        !           165: HANDLE hCpFree(PPDEV ppdev, HANDLE hXgaMem)
        !           166: {
        !           167: PCPALLOCNODE    pcpan,
        !           168:                 pcpanSearch,
        !           169:                 pcpanLast ;
        !           170: ULONG           ulLength ;
        !           171: 
        !           172: 
        !           173:         // Make sure the handle passed in is not NULL.
        !           174: 
        !           175:         pcpanSearch = (PCPALLOCNODE) hXgaMem ;
        !           176: 
        !           177:         if (pcpanSearch == NULL)
        !           178:         {
        !           179:             DISPDBG((1, "XGA.DLL!CpFree - hXgaMem NULL (invalid)\n")) ;
        !           180:             return (hXgaMem) ;
        !           181:         }
        !           182: 
        !           183:         // Find the Allocation node on the Allocated List.
        !           184: 
        !           185:         pcpanLast = ppdev->pAllocatedListRoot ;
        !           186:         for (pcpan = ppdev->pAllocatedListRoot ;
        !           187:              pcpan != pcpanSearch ;
        !           188:              pcpan = pcpan->pcpanNext)
        !           189:         {
        !           190:             if (pcpan == NULL)
        !           191:             {
        !           192:                 DISPDBG((1, "XGA.DLL!CpFree - hXgaMem not Found\n")) ;
        !           193:                 return (hXgaMem) ;
        !           194:             }
        !           195: 
        !           196:             pcpanLast = pcpan ;
        !           197:         }
        !           198: 
        !           199:         // Remove the Old Node from the Allocated List.
        !           200: 
        !           201:         if (pcpanLast == ppdev->pAllocatedListRoot)
        !           202:         {
        !           203:             ppdev->pAllocatedListRoot = pcpan->pcpanNext ;
        !           204:         }
        !           205:         else
        !           206:         {
        !           207:             pcpanLast->pcpanNext = pcpan->pcpanNext ;
        !           208:         }
        !           209: 
        !           210:         // Find the position in the Free List for this node.
        !           211: 
        !           212:         ulLength = pcpanSearch->ulLength ;
        !           213: 
        !           214:         pcpanLast = ppdev->pFreeListRoot ;
        !           215:         for (pcpan = ppdev->pFreeListRoot ; pcpan != NULL ; pcpan = pcpan->pcpanNext)
        !           216:         {
        !           217:             if (pcpan->ulLength > ulLength)
        !           218:                 break ;
        !           219:             pcpanLast = pcpan ;
        !           220:         }
        !           221: 
        !           222:         // Add the Node to the Free List.
        !           223: 
        !           224:         if (pcpanLast == ppdev->pFreeListRoot)
        !           225:         {
        !           226:             pcpanSearch->pcpanNext  = ppdev->pFreeListRoot ;
        !           227:             ppdev->pFreeListRoot = pcpanSearch ;
        !           228:         }
        !           229:         else
        !           230:         {
        !           231:             pcpanSearch->pcpanNext  = pcpanLast->pcpanNext ;
        !           232:             pcpanLast->pcpanNext = pcpanSearch ;
        !           233:         }
        !           234: 
        !           235:         return (NULL) ;
        !           236: 
        !           237: 
        !           238: }
        !           239: 
        !           240: /******************************************************************************
        !           241:  * CpMemLock - Lock an Allocated piece of memory
        !           242:  *
        !           243:  *  ENTRY:  hXgaMem -   A handle for an allocated node of memory.
        !           244:  *
        !           245:  *  EXIT:   pXgaMem -   A pointer the memory allocation node.
        !           246:  *                      On Error NULL is returned.
        !           247:  *****************************************************************************/
        !           248: PVOID pCpMemLock(PPDEV ppdev, HANDLE hXgaMem, ULONG ulFlags)
        !           249: {
        !           250: PCPALLOCNODE    pcpan,
        !           251:                 pcpanLast,
        !           252:                 pcpanSearch ;
        !           253: 
        !           254: 
        !           255:         // Find the Allocation node on the Allocated List.
        !           256: 
        !           257:         pcpanSearch = (PCPALLOCNODE) hXgaMem ;
        !           258: 
        !           259:         pcpanLast = ppdev->pAllocatedListRoot ;
        !           260:         for (pcpan = ppdev->pAllocatedListRoot ;
        !           261:              pcpan != pcpanSearch ;
        !           262:              pcpan = pcpan->pcpanNext)
        !           263:         {
        !           264:             if (pcpan == NULL)
        !           265:             {
        !           266:                 DISPDBG((1, "XGA.DLL!CpMemLock - hXgaMem not Found\n")) ;
        !           267:                 return (NULL) ;
        !           268:             }
        !           269:         }
        !           270: 
        !           271:         // Set the locked flag.
        !           272: 
        !           273:         pcpan->ulFlags |= XGA_LOCK_MEM ;
        !           274: 
        !           275:         return(pcpan) ;
        !           276: 
        !           277: }
        !           278: 
        !           279: /******************************************************************************
        !           280:  * CpMemUnLock - UnLock an Allocated piece of memory
        !           281:  *
        !           282:  *  ENTRY:  hXgaMem -   A handle for an allocated node of memory.
        !           283:  *
        !           284:  *  EXIT:   TRUE    -   If the node was found and unlocked
        !           285:  *          FALSE   -   If the node was not found.
        !           286:  *****************************************************************************/
        !           287: BOOL bCpMemUnLock(PPDEV ppdev, HANDLE hXgaMem)
        !           288: {
        !           289: PCPALLOCNODE    pcpan,
        !           290:                 pcpanLast,
        !           291:                 pcpanSearch ;
        !           292: 
        !           293: 
        !           294:         // Find the Allocation node on the Allocated List.
        !           295: 
        !           296:         pcpanSearch = (PCPALLOCNODE) hXgaMem ;
        !           297: 
        !           298:         pcpanLast = ppdev->pAllocatedListRoot ;
        !           299:         for (pcpan = ppdev->pAllocatedListRoot ;
        !           300:              pcpan != pcpanSearch ;
        !           301:              pcpan = pcpan->pcpanNext)
        !           302:         {
        !           303:             if (pcpan == NULL)
        !           304:             {
        !           305:                 DISPDBG((1, "XGA.DLL!CpMemUnLock - hXgaMem not Found\n")) ;
        !           306:                 return (FALSE) ;
        !           307:             }
        !           308:         }
        !           309: 
        !           310:         // ReSet the locked flag.
        !           311: 
        !           312:         pcpan->ulFlags &= ~XGA_LOCK_MEM ;
        !           313: 
        !           314:         return(TRUE) ;
        !           315: 
        !           316: 
        !           317: 
        !           318: }
        !           319: 
        !           320: /******************************************************************************
        !           321:  * CpMmInitHeap - Coprocessor Memory Manger Heap Init
        !           322:  *
        !           323:  *  ENTRY:  None
        !           324:  *
        !           325:  *  EXIT:   TRUE    -   If the Heap was created.
        !           326:  *          FALSE   -   If there was any problem
        !           327:  *****************************************************************************/
        !           328: BOOL bCpMmInitHeap(PPDEV ppdev)
        !           329: {
        !           330: 
        !           331: 
        !           332: 
        !           333:         ppdev->pFreeListRoot = (PCPALLOCNODE) LocalAlloc(LPTR, sizeof(CPALLOCNODE)) ;
        !           334:         if (ppdev->pFreeListRoot == NULL)
        !           335:         {
        !           336:             DISPDBG((1, "XGA.DLL!CpMmInitHeap - LocalAlloc failed\n")) ;
        !           337:             return(FALSE) ;
        !           338:         }
        !           339: 
        !           340:         // Init the CoProcessor Allocation Node's fields.
        !           341: 
        !           342:         ppdev->pFreeListRoot->pcpanNext          = NULL ;
        !           343:         ppdev->pFreeListRoot->ulFlags            = 0 ;
        !           344:         ppdev->pFreeListRoot->hCpAllocNode       = ppdev->pFreeListRoot ;
        !           345:         ppdev->pFreeListRoot->ulLength           = ppdev->ulVideoMemorySize -
        !           346:             ppdev->ulScreenSize ;
        !           347:         ppdev->pFreeListRoot->pCpLinearMemory    = ppdev->pjScreen +
        !           348:             ppdev->ulScreenSize ;
        !           349:         ppdev->pFreeListRoot->ulCpPhysicalMemory = ppdev->ulPhysFrameBuffer +
        !           350:             ppdev->ulScreenSize ;
        !           351: 
        !           352:         return (TRUE) ;
        !           353: 
        !           354: 
        !           355: }
        !           356: 
        !           357: 
        !           358: /******************************************************************************
        !           359:  * CpMmDestroyHeap - Coprocessor Memory Manger Heap Destroy
        !           360:  *
        !           361:  *  ENTRY:  None
        !           362:  *
        !           363:  *  EXIT:   TRUE    -   If the Heap was destroyed.
        !           364:  *          FALSE   -   If there was any problem
        !           365:  *****************************************************************************/
        !           366: BOOL bCpMmDestroyHeap(PPDEV ppdev)
        !           367: {
        !           368: PCPALLOCNODE    pcpan,
        !           369:                 pcpanNext ;
        !           370: 
        !           371:         // Run through the Free List, and free all the allocted nodes.
        !           372: 
        !           373:         pcpan = ppdev->pFreeListRoot ;
        !           374:         while(pcpan != NULL)
        !           375:         {
        !           376:             pcpanNext = pcpan->pcpanNext ;
        !           377:             LocalFree(pcpan) ;
        !           378:             pcpan = pcpanNext ;
        !           379:         }
        !           380: 
        !           381:         ppdev->pFreeListRoot = NULL ;
        !           382: 
        !           383:         // Run through the Allocated List and free all the nodes.
        !           384: 
        !           385:         pcpan = ppdev->pAllocatedListRoot ;
        !           386:         while(pcpan != NULL)
        !           387:         {
        !           388:             pcpanNext = pcpan->pcpanNext ;
        !           389:             LocalFree(pcpan) ;
        !           390:             pcpan = pcpanNext ;
        !           391:         }
        !           392: 
        !           393:         ppdev->pAllocatedListRoot = NULL ;
        !           394: 
        !           395:         return (TRUE) ;
        !           396: 
        !           397: }
        !           398: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.