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

VxWorks

开发平台:

C/C++

  1. /* fppShow.c - floating-point show routines */
  2. /* Copyright 1984-1998 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01j,21jun02,h_k  changed showing FPU reg val to float from double for SH4 (SPR
  8.                  #78976).
  9. 01i,24apr01,mem  Fix reg swapping for MIPS32/MIPS64.
  10. 01h,03mar00,zl   merged SH support into T2
  11. 01h,20dec00,agf  Adapt to MIPS32/MIPS64 CPU architectures
  12. 01g,17mar99,jdi  doc: updated w/ info about proj facility (SPR 25727).
  13. 01f,10dec96,tam  added code to word swap FP reg. and to display FP reg. in 
  14.  single precision for MIPS (spr #7628).
  15. 01e,03feb93,jdi  changed INCLUDE_SHOW_RTNS to ...ROUTINES.
  16. 01d,21jan93,jdi  documentation cleanup for 5.1.
  17. 01c,30jul92,smb  changed format for printf to avoid zero padding.
  18. 01b,12jul92,jcf  tuned floating point register show format.
  19. 01a,04jul92,jcf  written/extracted from v3k fppLib.
  20. */
  21. /*
  22. DESCRIPTION
  23. This library provides the routines necessary to show a task's optional 
  24. floating-point context.  To use this facility, it must first be
  25. installed using fppShowInit(), which is called automatically
  26. when the floating-point show facility is configured into VxWorks
  27. using either of the following methods:
  28. .iP
  29. If you use the configuration header files, define
  30. INCLUDE_SHOW_ROUTINES in config.h.
  31. .iP
  32. If you use the Tornado project facility, select INCLUDE_HW_FP_SHOW.
  33. .LP
  34. This library enhances task information routines, such as ti(), to display
  35. the floating-point context.
  36. INCLUDE FILES: fppLib.h 
  37. SEE ALSO: fppLib
  38. */
  39. #include "vxWorks.h"
  40. #include "stdio.h"
  41. #include "regs.h"
  42. #include "fppLib.h"
  43. #include "private/funcBindP.h"
  44. /* global variables */
  45. char *fppTaskRegsCFmt = "%-6.6s = %8x";
  46. char *fppTaskRegsDFmt = "%-6.6s = %8g";
  47. /******************************************************************************
  48. *
  49. * fppShowInit - initialize the floating-point show facility
  50. *
  51. * This routine links the floating-point show facility into the VxWorks system.
  52. * It is called automatically when the floating-point show facility is
  53. * configured into VxWorks using either of the following methods:
  54. * .iP
  55. * If you use the configuration header files, define
  56. * INCLUDE_SHOW_ROUTINES in config.h.
  57. * .iP
  58. * If you use the Tornado project facility, select INCLUDE_HW_FP_SHOW.
  59. *
  60. * RETURNS: N/A
  61. */
  62. void fppShowInit (void)
  63.     {
  64.     /* avoid direct coupling with fppShow with this global variable */
  65.     _func_fppTaskRegsShow = (FUNCPTR) fppTaskRegsShow;
  66.     }
  67. /*******************************************************************************
  68. *
  69. * fppTaskRegsShow - print the contents of a task's floating-point registers
  70. *
  71. * This routine prints to standard output the contents of a task's
  72. * floating-point registers.
  73. *
  74. * RETURNS: N/A
  75. */
  76. void fppTaskRegsShow
  77.     (
  78.     int task /* task to display floating point registers for */
  79.     )
  80.     {
  81.     int ix;
  82. #if (CPU_FAMILY == SH)
  83.     float * fpTmp;
  84. #else
  85.     double * fpTmp;
  86. #endif
  87.     int * fpCtlTmp;
  88.     FPREG_SET fpRegSet;
  89. #if (CPU == MIPS32)
  90.     double doubleTmp;
  91.     double * fpDoubleTmp = &doubleTmp;
  92. #endif /* CPU == MIPS32 */
  93.     if ((fppProbe() != OK) || (fppTaskRegsGet (task, &fpRegSet) == ERROR))
  94. return;
  95.     /* Some architectures organize floats sequentially, but to
  96.      * display them as doubles the floats need to be word swapped.
  97.      */
  98.     if (fppDisplayHookRtn != NULL)
  99.         (* fppDisplayHookRtn) (&fpRegSet);
  100.     /* print floating point control registers */
  101.     for (ix = 0; fpCtlRegName[ix].regName != (char *) NULL; ix++)
  102. {
  103. if ((ix % 4) == 0)
  104.     printf ("n");
  105. else
  106.     printf ("%3s","");
  107. fpCtlTmp = (int *) ((int)&fpRegSet + fpCtlRegName[ix].regOff);
  108. printf (fppTaskRegsCFmt, fpCtlRegName[ix].regName, *fpCtlTmp);
  109. }
  110.     /* print floating point data registers */
  111.     for (ix = 0; fpRegName[ix].regName != (char *) NULL; ix++)
  112. {
  113. if ((ix % 4) == 0)
  114.     printf ("n");
  115. else
  116.     printf ("%3s","");
  117. #if (CPU == MIPS32)
  118. /* 
  119.  * word swap the 32 bits FP Reg. pair before printing double
  120.  * value - R4000 and R3000.
  121.  */
  122. *(UINT32 *) fpDoubleTmp = *(UINT32 *) (((UINT32)&fpRegSet + 
  123. fpRegName[ix].regOff + 
  124. sizeof(UINT32)));
  125. *(UINT32 *) ((UINT32) fpDoubleTmp + sizeof(UINT32)) = 
  126. *(UINT32 *) (((UINT32)&fpRegSet + fpRegName[ix].regOff));
  127. fpTmp = fpDoubleTmp;
  128. #elif (CPU_FAMILY == SH)
  129. fpTmp = (float *) ((int)&fpRegSet + fpRegName[ix].regOff);
  130. #else /* CPU */
  131. fpTmp = (double *) ((int)&fpRegSet + fpRegName[ix].regOff);
  132. #endif /* CPU */
  133. printf (fppTaskRegsDFmt, fpRegName[ix].regName, *fpTmp);
  134. }
  135.     printf ("n");
  136.     }