home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / mslang / vm / h / vmp.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-15  |  5.9 KB  |  164 lines

  1. /***
  2. * vmp.h -
  3. *
  4. *       Copyright (c) 1989-1992, Microsoft Corporation.  All rights reserved.
  5. *
  6. *******************************************************************************/
  7.  
  8. typedef unsigned long PTE;
  9.  
  10. #define  fAllocatedPte     0x00000001UL   /* Page has been allocated */
  11. #define  fUnreferencedPte  0x00000002UL   /* Page has not been referenced */
  12. #define  fEmsPte           0x00000004UL   /* Page resides in EMS */
  13. #define  fXmsPte           0x00000008UL   /* Page is swapped to Xms */
  14. #define  fDiskPte          0x00000010UL   /* Page is swapped to Disk */
  15. #define  bitSwapPte        0xFFFFFE00UL   /* Mask for swap location */
  16.  
  17. typedef PTE _far *PPTE;                   /* Pointer to page table entry */
  18. typedef VPVOID  VPPTE;                    /* Virtual pointer to PTE */
  19.  
  20. typedef PTE PT[cbVmPage/sizeof(PTE)];     /* Page table */
  21. typedef PT _far *PPT;                     /* Pointer to page table */
  22.  
  23.    /*
  24.     *   Page tables are limited to a single level.  To keep this simple
  25.     *   all page table pages should be described by a single page table.
  26.     *   This limits the size of the virtual address space.  With 2048
  27.     *   byte pages and four byte page table entries, the limit is 512M.
  28.     *   This should satisfy most applications.
  29.     */
  30.  
  31. #define vpptMax   ((VPVOID)cbVmPage*cbVmPage/sizeof(PTE))
  32. #define vpMax     ((VPVOID)vpptMax*cbVmPage/sizeof(PTE))
  33.  
  34. extern unsigned _near _fVmInit; /* TRUE when VM is initialized */
  35. extern const VPVOID _hbkMin; /* lowest legal handle address */
  36. extern const VPVOID _hbkMax; /* highest legal handle address */
  37.  
  38. extern int _near _fVmTrace;
  39.  
  40. typedef struct PGD PGD;
  41.  
  42. extern _segment _near _segVmDos;
  43. extern unsigned _near _cVmPage;   /* Count of non-EMS pages allocated */
  44.  
  45. typedef PGD _based(_segVmDos) *HPGD;
  46. #define hpgdNil (HPGD) 0xffff
  47.  
  48.  
  49. struct PGD {
  50.    VPVOID   vp;                        /* Virtual address of contents */
  51.    PTE      pte;
  52.    _segment segPage;                   /* Physical segment of page */
  53.    unsigned char  Flags;               /* Miscellaneous flags */
  54.    unsigned char  cLock;               /* Lock count */
  55.    HPGD     hpgdHashNext;              /* Next page in hash chain */
  56.    unsigned timeRef;                   /* Time of last reference */
  57.    };
  58.  
  59.  
  60. #define  PpgdOfHpgd(hpgd) (hpgd)
  61. #define  HpgdAdd(hpgd, i) ((HPGD) (hpgd) + (i))
  62. #define  HpgdOfIPage(iPage) ((HPGD) 0 + (iPage))
  63. #define  HpgdOfIPage0 (0U)
  64. #define  IPageOfHpgd(hpgd) ((unsigned) (hpgd) / sizeof(struct PGD))
  65.  
  66. #define  PPageOfHpgd(hpgd) ((char _far *) (PpgdOfHpgd(hpgd)->segPage:>(void _based(void) *) 0))
  67.  
  68. #define  fDiscontinousPgd  0x0001      /* Page not adjacent to previous page */
  69. #define  fEmsPgd           0x0002      /* Page is part of EMS page frame */
  70. #define  fUmbPgd           0x0004      /* Page is an XMS upper memory block */
  71. #define  fAllocatedPgd     0x0008      /* Page is in use */
  72. #define  fDirtyPgd         0x0010      /* Page has been modified */
  73.  
  74. #define  cLockPgdMost      255         /* Upper limit to nested locks */
  75.  
  76.  
  77. typedef struct {
  78.    VPVOID   vp;                        /* Virtual address of contents */
  79.    unsigned cLock;                     /* Lock count */
  80.    unsigned timeRef;                   /* Time of last reference */
  81.    } EMSPGD;
  82.  
  83.  
  84. #define  ipgdHashMax 79U               /* Number of hash buckets for PGDs */
  85. #define  ipgdHashMask      0x3FFFFFUL
  86.  
  87. #define  IpgdHashOfVp(vp) ((unsigned) ((vp & ipgdHashMask) % ipgdHashMax))
  88. #define  VppteOfVp(vp) (PageOfVp(vp) * sizeof(PTE))
  89.  
  90.  
  91. #define  cVmUmbMax  8
  92.  
  93. int  PRIVATE __FVmInitializePhys(unsigned cVmParaMin, unsigned cParaVmDosMax);
  94. void PRIVATE __VmTerminatePhys(void);
  95. int  PRIVATE __FVmSwapInPage(PTE pte, HPGD hpgd);
  96.  
  97. HPGD PRIVATE __HpgdSearchCache(VPVOID vp);
  98. HPGD PRIVATE __HpgdVmAllocate(unsigned cPage);
  99. HPGD PRIVATE __HpgdVmAllocateEms(unsigned cPage);
  100. void PRIVATE __VmRemovePgdFromCache(HPGD hpgd);
  101. void PRIVATE __VmWriteDirtyPgd(HPGD hpgd);
  102. void PRIVATE __VmUpdateTimestamps(void);
  103.  
  104. void PRIVATE __VmInitializeDisk(void);
  105. void PRIVATE __VmTerminateDisk(void);
  106. int  PRIVATE __FVmAllocateDiskPage(PPTE ppte);
  107. void PRIVATE __VmFreeDiskPage(PPTE ppte);
  108. int  PRIVATE __FVmSwapInDiskPage(PTE pte, HPGD hpgd);
  109. int  PRIVATE __FVmSwapOutDiskPage(PTE pte, HPGD hpgd);
  110.  
  111. void PRIVATE __VmInitializeXms(void);
  112. void PRIVATE __VmTerminateXms(void);
  113. int  PRIVATE __FVmAllocateXmsPage(PPTE ppte);
  114. void PRIVATE __VmFreeXmsPage(PPTE ppte);
  115. int  PRIVATE __FVmSwapInXmsPage(PTE pte, HPGD hpgd);
  116. int  PRIVATE __FVmSwapOutXmsPage(PTE pte, HPGD hpgd);
  117.  
  118. void PRIVATE __VmInitializeEms(void);
  119. void PRIVATE __VmTerminateEms(void);
  120. int  PRIVATE __FVmAllocateEmsPage(PPTE ppte, VPVOID vp);
  121. void PRIVATE __VmFreeEmsPage(PPTE ppte);
  122. int  PRIVATE __FVmSwapInEmsPage(PTE pte, HPGD hpgd);
  123. int  PRIVATE __FVmSwapOutEmsPage(PTE pte, HPGD hpgd);
  124.  
  125. int  PRIVATE __FVmWin30StandardMode(void);
  126.  
  127. unsigned PRIVATE __CParaVmDosAvail(void);
  128. _segment PRIVATE __SegVmDosAllocate(unsigned cPara);
  129. void PRIVATE __VmDosFreeSeg(_segment segDos);
  130.  
  131. int  PRIVATE __VmCreateTemp(void);
  132. int  PRIVATE __FVmExtendTemp(int fh, long lfa);
  133. void PRIVATE __VmCloseTemp(int fh);
  134. int  PRIVATE __FVmReadTemp(int fh, long lfa, void _far *pv, unsigned cb);
  135. int  PRIVATE __FVmWriteTemp(int fh, long lfa, void _far *pv, unsigned cb);
  136.  
  137.     /* Private Data */
  138.  
  139. extern PT       _far    _ptRoot;
  140. extern HPGD     _near   _rghpgdHash[ipgdHashMax];
  141. extern unsigned _near   _timeCur;
  142.  
  143. extern unsigned _near _cPageDos;
  144.  
  145. void __far * _cdecl _far _VmMalloc(unsigned int size);
  146. void _cdecl _far _VmFree(void __far *memblock);
  147.  
  148. #if     VMTRACE || VMPROFILE
  149. int _cdecl _far __VmPrintf(const char _near *, ...);
  150. #endif  /* VMTRACE || VMPROFILE */
  151.  
  152. #if     VMTRACE
  153. #define VmTracePrintf(p) {if (_fVmTrace) __VmPrintf ## p;}
  154. #else   /* !VMTRACE */
  155. #define VmTracePrintf(p)
  156. #endif  /* !VMTRACE */
  157.  
  158. #if     VMPROFILE
  159. #define VmProfilePrintf(p) {if (_fVmProfile) __VmPrintf ## p;}
  160. #else   /* !VMPROFILE */
  161. #define VmProfilePrintf(p)
  162. #endif  /* !VMPROFILE */
  163.  
  164.