123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- #include <linux/kernel.h>
- #include <linux/slab.h>
- #include <linux/time.h>
- #include "dbg-trace.h"
- #define TRACE_ARR_LEN 800
- #define STR_LEN 128
- struct trace {
- struct timeval tv;
- char str[STR_LEN];
- unsigned int callback_val1;
- unsigned int callback_val2;
- char valid;
- };
- static unsigned int (*trc_callback1) (unsigned char) = NULL;
- static unsigned int (*trc_callback2) (unsigned char) = NULL;
- static unsigned char trc_param1 = 0;
- static unsigned char trc_param2 = 0;
- struct trace *trc_arr;
- static int trc_index;
- static int trc_active = 0;
- void TRC_START()
- {
- trc_active = 1;
- }
- void TRC_STOP()
- {
- trc_active = 0;
- }
- void TRC_INIT(void *callback1, void *callback2, unsigned char callback1_param, unsigned char callback2_param)
- {
- printk("Marvell debug tracing is on\n");
- trc_arr = (struct trace *)kmalloc(TRACE_ARR_LEN*sizeof(struct trace),GFP_KERNEL);
- if(trc_arr == NULL)
- {
- printk("Can't allocate Debug Trace buffer\n");
- return;
- }
- memset(trc_arr,0,TRACE_ARR_LEN*sizeof(struct trace));
- trc_index = 0;
- trc_callback1 = callback1;
- trc_callback2 = callback2;
- trc_param1 = callback1_param;
- trc_param2 = callback2_param;
- }
- void TRC_REC(char *fmt,...)
- {
- va_list args;
- struct trace *trc = &trc_arr[trc_index];
- if(trc_active == 0)
- return;
- do_gettimeofday(&trc->tv);
- if(trc_callback1)
- trc->callback_val1 = trc_callback1(trc_param1);
- if(trc_callback2)
- trc->callback_val2 = trc_callback2(trc_param2);
- va_start(args, fmt);
- vsprintf(trc->str,fmt,args);
- va_end(args);
- trc->valid = 1;
- if((++trc_index) == TRACE_ARR_LEN) {
- trc_index = 0;
- }
- }
- void TRC_OUTPUT(void)
- {
- int i,j;
- struct trace *p;
- printk("\n\nTrace %d items\n",TRACE_ARR_LEN);
- for(i=0,j=trc_index; i<TRACE_ARR_LEN; i++,j++) {
- if(j == TRACE_ARR_LEN)
- j = 0;
- p = &trc_arr[j];
- if(p->valid) {
- unsigned long uoffs;
- struct trace *plast;
- if(p == &trc_arr[0])
- plast = &trc_arr[TRACE_ARR_LEN-1];
- else
- plast = p-1;
- if(p->tv.tv_sec == ((plast)->tv.tv_sec))
- uoffs = (p->tv.tv_usec - ((plast)->tv.tv_usec));
- else
- uoffs = (1000000 - ((plast)->tv.tv_usec)) +
- ((p->tv.tv_sec - ((plast)->tv.tv_sec) - 1) * 1000000) +
- p->tv.tv_usec;
- printk("%03d: [+%ld usec]", j, (unsigned long)uoffs);
- if(trc_callback1)
- printk("[%u]",p->callback_val1);
- if(trc_callback2)
- printk("[%u]",p->callback_val2);
- printk(": %s",p->str);
- }
- p->valid = 0;
- }
- memset(trc_arr,0,TRACE_ARR_LEN*sizeof(struct trace));
- trc_index = 0;
- }
- void TRC_RELEASE(void)
- {
- kfree(trc_arr);
- trc_index = 0;
- }
|