111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/****************************************************************************
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ****************************************************************************
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   This header was automatically generated from a Linux kernel header
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   of the same name, to make information necessary for userspace to
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   call into the kernel available to libc.  It contains only constants,
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   structures, and macros generated from the original header, and thus,
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   contains no copyrightable information.
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ****************************************************************************
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ****************************************************************************/
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef LINUX_HARDIRQ_H
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define LINUX_HARDIRQ_H
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/preempt.h>
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/smp_lock.h>
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/lockdep.h>
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <asm/hardirq.h>
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <asm/system.h>
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PREEMPT_BITS 8
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOFTIRQ_BITS 8
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef HARDIRQ_BITS
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define HARDIRQ_BITS 12
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 1 << HARDIRQ_BITS < NR_IRQS
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#error HARDIRQ_BITS is too low!
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PREEMPT_SHIFT 0
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOFTIRQ_SHIFT (PREEMPT_SHIFT + PREEMPT_BITS)
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define HARDIRQ_SHIFT (SOFTIRQ_SHIFT + SOFTIRQ_BITS)
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __IRQ_MASK(x) ((1UL << (x))-1)
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PREEMPT_MASK (__IRQ_MASK(PREEMPT_BITS) << PREEMPT_SHIFT)
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOFTIRQ_MASK (__IRQ_MASK(SOFTIRQ_BITS) << SOFTIRQ_SHIFT)
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define HARDIRQ_MASK (__IRQ_MASK(HARDIRQ_BITS) << HARDIRQ_SHIFT)
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PREEMPT_OFFSET (1UL << PREEMPT_SHIFT)
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOFTIRQ_OFFSET (1UL << SOFTIRQ_SHIFT)
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define HARDIRQ_OFFSET (1UL << HARDIRQ_SHIFT)
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if PREEMPT_ACTIVE < 1 << HARDIRQ_SHIFT + HARDIRQ_BITS
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#error PREEMPT_ACTIVE is too low!
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define hardirq_count() (preempt_count() & HARDIRQ_MASK)
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define softirq_count() (preempt_count() & SOFTIRQ_MASK)
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define irq_count() (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK))
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define in_irq() (hardirq_count())
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define in_softirq() (softirq_count())
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define in_interrupt() (irq_count())
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define in_atomic() ((preempt_count() & ~PREEMPT_ACTIVE) != 0)
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define preemptible() 0
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define IRQ_EXIT_OFFSET HARDIRQ_OFFSET
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define synchronize_irq(irq) barrier()
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct task_struct;
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define irq_enter()   do {   account_system_vtime(current);   add_preempt_count(HARDIRQ_OFFSET);   trace_hardirq_enter();   } while (0)
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __irq_exit()   do {   trace_hardirq_exit();   account_system_vtime(current);   sub_preempt_count(HARDIRQ_OFFSET);   } while (0)
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nmi_enter() do { lockdep_off(); irq_enter(); } while (0)
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nmi_exit() do { __irq_exit(); lockdep_on(); } while (0)
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
74