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

VxWorks

开发平台:

C/C++

  1. /* vmBaseArch32Lib.c - VM (bundled) library for PentiumPro/2/3/4 32 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. vmBaseArch32Lib.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_32BIT 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/mmuPro32Lib.h"
  22. /* imports */
  23. IMPORT VM_CONTEXT * currentContext; /* vmBaseLib.c */
  24. IMPORT MMU_LIB_FUNCS mmuLibFuncs; /* mmuLib.c */
  25. /* defines */
  26. #define NOT_PAGE_ALIGNED(addr) (((UINT)(addr)) & ((UINT)pageSize - 1))
  27. #define MMU_PAGE_MAP (*(mmuLibFuncs.mmuPageMap))
  28. #define MMU_TRANSLATE (*(mmuLibFuncs.mmuTranslate))
  29. /****************************************************************************
  30. *
  31. * vmBaseArch32LibInit - initialize the arch specific bundled VM library
  32. *
  33. * This routine links the arch specific bundled VM library into the VxWorks 
  34. * system.  It is called automatically when %INCLUDE_MMU_BASIC and 
  35. * %INCLUDE_MMU_P6_32BIT are both defined in the BSP.
  36. *
  37. * RETURNS: N/A
  38. */
  39. void vmBaseArch32LibInit (void)
  40.     {
  41.     } 
  42. /****************************************************************************
  43. *
  44. * vmBaseArch32Map - map 32bit physical to the 32bit virtual memory
  45. *
  46. * vmBaseArch32Map maps 32bit physical pages to 32bit virtual space then
  47. * sets the specified state.
  48. *
  49. * RETURNS: OK, or ERROR if virtAddr or physical page addresses are not on
  50. * page boundaries, len is not a multiple of page size, or mapping failed.
  51. */
  52. STATUS vmBaseArch32Map 
  53.     (
  54.     void * virtAddr,  /* 32bit virtual address */
  55.     void * physAddr,  /* 36bit physical address */
  56.     UINT32 stateMask, /* state mask */
  57.     UINT32 state, /* state */
  58.     UINT32 len /* length */
  59.     )
  60.     {
  61.     INT32 pageSize      = vmBasePageSizeGet ();
  62.     INT8 * thisVirtPage = (INT8 *) virtAddr;
  63.     INT8 * thisPhysPage = (INT8 *) physAddr;
  64.     FAST UINT32 numBytesProcessed = 0;
  65.     STATUS retVal = OK;
  66.     if (!vmLibInfo.vmBaseLibInstalled)
  67. return (ERROR);
  68.     if ((NOT_PAGE_ALIGNED (thisVirtPage)) ||
  69.         (NOT_PAGE_ALIGNED (thisPhysPage)) ||
  70.         (NOT_PAGE_ALIGNED (len)))
  71. {
  72. errno = S_vmLib_NOT_PAGE_ALIGNED;
  73.         return (ERROR); 
  74. }
  75.     semTake (&currentContext->sem, WAIT_FOREVER);
  76.     while (numBytesProcessed < len)
  77. {
  78. if (MMU_PAGE_MAP (currentContext->mmuTransTbl,
  79.   thisVirtPage, thisPhysPage) != OK)
  80.     {
  81.     retVal = ERROR;
  82.     break;
  83.     }
  84. if (vmBaseStateSet (currentContext, thisVirtPage, 
  85.     pageSize, stateMask, state) != OK)
  86.     {
  87.     retVal = ERROR;
  88.     break;
  89.     }
  90. thisVirtPage += pageSize;
  91. thisPhysPage += pageSize;
  92. numBytesProcessed += pageSize;
  93. }
  94.     semGive (&currentContext->sem);
  95.     return (retVal);
  96.     }
  97. /****************************************************************************
  98. *
  99. * vmBaseArch32Translate - translate a 32bit virtual address to a 32bit physical address
  100. *
  101. * vmBaseArch32Translate may be used to retrieve the mapping information 
  102. * for a virtual address from the page translation tables.  If the given 
  103. * virtual address has never been mapped, either the returned status will
  104. * be ERROR, or, the returned status will be OK, but the returned physical
  105. * address will be -1.
  106. * If context is specified as NULL, the current context is used.
  107. * This routine is callable from interrupt level.
  108. *
  109. * RETURNS: OK, or validation failed, or translation failed.
  110. */
  111. STATUS vmBaseArch32Translate 
  112.     (
  113.     void *  virtAddr,  /* virtual address */
  114.     void ** physAddr /* place to put result */
  115.     )
  116.     {
  117.     STATUS retVal;
  118.     if (!vmLibInfo.vmBaseLibInstalled)
  119. return (ERROR);
  120.     retVal = MMU_TRANSLATE (currentContext->mmuTransTbl, virtAddr, physAddr);
  121.     return (retVal);
  122.     }