00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 .globl free_stacks_ptr
00024 .globl free_stacks
00025 .globl intr_body
00026
00027 .macro macro_push_context
00028
00029 pusha
00030 push %ds
00031 push %es
00032 push %fs
00033 push %gs
00034 .endm
00035
00036 .extern pr
00037 .macro macro_pop_context
00038
00039 pop %gs
00040 pop %fs
00041 pop %es
00042 pop %ds
00043 popa
00044 .endm
00045
00046 .macro macro_setup_segms
00047
00048 movw $0x10, %ax
00049 movw %ax, %ds
00050 movw %ax, %ss
00051 movw %ax, %es
00052 movw %ax, %fs
00053 movw %ax, %gs
00054 .endm
00055
00056 .extern pr
00057 .macro macro_stack_find
00058
00059
00060
00061 pushl %ebp
00062 movl %esp, %ebp
00063
00064
00065 movb $'?', (0xb809e)
00066 spin:
00067
00068 movl free_stacks_ptr, %eax
00069 cmpl $0, %eax
00070 jne continue
00071 movb $'!', (0xb809e)
00072
00073 sti
00074 mov $0x10000, %ecx
00075 spin_1:
00076 loop spin_1
00077 cli
00078 jmp spin
00079
00080
00081 continue:
00082 movb $' ', (0xb809e)
00083 decl free_stacks_ptr
00084 movl free_stacks_ptr, %ebx
00085 movl %ebx, %eax
00086 shll $2, %eax
00087 addl $free_stacks, %eax
00088
00089 movl (%eax), %ecx
00090 addl $exc_stack1, %ecx
00091 movl %ecx, %esp
00092
00093
00094 pushl (%eax)
00095 pushl %ebp
00096 .endm
00097
00098 .macro macro_stack_release
00099
00100
00101 add $4, %esp
00102
00103 popl %ebx
00104
00105 movl free_stacks_ptr, %eax
00106 incl free_stacks_ptr
00107 shll $2, %eax
00108 addl $free_stacks, %eax
00109 movl %ebx, (%eax)
00110
00111
00112 movl %ebp, %esp
00113 popl %ebp
00114 .endm
00115
00116 .macro intr code
00117
00118 .globl intr\code
00119 intr\code:
00120 pushl $0
00121 pushl $\code
00122 jmp intr_body
00123 .endm
00124
00125 .macro intr_err code
00126
00127 .globl intr\code
00128 intr\code:
00129 pushl $\code
00130 jmp intr_body
00131 .endm
00132
00133 temp_ebp_storage: .int 0
00134 intr_body:
00135 macro_push_context
00136 macro_setup_segms
00137 macro_stack_find
00138
00139 movl %cr0, %eax
00140 pushl %eax
00141 movl %cr2, %eax
00142 pushl %eax
00143 movl %cr3, %eax
00144 pushl %eax
00145
00146 movl %ebp, (temp_ebp_storage)
00147 movl $0, %ebp
00148
00149 pushl %esp
00150 call *exc
00151
00152 movl (temp_ebp_storage), %ebp
00153
00154 addl $0x10, %esp
00155
00156 macro_stack_release
00157 macro_pop_context
00158
00159 add $4, %esp
00160 add $4, %esp
00161
00162 iret
00163
00164
00165
00166
00167 intr 0x00
00168 intr 0x01
00169 intr 0x02
00170 intr 0x03
00171 intr 0x04
00172 intr 0x05
00173 intr 0x06
00174 intr 0x07
00175
00176 intr 0x09
00177 intr_err 0x0a
00178 intr_err 0x0b
00179
00180 intr_err 0x0d
00181 intr_err 0x0e
00182 intr_err 0x0f
00183 intr 0x10
00184 intr_err 0x11
00185 intr 0x12
00186 intr 0x13
00187 intr 0x14
00188 intr 0x15
00189 intr 0x16
00190 intr 0x17
00191 intr 0x18
00192 intr 0x19
00193 intr 0x1a
00194 intr 0x1b
00195 intr 0x1c
00196 intr 0x1d
00197 intr 0x1e
00198 intr 0x1f
00199
00200
00201 intr 0x20
00202 intr 0x21
00203 intr 0x22
00204 intr 0x23
00205 intr 0x24
00206 intr 0x25
00207 intr 0x26
00208 intr 0x27
00209 intr 0x28
00210 intr 0x29
00211 intr 0x2a
00212 intr 0x2b
00213 intr 0x2c
00214 intr 0x2d
00215 intr 0x2e
00216 intr 0x2f
00217
00218 .data
00219
00220 free_stacks:
00221 .int 0x4000
00222 .int 0x8000
00223 .int 0xc000
00224 .int 0x10000
00225
00226 free_stacks_ptr:
00227 .int 4
00228
00229
00230 .lcomm exc_stack1, 0x10000
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249