summaryrefslogtreecommitdiff
path: root/linux/dev/kernel/softirq.c
blob: 82e1442afbd4ca11a2dd27b3103247ca48cfc6de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
 *    linux/kernel/softirq.c
 *
 *      Copyright (C) 1992 Linus Torvalds
 *
 * do_bottom_half() runs at normal kernel priority: all interrupts
 * enabled.  do_bottom_half() is atomic with respect to itself: a
 * bottom_half handler need not be re-entrant.
 */

#define MACH_INCLUDE
#include <linux/ptrace.h>
#include <linux/interrupt.h>
#include <asm/system.h>

#include <linux/dev/glue/glue.h>

int bh_mask_count[32];
unsigned int bh_active = 0;
unsigned int bh_mask = 0;
void (*bh_base[32]) (void);

void
linux_soft_intr (void)
{
  unsigned int active;
  unsigned int mask, left;
  void (**bh) (void);

  sti ();
  bh = bh_base;
  active = bh_active & bh_mask;
  for (mask = 1, left = ~0; left & active; bh++, mask += mask, left += left)
    {
      if (mask & active)
	{
	  void (*fn) (void);
	  bh_active &= ~mask;
	  fn = *bh;
	  if (!fn)
	    goto bad_bh;
	  fn ();
	}
    }
  return;
bad_bh:
  printk ("linux_soft_intr:bad interrupt handler entry %08lx\n", mask);
}