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

VxWorks

开发平台:

C/C++

  1. /* rebootLib.c - reboot support library */
  2. /* Copyright 1984-1993 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 02i,14jul97,dgp  doc: change ^X to CTRL-X in library description
  8. 02h,22oct95,jdi  doc: added bit values for reboot() <startType>.
  9. 02g,10oct95,jdi  doc: added .tG Shell to SEE ALSO for reboot().
  10. 02f,27jan93,jdi  documentation cleanup for 5.1;
  11.                  SPR#1594: change include file to rebootLib.h
  12. 02e,23oct92,jcf  made cacheClear a macro.
  13. 02d,19oct92,jcf  removed disInst/disData.  Locked interrupts in reboot().
  14. 02c,12oct92,jdi  fixed mangen problem for reboot() by moving declarations
  15.  of disInst & disData to top section as customary.
  16. 02b,01oct92,jcf  added cacheDisable() to push out any data before reboot.
  17. 02a,04jul92,jcf  reworked to use dllLib.
  18. 01l,13dec91,gae  ANSI cleanup.
  19. 01k,19nov91,rrr  shut up some ansi warnings.
  20. 01j,04oct91,rrr  passed through the ansification filter
  21.                   -changed functions to ansi style
  22.   -changed VOID to void
  23.   -changed copyright notice
  24. 01i,05apr91,jdi  documentation -- removed header parens and x-ref numbers;
  25.  doc review by gae.
  26. 01h,24mar91,jaa  documentation cleanup.
  27. 01g,20jun90,gae  changed reboot documentation to match new startTypes.
  28. 01f,19mar90,jdi  documentation tweak.
  29. 01e,07mar90,jdi  documentation cleanup.
  30. 01d,19aug88,gae  documentation.
  31. 01c,22jun88,dnw  name tweaks.
  32. 01b,30may88,dnw  changed to v4 names.
  33. 01a,28may88,dnw  extracted from hookLib and kLib.
  34.  modified to used malloc'ed linked list instead of fixed size
  35.  table.
  36. */
  37. /*
  38. DESCRIPTION
  39. This library provides reboot support.  To restart VxWorks, the routine
  40. reboot() can be called at any time by typing CTRL-X from the shell.  Shutdown
  41. routines can be added with rebootHookAdd().  These are typically used to
  42. reset or synchronize hardware.  For example, netLib adds a reboot hook
  43. to cause all network interfaces to be reset.  Once the reboot hooks have
  44. been run, sysToMonitor() is called to transfer control to the boot ROMs.
  45. For more information, see the manual entry for bootInit.
  46. DEFICIENCIES
  47. The order in which hooks are added is the order in which they are run.
  48. As a result, netLib will kill the network, and no user-added hook routines
  49. will be able to use the network.  There is no rebootHookDelete() routine.
  50. INCLUDE FILES: rebootLib.h
  51. SEE ALSO: sysLib, bootConfig, bootInit
  52. */
  53. #include "vxWorks.h"
  54. #include "stdlib.h"
  55. #include "cacheLib.h"
  56. #include "dllLib.h"
  57. #include "memLib.h"
  58. #include "rebootLib.h"
  59. #include "taskLib.h"
  60. #include "intLib.h"
  61. typedef struct
  62.     {
  63.     DL_NODE node;
  64.     FUNCPTR func;
  65.     } REBOOT_HOOK;
  66. LOCAL DL_LIST rebootHookList;
  67. LOCAL BOOL rebootHooksInitialized;
  68. /*******************************************************************************
  69. *
  70. * reboot - reset network devices and transfer control to boot ROMs
  71. *
  72. * This routine returns control to the boot ROMs after calling a series of
  73. * preliminary shutdown routines that have been added via
  74. * rebootHookAdd(), including routines to reset all network devices.
  75. * After calling the shutdown routines, interrupts are locked, all caches
  76. * are cleared, and control is transferred to the boot ROMs.
  77. *
  78. * The bit values for <startType> are defined in sysLib.h:
  79. * .iP "BOOT_NORMAL  (0x00)" 8
  80. * causes the system to go through the countdown sequence and try to reboot
  81. * VxWorks automatically.  Memory is not cleared.
  82. * .iP "BOOT_NO_AUTOBOOT  (0x01)"
  83. * causes the system to display the VxWorks boot prompt and wait for user
  84. * input to the boot ROM monitor.  Memory is not cleared.
  85. * .iP "BOOT_CLEAR  (0x02)"
  86. * the same as BOOT_NORMAL, except that memory is cleared.
  87. * .iP "BOOT_QUICK_AUTOBOOT  (0x04)"
  88. * the same as BOOT_NORMAL, except the countdown is shorter.
  89. *
  90. * RETURNS: N/A
  91. *
  92. * SEE ALSO: sysToMonitor(), rebootHookAdd(),
  93. * .pG "Target Shell,"
  94. * windsh,
  95. * .tG "Shell"
  96. */
  97. void reboot
  98.     (
  99.     int startType       /* how the boot ROMS will reboot */
  100.     )
  101.     {
  102.     FAST REBOOT_HOOK *pHook;
  103.     int lock;
  104.     if (rebootHooksInitialized)
  105. {
  106. for (pHook = (REBOOT_HOOK *) DLL_FIRST (&rebootHookList);
  107.      pHook != NULL;
  108.      pHook = (REBOOT_HOOK *) DLL_NEXT (&pHook->node))
  109.     {
  110.     (* pHook->func) (startType);
  111.     }
  112. }
  113.     lock = intLock (); /* LOCK INTERRUPTS */
  114.     if (cacheLib.clearRtn != NULL) /* clear out cache */
  115. (* cacheLib.clearRtn) (DATA_CACHE, NULL, ENTIRE_CACHE);
  116.     (void) sysToMonitor (startType);
  117.     }
  118. /*******************************************************************************
  119. *
  120. * rebootHookAdd - add a routine to be called at reboot
  121. *
  122. * This routine adds the specified routine to a list of routines to be
  123. * called when VxWorks is rebooted.  The specified routine should be
  124. * declared as follows:
  125. * .CS
  126. *     void rebootHook
  127. *         (
  128. *         int startType   /@ startType is passed to all hooks @/
  129. *         )
  130. * .CE
  131. *
  132. * RETURNS: OK, or ERROR if memory is insufficient.
  133. *
  134. * SEE ALSO: reboot()
  135. */
  136. STATUS rebootHookAdd
  137.     (
  138.     FUNCPTR rebootHook          /* routine to be called at reboot */
  139.     )
  140.     {
  141.     REBOOT_HOOK *pHook;
  142.     /* initialize hook list if this is the first time */
  143.     if (!rebootHooksInitialized)
  144. {
  145. dllInit (&rebootHookList);
  146. rebootHooksInitialized = TRUE;
  147. }
  148.     /* allocate and initialize hook node */
  149.     pHook = (REBOOT_HOOK *) memPartAlloc (memSysPartId, sizeof (REBOOT_HOOK));
  150.     if (pHook == NULL)
  151. return (ERROR);
  152.     pHook->func = rebootHook;
  153.     /* add it to end of hook list */
  154.     taskLock (); /* LOCK PREEMPTION */
  155.     dllAdd (&rebootHookList, &pHook->node);
  156.     taskUnlock (); /* UNLOCK PREEMPTION */
  157.     return (OK);
  158.     }