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