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

VxWorks

开发平台:

C/C++

  1. /* vmShow.c - virtual memory show routines (VxVMI Option) */
  2. /* Copyright 1984-1998 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01q,17mar99,jdi  doc: updated w/ info about proj facility (SPR 25727).
  8. 01p,16apr98,hdn  fixed typo by renaming XXX_WRITEBACK to XXX_WBACK.
  9. 01o,09apr98,hdn  added support for Pentium, PentiumPro.
  10. 01k,18aug94,tpr  changed VM_STATE_CACHEABLE to VM_STATE_MASK_CACHEABLE in
  11.  vmContextShowNewBlock().
  12. 01k,13sep93,caf  made null for MIPS.
  13. 01l,18nov93,edm  changed BOOL mmuPhysAddrShifted to int mmuPhysAddrShift.
  14. 01k,23mar93,edm  added support for physical addresses->page number option.
  15. 01j,23feb93,jdi  doc: added Availability section.
  16. 01i,04feb93,rdc  fixed bug preventing display of blocks at end of vm space.
  17.  removed display of "V+", minor doc tweak.
  18. 01h,03feb93,jdi  documentation - marked as optional product.
  19. 01g,02feb93,jdi  documentation tweaks.
  20. 01f,21oct92,jdi  doc change as per pme.
  21. 01e,19oct92,jcf  guarded against zero divide.
  22. 01d,02oct92,jdi  documentation cleanup.
  23. 01c,22sep92,rdc  changed globalPageBlockArray to type UINT8;
  24. 01b,30jul92,rdc  added show routine to vmContextClass.
  25. 01a,27jul92,rdc  written.
  26. DESCRIPTION
  27. This library contains virtual memory information display routines.
  28. The routine vmShowInit() links this facility into the VxWorks system.
  29. It is called automatically when this facility is configured into
  30. VxWorks using either of the following methods:
  31. .iP
  32. If you use the configuration header files, define both INCLUDE_MMU_FULL
  33. and INCLUDE_SHOW_ROUTINES in config.h.
  34. .iP
  35. If you use the Tornado project facility, select INCLUDE_MMU_FULL_SHOW.
  36. .LP
  37. AVAILABILITY
  38. This module and vmLib are distributed as the unbundled virtual memory 
  39. support option, VxVMI.
  40. INCLUDE FILES: vmLib.h
  41. SEE ALSO: vmLib,
  42. .pG "Virtual Memory"
  43. */
  44. #include "vxWorks.h"
  45. #if (CPU_FAMILY != MIPS)
  46. #include "private/vmLibP.h"
  47. #include "semLib.h"
  48. #include "errno.h"
  49. #include "stdio.h"
  50. /* macros */
  51. #define ADDR_IN_GLOBAL_SPACE(vAddr) (globalPageBlockArray[(unsigned) vAddr / mmuPageBlockSize])
  52. /* imports */
  53. IMPORT UINT8 *globalPageBlockArray;
  54. IMPORT int    mmuPageBlockSize;
  55. IMPORT int    mmuPhysAddrShift;
  56. /* forward declarations */
  57. LOCAL void vmContextShowNewBlock (UINT blockBegin, UINT blockEnd, UINT physAddr,
  58.   UINT blockState);
  59. /****************************************************************************
  60. *
  61. * vmShowInit - include virtual memory show facility (VxVMI Option)
  62. *
  63. * This routine acts as a hook to include vmContextShow().
  64. * It is called automatically when the virtual memory show facility is
  65. * configured into VxWorks using either of the following methods:
  66. * .iP
  67. * If you use the configuration header files, define both INCLUDE_MMU_FULL
  68. * and INCLUDE_SHOW_ROUTINES in config.h.
  69. * .iP
  70. * If you use the Tornado project facility, select INCLUDE_MMU_FULL_SHOW.
  71. *
  72. * AVAILABILITY
  73. * This routine is distributed as a component of the unbundled virtual memory
  74. * support option, VxVMI.
  75. *
  76. * RETURNS: N/A
  77. */
  78. void vmShowInit (void)
  79.     {
  80.     classShowConnect ((CLASS_ID) vmContextClassId, (FUNCPTR)vmContextShow);
  81.     }
  82. /****************************************************************************
  83. *
  84. * vmContextShow - display the translation table for a context (VxVMI Option)
  85. *
  86. * This routine displays the translation table for a specified context.  
  87. * If <context> is specified as NULL, the current context is displayed.  
  88. * Output is formatted to show blocks of virtual memory with consecutive
  89. * physical addresses and the same state.  State information shows the
  90. * writable and cacheable states.  If the block is in global virtual
  91. * memory, the word "global" is appended to the line.  Only virtual memory 
  92. * that has its valid state bit set is displayed.
  93. *
  94. * This routine should be used for debugging purposes only.
  95. *
  96. * Note that this routine cannot report non-standard architecture-dependent 
  97. * states.
  98. *
  99. * AVAILABILITY
  100. * This routine is distributed as a component of the unbundled virtual memory
  101. * support option, VxVMI.
  102. *
  103. * RETURNS: OK, or ERROR if the virtual memory context is invalid.
  104. */
  105. STATUS vmContextShow
  106.     (
  107.     VM_CONTEXT_ID context /* context - NULL == currentContext */
  108.     )
  109.     {
  110.     UINT thisVirtPage; 
  111.     UINT thisPhysPage; 
  112.     UINT blockBegin;
  113.     UINT physPageAddr;
  114.     UINT thisState;
  115.     UINT blockPhysAddr;
  116.     UINT blockState;
  117.     int vmPageSize;
  118.     int physPageInc;
  119.     int numPages;
  120.     int   pageCounter;
  121.     BOOL  blockEnd;
  122.     BOOL  printIt;
  123.     BOOL  previousPageWasInvalid;
  124.     vmPageSize = vmPageSizeGet ();
  125.     if (vmPageSize == 0)
  126. return (ERROR); /* vmLib is not installed! */
  127.     numPages = (unsigned) 0x80000000 / vmPageSize * 2;
  128.     pageCounter  = 0;
  129.     blockEnd  = FALSE;
  130.     blockPhysAddr = NULL;
  131.     printIt  = TRUE;
  132.     previousPageWasInvalid = TRUE;
  133.     if (context == NULL)
  134. context = vmCurrentGet ();
  135.     if (OBJ_VERIFY (context, vmContextClassId) != OK)
  136. return (ERROR);
  137.     if (mmuPhysAddrShift)
  138. {
  139. printf ("VIRTUAL ADDR  BLOCK LENGTH  PHYSICAL PAGE   STATEn");
  140. physPageInc = 1;
  141. }
  142.     else
  143. {
  144. printf ("VIRTUAL ADDR  BLOCK LENGTH  PHYSICAL ADDR   STATEn");
  145. physPageInc = vmPageSize;
  146. }
  147.     semTake (&context->sem, WAIT_FOREVER);
  148.     thisVirtPage = thisPhysPage = 0;
  149.     vmStateGet (context, (void *) 0, &blockState); 
  150.     for (blockBegin = 0;
  151.  pageCounter < numPages;
  152.  pageCounter++,
  153.  thisVirtPage += vmPageSize,
  154.  thisPhysPage += physPageInc)
  155. {
  156. if (vmTranslate (context, (void *) thisVirtPage, 
  157.  (void **) &physPageAddr) == ERROR)  
  158.     {
  159.     blockEnd = TRUE; 
  160.     if (previousPageWasInvalid)
  161. printIt = FALSE;
  162.     previousPageWasInvalid = TRUE;
  163.     thisPhysPage = 0xffffffff;
  164.     }
  165. else
  166.     {
  167.     if (!previousPageWasInvalid && (physPageAddr != thisPhysPage))
  168. blockEnd = TRUE;
  169.     if (vmStateGet (context, (void *) thisVirtPage, &thisState)== ERROR)
  170. {
  171. printf ("vmContextShow: error getting state for addr %xn", 
  172. thisVirtPage);
  173. return (ERROR);
  174. }
  175.     if (!previousPageWasInvalid && (thisState != blockState))
  176. blockEnd = TRUE;
  177.     if (previousPageWasInvalid)
  178. {
  179. blockBegin = thisVirtPage;
  180. blockPhysAddr = thisPhysPage = physPageAddr;
  181. blockState = thisState;
  182. }
  183.     previousPageWasInvalid = FALSE;
  184.     }
  185. if (blockEnd)
  186.     { 
  187.     if (printIt)
  188. vmContextShowNewBlock (blockBegin, thisVirtPage, 
  189.        blockPhysAddr, blockState);
  190.     blockBegin = thisVirtPage;
  191.     blockState = thisState;
  192.     blockPhysAddr = thisPhysPage = physPageAddr;
  193.     blockEnd = FALSE;
  194.     printIt = TRUE;
  195.     }
  196. }
  197.     /* see if there was a block that went up to the last virtual page */
  198.     if (!previousPageWasInvalid)
  199. vmContextShowNewBlock (blockBegin, thisVirtPage,
  200.        blockPhysAddr, blockState);
  201.     semGive (&context->sem);
  202.     return (OK);
  203.     }
  204. /****************************************************************************
  205. *
  206. * vmContextShowNewBlock - display info for a block of virtual mem.
  207. *
  208. */
  209. LOCAL void vmContextShowNewBlock
  210.     (
  211.     UINT blockBegin,
  212.     UINT blockEnd,
  213.     UINT physAddr,
  214.     UINT blockState 
  215.     )
  216.     {
  217.     
  218.     printf ("0x%08x    0x%08x    0x%08x      ", blockBegin,
  219.     blockEnd - blockBegin, physAddr);
  220.     if (blockState & VM_STATE_WRITABLE)
  221. printf ("W+ ");
  222.     else
  223. printf ("W- ");
  224.     if (blockState & VM_STATE_MASK_CACHEABLE)
  225. printf ("C+ ");
  226.     else
  227. printf ("C- ");
  228. #if (CPU_FAMILY == I80X86)
  229.     if ((blockState & VM_STATE_MASK_WBACK) == VM_STATE_WBACK)
  230. printf ("B+ ");
  231.     else
  232. printf ("B- ");
  233.     if ((blockState & VM_STATE_MASK_GLOBAL) == VM_STATE_GLOBAL)
  234. printf ("G+ ");
  235.     else
  236. printf ("G- ");
  237. #endif /* (CPU_FAMILY == I80X86) */
  238.     if (ADDR_IN_GLOBAL_SPACE (blockBegin))
  239. printf (" (global)");
  240.     printf ("n");
  241.     }
  242. #endif /* (CPU_FAMILY != MIPS) */