#include <hw/clock_subr.h>
#include <arch/x86/hypervisor.h>
+#include <arch/x86/var.h>
#include <bmk-core/core.h>
#include <bmk-core/platform.h>
/*
* Map i8254 interrupt vector and enable it in the PIC.
- * XXX: We don't really want to enable IRQ2 here, but ...
*/
x86_fillgate(32, cpu_isr_clock, 0);
- outb(PIC1_DATA, 0xff & ~(1<<2|1<<0));
+ pic1mask &= ~(1<<0);
+ outb(PIC1_DATA, pic1mask);
}
/*
*/
#include <hw/kernel.h>
+#include <arch/x86/var.h>
void x86_isr_9(void);
void x86_isr_10(void);
void x86_isr_14(void);
void x86_isr_15(void);
-int pic2mask = 0xff;
+uint8_t pic1mask, pic2mask;
int
cpu_intr_init(int intr)
{
- /* XXX: too lazy to keep PIC1 state */
- if (intr < 8)
+ if (intr > 15)
return BMK_EGENERIC;
#define FILLGATE(n) case n: x86_fillgate(32+n, x86_isr_##n, 0); break
#undef FILLGATE
/* unmask interrupt in PIC */
- pic2mask &= ~(1<<(intr-8));
- outb(PIC2_DATA, pic2mask);
+ if (intr < 8) {
+ pic1mask &= ~(1<<intr);
+ outb(PIC1_DATA, pic1mask);
+ } else {
+ pic2mask &= ~(1<<(intr-8));
+ outb(PIC2_DATA, pic2mask);
+ }
return 0;
}
*/
#include <hw/kernel.h>
+#include <arch/x86/var.h>
void
x86_initpic(void)
/*
* init pic1: cycle is write to cmd followed by 3 writes to data
*/
+ pic1mask = 0xff & ~(1<<2);
outb(PIC1_CMD, ICW1_INIT | ICW1_IC4);
outb(PIC1_DATA, 32); /* interrupts start from 32 in IDT */
outb(PIC1_DATA, 1<<2); /* slave is at IRQ2 */
outb(PIC1_DATA, ICW4_8086);
- outb(PIC1_DATA, 0xff & ~(1<<2)); /* unmask slave IRQ */
+ outb(PIC1_DATA, pic1mask);
/* do the slave PIC */
+ pic2mask = 0xff;
outb(PIC2_CMD, ICW1_INIT | ICW1_IC4);
outb(PIC2_DATA, 32+8); /* interrupts start from 40 in IDT */
outb(PIC2_DATA, 2); /* interrupt at irq 2 */
outb(PIC2_DATA, ICW4_8086);
- outb(PIC2_DATA, 0xff); /* all masked */
+ outb(PIC2_DATA, pic2mask);
}
/* interrupt-not-service-routine */
void x86_trap_17(void);
void x86_cpuid(uint32_t, uint32_t *, uint32_t *, uint32_t *, uint32_t *);
+
+extern uint8_t pic1mask, pic2mask;
#endif