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

VxWorks

开发平台:

C/C++

  1. /* fppLib.c - floating-point coprocessor support library */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 03v,16oct01,hdn  made pTcb->pFpContext aligned at cache line boundary for SSE.
  8. 03u,21aug01,hdn  added PENTIUM2/3/4 support
  9. 03t,14mar99,jdi  doc: removed refs to config.h and/or configAll.h (SPR 25663).
  10. 03s,17mar90,jmb  merge Mark Mason patch of 24oct96:  for SIMHPPA, save and
  11.                  restore fpp regs on VX_FP_TASK on both swap in and swap out.
  12. 03r,10nov94,dvs  removed reference to fppLastTcb and changed name to 
  13.  pLastLastFpTcb to deal with merge conflicts between 
  14.  SPRs 1060 and 3033.
  15. 03q,14oct94,ism  merged customer support fix for SPR#1060
  16. 03p,28jul94,dvs  moved pLastFpTcb (now called pTaskLastFpTcb) to taskLib and
  17.  changed include of taskLib.h to private/taskLibP.h. (SPR #3033)
  18. 03o,22oct93,jcf  eliminated MC68882 coprocessor violations.
  19. 03n,02feb93,jdi  documentation cleanup for 5.1.
  20. 03m,13nov92,jcf  removed extraneous logMsg's.
  21. 03l,04jul92,jcf  extracted fppShow.
  22. 03k,26jun92,jwt  cleaned up fppTaskRegsShow() display format.
  23. 03j,05jun92,ajm  added fppDisplayHookRtn routine for mips arch, init hook
  24.   routines to NULL
  25. 03i,26may92,rrr  the tree shuffle
  26. 03h,30mar92,yao  made fppRegsShow() in 80 columns per line.
  27. 03g,20feb92,yao  added fppTaskRegsShow ().  added global variable
  28.  pFppTaskIdPrevious. changed copyright notice. documentation.
  29. 03f,04oct91,rrr  passed through the ansification filter
  30.   -changed VOID to void
  31.   -changed copyright notice
  32. 03e,24oct90,jcf  lint.
  33. 03d,10aug90,dnw  corrected forward declaration of fppCreateHook().
  34. 03c,01aug90,jcf  Changed tcb fpContext to pFpContext.
  35. 03b,26jun90,jcf  remove fppHook because taskOptionsSet of f-pt. not allowed.
  36.  changed fppCreateHook to use taskStackAllot instead of malloc
  37.  removed fppDeleteHook.
  38. 03a,12mar90,jcf  changed fppSwitchHook into fppSwapHook.
  39.  removed many (FP_CONTEXT *) casts.
  40.  removed tcb extension dependencies.
  41. 02l,07mar90,jdi  documentation cleanup.
  42. 02k,09aug89,gae  changed iv68k.h to generic header.
  43. 02j,14nov88,dnw  documentation.
  44. 02i,29aug88,gae  documentation.
  45. 02h,06jul88,jcf  fixed bug in fppTaskRegsSet introduced v02a.
  46. 02g,22jun88,dnw  name tweaks.
  47.  changed to add task switch hook when fppInit() is called,
  48.    instead of first time fppCreateHook() is called.
  49. 02f,30may88,dnw  changed to v4 names.
  50. 02e,28may88,dnw  cleaned-up fppProbe.
  51. 02d,29apr88,jcf  removed unnecessary intLock () within fppTaskSwitch().
  52. 02c,31mar88,gae  fppProbe() now done in install routine fppInit() and
  53.    hooks only added if true.
  54. 02b,18mar88,gae  now supports both MC68881 & MC68882.
  55. 02a,25jan88,jcf  make kernel independent.
  56. 01e,20feb88,dnw  lint
  57. 01d,05nov87,jlf  documentation
  58. 01c,22oct87,gae  changed fppInit to use task create/delete facilities.
  59.    +jcf  made fppExitTask ... use pTcb not pTcbX
  60. 01b,28sep87,gae  removed extraneous logMsg's.
  61. 01a,06aug87,gae  written/extracted from vxLib.c
  62. */
  63. /*
  64. DESCRIPTION
  65. This library provides a general interface to the floating-point coprocessor.
  66. To activate floating-point support, fppInit() must be called before any
  67. tasks using the coprocessor are spawned.  This is done automatically by
  68. the root task, usrRoot(), in usrConfig.c when the configuration macro
  69. INCLUDE_HW_FP is defined.
  70. For information about architecture-dependent floating-point routines, see
  71. the manual entry for fppArchLib.
  72. The fppShow() routine displays coprocessor registers on a per-task basis.
  73. For information on this facility, see the manual entries for fppShow and
  74. fppShow().
  75. VX_FP_TASK OPTION
  76. Saving and restoring floating-point registers adds to the context switch
  77. time of a task.  Therefore, floating-point registers are not saved
  78. and restored for every task.  Only those tasks spawned with the task
  79. option VX_FP_TASK will have floating-point registers saved and restored.
  80. .RS 4 4
  81. %NOTE:  If a task does any floating-point operations,
  82. it must be spawned with VX_FP_TASK.
  83. .RE
  84. INTERRUPT LEVEL
  85. Floating-point registers are not saved and restored for interrupt
  86. service routines connected with intConnect().  However, if necessary,
  87. an interrupt service routine can save and restore floating-point registers
  88. by calling routines in fppArchLib.
  89. INCLUDE FILES: fppLib.h
  90. SEE ALSO: fppArchLib, fppShow, intConnect(),
  91. .pG "Basic OS"
  92. */
  93. #include "vxWorks.h"
  94. #include "objLib.h"
  95. #include "private/taskLibP.h"
  96. #include "taskArchLib.h"
  97. #include "taskHookLib.h"
  98. #include "memLib.h"
  99. #include "stdio.h"
  100. #include "iv.h"
  101. #include "regs.h"
  102. #include "logLib.h"
  103. #include "fppLib.h"
  104. /* globals */
  105. WIND_TCB * pFppTaskIdPrevious; /* Task ID for deferred exceptions */
  106. FUNCPTR fppCreateHookRtn; /* arch dependent create hook routine */
  107. FUNCPTR fppDisplayHookRtn; /* arch dependent display routine */
  108. /* locals */
  109. #if (CPU_FAMILY == I80X86)
  110. LOCAL FP_CONTEXT WRS_DATA_ALIGN_BYTES(_CACHE_ALIGN_SIZE) fppDummyContext =
  111.  {{{0}}}; /* it must be in data section for now */
  112. #else
  113. LOCAL FP_CONTEXT fppDummyContext;
  114. #endif /* (CPU_FAMILY == I80X86) */
  115. /* forward declarations */
  116. LOCAL void fppCreateHook (WIND_TCB *pTcb);
  117. LOCAL void fppSwapHook (WIND_TCB *pOldTcb, WIND_TCB *pNewTcb);
  118. /*******************************************************************************
  119. *
  120. * fppInit - initialize floating-point coprocessor support
  121. *
  122. * This routine initializes floating-point coprocessor support and must be
  123. * called before using the floating-point coprocessor.  This is done
  124. * automatically by the root task, usrRoot(), in usrConfig.c when the
  125. * configuration macro INCLUDE_HW_FP is defined.
  126. * RETURNS: N/A
  127. */
  128. void fppInit (void)
  129.     {
  130.     if (fppProbe() == OK)
  131. {
  132. taskCreateHookAdd ((FUNCPTR) fppCreateHook);
  133. taskSwapHookAdd ((FUNCPTR) fppSwapHook);
  134.         fppArchInit ();
  135. }
  136.     }
  137. /*******************************************************************************
  138. *
  139. * fppCreateHook - initialize floating-point coprocessor support for task
  140. *
  141. * Carves a floating-point coprocessor context from the end of the stack.
  142. */
  143. LOCAL void fppCreateHook
  144.     (
  145.     FAST WIND_TCB *pTcb /* newly create task tcb */
  146.     )
  147.     {
  148.     /* check for option bit and presence of floating-point coprocessor */
  149.     if (pTcb->options & VX_FP_TASK)
  150. {
  151. /* allocate space for saving context and registers */
  152. #if (CPU_FAMILY == I80X86)
  153. /* SSE/SSE2 requires it aligned at 16 byte */
  154. pTcb->pFpContext = (FP_CONTEXT *)
  155.     taskStackAllot ((int) pTcb, sizeof (FP_CONTEXT) + _CACHE_ALIGN_SIZE);
  156. if (pTcb->pFpContext == NULL)
  157.     return;
  158. pTcb->pFpContext = (FP_CONTEXT *)
  159.     (((UINT32)pTcb->pFpContext + (_CACHE_ALIGN_SIZE - 1)) & 
  160.      ~(_CACHE_ALIGN_SIZE - 1));
  161. #else
  162. pTcb->pFpContext = (FP_CONTEXT *)
  163.     taskStackAllot ((int) pTcb, sizeof (FP_CONTEXT));
  164. if (pTcb->pFpContext == NULL)
  165.     return;
  166. #endif /* (CPU_FAMILY == I80X86) */
  167. #if (CPU==SIMHPPA)
  168. taskSwapHookAttach ((FUNCPTR) fppSwapHook, (int) pTcb, TRUE, TRUE);
  169. #else /* (CPU==SIMHPPA) */
  170. taskSwapHookAttach ((FUNCPTR) fppSwapHook, (int) pTcb, TRUE, FALSE);
  171. #endif /* (CPU==SIMHPPA) */
  172. taskLock ();
  173. fppArchTaskCreateInit (pTcb->pFpContext);
  174. taskUnlock ();
  175. if (fppCreateHookRtn != NULL)
  176.     (*fppCreateHookRtn) (pTcb);
  177. }
  178.     }
  179. /*******************************************************************************
  180. *
  181. * fppSwapHook - swap in task floating-point coprocessor registers
  182. *
  183. * This routine is the task swap hook that implements the task floating-point
  184. * coprocessor registers facility.  It swaps the current and saved values of
  185. * all the task coprocessor registers of the last floating point task and the
  186. * in-coming floating point task.
  187. */
  188. LOCAL void fppSwapHook
  189.     (
  190.     WIND_TCB *pOldTcb,      /* task tcb switching out */
  191.     FAST WIND_TCB *pNewTcb  /* task tcb switching in */
  192.     )
  193.     {
  194. #if (CPU==SIMHPPA)
  195.     /* save/restore fpp regs on both task swap in and swap out. */
  196.     if (pOldTcb->pFpContext)
  197. {
  198. pFppTaskIdPrevious = pOldTcb;
  199. fppSave (pOldTcb->pFpContext);
  200. }
  201.     else
  202. fppSave (&fppDummyContext);     /* to avoid protocol errors */
  203.     if (pNewTcb->pFpContext)
  204. {
  205. pTaskLastFpTcb = pNewTcb;
  206. fppRestore (pNewTcb->pFpContext);
  207. }
  208. #elif ((CPU == PENTIUM) || (CPU == PENTIUM2) || (CPU == PENTIUM3) || 
  209.  (CPU == PENTIUM4))
  210.     if (pTaskLastFpTcb == pNewTcb)
  211. return;
  212.     /* save task coprocessor registers into last floating point task */
  213.     if (pTaskLastFpTcb != NULL)
  214. {
  215. pFppTaskIdPrevious = pTaskLastFpTcb;
  216. (*_func_fppSaveRtn) (pTaskLastFpTcb->pFpContext);
  217. }
  218.     else
  219. (*_func_fppSaveRtn) (&fppDummyContext); /* to avoid protocol errors */
  220.     /* restore task coprocessor registers of incoming task */
  221.     (*_func_fppRestoreRtn) (pNewTcb->pFpContext);
  222.     pTaskLastFpTcb = pNewTcb;
  223. #else /* (CPU==SIMHPPA) */
  224.     if (pTaskLastFpTcb == pNewTcb)
  225. return;
  226.     /* save task coprocessor registers into last floating point task */
  227.     if (pTaskLastFpTcb != NULL)
  228. {
  229. pFppTaskIdPrevious = pTaskLastFpTcb;
  230. fppSave (pTaskLastFpTcb->pFpContext);
  231. }
  232.     else
  233. fppSave (&fppDummyContext);     /* to avoid protocol errors */
  234.     /* restore task coprocessor registers of incoming task */
  235.     fppRestore (pNewTcb->pFpContext);
  236.     pTaskLastFpTcb = pNewTcb;
  237. #endif /* (CPU==SIMHPPA) */
  238.     }