| #ifndef __ASSEMBLY__ |
| #define __ASSEMBLY__ /* for some 2.2 kernel */ |
| #endif |
| #include <linux/sys.h> |
| #include <linux/linkage.h> |
| #include <asm/segment.h> |
| #define ASSEMBLY |
| #include <asm/smp.h> |
| |
| #define SAVE_ALL \ |
| cld; \ |
| pushl %es; \ |
| pushl %ds; \ |
| pushl %eax; \ |
| pushl %ebp; \ |
| pushl %edi; \ |
| pushl %esi; \ |
| pushl %edx; \ |
| pushl %ecx; \ |
| pushl %ebx; \ |
| movl $(__KERNEL_DS), %edx; \ |
| movl %edx, %ds; \ |
| movl %edx, %es; |
| |
| #define RESTORE_ALL \ |
| popl %ebx; \ |
| popl %ecx; \ |
| popl %edx; \ |
| popl %esi; \ |
| popl %edi; \ |
| popl %ebp; \ |
| popl %eax; \ |
| 1: popl %ds; \ |
| 2: popl %es; \ |
| addl $4, %esp; \ |
| 3: iret; \ |
| .section .fixup,"ax"; \ |
| 4: movl $0, (%esp); \ |
| jmp 1b; \ |
| 5: movl $0, (%esp); \ |
| jmp 2b; \ |
| 6: pushl %ss; \ |
| popl %ds; \ |
| pushl %ss; \ |
| popl %es; \ |
| pushl $11; \ |
| call my_sys_exit;\ |
| .previous; \ |
| .section __ex_table,"a";\ |
| .align 4; \ |
| .long 1b, 4b; \ |
| .long 2b, 5b; \ |
| .long 3b, 6b; \ |
| .previous |
| |
| ENTRY(op_nmi) |
| pushl %eax |
| SAVE_ALL |
| movl %esp, %edx |
| pushl %edx |
| call op_do_nmi |
| addl $4, %esp |
| RESTORE_ALL |