evtLogLib.c
上传用户:baixin
上传日期:2008-03-13
资源大小:4795k
文件大小:26k
开发平台:

MultiPlatform

  1. /* evtLogLib.c - event logging library */
  2. /* Copyright 1994-1998 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 03m,14aug98,cth  removed MEM_ROUND_UP from evtLogPoint
  8. 03m,10aug98,pr   added i960 function pointers to evtLogFuncBind
  9. 03l,30jul98,cjtc removed logMsg EVTLOG_RESERVE_BUFF_SPACE macros which resulted
  10.  in stack corruption of the calling task (SPR 21993)
  11. 03k,13may98,pr   modified logMsg content
  12. 03j,12may98,pr   added logMsg and stop windview if buffer is full
  13. 03i,17apr98,cth  removed function evtHeaderLog
  14. 03h,15apr98,cth  added binding of _func_evtLogReserveTaskName
  15. 03g,10apr98,cjtc architecture port for i960 processors.
  16.  fixed bug in evtLogT0_noInt in which timestamp was written to
  17.  the event buffer before it was read.
  18.  Removed unused local variable "level" from evtLogT0_noInt
  19. 03f,09apr98,pr   added evtLogT0_noInt declaration
  20. 03e,08apr98,pr   modified evtLogO to be of general use. Added evtLogT0_noInt
  21. 03d,06apr98,nps  68k family nows shares portable code.
  22. 03c,18mar98,nps  fixed check for 'thin' mode when creating header.
  23. 03b,17feb98,dvs  added events for memory instrumentation in evtLogO and 
  24.     pr  fixed evtLogO buffer size.
  25. 03a,03feb98,cth  changed evtBufferId from static to global
  26. 02z,27jan98,cth  added evtObjLogFuncBind, evtLogFuncBind, evtBufferBind and
  27.  evtHeaderLog, updated copyright
  28. 02y,25jan98,pr   changed size in evtLogT1_noTS
  29. 02x,22jan98,pr   fixed evtsched
  30. 02w,18dec97,cth  changed include buffer.h to wvBufferP.h, changed tmpBufId to
  31.  evtBufferId
  32. 02v,16nov97,cth  removed evtBuf and rBuff references 
  33.  changed buffer writes to use generic WV2.0 buffers
  34. 02u,22oct97,pr   fixed EVTLOG_RESERVE_BUFF_SPACE_L for evtLogT1_noTS
  35. 02t,21oct97,nps  use modified rBuff API
  36. 02s,18aug97,nps  fixed bug in evtLogM1
  37. 02r,20jul97,nps  added ring buffer support
  38. 02q,24jun97,pr   commented the evtLogTIsOn for evtLogPoint
  39. 02p,08jul96,pr   added evtLogT1_noTS for PPC
  40. 02o,06dec94,rdc  fixed bogus intlocks that should have been unlocks.
  41. 02n,08nov94,rdc  added 960 kernel instrumentation routines.
  42. 02m,02nov94,rdc  added argument to evtLogString to support lockCount param
  43.  in EVENT_TASKNAME.
  44. 02l,02nov94,rdc  unlocked interrupts before returning because of errors.
  45. 02k,27may94,smb  now use alignment macros to store data in buffer.
  46. 02j,23may94,pme  removed taskIdLogin for EVENT_WIND_EXIT_NODISPATCH
  47.  made evtsched equivalent to the 68k assembly version
  48. 01i,05may94,smb  sparc porting
  49. 01h,16mar94,smb  removed EVENT_WIND_EXIT_IDLENOT
  50.  level 1 optimisations.
  51. 01g,22feb94,smb  changed typedef EVENT_TYPE to event_t (SPR #3064)
  52. 01f,24jan94,smb  fixed return values for eventPoint()
  53. 01e,19jan94,smb  event buffer fix SPR #2904
  54. 01d,14jan94,c_s  evtLogOInt now handles EVENT_SIGWRAPPER correctly (SPR #2883).
  55. 01c,04jan94,c_s  evtLogPoint now validates the user event ID correctly. 
  56.    SPR #2724.
  57. 01b,30dec93,c_s  evtLogPoint now uses memcpy (), rather than strncpy (), to 
  58.    transfer the user's buffer of data for user-defined events
  59.    to the logging area.  SPR #2799.
  60. 01a,10dec93,smb  created
  61. */
  62. /*
  63. DESCRIPTION
  64. This library provides routines which log events to the buffer for different
  65. types of events generated by the instrumented code.
  66. INCLUDE FILES: 
  67. SEE ALSO: 
  68. NOMANUAL
  69. */
  70. #include "vxWorks.h"
  71. #include "intLib.h"
  72. #include "logLib.h"
  73. #include "wvLib.h"
  74. #include "string.h"
  75. #include "taskLib.h"
  76. #include "sysLib.h"
  77. #include "private/taskLibP.h"
  78. #include "private/eventP.h"
  79. #include "private/kernelLibP.h"
  80. #include "private/workQLibP.h"
  81. #include "private/wvBufferP.h"
  82. #include "private/evtLogLibP.h"
  83. #include "private/kernelLibP.h"
  84. /* optimized version no longer used for 680X0 */
  85. #define evtLogLib_PORTABLE
  86. /* defines */
  87. #define MAX_WV_TASKS    500        /* should be the same MAX_DSP_TASKS */
  88. #define EVTLOG_RESERVE_BUFF_SPACE(EVENT_SIZE)                     
  89. eventBase = (event_t *) evtBufferId->writeRtn (evtBufferId,NULL,EVENT_SIZE);  
  90.                                                                   
  91. if (!eventBase)                                                   
  92.     {                                                             
  93.     wvEvtLogStop();   
  94.     intUnlock (level);                                            
  95.     return;                                                       
  96.     }
  97. #define EVTLOG_RESERVE_BUFF_SPACE_STAT(EVENT_SIZE)                
  98. eventBase = (event_t *) evtBufferId->writeRtn (evtBufferId,NULL,EVENT_SIZE);  
  99.                                                                   
  100. if (!eventBase)                                                   
  101.     {                                                             
  102.     wvEvtLogStop();   
  103.     intUnlock (level);                                            
  104.     return (ERROR);                                               
  105.     }
  106. #define EVTLOG_RESERVE_BUFF_SPACE_L(EVENT_SIZE)                   
  107. eventBase = (event_t *) evtBufferId->writeRtn (evtBufferId,NULL,EVENT_SIZE);  
  108.                                                                   
  109. if (!eventBase)                                                   
  110.     {                                                             
  111.     wvEvtLogStop();   
  112.     return;                                                       
  113.     }
  114. /* globals */
  115. IMPORT Q_HEAD readyQHead; /* multi-way ready queue head */
  116. /* local */
  117. BUFFER_ID evtBufferId;             /* event buffer identifier */
  118. /* forward declarations */
  119. void evtLogTasks (void);
  120. void evtLogOInt  (event_t  action, int nParam, int param1, int param2, 
  121. int param3, int param4, int param5);
  122. void evtLogO     (event_t action, int nParam, int param1, int param2, 
  123. int param3, int param4, int param5);
  124. void evtLogString (event_t action, int arg1, int arg2, int arg3,
  125. int addrId, const char *string);
  126. int evtLogPoint  (event_t action, void * addr, size_t nbytes, 
  127. char * buffer);
  128. void evtsched ( event_t action, int arg1, int arg2);
  129. void evtLogM0  (event_t action);
  130. void evtLogM1  (event_t action, int param1);
  131. void evtLogM2  (event_t action, int param1, int param2);
  132. void evtLogM3  (event_t action, int param1, int param2, int param3);
  133. void evtLogT0  (event_t action);
  134. void evtLogT0_noInt  (event_t action);
  135. void evtLogT1  (event_t action, int param);
  136. #if CPU_FAMILY==PPC
  137. void evtLogT1_noTS  (event_t action, int param);
  138. #endif /* CPU_FAMILY==PPC */
  139. #if CPU_FAMILY==I960
  140. void windInst1 (void);
  141. void windInstDispatch (void);
  142. void windInstIdle (void);
  143. void windInstIntEnt (void);
  144. void windInstIntExit (void);
  145. #endif /* CPU_FAMILY==I960 */
  146. /*******************************************************************************
  147. *
  148. * evtObjLogFuncBind - bind object-level logging functions
  149. *
  150. * This routine binds the function pointers used to log system-object events
  151. * to the appropriate functions in this library.
  152. *
  153. * RETURNS: N/A
  154. * NOMANUAL
  155. */
  156. void evtObjLogFuncBind (void)
  157.     {
  158.     _func_evtLogO        = (VOIDFUNCPTR) evtLogO;
  159.     _func_evtLogOIntLock = (VOIDFUNCPTR) evtLogOInt;
  160.     }
  161. /*******************************************************************************
  162. *
  163. * evtLogFuncBind - bind general event-logging functions
  164. *
  165. * This function binds instrumentation function pointers to logging functions
  166. * in this file.  Event logging routines associated with class-1 (object-
  167. * class) logging must be bound earlier, with a call to evtObjLogFuncBind.
  168. *
  169. * RETURNS: N/A
  170. * NOMANUAL
  171. */
  172. void evtLogFuncBind (void)
  173.     {
  174.     /* Task-transition logging. */
  175.     _func_evtLogM0 = (VOIDFUNCPTR) evtLogM0;    
  176.     _func_evtLogM1 = (VOIDFUNCPTR) evtLogM1;
  177.     _func_evtLogM2 = (VOIDFUNCPTR) evtLogM2;
  178.     _func_evtLogM3 = (VOIDFUNCPTR) evtLogM3;
  179.     /* Context-switch logging. */
  180.     _func_evtLogT0 = (VOIDFUNCPTR) evtLogT0;    
  181.     _func_evtLogT1 = (VOIDFUNCPTR) evtLogT1;
  182.     _func_evtLogT0_noInt = (VOIDFUNCPTR) evtLogT0_noInt;
  183. #if CPU_FAMILY==PPC
  184.     _func_evtLogT1_noTS = (VOIDFUNCPTR) evtLogT1_noTS;
  185. #endif /* CPU_FAMILY==PPC */
  186.     _func_evtLogTSched = (VOIDFUNCPTR) evtsched;  /* iff portable kernel */
  187.     /* Special logging functions. */
  188.     _func_evtLogPoint = (FUNCPTR) evtLogPoint;
  189.     _func_evtLogString = (VOIDFUNCPTR) evtLogString;
  190.     _func_evtLogReserveTaskName = (FUNCPTR) wvTaskNamesBufAdd;
  191.     /* i960 specific functione pointers used in windALib.s */
  192. #if CPU_FAMILY==I960
  193.     _func_windInst1 = (VOIDFUNCPTR) windInst1;
  194.     _func_windInstDispatch = (VOIDFUNCPTR) windInstDispatch;
  195.     _func_windInstIdle = (VOIDFUNCPTR) windInstIdle;
  196.     _func_windInstIntEnt = (VOIDFUNCPTR) windInstIntEnt;
  197.     _func_windInstIntExit = (VOIDFUNCPTR) windInstIntExit;
  198. #endif /* CPU_FAMILY==I960 */
  199.     }
  200. /*******************************************************************************
  201. *
  202. * evtBufferBind - bind logging routines to a specific event buffer
  203. *
  204. * This routine associates a specific event buffer with the event-logging
  205. * routines.
  206. *
  207. * RETURNS: N/A
  208. * NOMANUAL
  209. */
  210. void evtBufferBind
  211.     (
  212.     BUFFER_ID bufId /* bind logging functions to this buffer */
  213.     )
  214.     {
  215.     evtBufferId = bufId;
  216.     }
  217. #ifdef evtLogLib_PORTABLE
  218. /*******************************************************************************
  219. *
  220. * evtLogT0 - log event id
  221. *
  222. * This event logging routine stores
  223. *       event id        (short )
  224. *       time (int )
  225. * This routine is called by level 3 (context switch events) 
  226. * taskLock, taskUnlock and tickAnnounce.
  227. *
  228. * SEE ALSO:
  229. * NOMANUAL
  230. */
  231. void evtLogT0
  232.     (
  233.     event_t action           /* event id */
  234.     )
  235.     {
  236.     int              level;                  /* interrupt level */
  237.     event_t *        eventBase;
  238.     int *            intBase;
  239.     int      timestamp;
  240.     level = intLock ();                 /* LOCK INTERRUPTS */
  241.     EVTLOG_RESERVE_BUFF_SPACE(EVTLOG_T0_SIZE);
  242.     EVT_STORE_UINT16 (eventBase, action);
  243.     intBase = (int *) eventBase;
  244.     timestamp = (* _func_tmrStamp) ();
  245.     EVT_STORE_UINT32 (intBase, timestamp);
  246.     intUnlock (level);                  /* UNLOCK INTERRUPTS */
  247.     }
  248. /*******************************************************************************
  249. *
  250. * evtLogT0_noInt - log event id without locking interrupts 
  251. *
  252. * This event logging routine stores
  253. *       event id        (short )
  254. *       time            (int )
  255. * This routine is called by level 3 (context switch events) when interrupt
  256. * are already locked (in particular by arch dependent code).
  257. *
  258. * SEE ALSO:
  259. * NOMANUAL
  260. */
  261. void evtLogT0_noInt
  262.     (
  263.     event_t action           /* event id */
  264.     )
  265.     {
  266.     event_t *        eventBase;
  267.     int *            intBase;
  268.     int      timestamp;
  269.     EVTLOG_RESERVE_BUFF_SPACE_L(EVTLOG_T0_SIZE);
  270.     EVT_STORE_UINT16 (eventBase, action);
  271.     intBase = (int *) eventBase;
  272.     timestamp = (* _func_tmrStamp) ();
  273.     EVT_STORE_UINT32 (intBase, timestamp);
  274.     }
  275. /*******************************************************************************
  276. *
  277. * evtLogT1 - log event id
  278. *
  279. * This event logging routine stores
  280. *       event id        (short )
  281. *       time            (int )
  282. *       param           (int )
  283. *
  284. * This routine is called by level 3 (context switch events)
  285. * taskLock, taskUnlock and tickAnnounce.
  286. *
  287. * SEE ALSO:
  288. * NOMANUAL
  289. */
  290. void evtLogT1
  291.     (
  292.     event_t action,          /* event id */
  293.     int     param
  294.     )
  295.     {
  296.     int             level;                  /* interrupt level */
  297.     event_t *        eventBase = NULL;
  298.     int *            intBase = NULL;
  299.     int      timestamp;
  300.     level = intLock ();                 /* LOCK INTERRUPTS */
  301.     EVTLOG_RESERVE_BUFF_SPACE(EVTLOG_T1_SIZE);
  302.     EVT_STORE_UINT16 (eventBase, action);
  303.     intBase = (int *) eventBase;
  304.     timestamp = (* _func_tmrStamp) ();
  305.     EVT_STORE_UINT32 (intBase, timestamp);
  306.     EVT_STORE_UINT32 (intBase, param);
  307.     intUnlock (level);                  /* UNLOCK INTERRUPTS */
  308.     }
  309. /*******************************************************************************
  310. *
  311. * evtLogM0 - log event id 
  312. * This event logging routine stores
  313. * event id (short )
  314. *
  315. * SEE ALSO:
  316. * NOMANUAL
  317. */
  318. void evtLogM0 
  319.     (
  320.     event_t action /* event id */
  321.     )
  322.     {
  323.     int              level; /* interrupt level */
  324.     event_t *        eventBase;
  325.     level = intLock ();                 /* LOCK INTERRUPTS */
  326.     EVTLOG_RESERVE_BUFF_SPACE(EVTLOG_M0_SIZE);
  327.     EVT_STORE_UINT16 (eventBase, action);
  328.     intUnlock (level);                  /* UNLOCK INTERRUPTS */
  329.     }
  330. /*******************************************************************************
  331. *
  332. * evtLogM1 - log an event 
  333. *
  334. * This event logging routine stores
  335. *       event id        (short )
  336. *       param1          (int )
  337. *
  338. * SEE ALSO:
  339. * NOMANUAL
  340. */
  341. void evtLogM1
  342.     (
  343.     event_t action,
  344.     int     param1
  345.     )
  346.     {
  347.     int              level;
  348.     event_t *       eventBase;
  349.     int *            intBase;
  350.     level = intLock ();                 /* LOCK INTERRUPTS */
  351.     EVTLOG_RESERVE_BUFF_SPACE(EVTLOG_M1_SIZE);
  352.     EVT_STORE_UINT16 (eventBase, action);
  353.     intBase = (int *) eventBase;
  354.     EVT_STORE_UINT32 (intBase, param1);
  355.     intUnlock (level);                  /* UNLOCK INTERRUPTS */
  356.     }
  357. /*******************************************************************************
  358. *
  359. * evtLogM2 - log an event 
  360. * This event logging routine stores
  361. * event id (short )
  362. * param1 (int )
  363. * param2 (int )
  364. *
  365. * SEE ALSO:
  366. * NOMANUAL
  367. */
  368. void evtLogM2
  369.     (
  370.     event_t action, 
  371.     int     param1, 
  372.     int     param2
  373.     )
  374.     {
  375.     int              level;
  376.     event_t *        eventBase;
  377.     int *            intBase;
  378.     level = intLock ();                 /* LOCK INTERRUPTS */
  379.     EVTLOG_RESERVE_BUFF_SPACE(EVTLOG_M2_SIZE);
  380.     EVT_STORE_UINT16 (eventBase, action);
  381.     intBase = (int *) eventBase;
  382.     EVT_STORE_UINT32 (intBase, param1);
  383.     EVT_STORE_UINT32 (intBase, param2);
  384.     intUnlock (level);                  /* UNLOCK INTERRUPTS */
  385.     }
  386. /*******************************************************************************
  387. *
  388. * evtLogM3 - log an event 
  389. *
  390. * This event logging routine stores
  391. * event id (short )
  392. * param1 (int )
  393. * param2 (int )
  394. * param3 (int )
  395. *
  396. * SEE ALSO:
  397. * NOMANUAL
  398. */
  399. void evtLogM3
  400.     (
  401.     event_t action,
  402.     int     param1,
  403.     int     param2,
  404.     int     param3
  405.     )
  406.     {
  407.     int              level;
  408.     event_t *        eventBase;
  409.     int *            intBase;
  410.     level = intLock ();                 /* LOCK INTERRUPTS */
  411.     EVTLOG_RESERVE_BUFF_SPACE(EVTLOG_M3_SIZE);
  412.     EVT_STORE_UINT16 (eventBase, action);
  413.     intBase = (int *) eventBase;
  414.     EVT_STORE_UINT32 (intBase, param1);
  415.     EVT_STORE_UINT32 (intBase, param2);
  416.     EVT_STORE_UINT32 (intBase, param3);
  417.     intUnlock (level);                  /* UNLOCK INTERRUPTS */
  418.     }
  419. #endif /* evtLogLib_PORTABLE */
  420. /*******************************************************************************
  421. *
  422. * evtLogOInt - For level 1s, the object state events.
  423. *
  424. * This event logging routine stores
  425. * event id (short )
  426. * timestamp (int )
  427. * param[0..5] (int )  - no. of param logged depends on the event id.
  428. *
  429. * This routine is used when interrupts must be locked by this code.
  430. *
  431. * SEE ALSO:
  432. * NOMANUAL
  433. */
  434. void evtLogOInt 
  435.     (
  436.     event_t  action,     /* event action */
  437.     int      nParam,
  438.     int      param1,
  439.     int      param2,
  440.     int      param3,
  441.     int      param4,
  442.     int      param5
  443.     )
  444.     {
  445.     int level;
  446.     level = intLock();
  447.     evtLogO(action, nParam, param1, param2, param3, param4, param5);
  448.     intUnlock(level);
  449.     }
  450. /*******************************************************************************
  451. *
  452. * evtLogO - For level 1s, the object state events.
  453. *
  454. * This event logging routine stores
  455. * event id (short )
  456. * timestamp (int )
  457. * param[0..5] (int )  - no. of param logged depends on the event id.
  458. *
  459. * Called from within an interrupt lock area.
  460. *
  461. * SEE ALSO:
  462. * NOMANUAL
  463. */
  464. void evtLogO
  465.     (
  466.     event_t  action,             /* event action */
  467.     int      nParam,
  468.     int      param1,
  469.     int      param2,
  470.     int      param3,
  471.     int      param4,
  472.     int      param5
  473.     )
  474.     {
  475.     event_t *       eventBase;
  476.     int *            intBase;
  477.     int      timestamp;
  478.     EVTLOG_RESERVE_BUFF_SPACE_L(6 + (nParam * 4));
  479.     EVT_STORE_UINT16 (eventBase, action);
  480.     intBase = (int *) eventBase;
  481.     timestamp = (* _func_tmrStamp) ();
  482.     EVT_STORE_UINT32 (intBase, timestamp);
  483.     switch (nParam)
  484.         {
  485.         case 5:
  486.             EVT_STORE_UINT32 (intBase, param5);
  487.         case 4:
  488.             EVT_STORE_UINT32 (intBase, param4);
  489.         case 3:
  490.             EVT_STORE_UINT32 (intBase, param3);
  491.         case 2:
  492.             EVT_STORE_UINT32 (intBase, param2);
  493.         case 1:
  494.             EVT_STORE_UINT32 (intBase, param1);
  495.         }
  496.     }
  497. /*******************************************************************************
  498. *
  499. * evtLogString - Add a string to the event log.
  500. *
  501. * This event logging routine stores
  502. * event id (short )
  503. * arg (int)
  504. * arg (int)
  505. * arg (int)
  506. * address (int)
  507. * string size (int)   - if size is ZERO the string does not exist.
  508. * string (char)
  509. *
  510. * SEE ALSO:
  511. * NOMANUAL
  512. */
  513. void evtLogString
  514.     (
  515.     event_t       action, /* the event id */
  516.     int              arg1, /* an extra argument */
  517.     int              arg2, /* an extra argument */
  518.     int              arg3, /* an extra argument */
  519.     int              addrId, /* an address */
  520.     const char *     string /* series of characters */
  521.     )
  522.     {
  523.     event_t *        eventBase;
  524.     int *            intBase;
  525.     int              evtSize = strlen (string);
  526.     int              level;
  527.     evtSize = MEM_ROUND_UP (evtSize);
  528.     level = intLock ();                 /* LOCK INTERRUPTS */
  529.     EVTLOG_RESERVE_BUFF_SPACE(evtSize + EVTLOG_STR_SIZE);
  530.     EVT_STORE_UINT16 (eventBase, action);
  531.     intBase = (int *) eventBase;
  532.     EVT_STORE_UINT32 (intBase, arg1);
  533.     EVT_STORE_UINT32 (intBase, arg2);
  534.     EVT_STORE_UINT32 (intBase, arg3);
  535.     EVT_STORE_UINT32 (intBase, addrId);
  536.     EVT_STORE_UINT32 (intBase, evtSize);
  537.     if (evtSize != 0)
  538. {
  539.         strncpy ((char *) intBase, string, evtSize);
  540. }
  541.     intUnlock (level);                  /* UNLOCK INTERRUPTS */
  542.     }
  543. /*******************************************************************************
  544. *
  545. * evtLogPoint - logs a user defined event or eventpoint via event () or e ().
  546. *
  547. * This event logging routine stores
  548. * event id (short )
  549. * timestamp (int)
  550. * address (int)
  551. * buffer size (int) - if size is ZERO the buffer does not exist.
  552. * buffer (char)
  553. *
  554. * RETURNS: OK, or ERROR if unable to log event point
  555. * SEE ALSO:
  556. * NOMANUAL
  557. */
  558. STATUS evtLogPoint 
  559.     (
  560.     event_t    action, /* event id */
  561.     void *     addr,  /* pc address */
  562.     size_t     nbytes, /* buffer size */
  563.     char *     buffer /* buffer */
  564.     )
  565.     {
  566.     event_t *        eventBase;
  567.     event_t       biasedAction;
  568.     int *       intBase;
  569.     int       level;
  570.     int       timestamp;
  571.     biasedAction = action + MIN_USER_ID;
  572.     /* if (evtLogTIsOn) */
  573. {
  574.         /* is event id within the range of user event ids? */
  575.         if (biasedAction < MIN_USER_ID || biasedAction > MAX_USER_ID)
  576.     return (ERROR);
  577.         level = intLock ();                 /* LOCK INTERRUPTS */
  578.         EVTLOG_RESERVE_BUFF_SPACE_STAT(nbytes + EVTLOG_PT_SIZE);
  579.         EVT_STORE_UINT16 (eventBase, biasedAction);
  580.         intBase = (int *) eventBase;
  581.         timestamp = (* _func_tmrStamp) ();
  582. EVT_STORE_UINT32 (intBase, timestamp);
  583.         EVT_STORE_UINT32 (intBase, (int) addr);
  584.         EVT_STORE_UINT32 (intBase, nbytes);
  585. /* copy buffer contents into event buffer */
  586.         if ((nbytes != 0) && (buffer != NULL))
  587.     {
  588.     memcpy ((char *) intBase, buffer, nbytes);
  589.     }
  590.         intUnlock (level);                  /* UNLOCK INTERRUPTS */
  591.         }
  592.     return (OK);
  593.     }
  594. /*******************************************************************************
  595. *
  596. * evtLogTasks - log name, status and priority of all tasks in the system
  597. *
  598. * SEE ALSO:
  599. * NOMANUAL
  600. */
  601. void evtLogTasks (void)
  602.     {
  603.     int         nTasks;                 /* number of task */
  604.     int         idList[MAX_WV_TASKS];   /* list of active IDs */
  605.     int         ix;                     /* index */
  606.     /* get list of tasks in the system */
  607.     nTasks = taskIdListGet (idList, NELEMENTS (idList));
  608.     /* sort the task list */
  609.     taskIdListSort (idList, nTasks);
  610.     /* log the name of each task in the system */
  611.     for (ix = 0; ix < nTasks; ++ix)
  612.         {
  613.         if (taskIdVerify (idList[ix]) == OK)
  614.             {
  615.             evtLogString (EVENT_TASKNAME, 
  616.              ((WIND_TCB *)idList[ix])->status,
  617.              ((WIND_TCB *)idList[ix])->priority,
  618.              ((WIND_TCB *)idList[ix])->lockCnt,
  619.           idList[ix], taskName (idList[ix]));
  620.     }
  621.         }
  622.     }
  623. /*******************************************************************************
  624. * evtSched - log events from the portable kernel 
  625. *
  626. * This event logging routine stores
  627. *       event id        (short)
  628. * time stamp (int)
  629. * taskIdCurrent   (int) | if event is EVENT_WIND_EXIT_DISPATCH or
  630. * priority (int) | EVENT_WIND_EXIT_NODISPATCH
  631. * directly onto the buffer.
  632. * It is used for the portable workQLib.
  633. * Assume that interrupts are already locked.
  634. *
  635. * SEE ALSO:
  636. * NOMANUAL
  637. */
  638. void evtsched
  639.     (
  640.     event_t action,           /* event id */
  641.     int     arg1,       /* taskIdCurrent or not logged */
  642.     int     arg2       /* priority or not logged */
  643.     )
  644.     {
  645.     event_t *        eventBase;
  646.     int *            intBase;
  647.     int      timestamp;
  648. #if 0 /* need this? NPS */
  649.     if (evtBufOverflow) /* leave if buffer is full */
  650. return;
  651. #endif
  652.     timestamp = (* _func_tmrStamp) ();
  653.     switch (action)
  654.     {
  655.     case EVENT_WIND_EXIT_IDLE: 
  656. {
  657.         EVTLOG_RESERVE_BUFF_SPACE_L(6);
  658.         EVT_STORE_UINT16 (eventBase, action);
  659.         intBase = (int *) eventBase;
  660.         EVT_STORE_UINT32 (intBase, timestamp);
  661. break;
  662. }
  663.     case EVENT_WIND_EXIT_NODISPATCH:
  664.     case EVENT_WIND_EXIT_NODISPATCH_PI:
  665. {
  666.         EVTLOG_RESERVE_BUFF_SPACE_L(10);
  667.         EVT_STORE_UINT16 (eventBase, action);
  668.         intBase = (int *) eventBase;
  669.         EVT_STORE_UINT32 (intBase, timestamp);
  670. EVT_STORE_UINT32 (intBase, arg2); /* priority */
  671. break;
  672. }
  673.     case EVENT_WIND_EXIT_DISPATCH:
  674.     case EVENT_WIND_EXIT_DISPATCH_PI:
  675. {
  676.         EVTLOG_RESERVE_BUFF_SPACE_L(14);
  677.         EVT_STORE_UINT16 (eventBase, action);
  678.         intBase = (int *) eventBase;
  679.         EVT_STORE_UINT32 (intBase, timestamp);
  680. EVT_STORE_UINT32 (intBase, arg1); /* taskIdCurrent */
  681. EVT_STORE_UINT32 (intBase, arg2); /* priority */
  682. }
  683.     }
  684.     }
  685. #if CPU_FAMILY==PPC
  686. /*******************************************************************************
  687. *
  688. * evtLogT1_noTS - log event id without getting timestamp
  689. *
  690. * This event logging routine stores
  691. *       event id        (short )
  692. *       time            (int )
  693. *
  694. * This routines is very similar to the evtLogT1. The main difference
  695. * is that no timestamp is here. The parameter passed is actually the
  696. * current timestamp for this event. This routine is called when an
  697. * interrupt is entered. It is used for PPC architecture. PPC generates
  698. * only one kind of interrupt. When the interrupt is entered, the timestamp
  699. * for windview is obtained. No information about the type of interrupt is
  700. * known at that point. Only when the sysIbcIntHandler routine is called,
  701. * the interrupt vector handler is obtained and it is passed to this
  702. * routine, together with the timestamp.
  703. * When this routine is called, interrupts must be locked already.
  704. *
  705. * SEE ALSO:
  706. * NOMANUAL
  707. */
  708. void evtLogT1_noTS
  709.     (
  710.     event_t action,           /* event id */
  711.     int     param            /* timestamp */
  712.     )
  713.     {
  714.     event_t *        eventBase;
  715.     int *            intBase;
  716.     EVTLOG_RESERVE_BUFF_SPACE_L(EVTLOG_T0_SIZE);
  717.     EVT_STORE_UINT16 (eventBase, action);
  718.     intBase = (int *) eventBase;
  719.     EVT_STORE_UINT32 (intBase, param);
  720.     }
  721. #endif /* CPU_FAMILY==PPC */
  722. #if CPU_FAMILY==I960
  723. /*******************************************************************************
  724. * windInst1 - log events from the 960 assembly language kernel 
  725. *
  726. * Interrupts are locked when this is called
  727. *
  728. * SEE ALSO:
  729. * NOMANUAL
  730. */
  731. void windInst1 (void)
  732.     {
  733.     EVT_CTX_NODISP ((int)taskIdCurrent,
  734.     taskIdCurrent->priority,
  735.     taskIdCurrent->priNormal);
  736.     }
  737. /*******************************************************************************
  738. * windInstDispatch - 
  739. *
  740. * interrupts are locked out when this is called.
  741. *
  742. * SEE ALSO:
  743. * NOMANUAL
  744. */
  745. void windInstDispatch (void)
  746.     {
  747.     /*
  748.      * At this point, we need to decide whether to log an event
  749.      * EVENT_WIND_EXIT_DISPATCH or EVENT_WIND_EXIT_DISPATCH_PI.
  750.      * This is done in the macro EVT_CTX_DISP by comparing
  751.      * taskIdCurrent->priority and taskIdCurrent->priNormal. As
  752.      * a result, the first parameter to the EVT_CTX_DISP macro is
  753.      * not actually used and could be removed in a future code tidy up.
  754.      */
  755.     EVT_CTX_DISP (EVENT_WIND_EXIT_DISPATCH_PI,
  756.   (int) taskIdCurrent, 
  757.   taskIdCurrent->priority, 
  758.   taskIdCurrent->priNormal);
  759.     }
  760. /*******************************************************************************
  761. * windInstIdle - 
  762. *
  763. * interrupts are locked out when this is called.
  764. *
  765. * SEE ALSO:
  766. * NOMANUAL
  767. */
  768. void windInstIdle (void)
  769.     {
  770.     EVT_CTX_IDLE(EVENT_WIND_EXIT_IDLE, &readyQHead);
  771.     }
  772. /*******************************************************************************
  773. * windInstIntEnt -
  774. *
  775. * Interrupts are NOT locked when this is called.
  776. * evtAction has already been checked for non-zero.
  777. *
  778. * SEE ALSO:
  779. * NOMANUAL
  780. */
  781. void windInstIntEnt (void)
  782.     {
  783.     int  level;
  784.     event_t evtId;
  785.     /* 
  786.      * shift and mask off bits returned by intLock to obtain
  787.      * I960 specific interrupt level. Then convert to event ID
  788.      */
  789.     level = intLock ();
  790.     evtId = (event_t) EVENT_INT_ENT ((level >> 16) & 0x001f);
  791.     if ( WV_EVTCLASS_IS_SET(WV_CLASS_1|WV_ON) )
  792. ( * _func_evtLogT0_noInt) (evtId);
  793.     intUnlock (level);
  794.     if (TRG_EVTCLASS_IS_SET(TRG_CLASS_1|TRG_ON))
  795. ( * _func_trgCheck) (evtId, TRG_CLASS1_INDEX, 
  796.                      NULL, NULL, NULL, NULL, NULL, NULL);
  797.     }
  798. /*******************************************************************************
  799. * windInstIntExit -
  800. *
  801. * Interrupts are NOT locked when this is called.
  802. * evtAction has already been checked for non-zero.
  803. *
  804. * SEE ALSO:
  805. * NOMANUAL
  806. */
  807. void windInstIntExit (void)
  808.     {
  809.     int  level;
  810.     event_t evtId;
  811.     level = intLock ();
  812.     
  813.     if (workQIsEmpty)
  814.      evtId = EVENT_INT_EXIT;
  815.     else
  816.      evtId = EVENT_INT_EXIT_K;
  817.     if ( WV_EVTCLASS_IS_SET(WV_CLASS_1|WV_ON) )
  818. ( * _func_evtLogT0_noInt) (evtId);
  819.     intUnlock (level);
  820.     if (TRG_EVTCLASS_IS_SET(TRG_CLASS_1|TRG_ON))
  821. ( * _func_trgCheck) (evtId, TRG_CLASS1_INDEX, 
  822.                      NULL, NULL, NULL, NULL, NULL, NULL);
  823.     }
  824. #endif /* CPU_FAMILY==I960 */