方便查看 linux/kernel/asm.s

  1 /*
  2  *  linux/kernel/asm.s
  3  *
  4  *  (C) 1991  Linus Torvalds
  5  */
  6 
  7 /*
  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
 15 .globl _double_fault,_coprocessor_segment_overrun
 16 .globl _invalid_TSS,_segment_not_present,_stack_segment
 17 .globl _general_protection,_coprocessor_error,_irq13,_reserved
 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 
 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
 95         jmp _coprocessor_error
 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 

 

posted @ 2013-08-16 03:18  caesarxu  阅读(364)  评论(0编辑  收藏  举报