home *** CD-ROM | disk | FTP | other *** search
- /***
- * vmxms.c -
- *
- * Copyright (c) 1989-1992, Microsoft Corporation. All rights reserved.
- *
- *Purpose:
- *
- * PRIVATE Functions:
- *
- * VmInitializeXms:
- *
- * VmTerminateXms:
- *
- * FVmAllocateXmsPage:
- *
- * VmSwapInXmsPage:
- *
- * VmSwapOutXmsPage:
- *
- *******************************************************************************/
-
- #pragma title("Virtual Memory Manager")
- #pragma subtitle("DOS Extended memory support")
-
- #include <version.h>
- #include <vmassert.h>
- #include <system.h>
- #include <error.h>
- #include <xms.h>
- #include <vm.h>
- #include <vmp.h>
-
- #if VMFREE
- #define cVmPageQueuedXmsMost 8
- #else /* !VMFREE */
- #define cVmPageQueuedXmsMost 1
- #endif /* !VMFREE */
-
- extern char _near _fVmDisableXms = FALSE;
- static char _near _fVmUseXms;
- static HEMB _near hembVm;
- static unsigned _near ckbVmEmb;
- static unsigned _near _cVmPageQueuedXms;
- static unsigned long _near rgibVmPageQueuedXms[cVmPageQueuedXmsMost];
-
- #if VMFREE
-
- static unsigned long _near ibVmEmbNextFree;
-
- #endif /* VMFREE */
-
-
- #if VMPROFILE
-
- unsigned long _near _cVmSwapInXms;
- unsigned long _near _cVmSwapOutXms;
-
- #endif
-
-
- #pragma page()
-
- void PRIVATE __VmInitializeXms(void)
- {
- VmTracePrintf(("VmInitializeXms\n"));
-
- #if VMPROFILE
- _cVmSwapInXms = _cVmSwapOutXms = 0;
- #endif
-
- if (_fVmDisableXms ||
- __FVmWin30StandardMode() ||
- !__FXmsCheckInstalled() ||
- (__ErrXmsAllocateExtMemoryBlock(&hembVm, 0) != errNoError)
- )
- {
- _fVmUseXms = FALSE;
- return;
- }
-
- _fVmUseXms = TRUE;
- ckbVmEmb = 0;
- _cVmPageQueuedXms = 0;
-
- #if VMFREE
- ibVmEmbNextFree = 0xffffffff;
- #endif /* VMFREE */
- }
-
-
- #pragma page()
-
- void PRIVATE __VmTerminateXms(void)
- {
- VmTracePrintf(("VmTerminateXms\n"));
-
- VmProfilePrintf(("VmProfile:\t_cVmSwapInXms = %lu, _cVmSwapOutXms = %lu\n",
- _cVmSwapInXms, _cVmSwapOutXms));
-
- if (_fVmUseXms)
- {
- __ErrXmsFreeExtMemoryBlock(hembVm);
-
- _fVmUseXms = FALSE;
- }
- }
-
-
- #pragma page()
-
- void LOCAL __VmFillXmsQueue(void)
- {
- VmTracePrintf(("VmFillXmsQueue\n"));
-
- Assert(_fVmUseXms && (_cVmPageQueuedXms == 0));
-
- #if VMFREE
- if (ibVmEmbNextFree != 0xffffffff)
- {
- ERR err;
- struct ExtMemMoveStruct extmove;
-
- Assert((ibVmEmbNextFree & ~bitSwapPte) == 0);
-
- /* Insert first free page in queue. */
-
- /* CONSIDER: Should more than one page be added to queue. */
- /* CONSIDER: I chose not to because a subsequent set of */
- /* CONSIDER: calls to VmFreeXmsPage could result in more */
- /* CONSIDER: XMS calls than occur by not doing so. */
-
- rgibVmPageQueuedXms[_cVmPageQueuedXms++] = ibVmEmbNextFree;
-
- extmove.cb = sizeof(ibVmEmbNextFree);
- extmove.hembSource = hembVm;
- extmove.ibSource = ibVmEmbNextFree;
- extmove.hembDest = 0;
- extmove.ibDest = (unsigned long) (void far *) &ibVmEmbNextFree;
- err = __ErrXmsMoveExtMemoryBlock(&extmove);
- Assert(err == errNoError);
- }
-
- else
- #endif /* VMFREE */
- {
- if (ckbVmEmb + cbVmPage / 1024UL >= 65536UL)
- return;
-
- /* CONSIDER: Allocate more than one page at a time. */
-
- if (__ErrXmsReallocateExtMemoryBlock(hembVm, ckbVmEmb + cbVmPage/1024) != errNoError)
- return;
-
- rgibVmPageQueuedXms[_cVmPageQueuedXms++] = ckbVmEmb * 1024UL;
-
- ckbVmEmb += cbVmPage/1024;
-
- VmTracePrintf(("Reallocated XMS EMB. ckb = %04X.\n", ckbVmEmb));
- }
- }
-
-
- #pragma page()
-
- int PRIVATE __FVmAllocateXmsPage(PPTE ppte)
- {
- if (!_fVmUseXms)
- return(FALSE);
-
- Assert(*ppte == 0);
-
- if (_cVmPageQueuedXms == 0) /* No Queued pages available. */
- __VmFillXmsQueue();
-
- if (_cVmPageQueuedXms == 0) /* Queue remains empty. No Xms left. */
- return(FALSE);
-
- *ppte = rgibVmPageQueuedXms[--_cVmPageQueuedXms] | fAllocatedPte | fUnreferencedPte | fXmsPte;
-
- VmTracePrintf(("FVmAllocateXmsPage: SwapLocation = %08lX.\n", *ppte & bitSwapPte));
-
- return(TRUE);
- }
-
-
- #pragma page()
-
- #if VMFREE
-
- void PRIVATE __VmFreeXmsPage(PPTE ppte)
- {
- VmTracePrintf(("VmFreeXmsPage: SwapLocation = %08lX.\n", *ppte & bitSwapPte));
-
- Assert(_fVmUseXms && (*ppte & fXmsPte) && !(*ppte & fAllocatedPte));
-
- if (_cVmPageQueuedXms < cVmPageQueuedXmsMost)
- rgibVmPageQueuedXms[_cVmPageQueuedXms++] = *ppte & bitSwapPte;
-
- else
- {
- ERR err;
- struct ExtMemMoveStruct extmove;
-
- /* This is not the last page in XMS. Link into free list. */
-
- extmove.cb = sizeof(ibVmEmbNextFree);
- extmove.hembSource = 0;
- extmove.ibSource = (unsigned long) (void far *) &ibVmEmbNextFree;
- extmove.hembDest = hembVm;
- extmove.ibDest = *ppte & bitSwapPte;
- err = __ErrXmsMoveExtMemoryBlock(&extmove);
- Assert(err == errNoError);
-
- ibVmEmbNextFree = extmove.ibDest;
- }
-
- *ppte = 0;
- }
-
- #endif /* VMFREE */
-
- #pragma page()
-
- int PRIVATE __FVmSwapInXmsPage(PTE pte, HPGD hpgd)
- {
- ERR err;
- struct ExtMemMoveStruct extmove;
-
- VmTracePrintf(("VmSwapInXmsPage: pPage = %Fp, SwapLocation = %08lX.\n",
- PPageOfHpgd(hpgd), pte & bitSwapPte));
-
- #if VMPROFILE
- _cVmSwapInXms++;
- #endif
-
- Assert(_fVmUseXms && (pte & fXmsPte));
-
- extmove.cb = cbVmPage;
- extmove.hembSource = hembVm;
- extmove.ibSource = pte & bitSwapPte;
- extmove.hembDest = 0;
- extmove.ibDest = (unsigned long) PPageOfHpgd(hpgd);
- err = __ErrXmsMoveExtMemoryBlock(&extmove);
-
- Assert(err == errNoError);
- return(err == errNoError);
- }
-
-
- #pragma page()
-
- int PRIVATE __FVmSwapOutXmsPage(PTE pte, HPGD hpgd)
- {
- ERR err;
- struct ExtMemMoveStruct extmove;
-
- VmTracePrintf(("VmSwapOutXmsPage: vp = %08lX, pPage = %Fp, SwapLocation = %08lX.\n",
- PpgdOfHpgd(hpgd)->vp, PPageOfHpgd(hpgd), pte & bitSwapPte));
-
- #if VMPROFILE
- _cVmSwapOutXms++;
- #endif
-
- Assert(_fVmUseXms && (pte & fXmsPte));
-
- extmove.cb = cbVmPage;
- extmove.hembSource = 0;
- extmove.ibSource = (unsigned long) PPageOfHpgd(hpgd);
- extmove.hembDest = hembVm;
- extmove.ibDest = pte & bitSwapPte;
- err = __ErrXmsMoveExtMemoryBlock(&extmove);
-
- Assert(err == errNoError);
- return(err == errNoError);
- }
-