|
|
1.1 root 1: /*
1.1.1.2 root 2: * linux/kernel/asm.s
3: *
4: * (C) 1991 Linus Torvalds
5: */
6:
7: /*
1.1 root 8: * asm.s contains the low-level code for most hardware faults.
9: * page_exception is handled by the mm, so that isn't here. This
10: * file also handles (hopefully) fpu-exceptions due to TS-bit, as
11: * the fpu must be properly saved/resored. This hasn't been tested.
12: */
13:
14: .globl _divide_error,_debug,_nmi,_int3,_overflow,_bounds,_invalid_op
1.1.1.3 ! root 15: .globl _double_fault,_coprocessor_segment_overrun
1.1 root 16: .globl _invalid_TSS,_segment_not_present,_stack_segment
1.1.1.2 root 17: .globl _general_protection,_coprocessor_error,_irq13,_reserved
1.1 root 18:
19: _divide_error:
20: pushl $_do_divide_error
21: no_error_code:
22: xchgl %eax,(%esp)
23: pushl %ebx
24: pushl %ecx
25: pushl %edx
26: pushl %edi
27: pushl %esi
28: pushl %ebp
29: push %ds
30: push %es
31: push %fs
32: pushl $0 # "error code"
33: lea 44(%esp),%edx
34: pushl %edx
35: movl $0x10,%edx
36: mov %dx,%ds
37: mov %dx,%es
38: mov %dx,%fs
39: call *%eax
40: addl $8,%esp
41: pop %fs
42: pop %es
43: pop %ds
44: popl %ebp
45: popl %esi
46: popl %edi
47: popl %edx
48: popl %ecx
49: popl %ebx
50: popl %eax
51: iret
52:
53: _debug:
54: pushl $_do_int3 # _do_debug
55: jmp no_error_code
56:
57: _nmi:
58: pushl $_do_nmi
59: jmp no_error_code
60:
61: _int3:
62: pushl $_do_int3
63: jmp no_error_code
64:
65: _overflow:
66: pushl $_do_overflow
67: jmp no_error_code
68:
69: _bounds:
70: pushl $_do_bounds
71: jmp no_error_code
72:
73: _invalid_op:
74: pushl $_do_invalid_op
75: jmp no_error_code
76:
77: _coprocessor_segment_overrun:
78: pushl $_do_coprocessor_segment_overrun
79: jmp no_error_code
80:
81: _reserved:
82: pushl $_do_reserved
83: jmp no_error_code
84:
1.1.1.2 root 85: _irq13:
86: pushl %eax
87: xorb %al,%al
88: outb %al,$0xF0
89: movb $0x20,%al
90: outb %al,$0x20
91: jmp 1f
92: 1: jmp 1f
93: 1: outb %al,$0xA0
94: popl %eax
1.1.1.3 ! root 95: jmp _coprocessor_error
1.1 root 96:
97: _double_fault:
98: pushl $_do_double_fault
99: error_code:
100: xchgl %eax,4(%esp) # error code <-> %eax
101: xchgl %ebx,(%esp) # &function <-> %ebx
102: pushl %ecx
103: pushl %edx
104: pushl %edi
105: pushl %esi
106: pushl %ebp
107: push %ds
108: push %es
109: push %fs
110: pushl %eax # error code
111: lea 44(%esp),%eax # offset
112: pushl %eax
113: movl $0x10,%eax
114: mov %ax,%ds
115: mov %ax,%es
116: mov %ax,%fs
117: call *%ebx
118: addl $8,%esp
119: pop %fs
120: pop %es
121: pop %ds
122: popl %ebp
123: popl %esi
124: popl %edi
125: popl %edx
126: popl %ecx
127: popl %ebx
128: popl %eax
129: iret
130:
131: _invalid_TSS:
132: pushl $_do_invalid_TSS
133: jmp error_code
134:
135: _segment_not_present:
136: pushl $_do_segment_not_present
137: jmp error_code
138:
139: _stack_segment:
140: pushl $_do_stack_segment
141: jmp error_code
142:
143: _general_protection:
144: pushl $_do_general_protection
145: jmp error_code
146:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.