xlog.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/sched.h>
  4. #include <linux/time.h>
  5. #include <linux/init.h>
  6. #include <linux/interrupt.h>
  7. #include <linux/hrtimer.h>
  8. #include <linux/delay.h>
  9. #include <linux/io.h>
  10. #include <linux/semaphore.h>
  11. #include <linux/spinlock.h>
  12. #include <linux/fb.h>
  13. #include <linux/msm_mdp.h>
  14. #include <linux/ktime.h>
  15. #include <linux/wakelock.h>
  16. #include <linux/time.h>
  17. #include <asm/system.h>
  18. #include <asm/mach-types.h>
  19. #include <mach/hardware.h>
  20. #define XENTRY 512
  21. struct tlog {
  22. u64 tick;
  23. char *name;
  24. u32 data0;
  25. u32 data1;
  26. u32 data2;
  27. u32 data3;
  28. u32 data4;
  29. u32 data5;
  30. };
  31. struct klog {
  32. struct tlog logs[XENTRY];
  33. int first;
  34. int last;
  35. int init;
  36. } llist;
  37. spinlock_t xlock;
  38. void xlog(char *name, u32 data0, u32 data1, u32 data2, u32 data3, u32 data4, u32 data5)
  39. {
  40. unsigned long flags;
  41. struct tlog *log;
  42. ktime_t time;
  43. if (llist.init == 0) {
  44. spin_lock_init(&xlock);
  45. llist.init = 1;
  46. }
  47. spin_lock_irqsave(&xlock, flags);
  48. time = ktime_get();
  49. log = &llist.logs[llist.first];
  50. log->tick = ktime_to_us(time);
  51. log->name = name;
  52. log->data0 = data0;
  53. log->data1 = data1;
  54. log->data2 = data2;
  55. log->data3 = data3;
  56. log->data4 = data4;
  57. log->data5 = data5;
  58. llist.last = llist.first;
  59. llist.first++;
  60. llist.first %= XENTRY;
  61. spin_unlock_irqrestore(&xlock, flags);
  62. }
  63. void xlog_dump(void)
  64. {
  65. int i, n;
  66. unsigned long flags;
  67. struct tlog *log;
  68. spin_lock_irqsave(&xlock, flags);
  69. i = llist.first;
  70. for (n = 0 ; n < XENTRY; n++) {
  71. log = &llist.logs[i++];
  72. printk("%s => %llu : %x %x %x %x %x %x\n", log->name, log->tick, (int)log->data0, (int)log->data1, (int)log->data2, (int)log->data3, (int)log->data4, (int)log->data5);
  73. i %= XENTRY;
  74. }
  75. spin_unlock_irqrestore(&xlock, flags);
  76. }