Rev 6 | Rev 9 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6 | Rev 8 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; MenuetOS process management, protected ring3 ;; |
3 | ;; MenuetOS process management, protected ring3 ;; |
4 | ;; ;; |
4 | ;; ;; |
5 | ;; Distributed under GPL. See file COPYING for details. ;; |
5 | ;; Distributed under GPL. See file COPYING for details. ;; |
6 | ;; Copyright 2003 Ville Turjanmaa ;; |
6 | ;; Copyright 2003 Ville Turjanmaa ;; |
7 | ;; ;; |
7 | ;; ;; |
8 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
8 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
9 | 9 | ||
10 | align 32 |
10 | align 32 |
11 | 11 | ||
12 | ; GDT TABLE |
12 | ; GDT TABLE |
13 | 13 | ||
14 | gdts: |
14 | gdts: |
15 | 15 | ||
16 | dw gdte-$-1 |
16 | dw gdte-$-1 |
17 | dd gdts |
17 | dd gdts |
18 | dw 0 |
18 | dw 0 |
19 | 19 | ||
20 | int_code_l: |
20 | int_code_l: |
21 | os_code_l: |
21 | os_code_l: |
22 | 22 | ||
23 | dw 0xffff |
23 | dw 0xffff |
24 | dw 0x0000 |
24 | dw 0x0000 |
25 | db 0x00 |
25 | db 0x00 |
26 | dw 11011111b *256 +10011010b |
26 | dw 11011111b *256 +10011010b |
27 | db 0x00 |
27 | db 0x00 |
28 | 28 | ||
29 | int_data_l: |
29 | int_data_l: |
30 | os_data_l: |
30 | os_data_l: |
31 | 31 | ||
32 | dw 0xffff |
32 | dw 0xffff |
33 | dw 0x0000 |
33 | dw 0x0000 |
34 | db 0x00 |
34 | db 0x00 |
35 | dw 11011111b *256 +10010010b |
35 | dw 11011111b *256 +10010010b |
36 | db 0x00 |
36 | db 0x00 |
37 | - | ||
38 | graph_data_l: |
- | |
39 | - | ||
40 | dw 0x3ff |
- | |
41 | dw 0x0000 |
- | |
42 | db 0x00 |
- | |
43 | dw 11010000b *256 +11110010b |
- | |
44 | db 0x00 |
- | |
45 | - | ||
46 | tss0_l: |
- | |
47 | times (max_processes+10) dd 0,0 |
- | |
48 | - | ||
49 | tss0i_l: |
- | |
50 | times 0x41 dq 0 ;(256+10) dd 0,0 |
- | |
51 | 37 | ||
52 | app_code_l: |
38 | app_code_l: |
53 | dw ((0x80000000-std_application_base_address) shr 12) and 0xffff |
39 | dw ((0x80000000-std_application_base_address) shr 12) and 0xffff |
54 | dw 0 |
40 | dw 0 |
55 | db 0 |
41 | db 0 |
56 | dw 11010000b*256+11111010b+256*((0x80000000-std_application_base_address) shr 28) |
42 | dw 11010000b*256+11111010b+256*((0x80000000-std_application_base_address) shr 28) |
57 | db std_application_base_address shr 24 |
43 | db std_application_base_address shr 24 |
58 | 44 | ||
59 | app_data_l: |
45 | app_data_l: |
60 | dw (0x80000000-std_application_base_address) shr 12 and 0xffff |
46 | dw (0x80000000-std_application_base_address) shr 12 and 0xffff |
61 | dw 0 |
47 | dw 0 |
62 | db 0 |
48 | db 0 |
63 | dw 11010000b*256+11110010b+256*((0x80000000-std_application_base_address) shr 28) |
49 | dw 11010000b*256+11110010b+256*((0x80000000-std_application_base_address) shr 28) |
64 | db std_application_base_address shr 24 |
50 | db std_application_base_address shr 24 |
- | 51 | ||
- | 52 | graph_data_l: |
|
- | 53 | ||
- | 54 | dw 0x3ff |
|
- | 55 | dw 0x0000 |
|
- | 56 | db 0x00 |
|
- | 57 | dw 11010000b *256 +11110010b |
|
- | 58 | db 0x00 |
|
- | 59 | ||
- | 60 | tss0_l: |
|
65 | 61 | times (max_processes+10) dd 0,0 |
|
66 | 62 | ||
67 | gdte: |
63 | gdte: |
68 | 64 | ||
69 | 65 | ||
70 | 66 | ||
71 | idtreg: |
67 | idtreg: |
72 | dw 8*0x41-1 |
68 | dw 8*0x41-1 |
73 | dd idts+8 |
69 | dd idts+8 |
74 | - | ||
75 | label idts at 0xB100-8 |
70 | label idts at 0xB100-8 |
76 | ;idte = idts + 8 + 0x60 |
- | |
77 | 71 | ||
78 | 72 | ||
- | 73 | ||
- | 74 | uglobal |
|
- | 75 | tss_sceleton: |
|
- | 76 | l.back dw 0,0 |
|
- | 77 | l.esp0 dd 0 |
|
- | 78 | l.ss0 dw 0,0 |
|
- | 79 | l.esp1 dd 0 |
|
- | 80 | l.ss1 dw 0,0 |
|
- | 81 | l.esp2 dd 0 |
|
- | 82 | l.ss2 dw 0,0 |
|
- | 83 | l.cr3 dd 0 |
|
- | 84 | l.eip dd 0 |
|
- | 85 | l.eflags dd 0 |
|
- | 86 | l.eax dd 0 |
|
- | 87 | l.ecx dd 0 |
|
- | 88 | l.edx dd 0 |
|
- | 89 | l.ebx dd 0 |
|
- | 90 | l.esp dd 0 |
|
- | 91 | l.ebp dd 0 |
|
- | 92 | l.esi dd 0 |
|
- | 93 | l.edi dd 0 |
|
- | 94 | l.es dw 0,0 |
|
- | 95 | l.cs dw 0,0 |
|
- | 96 | l.ss dw 0,0 |
|
- | 97 | l.ds dw 0,0 |
|
- | 98 | l.fs dw 0,0 |
|
- | 99 | l.gs dw 0,0 |
|
- | 100 | l.ldt dw 0,0 |
|
- | 101 | l.trap dw 0 |
|
- | 102 | l.io dw 0 |
|
- | 103 | endg |
|
- | 104 | ||
79 | 105 | ||
80 | build_process_gdt_tss_pointer: |
106 | build_process_gdt_tss_pointer: |
81 | 107 | ||
82 | mov ecx,tss_data |
108 | mov ecx,tss_data |
83 | mov edi,0 |
109 | mov edi,0 |
84 | setgdtl2: |
110 | setgdtl2: |
85 | mov [edi+gdts+ tss0 +0], word tss_step |
111 | mov [edi+gdts+ tss0 +0], word tss_step |
86 | mov [edi+gdts+ tss0 +2], cx |
112 | mov [edi+gdts+ tss0 +2], cx |
87 | mov eax,ecx |
113 | mov eax,ecx |
88 | shr eax,16 |
114 | shr eax,16 |
89 | mov [edi+gdts+ tss0 +4], al |
115 | mov [edi+gdts+ tss0 +4], al |
90 | mov [edi+gdts+ tss0 +7], ah |
116 | mov [edi+gdts+ tss0 +7], ah |
91 | mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b |
117 | mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b |
92 | add ecx,tss_step |
118 | add ecx,tss_step |
93 | add edi,8 |
119 | add edi,8 |
94 | cmp edi,8*(max_processes+5) |
120 | cmp edi,8*(max_processes+5) |
95 | jbe setgdtl2 |
121 | jbe setgdtl2 |
96 | 122 | ||
97 | ret |
123 | ret |
98 | 124 | ||
99 | 125 | ||
100 | build_interrupt_table: |
126 | build_interrupt_table: |
101 | - | ||
102 | mov [l.eflags],dword 0x11002 |
- | |
103 | mov [l.ss0], int_data |
- | |
104 | ;mov [l.ss1], ring1_data |
- | |
105 | ;mov [l.ss2], ring2_data |
- | |
106 | mov [l.esp0], 0x52000 |
- | |
107 | mov [l.esp1], 0x53000 |
- | |
108 | mov [l.esp2], 0x54000 |
- | |
109 | - | ||
110 | mov eax,cr3 |
- | |
111 | mov [l.cr3],eax |
- | |
112 | mov [l.cs],int_code |
- | |
113 | mov [l.ss],int_data |
- | |
114 | mov [l.ds],int_data |
- | |
115 | mov [l.es],int_data |
- | |
116 | mov [l.fs],int_data |
- | |
117 | mov [l.gs],int_data |
- | |
118 | - | ||
119 | mov eax,sys_int |
- | |
120 | mov [l.esp],0x720000 |
- | |
121 | mov edi,0x290000 |
- | |
122 | - | ||
123 | newint: |
- | |
124 | push edi |
- | |
125 | mov ebx,[eax] |
- | |
126 | mov [l.eip],ebx |
- | |
127 | mov esi,tss_sceleton |
- | |
128 | mov ecx,120/4 |
- | |
129 | cld |
- | |
130 | rep movsd |
- | |
131 | pop edi |
- | |
132 | - | ||
133 | add edi,128 |
- | |
134 | add [l.esp],1024 |
- | |
135 | add eax,4 |
- | |
136 | - | ||
137 | cmp eax,sys_int+4*0x40 ;0x60 |
- | |
138 | jbe newint ;jb |
- | |
139 | - | ||
140 | ;; |
- | |
141 | - | ||
142 | mov esi,boot_sched_3_2 |
- | |
143 | call boot_log |
- | |
144 | - | ||
145 | mov ecx,0x290000 |
- | |
146 | mov edi,0 |
- | |
147 | setgdtl2i: |
- | |
148 | mov [edi+gdts+ tss0i +0], word 128 |
- | |
149 | mov [edi+gdts+ tss0i +2], cx |
- | |
150 | mov eax,ecx |
- | |
151 | shr eax,16 |
- | |
152 | mov [edi+gdts+ tss0i +4], al |
- | |
153 | mov [edi+gdts+ tss0i +7], ah |
- | |
154 | mov [edi+gdts+ tss0i +5], word 01010000b *256 +11101001b |
- | |
155 | add ecx,128 |
- | |
156 | add edi,8 |
- | |
157 | cmp edi,8*0x40 ;0x60 |
- | |
158 | jbe setgdtl2i |
- | |
159 | - | ||
160 | ;; |
- | |
161 | - | ||
162 | mov esi,boot_sched_3_3 |
- | |
163 | call boot_log |
- | |
164 | - | ||
165 | mov edi,0 |
- | |
166 | mov edx,tss0i |
- | |
167 | @@: |
- | |
168 | mov [edi+idts+ 8 +0], word 0 |
- | |
169 | mov [edi+idts+ 8 +2], dx |
- | |
170 | mov [edi+idts+ 8 +4], word 10000101b*256 ; task gate DPL=0 |
- | |
171 | mov [edi+idts+ 8 +6], word 0 |
- | |
172 | add edx,8 |
- | |
173 | add edi,8 |
- | |
174 | - | ||
175 | cmp edi,8*0x40 |
- | |
176 | jb @b |
- | |
177 | - | ||
178 | ; Exceptions |
127 | |
179 | mov edi, idts+8 |
128 | mov edi, idts+8 |
180 | mov esi, sys_int |
129 | mov esi, sys_int |
181 | mov ecx, 32 |
130 | mov ecx, 0x40 |
182 | @@: |
131 | @@: |
183 | mov eax, [esi] |
132 | mov eax, [esi] |
184 | mov [edi], ax ; lower part of offset |
133 | mov [edi], ax ; lower part of offset |
185 | mov [edi+2], word os_code ; segment selector |
134 | mov [edi+2], word os_code ; segment selector |
186 | shr eax, 16 |
135 | shr eax, 16 |
187 | mov [edi+4], word 10001110b shl 8 ; interrupt descriptor |
136 | mov [edi+4], word 10001110b shl 8 ; interrupt descriptor |
188 | mov [edi+6], ax |
137 | mov [edi+6], ax |
189 | add esi, 4 |
138 | add esi, 4 |
190 | add edi, 8 |
139 | add edi, 8 |
191 | dec ecx |
140 | dec ecx |
192 | jnz @b |
141 | jnz @b |
193 | - | ||
194 | ret |
- | |
195 | - | ||
196 | build_syscall_interrupt_table: |
- | |
197 | - | ||
198 | ;mov dx,tss0sys |
142 | |
199 | mov edi,8*0x40+idts+8 |
143 | ;mov edi,8*0x40+idts+8 |
200 | mov [edi + 0], word (i40 and ((1 shl 16)-1)) |
144 | mov [edi + 0], word (i40 and ((1 shl 16)-1)) |
201 | mov [edi + 2], word os_code |
145 | mov [edi + 2], word os_code |
202 | mov [edi + 4], word 11101110b*256 |
146 | mov [edi + 4], word 11101110b*256 |
203 | mov [edi + 6], word (i40 shr 16) |
147 | mov [edi + 6], word (i40 shr 16) |
204 | 148 | ||
205 | ret |
149 | ret |
206 | 150 | ||
207 | 151 | ||
208 | 152 | ||
209 | iglobal |
153 | iglobal |
210 | sys_int: |
154 | sys_int: |
211 | dd s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,sa,sb,sc,sd,se,sf |
155 | dd e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15 |
212 | - | ||
213 | dd s10 ,s11 ; ,i_unknown12,i_unknown13 |
- | |
214 | ; dd i_unknown14,i_unknown15,i_unknown16,i_unknown17 |
156 | dd e16,e17 |
215 | ; dd i_unknown18,i_unknown19,i_unknown1a,i_unknown1b |
- | |
216 | ; dd i_unknown1c,i_unknown1d,i_unknown1e,i_unknown1f |
- | |
217 | times 14 dd unknown_interrupt |
157 | times 14 dd unknown_interrupt |
218 | 158 | ||
219 | dd irq0 ,irq1 ,p_irq2 ,p_irq3 ,p_irq4 ,p_irq5,p_irq6 ,p_irq7 |
159 | dd irq0 ,irq1 ,p_irq2 ,p_irq3 ,p_irq4 ,p_irq5,p_irq6 ,p_irq7 |
220 | dd p_irq8,p_irq9,p_irq10,p_irq11,p_irq12,irqD ,p_irq14,p_irq15 |
160 | dd p_irq8,p_irq9,p_irq10,p_irq11,p_irq12,irqD ,p_irq14,p_irq15 |
221 | - | ||
222 | ;dd i_unknown30,i_unknown31,i_unknown32,i_unknown33 |
- | |
223 | ;dd i_unknown34,i_unknown35,i_unknown36,i_unknown37 |
- | |
224 | ;dd i_unknown38,i_unknown39,i_unknown3a,i_unknown3b |
- | |
225 | ;dd i_unknown3c,i_unknown3d,i_unknown3e,i_unknown3f |
161 | |
226 | times 16 dd unknown_interrupt |
162 | times 16 dd unknown_interrupt |
227 | 163 | ||
228 | dd i40 |
164 | dd i40 |
229 | endg |
165 | endg |
230 | - | ||
231 | uglobal |
- | |
232 | tss_sceleton: |
- | |
233 | l.back dw 0,0 |
- | |
234 | l.esp0 dd 0 |
- | |
235 | l.ss0 dw 0,0 |
- | |
236 | l.esp1 dd 0 |
- | |
237 | l.ss1 dw 0,0 |
- | |
238 | l.esp2 dd 0 |
- | |
239 | l.ss2 dw 0,0 |
- | |
240 | l.cr3 dd 0 |
- | |
241 | l.eip dd 0 |
- | |
242 | l.eflags dd 0 |
- | |
243 | l.eax dd 0 |
- | |
244 | l.ecx dd 0 |
- | |
245 | l.edx dd 0 |
- | |
246 | l.ebx dd 0 |
- | |
247 | l.esp dd 0 |
- | |
248 | l.ebp dd 0 |
- | |
249 | l.esi dd 0 |
- | |
250 | l.edi dd 0 |
- | |
251 | l.es dw 0,0 |
- | |
252 | l.cs dw 0,0 |
- | |
253 | l.ss dw 0,0 |
- | |
254 | l.ds dw 0,0 |
- | |
255 | l.fs dw 0,0 |
- | |
256 | l.gs dw 0,0 |
- | |
257 | l.ldt dw 0,0 |
- | |
258 | l.trap dw 0 |
- | |
259 | l.io dw 0 |
- | |
260 | endg |
- | |
261 | - | ||
262 | s0: |
- | |
263 | mov ax, os_data |
- | |
264 | mov ds, ax |
- | |
265 | mov es, ax |
- | |
266 | - | ||
267 | mov [error_interrupt],0x0 |
- | |
268 | mov [error_interrupt_entry],dword s0 |
- | |
269 | - | ||
270 | call show_error_parameters |
- | |
271 | - | ||
272 | mov edx,[0x3010] |
- | |
273 | mov [edx+0xa],byte 4 |
- | |
274 | - | ||
275 | jmp change_task |
- | |
276 | - | ||
277 | - | ||
278 | s1: |
- | |
279 | mov ax, os_data |
- | |
280 | mov ds, ax |
- | |
281 | mov es, ax |
- | |
282 | - | ||
283 | mov [error_interrupt],0x1 |
- | |
284 | mov [error_interrupt_entry],dword s1 |
- | |
285 | - | ||
286 | call show_error_parameters |
- | |
287 | - | ||
288 | mov edx,[0x3010] |
- | |
289 | mov [edx+0xa],byte 4 |
- | |
290 | - | ||
291 | jmp change_task |
- | |
292 | - | ||
293 | s2: |
- | |
294 | mov ax, os_data |
- | |
295 | mov ds, ax |
- | |
296 | mov es, ax |
- | |
297 | - | ||
298 | mov [error_interrupt],0x2 |
- | |
299 | mov [error_interrupt_entry],dword s2 |
- | |
300 | - | ||
301 | call show_error_parameters |
- | |
302 | - | ||
303 | mov edx,[0x3010] |
- | |
304 | mov [edx+0xa],byte 4 |
- | |
305 | - | ||
306 | jmp change_task |
- | |
307 | - | ||
308 | s3: |
- | |
309 | mov ax, os_data |
- | |
310 | mov ds, ax |
- | |
311 | mov es, ax |
- | |
312 | - | ||
313 | mov [error_interrupt],0x3 |
166 | |
314 | mov [error_interrupt_entry],dword s3 |
- | |
315 | - | ||
316 | call show_error_parameters |
- | |
317 | - | ||
318 | mov edx,[0x3010] |
- | |
319 | mov [edx+0xa],byte 4 |
- | |
320 | - | ||
321 | jmp change_task |
- | |
322 | - | ||
323 | s4: |
- | |
324 | mov ax, os_data |
- | |
325 | mov ds, ax |
- | |
326 | mov es, ax |
- | |
327 | 167 | ; simply return control to interrupted process |
|
328 | mov [error_interrupt],0x4 |
- | |
329 | mov [error_interrupt_entry],dword s4 |
- | |
330 | - | ||
331 | call show_error_parameters |
- | |
332 | - | ||
333 | mov edx,[0x3010] |
- | |
334 | mov [edx+0xa],byte 4 |
- | |
335 | - | ||
336 | jmp change_task |
- | |
337 | - | ||
338 | s5: |
- | |
339 | mov ax, os_data |
- | |
340 | mov ds, ax |
168 | unknown_interrupt: |
341 | mov es, ax |
- | |
342 | - | ||
343 | mov [error_interrupt],0x5 |
- | |
344 | mov [error_interrupt_entry],dword s5 |
- | |
345 | - | ||
346 | call show_error_parameters |
- | |
347 | - | ||
348 | mov edx,[0x3010] |
- | |
- | 169 | iret |
|
- | 170 | ||
- | 171 | macro exceptions [num] |
|
- | 172 | { |
|
- | 173 | forward |
|
349 | mov [edx+0xa],byte 4 |
174 | e#num : |
- | 175 | mov bl, num |
|
- | 176 | jmp exc_c |
|
350 | 177 | } |
|
351 | jmp change_task |
178 | |
352 | 179 | exceptions 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 |
|
353 | s6: |
180 | exc_c: |
354 | mov ax, os_data |
181 | mov ax, os_data |
355 | mov ds, ax |
182 | mov ds, ax |
356 | mov es, ax |
183 | mov es, ax |
357 | 184 | ||
358 | mov [error_interrupt],0x6 |
185 | movzx eax, bl |
359 | mov [error_interrupt_entry],dword s6 |
- | |
360 | 186 | mov [error_interrupt], eax |
|
361 | call show_error_parameters |
187 | call show_error_parameters |
362 | 188 | ||
363 | mov edx,[0x3010] |
189 | mov edx, [0x3010] |
364 | mov [edx+0xa],byte 4 |
190 | mov [edx + 0xA], byte 4 |
365 | 191 | ||
366 | jmp change_task |
192 | jmp change_task |
367 | 193 | ||
368 | 194 | ||
369 | ;;;;;;;;;;;;;;;;;;;;;;; |
195 | ;;;;;;;;;;;;;;;;;;;;;;; |
370 | ;; FPU ERROR HANDLER ;; |
196 | ;; FPU ERROR HANDLER ;; |
371 | ;;;;;;;;;;;;;;;;;;;;;;; |
197 | ;;;;;;;;;;;;;;;;;;;;;;; |
372 | 198 | ||
373 | align 4 |
199 | align 4 |
374 | s7: |
200 | e7: |
375 | clts |
201 | clts |
376 | 202 | ||
377 | push eax |
203 | push eax |
378 | push ds es |
204 | push ds es |
379 | 205 | ||
380 | mov ax, os_data |
206 | mov ax, os_data |
381 | mov ds, ax |
207 | mov ds, ax |
382 | mov es, ax |
208 | mov es, ax |
383 | 209 | ||
384 | mov eax, [prev_user_of_fpu] |
210 | mov eax, [prev_user_of_fpu] |
385 | shl eax, 8 |
211 | shl eax, 8 |
386 | add eax, 0x80000 + 0x10 |
212 | add eax, 0x80000 + 0x10 |
387 | fsave [eax] |
213 | fsave [eax] |
388 | 214 | ||
389 | mov eax, [0x3000] |
215 | mov eax, [0x3000] |
390 | mov [prev_user_of_fpu], eax |
216 | mov [prev_user_of_fpu], eax |
391 | shl eax, 8 |
217 | shl eax, 8 |
392 | add eax, 0x80000 |
218 | add eax, 0x80000 |
393 | cmp [eax + 0x7f], byte 0 |
219 | cmp [eax + 0x7f], byte 0 |
394 | je @f |
220 | je @f |
395 | frstor [eax+0x10] |
221 | frstor [eax+0x10] |
396 | @@: |
222 | @@: |
397 | mov [eax + 0x7f], byte 1 |
223 | mov [eax + 0x7f], byte 1 |
398 | 224 | ||
399 | pop es ds |
225 | pop es ds |
400 | pop eax |
226 | pop eax |
401 | 227 | ||
402 | iret |
228 | iret |
403 | 229 | ||
404 | iglobal |
230 | iglobal |
405 | prev_user_of_fpu dd 1 |
231 | prev_user_of_fpu dd 1 |
406 | endg |
232 | endg |
407 | 233 | ||
408 | - | ||
409 | s8: |
- | |
410 | add esp, 4 ; zero on the stack! |
- | |
411 | mov ax, os_data |
- | |
412 | mov ds, ax |
- | |
413 | mov es, ax |
- | |
414 | - | ||
415 | mov [error_interrupt],0x8 |
- | |
416 | mov [error_interrupt_entry],dword s8 |
- | |
417 | - | ||
418 | call show_error_parameters |
- | |
419 | - | ||
420 | mov edx,[0x3010] |
- | |
421 | mov [edx+0xa],byte 4 |
- | |
422 | - | ||
423 | jmp change_task |
- | |
424 | - | ||
425 | s9: |
- | |
426 | mov ax, os_data |
- | |
427 | mov ds, ax |
- | |
428 | mov es, ax |
- | |
429 | - | ||
430 | mov [error_interrupt],0x9 |
- | |
431 | mov [error_interrupt_entry],dword s9 |
- | |
432 | - | ||
433 | call show_error_parameters |
- | |
434 | - | ||
435 | mov edx,[0x3010] |
- | |
436 | mov [edx+0xa],byte 4 |
- | |
437 | - | ||
438 | jmp change_task |
- | |
439 | - | ||
440 | ; Invalid TSS |
- | |
441 | sa: |
- | |
442 | add esp, 4 ; error code |
- | |
443 | mov ax, os_data |
- | |
444 | mov ds, ax |
- | |
445 | mov es, ax |
- | |
446 | - | ||
447 | mov [error_interrupt],0xa |
- | |
448 | mov [error_interrupt_entry],dword sa |
- | |
449 | - | ||
450 | call show_error_parameters |
- | |
451 | - | ||
452 | mov edx,[0x3010] |
- | |
453 | mov [edx+0xa],byte 4 |
- | |
454 | - | ||
455 | jmp change_task |
- | |
456 | - | ||
457 | ; Segment not present |
- | |
458 | sb: |
- | |
459 | add esp, 4 |
- | |
460 | mov ax, os_data |
- | |
461 | mov ds, ax |
- | |
462 | mov es, ax |
- | |
463 | - | ||
464 | mov [error_interrupt],0xb |
- | |
465 | mov [error_interrupt_entry],dword sb |
- | |
466 | - | ||
467 | call show_error_parameters |
- | |
468 | - | ||
469 | mov edx,[0x3010] |
- | |
470 | mov [edx+0xa],byte 4 |
- | |
471 | - | ||
472 | jmp change_task |
- | |
473 | - | ||
474 | ; Stack fault exception |
- | |
475 | sc: |
- | |
476 | add esp, 4 |
- | |
477 | mov ax, os_data |
- | |
478 | mov ds, ax |
- | |
479 | mov es, ax |
- | |
480 | - | ||
481 | mov [error_interrupt],0xc |
- | |
482 | mov [error_interrupt_entry],dword sc |
- | |
483 | - | ||
484 | call show_error_parameters |
- | |
485 | - | ||
486 | mov edx,[0x3010] |
- | |
487 | mov [edx+0xa],byte 4 |
- | |
488 | - | ||
489 | jmp change_task |
- | |
490 | - | ||
491 | ; General Protection Fault |
- | |
492 | sd: |
- | |
493 | add esp, 4 |
- | |
494 | mov ax, os_data |
- | |
495 | mov ds, ax |
- | |
496 | mov es, ax |
- | |
497 | - | ||
498 | mov [error_interrupt],0xd |
- | |
499 | mov [error_interrupt_entry],dword sd |
- | |
500 | - | ||
501 | call show_error_parameters |
- | |
502 | - | ||
503 | mov edx,[0x3010] |
- | |
504 | mov [edx+0xa],byte 4 |
- | |
505 | - | ||
506 | jmp change_task |
- | |
507 | - | ||
508 | ; Page-Fault Exception |
- | |
509 | se: |
- | |
510 | add esp, 4 |
- | |
511 | mov ax, os_data |
- | |
512 | mov ds, ax |
- | |
513 | mov es, ax |
- | |
514 | - | ||
515 | mov [error_interrupt],0xe |
- | |
516 | mov [error_interrupt_entry],dword se |
- | |
517 | - | ||
518 | call show_error_parameters |
- | |
519 | - | ||
520 | mov edx,[0x3010] |
- | |
521 | mov [edx+0xa],byte 4 |
- | |
522 | - | ||
523 | jmp change_task |
- | |
524 | - | ||
525 | ; ?? |
- | |
526 | sf: |
- | |
527 | mov ax, os_data |
- | |
528 | mov ds, ax |
- | |
529 | mov es, ax |
- | |
530 | - | ||
531 | mov [error_interrupt],0xf |
- | |
532 | mov [error_interrupt_entry],dword sf |
- | |
533 | - | ||
534 | call show_error_parameters |
- | |
535 | - | ||
536 | mov edx,[0x3010] |
- | |
537 | mov [edx+0xa],byte 4 |
- | |
538 | - | ||
539 | jmp change_task |
- | |
540 | - | ||
541 | ; x87 FPU Floating-Point Error |
- | |
542 | s10: |
- | |
543 | mov ax, os_data |
- | |
544 | mov ds, ax |
- | |
545 | mov es, ax |
- | |
546 | - | ||
547 | mov [error_interrupt],0x10 |
- | |
548 | mov [error_interrupt_entry],dword s10 |
- | |
549 | - | ||
550 | call show_error_parameters |
- | |
551 | - | ||
552 | mov edx,[0x3010] |
- | |
553 | mov [edx+0xa],byte 4 |
- | |
554 | - | ||
555 | jmp change_task |
- | |
556 | - | ||
557 | ; Alignment Check Exception |
- | |
558 | s11: |
- | |
559 | add esp, 4 |
- | |
560 | mov ax, os_data |
- | |
561 | mov ds, ax |
- | |
562 | mov es, ax |
- | |
563 | - | ||
564 | mov [error_interrupt],0x11 |
- | |
565 | mov [error_interrupt_entry],dword s11 |
- | |
566 | - | ||
567 | call show_error_parameters |
- | |
568 | - | ||
569 | mov edx,[0x3010] |
- | |
570 | mov [edx+0xa],byte 4 |
- | |
571 | - | ||
572 | jmp change_task |
- | |
573 | 234 | ||
574 | 235 | ||
575 | 236 | ||
576 | 237 | ||
577 | writehex: |
238 | writehex: |
578 | - | ||
579 | pusha |
239 | pusha |
580 | - | ||
581 | mov ecx,eax |
240 | |
582 | mov ax,word [printerrorat] |
- | |
583 | shl eax,16 |
- | |
584 | mov ax,[esp+32+4] |
- | |
585 | sub ax,60 |
- | |
586 | mov edx,1 |
241 | mov edi, [write_error_to] |
587 | mov esi,8 |
- | |
588 | mov ebx,0xffffff |
242 | mov esi, 8 |
589 | whl1: |
243 | @@: |
590 | push ecx |
244 | mov ecx, eax |
591 | and ecx,0xf |
- | |
592 | add ecx,hexletters |
- | |
593 | mov edi,1 |
245 | and ecx, 0xf |
594 | - | ||
595 | mov cl,[ecx] |
246 | |
596 | mov edi,[write_error_to] |
247 | mov cl,[ecx+hexletters] |
597 | mov [edi],cl |
- | |
598 | dec [write_error_to] |
248 | mov [edi],cl |
599 | - | ||
600 | pop ecx |
249 | dec edi |
601 | shr ecx,4 |
250 | |
602 | sub eax,6*65536 |
251 | shr eax,4 |
603 | dec esi |
252 | dec esi |
604 | jnz whl1 |
253 | jnz @b |
605 | 254 | ||
606 | popa |
255 | popa |
607 | ret |
256 | ret |
608 | 257 | ||
609 | iglobal |
258 | iglobal |
610 | hexletters db '0123456789ABCDEF' |
259 | hexletters db '0123456789ABCDEF' |
611 | 260 | ||
612 | error_interrupt dd -1 |
261 | error_interrupt dd -1 |
613 | error_interrupt_entry dd -1 |
- | |
614 | - | ||
615 | printerrorat dd 300 |
- | |
616 | 262 | ||
617 | process_error db 'K : Process - forced terminate INT: 00000000',13,10,0 |
263 | process_error db 'K : Process - forced terminate INT: 00000000',13,10,0 |
618 | process_pid db 'K : Process - forced terminate PID: 00000000',13,10,0 |
264 | process_pid db 'K : Process - forced terminate PID: 00000000',13,10,0 |
619 | process_eip db 'K : Process - forced terminate EIP: 00000000',13,10,0 |
265 | process_eip db 'K : Process - forced terminate EIP: 00000000',13,10,0 |
620 | system_error db 'K : Kernel error',13,10,0 |
266 | system_error db 'K : Kernel error',13,10,0 |
621 | endg |
267 | endg |
622 | 268 | ||
623 | uglobal |
269 | uglobal |
624 | write_error_to dd 0x0 |
270 | write_error_to dd 0x0 |
625 | endg |
271 | endg |
626 | 272 | ||
627 | show_error_parameters: |
273 | show_error_parameters: |
628 | 274 | ||
629 | mov [write_error_to],process_pid+43 |
275 | mov [write_error_to],process_pid+43 |
630 | mov eax,[0x3000] |
276 | mov eax,[0x3000] |
631 | shl eax, 5 |
277 | shl eax, 5 |
632 | mov eax,[0x3000+4+eax] |
278 | mov eax,[0x3000+4+eax] |
633 | call writehex |
279 | call writehex |
634 | 280 | ||
635 | mov [write_error_to],process_error+43 |
281 | mov [write_error_to],process_error+43 |
636 | mov eax,[error_interrupt] |
282 | mov eax,[error_interrupt] |
637 | call writehex |
283 | call writehex |
638 | 284 | ||
639 | mov eax,[0x3000] |
285 | mov eax,[0x3000] |
640 | shl eax,8 |
286 | shl eax,8 |
641 | cmp [0x80000+eax+0xB0],dword 0 |
287 | cmp [0x80000+eax+0xB0],byte 0 |
642 | jnz .system_error |
288 | jnz .system_error |
643 | 289 | ||
644 | mov eax,[0x3000] |
290 | mov eax,[0x3000] |
645 | imul eax,tss_step |
291 | imul eax,tss_step |
646 | mov eax,[eax+tss_data+l.eip-tss_sceleton] |
292 | mov eax,[eax+tss_data+l.eip-tss_sceleton] |
647 | .out_eip: |
293 | .out_eip: |
648 | mov [write_error_to],process_eip+43 |
294 | mov [write_error_to],process_eip+43 |
649 | call writehex |
295 | call writehex |
650 | 296 | ||
651 | mov esi,process_error |
297 | mov esi,process_error |
652 | call sys_msg_board_str |
298 | call sys_msg_board_str |
653 | 299 | ||
654 | mov esi,process_pid |
300 | mov esi,process_pid |
655 | call sys_msg_board_str |
301 | call sys_msg_board_str |
656 | 302 | ||
657 | mov esi,process_eip |
303 | mov esi,process_eip |
658 | call sys_msg_board_str |
304 | call sys_msg_board_str |
659 | 305 | ||
660 | ret |
306 | ret |
661 | 307 | ||
662 | .system_error: |
308 | .system_error: |
663 | mov esi,system_error |
309 | mov esi,system_error |
664 | call sys_msg_board_str |
310 | call sys_msg_board_str |
665 | mov eax,[0x3000] |
311 | mov eax,[0x3000] |
666 | shl eax,7 |
312 | shl eax,7 |
667 | mov eax,[eax+0x298000+l.eip-tss_sceleton] |
313 | mov eax,[eax+0x298000+l.eip-tss_sceleton] |
668 | jmp .out_eip |
314 | jmp .out_eip |
669 | 315 | ||
670 | 316 | ||
671 | 317 | ||
672 | 318 | ||
673 | ; irq1 -> hid/keyboard.inc |
319 | ; irq1 -> hid/keyboard.inc |
674 | - | ||
- | 320 | ||
- | 321 | ||
- | 322 | macro irqhh [num] |
|
- | 323 | { |
|
- | 324 | forward |
|
- | 325 | p_irq#num : |
|
675 | p_irq2: |
326 | pushad |
- | 327 | mov edi, num |
|
676 | 328 | jmp irq_c |
|
677 | call restore_caller |
- | |
678 | - | ||
679 | mov edi,2 ; 1 |
- | |
680 | call irqhandler ; 2/5 |
- | |
681 | - | ||
682 | call return_to_caller |
- | |
683 | - | ||
684 | jmp p_irq2 |
- | |
685 | - | ||
686 | p_irq3: |
- | |
687 | - | ||
688 | call restore_caller |
- | |
689 | - | ||
690 | mov edi,3 |
- | |
691 | call irqhandler |
- | |
692 | - | ||
693 | call return_to_caller |
- | |
694 | - | ||
695 | jmp p_irq3 |
- | |
696 | - | ||
697 | p_irq4: |
- | |
698 | - | ||
699 | call restore_caller |
- | |
700 | - | ||
701 | mov edi,4 |
- | |
702 | call irqhandler |
- | |
703 | - | ||
704 | call return_to_caller |
- | |
705 | - | ||
706 | jmp p_irq4 |
- | |
707 | - | ||
708 | p_irq5: |
- | |
709 | - | ||
710 | call restore_caller |
- | |
711 | - | ||
712 | mov edi,5 |
- | |
713 | call irqhandler |
- | |
714 | - | ||
715 | call return_to_caller |
- | |
716 | - | ||
717 | jmp p_irq5 |
- | |
718 | - | ||
719 | p_irq6: |
- | |
720 | - | ||
721 | call restore_caller |
- | |
722 | - | ||
723 | call fdc_irq |
- | |
724 | - | ||
725 | mov edi,6 |
- | |
726 | call irqhandler |
- | |
727 | - | ||
728 | call return_to_caller |
- | |
729 | - | ||
730 | jmp p_irq6 |
- | |
731 | - | ||
732 | p_irq7: |
- | |
733 | - | ||
734 | call restore_caller |
- | |
735 | - | ||
736 | mov edi,7 |
- | |
737 | call irqhandler |
- | |
738 | - | ||
739 | call return_to_caller |
329 | } |
740 | - | ||
741 | jmp p_irq7 |
- | |
742 | - | ||
743 | p_irq8: |
330 | |
744 | - | ||
745 | call restore_caller |
- | |
746 | - | ||
747 | mov edi,8 |
- | |
748 | call irqhandler |
- | |
749 | - | ||
750 | call return_to_caller |
- | |
751 | - | ||
752 | jmp p_irq8 |
- | |
753 | - | ||
754 | p_irq9: |
331 | irqhh 2,3,4,5,6,7,8,9,10,11,12,14,15 |
755 | - | ||
756 | call restore_caller |
- | |
757 | - | ||
758 | mov edi,9 |
- | |
759 | call irqhandler |
- | |
760 | - | ||
761 | call return_to_caller |
- | |
762 | - | ||
763 | jmp p_irq9 |
- | |
764 | - | ||
765 | p_irq10: |
332 | |
766 | - | ||
767 | call restore_caller |
- | |
768 | - | ||
769 | mov edi,10 |
- | |
770 | call irqhandler |
- | |
771 | - | ||
772 | call return_to_caller |
- | |
773 | - | ||
774 | jmp p_irq10 |
- | |
775 | - | ||
776 | p_irq11: |
333 | irq_c: |
777 | - | ||
778 | call restore_caller |
- | |
779 | - | ||
780 | mov edi,11 |
- | |
781 | call irqhandler |
- | |
782 | - | ||
783 | call return_to_caller |
- | |
784 | - | ||
785 | jmp p_irq11 |
- | |
786 | - | ||
787 | p_irq12: |
- | |
788 | 334 | push ds es |
|
789 | call restore_caller |
- | |
790 | 335 | mov ax, os_data |
|
791 | mov edi,12 |
336 | mov ds, ax |
792 | call irqhandler |
337 | mov es, ax |
793 | 338 | call irqhandler |
|
- | 339 | pop es ds |
|
- | 340 | popad |
|
794 | call return_to_caller |
341 | iret |
- | 342 | ||
- | 343 | irqD: |
|
795 | 344 | pushad |
|
796 | jmp p_irq12 |
345 | push ds es |
797 | 346 | mov ax, os_data |
|
798 | irqD: |
347 | mov ds, ax |
799 | call restore_caller |
348 | mov es, ax |
800 | 349 | ||
801 | mov dx,0xf0 |
350 | mov dx,0xf0 |
802 | mov al,0 |
351 | mov al,0 |
803 | out dx,al |
352 | out dx,al |
804 | 353 | ||
805 | mov dx,0xa0 |
354 | mov dx,0xa0 |
806 | mov al,0x20 |
355 | mov al,0x20 |
807 | out dx,al |
356 | out dx,al |
808 | mov dx,0x20 |
357 | mov dx,0x20 |
809 | out dx,al |
358 | out dx,al |
810 | - | ||
811 | call return_to_caller |
- | |
812 | - | ||
813 | jmp irqD |
- | |
814 | - | ||
815 | - | ||
816 | p_irq14: |
- | |
817 | - | ||
818 | call restore_caller |
- | |
819 | 359 | ||
820 | mov edi,14 |
- | |
821 | call irqhandler |
- | |
822 | - | ||
823 | call return_to_caller |
- | |
824 | - | ||
825 | jmp p_irq14 |
- | |
826 | - | ||
827 | p_irq15: |
- | |
828 | - | ||
829 | call restore_caller |
- | |
830 | 360 | pop es ds |
|
831 | mov edi,15 |
- | |
832 | call irqhandler |
- | |
833 | - | ||
834 | call return_to_caller |
- | |
835 | - | ||
836 | jmp p_irq15 |
- | |
837 | - | ||
838 | - | ||
839 | - | ||
840 | align 4 |
- | |
841 | restore_caller: |
- | |
842 | - | ||
843 | mov edi,[0x3000] |
- | |
844 | shl edi, 3 |
- | |
845 | mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b |
- | |
846 | 361 | popad |
|
847 | ret |
- | |
848 | - | ||
849 | align 4 |
- | |
850 | return_to_caller: |
- | |
851 | - | ||
852 | mov ebx,[0x3000] |
- | |
853 | shl bx,3 |
- | |
854 | add bx,tss0;t |
- | |
855 | mov [tss_irq12],bx |
- | |
856 | - | ||
857 | db 0xea |
- | |
858 | dd 0 |
- | |
859 | tss_irq12 dw tss0;t |
362 | iret |
860 | 363 | ||
861 | ret |
364 | |
862 | 365 | ||
863 | uglobal |
366 | uglobal |
864 | irqh dd 0x0 |
367 | irqh dd 0x0 |
865 | endg |
368 | endg |
866 | 369 | ||
867 | irqhandler: |
370 | irqhandler: |
868 | 371 | ||
869 | push edi |
372 | push edi |
870 | 373 | ||
871 | mov esi,edi ; 1 |
374 | mov esi,edi ; 1 |
872 | shl esi,6 ; 1 |
375 | shl esi,6 ; 1 |
873 | add esi,irq00read ; 1 |
376 | add esi,irq00read ; 1 |
874 | shl edi,12 ; 1 |
377 | shl edi,12 ; 1 |
875 | add edi,0x2E0000 |
378 | add edi,0x2E0000 |
876 | 379 | ||
877 | mov [check_idle_semaphore],5 |
380 | mov [check_idle_semaphore],5 |
878 | 381 | ||
879 | irqnewread: |
382 | irqnewread: |
880 | 383 | ||
881 | mov dx,[esi] ; 2+ |
384 | mov dx,[esi] ; 2+ |
882 | 385 | ||
883 | cmp dx,0 ; 1 |
386 | cmp dx,0 ; 1 |
884 | jz irqover |
387 | jz irqover |
885 | cmp [esi+3],byte 1 ; 2 ; byte read |
388 | cmp [esi+3],byte 1 ; 2 ; byte read |
886 | jne noirqbyte ; 4-11 |
389 | jne noirqbyte ; 4-11 |
887 | 390 | ||
888 | in al,dx |
391 | in al,dx |
889 | 392 | ||
890 | mov edx,[edi] |
393 | mov edx,[edi] |
891 | cmp edx,4000 |
394 | cmp edx,4000 |
892 | je irqfull |
395 | je irqfull |
893 | mov ebx,edi |
396 | mov ebx,edi |
894 | add ebx,0x10 |
397 | add ebx,0x10 |
895 | add ebx,edx |
398 | add ebx,edx |
896 | mov [ebx],al |
399 | mov [ebx],al |
897 | inc edx |
400 | inc edx |
898 | mov [edi],edx |
401 | mov [edi],edx |
899 | 402 | ||
900 | add esi,4 |
403 | add esi,4 |
901 | jmp irqnewread |
404 | jmp irqnewread |
902 | 405 | ||
903 | noirqbyte: |
406 | noirqbyte: |
904 | 407 | ||
905 | 408 | ||
906 | cmp [esi+3],byte 2 ; word read |
409 | cmp [esi+3],byte 2 ; word read |
907 | jne noirqword |
410 | jne noirqword |
908 | 411 | ||
909 | in ax,dx |
412 | in ax,dx |
910 | 413 | ||
911 | mov edx,[edi] |
414 | mov edx,[edi] |
912 | cmp edx,4000 |
415 | cmp edx,4000 |
913 | je irqfull |
416 | je irqfull |
914 | mov ebx,edi |
417 | mov ebx,edi |
915 | add ebx,0x10 |
418 | add ebx,0x10 |
916 | add ebx,edx |
419 | add ebx,edx |
917 | mov [ebx],ax |
420 | mov [ebx],ax |
918 | add edx,2 |
421 | add edx,2 |
919 | mov [edi],edx |
422 | mov [edi],edx |
920 | add esi,4 |
423 | add esi,4 |
921 | jmp irqnewread |
424 | jmp irqnewread |
922 | 425 | ||
923 | noirqword: |
426 | noirqword: |
924 | irqfull: |
427 | irqfull: |
925 | irqover: |
428 | irqover: |
926 | 429 | ||
927 | mov al,0x20 ; ready for next irq |
430 | mov al,0x20 ; ready for next irq |
928 | out 0x20,al |
431 | out 0x20,al |
929 | 432 | ||
930 | pop ebx |
433 | pop ebx |
931 | cmp ebx,7 |
434 | cmp ebx,7 |
932 | jbe noa0 |
435 | jbe noa0 |
933 | out 0xa0,al |
436 | out 0xa0,al |
934 | noa0: |
437 | noa0: |
935 | 438 | ||
936 | ret |
439 | ret |
937 | 440 | ||
938 | - | ||
939 | ; simply return control to interrupted process |
- | |
940 | unknown_interrupt: |
- | |
941 | iret |
- | |
942 | - | ||
943 | - | ||
944 | 441 | ||
945 | 442 | ||
946 | set_application_table_status: |
443 | set_application_table_status: |
947 | push eax |
444 | push eax |
948 | 445 | ||
949 | mov eax,[0x3000] |
446 | mov eax,[0x3000] |
950 | ;imul eax,32 |
- | |
951 | shl eax, 5 |
447 | shl eax, 5 |
952 | add eax,0x3000+4 |
448 | add eax,0x3000+4 |
953 | mov eax,[eax] |
449 | mov eax,[eax] |
954 | 450 | ||
955 | mov [application_table_status],eax |
451 | mov [application_table_status],eax |
956 | 452 | ||
957 | pop eax |
453 | pop eax |
958 | 454 | ||
959 | ret |
455 | ret |
960 | 456 | ||
961 | 457 | ||
962 | clear_application_table_status: |
458 | clear_application_table_status: |
963 | push eax |
459 | push eax |
964 | 460 | ||
965 | mov eax,[0x3000] |
461 | mov eax,[0x3000] |
966 | ;imul eax,32 |
- | |
967 | shl eax, 5 |
462 | shl eax, 5 |
968 | add eax,0x3000+4 |
463 | add eax,0x3000+4 |
969 | mov eax,[eax] |
464 | mov eax,[eax] |
970 | 465 | ||
971 | cmp eax,[application_table_status] |
466 | cmp eax,[application_table_status] |
972 | jne apptsl1 |
467 | jne apptsl1 |
973 | mov [application_table_status],0 |
468 | mov [application_table_status],0 |
974 | apptsl1: |
469 | apptsl1: |
975 | 470 | ||
976 | pop eax |
471 | pop eax |
977 | 472 | ||
978 | ret |
473 | ret |
979 | 474 | ||
980 | 475 | ||
981 | 476 | ||
982 | sys_resize_app_memory: |
477 | sys_resize_app_memory: |
983 | ; eax = 1 - resize |
478 | ; eax = 1 - resize |
984 | ; ebx = new amount of memory |
479 | ; ebx = new amount of memory |
985 | 480 | ||
986 | cmp eax,1 |
481 | cmp eax,1 |
987 | jne .no_application_mem_resize |
482 | jne .no_application_mem_resize |
988 | 483 | ||
989 | jmp new_mem_resize ;resize for new type of processes |
484 | jmp new_mem_resize ;resize for new type of processes |
990 | 485 | ||
991 | 486 | ||
992 | .no_application_mem_resize: |
487 | .no_application_mem_resize: |
993 | 488 | ||
994 | ret |
489 | ret |
995 | 490 | ||
996 | 491 | ||
997 | 492 | ||
998 | get_app_params: |
493 | get_app_params: |
999 | 494 | ||
1000 | push eax |
495 | push eax |
1001 | 496 | ||
1002 | cmp [0x90000+6],word '00' |
497 | cmp [0x90000+6],word '00' |
1003 | jne no_00_header |
498 | jne no_00_header |
1004 | 499 | ||
1005 | mov eax,[0x90000+12] |
500 | mov eax,[0x90000+12] |
1006 | mov [app_start],eax |
501 | mov [app_start],eax |
1007 | mov eax,[0x90000+16] |
502 | mov eax,[0x90000+16] |
1008 | mov [app_i_end],eax |
503 | mov [app_i_end],eax |
1009 | mov eax,[0x90000+20] |
504 | mov eax,[0x90000+20] |
1010 | mov [app_mem],eax |
505 | mov [app_mem],eax |
1011 | shr eax,1 |
506 | shr eax,1 |
1012 | sub eax,0x10 |
507 | sub eax,0x10 |
1013 | mov [app_esp],eax |
508 | mov [app_esp],eax |
1014 | mov eax,[0x90000+24] |
509 | mov eax,[0x90000+24] |
1015 | mov [app_i_param],eax |
510 | mov [app_i_param],eax |
1016 | mov [app_i_icon],dword 0 |
511 | mov [app_i_icon],dword 0 |
1017 | 512 | ||
1018 | pop eax |
513 | pop eax |
1019 | mov esi,1 |
514 | mov esi,1 |
1020 | ret |
515 | ret |
1021 | 516 | ||
1022 | no_00_header: |
517 | no_00_header: |
1023 | 518 | ||
1024 | 519 | ||
1025 | cmp [0x90000+6],word '01' |
520 | cmp [0x90000+6],word '01' |
1026 | jne no_01_header |
521 | jne no_01_header |
1027 | 522 | ||
1028 | mov eax,[0x90000+12] |
523 | mov eax,[0x90000+12] |
1029 | mov [app_start],eax |
524 | mov [app_start],eax |
1030 | mov eax,[0x90000+16] |
525 | mov eax,[0x90000+16] |
1031 | mov [app_i_end],eax |
526 | mov [app_i_end],eax |
1032 | mov eax,[0x90000+20] |
527 | mov eax,[0x90000+20] |
1033 | mov [app_mem],eax |
528 | mov [app_mem],eax |
1034 | mov eax,[0x90000+24] |
529 | mov eax,[0x90000+24] |
1035 | mov [app_esp],eax |
530 | mov [app_esp],eax |
1036 | mov eax,[0x90000+28] |
531 | mov eax,[0x90000+28] |
1037 | mov [app_i_param],eax |
532 | mov [app_i_param],eax |
1038 | mov eax,[0x90000+32] |
533 | mov eax,[0x90000+32] |
1039 | mov [app_i_icon],eax |
534 | mov [app_i_icon],eax |
1040 | 535 | ||
1041 | pop eax |
536 | pop eax |
1042 | mov esi,1 |
537 | mov esi,1 |
1043 | ret |
538 | ret |
1044 | 539 | ||
1045 | no_01_header: |
540 | no_01_header: |
1046 | 541 | ||
1047 | pop eax |
542 | pop eax |
1048 | mov esi,0 |
543 | mov esi,0 |
1049 | ret |
544 | ret |
1050 | 545 | ||
1051 | 546 | ||
1052 | start_application_fl: |
547 | start_application_fl: |
1053 | jmp new_start_application_fl |
548 | jmp new_start_application_fl |
1054 | 549 | ||
1055 | ;************************************************************************ |
550 | ;************************************************************************ |
1056 | 551 | ||
1057 | start_application_floppy: |
552 | start_application_floppy: |
1058 | jmp new_start_application_floppy |
553 | jmp new_start_application_floppy |
1059 | 554 | ||
1060 | ;******************************************************************** |
555 | ;******************************************************************** |
1061 | 556 | ||
1062 | start_application_hd: |
557 | start_application_hd: |
1063 | jmp new_start_application_hd |
558 | jmp new_start_application_hd |
1064 | 559 | ||
1065 | uglobal |
560 | uglobal |
1066 | new_process_place dd 0x0 |
561 | new_process_place dd 0x0 |
1067 | app_start dd 0x0 |
562 | app_start dd 0x0 |
1068 | app_i_end dd 0x0 |
563 | app_i_end dd 0x0 |
1069 | app_mem dd 0x0 |
564 | app_mem dd 0x0 |
1070 | app_esp dd 0x0 |
565 | app_esp dd 0x0 |
1071 | app_i_param dd 0x0 |
566 | app_i_param dd 0x0 |
1072 | app_i_icon dd 0x0 |
567 | app_i_icon dd 0x0 |
1073 | app_mem_pos dd 0x0 |
568 | app_mem_pos dd 0x0 |
1074 | appl_path dd 0x0 |
569 | appl_path dd 0x0 |
1075 | appl_path_size dd 0x0 |
570 | appl_path_size dd 0x0 |
1076 | endg |
571 | endg |
1077 | 572 | ||
1078 | iglobal |
573 | iglobal |
1079 | hd_app_string db 'HDAPP ' |
574 | hd_app_string db 'HDAPP ' |
1080 | process_loading db 'K : Process - loading ',13,10,0 |
575 | process_loading db 'K : Process - loading ',13,10,0 |
1081 | process_running db 'K : Process - done',13,10,0 |
576 | process_running db 'K : Process - done',13,10,0 |
1082 | first_gdt_search dd 0x2 |
577 | first_gdt_search dd 0x2 |
1083 | endg |
578 | endg |
1084 | 579 | ||
1085 | 580 | ||
1086 | sys_threads: |
581 | sys_threads: |
1087 | 582 | ||
1088 | ; eax=1 create thread |
583 | ; eax=1 create thread |
1089 | ; |
584 | ; |
1090 | ; ebx=thread start |
585 | ; ebx=thread start |
1091 | ; ecx=thread stack value |
586 | ; ecx=thread stack value |
1092 | ; |
587 | ; |
1093 | ; on return : eax = pid |
588 | ; on return : eax = pid |
1094 | jmp new_sys_threads |
589 | jmp new_sys_threads |
1095 | 590 | ||
1096 | iglobal |
591 | iglobal |
1097 | process_terminating db 'K : Process - terminating',13,10,0 |
592 | process_terminating db 'K : Process - terminating',13,10,0 |
1098 | process_terminated db 'K : Process - done',13,10,0 |
593 | process_terminated db 'K : Process - done',13,10,0 |
1099 | endg |
594 | endg |
1100 | 595 | ||
1101 | 596 | ||
1102 | terminate: ; terminate application |
597 | terminate: ; terminate application |
1103 | push esi |
598 | push esi |
1104 | mov esi,process_terminating |
599 | mov esi,process_terminating |
1105 | call sys_msg_board_str |
600 | call sys_msg_board_str |
1106 | pop esi |
601 | pop esi |
1107 | ;start memory manager code |
602 | ;start memory manager code |
1108 | ; mov eax,esi |
603 | ; mov eax,esi |
1109 | ; call MEM_Heap_Clean |
604 | ; call MEM_Heap_Clean |
1110 | ;end memory manager code |
605 | ;end memory manager code |
1111 | 606 | ||
1112 | 607 | ||
1113 | cli |
608 | cli |
1114 | cmp [application_table_status],0 |
609 | cmp [application_table_status],0 |
1115 | je term9 |
610 | je term9 |
1116 | sti |
611 | sti |
1117 | call change_task |
612 | call change_task |
1118 | jmp terminate |
613 | jmp terminate |
1119 | term9: |
614 | term9: |
1120 | 615 | ||
1121 | call set_application_table_status |
616 | call set_application_table_status |
1122 | 617 | ||
1123 | mov eax,esi |
618 | mov eax,esi |
1124 | call dispose_app_cr3_table |
619 | call dispose_app_cr3_table |
1125 | 620 | ||
1126 | cmp [prev_user_of_fpu],esi ; if user fpu last -> fpu user = 1 |
621 | cmp [prev_user_of_fpu],esi ; if user fpu last -> fpu user = 1 |
1127 | jne fpu_ok_1 |
622 | jne fpu_ok_1 |
1128 | mov [prev_user_of_fpu],1 |
623 | mov [prev_user_of_fpu],1 |
1129 | fpu_ok_1: |
624 | fpu_ok_1: |
1130 | 625 | ||
1131 | mov [0xf400],byte 0 ; empty keyboard buffer |
626 | mov [0xf400],byte 0 ; empty keyboard buffer |
1132 | mov [0xf500],byte 0 ; empty button buffer |
627 | mov [0xf500],byte 0 ; empty button buffer |
1133 | 628 | ||
1134 | 629 | ||
1135 | mov ecx,esi ; remove buttons |
630 | mov ecx,esi ; remove buttons |
1136 | bnewba2: |
631 | bnewba2: |
1137 | mov edi,[0xfe88] |
632 | mov edi,[0xfe88] |
1138 | mov eax,edi |
633 | mov eax,edi |
1139 | cld |
634 | cld |
1140 | movzx ebx,word [edi] |
635 | movzx ebx,word [edi] |
1141 | inc bx |
636 | inc bx |
1142 | bnewba: |
637 | bnewba: |
1143 | dec bx |
638 | dec bx |
1144 | jz bnmba |
639 | jz bnmba |
1145 | add eax,0x10 |
640 | add eax,0x10 |
1146 | cmp cx,[eax] |
641 | cmp cx,[eax] |
1147 | jnz bnewba |
642 | jnz bnewba |
1148 | pusha |
643 | pusha |
1149 | mov ecx,ebx |
644 | mov ecx,ebx |
1150 | inc ecx |
645 | inc ecx |
1151 | shl ecx,4 |
646 | shl ecx,4 |
1152 | mov ebx,eax |
647 | mov ebx,eax |
1153 | add eax,0x10 |
648 | add eax,0x10 |
1154 | call memmove |
649 | call memmove |
1155 | dec dword [edi] |
650 | dec dword [edi] |
1156 | popa |
651 | popa |
1157 | jmp bnewba2 |
652 | jmp bnewba2 |
1158 | bnmba: |
653 | bnmba: |
1159 | 654 | ||
1160 | pusha ; save window coordinates for window restoring |
655 | pusha ; save window coordinates for window restoring |
1161 | cld |
656 | cld |
1162 | shl esi,5 |
657 | shl esi,5 |
1163 | add esi,window_data |
658 | add esi,window_data |
1164 | mov ax,[esi+0] |
659 | mov ax,[esi+0] |
1165 | mov word [dlx],ax |
660 | mov word [dlx],ax |
1166 | mov bx,[esi+8] |
661 | mov bx,[esi+8] |
1167 | add ax,bx |
662 | add ax,bx |
1168 | mov word [dlxe],ax |
663 | mov word [dlxe],ax |
1169 | mov ax,[esi+4] |
664 | mov ax,[esi+4] |
1170 | mov word [dly],ax |
665 | mov word [dly],ax |
1171 | mov bx,[esi+12] |
666 | mov bx,[esi+12] |
1172 | add ax,bx |
667 | add ax,bx |
1173 | mov word [dlye],ax |
668 | mov word [dlye],ax |
1174 | mov [esi+0],word 0 |
669 | mov [esi+0],word 0 |
1175 | mov [esi+8],word 5 |
670 | mov [esi+8],word 5 |
1176 | mov ax,[0xFE04] |
671 | mov ax,[0xFE04] |
1177 | mov [esi+4],ax |
672 | mov [esi+4],ax |
1178 | mov [esi+12],word 5 |
673 | mov [esi+12],word 5 |
1179 | xor eax, eax |
674 | xor eax, eax |
1180 | mov [esi+16],eax;dword 0 |
675 | mov [esi+16],eax;dword 0 |
1181 | mov [esi+20],eax;dword 0 |
676 | mov [esi+20],eax;dword 0 |
1182 | mov [esi+24],eax;dword 0 |
677 | mov [esi+24],eax;dword 0 |
1183 | mov [esi+28],eax;dword 0 |
678 | mov [esi+28],eax;dword 0 |
1184 | popa |
679 | popa |
1185 | 680 | ||
1186 | pusha |
681 | pusha |
1187 | mov edi,esi |
682 | mov edi,esi |
1188 | shl edi,5 |
683 | shl edi,5 |
1189 | add edi,window_data |
684 | add edi,window_data |
1190 | mov ecx,32/4 |
685 | mov ecx,32/4 |
1191 | xor eax, eax |
686 | xor eax, eax |
1192 | ; cld |
687 | ; cld |
1193 | rep stosd |
688 | rep stosd |
1194 | 689 | ||
1195 | mov eax,[0xFE04] ; set window to start from maxy+1 |
690 | mov eax,[0xFE04] ; set window to start from maxy+1 |
1196 | add eax,2 |
691 | add eax,2 |
1197 | 692 | ||
1198 | mov edi,esi |
693 | mov edi,esi |
1199 | shl edi,5 |
694 | shl edi,5 |
1200 | add edi,window_data |
695 | add edi,window_data |
1201 | mov [edi+4],eax |
696 | mov [edi+4],eax |
1202 | 697 | ||
1203 | popa |
698 | popa |
1204 | 699 | ||
1205 | pusha |
700 | pusha |
1206 | mov edi,esi |
701 | mov edi,esi |
1207 | shl edi,5 |
702 | shl edi,5 |
1208 | add edi,draw_data |
703 | add edi,draw_data |
1209 | mov ecx,32/4 |
704 | mov ecx,32/4 |
1210 | xor eax, eax |
705 | xor eax, eax |
1211 | ; cld |
706 | ; cld |
1212 | rep stosd |
707 | rep stosd |
1213 | popa |
708 | popa |
1214 | 709 | ||
1215 | pusha ; at 0x80000+ |
710 | pusha ; at 0x80000+ |
1216 | mov edi,esi |
711 | mov edi,esi |
1217 | shl edi,8 |
712 | shl edi,8 |
1218 | add edi,0x80000 |
713 | add edi,0x80000 |
1219 | mov ecx,256/4 |
714 | mov ecx,256/4 |
1220 | xor eax, eax |
715 | xor eax, eax |
1221 | ; cld |
716 | ; cld |
1222 | rep stosd |
717 | rep stosd |
1223 | popa |
718 | popa |
1224 | 719 | ||
1225 | pusha ; name to spaces |
720 | pusha ; name to spaces |
1226 | mov edi,esi |
721 | mov edi,esi |
1227 | shl edi,8 |
722 | shl edi,8 |
1228 | add edi,0x80000 |
723 | add edi,0x80000 |
1229 | mov ecx,11 |
724 | mov ecx,11 |
1230 | mov eax,' ' |
725 | mov eax,' ' |
1231 | ; cld |
726 | ; cld |
1232 | rep stosb |
727 | rep stosb |
1233 | popa |
728 | popa |
1234 | 729 | ||
1235 | pusha ; C000 --> C400 |
730 | pusha ; C000 --> C400 |
1236 | mov eax, 0xc000 |
731 | mov eax, 0xc000 |
1237 | mov esi, 0 |
732 | mov esi, 0 |
1238 | nlc40: |
733 | nlc40: |
1239 | add eax, 2 |
734 | add eax, 2 |
1240 | inc esi |
735 | inc esi |
1241 | cmp esi, [0x3004] |
736 | cmp esi, [0x3004] |
1242 | jae nlc41 |
737 | jae nlc41 |
1243 | movzx ecx, word [eax] |
738 | movzx ecx, word [eax] |
1244 | mov [0xC400 + ecx*2], si |
739 | mov [0xC400 + ecx*2], si |
1245 | jmp nlc40 |
740 | jmp nlc40 |
1246 | nlc41: |
741 | nlc41: |
1247 | popa |
742 | popa |
1248 | 743 | ||
1249 | pusha ; remove hd1 reservation |
744 | pusha ; remove hd1 reservation |
1250 | mov edx,esi |
745 | mov edx,esi |
1251 | shl edx, 5 ;imul edx,0x20 |
746 | shl edx, 5 ;imul edx,0x20 |
1252 | add edx,0x3000 |
747 | add edx,0x3000 |
1253 | mov edx,[edx+4] |
748 | mov edx,[edx+4] |
1254 | cmp [hd1_status],edx |
749 | cmp [hd1_status],edx |
1255 | jne no_hd1_s_remove |
750 | jne no_hd1_s_remove |
1256 | mov [hd1_status],0 |
751 | mov [hd1_status],0 |
1257 | no_hd1_s_remove: |
752 | no_hd1_s_remove: |
1258 | popa |
753 | popa |
1259 | 754 | ||
1260 | pusha ; remove all irq reservations |
755 | pusha ; remove all irq reservations |
1261 | mov edx,esi |
756 | mov edx,esi |
1262 | shl edx, 5 ;imul edx,0x20 |
757 | shl edx, 5 ;imul edx,0x20 |
1263 | add edx,0x3000 |
758 | add edx,0x3000 |
1264 | mov edx,[edx+4] |
759 | mov edx,[edx+4] |
1265 | mov edi,irq_owner |
760 | mov edi,irq_owner |
1266 | mov ecx,16 |
761 | mov ecx,16 |
1267 | newirqfree: |
762 | newirqfree: |
1268 | cmp [edi],edx |
763 | cmp [edi],edx |
1269 | jne nofreeirq |
764 | jne nofreeirq |
1270 | mov [edi],dword 0 |
765 | mov [edi],dword 0 |
1271 | nofreeirq: |
766 | nofreeirq: |
1272 | add edi,4 |
767 | add edi,4 |
1273 | loop newirqfree |
768 | loop newirqfree |
1274 | popa |
769 | popa |
1275 | 770 | ||
1276 | 771 | ||
1277 | pusha ; remove all port reservations |
772 | pusha ; remove all port reservations |
1278 | 773 | ||
1279 | mov edx,esi |
774 | mov edx,esi |
1280 | shl edx, 5 ;imul edx,0x20 |
775 | shl edx, 5 ;imul edx,0x20 |
1281 | add edx,0x3000 |
776 | add edx,0x3000 |
1282 | mov edx,[edx+4] |
777 | mov edx,[edx+4] |
1283 | 778 | ||
1284 | rmpr0: |
779 | rmpr0: |
1285 | 780 | ||
1286 | mov esi,[0x2d0000] |
781 | mov esi,[0x2d0000] |
1287 | 782 | ||
1288 | cmp esi,0 |
783 | cmp esi,0 |
1289 | je rmpr9 |
784 | je rmpr9 |
1290 | 785 | ||
1291 | rmpr3: |
786 | rmpr3: |
1292 | 787 | ||
1293 | mov edi,esi |
788 | mov edi,esi |
1294 | shl edi,4 |
789 | shl edi,4 |
1295 | add edi,0x2d0000 |
790 | add edi,0x2d0000 |
1296 | 791 | ||
1297 | cmp edx,[edi] |
792 | cmp edx,[edi] |
1298 | je rmpr4 |
793 | je rmpr4 |
1299 | 794 | ||
1300 | dec esi |
795 | dec esi |
1301 | jnz rmpr3 |
796 | jnz rmpr3 |
1302 | 797 | ||
1303 | jmp rmpr9 |
798 | jmp rmpr9 |
1304 | 799 | ||
1305 | rmpr4: |
800 | rmpr4: |
1306 | 801 | ||
1307 | mov ecx,256 |
802 | mov ecx,256 |
1308 | sub ecx,esi |
803 | sub ecx,esi |
1309 | shl ecx,4 |
804 | shl ecx,4 |
1310 | 805 | ||
1311 | mov esi,edi |
806 | mov esi,edi |
1312 | add esi,16 |
807 | add esi,16 |
1313 | cld |
808 | cld |
1314 | rep movsb |
809 | rep movsb |
1315 | 810 | ||
1316 | dec dword [0x2d0000] |
811 | dec dword [0x2d0000] |
1317 | 812 | ||
1318 | jmp rmpr0 |
813 | jmp rmpr0 |
1319 | 814 | ||
1320 | rmpr9: |
815 | rmpr9: |
1321 | 816 | ||
1322 | popa |
817 | popa |
1323 | mov edi,esi ; do not run this process slot |
818 | mov edi,esi ; do not run this process slot |
1324 | shl edi, 5 |
819 | shl edi, 5 |
1325 | mov [edi+0x300A],byte 9 |
820 | mov [edi+0x300A],byte 9 |
1326 | ; call systest |
821 | ; call systest |
1327 | sti ; .. and life goes on |
822 | sti ; .. and life goes on |
1328 | 823 | ||
1329 | ; movzx eax,word [dlx] |
824 | ; movzx eax,word [dlx] |
1330 | ; movzx ebx,word [dly] |
825 | ; movzx ebx,word [dly] |
1331 | ; movzx ecx,word [dlxe] |
826 | ; movzx ecx,word [dlxe] |
1332 | ; movzx edx,word [dlye] |
827 | ; movzx edx,word [dlye] |
1333 | call calculatescreen |
828 | call calculatescreen |
1334 | 829 | ||
1335 | xor eax, eax |
830 | xor eax, eax |
1336 | xor esi, esi |
831 | xor esi, esi |
1337 | call redrawscreen |
832 | call redrawscreen |
1338 | 833 | ||
1339 | mov [0xfff4],byte 0 ; no mouse background |
834 | mov [0xfff4],byte 0 ; no mouse background |
1340 | mov [0xfff5],byte 0 ; draw mouse |
835 | mov [0xfff5],byte 0 ; draw mouse |
1341 | 836 | ||
1342 | mov [application_table_status],0 |
837 | mov [application_table_status],0 |
1343 | 838 | ||
1344 | mov esi,process_terminated |
839 | mov esi,process_terminated |
1345 | call sys_msg_board_str |
840 | call sys_msg_board_str |
1346 | 841 | ||
1347 | ;* start code - fix error redraw for terminate (2) - Mario79 |
842 | ;* start code - fix error redraw for terminate (2) - Mario79 |
1348 | ; cmp [draw_present],1 |
843 | ; cmp [draw_present],1 |
1349 | ; je no_draw_background_temp |
844 | ; je no_draw_background_temp |
1350 | ; mov [0xfff0],byte 1 |
845 | ; mov [0xfff0],byte 1 |
1351 | ;no_draw_background_temp: |
846 | ;no_draw_background_temp: |
1352 | ; mov [draw_present],0 |
847 | ; mov [draw_present],0 |
1353 | ret |
848 | ret |
1354 | ;draw_present db 0 |
849 | ;draw_present db 0 |
1355 | ;* end code - fix error redraw for terminate (2) - Mario79 |
850 | ;* end code - fix error redraw for terminate (2) - Mario79 |
1356 | 851 | ||
1357 | iglobal |
852 | iglobal |
1358 | boot_sched_1 db 'Building gdt tss pointer',0 |
853 | boot_sched_1 db 'Building gdt tss pointer',0 |
1359 | ;boot_sched_2 db 'Building gdt gate pointer',0 |
854 | boot_sched_2 db 'Building IDT table',0 |
1360 | boot_sched_3 db 'Building interrupt table - TSS',0 |
- | |
1361 | boot_sched_3_2 db 'Building interrupt table - GDT',0 |
- | |
1362 | boot_sched_3_3 db 'Building interrupt table - IDT',0 |
- | |
1363 | boot_sched_4 db 'Building syscall interrupt table',0 |
- | |
1364 | endg |
855 | endg |
1365 | 856 | ||
1366 | 857 | ||
1367 | build_scheduler: |
858 | build_scheduler: |
1368 | 859 | ||
1369 | mov esi,boot_sched_1 |
860 | mov esi,boot_sched_1 |
1370 | call boot_log |
861 | call boot_log |
1371 | call build_process_gdt_tss_pointer |
862 | call build_process_gdt_tss_pointer |
1372 | 863 | ||
1373 | ; mov esi,boot_sched_2 |
- | |
1374 | ; call boot_log |
- | |
1375 | ; call build_process_gdt_gate_pointer |
- | |
1376 | - | ||
1377 | mov esi,boot_sched_3 |
864 | mov esi,boot_sched_2 |
1378 | call boot_log |
865 | call boot_log |
1379 | call build_interrupt_table |
866 | call build_interrupt_table |
1380 | - | ||
1381 | mov esi,boot_sched_4 |
- | |
1382 | call boot_log |
- | |
1383 | call build_syscall_interrupt_table |
- | |
1384 | 867 | ||
1385 | ret |
868 | ret |