x86: bus_irq_enable()
[akaros.git] / kern / arch / x86 / trap.h
index 76f8992..bf29eed 100644 (file)
@@ -1,12 +1,11 @@
 #ifndef ROS_KERN_ARCH_TRAP_H
 #define ROS_KERN_ARCH_TRAP_H
 
-#define MSR_IA32_SYSENTER_CS 0x174
-#define MSR_IA32_SYSENTER_ESP 0x175
-#define MSR_IA32_SYSENTER_EIP 0x176
+#include "msr-index.h"
 
-// Trap numbers
-// These are processor defined:
+#define NUM_IRQS                                       256
+
+/* 0-31 are hardware traps */
 #define T_DIVIDE     0         // divide error
 #define T_DEBUG      1         // debug exception
 #define T_NMI        2         // non-maskable interrupt
 #define T_MCHK      18         // machine check
 #define T_SIMDERR   19         // SIMD floating point error
 
-// These are arbitrarily chosen, but with care not to overlap
-// processor defined exceptions or interrupt vectors.
-
-// T_SYSCALL is defined by the following include:
+/* 32-47 are PIC/8259 IRQ vectors */
+#define IdtPIC                                 32
+#define IrqCLOCK                               0
+#define IrqKBD                                 1
+#define IrqUART1                               3
+#define IrqUART0                               4
+#define IrqPCMCIA                              5
+#define IrqFLOPPY                              6
+#define IrqLPT                                 7
+#define IrqAUX                                 12      /* PS/2 port */
+#define IrqIRQ13                               13      /* coprocessor on 386 */
+#define IrqATA0                                        14
+#define IrqATA1                                        15
+#define MaxIrqPIC                              15
+#define MaxIdtPIC                              (IdtPIC + MaxIrqPIC)
+
+/* 48-63 are LAPIC vectors */
+#define IdtLAPIC                               (IdtPIC + 16)
+#define IdtLAPIC_LINT0                 (IdtLAPIC + 0)
+#define IdtLAPIC_LINT1                 (IdtLAPIC + 1)
+#define IdtLAPIC_TIMER                 (IdtLAPIC + 2)
+#define IdtLAPIC_ERROR                 (IdtLAPIC + 3)
+#define IdtLAPIC_PCINT                 (IdtLAPIC + 4)
+/* Plan 9 apic note: the spurious vector number must have bits 3-0 0x0f
+ * unless the Extended Spurious Vector Enable bit is set in the
+ * HyperTransport Transaction Control register.  Plan 9 used 63 (0x3f), but
+ * 55 should have worked too (0x37). */
+#define IdtLAPIC_SPURIOUS              (IdtLAPIC + 15) /* Aka 63, 0x3f */
+#define MaxIdtLAPIC                            (IdtLAPIC + 15)
+
+/* T_SYSCALL is defined by the following include (64) */
 #include <ros/arch/syscall.h>
 
-#define T_DEFAULT   0x0000beef         // catchall
+/* 65-229 are IOAPIC routing vectors (from IOAPIC to LAPIC) */
+#define IdtIOAPIC                              (T_SYSCALL + 1)
+#define MaxIdtIOAPIC                   229
+/* 230-255 are OS IPI vectors */
+#define IdtMAX                                 255
 
-/* Page faults return the nature of the fault in the bits of the error code: */
-#define PF_ERROR_PRESENT               0x01
-#define PF_ERROR_WRITE                         0x02
-#define PF_ERROR_USER                  0x04
+
+#define T_DEFAULT   0x0000beef         // catchall
 
 /* Floating point constants */
 #define FP_EXCP_IE                             (1 << 0)        /* invalid op */
 #include <ros/common.h>
 #include <arch/mmu.h>
 #include <ros/trapframe.h>
+#include <arch/pci.h>
+#include <arch/pic.h>
+#include <arch/coreid.h>
+#include <arch/io.h>
+
+struct irq_handler {
+       struct irq_handler *next;
+       void (*isr)(struct hw_trapframe *hw_tf, void *data);
+       void *data;
+
+       /* all handlers in the chain need to have the same func pointers.  we only
+        * really use the first one, and the latter are to catch bugs.  also, we
+        * won't be doing a lot of IRQ line sharing */
+       bool (*check_spurious)(int);
+       void (*eoi)(int);
+       void (*mask)(int);
+       void (*unmask)(int);
+       /* TODO: add a helper to (re)route irqs? */
+
+       int tbdf;
+       int dev_irq;
+       int apic_vector;
+
+       char *type;
+       #define IRQ_NAME_LEN 26
+       char name[IRQ_NAME_LEN];
+};
+
+static bool idt_vec_is_pic(int vec)
+{
+       return (IdtPIC <= vec) && (vec <= MaxIdtPIC);
+}
+
+static bool idt_vec_is_lapic(int vec)
+{
+       return (IdtLAPIC <= vec) && (vec <= MaxIdtLAPIC);
+}
 
 /* The kernel's interrupt descriptor table */
 extern gatedesc_t idt[];
 extern pseudodesc_t idt_pd;
 extern taskstate_t ts;
+/* Mapping of irq -> PCI device (TODO: make this PCI-agnostic) */
+extern struct pci_device *irq_pci_map[NUM_IRQS];
+int bus_irq_enable(struct irq_handler *irq_h); /* ioapic.c */
 extern const char *x86_trapname(int trapno);
 extern void sysenter_handler(void);
 void backtrace_kframe(struct hw_trapframe *hw_tf);