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

VxWorks

开发平台:

C/C++

  1. /* vxLib.c - miscellaneous support routines */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01v,20nov01,hdn  doc clean up for 5.5
  8. 01u,12nov01,ahm  added rudimentary support for power mgmt (SPR#32599)
  9. 01t,29aug01,hdn  included vxI86Lib.h 
  10.  replaced intVecSet/Get with intVecSet2/Get2
  11. 01s,04jun97,dat  added _func_vxMemProbeHook and vxMemArchProbe, SPR 8658.
  12. 01r,25apr94,hdn  supported both PROTECTION_FAULT and PAGE_FAULT.
  13. 01q,02jun93,hdn  updated to 5.1
  14.   - changed functions to ansi style
  15.   - fixed #else and #endif
  16.   - changed READ, WRITE to VX_READ, VX_WRITE
  17.   - changed copyright notice
  18. 01p,27aug92,hdn  added I80X86 support.
  19. 01o,12jul91,gae  reworked i960 vxMemProbe(); defined sysBErrVec here.
  20. 01n,09jul91,del  fixed vxMemProbe (I960) to use sysBErrVec global as bus
  21.  error vector. Installed new vxTas that will work on 
  22.  non-aligned bytes.
  23. 01m,01jun91,gae  fixed return of 960's vxTas().
  24. 01l,24may91,jwt  added ASI parameters to create vxMemProbeAsi.
  25. 01n,29apr91,hdn  added defines and macros for TRON architecture.
  26. 01m,29apr91,del  reference sysMemProbe trap for board dependent reasons.
  27. 01l,28apr91,del  I960 integration. added  vxMemProbeSup and vxTas here,
  28.  as callouts to system (board) dependent functions because
  29.  some i960 implementations require different interfaces 
  30.  to hardware.
  31. 01k,30mar91,jdi  documentation cleanup; doc review by dnw.
  32. 01j,19mar90,jdi  documentation cleanup.
  33. 01i,22aug89,jcf  fixed vxMemProbe for 68020/68030.
  34. 01h,29apr89,mcl  vxMemProbe for SPARC; merged versions.
  35. 01g,01sep88,gae  documentation.
  36. 01f,22jun88,dnw  removed include of ioLib.h.
  37. 01e,05jun88,dnw  changed from kLib to vxLib.
  38.  removed taskRegsShow(), exit(), and breakpoint rtns to taskLib.
  39. 01d,30may88,dnw  changed to v4 names.
  40. 01c,28may88,dnw  removed reboot to rebootLib.
  41. 01b,21apr88,gae  added include of ioLib.h for READ/WRITE/UPDATE.
  42. 01a,28jan88,jcf  written and soon to be redistributed.
  43. */
  44. /*
  45. DESCRIPTION
  46. This module contains miscellaneous VxWorks support routines.
  47. SEE ALSO: vxALib
  48. */
  49. #include "vxWorks.h"
  50. #include "taskLib.h"
  51. #include "intLib.h"
  52. #include "iv.h"
  53. #include "esf.h"
  54. #include "vxLib.h"
  55. /* imports */
  56. IMPORT int sysCsInt;
  57. IMPORT void vxIdleAutoHalt (void);
  58. /* globals */
  59. FUNCPTR _func_vxMemProbeHook = NULL; /* hook for BSP vxMemProbe */
  60. UINT32 vxPowerMode = VX_POWER_MODE_DISABLE; /* Pwr Mgmt disabled at start */
  61. FUNCPTR vxIdleRtn  = (FUNCPTR)NULL; /* PwrMgmt Rtn to call in Idle loop */
  62. /*******************************************************************************
  63. *
  64. * vxMemArchProbe - architecture specific probe routine (x86)
  65. *
  66. * This is the routine implementing the architecture specific part of the
  67. * vxMemProbe routine.  It traps the relevant exceptions
  68. * while accessing the specified address.  If an
  69. * exception occurs, then the result will be ERROR.  If no exception occurs
  70. * then the result will be OK.
  71. *
  72. * INTERNAL
  73. * This routine functions by setting the bus error trap vector to
  74. * vxMemProbeTrap and then trying to read/write the specified byte.  If the
  75. * address doesn't exist, vxMemProbeTrap will return ERROR.  Note that this
  76. * routine saves and restores the bus error vector that was there prior to
  77. * this call.  The entire procedure is done with interrupts locked out.
  78. *
  79. * RETURNS: OK or ERROR if an exception occurred during access.
  80. */
  81. STATUS vxMemArchProbe
  82.     (
  83.     FAST void *adrs, /* address to be probed          */
  84.     int mode, /* VX_READ or VX_WRITE           */
  85.     int length, /* 1, 2, or 4                    */
  86.     FAST void *pVal /* where to return value,        */
  87. /* or ptr to value to be written */
  88.     )
  89.     {
  90.     STATUS status;
  91.     int oldLevel;
  92.     FUNCPTR oldVec1;
  93.     FUNCPTR oldVec2;
  94.     int oldType1;
  95.     int oldType2;
  96.     int oldSel1;
  97.     int oldSel2;
  98.     oldLevel = intLock (); /* LOCK INTERRUPTS */
  99.     /* save the vector for General Protection Fault and Page Fault */
  100.     intVecGet2 ((FUNCPTR *)IV_PROTECTION_FAULT, &oldVec1, &oldType1, &oldSel1);
  101.     intVecGet2 ((FUNCPTR *)IV_PAGE_FAULT, &oldVec2, &oldType2, &oldSel2);
  102.     /* set new one to catch these exception */
  103.     intVecSet2 ((FUNCPTR *)IV_PROTECTION_FAULT, (FUNCPTR)vxMemProbeTrap,
  104.         IDT_INT_GATE, sysCsInt);
  105.     intVecSet2 ((FUNCPTR *)IV_PAGE_FAULT, (FUNCPTR)vxMemProbeTrap,
  106.         IDT_INT_GATE, sysCsInt);
  107.     /* do probe */
  108.     if (mode == VX_READ)
  109. status = vxMemProbeSup (length, adrs, pVal);
  110.     else
  111. status = vxMemProbeSup (length, pVal, adrs);
  112.     /* restore original vector(s) */
  113.     intVecSet2 ((FUNCPTR *)IV_PROTECTION_FAULT, oldVec1, oldType1, oldSel1);
  114.     intVecSet2 ((FUNCPTR *)IV_PAGE_FAULT, oldVec2, oldType2, oldSel2);
  115.     intUnlock (oldLevel); /* UNLOCK INTERRUPTS */
  116.     return (status);
  117.     }
  118. /*******************************************************************************
  119. *
  120. * vxMemProbe - probe an address for bus error
  121. *
  122. * This routine probes a specified address to see if it is readable or
  123. * writable, as specified by <mode>.  The address will be read or written as
  124. * 1, 2, or 4 bytes, as specified by <length>.  (Values other than 1, 2, or 4
  125. * yield unpredictable results).  If the probe is a READ, the value read will
  126. * be copied to the location pointed to by <pVal>.  If the probe is a
  127. * WRITE, the value written will be taken from the location pointed to by
  128. * <pVal>.  In either case, <pVal> should point to a value of 1, 2, or 4
  129. * bytes, as specified by <length>.
  130. * Note that only bus errors are trapped during the probe, and that the
  131. * access must otherwise be valid (i.e., not generate an address error).
  132. *
  133. * EXAMPLE
  134. * .CS
  135. *     testMem (adrs)
  136. *         char *adrs;
  137. *         {
  138. *         char testW = 1;
  139. *         char testR;
  140. *
  141. *         if (vxMemProbe (adrs, VX_WRITE, 1, &testW) == OK)
  142. *             printf ("value %d written to adrs %xen", testW, adrs);
  143. *
  144. *         if (vxMemProbe (adrs, VX_READ, 1, &testR) == OK)
  145. *             printf ("value %d read from adrs %xen", testR, adrs);
  146. *         }
  147. * .CE
  148. *
  149. * MODIFICATION
  150. * The BSP can modify the behaviour of this routine by supplying an alternate
  151. * routine and placing the address of the routine in the global
  152. * variable _func_vxMemProbeHook.  The BSP routine will be called instead of
  153. * the architecture specific routine vxMemArchProbe().
  154. *
  155. * RETURNS:
  156. * OK if the probe is successful, or ERROR if the probe caused a bus error or
  157. * an address misalignment.
  158. *
  159. * SEE ALSO:
  160. * vxMemArchProbe()
  161. */
  162. STATUS vxMemProbe
  163.     (
  164.     FAST char *adrs, /* address to be probed          */
  165.     int mode, /* VX_READ or VX_WRITE           */
  166.     int length, /* 1, 2, or 4                    */
  167.     FAST char *pVal /* where to return value,        */
  168. /* or ptr to value to be written */
  169.     )
  170.     {
  171.     STATUS status;
  172.     if (_func_vxMemProbeHook != NULL)
  173. {
  174. /* BSP specific probe routine */
  175. status = (* _func_vxMemProbeHook) (adrs, mode, length, pVal);
  176. }
  177.     else
  178. {
  179. /* architecture specific probe routine */
  180. status = vxMemArchProbe (adrs, mode, length, pVal);
  181. }
  182.     
  183.     return (status);
  184.     }
  185. /*******************************************************************************
  186. *
  187. * vxPowerModeSet - set the power management mode (x86)
  188. *
  189. * This routine sets the power management mode which will be activated
  190. * only when the kernel is idling.
  191. * vxPowerModeSet() is normally called in the BSP initialization routine
  192. * (sysHwInit).
  193. *
  194. * Power management modes include the following:
  195. * .iP "VX_POWER_MODE_DISABLE (0x1)"
  196. * Power management is disable: this prevents halting the CPU.
  197. * .iP "VX_POWER_MODE_AUTOHALT (0x4)"
  198. * Power management is enable: this allows halting the CPU.
  199. *
  200. * RETURNS: OK, or ERROR if <mode> is incorrect or not supported by the
  201. * processor.
  202. *
  203. * SEE ALSO:
  204. * vxPowerModeGet()
  205. */
  206. STATUS vxPowerModeSet
  207.     (
  208.     UINT32 mode /* power management mode to set */
  209.     )
  210.     {
  211.     /* set vxPowMgtEnable and vxPowMgtMode according to <mode> */
  212.     switch (mode)
  213. {
  214. case VX_POWER_MODE_DISABLE:
  215.     vxPowerMode = VX_POWER_MODE_DISABLE;
  216.     vxIdleRtn = (FUNCPTR)NULL;
  217.     break;
  218. case VX_POWER_MODE_AUTOHALT:
  219.     vxPowerMode = VX_POWER_MODE_AUTOHALT;
  220.     vxIdleRtn = (FUNCPTR)vxIdleAutoHalt;
  221.     break;
  222. default:
  223.     return (ERROR);     /* mode not supported */
  224. }
  225.     return (OK);
  226.     }
  227. /*******************************************************************************
  228. *
  229. * vxPowerModeGet - get the power management mode (x86)
  230. *
  231. * This routine returns the power management mode set when kernel is idling.
  232. *
  233. * RETURNS:
  234. * the power management mode (VX_POWER_MODE_DISABLE, VX_POWER_MODE_AUTOHALT)
  235. *
  236. * SEE ALSO:
  237. * vxPowerModeSet()
  238. */
  239. UINT32 vxPowerModeGet (void)
  240.     {
  241.     return (vxPowerMode);
  242.     }