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

VxWorks

开发平台:

C/C++

  1. /* vmArch32Lib.c - VM (VxVMI) 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. vmArch32Lib.c provides the virtual memory mapping and virtual address
  12. translation that works with the unbundled VM library VxVMI.
  13. It provides 2 routines that are linked in when INCLUDE_MMU_FULL 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 UINT8 * globalPageBlockArray; /* vmLib.c */
  24. IMPORT MMU_LIB_FUNCS mmuLibFuncs; /* mmuPro32Lib.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. * vmArch32LibInit - initialize the arch specific unbundled VM library (VxVMI Option)
  32. *
  33. * This routine links the arch specific unbundled VM library into 
  34. * the VxWorks system.  It is called automatically when %INCLUDE_MMU_FULL 
  35. * and %INCLUDE_MMU_P6_32BIT are both defined in the BSP.
  36. *
  37. * RETURNS: N/A
  38. */
  39. void vmArch32LibInit (void)
  40.     {
  41.     } 
  42. /*******************************************************************************
  43. *
  44. * vmArch32Map - map 32bit physical space into 32bit virtual space (VxVMI Option)
  45. *
  46. * This routine maps 32bit physical pages into a contiguous block of 32bit 
  47. * virtual memory.  <virtAddr> and <physAddr> must be on page boundaries,
  48. * and <len> must be evenly divisible by the page size.  After the call to
  49. * vmMap(), the state of all pages in the the newly mapped virtual memory is
  50. * valid, writable, and cacheable.
  51. *
  52. * The vmArch32Map() routine can fail if the specified virtual address space
  53. * conflicts with the translation tables of the global virtual memory space.
  54. * The global virtual address space is architecture-dependent and is
  55. * initialized at boot time with calls to vmGlobalMap() by vmGlobalMapInit(). 
  56. * If a conflict results, `errno' is set to S_vmLib_ADDR_IN_GLOBAL_SPACE.  
  57. * To avoid this conflict, use vmGlobalInfoGet() to ascertain which portions 
  58. * of the virtual address space are reserved for the global virtual address 
  59. * space.  If <context> is specified as NULL, the current virtual memory 
  60. * context is used.
  61. *
  62. * This routine should not be called from interrupt level.
  63. *
  64. * AVAILABILITY
  65. * This routine is distributed as a component of the unbundled virtual memory
  66. * support option, VxVMI.
  67. *
  68. * RETURNS: OK, or ERROR if <virtAddr> or <physAddr> are not 
  69. * on page boundaries, <len> is not a multiple of the page size, 
  70. * the validation fails, or the mapping fails.
  71. *
  72. * ERRNO:
  73. * S_vmLib_NOT_PAGE_ALIGNED,
  74. * S_vmLib_ADDR_IN_GLOBAL_SPACE
  75. */
  76. STATUS vmArch32Map 
  77.     (
  78.     VM_CONTEXT_ID context,  /* context - NULL == currentContext */
  79.     void * virtAddr,  /* virtual address */
  80.     void * physAddr, /* physical address */
  81.     UINT32 stateMask, /* state mask */
  82.     UINT32 state, /* state */
  83.     UINT32 len /* len of virtual and physical spaces */
  84.     )
  85.     {
  86.     INT32 pageSize      = vmPageSizeGet ();
  87.     INT32 pageBlockSize = vmPageBlockSizeGet ();
  88.     INT8 * thisVirtPage = (INT8 *) virtAddr;
  89.     INT8 * thisPhysPage = (INT8 *) physAddr;
  90.     FAST UINT32 numBytesProcessed = 0;
  91.     STATUS retVal = OK;
  92.     if (!vmLibInfo.vmLibInstalled)
  93. return (ERROR);
  94.     if (context == NULL)
  95. context = vmCurrentGet ();
  96.     if ((NOT_PAGE_ALIGNED (thisVirtPage)) ||
  97.         (NOT_PAGE_ALIGNED (thisPhysPage)) ||
  98.         (NOT_PAGE_ALIGNED (len)))
  99. {
  100. errno = S_vmLib_NOT_PAGE_ALIGNED;
  101.         return (ERROR); 
  102. }
  103.     /* take mutual exclusion semaphore to protect translation table */
  104.     semTake (&context->sem, WAIT_FOREVER);
  105.     while (numBytesProcessed < len)
  106. {
  107. /* make sure there isn't a conflict with global virtual memory */
  108. if (globalPageBlockArray[(UINT32) thisVirtPage / pageBlockSize])
  109.     {
  110.     errno = S_vmLib_ADDR_IN_GLOBAL_SPACE;
  111.     retVal = ERROR;
  112.     break;
  113.     }
  114. if (MMU_PAGE_MAP (context->mmuTransTbl, thisVirtPage, 
  115.   thisPhysPage) == ERROR)
  116.     {
  117.     retVal = ERROR;
  118.     break;
  119.     }
  120.         if (vmStateSet (context, thisVirtPage, pageSize,
  121. stateMask, state) != OK)
  122.     {
  123.     retVal = ERROR;
  124.     break;
  125.     }
  126. thisVirtPage += pageSize;
  127. thisPhysPage += pageSize;
  128. numBytesProcessed += pageSize;
  129. }
  130.     semGive (&context->sem);
  131.     return (retVal);
  132.     }
  133. /*******************************************************************************
  134. *
  135. * vmArch32Translate - translate a 32bit virtual address to a 32bit physical address (VxVMI Option)
  136. *
  137. * This routine retrieves mapping information for a 32bit virtual address from 
  138. * the page translation tables.  If the specified virtual address has never been
  139. * mapped, the returned status can be either OK or ERROR; however, if it is
  140. * OK, then the returned physical address will be -1.  If <context> is
  141. * specified as NULL, the current context is used.
  142. *
  143. * This routine is callable from interrupt level.
  144. *
  145. * AVAILABILITY
  146. * This routine is distributed as a component of the unbundled virtual memory
  147. * support option, VxVMI.
  148. *
  149. * RETURNS: OK, or ERROR if the validation or translation fails.
  150. */
  151. STATUS vmArch32Translate 
  152.     (
  153.     VM_CONTEXT_ID context,  /* context - NULL == currentContext */
  154.     void * virtAddr,  /* virtual address */
  155.     void ** physAddr /* place to put result */
  156.     )
  157.     {
  158.     STATUS retVal;
  159.     if (!vmLibInfo.vmLibInstalled)
  160. return (ERROR);
  161.     if (context == NULL)
  162. context = vmCurrentGet ();
  163.     retVal = MMU_TRANSLATE (context->mmuTransTbl, virtAddr, physAddr);
  164.     return (retVal);
  165.     }