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

VxWorks

开发平台:

C/C++

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