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

  1. /***
  2. * vmxms.c -
  3. *
  4. *       Copyright (c) 1989-1992, Microsoft Corporation.  All rights reserved.
  5. *
  6. *Purpose:
  7. *
  8. * PRIVATE Functions:
  9. *
  10. *   VmInitializeXms:
  11. *
  12. *   VmTerminateXms:
  13. *
  14. *   FVmAllocateXmsPage:
  15. *
  16. *   VmSwapInXmsPage:
  17. *
  18. *   VmSwapOutXmsPage:
  19. *
  20. *******************************************************************************/
  21.  
  22. #pragma title("Virtual Memory Manager")
  23. #pragma subtitle("DOS Extended memory support")
  24.  
  25. #include <version.h>
  26. #include <vmassert.h>
  27. #include <system.h>
  28. #include <error.h>
  29. #include <xms.h>
  30. #include <vm.h>
  31. #include <vmp.h>
  32.  
  33. #if     VMFREE
  34. #define cVmPageQueuedXmsMost 8
  35. #else   /* !VMFREE */
  36. #define cVmPageQueuedXmsMost 1
  37. #endif  /* !VMFREE */
  38.  
  39. extern char          _near _fVmDisableXms = FALSE;
  40. static char          _near _fVmUseXms;
  41. static HEMB          _near hembVm;
  42. static unsigned      _near ckbVmEmb;
  43. static unsigned      _near _cVmPageQueuedXms;
  44. static unsigned long _near rgibVmPageQueuedXms[cVmPageQueuedXmsMost];
  45.  
  46. #if     VMFREE
  47.  
  48. static unsigned long _near ibVmEmbNextFree;
  49.  
  50. #endif  /* VMFREE */
  51.  
  52.  
  53. #if     VMPROFILE
  54.  
  55. unsigned long  _near _cVmSwapInXms;
  56. unsigned long  _near _cVmSwapOutXms;
  57.  
  58. #endif
  59.  
  60.  
  61. #pragma page()
  62.  
  63. void PRIVATE __VmInitializeXms(void)
  64. {
  65.    VmTracePrintf(("VmInitializeXms\n"));
  66.  
  67. #if     VMPROFILE
  68.    _cVmSwapInXms = _cVmSwapOutXms = 0;
  69. #endif
  70.  
  71.    if (_fVmDisableXms ||
  72.        __FVmWin30StandardMode() ||
  73.        !__FXmsCheckInstalled() ||
  74.        (__ErrXmsAllocateExtMemoryBlock(&hembVm, 0) != errNoError)
  75.       )
  76.    {
  77.       _fVmUseXms = FALSE;
  78.       return;
  79.    }
  80.  
  81.    _fVmUseXms = TRUE;
  82.    ckbVmEmb = 0;
  83.    _cVmPageQueuedXms = 0;
  84.  
  85. #if     VMFREE
  86.    ibVmEmbNextFree = 0xffffffff;
  87. #endif  /* VMFREE */
  88. }
  89.  
  90.  
  91. #pragma page()
  92.  
  93. void PRIVATE __VmTerminateXms(void)
  94. {
  95.    VmTracePrintf(("VmTerminateXms\n"));
  96.  
  97.    VmProfilePrintf(("VmProfile:\t_cVmSwapInXms = %lu, _cVmSwapOutXms = %lu\n",
  98.             _cVmSwapInXms, _cVmSwapOutXms));
  99.  
  100.    if (_fVmUseXms)
  101.    {
  102.       __ErrXmsFreeExtMemoryBlock(hembVm);
  103.  
  104.       _fVmUseXms = FALSE;
  105.    }
  106. }
  107.  
  108.  
  109. #pragma page()
  110.  
  111. void LOCAL __VmFillXmsQueue(void)
  112. {
  113.    VmTracePrintf(("VmFillXmsQueue\n"));
  114.  
  115.    Assert(_fVmUseXms && (_cVmPageQueuedXms == 0));
  116.  
  117. #if     VMFREE
  118.    if (ibVmEmbNextFree != 0xffffffff)
  119.    {
  120.       ERR                     err;
  121.       struct ExtMemMoveStruct extmove;
  122.  
  123.       Assert((ibVmEmbNextFree & ~bitSwapPte) == 0);
  124.  
  125.       /* Insert first free page in queue. */
  126.  
  127.       /* CONSIDER: Should more than one page be added to queue. */
  128.       /* CONSIDER: I chose not to because a subsequent set of */
  129.       /* CONSIDER: calls to VmFreeXmsPage could result in more */
  130.       /* CONSIDER: XMS calls than occur by not doing so. */
  131.  
  132.       rgibVmPageQueuedXms[_cVmPageQueuedXms++] = ibVmEmbNextFree;
  133.  
  134.       extmove.cb         = sizeof(ibVmEmbNextFree);
  135.       extmove.hembSource = hembVm;
  136.       extmove.ibSource   = ibVmEmbNextFree;
  137.       extmove.hembDest   = 0;
  138.       extmove.ibDest     = (unsigned long) (void far *) &ibVmEmbNextFree;
  139.       err = __ErrXmsMoveExtMemoryBlock(&extmove);
  140.       Assert(err == errNoError);
  141.    }
  142.  
  143.    else
  144. #endif  /* VMFREE */
  145.    {
  146.       if (ckbVmEmb + cbVmPage / 1024UL >= 65536UL)
  147.             return;
  148.  
  149.       /* CONSIDER: Allocate more than one page at a time. */
  150.  
  151.       if (__ErrXmsReallocateExtMemoryBlock(hembVm, ckbVmEmb + cbVmPage/1024) != errNoError)
  152.             return;
  153.  
  154.       rgibVmPageQueuedXms[_cVmPageQueuedXms++] = ckbVmEmb * 1024UL;
  155.  
  156.       ckbVmEmb += cbVmPage/1024;
  157.  
  158.       VmTracePrintf(("Reallocated XMS EMB.  ckb = %04X.\n", ckbVmEmb));
  159.    }
  160. }
  161.  
  162.  
  163. #pragma page()
  164.  
  165. int PRIVATE __FVmAllocateXmsPage(PPTE ppte)
  166. {
  167.    if (!_fVmUseXms)
  168.       return(FALSE);
  169.  
  170.    Assert(*ppte == 0);
  171.  
  172.    if (_cVmPageQueuedXms == 0)         /* No Queued pages available. */
  173.       __VmFillXmsQueue();
  174.  
  175.    if (_cVmPageQueuedXms == 0)         /* Queue remains empty. No Xms left. */
  176.       return(FALSE);
  177.  
  178.    *ppte = rgibVmPageQueuedXms[--_cVmPageQueuedXms] | fAllocatedPte | fUnreferencedPte | fXmsPte;
  179.  
  180.    VmTracePrintf(("FVmAllocateXmsPage: SwapLocation = %08lX.\n", *ppte & bitSwapPte));
  181.  
  182.    return(TRUE);
  183. }
  184.  
  185.  
  186. #pragma page()
  187.  
  188. #if     VMFREE
  189.  
  190. void PRIVATE __VmFreeXmsPage(PPTE ppte)
  191. {
  192.    VmTracePrintf(("VmFreeXmsPage: SwapLocation = %08lX.\n", *ppte & bitSwapPte));
  193.  
  194.    Assert(_fVmUseXms && (*ppte & fXmsPte) && !(*ppte & fAllocatedPte));
  195.  
  196.    if (_cVmPageQueuedXms < cVmPageQueuedXmsMost)
  197.       rgibVmPageQueuedXms[_cVmPageQueuedXms++] = *ppte & bitSwapPte;
  198.  
  199.    else
  200.    {
  201.       ERR                     err;
  202.       struct ExtMemMoveStruct extmove;
  203.  
  204.       /* This is not the last page in XMS.  Link into free list. */
  205.  
  206.       extmove.cb         = sizeof(ibVmEmbNextFree);
  207.       extmove.hembSource = 0;
  208.       extmove.ibSource   = (unsigned long) (void far *) &ibVmEmbNextFree;
  209.       extmove.hembDest   = hembVm;
  210.       extmove.ibDest     = *ppte & bitSwapPte;
  211.       err = __ErrXmsMoveExtMemoryBlock(&extmove);
  212.       Assert(err == errNoError);
  213.  
  214.       ibVmEmbNextFree = extmove.ibDest;
  215.    }
  216.  
  217.    *ppte = 0;
  218. }
  219.  
  220. #endif  /* VMFREE */
  221.  
  222. #pragma page()
  223.  
  224. int PRIVATE __FVmSwapInXmsPage(PTE pte, HPGD hpgd)
  225. {
  226.    ERR                     err;
  227.    struct ExtMemMoveStruct extmove;
  228.  
  229.    VmTracePrintf(("VmSwapInXmsPage:  pPage = %Fp, SwapLocation = %08lX.\n",
  230.           PPageOfHpgd(hpgd), pte & bitSwapPte));
  231.  
  232. #if     VMPROFILE
  233.    _cVmSwapInXms++;
  234. #endif
  235.  
  236.    Assert(_fVmUseXms && (pte & fXmsPte));
  237.  
  238.    extmove.cb         = cbVmPage;
  239.    extmove.hembSource = hembVm;
  240.    extmove.ibSource   = pte & bitSwapPte;
  241.    extmove.hembDest   = 0;
  242.    extmove.ibDest     = (unsigned long) PPageOfHpgd(hpgd);
  243.    err = __ErrXmsMoveExtMemoryBlock(&extmove);
  244.  
  245.    Assert(err == errNoError);
  246.    return(err == errNoError);
  247. }
  248.  
  249.  
  250. #pragma page()
  251.  
  252. int PRIVATE __FVmSwapOutXmsPage(PTE pte, HPGD hpgd)
  253. {
  254.    ERR                     err;
  255.    struct ExtMemMoveStruct extmove;
  256.  
  257.    VmTracePrintf(("VmSwapOutXmsPage:  vp = %08lX, pPage = %Fp, SwapLocation = %08lX.\n",
  258.           PpgdOfHpgd(hpgd)->vp, PPageOfHpgd(hpgd), pte & bitSwapPte));
  259.  
  260. #if     VMPROFILE
  261.    _cVmSwapOutXms++;
  262. #endif
  263.  
  264.    Assert(_fVmUseXms && (pte & fXmsPte));
  265.  
  266.    extmove.cb         = cbVmPage;
  267.    extmove.hembSource = 0;
  268.    extmove.ibSource   = (unsigned long) PPageOfHpgd(hpgd);
  269.    extmove.hembDest   = hembVm;
  270.    extmove.ibDest     = pte & bitSwapPte;
  271.    err = __ErrXmsMoveExtMemoryBlock(&extmove);
  272.  
  273.    Assert(err == errNoError);
  274.    return(err == errNoError);
  275. }
  276.