dbg-trace.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include <linux/kernel.h>
  2. #include <linux/slab.h>
  3. #include <linux/time.h>
  4. #include "dbg-trace.h"
  5. #define TRACE_ARR_LEN 800
  6. #define STR_LEN 128
  7. struct trace {
  8. struct timeval tv;
  9. char str[STR_LEN];
  10. unsigned int callback_val1;
  11. unsigned int callback_val2;
  12. char valid;
  13. };
  14. static unsigned int (*trc_callback1) (unsigned char) = NULL;
  15. static unsigned int (*trc_callback2) (unsigned char) = NULL;
  16. static unsigned char trc_param1 = 0;
  17. static unsigned char trc_param2 = 0;
  18. struct trace *trc_arr;
  19. static int trc_index;
  20. static int trc_active = 0;
  21. void TRC_START()
  22. {
  23. trc_active = 1;
  24. }
  25. void TRC_STOP()
  26. {
  27. trc_active = 0;
  28. }
  29. void TRC_INIT(void *callback1, void *callback2, unsigned char callback1_param, unsigned char callback2_param)
  30. {
  31. printk("Marvell debug tracing is on\n");
  32. trc_arr = (struct trace *)kmalloc(TRACE_ARR_LEN*sizeof(struct trace),GFP_KERNEL);
  33. if(trc_arr == NULL)
  34. {
  35. printk("Can't allocate Debug Trace buffer\n");
  36. return;
  37. }
  38. memset(trc_arr,0,TRACE_ARR_LEN*sizeof(struct trace));
  39. trc_index = 0;
  40. trc_callback1 = callback1;
  41. trc_callback2 = callback2;
  42. trc_param1 = callback1_param;
  43. trc_param2 = callback2_param;
  44. }
  45. void TRC_REC(char *fmt,...)
  46. {
  47. va_list args;
  48. struct trace *trc = &trc_arr[trc_index];
  49. if(trc_active == 0)
  50. return;
  51. do_gettimeofday(&trc->tv);
  52. if(trc_callback1)
  53. trc->callback_val1 = trc_callback1(trc_param1);
  54. if(trc_callback2)
  55. trc->callback_val2 = trc_callback2(trc_param2);
  56. va_start(args, fmt);
  57. vsprintf(trc->str,fmt,args);
  58. va_end(args);
  59. trc->valid = 1;
  60. if((++trc_index) == TRACE_ARR_LEN) {
  61. trc_index = 0;
  62. }
  63. }
  64. void TRC_OUTPUT(void)
  65. {
  66. int i,j;
  67. struct trace *p;
  68. printk("\n\nTrace %d items\n",TRACE_ARR_LEN);
  69. for(i=0,j=trc_index; i<TRACE_ARR_LEN; i++,j++) {
  70. if(j == TRACE_ARR_LEN)
  71. j = 0;
  72. p = &trc_arr[j];
  73. if(p->valid) {
  74. unsigned long uoffs;
  75. struct trace *plast;
  76. if(p == &trc_arr[0])
  77. plast = &trc_arr[TRACE_ARR_LEN-1];
  78. else
  79. plast = p-1;
  80. if(p->tv.tv_sec == ((plast)->tv.tv_sec))
  81. uoffs = (p->tv.tv_usec - ((plast)->tv.tv_usec));
  82. else
  83. uoffs = (1000000 - ((plast)->tv.tv_usec)) +
  84. ((p->tv.tv_sec - ((plast)->tv.tv_sec) - 1) * 1000000) +
  85. p->tv.tv_usec;
  86. printk("%03d: [+%ld usec]", j, (unsigned long)uoffs);
  87. if(trc_callback1)
  88. printk("[%u]",p->callback_val1);
  89. if(trc_callback2)
  90. printk("[%u]",p->callback_val2);
  91. printk(": %s",p->str);
  92. }
  93. p->valid = 0;
  94. }
  95. memset(trc_arr,0,TRACE_ARR_LEN*sizeof(struct trace));
  96. trc_index = 0;
  97. }
  98. void TRC_RELEASE(void)
  99. {
  100. kfree(trc_arr);
  101. trc_index = 0;
  102. }