diff options
| -rw-r--r-- | arch/x86/kernel/head_32.S | 7 | ||||
| -rw-r--r-- | arch/x86/kernel/head_64.S | 6 |
2 files changed, 11 insertions, 2 deletions
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S index 81ba27679f18..d2a21590794a 100644 --- a/arch/x86/kernel/head_32.S +++ b/arch/x86/kernel/head_32.S | |||
| @@ -544,6 +544,10 @@ ENDPROC(early_idt_handlers) | |||
| 544 | /* This is global to keep gas from relaxing the jumps */ | 544 | /* This is global to keep gas from relaxing the jumps */ |
| 545 | ENTRY(early_idt_handler) | 545 | ENTRY(early_idt_handler) |
| 546 | cld | 546 | cld |
| 547 | |||
| 548 | cmpl $X86_TRAP_NMI,(%esp) | ||
| 549 | je is_nmi # Ignore NMI | ||
| 550 | |||
| 547 | cmpl $2,%ss:early_recursion_flag | 551 | cmpl $2,%ss:early_recursion_flag |
| 548 | je hlt_loop | 552 | je hlt_loop |
| 549 | incl %ss:early_recursion_flag | 553 | incl %ss:early_recursion_flag |
| @@ -594,8 +598,9 @@ ex_entry: | |||
| 594 | pop %edx | 598 | pop %edx |
| 595 | pop %ecx | 599 | pop %ecx |
| 596 | pop %eax | 600 | pop %eax |
| 597 | addl $8,%esp /* drop vector number and error code */ | ||
| 598 | decl %ss:early_recursion_flag | 601 | decl %ss:early_recursion_flag |
| 602 | is_nmi: | ||
| 603 | addl $8,%esp /* drop vector number and error code */ | ||
| 599 | iret | 604 | iret |
| 600 | ENDPROC(early_idt_handler) | 605 | ENDPROC(early_idt_handler) |
| 601 | 606 | ||
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index e1aabdb314c8..33f36c78594e 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S | |||
| @@ -343,6 +343,9 @@ early_idt_handlers: | |||
| 343 | ENTRY(early_idt_handler) | 343 | ENTRY(early_idt_handler) |
| 344 | cld | 344 | cld |
| 345 | 345 | ||
| 346 | cmpl $X86_TRAP_NMI,(%rsp) | ||
| 347 | je is_nmi # Ignore NMI | ||
| 348 | |||
| 346 | cmpl $2,early_recursion_flag(%rip) | 349 | cmpl $2,early_recursion_flag(%rip) |
| 347 | jz 1f | 350 | jz 1f |
| 348 | incl early_recursion_flag(%rip) | 351 | incl early_recursion_flag(%rip) |
| @@ -405,8 +408,9 @@ ENTRY(early_idt_handler) | |||
| 405 | popq %rdx | 408 | popq %rdx |
| 406 | popq %rcx | 409 | popq %rcx |
| 407 | popq %rax | 410 | popq %rax |
| 408 | addq $16,%rsp # drop vector number and error code | ||
| 409 | decl early_recursion_flag(%rip) | 411 | decl early_recursion_flag(%rip) |
| 412 | is_nmi: | ||
| 413 | addq $16,%rsp # drop vector number and error code | ||
| 410 | INTERRUPT_RETURN | 414 | INTERRUPT_RETURN |
| 411 | ENDPROC(early_idt_handler) | 415 | ENDPROC(early_idt_handler) |
| 412 | 416 | ||
