|
|
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.1.4 ! root 18: .globl _alignment_check
1.1 root 19:
20: _divide_error:
21: pushl $_do_divide_error
22: no_error_code:
23: xchgl %eax,(%esp)
24: pushl %ebx
25: pushl %ecx
26: pushl %edx
27: pushl %edi
28: pushl %esi
29: pushl %ebp
30: push %ds
31: push %es
32: push %fs
33: pushl $0 # "error code"
34: lea 44(%esp),%edx
35: pushl %edx
36: movl $0x10,%edx
37: mov %dx,%ds
38: mov %dx,%es
39: mov %dx,%fs
40: call *%eax
41: addl $8,%esp
42: pop %fs
43: pop %es
44: pop %ds
45: popl %ebp
46: popl %esi
47: popl %edi
48: popl %edx
49: popl %ecx
50: popl %ebx
51: popl %eax
52: iret
53:
54: _debug:
55: pushl $_do_int3 # _do_debug
56: jmp no_error_code
57:
58: _nmi:
59: pushl $_do_nmi
60: jmp no_error_code
61:
62: _int3:
63: pushl $_do_int3
64: jmp no_error_code
65:
66: _overflow:
67: pushl $_do_overflow
68: jmp no_error_code
69:
70: _bounds:
71: pushl $_do_bounds
72: jmp no_error_code
73:
74: _invalid_op:
75: pushl $_do_invalid_op
76: jmp no_error_code
77:
78: _coprocessor_segment_overrun:
79: pushl $_do_coprocessor_segment_overrun
80: jmp no_error_code
81:
82: _reserved:
83: pushl $_do_reserved
84: jmp no_error_code
85:
1.1.1.2 root 86: _irq13:
87: pushl %eax
88: xorb %al,%al
89: outb %al,$0xF0
90: movb $0x20,%al
91: outb %al,$0x20
92: jmp 1f
93: 1: jmp 1f
94: 1: outb %al,$0xA0
95: popl %eax
1.1.1.3 root 96: jmp _coprocessor_error
1.1 root 97:
98: _double_fault:
99: pushl $_do_double_fault
100: error_code:
101: xchgl %eax,4(%esp) # error code <-> %eax
102: xchgl %ebx,(%esp) # &function <-> %ebx
103: pushl %ecx
104: pushl %edx
105: pushl %edi
106: pushl %esi
107: pushl %ebp
108: push %ds
109: push %es
110: push %fs
111: pushl %eax # error code
112: lea 44(%esp),%eax # offset
113: pushl %eax
114: movl $0x10,%eax
115: mov %ax,%ds
116: mov %ax,%es
117: mov %ax,%fs
118: call *%ebx
119: addl $8,%esp
120: pop %fs
121: pop %es
122: pop %ds
123: popl %ebp
124: popl %esi
125: popl %edi
126: popl %edx
127: popl %ecx
128: popl %ebx
129: popl %eax
130: iret
131:
132: _invalid_TSS:
133: pushl $_do_invalid_TSS
134: jmp error_code
135:
136: _segment_not_present:
137: pushl $_do_segment_not_present
138: jmp error_code
139:
140: _stack_segment:
141: pushl $_do_stack_segment
142: jmp error_code
143:
144: _general_protection:
145: pushl $_do_general_protection
146: jmp error_code
147:
1.1.1.4 ! root 148: _alignment_check:
! 149: pushl $_do_alignment_check
! 150: jmp error_code
! 151:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.