home *** CD-ROM | disk | FTP | other *** search
- /***
- * vmfree.c -
- *
- * Copyright (c) 1989-1992, Microsoft Corporation. All rights reserved.
- *
- *Purpose:
- *
- * PUBLIC Function List
- *
- * VmFreePageVp
- * This function frees a virtual page at a specific virtual
- * address.
- *
- * VmFreePageVpCb
- * This function frees the range of virtual pages starting at the
- * specified virtual address spanning the specified number of bytes.
- *
- *
- *******************************************************************************/
-
- #pragma title("Virtual Memory Manager")
- #pragma subtitle("Core routines")
-
- #include <version.h>
- #include <vmassert.h>
- #include <system.h>
- #include <error.h>
- #include <vm.h>
- #include <vmp.h>
-
- #include <stdlib.h>
-
- #pragma page()
-
- #if VMFREE
-
- void PUBLIC __VmFreePageVp(VPVOID vp)
- {
- HPGD hpgd;
- PPTE ppte;
-
- VmTracePrintf(("VmFreePageVp: vp = %08lX.\n", vp));
-
- /* If this page is in memory, then discard it. */
-
- if ((hpgd = __HpgdSearchCache(VpPageOfVp(vp))) != hpgdNil)
- {
- PpgdOfHpgd(hpgd)->cLock = 0;
-
- if (!(PpgdOfHpgd(hpgd)->Flags & fEmsPgd))
- __VmRemovePgdFromCache(hpgd);
-
- PpgdOfHpgd(hpgd)->Flags &= ~(fAllocatedPgd | fDirtyPgd);
- PpgdOfHpgd(hpgd)->timeRef = 0;
- }
-
-
- /* Load page table entry for this page to determine current location */
- /* This page better have been allocated previously. */
-
- if (vp < vpptMax)
- ppte = &_ptRoot[PageOfVp(vp)];
- else
- ppte = __PVmLoadVp(VppteOfVp(vp), FALSE);
-
- Assert(ppte != NULL);
- Assert(*ppte & fAllocatedPte);
-
- *ppte &= ~fAllocatedPte;
-
- if (*ppte & fXmsPte)
- __VmFreeXmsPage(ppte);
-
- else if (*ppte & fEmsPte)
- __VmFreeEmsPage(ppte);
-
- else
- __VmFreeDiskPage(ppte);
-
- }
-
-
- #endif /* VMFREE */
-
- #pragma page()
-
- #if VMFREE
-
- void PUBLIC __VmFreePageVpCb(VPVOID vp, unsigned long cb)
- {
- unsigned cPage;
- unsigned iPage;
-
- VmTracePrintf(("VmFreePageVpCb: vp = %08lX, cb = %08lX.\n", vp, cb));
-
- Assert((vp & (cbVmPage - 1UL)) == 0);
- Assert(vp + cb > vp);
-
- cPage = (unsigned) ((cb + cbVmPage - 1UL) / cbVmPage);
- for (iPage = 0; iPage < cPage; iPage++)
- {
- __VmFreePageVp(vp);
- vp += cbVmPage;
- }
- }
-
-
- #endif /* VMFREE */
-