netlib.narod.ru< Назад | Оглавление | Далее >

arch/i386/kernel/irq.c

  598 /*
  599  *      linux/arch/i386/kernel/irq.c
  600  *
  601  * Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar
  602  *
  603  * This file contains the code used by various IRQ
  604  * handling routines: asking for different IRQ's should
  605  * be done through these routines instead of just
  606  * grabbing them. Thus setups with different IRQ numbers
  607  * shouldn't result in any weird surprises, and
  608  * installing new handlers should be easier.  */
  609 
  610 /* IRQs are in fact implemented a bit like signal
  611  * handlers for the kernel.  Naturally it's not a 1:1
  612  * relation, but there are similarities.  */
  613 
  614 #include <linux/config.h>
  615 #include <linux/ptrace.h>
  616 #include <linux/errno.h>
  617 #include <linux/kernel_stat.h>
  618 #include <linux/signal.h>
  619 #include <linux/sched.h>
  620 #include <linux/ioport.h>
  621 #include <linux/interrupt.h>
  622 #include <linux/timex.h>
  623 #include <linux/malloc.h>
  624 #include <linux/random.h>
  625 #include <linux/smp.h>
  626 #include <linux/tasks.h>
  627 #include <linux/smp_lock.h>
  628 #include <linux/init.h>
  629 
  630 #include <asm/system.h>
  631 #include <asm/io.h>
  632 #include <asm/irq.h>
  633 #include <asm/bitops.h>
  634 #include <asm/smp.h>
  635 #include <asm/pgtable.h>
  636 #include <asm/delay.h>
  637 #include <asm/desc.h>
  638 
  639 #include "irq.h"
  640 
  641 unsigned int local_bh_count[NR_CPUS];
  642 unsigned int local_irq_count[NR_CPUS];
  643 
  644 atomic_t nmi_counter;
  645 
  646 /* Linux has a controller-independent x86 interrupt
  647  * architecture.  every controller has a
  648  * 'controller-template', that is used by the main code
  649  * to do the right thing. Each driver-visible interrupt
  650  * source is transparently wired to the apropriate
  651  * controller. Thus drivers need not be aware of the
  652  * interrupt-controller.
  653  *
  654  * Various interrupt controllers we handle: 8259 PIC, SMP
  655  * IO-APIC, PIIX4's internal 8259 PIC and SGI's Visual
  656  * Workstation Cobalt (IO-)APIC.  (IO-APICs assumed to be
  657  * messaging to Pentium local-APICs)
  658  *
  659  * the code is designed to be easily extended with
  660  * new/different interrupt controllers, without having to
  661  * do assembly magic.  */
  662 
  663 /* Micro-access to controllers is serialized over the
  664  * whole system. We never hold this lock when we call the
  665  * actual IRQ handler.  */
  666 spinlock_t irq_controller_lock;
  667 
  668 /* Dummy controller type for unused interrupts */
  669 static void do_none(unsigned int irq,
  670                     struct pt_regs * regs)
  671 {
  672   /* we are careful. While for ISA irqs it's common to
  673    * happen outside of any driver (think autodetection),
  674    * this is not at all nice for PCI interrupts. So we
  675    * are stricter and print a warning when such spurious
  676    * interrupts happen.  Spurious interrupts can confuse
  677    * other drivers if the PCI IRQ line is shared.
  678    *
  679    * Such spurious interrupts are either driver bugs, or
  680    * sometimes hw (chipset) bugs.  */
  681   printk("unexpected IRQ vector %d on CPU#%d!\n",
  682          irq, smp_processor_id());
  683 
  684 #ifdef __SMP__
  685   /* [currently unexpected vectors happen only on SMP and
  686    * APIC.  if we want to have non-APIC and non-8259A
  687    * controllers in the future with unexpected vectors,
  688    * this ack should probably be made
  689    * controller-specific.]  */
  690   ack_APIC_irq();
  691 #endif
  692 }
  693 static void enable_none(unsigned int irq) { }
  694 static void disable_none(unsigned int irq) { }
  695 
  696 /* startup is the same as "enable", shutdown is same as
  697  * "disable" */
  698 #define startup_none    enable_none
  699 #define shutdown_none   disable_none
  700 
  701 struct hw_interrupt_type no_irq_type = {
  702   "none",
  703   startup_none,
  704   shutdown_none,
  705   do_none,
  706   enable_none,
  707   disable_none
  708 };
  709 
  710 /* This is the 'legacy' 8259A Programmable Interrupt
  711  * Controller, present in the majority of PC/AT boxes. */
  712 
  713 static void do_8259A_IRQ(unsigned int irq,
  714                          struct pt_regs * regs);
  715 static void enable_8259A_irq(unsigned int irq);
  716 void disable_8259A_irq(unsigned int irq);
  717 
  718 /* startup is the same as "enable", shutdown is same as
  719  * "disable" */
  720 #define startup_8259A_irq       enable_8259A_irq
  721 #define shutdown_8259A_irq      disable_8259A_irq
  722 
  723 static struct hw_interrupt_type i8259A_irq_type = {
  724   "XT-PIC",
  725   startup_8259A_irq,
  726   shutdown_8259A_irq,
  727   do_8259A_IRQ,
  728   enable_8259A_irq,
  729   disable_8259A_irq
  730 };
  731 
  732 /* Controller mappings for all interrupt sources: */
  733 irq_desc_t irq_desc[NR_IRQS] = { [0 ... NR_IRQS-1] =
  734                                  { 0, &no_irq_type, } };
  735 
  736 
  737 /* 8259A PIC functions to handle ISA devices: */
  738 
  739 /* This contains the irq mask for both 8259A irq
  740  * controllers, */
  741 static unsigned int cached_irq_mask = 0xffff;
  742 
  743 #define __byte(x,y) (((unsigned char *)&(y))[x])
  744 #define __word(x,y) (((unsigned short *)&(y))[x])
  745 #define __long(x,y) (((unsigned int *)&(y))[x])
  746 
  747 #define cached_21       (__byte(0,cached_irq_mask))
  748 #define cached_A1       (__byte(1,cached_irq_mask))
  749 
  750 /* Not all IRQs can be routed through the IO-APIC, eg. on
  751  * certain (older) boards the timer interrupt is not
  752  * connected to any IO-APIC pin, it's fed to the CPU IRQ
  753  * line directly.
  754  *
  755  * Any '1' bit in this mask means the IRQ is routed
  756  * through the IO-APIC.  this 'mixed mode' IRQ handling
  757  * costs nothing because it's only used at IRQ setup
  758  * time.  */
  759 unsigned long io_apic_irqs = 0;
  760 
  761 /* These have to be protected by the irq controller
  762  * spinlock before being called.  */
  763 void disable_8259A_irq(unsigned int irq)
  764 {
  765   unsigned int mask = 1 << irq;
  766   cached_irq_mask |= mask;
  767   if (irq & 8) {
  768     outb(cached_A1,0xA1);
  769   } else {
  770     outb(cached_21,0x21);
  771   }
  772 }
  773 
  774 static void enable_8259A_irq(unsigned int irq)
  775 {
  776   unsigned int mask = ~(1 << irq);
  777   cached_irq_mask &= mask;
  778   if (irq & 8) {
  779     outb(cached_A1,0xA1);
  780   } else {
  781     outb(cached_21,0x21);
  782   }
  783 }
  784 
  785 int i8259A_irq_pending(unsigned int irq)
  786 {
  787   unsigned int mask = 1<<irq;
  788 
  789   if (irq < 8)
  790     return (inb(0x20) & mask);
  791   return (inb(0xA0) & (mask >> 8));
  792 }
  793 
  794 void make_8259A_irq(unsigned int irq)
  795 {
  796   disable_irq(irq);
  797   __long(0,io_apic_irqs) &= ~(1<<irq);
  798   irq_desc[irq].handler = &i8259A_irq_type;
  799   enable_irq(irq);
  800 }
  801 
  802 /* Careful! The 8259A is a fragile beast, it pretty much
  803  * _has_ to be done exactly like this (mask it first,
  804  * _then_ send the EOI, and the order of EOI to the two
  805  * 8259s is important!  */
  806 static inline void mask_and_ack_8259A(unsigned int irq)
  807 {
  808   cached_irq_mask |= 1 << irq;
  809   if (irq & 8) {
  810     inb(0xA1);      /* DUMMY */
  811     outb(cached_A1,0xA1);
  812     outb(0x62,0x20);        /* Specific EOI to cascade */
  813     outb(0x20,0xA0);
  814   } else {
  815     inb(0x21);      /* DUMMY */
  816     outb(cached_21,0x21);
  817     outb(0x20,0x20);
  818   }
  819 }
  820 
  821 static void do_8259A_IRQ(unsigned int irq,
  822                          struct pt_regs * regs)
  823 {
  824   struct irqaction * action;
  825   irq_desc_t *desc = irq_desc + irq;
  826 
  827   spin_lock(&irq_controller_lock);
  828   {
  829     unsigned int status;
  830     mask_and_ack_8259A(irq);
  831     status = desc->status & ~IRQ_REPLAY;
  832     action = NULL;
  833     if (!(status & (IRQ_DISABLED | IRQ_INPROGRESS)))
  834       action = desc->action;
  835     desc->status = status | IRQ_INPROGRESS;
  836   }
  837   spin_unlock(&irq_controller_lock);
  838 
  839   /* Exit early if we had no action or it was disabled */
  840   if (!action)
  841     return;
  842 
  843   handle_IRQ_event(irq, regs, action);
  844 
  845   spin_lock(&irq_controller_lock);
  846   {
  847     unsigned int status = desc->status & ~IRQ_INPROGRESS;
  848     desc->status = status;
  849     if (!(status & IRQ_DISABLED))
  850       enable_8259A_irq(irq);
  851   }
  852   spin_unlock(&irq_controller_lock);
  853 }
  854 
  855 /* This builds up the IRQ handler stubs using some ugly
  856  * macros in irq.h
  857  *
  858  * These macros create the low-level assembly IRQ
  859  * routines that save register context and call do_IRQ().
  860  * do_IRQ() then does all the operations that are needed
  861  * to keep the AT (or SMP IOAPIC) interrupt-controller
  862  * happy.  */
  863 
  864 BUILD_COMMON_IRQ()
  865 
  866 #define BI(x,y)                                         \
  867   BUILD_IRQ(##x##y)
  868 
  869 #define BUILD_16_IRQS(x)                                \
  870   BI(x,0) BI(x,1) BI(x,2) BI(x,3)                       \
  871   BI(x,4) BI(x,5) BI(x,6) BI(x,7)                       \
  872   BI(x,8) BI(x,9) BI(x,a) BI(x,b)                       \
  873   BI(x,c) BI(x,d) BI(x,e) BI(x,f)
  874 
  875 /* ISA PIC or low IO-APIC triggered (INTA-cycle or APIC)
  876  * interrupts: (these are usually mapped to vectors
  877  * 0x20-0x30) */
  878 BUILD_16_IRQS(0x0)
  879 
  880 #ifdef CONFIG_X86_IO_APIC
  881 /* The IO-APIC gives us many more interrupt sources. Most
  882  * of these are unused but an SMP system is supposed to
  883  * have enough memory ...  sometimes (mostly wrt. hw
  884  * bugs) we get corrupted vectors all across the
  885  * spectrum, so we really want to be prepared to get all
  886  * of these. Plus, more powerful systems might have more
  887  * than 64 IO-APIC registers.
  888  *
  889  * (these are usually mapped into the 0x30-0xff vector
  890  * range) */
  891 BUILD_16_IRQS(0x1) BUILD_16_IRQS(0x2) BUILD_16_IRQS(0x3)
  892 BUILD_16_IRQS(0x4) BUILD_16_IRQS(0x5) BUILD_16_IRQS(0x6)
  893 BUILD_16_IRQS(0x7) BUILD_16_IRQS(0x8) BUILD_16_IRQS(0x9)
  894 BUILD_16_IRQS(0xa) BUILD_16_IRQS(0xb) BUILD_16_IRQS(0xc)
  895 BUILD_16_IRQS(0xd)
  896 #endif
  897 
  898 #undef BUILD_16_IRQS
  899 #undef BI
  900 
  901 
  902 #ifdef __SMP__
  903 /* The following vectors are part of the Linux
  904  * architecture, there is no hardware IRQ pin equivalent
  905  * for them, they are triggered through the ICC by us
  906  * (IPIs) */
  907 BUILD_SMP_INTERRUPT(reschedule_interrupt)
  908 BUILD_SMP_INTERRUPT(invalidate_interrupt)
  909 BUILD_SMP_INTERRUPT(stop_cpu_interrupt)
  910 BUILD_SMP_INTERRUPT(mtrr_interrupt)
  911 BUILD_SMP_INTERRUPT(spurious_interrupt)
  912 
  913 /* every pentium local APIC has two 'local interrupts',
  914  * with a soft-definable vector attached to both
  915  * interrupts, one of which is a timer interrupt, the
  916  * other one is error counter overflow. Linux uses the
  917  * local APIC timer interrupt to get a much simpler SMP
  918  * time architecture: */
  919 BUILD_SMP_TIMER_INTERRUPT(apic_timer_interrupt)
  920 
  921 #endif
  922 
  923 #define IRQ(x,y)                                        \
  924   IRQ##x##y##_interrupt
  925 
  926 #define IRQLIST_16(x)                                   \
  927   IRQ(x,0), IRQ(x,1), IRQ(x,2), IRQ(x,3),               \
  928   IRQ(x,4), IRQ(x,5), IRQ(x,6), IRQ(x,7),               \
  929   IRQ(x,8), IRQ(x,9), IRQ(x,a), IRQ(x,b),               \
  930   IRQ(x,c), IRQ(x,d), IRQ(x,e), IRQ(x,f)
  931 
  932 static void (*interrupt[NR_IRQS])(void) = {
  933   IRQLIST_16(0x0),
  934 
  935 #ifdef CONFIG_X86_IO_APIC
  936 IRQLIST_16(0x1), IRQLIST_16(0x2), IRQLIST_16(0x3),
  937 IRQLIST_16(0x4), IRQLIST_16(0x5), IRQLIST_16(0x6),
  938 IRQLIST_16(0x7), IRQLIST_16(0x8), IRQLIST_16(0x9),
  939 IRQLIST_16(0xa), IRQLIST_16(0xb), IRQLIST_16(0xc),
  940 IRQLIST_16(0xd)
  941 #endif
  942 };
  943 
  944 #undef IRQ
  945 #undef IRQLIST_16
  946 
  947 
  948 /* Special irq handlers.  */
  949 
  950 void no_action(int cpl, void *dev_id,
  951                struct pt_regs *regs)
  952 {}
  953 
  954 #ifndef CONFIG_VISWS
  955 /* Note that on a 486, we don't want to do a SIGFPE on an
  956  * irq13 as the irq is unreliable, and exception 16 works
  957  * correctly (ie as explained in the intel
  958  * literature). On a 386, you can't use exception 16 due
  959  * to bad IBM design, so we have to rely on the less
  960  * exact irq13.
  961  *
  962  * Careful.. Not only is IRQ13 unreliable, but it is also
  963  * leads to races. IBM designers who came up with it
  964  * should be shot.  */
  965 static void math_error_irq(int cpl, void *dev_id,
  966                            struct pt_regs *regs)
  967 {
  968   outb(0,0xF0);
  969   if (ignore_irq13 || !boot_cpu_data.hard_math)
  970     return;
  971   math_error();
  972 }
  973 
  974 static struct irqaction irq13 =
  975 { math_error_irq, 0, 0, "fpu", NULL, NULL };
  976 
  977 /* IRQ2 is cascade interrupt to second interrupt
  978  * controller */
  979 static struct irqaction irq2  =
  980 { no_action, 0, 0, "cascade", NULL, NULL};
  981 #endif
  982 
  983 /* Generic, controller-independent functions: */
  984 
  985 int get_irq_list(char *buf)
  986 {
  987   int i, j;
  988   struct irqaction * action;
  989   char *p = buf;
  990 
  991   p += sprintf(p, "           ");
  992   for (j=0; j<smp_num_cpus; j++)
  993     p += sprintf(p, "CPU%d       ",j);
  994   *p++ = '\n';
  995 
  996   for (i = 0 ; i < NR_IRQS ; i++) {
  997     action = irq_desc[i].action;
  998     if (!action)
  999       continue;
 1000     p += sprintf(p, "%3d: ",i);
 1001 #ifndef __SMP__
 1002     p += sprintf(p, "%10u ", kstat_irqs(i));
 1003 #else
 1004     for (j=0; j<smp_num_cpus; j++)
 1005       p += sprintf(p, "%10u ",
 1006         kstat.irqs[cpu_logical_map(j)][i]);
 1007 #endif
 1008     p += sprintf(p, " %14s",
 1009                  irq_desc[i].handler->typename);
 1010     p += sprintf(p, "  %s", action->name);
 1011 
 1012     for (action=action->next; action;
 1013          action = action->next) {
 1014       p += sprintf(p, ", %s", action->name);
 1015     }
 1016     *p++ = '\n';
 1017   }
 1018   p += sprintf(p, "NMI: %10u\n",
 1019                atomic_read(&nmi_counter));
 1020 #ifdef __SMP__
 1021   p += sprintf(p, "ERR: %10lu\n", ipi_count);
 1022 #endif
 1023   return p - buf;
 1024 }
 1025 
 1026 /* Global interrupt locks for SMP. Allow interrupts to
 1027  * come in on any CPU, yet make cli/sti act globally to
 1028  * protect critical regions..  */
 1029 #ifdef __SMP__
 1030 unsigned char global_irq_holder = NO_PROC_ID;
 1031 unsigned volatile int global_irq_lock;
 1032 atomic_t global_irq_count;
 1033 
 1034 atomic_t global_bh_count;
 1035 atomic_t global_bh_lock;
 1036 
 1037 /* "global_cli()" is a special case, in that it can hold
 1038  * the interrupts disabled for a longish time, and also
 1039  * because we may be doing TLB invalidates when holding
 1040  * the global IRQ lock for historical reasons. Thus we
 1041  * may need to check SMP invalidate events specially by
 1042  * hand here (but not in any normal spinlocks) */
 1043 static inline void check_smp_invalidate(int cpu)
 1044 {
 1045   if (test_bit(cpu, &smp_invalidate_needed)) {
 1046     clear_bit(cpu, &smp_invalidate_needed);
 1047     local_flush_tlb();
 1048   }
 1049 }
 1050 
 1051 static void show(char * str)
 1052 {
 1053   int i;
 1054   unsigned long *stack;
 1055   int cpu = smp_processor_id();
 1056   extern char *get_options(char *str, int *ints);
 1057 
 1058   printk("\n%s, CPU %d:\n", str, cpu);
 1059   printk("irq:  %d [%d %d]\n",
 1060     atomic_read(&global_irq_count), local_irq_count[0],
 1061          local_irq_count[1]);
 1062   printk("bh:   %d [%d %d]\n",
 1063     atomic_read(&global_bh_count), local_bh_count[0],
 1064          local_bh_count[1]);
 1065   stack = (unsigned long *) &stack;
 1066   for (i = 40; i ; i--) {
 1067     unsigned long x = *++stack;
 1068     if (x > (unsigned long) &get_options &&
 1069         x < (unsigned long) &vsprintf) {
 1070       printk("<[%08lx]> ", x);
 1071     }
 1072   }
 1073 }
 1074 
 1075 #define MAXCOUNT 100000000
 1076 
 1077 static inline void wait_on_bh(void)
 1078 {
 1079   int count = MAXCOUNT;
 1080   do {
 1081     if (!--count) {
 1082       show("wait_on_bh");
 1083       count = ~0;
 1084     }
 1085     /* nothing .. wait for the other bh's to go away */
 1086   } while (atomic_read(&global_bh_count) != 0);
 1087 }
 1088 
 1089 /* I had a lockup scenario where a tight loop doing
 1090  * spin_unlock()/spin_lock() on CPU#1 was racing with
 1091  * spin_lock() on CPU#0. CPU#0 should have noticed
 1092  * spin_unlock(), but apparently the spin_unlock()
 1093  * information did not make it through to CPU#0
 1094  * ... nasty, is this by design, do we have to limit
 1095  * 'memory update oscillation frequency' artificially
 1096  * like here?
 1097  *
 1098  * Such 'high frequency update' races can be avoided by
 1099  * careful design, but some of our major constructs like
 1100  * spinlocks use similar techniques, it would be nice to
 1101  * clarify this issue. Set this define to 0 if you want
 1102  * to check whether your system freezes.  I suspect the
 1103  * delay done by SYNC_OTHER_CORES() is in correlation
 1104  * with 'snooping latency', but i thought that such
 1105  * things are guaranteed by design, since we use the
 1106  * 'LOCK' prefix.  */
 1107 #define SUSPECTED_CPU_OR_CHIPSET_BUG_WORKAROUND 1
 1108 
 1109 #if SUSPECTED_CPU_OR_CHIPSET_BUG_WORKAROUND
 1110 # define SYNC_OTHER_CORES(x) udelay(x+1)
 1111 #else
 1112 /* We have to allow irqs to arrive between __sti and
 1113  * __cli */
 1114 # define SYNC_OTHER_CORES(x) __asm__ __volatile__ ("nop")
 1115 #endif
 1116 
 1117 static inline void wait_on_irq(int cpu)
 1118 {
 1119   int count = MAXCOUNT;
 1120 
 1121   for (;;) {
 1122 
 1123     /* Wait until all interrupts are gone. Wait for
 1124      * bottom half handlers unless we're already
 1125      * executing in one..  */
 1126     if (!atomic_read(&global_irq_count)) {
 1127       if (local_bh_count[cpu] ||
 1128           !atomic_read(&global_bh_count))
 1129         break;
 1130     }
 1131 
 1132     /* Duh, we have to loop. Release the lock to avoid
 1133      * deadlocks */
 1134     clear_bit(0, &global_irq_lock);
 1135 
 1136     for (;;) {
 1137       if (!--count) {
 1138         show("wait_on_irq");
 1139         count = ~0;
 1140       }
 1141       __sti();
 1142       SYNC_OTHER_CORES(cpu);
 1143       __cli();
 1144       check_smp_invalidate(cpu);
 1145       if (atomic_read(&global_irq_count))
 1146         continue;
 1147       if (global_irq_lock)
 1148         continue;
 1149       if (!local_bh_count[cpu] &&
 1150           atomic_read(&global_bh_count))
 1151         continue;
 1152       if (!test_and_set_bit(0,&global_irq_lock))
 1153         break;
 1154     }
 1155   }
 1156 }
 1157 
 1158 /* This is called when we want to synchronize with bottom
 1159  * half handlers. We need to wait until no other CPU is
 1160  * executing any bottom half handler.
 1161  *
 1162  * Don't wait if we're already running in an interrupt
 1163  * context or are inside a bh handler.  */
 1164 void synchronize_bh(void)
 1165 {
 1166   if (atomic_read(&global_bh_count) && !in_interrupt())
 1167     wait_on_bh();
 1168 }
 1169 
 1170 /* This is called when we want to synchronize with
 1171  * interrupts. We may for example tell a device to stop
 1172  * sending interrupts: but to make sure there are no
 1173  * interrupts that are executing on another CPU we need
 1174  * to call this function.  */
 1175 void synchronize_irq(void)
 1176 {
 1177   if (atomic_read(&global_irq_count)) {
 1178     /* Stupid approach */
 1179     cli();
 1180     sti();
 1181   }
 1182 }
 1183 
 1184 static inline void get_irqlock(int cpu)
 1185 {
 1186   if (test_and_set_bit(0,&global_irq_lock)) {
 1187     /* do we already hold the lock? */
 1188     if ((unsigned char) cpu == global_irq_holder)
 1189       return;
 1190     /* Uhhuh.. Somebody else got it. Wait.. */
 1191     do {
 1192       do {
 1193         check_smp_invalidate(cpu);
 1194       } while (test_bit(0,&global_irq_lock));
 1195     } while (test_and_set_bit(0,&global_irq_lock));
 1196   }
 1197   /* We also to make sure that nobody else is running in
 1198    * an interrupt context.  */
 1199   wait_on_irq(cpu);
 1200 
 1201   /* Ok, finally..  */
 1202   global_irq_holder = cpu;
 1203 }
 1204 
 1205 #define EFLAGS_IF_SHIFT 9
 1206 
 1207 /* A global "cli()" while in an interrupt context turns
 1208  * into just a local cli(). Interrupts should use
 1209  * spinlocks for the (very unlikely) case that they ever
 1210  * want to protect against each other.
 1211  *
 1212  * If we already have local interrupts disabled, this
 1213  * will not turn a local disable into a global one
 1214  * (problems with spinlocks: this makes
 1215  * save_flags+cli+sti usable inside a spinlock).  */
 1216 void __global_cli(void)
 1217 {
 1218   unsigned int flags;
 1219 
 Комментарий
 1220   __save_flags(flags);
 1221   if (flags & (1 << EFLAGS_IF_SHIFT)) {
 1222     int cpu = smp_processor_id();
 1223     __cli();
 1224     if (!local_irq_count[cpu])
 1225       get_irqlock(cpu);
 1226   }
 1227 }
 1228 
 1229 void __global_sti(void)
 1230 {
 1231   int cpu = smp_processor_id();
 1232 
 1233   if (!local_irq_count[cpu])
 1234     release_irqlock(cpu);
 1235   __sti();
 1236 }
 1237 
 1238 /* SMP flags value to restore to:
 1239  * 0 - global cli
 1240  * 1 - global sti
 1241  * 2 - local cli
 1242  * 3 - local sti */
 1243 unsigned long __global_save_flags(void)
 1244 {
 1245   int retval;
 1246   int local_enabled;
 1247   unsigned long flags;
 1248 
 1249   __save_flags(flags);
 1250   local_enabled = (flags >> EFLAGS_IF_SHIFT) & 1;
 1251   /* default to local */
 1252   retval = 2 + local_enabled;
 1253 
 1254   /*check for global flags if we're not in an interrupt*/
 1255   if (!local_irq_count[smp_processor_id()]) {
 1256     if (local_enabled)
 1257       retval = 1;
 1258     if (global_irq_holder ==
 1259         (unsigned char) smp_processor_id())
 1260       retval = 0;
 1261   }
 1262   return retval;
 1263 }
 1264 
 1265 void __global_restore_flags(unsigned long flags)
 1266 {
 1267   switch (flags) {
 1268   case 0:
 1269     __global_cli();
 1270     break;
 1271   case 1:
 1272     __global_sti();
 1273     break;
 1274   case 2:
 1275     __cli();
 1276     break;
 1277   case 3:
 1278     __sti();
 1279     break;
 1280   default:
 1281     printk("global_restore_flags: %08lx (%08lx)\n",
 1282       flags, (&flags)[-1]);
 1283   }
 1284 }
 1285 
 1286 #endif
 1287 
 1288 /* This should really return information about whether we
 1289  * should do bottom half handling etc. Right now we end
 1290  * up _always_ checking the bottom half, which is a waste
 1291  * of time and is not what some drivers would prefer.  */
 Комментарий
 1292 int handle_IRQ_event(unsigned int irq,
 1293         struct pt_regs * regs, struct irqaction * action)
 1294 {
 1295   int status;
 1296   int cpu = smp_processor_id();
 1297 
 1298   irq_enter(cpu, irq);
 1299 
 1300   status = 1;     /* Force the "do bottom halves" bit */
 1301 
 1302   if (!(action->flags & SA_INTERRUPT))
 1303     __sti();
 1304 
 1305   do {
 1306     status |= action->flags;
 1307     action->handler(irq, action->dev_id, regs);
 1308     action = action->next;
 1309   } while (action);
 1310   if (status & SA_SAMPLE_RANDOM)
 1311     add_interrupt_randomness(irq);
 1312   __cli();
 1313 
 1314   irq_exit(cpu, irq);
 1315 
 1316   return status;
 1317 }
 1318 
 1319 /* Generic enable/disable code: this just calls down into
 1320  * the PIC-specific version for the actual hardware
 1321  * disable after having gotten the irq controller lock.
 1322  */
 1323 void disable_irq(unsigned int irq)
 1324 {
 1325   unsigned long flags;
 1326 
 1327   spin_lock_irqsave(&irq_controller_lock, flags);
 1328   if (!irq_desc[irq].depth++) {
 1329     irq_desc[irq].status |= IRQ_DISABLED;
 1330     irq_desc[irq].handler->disable(irq);
 1331   }
 1332   spin_unlock_irqrestore(&irq_controller_lock, flags);
 1333 
 1334   if (irq_desc[irq].status & IRQ_INPROGRESS)
 1335     synchronize_irq();
 1336 }
 1337 
 1338 void enable_irq(unsigned int irq)
 1339 {
 1340   unsigned long flags;
 1341 
 1342   spin_lock_irqsave(&irq_controller_lock, flags);
 1343   switch (irq_desc[irq].depth) {
 1344   case 1:
 1345     irq_desc[irq].status &= ~(IRQ_DISABLED |
 1346                               IRQ_INPROGRESS);
 1347     irq_desc[irq].handler->enable(irq);
 1348     /* fall throught */
 1349   default:
 1350     irq_desc[irq].depth--;
 1351     break;
 1352   case 0:
 1353     printk("enable_irq() unbalanced from %p\n",
 1354            __builtin_return_address(0));
 1355   }
 1356   spin_unlock_irqrestore(&irq_controller_lock, flags);
 1357 }
 1358 
 1359 /* do_IRQ handles all normal device IRQ's (the special
 1360  * SMP cross-CPU interrupts have their own specific
 1361  * handlers).  */
 1362 asmlinkage void do_IRQ(struct pt_regs regs)
 1363 {
 1364   /*  We ack quickly, we don't want the irq controller
 1365    * thinking we're snobs just because some other CPU has
 1366    * disabled global interrupts (we have already done the
 1367    * INT_ACK cycles, it's too late to try to pretend to
 1368    * the controller that we aren't taking the interrupt).
 1369    *
 1370    * 0 return value means that this irq is already being
 1371    * handled by some other CPU. (or is disabled) */
 1372   int irq = regs.orig_eax & 0xff; /* subtle, see irq.h */
 1373   int cpu = smp_processor_id();
 1374 
 Комментарий
 1375   kstat.irqs[cpu][irq]++;
 1376   irq_desc[irq].handler->handle(irq, &regs);
 1377 
 1378   /* This should be conditional: we should really get a
 1379    * return code from the irq handler to tell us whether
 1380    * the handler wants us to do software bottom half
 1381    * handling or not..  */
 1382   if (1) {
 1383     if (bh_active & bh_mask)
 1384       do_bottom_half();
 1385   }
 1386 }
 1387 
 Комментарий
 1388 int setup_x86_irq(unsigned int irq,
 1389                   struct irqaction * new)
 1390 {
 1391   int shared = 0;
 1392   struct irqaction *old, **p;
 1393   unsigned long flags;
 1394 
 1395   /* Some drivers like serial.c use request_irq()
 1396    * heavily, so we have to be careful not to interfere
 1397    * with a running system.  */
 1398   if (new->flags & SA_SAMPLE_RANDOM) {
 1399     /* This function might sleep, we want to call it
 1400      * first, outside of the atomic block.  Yes, this
 1401      * might clear the entropy pool if the wrong driver
 1402      * is attempted to be loaded, without actually
 1403      * installing a new handler, but is this really a
 1404      * problem, only the sysadmin is able to do this.  */
 1405     rand_initialize_irq(irq);
 1406   }
 1407 
 1408   /* The following block of code has to be executed
 1409    * atomically */
 1410   spin_lock_irqsave(&irq_controller_lock,flags);
 1411   p = &irq_desc[irq].action;
 1412   if ((old = *p) != NULL) {
 1413     /* Can't share interrupts unless both agree to */
 1414     if (!(old->flags & new->flags & SA_SHIRQ)) {
 1415       spin_unlock_irqrestore(&irq_controller_lock,flags);
 1416       return -EBUSY;
 1417     }
 1418 
 1419     /* add new interrupt at end of irq queue */
 1420     do {
 1421       p = &old->next;
 1422       old = *p;
 1423     } while (old);
 1424     shared = 1;
 1425   }
 1426 
 1427   *p = new;
 1428 
 1429   if (!shared) {
 1430     irq_desc[irq].depth = 0;
 1431     irq_desc[irq].status &= ~(IRQ_DISABLED |
 1432                               IRQ_INPROGRESS);
 1433     irq_desc[irq].handler->startup(irq);
 1434   }
 1435   spin_unlock_irqrestore(&irq_controller_lock,flags);
 1436   return 0;
 1437 }
 1438 
 Комментарий
 1439 int request_irq(unsigned int irq,
 1440     void (*handler)(int, void *, struct pt_regs *),
 1441     unsigned long irqflags,
 1442     const char * devname,
 1443     void *dev_id)
 1444 {
 1445   int retval;
 1446   struct irqaction * action;
 1447 
 1448   if (irq >= NR_IRQS)
 1449     return -EINVAL;
 1450   if (!handler)
 1451     return -EINVAL;
 1452 
 1453   action = (struct irqaction *)
 1454       kmalloc(sizeof(struct irqaction), GFP_KERNEL);
 1455   if (!action)
 1456     return -ENOMEM;
 1457 
 1458   action->handler = handler;
 1459   action->flags = irqflags;
 1460   action->mask = 0;
 1461   action->name = devname;
 1462   action->next = NULL;
 1463   action->dev_id = dev_id;
 1464 
 1465   retval = setup_x86_irq(irq, action);
 1466 
 1467   if (retval)
 1468     kfree(action);
 1469   return retval;
 1470 }
 1471 
 Комментарий
 1472 void free_irq(unsigned int irq, void *dev_id)
 1473 {
 1474   struct irqaction * action, **p;
 1475   unsigned long flags;
 1476 
 1477   if (irq >= NR_IRQS)
 1478     return;
 1479 
 1480   spin_lock_irqsave(&irq_controller_lock,flags);
 1481   for (p = &irq_desc[irq].action;
 1482        (action = *p) != NULL; p = &action->next) {
 1483     if (action->dev_id != dev_id)
 1484       continue;
 1485 
 1486     /* Found it - now free it */
 1487     *p = action->next;
 1488     kfree(action);
 1489     if (!irq_desc[irq].action) {
 1490       irq_desc[irq].status |= IRQ_DISABLED;
 1491       irq_desc[irq].handler->shutdown(irq);
 1492     }
 1493     goto out;
 1494   }
 1495   printk("Trying to free free IRQ%d\n",irq);
 1496 out:
 1497   spin_unlock_irqrestore(&irq_controller_lock,flags);
 1498 }
 1499 
 1500 /* IRQ autodetection code..
 1501  *
 1502  * This depends on the fact that any interrupt that comes
 1503  * in on to an unassigned handler will get stuck with
 1504  * "IRQ_INPROGRESS" asserted and the interrupt disabled.
 1505  */
 Комментарий
 1506 unsigned long probe_irq_on(void)
 1507 {
 1508   unsigned int i;
 1509   unsigned long delay;
 1510 
 1511   /* first, enable any unassigned irqs */
 1512   spin_lock_irq(&irq_controller_lock);
 1513   for (i = NR_IRQS-1; i > 0; i--) {
 1514     if (!irq_desc[i].action) {
 1515       unsigned int status =
 1516         irq_desc[i].status | IRQ_AUTODETECT;
 1517       irq_desc[i].status = status & ~IRQ_INPROGRESS;
 1518       irq_desc[i].handler->startup(i);
 1519     }
 1520   }
 1521   spin_unlock_irq(&irq_controller_lock);
 1522 
 1523   /* Wait for spurious interrupts to trigger */
 1524   for (delay = jiffies + HZ/10;
 1525        time_after(delay, jiffies); )
 1526     /* about 100ms delay */ synchronize_irq();
 1527 
 1528   /* Now filter out any obviously spurious interrupts */
 1529   spin_lock_irq(&irq_controller_lock);
 1530   for (i=0; i<NR_IRQS; i++) {
 1531     unsigned int status = irq_desc[i].status;
 1532 
 1533     if (!(status & IRQ_AUTODETECT))
 1534       continue;
 1535 
 1536     /* It triggered already - consider it spurious. */
 Комментарий
 1537     if (status & IRQ_INPROGRESS) {
 1538       irq_desc[i].status = status & ~IRQ_AUTODETECT;
 1539       irq_desc[i].handler->shutdown(i);
 1540     }
 1541   }
 1542   spin_unlock_irq(&irq_controller_lock);
 1543 
 1544   return 0x12345678;
 1545 }
 1546 
 Комментарий
 1547 int probe_irq_off(unsigned long unused)
 1548 {
 1549   int i, irq_found, nr_irqs;
 1550 
 1551   if (unused != 0x12345678)
 1552     printk("Bad IRQ probe from %lx\n", (&unused)[-1]);
 1553 
 1554   nr_irqs = 0;
 1555   irq_found = 0;
 1556   spin_lock_irq(&irq_controller_lock);
 1557   for (i=0; i<NR_IRQS; i++) {
 1558     unsigned int status = irq_desc[i].status;
 1559 
 1560     if (!(status & IRQ_AUTODETECT))
 1561       continue;
 1562 
 1563     if (status & IRQ_INPROGRESS) {
 1564       if (!nr_irqs)
 1565         irq_found = i;
 1566       nr_irqs++;
 1567     }
 1568     irq_desc[i].status = status & ~IRQ_AUTODETECT;
 1569     irq_desc[i].handler->shutdown(i);
 1570   }
 1571   spin_unlock_irq(&irq_controller_lock);
 1572 
 1573   if (nr_irqs > 1)
 1574     irq_found = -irq_found;
 1575   return irq_found;
 1576 }
 1577 
 Комментарий
 1578 void init_ISA_irqs (void)
 1579 {
 1580   int i;
 1581 
 1582   for (i = 0; i < NR_IRQS; i++) {
 1583     irq_desc[i].status = IRQ_DISABLED;
 1584     irq_desc[i].action = 0;
 1585     irq_desc[i].depth = 0;
 1586 
 1587     if (i < 16) {
 1588       /* 16 old-style INTA-cycle interrupts: */
 1589       irq_desc[i].handler = &i8259A_irq_type;
 1590     } else {
 1591       /* 'high' PCI IRQs filled in on demand */
 1592       irq_desc[i].handler = &no_irq_type;
 1593     }
 1594   }
 1595 }
 1596 
 Комментарий
 1597 __initfunc(void init_IRQ(void))
 1598 {
 1599   int i;
 1600 
 1601 #ifndef CONFIG_X86_VISWS_APIC
 1602   init_ISA_irqs();
 1603 #else
 1604   init_VISWS_APIC_irqs();
 1605 #endif
 1606   /* Cover the whole vector space, no vector can escape
 1607    * us. (some of these will be overridden and become
 1608    * 'special' SMP interrupts) */
 1609   for (i = 0; i < NR_IRQS; i++) {
 1610     int vector = FIRST_EXTERNAL_VECTOR + i;
 1611     if (vector != SYSCALL_VECTOR)
 1612       set_intr_gate(vector, interrupt[i]);
 1613   }
 1614 
 1615 #ifdef __SMP__
 1616 
 1617   /* IRQ0 must be given a fixed assignment and
 1618    * initialized before init_IRQ_SMP.  */
 1619   set_intr_gate(IRQ0_TRAP_VECTOR, interrupt[0]);
 1620 
 1621   /* The reschedule interrupt is a CPU-to-CPU
 1622    * reschedule-helper IPI, driven by wakeup.  */
 1623   set_intr_gate(RESCHEDULE_VECTOR, reschedule_interrupt);
 1624 
 1625   /* IPI for invalidation */
 1626   set_intr_gate(INVALIDATE_TLB_VECTOR,
 1627                 invalidate_interrupt);
 1628 
 1629   /* IPI for CPU halt */
 1630   set_intr_gate(STOP_CPU_VECTOR, stop_cpu_interrupt);
 1631 
 1632   /* self generated IPI for local APIC timer */
 1633   set_intr_gate(LOCAL_TIMER_VECTOR,apic_timer_interrupt);
 1634 
 1635   /* IPI for MTRR control */
 1636   set_intr_gate(MTRR_CHANGE_VECTOR, mtrr_interrupt);
 1637 
 1638   /* IPI vector for APIC spurious interrupts */
 1639   set_intr_gate(SPURIOUS_APIC_VECTOR,spurious_interrupt);
 1640 #endif
 1641   request_region(0x20,0x20,"pic1");
 1642   request_region(0xa0,0x20,"pic2");
 1643 
 1644   /* Set the clock to 100 Hz, we already have a valid
 1645    * vector now: */
 1646   outb_p(0x34,0x43);  /* binary, mode 2, LSB/MSB, ch 0 */
 1647   outb_p(LATCH & 0xff , 0x40);    /* LSB */
 1648   outb(LATCH >> 8 , 0x40);        /* MSB */
 1649 
 1650 #ifndef CONFIG_VISWS
 1651   setup_x86_irq(2, &irq2);
 1652   setup_x86_irq(13, &irq13);
 1653 #endif
 1654 }
 1655 
 1656 #ifdef CONFIG_X86_IO_APIC
 1657 __initfunc(void init_IRQ_SMP(void))
 1658 {
 1659   int i;
 1660   for (i = 0; i < NR_IRQS ; i++)
 1661     if (IO_APIC_VECTOR(i) > 0)
 1662       set_intr_gate(IO_APIC_VECTOR(i), interrupt[i]);
 1663 }
 1664 #endif
 1665 

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz