aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2010-01-04 19:16:06 -0500
committerH. Peter Anvin <hpa@zytor.com>2010-01-05 00:12:52 -0500
commit99d113b17e8ca5a8b68a9d3f7691e2f552dd6a06 (patch)
tree841583c66509f72cbae9cc3f12292195e95a949a /arch
parent9959c888a38b0f25b0e81a480f537d6489348442 (diff)
x86, apic: Reclaim IDT vectors 0x20-0x2f
Reclaim 16 IDT vectors and make them available for general allocation. Reclaim vectors 0x20-0x2f by reallocating the IRQ_MOVE_CLEANUP_VECTOR to vector 0x1f. This is in the range of vector numbers that is officially reserved for the CPU (for exceptions), however, the use of the APIC to generate any vector 0x10 or above is documented, and the CPU internally can receive any vector number (the legacy BIOS uses INT 0x08-0x0f for interrupts, as messed up as that is.) Since IRQ_MOVE_CLEANUP_VECTOR has to be alone in the lowest-numbered priority level (block of 16), this effectively enables us to reclaim an otherwise-unusable APIC priority level and put it to use. Since this is a transient kernel-only allocation we can change it at any time, and if/when there is an exception at vector 0x1f this assignment needs to be changed as part of OS enabling that new feature. Signed-off-by: Yinghai Lu <yinghai@kernel.org> LKML-Reference: <4B4284C6.9030107@kernel.org> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/include/asm/irq_vectors.h28
1 files changed, 20 insertions, 8 deletions
diff --git a/arch/x86/include/asm/irq_vectors.h b/arch/x86/include/asm/irq_vectors.h
index 3ab43df089cd..dbc81acb7e93 100644
--- a/arch/x86/include/asm/irq_vectors.h
+++ b/arch/x86/include/asm/irq_vectors.h
@@ -30,26 +30,38 @@
30/* 30/*
31 * IDT vectors usable for external interrupt sources start 31 * IDT vectors usable for external interrupt sources start
32 * at 0x20: 32 * at 0x20:
33 * hpa said we can start from 0x1f.
34 * 0x1f is documented as reserved. However, the ability for the APIC
35 * to generate vectors starting at 0x10 is documented, as is the
36 * ability for the CPU to receive any vector number as an interrupt.
37 * 0x1f is used for IRQ_MOVE_CLEANUP_VECTOR since that vector needs
38 * an entire privilege level (16 vectors) all by itself at a higher
39 * priority than any actual device vector. Thus, by placing it in the
40 * otherwise-unusable 0x10 privilege level, we avoid wasting a full
41 * 16-vector block.
33 */ 42 */
34#define FIRST_EXTERNAL_VECTOR 0x20 43#define FIRST_EXTERNAL_VECTOR 0x1f
35 44
45#define IA32_SYSCALL_VECTOR 0x80
36#ifdef CONFIG_X86_32 46#ifdef CONFIG_X86_32
37# define SYSCALL_VECTOR 0x80 47# define SYSCALL_VECTOR 0x80
38# define IA32_SYSCALL_VECTOR 0x80
39#else
40# define IA32_SYSCALL_VECTOR 0x80
41#endif 48#endif
42 49
43/* 50/*
44 * Reserve the lowest usable priority level 0x20 - 0x2f for triggering 51 * Reserve the lowest usable priority level 0x10 - 0x1f for triggering
45 * cleanup after irq migration. 52 * cleanup after irq migration.
53 * this overlaps with the reserved range for cpu exceptions so this
54 * will need to be changed to 0x20 - 0x2f if the last cpu exception is
55 * ever allocated.
46 */ 56 */
57
47#define IRQ_MOVE_CLEANUP_VECTOR FIRST_EXTERNAL_VECTOR 58#define IRQ_MOVE_CLEANUP_VECTOR FIRST_EXTERNAL_VECTOR
48 59
49/* 60/*
50 * Vectors 0x30-0x3f are used for ISA interrupts. 61 * Vectors 0x20-0x2f are used for ISA interrupts.
62 * round up to the next 16-vector boundary
51 */ 63 */
52#define IRQ0_VECTOR (FIRST_EXTERNAL_VECTOR + 0x10) 64#define IRQ0_VECTOR ((FIRST_EXTERNAL_VECTOR + 16) & ~15)
53 65
54#define IRQ1_VECTOR (IRQ0_VECTOR + 1) 66#define IRQ1_VECTOR (IRQ0_VECTOR + 1)
55#define IRQ2_VECTOR (IRQ0_VECTOR + 2) 67#define IRQ2_VECTOR (IRQ0_VECTOR + 2)
@@ -122,7 +134,7 @@
122 134
123/* 135/*
124 * First APIC vector available to drivers: (vectors 0x30-0xee) we 136 * First APIC vector available to drivers: (vectors 0x30-0xee) we
125 * start at 0x31(0x41) to spread out vectors evenly between priority 137 * start at 0x31 to spread out vectors evenly between priority
126 * levels. (0x80 is the syscall vector) 138 * levels. (0x80 is the syscall vector)
127 */ 139 */
128#define FIRST_DEVICE_VECTOR (IRQ15_VECTOR + 2) 140#define FIRST_DEVICE_VECTOR (IRQ15_VECTOR + 2)