summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa/intr_machdep.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/i386/isa/intr_machdep.c')
-rw-r--r--sys/i386/isa/intr_machdep.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/sys/i386/isa/intr_machdep.c b/sys/i386/isa/intr_machdep.c
index 503163f..48555d3 100644
--- a/sys/i386/isa/intr_machdep.c
+++ b/sys/i386/isa/intr_machdep.c
@@ -135,6 +135,7 @@ static driver_intr_t isa_strayintr;
static void ithds_init(void *dummy);
static void ithread_enable(int vector);
static void ithread_disable(int vector);
+static void init_i8259(void);
#ifdef PC98
#define NMI_PARITY 0x04
@@ -282,6 +283,22 @@ isa_nmi(cd)
}
/*
+ * ICU reinitialize when ICU configuration has lost.
+ */
+void icu_reinit()
+{
+ int i;
+ u_int32_t eflags;
+ eflags = read_eflags();
+ disable_intr();
+ init_i8259();
+ for(i=0;i<ICU_LEN;i++)
+ if(intr_handler[i] != isa_strayintr)
+ INTREN(1<<i);
+ write_eflags(eflags);
+}
+
+/*
* Create a default interrupt table to avoid problems caused by
* spurious interrupts during configuration of kernel, then setup
* interrupt control unit.
@@ -294,8 +311,16 @@ isa_defaultirq()
/* icu vectors */
for (i = 0; i < ICU_LEN; i++)
icu_unset(i, (driver_intr_t *)NULL);
+ init_i8259();
+}
+
+
+/*
+ *initialize 8259's
+ */
+static void init_i8259()
+{
- /* initialize 8259's */
#ifdef DEV_MCA
if (MCA_system)
outb(IO_ICU1, 0x19); /* reset; program device, four bytes */
OpenPOWER on IntegriCloud