home *** CD-ROM | disk | FTP | other *** search
- /***
- * vmp.h -
- *
- * Copyright (c) 1989-1992, Microsoft Corporation. All rights reserved.
- *
- *******************************************************************************/
-
- typedef unsigned long PTE;
-
- #define fAllocatedPte 0x00000001UL /* Page has been allocated */
- #define fUnreferencedPte 0x00000002UL /* Page has not been referenced */
- #define fEmsPte 0x00000004UL /* Page resides in EMS */
- #define fXmsPte 0x00000008UL /* Page is swapped to Xms */
- #define fDiskPte 0x00000010UL /* Page is swapped to Disk */
- #define bitSwapPte 0xFFFFFE00UL /* Mask for swap location */
-
- typedef PTE _far *PPTE; /* Pointer to page table entry */
- typedef VPVOID VPPTE; /* Virtual pointer to PTE */
-
- typedef PTE PT[cbVmPage/sizeof(PTE)]; /* Page table */
- typedef PT _far *PPT; /* Pointer to page table */
-
- /*
- * Page tables are limited to a single level. To keep this simple
- * all page table pages should be described by a single page table.
- * This limits the size of the virtual address space. With 2048
- * byte pages and four byte page table entries, the limit is 512M.
- * This should satisfy most applications.
- */
-
- #define vpptMax ((VPVOID)cbVmPage*cbVmPage/sizeof(PTE))
- #define vpMax ((VPVOID)vpptMax*cbVmPage/sizeof(PTE))
-
- extern unsigned _near _fVmInit; /* TRUE when VM is initialized */
- extern const VPVOID _hbkMin; /* lowest legal handle address */
- extern const VPVOID _hbkMax; /* highest legal handle address */
-
- extern int _near _fVmTrace;
-
- typedef struct PGD PGD;
-
- extern _segment _near _segVmDos;
- extern unsigned _near _cVmPage; /* Count of non-EMS pages allocated */
-
- typedef PGD _based(_segVmDos) *HPGD;
- #define hpgdNil (HPGD) 0xffff
-
-
- struct PGD {
- VPVOID vp; /* Virtual address of contents */
- PTE pte;
- _segment segPage; /* Physical segment of page */
- unsigned char Flags; /* Miscellaneous flags */
- unsigned char cLock; /* Lock count */
- HPGD hpgdHashNext; /* Next page in hash chain */
- unsigned timeRef; /* Time of last reference */
- };
-
-
- #define PpgdOfHpgd(hpgd) (hpgd)
- #define HpgdAdd(hpgd, i) ((HPGD) (hpgd) + (i))
- #define HpgdOfIPage(iPage) ((HPGD) 0 + (iPage))
- #define HpgdOfIPage0 (0U)
- #define IPageOfHpgd(hpgd) ((unsigned) (hpgd) / sizeof(struct PGD))
-
- #define PPageOfHpgd(hpgd) ((char _far *) (PpgdOfHpgd(hpgd)->segPage:>(void _based(void) *) 0))
-
- #define fDiscontinousPgd 0x0001 /* Page not adjacent to previous page */
- #define fEmsPgd 0x0002 /* Page is part of EMS page frame */
- #define fUmbPgd 0x0004 /* Page is an XMS upper memory block */
- #define fAllocatedPgd 0x0008 /* Page is in use */
- #define fDirtyPgd 0x0010 /* Page has been modified */
-
- #define cLockPgdMost 255 /* Upper limit to nested locks */
-
-
- typedef struct {
- VPVOID vp; /* Virtual address of contents */
- unsigned cLock; /* Lock count */
- unsigned timeRef; /* Time of last reference */
- } EMSPGD;
-
-
- #define ipgdHashMax 79U /* Number of hash buckets for PGDs */
- #define ipgdHashMask 0x3FFFFFUL
-
- #define IpgdHashOfVp(vp) ((unsigned) ((vp & ipgdHashMask) % ipgdHashMax))
- #define VppteOfVp(vp) (PageOfVp(vp) * sizeof(PTE))
-
-
- #define cVmUmbMax 8
-
- int PRIVATE __FVmInitializePhys(unsigned cVmParaMin, unsigned cParaVmDosMax);
- void PRIVATE __VmTerminatePhys(void);
- int PRIVATE __FVmSwapInPage(PTE pte, HPGD hpgd);
-
- HPGD PRIVATE __HpgdSearchCache(VPVOID vp);
- HPGD PRIVATE __HpgdVmAllocate(unsigned cPage);
- HPGD PRIVATE __HpgdVmAllocateEms(unsigned cPage);
- void PRIVATE __VmRemovePgdFromCache(HPGD hpgd);
- void PRIVATE __VmWriteDirtyPgd(HPGD hpgd);
- void PRIVATE __VmUpdateTimestamps(void);
-
- void PRIVATE __VmInitializeDisk(void);
- void PRIVATE __VmTerminateDisk(void);
- int PRIVATE __FVmAllocateDiskPage(PPTE ppte);
- void PRIVATE __VmFreeDiskPage(PPTE ppte);
- int PRIVATE __FVmSwapInDiskPage(PTE pte, HPGD hpgd);
- int PRIVATE __FVmSwapOutDiskPage(PTE pte, HPGD hpgd);
-
- void PRIVATE __VmInitializeXms(void);
- void PRIVATE __VmTerminateXms(void);
- int PRIVATE __FVmAllocateXmsPage(PPTE ppte);
- void PRIVATE __VmFreeXmsPage(PPTE ppte);
- int PRIVATE __FVmSwapInXmsPage(PTE pte, HPGD hpgd);
- int PRIVATE __FVmSwapOutXmsPage(PTE pte, HPGD hpgd);
-
- void PRIVATE __VmInitializeEms(void);
- void PRIVATE __VmTerminateEms(void);
- int PRIVATE __FVmAllocateEmsPage(PPTE ppte, VPVOID vp);
- void PRIVATE __VmFreeEmsPage(PPTE ppte);
- int PRIVATE __FVmSwapInEmsPage(PTE pte, HPGD hpgd);
- int PRIVATE __FVmSwapOutEmsPage(PTE pte, HPGD hpgd);
-
- int PRIVATE __FVmWin30StandardMode(void);
-
- unsigned PRIVATE __CParaVmDosAvail(void);
- _segment PRIVATE __SegVmDosAllocate(unsigned cPara);
- void PRIVATE __VmDosFreeSeg(_segment segDos);
-
- int PRIVATE __VmCreateTemp(void);
- int PRIVATE __FVmExtendTemp(int fh, long lfa);
- void PRIVATE __VmCloseTemp(int fh);
- int PRIVATE __FVmReadTemp(int fh, long lfa, void _far *pv, unsigned cb);
- int PRIVATE __FVmWriteTemp(int fh, long lfa, void _far *pv, unsigned cb);
-
- /* Private Data */
-
- extern PT _far _ptRoot;
- extern HPGD _near _rghpgdHash[ipgdHashMax];
- extern unsigned _near _timeCur;
-
- extern unsigned _near _cPageDos;
-
- void __far * _cdecl _far _VmMalloc(unsigned int size);
- void _cdecl _far _VmFree(void __far *memblock);
-
- #if VMTRACE || VMPROFILE
- int _cdecl _far __VmPrintf(const char _near *, ...);
- #endif /* VMTRACE || VMPROFILE */
-
- #if VMTRACE
- #define VmTracePrintf(p) {if (_fVmTrace) __VmPrintf ## p;}
- #else /* !VMTRACE */
- #define VmTracePrintf(p)
- #endif /* !VMTRACE */
-
- #if VMPROFILE
- #define VmProfilePrintf(p) {if (_fVmProfile) __VmPrintf ## p;}
- #else /* !VMPROFILE */
- #define VmProfilePrintf(p)
- #endif /* !VMPROFILE */
-
-