Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * include/linux/irqflags.h
  3.  *
  4.  * IRQ flags tracing: follow the state of the hardirq and softirq flags and
  5.  * provide callbacks for transitions between ON and OFF states.
  6.  *
  7.  * This file gets included from lowlevel asm headers too, to provide
  8.  * wrapped versions of the local_irq_*() APIs, based on the
  9.  * raw_local_irq_*() macros from the lowlevel headers.
  10.  */
  11. #ifndef _LINUX_TRACE_IRQFLAGS_H
  12. #define _LINUX_TRACE_IRQFLAGS_H
  13.  
  14. #include <linux/typecheck.h>
  15. #include <asm/irqflags.h>
  16.  
  17. #ifdef CONFIG_TRACE_IRQFLAGS
  18.   extern void trace_softirqs_on(unsigned long ip);
  19.   extern void trace_softirqs_off(unsigned long ip);
  20.   extern void trace_hardirqs_on(void);
  21.   extern void trace_hardirqs_off(void);
  22. # define trace_hardirq_context(p)       ((p)->hardirq_context)
  23. # define trace_softirq_context(p)       ((p)->softirq_context)
  24. # define trace_hardirqs_enabled(p)      ((p)->hardirqs_enabled)
  25. # define trace_softirqs_enabled(p)      ((p)->softirqs_enabled)
  26. # define trace_hardirq_enter()  do { current->hardirq_context++; } while (0)
  27. # define trace_hardirq_exit()   do { current->hardirq_context--; } while (0)
  28. # define lockdep_softirq_enter()        do { current->softirq_context++; } while (0)
  29. # define lockdep_softirq_exit() do { current->softirq_context--; } while (0)
  30. # define INIT_TRACE_IRQFLAGS    .softirqs_enabled = 1,
  31. #else
  32. # define trace_hardirqs_on()            do { } while (0)
  33. # define trace_hardirqs_off()           do { } while (0)
  34. # define trace_softirqs_on(ip)          do { } while (0)
  35. # define trace_softirqs_off(ip)         do { } while (0)
  36. # define trace_hardirq_context(p)       0
  37. # define trace_softirq_context(p)       0
  38. # define trace_hardirqs_enabled(p)      0
  39. # define trace_softirqs_enabled(p)      0
  40. # define trace_hardirq_enter()          do { } while (0)
  41. # define trace_hardirq_exit()           do { } while (0)
  42. # define lockdep_softirq_enter()        do { } while (0)
  43. # define lockdep_softirq_exit()         do { } while (0)
  44. # define INIT_TRACE_IRQFLAGS
  45. #endif
  46.  
  47. #if defined(CONFIG_IRQSOFF_TRACER) || \
  48.         defined(CONFIG_PREEMPT_TRACER)
  49.  extern void stop_critical_timings(void);
  50.  extern void start_critical_timings(void);
  51. #else
  52. # define stop_critical_timings() do { } while (0)
  53. # define start_critical_timings() do { } while (0)
  54. #endif
  55.  
  56. /*
  57.  * Wrap the arch provided IRQ routines to provide appropriate checks.
  58.  */
  59. #define raw_local_irq_disable()         arch_local_irq_disable()
  60. #define raw_local_irq_enable()          arch_local_irq_enable()
  61. #define raw_local_irq_save(flags)                       \
  62.         do {                                            \
  63.                 typecheck(unsigned long, flags);        \
  64.                 flags = arch_local_irq_save();          \
  65.         } while (0)
  66. #define raw_local_irq_restore(flags)                    \
  67.         do {                                            \
  68.                 typecheck(unsigned long, flags);        \
  69.                 arch_local_irq_restore(flags);          \
  70.         } while (0)
  71. #define raw_local_save_flags(flags)                     \
  72.         do {                                            \
  73.                 typecheck(unsigned long, flags);        \
  74.                 flags = arch_local_save_flags();        \
  75.         } while (0)
  76. #define raw_irqs_disabled_flags(flags)                  \
  77.         ({                                              \
  78.                 typecheck(unsigned long, flags);        \
  79.                 arch_irqs_disabled_flags(flags);        \
  80.         })
  81. #define raw_irqs_disabled()             (arch_irqs_disabled())
  82. #define raw_safe_halt()                 arch_safe_halt()
  83.  
  84. /*
  85.  * The local_irq_*() APIs are equal to the raw_local_irq*()
  86.  * if !TRACE_IRQFLAGS.
  87.  */
  88. #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
  89. #define local_irq_enable() \
  90.         do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)
  91. #define local_irq_disable() \
  92.         do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0)
  93. #define local_irq_save(flags)                           \
  94.         do {                                            \
  95.                 raw_local_irq_save(flags);              \
  96.                 trace_hardirqs_off();                   \
  97.         } while (0)
  98.  
  99.  
  100. #define local_irq_restore(flags)                        \
  101.         do {                                            \
  102.                 if (raw_irqs_disabled_flags(flags)) {   \
  103.                         raw_local_irq_restore(flags);   \
  104.                         trace_hardirqs_off();           \
  105.                 } else {                                \
  106.                         trace_hardirqs_on();            \
  107.                         raw_local_irq_restore(flags);   \
  108.                 }                                       \
  109.         } while (0)
  110. #define local_save_flags(flags)                         \
  111.         do {                                            \
  112.                 raw_local_save_flags(flags);            \
  113.         } while (0)
  114.  
  115. #define irqs_disabled_flags(flags)                      \
  116.         ({                                              \
  117.                 raw_irqs_disabled_flags(flags);         \
  118.         })
  119.  
  120. #define irqs_disabled()                                 \
  121.         ({                                              \
  122.                 unsigned long _flags;                   \
  123.                 raw_local_save_flags(_flags);           \
  124.                 raw_irqs_disabled_flags(_flags);        \
  125.         })
  126.  
  127. #define safe_halt()                             \
  128.         do {                                    \
  129.                 trace_hardirqs_on();            \
  130.                 raw_safe_halt();                \
  131.         } while (0)
  132.  
  133.  
  134. #else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */
  135.  
  136. #define local_irq_enable()      do { raw_local_irq_enable(); } while (0)
  137. #define local_irq_disable()     do { raw_local_irq_disable(); } while (0)
  138. #define local_irq_save(flags)                                   \
  139.         do {                                                    \
  140.                 raw_local_irq_save(flags);                      \
  141.         } while (0)
  142. #define local_irq_restore(flags) do { raw_local_irq_restore(flags); } while (0)
  143. #define local_save_flags(flags) do { raw_local_save_flags(flags); } while (0)
  144. #define irqs_disabled()         (raw_irqs_disabled())
  145. #define irqs_disabled_flags(flags) (raw_irqs_disabled_flags(flags))
  146. #define safe_halt()             do { raw_safe_halt(); } while (0)
  147.  
  148. #endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */
  149.  
  150. #endif
  151.