diff --git a/cpu/x86/Makefile.x86_quarkX1000 b/cpu/x86/Makefile.x86_quarkX1000 index 01f206d66..b48b4a90f 100644 --- a/cpu/x86/Makefile.x86_quarkX1000 +++ b/cpu/x86/Makefile.x86_quarkX1000 @@ -1,5 +1,5 @@ include $(CONTIKI)/cpu/x86/Makefile.x86_common -CONTIKI_CPU_DIRS += drivers/legacy_pc +CONTIKI_CPU_DIRS += drivers/legacy_pc init/legacy_pc -CONTIKI_SOURCEFILES += rtc.c pit.c pic.c +CONTIKI_SOURCEFILES += rtc.c pit.c pic.c irq.c diff --git a/cpu/x86/init/common/cpu.c b/cpu/x86/init/common/cpu.c index 77e8f8026..a174853cc 100644 --- a/cpu/x86/init/common/cpu.c +++ b/cpu/x86/init/common/cpu.c @@ -32,9 +32,7 @@ #include "helpers.h" #include "idt.h" #include "interrupt.h" -#include "pic.h" - -#define IRQ7_INT PIC_INT(7) +#include "irq.h" static void double_fault_handler(struct interrupt_context context) @@ -42,20 +40,6 @@ double_fault_handler(struct interrupt_context context) halt(); } /*---------------------------------------------------------------------------*/ -static void -spurious_irq7_handler(void) -{ - /* - * NOTE: Originally IRQ7 was used for the parallel port interrupts. Nowadays, - * though, it is only used if some other IRQ (i.e.: a PCIx interrupt) is - * mapped to it. In this case we will have to check the PIC ISR register in - * order to confirm this was a real interrupt. - * - * In case of a spurious interrupt, we should NEVER send an EOI here so the PIC - * doesn't trigger the next queued interrupt. - */ -} -/*---------------------------------------------------------------------------*/ void cpu_init(void) { @@ -67,10 +51,5 @@ cpu_init(void) */ SET_INTERRUPT_HANDLER(8, 1, double_fault_handler); - pic_init(); - - /* Set a 'fake' handler for the Spurious IRQ7 interrupts. - * Refer to http://wiki.osdev.org/PIC . - */ - SET_INTERRUPT_HANDLER(IRQ7_INT, 0, spurious_irq7_handler); + irq_init(); } diff --git a/cpu/x86/init/common/irq.h b/cpu/x86/init/common/irq.h new file mode 100644 index 000000000..94af19b74 --- /dev/null +++ b/cpu/x86/init/common/irq.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2015, Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef IRQ_H +#define IRQ_H + +void irq_init(void); + +#endif /* IRQ_H */ diff --git a/cpu/x86/init/legacy_pc/irq.c b/cpu/x86/init/legacy_pc/irq.c new file mode 100644 index 000000000..04cfa1c13 --- /dev/null +++ b/cpu/x86/init/legacy_pc/irq.c @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2015, Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "drivers/legacy_pc/pic.h" +#include "interrupt.h" +#include "irq.h" + +#define IRQ7_INT PIC_INT(7) + +static void +spurious_irq7_handler(void) +{ + /* + * NOTE: Originally IRQ7 was used for the parallel port interrupts. Nowadays, + * though, it is only used if some other IRQ (i.e.: a PCIx interrupt) is + * mapped to it. In this case we will have to check the PIC ISR register in + * order to confirm this was a real interrupt. + * + * In case of a spurious interrupt, we should NEVER send an EOI here so the PIC + * doesn't trigger the next queued interrupt. + */ +} +/*---------------------------------------------------------------------------*/ +void +irq_init(void) +{ + pic_init(); + + /* Set a 'fake' handler for the Spurious IRQ7 interrupts. + * Refer to http://wiki.osdev.org/PIC . + */ + SET_INTERRUPT_HANDLER(IRQ7_INT, 0, spurious_irq7_handler); +}