|
@@ -478,21 +478,22 @@ is486:
|
|
|
__INIT
|
|
|
setup_once:
|
|
|
/*
|
|
|
- * Set up a idt with 256 entries pointing to ignore_int,
|
|
|
- * interrupt gates. It doesn't actually load idt - that needs
|
|
|
- * to be done on each CPU. Interrupts are enabled elsewhere,
|
|
|
- * when we can be relatively sure everything is ok.
|
|
|
+ * Set up a idt with 256 interrupt gates that push zero if there
|
|
|
+ * is no error code and then jump to early_idt_handler_common.
|
|
|
+ * It doesn't actually load the idt - that needs to be done on
|
|
|
+ * each CPU. Interrupts are enabled elsewhere, when we can be
|
|
|
+ * relatively sure everything is ok.
|
|
|
*/
|
|
|
|
|
|
movl $idt_table,%edi
|
|
|
- movl $early_idt_handlers,%eax
|
|
|
+ movl $early_idt_handler_array,%eax
|
|
|
movl $NUM_EXCEPTION_VECTORS,%ecx
|
|
|
1:
|
|
|
movl %eax,(%edi)
|
|
|
movl %eax,4(%edi)
|
|
|
/* interrupt gate, dpl=0, present */
|
|
|
movl $(0x8E000000 + __KERNEL_CS),2(%edi)
|
|
|
- addl $9,%eax
|
|
|
+ addl $EARLY_IDT_HANDLER_SIZE,%eax
|
|
|
addl $8,%edi
|
|
|
loop 1b
|
|
|
|
|
@@ -524,26 +525,28 @@ setup_once:
|
|
|
andl $0,setup_once_ref /* Once is enough, thanks */
|
|
|
ret
|
|
|
|
|
|
-ENTRY(early_idt_handlers)
|
|
|
+ENTRY(early_idt_handler_array)
|
|
|
# 36(%esp) %eflags
|
|
|
# 32(%esp) %cs
|
|
|
# 28(%esp) %eip
|
|
|
# 24(%rsp) error code
|
|
|
i = 0
|
|
|
.rept NUM_EXCEPTION_VECTORS
|
|
|
- .if (EXCEPTION_ERRCODE_MASK >> i) & 1
|
|
|
- ASM_NOP2
|
|
|
- .else
|
|
|
+ .ifeq (EXCEPTION_ERRCODE_MASK >> i) & 1
|
|
|
pushl $0 # Dummy error code, to make stack frame uniform
|
|
|
.endif
|
|
|
pushl $i # 20(%esp) Vector number
|
|
|
- jmp early_idt_handler
|
|
|
+ jmp early_idt_handler_common
|
|
|
i = i + 1
|
|
|
+ .fill early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc
|
|
|
.endr
|
|
|
-ENDPROC(early_idt_handlers)
|
|
|
+ENDPROC(early_idt_handler_array)
|
|
|
|
|
|
- /* This is global to keep gas from relaxing the jumps */
|
|
|
-ENTRY(early_idt_handler)
|
|
|
+early_idt_handler_common:
|
|
|
+ /*
|
|
|
+ * The stack is the hardware frame, an error code or zero, and the
|
|
|
+ * vector number.
|
|
|
+ */
|
|
|
cld
|
|
|
|
|
|
cmpl $2,(%esp) # X86_TRAP_NMI
|
|
@@ -603,7 +606,7 @@ ex_entry:
|
|
|
is_nmi:
|
|
|
addl $8,%esp /* drop vector number and error code */
|
|
|
iret
|
|
|
-ENDPROC(early_idt_handler)
|
|
|
+ENDPROC(early_idt_handler_common)
|
|
|
|
|
|
/* This is the default interrupt "handler" :-) */
|
|
|
ALIGN
|