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

VxWorks

开发平台:

C/C++

  1. /* vmBaseLib.c - base virtual memory support library */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01w,16nov01,to   declare global variables in vmData.c to avoid getting multiple
  8.                  vm*Lib.o pulled
  9. 01v,26jul01,scm  add extended small page table support for XScale...
  10. 01u,13nov98,jpd  added support for Protection Unit style MMUs (MPUs).
  11. 01v,14mar99,jdi  doc: removed refs to config.h and/or configAll.h (SPR 25663).
  12. 01u,21feb99,jdi  doc: listed errnos.
  13. 01t,31jul98,ms   make vmContextClassId LOCAL.
  14. 01s,01jan96,tpr  added VM_STATE_MASK_MEM_COHERENCY and VM_STATE_MASK_GUARDED in
  15.  vmBaseGlobalMapInit().
  16. 01r,18nov93,edm  changed BOOL mmuPhysAddrShifted to int mmuPhysAddrShift.
  17. 01q,13sep93,caf  made null for MIPS.
  18. 01p,05apr93,edm  added support for physical addresses->page number option.
  19. 01o,23feb93,jdi  doc tweaks.
  20. 01n,12feb93,jdi  doc tweaks.
  21. 01m,12feb93,rdc  mods to aid testing and reorg of data struture visability.
  22. 01l,10feb93,rdc  made vmBaseStateSet global - allow write protection.
  23. 01k,04feb93,jdi  documentation cleanup for 5.1.
  24. 01j,19oct92,jcf  cleanup.  
  25. 01i,08oct92,rdc  name changes, doc, cleanup.
  26. 01h,01oct92,jcf  added cacheFuncsSet() to attach mmu to cache support. warnings.
  27. 01g,22sep92,rdc  changed NUM_PAGE_STATES to 256.  
  28. 01f,30jul92,rdc  added pointer to vmTranslate routine to vmLibInfo. 
  29. 01e,27jul92,rdc  moved  "vmLib.c" to "vmBaseLib.c"
  30. 01d,21jul92,rdc  took out mutex in vmStateSet so callable from int level.
  31. 01c,13jul92,rdc  changed reference to vmLib.h to vmLibP.h.
  32. 01b,09jul92,rdc  changed indirect routine pointer configuration.
  33. 01a,08jul92,rdc  written.
  34. */
  35. /* 
  36. This library provides the minimal MMU (Memory Management Unit) support 
  37. needed in a system.  Its primary purpose is to create cache-safe buffers for
  38. cacheLib.  Buffers are provided to optimize I/O throughput.
  39. A call to vmBaseLibInit() initializes this library, thus permitting
  40. vmBaseGlobalMapInit() to initialize the MMU and set up MMU translation tables.
  41. Additionally, vmBaseStateSet() can be called to change the 
  42. translation tables dynamically. 
  43. This library is a release-bundled complement to vmLib and vmShow, 
  44. modules that offer full-featured MMU support and virtual memory information
  45. display routines.  The vmLib and vmShow libraries are distributed as the
  46. unbundled virtual memory support option, VxVMI.
  47. CONFIGURATION
  48. Bundled MMU support is included in VxWorks when the configuration macro
  49. INCLUDE_MMU_BASIC is defined.  If the configuration macro INCLUDE_MMU_FULL
  50. is also defined, the default is full MMU support (unbundled).
  51. INCLUDE FILES: sysLib.h, vmLib.h
  52. SEE ALSO: vmLib, vmShow,
  53. .pG "Virtual Memory"
  54. */
  55. #include "vxWorks.h"
  56. #if (CPU_FAMILY != MIPS)
  57. #include "private/vmLibP.h"
  58. #include "stdlib.h"
  59. #include "mmuLib.h"
  60. #include "private/classLibP.h"
  61. #include "private/objLibP.h"
  62. #include "errno.h"
  63. #include "cacheLib.h"
  64. #include "sysLib.h"
  65. /* macros to reference mmuLib routines indirectly through mmuLibFunc table */
  66. #define MMU_LIB_INIT         (*(mmuLibFuncs.mmuLibInit))
  67. #define MMU_TRANS_TBL_CREATE  (*(mmuLibFuncs.mmuTransTblCreate))
  68. #define MMU_TRANS_TBL_DELETE  (*(mmuLibFuncs.mmuTransTblDelete))
  69. #define MMU_ENABLE     (*(mmuLibFuncs.mmuEnable))
  70. #define MMU_STATE_SET     (*(mmuLibFuncs.mmuStateSet))
  71. #define MMU_STATE_GET     (*(mmuLibFuncs.mmuStateGet))
  72. #define MMU_PAGE_MAP     (*(mmuLibFuncs.mmuPageMap))
  73. #define MMU_GLOBAL_PAGE_MAP  (*(mmuLibFuncs.mmuGlobalPageMap))
  74. #define MMU_TRANSLATE     (*(mmuLibFuncs.mmuTranslate))
  75. #define MMU_CURRENT_SET  (*(mmuLibFuncs.mmuCurrentSet))
  76. IMPORT int mmuPageBlockSize;                    /* initialized by mmuLib.c */
  77. IMPORT STATE_TRANS_TUPLE *mmuStateTransArray;   /* initialized by mmuLib.c */
  78. IMPORT int mmuStateTransArraySize;              /* initialized by mmuLib.c */
  79. IMPORT MMU_LIB_FUNCS mmuLibFuncs;               /* initialized by mmuLib.c */
  80. IMPORT int mmuPhysAddrShift;       /* see vmData.c */
  81. /* locals */
  82. /* arch indep. state info uses 8 bits - 2^8=256 possible states */
  83.    
  84. #define NUM_PAGE_STATES 256
  85.    
  86. LOCAL UINT  vmStateTransTbl[NUM_PAGE_STATES];
  87. LOCAL UINT  vmMaskTransTbl[NUM_PAGE_STATES];
  88. LOCAL int  vmPageSize;
  89. LOCAL VM_CONTEXT  sysVmContext;       /* initial vm context */
  90. LOCAL VM_CONTEXT_CLASS  vmContextClass;
  91. LOCAL VM_CONTEXT_CLASS_ID  vmContextClassId = &vmContextClass;
  92. /* globals */
  93. VM_CONTEXT * currentContext = NULL;
  94. int mutexOptionsVmBaseLib =  SEM_Q_PRIORITY | 
  95. SEM_DELETE_SAFE |
  96. SEM_INVERSION_SAFE;
  97. /* forward declarations */
  98. LOCAL STATUS vmBaseContextInit (VM_CONTEXT *context);
  99. LOCAL STATUS vmBaseEnable (BOOL enable);
  100. LOCAL STATUS vmBaseGlobalMap (void *virtualAddr, void *physicalAddr,
  101.  UINT len);
  102. LOCAL STATUS vmBaseTranslate (VM_CONTEXT_ID context, void *virtualAddr, 
  103.          void **physicalAddr);
  104. /******************************************************************************
  105. *
  106. * vmBaseLibInit - initialize base virtual memory support
  107. *
  108. * This routine initializes the virtual memory context class and 
  109. * module-specific data structures.  It is called only once during 
  110. * system initialization, and should be followed with a call to 
  111. * vmBaseGlobalMapInit(), which initializes and enables the MMU.
  112. *
  113. * RETURNS: OK.
  114. *
  115. * SEE ALSO: vmBaseGlobalMapInit()
  116. */
  117. STATUS vmBaseLibInit 
  118.     (
  119.     int pageSize  /* size of page */
  120.     )
  121.     {
  122.     int i;
  123.     int  j;
  124.     UINT  newState;
  125.     UINT  newMask;
  126.     if (vmLibInfo.vmBaseLibInstalled) /* only install vmBaseLib once */
  127. return (OK);
  128.     if (pageSize == 0)
  129. return (ERROR); /* check for reasonable parameter */
  130.     vmPageSize = pageSize;
  131.     /*
  132.      * Initialize the page state translation table.  This table is used to
  133.      * translate between architecture independent state values and architecture
  134.      * dependent state values.
  135.      */
  136.     for (i = 0; i < NUM_PAGE_STATES; i++)
  137. {
  138. newState = 0;
  139. for (j = 0; j < mmuStateTransArraySize; j++)
  140.     {
  141.     STATE_TRANS_TUPLE *thisTuple = &mmuStateTransArray[j];
  142.     UINT archIndepState = thisTuple->archIndepState;
  143.     UINT archDepState = thisTuple->archDepState;
  144.     UINT archIndepMask = thisTuple->archIndepMask;
  145.     if ((i & archIndepMask) == archIndepState)
  146. newState |= archDepState;
  147.     }
  148. vmStateTransTbl [i] = newState;
  149. }
  150.     /*
  151.      * Initialize the page state mask translation table.  This table is used to
  152.      * translate between architecture independent state masks and architecture
  153.      * dependent state masks.
  154.      */
  155.     for (i = 0; i < NUM_PAGE_STATES; i++)
  156. {
  157. newMask = 0;
  158. for (j = 0; j < mmuStateTransArraySize; j++)
  159.     {
  160.     STATE_TRANS_TUPLE *thisTuple = &mmuStateTransArray[j];
  161.     UINT archIndepMask = thisTuple->archIndepMask;
  162.     UINT archDepMask = thisTuple->archDepMask;
  163.     if ((i & archIndepMask) == archIndepMask)
  164. newMask |= archDepMask;
  165.     }
  166. vmMaskTransTbl [i] = newMask;
  167. }
  168.     classInit ((OBJ_CLASS *) &vmContextClass.coreClass, sizeof (VM_CONTEXT), 
  169.        OFFSET(VM_CONTEXT, objCore), NULL, NULL, NULL);
  170.     vmLibInfo.pVmStateSetRtn     = vmBaseStateSet;
  171.     vmLibInfo.pVmEnableRtn       = vmBaseEnable;
  172.     vmLibInfo.pVmPageSizeGetRtn  = vmBasePageSizeGet;
  173.     vmLibInfo.pVmTranslateRtn    = vmBaseTranslate;
  174.     vmLibInfo.vmBaseLibInstalled = TRUE;
  175.     cacheMmuAvailable  = TRUE;
  176.     cacheFuncsSet (); /* update cache funtion pointers */
  177.     return (OK);
  178.     }
  179. /******************************************************************************
  180. *
  181. * vmBaseGlobalMapInit - initialize global mapping
  182. *
  183. * This routine creates and installs a virtual memory context with mappings
  184. * defined for each contiguous memory segment defined in <pMemDescArray>.
  185. * In the standard VxWorks configuration, an instance of PHYS_MEM_DESC (called
  186. * `sysPhysMemDesc') is defined in sysLib.c; the variable is passed to
  187. * vmBaseGlobalMapInit() by the system configuration mechanism.
  188. *
  189. * The physical memory descriptor also contains state information
  190. * used to initialize the state information in the MMU's translation table
  191. * for that memory segment.  The following state bits may be or'ed together:
  192. *
  193. * .TS
  194. * tab(|);
  195. * l0 l0 l .
  196. *  VM_STATE_VALID     | VM_STATE_VALID_NOT     | valid/invalid
  197. *  VM_STATE_WRITABLE  | VM_STATE_WRITABLE_NOT  | writable/write-protected
  198. *  VM_STATE_CACHEABLE | VM_STATE_CACHEABLE_NOT | cacheable/not-cacheable
  199. * .TE
  200. *
  201. * Additionally, mask bits are or'ed together in the `initialStateMask' structure
  202. * element to describe which state bits are being specified in the `initialState'
  203. * structure element:
  204. *
  205. *  VM_STATE_MASK_VALID
  206. *  VM_STATE_MASK_WRITABLE
  207. *  VM_STATE_MASK_CACHEABLE
  208. *
  209. * If <enable> is TRUE, the MMU is enabled upon return.
  210. *
  211. * RETURNS: A pointer to a newly created virtual memory context, or NULL if
  212. * memory cannot be mapped.
  213. *
  214. * SEE ALSO: vmBaseLibInit()
  215. */
  216. VM_CONTEXT_ID vmBaseGlobalMapInit 
  217.     (
  218.     PHYS_MEM_DESC *pMemDescArray,  /* pointer to array of mem descs */
  219.     int numDescArrayElements, /* no. of elements in pMemDescArray */
  220.     BOOL enable /* enable virtual memory */
  221.     )
  222.     {
  223.     int i;
  224.     PHYS_MEM_DESC *thisDesc;
  225.     FAST char *thisPage; 
  226. #if !defined(BUILD_MPU_LIB)
  227.     FAST UINT numBytesProcessed; 
  228.     int pageSize = vmPageSize;
  229. #endif
  230.     UINT archIndepStateMask; 
  231.     UINT archDepStateMask; 
  232.     UINT archDepState;
  233.     UINT archIndepState;
  234.     /* set up global transparent mapping of physical to virtual memory */
  235.     for (i = 0; i < numDescArrayElements; i++)
  236.         {
  237.         thisDesc = &pMemDescArray[i];
  238.         /* map physical directly to virtual and set initial state */
  239.         if (vmBaseGlobalMap ((void *) thisDesc->virtualAddr, 
  240.  (void *) thisDesc->physicalAddr,
  241.  thisDesc->len) == ERROR)
  242.             {
  243.     return (NULL);
  244.             }
  245.         }
  246.     /* create default virtual memory context */
  247.     if (vmBaseContextInit (&sysVmContext) == ERROR)
  248. {
  249. return (NULL);
  250. }
  251.     /* set the state of all the global memory we just created */ 
  252.     for (i = 0; i < numDescArrayElements; i++)
  253.         {
  254.         thisDesc = &pMemDescArray[i];
  255. thisPage = thisDesc->virtualAddr;
  256. #if !defined(BUILD_MPU_LIB)
  257. numBytesProcessed = 0;
  258. while (numBytesProcessed < thisDesc->len)
  259.     {
  260.     /* we let the use specifiy cacheablility, but not writeablility */
  261.     archIndepState = thisDesc->initialState; 
  262.     archDepState = vmStateTransTbl [archIndepState];
  263.     archIndepStateMask = 
  264. VM_STATE_MASK_CACHEABLE     | 
  265. VM_STATE_MASK_VALID         |
  266. VM_STATE_MASK_WRITABLE      |
  267. VM_STATE_MASK_BUFFERABLE    |
  268. VM_STATE_MASK_EX_CACHEABLE  |
  269. VM_STATE_MASK_EX_BUFFERABLE |
  270. VM_STATE_MASK_MEM_COHERENCY |
  271. VM_STATE_MASK_GUARDED;
  272.     archDepStateMask = vmMaskTransTbl [archIndepStateMask];
  273.     if (MMU_STATE_SET (sysVmContext.mmuTransTbl, thisPage, 
  274.     archDepStateMask, archDepState) == ERROR)
  275. return (NULL);
  276.     thisPage += pageSize;
  277.     numBytesProcessed += pageSize;
  278.     }
  279. #else /* !defined(BUILD_MPU_LIB) */
  280. /*
  281.  * On an MPU, we need to pass the whole region on to the
  282.  * architecture-specific code, not break it up into pages.
  283.  */
  284. archIndepState = thisDesc->initialState; 
  285. archDepState = vmStateTransTbl [archIndepState];
  286. archIndepStateMask = 
  287.     VM_STATE_MASK_CACHEABLE     | 
  288.     VM_STATE_MASK_VALID         |
  289.     VM_STATE_MASK_WRITABLE      |
  290.             VM_STATE_MASK_BUFFERABLE    |
  291.             VM_STATE_MASK_EX_CACHEABLE  |
  292.             VM_STATE_MASK_EX_BUFFERABLE |
  293.     VM_STATE_MASK_MEM_COHERENCY |
  294.     VM_STATE_MASK_GUARDED;
  295. archDepStateMask = vmMaskTransTbl [archIndepStateMask];
  296. if (MMU_STATE_SET (sysVmContext.mmuTransTbl, thisPage, 
  297. archDepStateMask, archDepState, thisDesc->len) == ERROR)
  298.     return NULL;
  299. #endif /* !defined(BUILD_MPU_LIB) */
  300.         }
  301.     currentContext = &sysVmContext;
  302.     MMU_CURRENT_SET (sysVmContext.mmuTransTbl);
  303.     if (enable)
  304. if (MMU_ENABLE (TRUE) == ERROR)
  305.     return (NULL);
  306.     return (&sysVmContext);
  307.     }
  308. /****************************************************************************
  309. *
  310. * vmBaseContextInit - initializer for VM_CONTEXT.
  311. *
  312. * This routine may be used to initialize static definitions of VM_CONTEXT
  313. *
  314. * RETURNS: OK, or ERROR if the translation table could not be created.
  315. */
  316. LOCAL STATUS vmBaseContextInit 
  317.     (
  318.     VM_CONTEXT *context
  319.     )
  320.     {
  321.     objCoreInit (&context->objCore, (CLASS_ID) vmContextClassId);
  322.     semMInit (&context->sem, mutexOptionsVmBaseLib);
  323.     context->mmuTransTbl = MMU_TRANS_TBL_CREATE ();
  324.     if (context->mmuTransTbl == NULL)
  325. return (ERROR);
  326.     return (OK);
  327.     }
  328. /****************************************************************************
  329. *
  330. * vmBaseGlobalMap - map physical to virtual in shared global virtual memory
  331. *
  332. * vmBaseGlobalMap maps physical pages to virtual space that is shared by all
  333. * virtual memory contexts.  Calls to vmBaseGlobalMap should be made before any
  334. * virtual memory contexts are created to insure that the shared global mappings
  335. * will be included in all virtual memory contexts.  Mappings created with 
  336. * vmBaseGlobalMap after virtual memory contexts are created are not guaranteed 
  337. * to appear in all virtual memory contexts.
  338. *
  339. * RETURNS: OK, or ERROR if virtualAddr or physical page addresses are not on
  340. * page boundaries, len is not a multiple of page size, or mapping failed.
  341. */
  342. LOCAL STATUS vmBaseGlobalMap 
  343.     (
  344.     void *virtualAddr, 
  345.     void *physicalAddr, 
  346.     UINT len
  347.     )
  348.     {
  349.     int pageSize = vmPageSize;
  350.     char *thisVirtPage = (char *) virtualAddr;
  351.     char *thisPhysPage = (char *) physicalAddr;
  352. #if !defined(BUILD_MPU_LIB)
  353.     FAST UINT numBytesProcessed = 0;
  354. #endif
  355.     if (!vmLibInfo.vmBaseLibInstalled)
  356. return (ERROR);
  357.     if (((UINT) thisVirtPage % pageSize) != 0)
  358. {
  359. errno = S_vmLib_NOT_PAGE_ALIGNED;
  360.         return (ERROR); 
  361. }
  362.     if ((!mmuPhysAddrShift) && (((UINT) thisPhysPage % pageSize) != 0))
  363. {
  364. errno = S_vmLib_NOT_PAGE_ALIGNED;
  365.         return (ERROR); 
  366. }
  367.     if ((len % pageSize) != 0)
  368. {
  369. errno = S_vmLib_NOT_PAGE_ALIGNED;
  370.         return (ERROR); 
  371. }
  372. #if !defined(BUILD_MPU_LIB)
  373.     while (numBytesProcessed < len)
  374. {
  375. if (MMU_GLOBAL_PAGE_MAP (thisVirtPage, thisPhysPage) == ERROR)
  376.     return (ERROR);
  377. thisVirtPage += pageSize;
  378. thisPhysPage += (mmuPhysAddrShift ? 1 : pageSize);
  379. numBytesProcessed += pageSize;
  380. }
  381. #else /* !defined(BUILD_MPU_LIB) */
  382. /*
  383.  * On an MPU, we need to pass the whole region on to the
  384.  * architecture-specific code, not break it up into pages.
  385.  */
  386.     if (MMU_GLOBAL_PAGE_MAP (thisVirtPage, thisPhysPage, len) == ERROR)
  387. return ERROR;
  388. #endif /* !defined(BUILD_MPU_LIB) */
  389.     return (OK);
  390.     }
  391. /****************************************************************************
  392. *
  393. * vmBaseStateSet - change the state of a block of virtual memory
  394. *
  395. * This routine changes the state of a block of virtual memory.  Each page
  396. * of virtual memory has at least three elements of state information:
  397. * validity, writability, and cacheability.  Specific architectures may
  398. * define additional state information; see vmLib.h for additional
  399. * architecture-specific states.  Memory accesses to a page marked as
  400. * invalid will result in an exception.  Pages may be invalidated to prevent
  401. * them from being corrupted by invalid references.  Pages may be defined as
  402. * read-only or writable, depending on the state of the writable bits.
  403. * Memory accesses to pages marked as not-cacheable will always result in a
  404. * memory cycle, bypassing the cache.  This is useful for multiprocessing,
  405. * multiple bus masters, and hardware control registers.
  406. *
  407. * The following states are provided and may be or'ed together in the 
  408. * state parameter:  
  409. *
  410. * .TS
  411. * tab(|);
  412. * l0 l0 l .
  413. *  VM_STATE_VALID     | VM_STATE_VALID_NOT     | valid/invalid
  414. *  VM_STATE_WRITABLE  | VM_STATE_WRITABLE_NOT  | writable/write-protected
  415. *  VM_STATE_CACHEABLE | VM_STATE_CACHEABLE_NOT | cacheable/not-cacheable
  416. * .TE
  417. *
  418. * Additionally, the following masks are provided so that only specific
  419. * states may be set.  These may be or'ed together in the `stateMask' parameter. 
  420. *
  421. *  VM_STATE_MASK_VALID
  422. *  VM_STATE_MASK_WRITABLE
  423. *  VM_STATE_MASK_CACHEABLE
  424. *
  425. * If <context> is specified as NULL, the current context is used.
  426. *
  427. * This routine is callable from interrupt level.
  428. *
  429. * RETURNS: OK, or ERROR if the validation fails, <pVirtual> is not on a page
  430. * boundary, <len> is not a multiple of the page size, or the
  431. * architecture-dependent state set fails for the specified virtual address.
  432. *
  433. * ERRNO:
  434. * S_vmLib_NOT_PAGE_ALIGNED,
  435. * S_vmLib_BAD_STATE_PARAM,
  436. * S_vmLib_BAD_MASK_PARAM
  437. *
  438. */
  439. STATUS vmBaseStateSet 
  440.     (
  441.     VM_CONTEXT_ID context,  /* context - NULL == currentContext */
  442.     void *pVirtual,  /* virtual address to modify state of */
  443.     int len,  /* len of virtual space to modify state of */
  444.     UINT stateMask,  /* state mask */
  445.     UINT state /* state */
  446.     )
  447.     {
  448.     FAST int pageSize = vmPageSize;
  449.     FAST char *thisPage = (char *) pVirtual;
  450. #if !defined(BUILD_MPU_LIB)
  451.     FAST UINT numBytesProcessed = 0;
  452. #endif
  453.     UINT archDepState;
  454.     UINT archDepStateMask;
  455.     STATUS retVal = OK;
  456.     if (!vmLibInfo.vmBaseLibInstalled)
  457. return (ERROR);
  458.     if (context == NULL)
  459. context = currentContext;
  460.     if (OBJ_VERIFY (context, vmContextClassId) != OK)
  461. return (ERROR);
  462.     if (((UINT) thisPage % pageSize) != 0)
  463. {
  464. errno = S_vmLib_NOT_PAGE_ALIGNED;
  465.         return (ERROR); 
  466. }
  467.     if ((len % pageSize) != 0)
  468. {
  469. errno = S_vmLib_NOT_PAGE_ALIGNED;
  470.         return (ERROR); 
  471. }
  472.     if (state > NUM_PAGE_STATES)
  473.         {
  474.         errno = S_vmLib_BAD_STATE_PARAM;
  475.         return (ERROR);
  476.         }
  477.     if (stateMask > NUM_PAGE_STATES)
  478.         {
  479.         errno = S_vmLib_BAD_MASK_PARAM;
  480.         return (ERROR);
  481.         }
  482.     /* get the architecture dependent states and state masks */
  483.     archDepState = vmStateTransTbl [state];
  484.     archDepStateMask = vmMaskTransTbl [stateMask];
  485.     /* call mmuStateSet to do the actual work */
  486. #if !defined(BUILD_MPU_LIB)
  487.     while (numBytesProcessed < (UINT)len)
  488.         {
  489.         if (MMU_STATE_SET (context->mmuTransTbl, thisPage,
  490.                          archDepStateMask, archDepState) == ERROR)
  491.            {
  492.    retVal = ERROR;
  493.    break;
  494.    }
  495.         thisPage += pageSize;
  496. numBytesProcessed += pageSize;
  497. }
  498. #else /* !defined(BUILD_MPU_LIB) */
  499. /*
  500.  * On an MPU, we need to pass the whole region on to the
  501.  * architecture-specific code, not break it up into pages.
  502.  */
  503.     if (MMU_STATE_SET (context->mmuTransTbl, thisPage,
  504.      archDepStateMask, archDepState, len) == ERROR)
  505.        retVal = ERROR;
  506. #endif /*!defined(BUILD_MPU_LIB) */
  507.     return (retVal);
  508.     }
  509. /****************************************************************************
  510. *
  511. * vmBaseEnable - enable/disable virtual memory
  512. *
  513. * vmBaseEnable turns virtual memory on and off.  
  514. *
  515. * RETURNS: OK, or ERROR if validation failed, or architecture-dependent 
  516. * code failed.
  517. */
  518. LOCAL STATUS vmBaseEnable
  519.     (
  520.     BOOL enable         /* TRUE == enable MMU, FALSE == disable MMU */
  521.     )
  522.     {
  523.     return (MMU_ENABLE (enable));
  524.     }
  525. /****************************************************************************
  526. *
  527. * vmBasePageSizeGet - return the page size
  528. *
  529. * This routine returns the architecture-dependent page size.
  530. *
  531. * This routine is callable from interrupt level.
  532. *
  533. * RETURNS: The page size of the current architecture. 
  534. *
  535. */
  536. int vmBasePageSizeGet (void)
  537.     {
  538.     return (vmPageSize);
  539.     }
  540. /****************************************************************************
  541. *
  542. * vmBaseTranslate - translate a virtual address to a physical address
  543. *
  544. * vmBaseTranslate may be used to retrieve the mapping information for a
  545. * virtual address from the page translation tables.  If the given 
  546. * virtual address has never been mapped, either the returned status will
  547. * be ERROR, or, the returned status will be OK, but the returned physical
  548. * address will be -1.
  549. * If context is specified as NULL, the current context is used.
  550. * This routine is callable from interrupt level.
  551. *
  552. * RETURNS: OK, or validation failed, or translation failed.
  553. */
  554. LOCAL STATUS vmBaseTranslate 
  555.     (
  556.     VM_CONTEXT_ID context,  /* context - NULL == currentContext */
  557.     void *virtualAddr,  /* virtual address */
  558.     void **physicalAddr /* place to put result */
  559.     )
  560.     {
  561.     STATUS retVal;
  562.     if (context == NULL)
  563. context = currentContext;
  564.     if (OBJ_VERIFY (context, vmContextClassId) != OK)
  565. return (ERROR);
  566.     retVal =  MMU_TRANSLATE (context->mmuTransTbl, virtualAddr, physicalAddr);
  567.     return (retVal);
  568.     }
  569. #endif /* (CPU_FAMILY != MIPS) */