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

VxWorks

开发平台:

C/C++

  1. /* wdbFpLib.c - floating point register support for the external WDB agent */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01d,21aug01,hdn imported PENTIUM2/3/4 support from T31 ver 01e 
  7. 01c,17dec96,ms  WDB now uses FP_CONTEXT instead of FPREG_SET (SPR 7654).
  8. 01b,23jan96,tpr added cast to compile with Diab Data tools.
  9. 01a,25may95,ms  written.
  10. */
  11. /*
  12. DESCPRIPTION
  13. This library contains routines to save, restore, get, and
  14. set the floating point registers. These operations are
  15. not task-specific.
  16. */
  17. #include "wdb/wdbRegs.h"
  18. #include "string.h"
  19. #if (CPU_FAMILY == I80X86)
  20. static struct
  21.     {
  22.     WDB_FPU_REGS fpContext; /* the hardware context */
  23.     WDB_REG_SET_OBJ regSet; /* generic register set */
  24.     } WRS_DATA_ALIGN_BYTES(_CACHE_ALIGN_SIZE) fpRegSetObj =
  25.   {{{{0}}}, {{0}}}; /* it must be in data section for now */
  26. #else
  27. static struct
  28.     {
  29.     WDB_REG_SET_OBJ regSet; /* generic register set */
  30.     WDB_FPU_REGS fpContext; /* the hardware context */
  31.     } fpRegSetObj;
  32. #endif /* (CPU_FAMILY == I80X86) */
  33. /******************************************************************************
  34. *
  35. * wdbFppSave - save the floating point registers.
  36. */ 
  37. void wdbFppSave (void)
  38.     {
  39. #if ((CPU == PENTIUM) || (CPU == PENTIUM2) || (CPU == PENTIUM3) || 
  40.  (CPU == PENTIUM4))
  41.     (*_func_fppSaveRtn) (&fpRegSetObj.fpContext);
  42. #else /* ((CPU == PENTIUM) || (CPU == PENTIUM[234])) */
  43.     fppSave (&fpRegSetObj.fpContext);
  44. #endif /* ((CPU == PENTIUM) || (CPU == PENTIUM[234])) */
  45.     }
  46. /******************************************************************************
  47. *
  48. * wdbFppRestore - restore the previously saved float regs.
  49. */ 
  50. void wdbFppRestore (void)
  51.     {
  52. #if ((CPU == PENTIUM) || (CPU == PENTIUM2) || (CPU == PENTIUM3) || 
  53.  (CPU == PENTIUM4))
  54.     (*_func_fppRestoreRtn) (&fpRegSetObj.fpContext);
  55. #else /* ((CPU == PENTIUM) || (CPU == PENTIUM[234])) */
  56.     fppRestore (&fpRegSetObj.fpContext);
  57. #endif /* ((CPU == PENTIUM) || (CPU == PENTIUM[234])) */
  58.     }
  59. /******************************************************************************
  60. *
  61. * wdbFppGet - get a pointer to the fpp reg block.
  62. */ 
  63. void wdbFppGet
  64.     (
  65.     void ** ppRegs
  66.     )
  67.     {
  68.     *ppRegs = (void *)&fpRegSetObj.fpContext;
  69.     }
  70. /******************************************************************************
  71. *
  72. * wdbFppSet - set the floating point reg block.
  73. */ 
  74. void wdbFppSet
  75.     (
  76.     void * pRegs
  77.     )
  78.     {
  79.     bcopy ((char *)pRegs, (char *)&fpRegSetObj.fpContext, sizeof (FP_CONTEXT));
  80.     }
  81. /******************************************************************************
  82. *
  83. * wdbFpObjInit - initialize a WDB_REG_SET_OBJ representing float regs.
  84. *
  85. * RETURNS: a pointer to a WDB_REG_SET_OBJ
  86. */ 
  87. WDB_REG_SET_OBJ * wdbFpLibInit (void)
  88.     {
  89.     WDB_REG_SET_OBJ * pRegSet = &fpRegSetObj.regSet;
  90.     pRegSet->regSetType = WDB_REG_SET_FPU;
  91.     pRegSet->save = wdbFppSave;
  92.     pRegSet->load = wdbFppRestore;
  93.     pRegSet->get = (void (*) (char **)) wdbFppGet;
  94.     pRegSet->set = (void (*) (char *))  wdbFppSet;
  95. #if ((CPU == PENTIUM) || (CPU == PENTIUM2) || (CPU == PENTIUM3) || 
  96.  (CPU == PENTIUM4))
  97.     (*_func_fppSaveRtn) (&fpRegSetObj.fpContext);
  98. #else /* ((CPU == PENTIUM) || (CPU == PENTIUM[234])) */
  99.     fppSave (&fpRegSetObj.fpContext);
  100. #endif /* ((CPU == PENTIUM) || (CPU == PENTIUM[234])) */
  101.     return (pRegSet);
  102.     }