Mike Dodd | 8cfa702 | 2010-11-17 11:12:26 -0800 | [diff] [blame^] | 1 | #ifndef __ASSEMBLY__ |
2 | #define __ASSEMBLY__ /* for some 2.2 kernel */ | ||||
3 | #endif | ||||
4 | #include <linux/sys.h> | ||||
5 | #include <linux/linkage.h> | ||||
6 | #include <asm/segment.h> | ||||
7 | #define ASSEMBLY | ||||
8 | #include <asm/smp.h> | ||||
9 | |||||
10 | #define SAVE_ALL \ | ||||
11 | cld; \ | ||||
12 | pushl %es; \ | ||||
13 | pushl %ds; \ | ||||
14 | pushl %eax; \ | ||||
15 | pushl %ebp; \ | ||||
16 | pushl %edi; \ | ||||
17 | pushl %esi; \ | ||||
18 | pushl %edx; \ | ||||
19 | pushl %ecx; \ | ||||
20 | pushl %ebx; \ | ||||
21 | movl $(__KERNEL_DS), %edx; \ | ||||
22 | movl %edx, %ds; \ | ||||
23 | movl %edx, %es; | ||||
24 | |||||
25 | #define RESTORE_ALL \ | ||||
26 | popl %ebx; \ | ||||
27 | popl %ecx; \ | ||||
28 | popl %edx; \ | ||||
29 | popl %esi; \ | ||||
30 | popl %edi; \ | ||||
31 | popl %ebp; \ | ||||
32 | popl %eax; \ | ||||
33 | 1: popl %ds; \ | ||||
34 | 2: popl %es; \ | ||||
35 | addl $4, %esp; \ | ||||
36 | 3: iret; \ | ||||
37 | .section .fixup,"ax"; \ | ||||
38 | 4: movl $0, (%esp); \ | ||||
39 | jmp 1b; \ | ||||
40 | 5: movl $0, (%esp); \ | ||||
41 | jmp 2b; \ | ||||
42 | 6: pushl %ss; \ | ||||
43 | popl %ds; \ | ||||
44 | pushl %ss; \ | ||||
45 | popl %es; \ | ||||
46 | pushl $11; \ | ||||
47 | call my_sys_exit;\ | ||||
48 | .previous; \ | ||||
49 | .section __ex_table,"a";\ | ||||
50 | .align 4; \ | ||||
51 | .long 1b, 4b; \ | ||||
52 | .long 2b, 5b; \ | ||||
53 | .long 3b, 6b; \ | ||||
54 | .previous | ||||
55 | |||||
56 | ENTRY(op_nmi) | ||||
57 | pushl %eax | ||||
58 | SAVE_ALL | ||||
59 | movl %esp, %edx | ||||
60 | pushl %edx | ||||
61 | call op_do_nmi | ||||
62 | addl $4, %esp | ||||
63 | RESTORE_ALL |