kernel/arch/i386/include/hw_intr.h
#ifndef __HW_INTR_X86_H__
#define __HW_INTR_X86_H__

#include "kernel/kernel.h"
void irq_8259_unmask(int irq);
void irq_8259_mask(int irq);
void irq_8259_eoi(int irq);
void irq_handle(int irq);
void i8259_disable(void);
void eoi_8259_master(void);
void eoi_8259_slave(void);

/* 
 * we don't use IO APIC if not configured for SMP as we cannot read any info
 * about it unless we use MPS which is not present on all single CPU
 * configurations. ACPI would be another option, however we don't support it
 * either
 */
#if defined(USE_APIC)
#include "arch/i386/apic.h"

#define hw_intr_mask(irq)	ioapic_mask_irq(irq)
#define hw_intr_unmask(irq)	ioapic_unmask_irq(irq)
#define hw_intr_ack(irq)	ioapic_eoi(irq)
#define hw_intr_used(irq)	do {					\
					if (ioapic_enabled)		\
						ioapic_set_irq(irq);	\
				} while (0)
#define hw_intr_not_used(irq)	do {					\
					if (ioapic_enabled)		\
						ioapic_unset_irq(irq);	\
				} while (0)
#define hw_intr_disable_all() do {					\
					ioapic_disable_all();		\
					ioapic_reset_pic();		\
					lapic_disable();		\
				} while (0)
#ifdef CONFIG_SMP
#define ipi_ack			apic_eoi
#endif

#else
/* legacy PIC */

#define hw_intr_mask(irq)	irq_8259_mask(irq)
#define hw_intr_unmask(irq)	irq_8259_unmask(irq)
#define hw_intr_ack(irq)	irq_8259_eoi(irq)
#define hw_intr_used(irq)
#define hw_intr_not_used(irq)
#define hw_intr_disable_all()

#endif

#endif /* __HW_INTR_X86_H__ */
