vmBaseArch36Lib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* vmBaseArch36Lib.c - VM (bundled) library for PentiumPro/2/3/4 36 bit mode */
  2. /* Copyright 2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01a,12jun02,hdn  written
  8. */
  9. /*
  10. DESCRIPTION:
  11. vmBaseArch36Lib.c provides the virtual memory mapping and virtual address
  12. translation that works with the bundled VM library.
  13. It provides 2 routines that are linked in when INCLUDE_MMU_BASIC and 
  14. INCLUDE_MMU_P6_36BIT are both defined in the BSP.
  15. */
  16. /* includes */
  17. #include "vxWorks.h"
  18. #include "errno.h"
  19. #include "mmuLib.h"
  20. #include "private/vmLibP.h"
  21. #include "arch/i86/mmuPro36Lib.h"
  22. /* imports */
  23. IMPORT VM_CONTEXT * currentContext; /* vmBaseLib.c */
  24. /* defines */
  25. #define NOT_PAGE_ALIGNED(addr)  (((UINT)(addr)) & ((UINT)pageSize - 1))
  26. #define MMU_PAGE_MAP (mmuPro36PageMap)
  27. #define MMU_TRANSLATE (mmuPro36Translate)
  28. /****************************************************************************
  29. *
  30. * vmBaseArch36LibInit - initialize the arch specific bundled VM library
  31. *
  32. * This routine links the arch specific bundled VM library into the VxWorks 
  33. * system.  It is called automatically when %INCLUDE_MMU_BASIC and 
  34. * %INCLUDE_MMU_P6_36BIT are both defined in the BSP.
  35. *
  36. * RETURNS: N/A
  37. */
  38. void vmBaseArch36LibInit (void)
  39.     {
  40.     } 
  41. /****************************************************************************
  42. *
  43. * vmBaseArch36Map - map 36bit physical to the 32bit virtual memory
  44. *
  45. * vmBaseArch36Map maps 36bit physical pages to 32bit virtual space then
  46. * sets the specified state.
  47. *
  48. * RETURNS: OK, or ERROR if virtAddr or physical page addresses are not on
  49. * page boundaries, len is not a multiple of page size, or mapping failed.
  50. */
  51. STATUS vmBaseArch36Map 
  52.     (
  53.     void * virtAddr,  /* 32bit virtual address */
  54.     LL_INT physAddr,  /* 36bit physical address */
  55.     UINT32 stateMask, /* state mask */
  56.     UINT32 state, /* state */
  57.     UINT32 len /* length */
  58.     )
  59.     {
  60.     INT32 pageSize      = vmBasePageSizeGet ();
  61.     INT8 * thisVirtPage = (INT8 *) virtAddr;
  62.     LL_INT thisPhysPage = physAddr;
  63.     FAST UINT32 numBytesProcessed = 0;
  64.     STATUS retVal       = OK;
  65.     if (!vmLibInfo.vmBaseLibInstalled)
  66. return (ERROR);
  67.     if ((NOT_PAGE_ALIGNED (thisVirtPage)) ||
  68.         (NOT_PAGE_ALIGNED (thisPhysPage)) ||
  69.         (NOT_PAGE_ALIGNED (len)))
  70. {
  71. errno = S_vmLib_NOT_PAGE_ALIGNED;
  72.         return (ERROR); 
  73. }
  74.     semTake (&currentContext->sem, WAIT_FOREVER);
  75.     while (numBytesProcessed < len)
  76. {
  77. if (MMU_PAGE_MAP (currentContext->mmuTransTbl,
  78.   thisVirtPage, thisPhysPage) != OK)
  79.     {
  80.     retVal = ERROR;
  81.     break;
  82.     }
  83. if (vmBaseStateSet (currentContext, thisVirtPage,
  84.     pageSize, stateMask, state) != OK)
  85.     {
  86.     retVal = ERROR;
  87.     break;
  88.     }
  89. thisVirtPage += pageSize;
  90. thisPhysPage += pageSize;
  91. numBytesProcessed += pageSize;
  92. }
  93.     semGive (&currentContext->sem);
  94.     return (retVal);
  95.     }
  96. /****************************************************************************
  97. *
  98. * vmBaseArch36Translate - translate a 32bit virtual address to a 36bit physical address
  99. *
  100. * vmBaseArch36Translate may be used to retrieve the mapping information 
  101. * for a virtual address from the page translation tables.  If the given 
  102. * virtual address has never been mapped, either the returned status will
  103. * be ERROR, or, the returned status will be OK, but the returned physical
  104. * address will be -1.
  105. * If context is specified as NULL, the current context is used.
  106. * This routine is callable from interrupt level.
  107. *
  108. * RETURNS: OK, or validation failed, or translation failed.
  109. */
  110. STATUS vmBaseArch36Translate 
  111.     (
  112.     void *  virtAddr,  /* 32bit virtual address */
  113.     LL_INT * physAddr /* place to put 36bit result */
  114.     )
  115.     {
  116.     STATUS retVal;
  117.     if (!vmLibInfo.vmBaseLibInstalled)
  118. return (ERROR);
  119.     retVal = MMU_TRANSLATE (currentContext->mmuTransTbl, virtAddr, physAddr);
  120.     return (retVal);
  121.     }