18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef __ASSEMBLY__
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define __ASSEMBLY__  /* for some 2.2 kernel */
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <linux/sys.h>
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <linux/linkage.h>
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <asm/segment.h>
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define ASSEMBLY
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <asm/smp.h>
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define SAVE_ALL \
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cld; \
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pushl %es; \
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pushl %ds; \
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pushl %eax; \
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pushl %ebp; \
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pushl %edi; \
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pushl %esi; \
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pushl %edx; \
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pushl %ecx; \
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pushl %ebx; \
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	movl $(__KERNEL_DS), %edx; \
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	movl %edx, %ds; \
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	movl %edx, %es;
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define RESTORE_ALL	\
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	popl %ebx;	\
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	popl %ecx;	\
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	popl %edx;	\
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	popl %esi;	\
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	popl %edi;	\
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	popl %ebp;	\
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	popl %eax;	\
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd1:	popl %ds;	\
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd2:	popl %es;	\
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	addl $4, %esp;	\
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd3:	iret;		\
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd.section .fixup,"ax";	\
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd4:	movl $0, (%esp);	\
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	jmp 1b;		\
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd5:	movl $0, (%esp);	\
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	jmp 2b;		\
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd6:	pushl %ss;	\
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	popl %ds;	\
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pushl %ss;	\
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	popl %es;	\
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pushl $11;	\
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	call my_sys_exit;\
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd.previous;		\
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd.section __ex_table,"a";\
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.align 4;	\
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.long 1b, 4b;	\
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.long 2b, 5b;	\
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.long 3b, 6b;	\
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd.previous
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddENTRY(op_nmi)
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pushl %eax
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SAVE_ALL
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	movl %esp, %edx
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pushl %edx
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	call op_do_nmi
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	addl $4, %esp
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	RESTORE_ALL
64