diff --git a/cpu/x86/Makefile.x86 b/cpu/x86/Makefile.x86 index 94f1d0a03..af69e98f5 100644 --- a/cpu/x86/Makefile.x86 +++ b/cpu/x86/Makefile.x86 @@ -1,4 +1,4 @@ -CONTIKI_CPU_DIRS = . +CONTIKI_CPU_DIRS = . drivers CONTIKI_SOURCEFILES += mtarch.c gdt.c helpers.S idt.c cpu.c diff --git a/cpu/x86/cpu.c b/cpu/x86/cpu.c index d3e5fef84..b7b7a9e5b 100644 --- a/cpu/x86/cpu.c +++ b/cpu/x86/cpu.c @@ -29,9 +29,10 @@ */ #include "gdt.h" +#include "helpers.h" #include "idt.h" #include "interrupt.h" -#include "helpers.h" +#include "pic.h" static void double_fault_handler(struct interrupt_context context) @@ -49,4 +50,6 @@ cpu_init(void) * the system to triple fault, leaving no trace about what happened. */ SET_INTERRUPT_HANDLER(8, 1, double_fault_handler); + + pic_init(); } diff --git a/cpu/x86/drivers/pic.h b/cpu/x86/drivers/pic.h new file mode 100644 index 000000000..3f82a00ab --- /dev/null +++ b/cpu/x86/drivers/pic.h @@ -0,0 +1,70 @@ +/* + * 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 PIC_H +#define PIC_H + +#include "helpers.h" + +#define PIC1_CMD_PORT 0x20 +#define PIC1_DATA_PORT 0x21 +#define PIC2_CMD_PORT 0xA0 +#define PIC2_DATA_PORT 0xA1 + +/* This function initializes the daisy-chained Master and Slave 8259 PICs. + * It is only called once, so let's give the compiler the option to inline it. + * For more information about the ICWs, please refer to http://stanislavs.org/helppc/8259.html. + */ +static inline void +pic_init(void) +{ + /* ICW1: Initialization. */ + outb(PIC1_CMD_PORT, 0x11); + outb(PIC2_CMD_PORT, 0x11); + + /* ICW2: Remap IRQs by setting an IDT Offset for each PIC. */ + outb(PIC1_DATA_PORT, 0x20); + outb(PIC2_DATA_PORT, 0x28); + + /* ICW3: Setup Slave to Master's IRQ2. */ + outb(PIC1_DATA_PORT, 0x04); + outb(PIC2_DATA_PORT, 0x02); + + /* ICW4: Environment setup. Set PIC1 as master and PIC2 as slave. */ + outb(PIC1_DATA_PORT, 0x01); + outb(PIC2_DATA_PORT, 0x01); + + /* Set the IMR register, masking all hardware interrupts but IRQ 2. + * We will have to unmask each IRQ when registering them. */ + outb(PIC1_DATA_PORT, 0xfb); + outb(PIC2_DATA_PORT, 0xff); +} + +#endif /* PIC_H */ diff --git a/cpu/x86/helpers.S b/cpu/x86/helpers.S index 07e3c7655..694f4ef21 100644 --- a/cpu/x86/helpers.S +++ b/cpu/x86/helpers.S @@ -35,3 +35,10 @@ halt: cli die: hlt jmp die + +.global outb +outb: + mov 4(%esp), %dx + mov 8(%esp), %al + out %al, %dx + ret diff --git a/cpu/x86/helpers.h b/cpu/x86/helpers.h index 29476e690..4b76bae98 100644 --- a/cpu/x86/helpers.h +++ b/cpu/x86/helpers.h @@ -31,8 +31,16 @@ #ifndef HELPERS_H #define HELPERS_H +#include + #define BIT(n) (1UL << (n)) void halt(void) __attribute__((__noreturn__)); +/** + * Wrapper for the assembly 'out' instruction. + * + */ +void outb(uint16_t port, uint8_t byte); + #endif /* HELPERS_H */ diff --git a/platform/galileo/contiki-main.c b/platform/galileo/contiki-main.c index 30dd57b5a..8e0f4d6eb 100644 --- a/platform/galileo/contiki-main.c +++ b/platform/galileo/contiki-main.c @@ -30,12 +30,15 @@ #include "contiki.h" #include "cpu.h" +#include "interrupt.h" int main(void) { cpu_init(); + ENABLE_IRQ(); + process_init(); autostart_start(autostart_processes);