x86: reorganizes IRQ/trap vectors (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 22 May 2014 20:07:07 +0000 (13:07 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 22 May 2014 20:10:23 +0000 (13:10 -0700)
LAPIC IRQs are now the highest priority interrupts on x86.  Bits 7:4 of the
vector define the priority class, and 3:0 are largely ignored.

Higher priority IRQs will interrupt lower priority ones, if CPU IRQs are
enabled.  For instance, a NIC IRQ handler that enables IRQs can be interrupted
by a local timer tick, which is useful for profiling.

You need to rebuild userspace apps.

Also note that while I changed the 32 bit code, we currently don't compile on
32 bit for a few minor reasons.

kern/arch/x86/ros/syscall.h
kern/arch/x86/smp_boot.c
kern/arch/x86/trap.h
kern/arch/x86/trapentry32.S
kern/arch/x86/trapentry64.S

index a22aa14..72eef4e 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef ROS_INC_ARCH_SYSCALL_H
 #define ROS_INC_ARCH_SYSCALL_H
 
-#define T_SYSCALL      64
+#define T_SYSCALL      48
 
 #ifndef ROS_KERNEL
 
index f08b997..2ef956b 100644 (file)
@@ -214,7 +214,7 @@ void smp_boot(void)
        /* Final core initialization */
        init_barrier(&generic_barrier, num_cpus);
        /* This will break the cores out of their hlt in smp_entry.S */
-       send_broadcast_ipi(254);
+       send_broadcast_ipi(I_POKE_CORE);
        smp_final_core_init();  /* need to init ourselves as well */
 }
 
index 945d795..a49c0fa 100644 (file)
 #define MaxIrqPIC                              15
 #define MaxIdtPIC                              (IdtPIC + MaxIrqPIC)
 
-/* 48-63 are LAPIC vectors */
-#define IdtLAPIC                               (IdtPIC + 16)
+/* T_SYSCALL is defined by the following include (48) */
+#include <ros/arch/syscall.h>
+
+/* 49-223 are IOAPIC routing vectors (from IOAPIC to LAPIC) */
+#define IdtIOAPIC                              (T_SYSCALL + 1)
+#define MaxIdtIOAPIC                   223
+
+/* 224-239 are OS IPI vectors (0xe0-0xef) */
+/* smp_call_function IPIs, keep in sync with NUM_HANDLER_WRAPPERS.
+ * SMP_CALL0 needs to be 16-aligned (we mask in x86/trap.c) */
+#define I_SMP_CALL0                            224
+#define I_SMP_CALL1                            (I_SMP_CALL0 + 1)
+#define I_SMP_CALL2                            (I_SMP_CALL0 + 2)
+#define I_SMP_CALL3                            (I_SMP_CALL0 + 3)
+#define I_SMP_CALL4                            (I_SMP_CALL0 + 4)
+#define I_SMP_CALL_LAST                        I_SMP_CALL4
+#define I_TESTING                              237     /* Testing IPI (used in testing.c) */
+#define I_POKE_CORE                            238
+#define I_KERNEL_MSG                   239
+
+/* 240-255 are LAPIC vectors (0xf0-0xff), hightest priority class */
+#define IdtLAPIC                               240
 #define IdtLAPIC_TIMER                 (IdtLAPIC + 0)
 #define IdtLAPIC_THERMAL               (IdtLAPIC + 1)
 #define IdtLAPIC_PCINT                 (IdtLAPIC + 2)
 #define IdtLAPIC_ERROR                 (IdtLAPIC + 5)
 /* 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). */
-#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>
+ * HyperTransport Transaction Control register.  On some intel machines, those
+ * bits are hardwired to 1s (SDM 3-10.9). */
+#define IdtLAPIC_SPURIOUS              (IdtLAPIC + 0xf) /* Aka 255, 0xff */
+#define MaxIdtLAPIC                            (IdtLAPIC + 0xf)
 
-/* 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
 
-
 #define T_DEFAULT   0x0000beef         // catchall
 
 /* Floating point constants */
 #define FP_CW_RC_MASK                  (3 << FP_CW_RC_SHIFT)
 #define FP_CW_IC                               (1 << 12)
 
-/* IPIs */
-/* Testing IPI (used in testing.c) */
-#define I_TESTING              230
-/* smp_call_function IPIs, keep in sync with NUM_HANDLER_WRAPPERS (and < 16)
- * it's important that this begins with 0xf0.  check i386/trap.c for details. */
-#define I_SMP_CALL0    0xf0 // 240
-#define I_SMP_CALL1    0xf1
-#define I_SMP_CALL2    0xf2
-#define I_SMP_CALL3    0xf3
-#define I_SMP_CALL4    0xf4
-#define I_SMP_CALL_LAST I_SMP_CALL4
-/* Direct/Hardwired IPIs.  Hardwired in trapentry.S */
-#define I_KERNEL_MSG   255
-
 #ifndef __ASSEMBLER__
 
 #ifndef ROS_KERN_TRAP_H
index fc1937e..7c6d4c0 100644 (file)
 .globl trap_tbl
 trap_tbl:
 
-/*
- * Generate entry points for the different traps.
- */
+/* Generate entry points for the different traps.  Note that all of these bounce
+ * off the corresponding trap.c function, such as handle_irqs, and that the name
+ * e.g. ISR_NMI is soley for the little stup that jumps to something like
+ * _alltraps.
+ *
+ * Technically, these HANDLER entries do not need to be in numeric order.
+ * trap.c will do a 'foreach (up to last-1), set the IDT for the number to point
+ * to the func' in the order in which they appear in the trap tbl, so the 'last
+ * one wins'. */
 TRAPHANDLER_NOEC(ISR_divide_error, T_DIVIDE)
 TRAPHANDLER_NOEC(ISR_debug_exceptions, T_DEBUG)
 TRAPHANDLER_NOEC(ISR_NMI, T_NMI)
@@ -144,6 +150,7 @@ TRAPHANDLER(ISR_alignment_check, T_ALIGN)
 TRAPHANDLER_NOEC(ISR_machine_check, T_MCHK)
 TRAPHANDLER_NOEC(ISR_simd_error, T_SIMDERR)
 /* 20 - 31 reserved */
+/* 32-47 are PIC/8259 IRQ vectors */
 IRQ_HANDLER(IRQ0, 32)
 IRQ_HANDLER(IRQ1, 33)
 IRQ_HANDLER(IRQ2, 34)
@@ -160,8 +167,8 @@ IRQ_HANDLER(IRQ12, 44)
 IRQ_HANDLER(IRQ13, 45)
 IRQ_HANDLER(IRQ14, 46)
 IRQ_HANDLER(IRQ15, 47)
-/* IOAPIC/MSI vectors */
-IRQ_HANDLER(IRQ16, 48)
+TRAPHANDLER_NOEC(ISR_syscall, T_SYSCALL)
+/* 49-223 are IOAPIC routing vectors (from IOAPIC to LAPIC) */
 IRQ_HANDLER(IRQ17, 49)
 IRQ_HANDLER(IRQ18, 50)
 IRQ_HANDLER(IRQ19, 51)
@@ -337,30 +344,29 @@ IRQ_HANDLER(IRQ188, 220)
 IRQ_HANDLER(IRQ189, 221)
 IRQ_HANDLER(IRQ190, 222)
 IRQ_HANDLER(IRQ191, 223)
-IRQ_HANDLER(IRQ192, 224)
-IRQ_HANDLER(IRQ193, 225)
-IRQ_HANDLER(IRQ194, 226)
-IRQ_HANDLER(IRQ195, 227)
-IRQ_HANDLER(IRQ196, 228)
+/* 224-239 are OS IPI vectors (0xe0-0xef) */
+IRQ_HANDLER(IRQ192, I_SMP_CALL0)
+IRQ_HANDLER(IRQ193, I_SMP_CALL1)
+IRQ_HANDLER(IRQ194, I_SMP_CALL2)
+IRQ_HANDLER(IRQ195, I_SMP_CALL3)
+IRQ_HANDLER(IRQ196, I_SMP_CALL4)
 IRQ_HANDLER(IRQ197, 229)
-
-/* 25 general purpose vectors, for use by the LAPIC.  Can expand later. */
-IRQ_HANDLER(IRQ198, I_TESTING) # used in testing.c
+IRQ_HANDLER(IRQ198, 230)
 IRQ_HANDLER(IRQ199, 231)
 IRQ_HANDLER(IRQ200, 232)
 IRQ_HANDLER(IRQ201, 233)
 IRQ_HANDLER(IRQ202, 234)
 IRQ_HANDLER(IRQ203, 235)
 IRQ_HANDLER(IRQ204, 236)
-IRQ_HANDLER(IRQ205, 237)
-IRQ_HANDLER(IRQ206, 238)
-IRQ_HANDLER(IRQ207, 239)
-/* 0xf0 - start of the SMP_CALL IPIS */
-IRQ_HANDLER(IRQ208, I_SMP_CALL0)
-IRQ_HANDLER(IRQ209, I_SMP_CALL1)
-IRQ_HANDLER(IRQ210, I_SMP_CALL2)
-IRQ_HANDLER(IRQ211, I_SMP_CALL3)
-IRQ_HANDLER(IRQ212, I_SMP_CALL4)
+IRQ_HANDLER(IRQ205, I_TESTING)
+POKE_HANDLER(IRQ206, I_POKE_CORE)
+IRQ_HANDLER(IRQ207, I_KERNEL_MSG)
+/* 240-255 are LAPIC vectors (0xf0-0xff), hightest priority class */
+IRQ_HANDLER(IRQ208, 240)
+IRQ_HANDLER(IRQ209, 241)
+IRQ_HANDLER(IRQ210, 242)
+IRQ_HANDLER(IRQ211, 243)
+IRQ_HANDLER(IRQ212, 244)
 IRQ_HANDLER(IRQ213, 245)
 IRQ_HANDLER(IRQ214, 246)
 IRQ_HANDLER(IRQ215, 247)
@@ -370,11 +376,8 @@ IRQ_HANDLER(IRQ218, 250)
 IRQ_HANDLER(IRQ219, 251)
 IRQ_HANDLER(IRQ220, 252)
 IRQ_HANDLER(IRQ221, 253)
-POKE_HANDLER(IRQ222, 254)
-IRQ_HANDLER(IRQ223, I_KERNEL_MSG)
-
-/* Technically, these HANDLER entries do not need to be in numeric order */
-TRAPHANDLER_NOEC(ISR_syscall, T_SYSCALL)
+IRQ_HANDLER(IRQ222, 254)
+IRQ_HANDLER(IRQ223, 255)
 /* But make sure default is last!! */
 TRAPHANDLER_NOEC(ISR_default, T_DEFAULT)
 
index 0e1b165..386cf17 100644 (file)
 .globl trap_tbl
 trap_tbl:
 
-/*
- * Generate entry points for the different traps.
- */
+/* Generate entry points for the different traps.  Note that all of these bounce
+ * off the corresponding trap.c function, such as handle_irqs, and that the name
+ * e.g. ISR_NMI is soley for the little stup that jumps to something like
+ * _alltraps.
+ *
+ * Technically, these HANDLER entries do not need to be in numeric order.
+ * trap.c will do a 'foreach (up to last-1), set the IDT for the number to point
+ * to the func' in the order in which they appear in the trap tbl, so the 'last
+ * one wins'. */
 TRAPHANDLER_NOEC(ISR_divide_error, T_DIVIDE)
 TRAPHANDLER_NOEC(ISR_debug_exceptions, T_DEBUG)
 TRAPHANDLER_NOEC(ISR_NMI, T_NMI)
@@ -106,6 +112,7 @@ TRAPHANDLER(ISR_alignment_check, T_ALIGN)
 TRAPHANDLER_NOEC(ISR_machine_check, T_MCHK)
 TRAPHANDLER_NOEC(ISR_simd_error, T_SIMDERR)
 /* 20 - 31 reserved */
+/* 32-47 are PIC/8259 IRQ vectors */
 IRQ_HANDLER(IRQ0, 32)
 IRQ_HANDLER(IRQ1, 33)
 IRQ_HANDLER(IRQ2, 34)
@@ -122,8 +129,8 @@ IRQ_HANDLER(IRQ12, 44)
 IRQ_HANDLER(IRQ13, 45)
 IRQ_HANDLER(IRQ14, 46)
 IRQ_HANDLER(IRQ15, 47)
-/* IOAPIC/MSI vectors */
-IRQ_HANDLER(IRQ16, 48)
+TRAPHANDLER_NOEC(ISR_syscall, T_SYSCALL)
+/* 49-223 are IOAPIC routing vectors (from IOAPIC to LAPIC) */
 IRQ_HANDLER(IRQ17, 49)
 IRQ_HANDLER(IRQ18, 50)
 IRQ_HANDLER(IRQ19, 51)
@@ -299,30 +306,29 @@ IRQ_HANDLER(IRQ188, 220)
 IRQ_HANDLER(IRQ189, 221)
 IRQ_HANDLER(IRQ190, 222)
 IRQ_HANDLER(IRQ191, 223)
-IRQ_HANDLER(IRQ192, 224)
-IRQ_HANDLER(IRQ193, 225)
-IRQ_HANDLER(IRQ194, 226)
-IRQ_HANDLER(IRQ195, 227)
-IRQ_HANDLER(IRQ196, 228)
+/* 224-239 are OS IPI vectors (0xe0-0xef) */
+IRQ_HANDLER(IRQ192, I_SMP_CALL0)
+IRQ_HANDLER(IRQ193, I_SMP_CALL1)
+IRQ_HANDLER(IRQ194, I_SMP_CALL2)
+IRQ_HANDLER(IRQ195, I_SMP_CALL3)
+IRQ_HANDLER(IRQ196, I_SMP_CALL4)
 IRQ_HANDLER(IRQ197, 229)
-
-/* 25 general purpose vectors, for use by the LAPIC.  Can expand later. */
-IRQ_HANDLER(IRQ198, I_TESTING) # used in testing.c
+IRQ_HANDLER(IRQ198, 230)
 IRQ_HANDLER(IRQ199, 231)
 IRQ_HANDLER(IRQ200, 232)
 IRQ_HANDLER(IRQ201, 233)
 IRQ_HANDLER(IRQ202, 234)
 IRQ_HANDLER(IRQ203, 235)
 IRQ_HANDLER(IRQ204, 236)
-IRQ_HANDLER(IRQ205, 237)
-IRQ_HANDLER(IRQ206, 238)
-IRQ_HANDLER(IRQ207, 239)
-/* 0xf0 - start of the SMP_CALL IPIS */
-IRQ_HANDLER(IRQ208, I_SMP_CALL0)
-IRQ_HANDLER(IRQ209, I_SMP_CALL1)
-IRQ_HANDLER(IRQ210, I_SMP_CALL2)
-IRQ_HANDLER(IRQ211, I_SMP_CALL3)
-IRQ_HANDLER(IRQ212, I_SMP_CALL4)
+IRQ_HANDLER(IRQ205, I_TESTING)
+POKE_HANDLER(IRQ206, I_POKE_CORE)
+IRQ_HANDLER(IRQ207, I_KERNEL_MSG)
+/* 240-255 are LAPIC vectors (0xf0-0xff), hightest priority class */
+IRQ_HANDLER(IRQ208, 240)
+IRQ_HANDLER(IRQ209, 241)
+IRQ_HANDLER(IRQ210, 242)
+IRQ_HANDLER(IRQ211, 243)
+IRQ_HANDLER(IRQ212, 244)
 IRQ_HANDLER(IRQ213, 245)
 IRQ_HANDLER(IRQ214, 246)
 IRQ_HANDLER(IRQ215, 247)
@@ -332,11 +338,8 @@ IRQ_HANDLER(IRQ218, 250)
 IRQ_HANDLER(IRQ219, 251)
 IRQ_HANDLER(IRQ220, 252)
 IRQ_HANDLER(IRQ221, 253)
-POKE_HANDLER(IRQ222, 254)
-IRQ_HANDLER(IRQ223, I_KERNEL_MSG)
-
-/* Technically, these HANDLER entries do not need to be in numeric order */
-TRAPHANDLER_NOEC(ISR_syscall, T_SYSCALL)
+IRQ_HANDLER(IRQ222, 254)
+IRQ_HANDLER(IRQ223, 255)
 /* But make sure default is last!! */
 TRAPHANDLER_NOEC(ISR_default, T_DEFAULT)