#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