Rev 2 | Rev 4 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1 | ha | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
3 | ;; MenuetOS process management, protected ring3 ;; |
||
4 | ;; ;; |
||
5 | ;; Distributed under GPL. See file COPYING for details. ;; |
||
6 | ;; Copyright 2003 Ville Turjanmaa ;; |
||
7 | ;; ;; |
||
8 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
9 | |||
10 | align 32 |
||
11 | |||
12 | ; GDT TABLE |
||
13 | |||
14 | gdts: |
||
15 | |||
16 | dw gdte-$-1 |
||
17 | dd gdts |
||
18 | dw 0 |
||
19 | |||
20 | int_code_l: |
||
21 | os_code_l: |
||
22 | |||
23 | dw 0xffff |
||
24 | dw 0x0000 |
||
25 | db 0x00 |
||
26 | dw 11011111b *256 +10011010b |
||
27 | db 0x00 |
||
28 | |||
29 | int_data_l: |
||
30 | os_data_l: |
||
31 | |||
32 | dw 0xffff |
||
33 | dw 0x0000 |
||
34 | db 0x00 |
||
35 | dw 11011111b *256 +10010010b |
||
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 | |||
52 | app_code_l: |
||
53 | times (max_processes+10) dd 0,0 |
||
54 | |||
55 | app_data_l: |
||
56 | times (max_processes+10) dd 0,0 |
||
57 | |||
58 | tss0sys_l: |
||
59 | times (max_processes+10) dd 0,0 |
||
60 | |||
61 | gdte: |
||
62 | |||
63 | |||
64 | |||
65 | ; |
||
66 | idtreg: |
||
67 | dw 8*0x41-1 |
||
68 | dd idts+8 |
||
69 | |||
70 | label idts at 0xB100-8 |
||
71 | ;idte = idts + 8 + 0x60 |
||
72 | |||
73 | ; ; old code below: |
||
74 | |||
75 | |||
76 | ;align 32 |
||
77 | |||
78 | ;idts: |
||
79 | ; dw idte-$-1 |
||
80 | ; dd idts+8 |
||
81 | ; dw 0 |
||
82 | |||
83 | ; times 0x62 dd 0,0 |
||
84 | |||
85 | ;idte: |
||
86 | |||
87 | build_process_gdt_tss_pointer: |
||
88 | |||
89 | mov ecx,tss_data |
||
90 | mov edi,0 |
||
91 | setgdtl2: |
||
92 | mov [edi+gdts+ tss0 +0], word tss_step |
||
93 | mov [edi+gdts+ tss0 +2], cx |
||
94 | mov eax,ecx |
||
95 | shr eax,16 |
||
96 | mov [edi+gdts+ tss0 +4], al |
||
97 | mov [edi+gdts+ tss0 +7], ah |
||
98 | mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b |
||
99 | add ecx,tss_step |
||
100 | add edi,8 |
||
101 | cmp edi,8*(max_processes+5) |
||
102 | jbe setgdtl2 |
||
103 | |||
104 | ret |
||
105 | |||
106 | ;build_process_gdt_gate_pointer: |
||
107 | |||
108 | ; mov edi,0 |
||
109 | ; mov dx,tss0 |
||
110 | ; setidtl1: |
||
111 | ; mov ecx,[esi] |
||
112 | ; mov [edi+gdts+ tss0t +0], word 0 |
||
113 | ; mov [edi+gdts+ tss0t +2], dx |
||
114 | ; mov [edi+gdts+ tss0t +4], word 11100101b*256 |
||
115 | ; mov [edi+gdts+ tss0t +6], word 0 |
||
116 | ; add dx,8 |
||
117 | ; add edi,8 |
||
118 | ; cmp edi,8*(max_processes+5) |
||
119 | ; jb setidtl1 |
||
120 | |||
121 | ; ret |
||
122 | |||
123 | build_interrupt_table: |
||
124 | |||
125 | mov [l.eflags],dword 0x11002 |
||
126 | mov [l.ss0], int_data |
||
127 | ;mov [l.ss1], ring1_data |
||
128 | ;mov [l.ss2], ring2_data |
||
129 | mov [l.esp0], 0x52000 |
||
130 | mov [l.esp1], 0x53000 |
||
131 | mov [l.esp2], 0x54000 |
||
132 | |||
133 | mov eax,cr3 |
||
134 | mov [l.cr3],eax |
||
135 | mov [l.cs],int_code |
||
136 | mov [l.ss],int_data |
||
137 | mov [l.ds],int_data |
||
138 | mov [l.es],int_data |
||
139 | mov [l.fs],int_data |
||
140 | mov [l.gs],int_data |
||
141 | |||
142 | mov eax,sys_int |
||
143 | mov [l.esp],0x720000 |
||
144 | mov edi,0x290000 |
||
145 | |||
146 | newint: |
||
147 | push edi |
||
148 | mov ebx,[eax] |
||
149 | mov [l.eip],ebx |
||
150 | mov esi,tss_sceleton |
||
151 | mov ecx,120/4 |
||
152 | cld |
||
153 | rep movsd |
||
154 | pop edi |
||
155 | |||
156 | add edi,128 |
||
157 | add [l.esp],1024 |
||
158 | add eax,4 |
||
159 | |||
160 | cmp eax,sys_int+4*0x40 ;0x60 |
||
161 | jbe newint ;jb |
||
162 | |||
163 | ;; |
||
164 | |||
165 | mov esi,boot_sched_3_2 |
||
166 | call boot_log |
||
167 | |||
168 | mov ecx,0x290000 |
||
169 | mov edi,0 |
||
170 | setgdtl2i: |
||
171 | mov [edi+gdts+ tss0i +0], word 128 |
||
172 | mov [edi+gdts+ tss0i +2], cx |
||
173 | mov eax,ecx |
||
174 | shr eax,16 |
||
175 | mov [edi+gdts+ tss0i +4], al |
||
176 | mov [edi+gdts+ tss0i +7], ah |
||
177 | mov [edi+gdts+ tss0i +5], word 01010000b *256 +11101001b |
||
178 | add ecx,128 |
||
179 | add edi,8 |
||
180 | cmp edi,8*0x40 ;0x60 |
||
181 | jbe setgdtl2i |
||
182 | |||
183 | ;; |
||
184 | |||
185 | mov esi,boot_sched_3_3 |
||
186 | call boot_log |
||
187 | |||
188 | mov edi,0 |
||
189 | mov edx,tss0i |
||
190 | setidtl2: |
||
191 | mov [edi+idts+ 8 +0], word 0 |
||
192 | mov [edi+idts+ 8 +2], dx |
||
193 | mov [edi+idts+ 8 +4], word 10000101b*256 ; task gate DPL=0 |
||
194 | ; cmp edi,0x40*8 |
||
195 | ; jne no_sw_int |
||
196 | ; mov [edi+idts+ 8 +4], word 11100101b*256 ; task gate DPL=3 |
||
197 | ; no_sw_int: |
||
198 | mov [edi+idts+ 8 +6], word 0 |
||
199 | add edx,8 |
||
200 | add edi,8 |
||
201 | |||
202 | cmp edi,8*0x40 ;0x60 |
||
203 | jbe setidtl2 ;jb |
||
204 | |||
205 | ; |
||
206 | ; THIS CODE WON'T WORK ;-( |
||
207 | ; because each process's 0-level stack points to the same area |
||
208 | ; and if task switch occurs and another process is being interrupted |
||
209 | ; a stack overflow happens |
||
210 | ; The only way to solve that problem is to disable interrupts |
||
211 | ; while 0x40-handler is working |
||
212 | ; Then we have to make all entries in the IDT INTERRUPT gates, not TASK |
||
213 | ; mov edi, idts+8 |
||
214 | ; mov esi, sys_int |
||
215 | ; mov ecx, 32 |
||
216 | ; @@: |
||
217 | ; mov eax, [esi] |
||
218 | ; mov [edi], ax ; lower part of offset |
||
219 | ; mov [edi+2], word os_code ; segment selector |
||
220 | ; shr eax, 16 |
||
221 | ; mov [edi+4], word 10001110b shl 8 ; interrupt descriptor |
||
222 | ; mov [edi+6], ax |
||
223 | ; add esi, 4 |
||
224 | ; add edi, 8 |
||
225 | ; dec ecx |
||
226 | ; jnz @b |
||
227 | ; |
||
228 | |||
229 | ret |
||
230 | |||
231 | build_syscall_interrupt_table: |
||
232 | |||
233 | mov [l.eflags],dword 0x11002 |
||
234 | mov [l.ss0], int_data ;code |
||
235 | ;mov [l.ss1], ring1_data ;code |
||
236 | ;mov [l.ss2], ring2_data ;code |
||
237 | mov [l.esp0], 0x52000 |
||
238 | mov [l.esp1], 0x53000 |
||
239 | mov [l.esp2], 0x54000 |
||
240 | |||
241 | mov eax,cr3 |
||
242 | mov [l.cr3],eax |
||
243 | mov [l.cs],int_code |
||
244 | mov [l.ss],int_data |
||
245 | mov [l.ds],int_data |
||
246 | mov [l.es],int_data |
||
247 | mov [l.fs],int_data |
||
248 | mov [l.gs],int_data |
||
249 | |||
250 | mov [l.esp],sysint_stack_data |
||
251 | mov edi,0x298000 |
||
252 | |||
253 | newint2: |
||
254 | push edi |
||
255 | mov ebx,i40 |
||
256 | mov [l.eip],ebx |
||
257 | mov esi,tss_sceleton |
||
258 | mov ecx,120/4 |
||
259 | cld |
||
260 | rep movsd |
||
261 | pop edi |
||
262 | |||
263 | add [l.esp],4096 |
||
264 | add edi,128 |
||
265 | ;add eax,4 |
||
266 | |||
267 | cmp edi,0x298000+128*(max_processes+5) |
||
268 | jb newint2 |
||
269 | |||
270 | ;; |
||
271 | |||
272 | mov ecx,0x298000 |
||
273 | mov edi,0 |
||
274 | setgdtl2i2: |
||
275 | mov [edi+gdts+ tss0sys +0], word 128 |
||
276 | mov [edi+gdts+ tss0sys +2], cx |
||
277 | mov eax,ecx |
||
278 | shr eax,16 |
||
279 | mov [edi+gdts+ tss0sys +4], al |
||
280 | mov [edi+gdts+ tss0sys +7], ah |
||
281 | mov [edi+gdts+ tss0sys +5], word 01010000b *256 +11101001b |
||
282 | add ecx,128 |
||
283 | add edi,8 |
||
284 | cmp edi,8*(max_processes+5) |
||
285 | jbe setgdtl2i2 |
||
286 | |||
287 | ;; |
||
288 | |||
289 | ;mov dx,tss0sys |
||
290 | mov edi,8*0x40+idts+8 |
||
3 | halyavin | 291 | mov [edi + 0], word (i40 and ((1 shl 16)-1)) |
292 | mov [edi + 2], word os_code |
||
293 | mov [edi + 4], word 11101110b*256 |
||
294 | mov [edi + 6], word (i40 shr 16) |
||
1 | ha | 295 | |
296 | mov edi,8*0x38+idts+8 |
||
297 | mov eax, i38 |
||
298 | mov [edi], ax ; lower part of offset |
||
299 | mov [edi+2], word os_code ; segment selector |
||
300 | shr eax, 16 |
||
301 | mov [edi+4], word 11101110b shl 8 ; 32-bit interrupt gate, DPL 3 |
||
302 | mov [edi+6], ax |
||
303 | |||
304 | ret |
||
305 | |||
306 | |||
307 | align 4 |
||
308 | i38: |
||
309 | ; load data selectors |
||
310 | pushfd |
||
311 | push ds es |
||
312 | push eax |
||
313 | mov ax, os_data |
||
314 | mov ds, ax |
||
315 | mov es, ax |
||
316 | pop eax |
||
317 | |||
318 | pushad |
||
319 | push edi |
||
320 | mov edi, eax |
||
321 | mov eax, ebx |
||
322 | mov ebx, ecx |
||
323 | mov ecx, edx |
||
324 | mov esi, [esp] |
||
325 | and edi, 0xFF |
||
326 | call dword [servetable+edi*4] |
||
327 | add esp, 4 |
||
328 | popad |
||
329 | pop es ds |
||
330 | popfd |
||
331 | iret |
||
332 | |||
333 | |||
334 | iglobal |
||
335 | sys_int: |
||
336 | dd s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,sa,sb,sc,sd,se,sf |
||
337 | |||
338 | dd s10 ,s11 ; ,i_unknown12,i_unknown13 |
||
339 | ; dd i_unknown14,i_unknown15,i_unknown16,i_unknown17 |
||
340 | ; dd i_unknown18,i_unknown19,i_unknown1a,i_unknown1b |
||
341 | ; dd i_unknown1c,i_unknown1d,i_unknown1e,i_unknown1f |
||
342 | times 14 dd unknown_interrupt |
||
343 | |||
344 | dd irq0 ,irq1 ,p_irq2 ,p_irq3 ,p_irq4 ,p_irq5,p_irq6 ,p_irq7 |
||
345 | dd p_irq8,p_irq9,p_irq10,p_irq11,p_irq12,irqD ,p_irq14,p_irq15 |
||
346 | |||
347 | ;dd i_unknown30,i_unknown31,i_unknown32,i_unknown33 |
||
348 | ;dd i_unknown34,i_unknown35,i_unknown36,i_unknown37 |
||
349 | ;dd i_unknown38,i_unknown39,i_unknown3a,i_unknown3b |
||
350 | ;dd i_unknown3c,i_unknown3d,i_unknown3e,i_unknown3f |
||
351 | times 16 dd unknown_interrupt |
||
352 | |||
353 | dd i40 |
||
354 | endg |
||
355 | |||
356 | uglobal |
||
357 | tss_sceleton: |
||
358 | l.back dw 0,0 |
||
359 | l.esp0 dd 0 |
||
360 | l.ss0 dw 0,0 |
||
361 | l.esp1 dd 0 |
||
362 | l.ss1 dw 0,0 |
||
363 | l.esp2 dd 0 |
||
364 | l.ss2 dw 0,0 |
||
365 | l.cr3 dd 0 |
||
366 | l.eip dd 0 |
||
367 | l.eflags dd 0 |
||
368 | l.eax dd 0 |
||
369 | l.ecx dd 0 |
||
370 | l.edx dd 0 |
||
371 | l.ebx dd 0 |
||
372 | l.esp dd 0 |
||
373 | l.ebp dd 0 |
||
374 | l.esi dd 0 |
||
375 | l.edi dd 0 |
||
376 | l.es dw 0,0 |
||
377 | l.cs dw 0,0 |
||
378 | l.ss dw 0,0 |
||
379 | l.ds dw 0,0 |
||
380 | l.fs dw 0,0 |
||
381 | l.gs dw 0,0 |
||
382 | l.ldt dw 0,0 |
||
383 | l.trap dw 0 |
||
384 | l.io dw 0 |
||
385 | endg |
||
386 | |||
387 | s0: |
||
388 | cli |
||
389 | |||
390 | mov [error_interrupt],0x0 |
||
391 | mov [error_interrupt_entry],dword s0 |
||
392 | |||
393 | call show_error_parameters |
||
394 | |||
395 | mov edx,[0x3010] |
||
396 | mov [edx+0xa],byte 4 |
||
397 | |||
398 | jmp change_task |
||
399 | |||
400 | |||
401 | s1: |
||
402 | cli |
||
403 | |||
404 | mov [error_interrupt],0x1 |
||
405 | mov [error_interrupt_entry],dword s1 |
||
406 | |||
407 | call show_error_parameters |
||
408 | |||
409 | mov edx,[0x3010] |
||
410 | mov [edx+0xa],byte 4 |
||
411 | |||
412 | jmp change_task |
||
413 | |||
414 | s2: |
||
415 | cli |
||
416 | |||
417 | mov [error_interrupt],0x2 |
||
418 | mov [error_interrupt_entry],dword s2 |
||
419 | |||
420 | call show_error_parameters |
||
421 | |||
422 | mov edx,[0x3010] |
||
423 | mov [edx+0xa],byte 4 |
||
424 | |||
425 | jmp change_task |
||
426 | |||
427 | s3: |
||
428 | cli |
||
429 | |||
430 | mov [error_interrupt],0x3 |
||
431 | mov [error_interrupt_entry],dword s3 |
||
432 | |||
433 | call show_error_parameters |
||
434 | |||
435 | mov edx,[0x3010] |
||
436 | mov [edx+0xa],byte 4 |
||
437 | |||
438 | jmp change_task |
||
439 | |||
440 | s4: |
||
441 | cli |
||
442 | |||
443 | mov [error_interrupt],0x4 |
||
444 | mov [error_interrupt_entry],dword s4 |
||
445 | |||
446 | call show_error_parameters |
||
447 | |||
448 | mov edx,[0x3010] |
||
449 | mov [edx+0xa],byte 4 |
||
450 | |||
451 | jmp change_task |
||
452 | |||
453 | s5: |
||
454 | cli |
||
455 | |||
456 | mov [error_interrupt],0x5 |
||
457 | mov [error_interrupt_entry],dword s5 |
||
458 | |||
459 | call show_error_parameters |
||
460 | |||
461 | mov edx,[0x3010] |
||
462 | mov [edx+0xa],byte 4 |
||
463 | |||
464 | jmp change_task |
||
465 | |||
466 | s6: |
||
467 | cli |
||
468 | |||
469 | mov [error_interrupt],0x6 |
||
470 | mov [error_interrupt_entry],dword s6 |
||
471 | |||
472 | call show_error_parameters |
||
473 | |||
474 | mov edx,[0x3010] |
||
475 | mov [edx+0xa],byte 4 |
||
476 | |||
477 | jmp change_task |
||
478 | |||
479 | |||
480 | ;;;;;;;;;;;;;;;;;;;;;;; |
||
481 | ;; FPU ERROR HANDLER ;; |
||
482 | ;;;;;;;;;;;;;;;;;;;;;;; |
||
483 | |||
484 | align 4 |
||
485 | s7: |
||
486 | ; |
||
487 | cli |
||
488 | ; |
||
489 | mov edi, 7*8 |
||
490 | mov [edi+gdts+ tss0i +5], word 01010000b *256 +11101001b |
||
491 | |||
492 | mov edi,[0x3000] |
||
493 | shl edi, 3 |
||
494 | mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b |
||
495 | |||
496 | |||
497 | ; save a copy of current task's TSS to fpu_tss |
||
498 | mov esi,[0x3000] |
||
499 | imul esi,tss_step |
||
500 | add esi,tss_data |
||
501 | mov edi,fpu_tss |
||
502 | mov ecx,120/4 |
||
503 | cld |
||
504 | rep movsd |
||
505 | |||
506 | ; get base address of our TSS and... |
||
507 | mov esi,[0x3000] |
||
508 | imul esi,tss_step |
||
509 | add esi,tss_data |
||
510 | |||
511 | ; ...init segments, stack, eip, flags |
||
512 | mov word [esi+l.cs-tss_sceleton],int_code |
||
513 | mov word [esi+l.ss-tss_sceleton],int_data |
||
514 | mov word [esi+l.ds-tss_sceleton],int_data |
||
515 | mov word [esi+l.es-tss_sceleton],int_data |
||
516 | mov word [esi+l.fs-tss_sceleton],int_data |
||
517 | mov word [esi+l.gs-tss_sceleton],int_data |
||
518 | mov dword [esi+l.esp-tss_sceleton],fpu_stack+4*8 |
||
519 | mov dword [esi+l.eip-tss_sceleton],fpu_handler |
||
520 | mov dword [esi+l.eflags-tss_sceleton],0x11002 |
||
521 | |||
522 | ; then execute this task |
||
523 | mov ebx, [0x3000] |
||
524 | shl ebx,3 |
||
525 | add ebx, tss0 ;t |
||
526 | mov [0xB004], bx |
||
527 | |||
528 | jmp pword [0xB000] |
||
529 | |||
530 | jmp s7 |
||
531 | |||
532 | s8: |
||
533 | cli |
||
534 | |||
535 | mov [error_interrupt],0x8 |
||
536 | mov [error_interrupt_entry],dword s8 |
||
537 | |||
538 | call show_error_parameters |
||
539 | |||
540 | mov edx,[0x3010] |
||
541 | mov [edx+0xa],byte 4 |
||
542 | |||
543 | jmp change_task |
||
544 | |||
545 | s9: |
||
546 | cli |
||
547 | |||
548 | mov [error_interrupt],0x9 |
||
549 | mov [error_interrupt_entry],dword s9 |
||
550 | |||
551 | call show_error_parameters |
||
552 | |||
553 | mov edx,[0x3010] |
||
554 | mov [edx+0xa],byte 4 |
||
555 | |||
556 | jmp change_task |
||
557 | |||
558 | sa: |
||
559 | cli |
||
560 | |||
561 | mov [error_interrupt],0xa |
||
562 | mov [error_interrupt_entry],dword sa |
||
563 | |||
564 | call show_error_parameters |
||
565 | |||
566 | mov edx,[0x3010] |
||
567 | mov [edx+0xa],byte 4 |
||
568 | |||
569 | jmp change_task |
||
570 | |||
571 | sb: |
||
572 | cli |
||
573 | |||
574 | mov [error_interrupt],0xb |
||
575 | mov [error_interrupt_entry],dword sb |
||
576 | |||
577 | call show_error_parameters |
||
578 | |||
579 | mov edx,[0x3010] |
||
580 | mov [edx+0xa],byte 4 |
||
581 | |||
582 | jmp change_task |
||
583 | |||
584 | sc: |
||
585 | cli |
||
586 | |||
587 | mov [error_interrupt],0xc |
||
588 | mov [error_interrupt_entry],dword sc |
||
589 | |||
590 | call show_error_parameters |
||
591 | |||
592 | mov edx,[0x3010] |
||
593 | mov [edx+0xa],byte 4 |
||
594 | |||
595 | jmp change_task |
||
596 | |||
597 | sd: |
||
598 | cli |
||
599 | |||
600 | mov [error_interrupt],0xd |
||
601 | mov [error_interrupt_entry],dword sd |
||
602 | |||
603 | call show_error_parameters |
||
604 | |||
605 | mov edx,[0x3010] |
||
606 | mov [edx+0xa],byte 4 |
||
607 | |||
608 | jmp change_task |
||
609 | |||
610 | se: |
||
611 | cli |
||
612 | |||
613 | mov [error_interrupt],0xe |
||
614 | mov [error_interrupt_entry],dword se |
||
615 | |||
616 | call show_error_parameters |
||
617 | |||
618 | mov edx,[0x3010] |
||
619 | mov [edx+0xa],byte 4 |
||
620 | |||
621 | jmp change_task |
||
622 | |||
623 | sf: |
||
624 | cli |
||
625 | |||
626 | mov [error_interrupt],0xf |
||
627 | mov [error_interrupt_entry],dword sf |
||
628 | |||
629 | call show_error_parameters |
||
630 | |||
631 | mov edx,[0x3010] |
||
632 | mov [edx+0xa],byte 4 |
||
633 | |||
634 | jmp change_task |
||
635 | |||
636 | s10: |
||
637 | cli |
||
638 | |||
639 | mov [error_interrupt],0x10 |
||
640 | mov [error_interrupt_entry],dword s10 |
||
641 | |||
642 | call show_error_parameters |
||
643 | |||
644 | mov edx,[0x3010] |
||
645 | mov [edx+0xa],byte 4 |
||
646 | |||
647 | jmp change_task |
||
648 | |||
649 | s11: |
||
650 | cli |
||
651 | |||
652 | mov [error_interrupt],0x11 |
||
653 | mov [error_interrupt_entry],dword s11 |
||
654 | |||
655 | call show_error_parameters |
||
656 | |||
657 | mov edx,[0x3010] |
||
658 | mov [edx+0xa],byte 4 |
||
659 | |||
660 | jmp change_task |
||
661 | |||
662 | writehex: |
||
663 | |||
664 | pusha |
||
665 | |||
666 | mov ecx,eax |
||
667 | mov ax,word [printerrorat] |
||
668 | shl eax,16 |
||
669 | mov ax,[esp+32+4] |
||
670 | sub ax,60 |
||
671 | mov edx,1 |
||
672 | mov esi,8 |
||
673 | mov ebx,0xffffff |
||
674 | whl1: |
||
675 | push ecx |
||
676 | and ecx,0xf |
||
677 | add ecx,hexletters |
||
678 | mov edi,1 |
||
679 | |||
680 | mov cl,[ecx] |
||
681 | mov edi,[write_error_to] |
||
682 | mov [edi],cl |
||
683 | dec [write_error_to] |
||
684 | |||
685 | pop ecx |
||
686 | shr ecx,4 |
||
687 | sub eax,6*65536 |
||
688 | dec esi |
||
689 | jnz whl1 |
||
690 | |||
691 | popa |
||
692 | ret |
||
693 | |||
694 | iglobal |
||
695 | hexletters db '0123456789ABCDEF' |
||
696 | |||
697 | error_interrupt dd -1 |
||
698 | error_interrupt_entry dd -1 |
||
699 | |||
700 | printerrorat dd 300 |
||
701 | |||
702 | process_error db 'K : Process - forced terminate INT: 00000000',13,10,0 |
||
703 | process_pid db 'K : Process - forced terminate PID: 00000000',13,10,0 |
||
704 | process_eip db 'K : Process - forced terminate EIP: 00000000',13,10,0 |
||
705 | system_error db 'K : Kernel error',13,10,0 |
||
706 | endg |
||
707 | |||
708 | uglobal |
||
709 | write_error_to dd 0x0 |
||
710 | endg |
||
711 | |||
712 | show_error_parameters: |
||
713 | |||
714 | mov [write_error_to],process_pid+43 |
||
715 | mov eax,[0x3000] |
||
716 | shl eax, 5 |
||
717 | mov eax,[0x3000+4+eax] |
||
718 | call writehex |
||
719 | |||
720 | mov [write_error_to],process_error+43 |
||
721 | mov eax,[error_interrupt] |
||
722 | call writehex |
||
723 | |||
724 | mov eax,[0x3000] |
||
725 | shl eax,8 |
||
726 | cmp [0x80000+eax+0xB0],dword 0 |
||
727 | jnz .system_error |
||
728 | |||
729 | mov eax,[0x3000] |
||
730 | imul eax,tss_step |
||
731 | mov eax,[eax+tss_data+l.eip-tss_sceleton] |
||
732 | .out_eip: |
||
733 | mov [write_error_to],process_eip+43 |
||
734 | call writehex |
||
735 | |||
736 | mov esi,process_error |
||
737 | call sys_msg_board_str |
||
738 | |||
739 | mov esi,process_pid |
||
740 | call sys_msg_board_str |
||
741 | |||
742 | mov esi,process_eip |
||
743 | call sys_msg_board_str |
||
744 | |||
745 | ret |
||
746 | |||
747 | .system_error: |
||
748 | mov esi,system_error |
||
749 | call sys_msg_board_str |
||
750 | mov eax,[0x3000] |
||
751 | shl eax,7 |
||
752 | mov eax,[eax+0x298000+l.eip-tss_sceleton] |
||
753 | jmp .out_eip |
||
754 | |||
755 | |||
756 | irq5: |
||
757 | |||
758 | call restore_caller |
||
759 | |||
760 | mov dx,word [sb16] |
||
761 | add dx,0xe |
||
762 | in al,dx |
||
763 | |||
764 | ; mov byte [SB16_Status],0 |
||
765 | |||
766 | mov [check_idle_semaphore],5 |
||
767 | |||
768 | mov al,0x20 |
||
769 | out 0x20,al |
||
770 | |||
771 | call return_to_caller |
||
772 | |||
773 | jmp irq5 |
||
774 | |||
775 | irqD: |
||
776 | |||
777 | call restore_caller |
||
778 | |||
779 | mov dx,0xf0 |
||
780 | mov al,0 |
||
781 | out dx,al |
||
782 | |||
783 | mov dx,0xa0 |
||
784 | mov al,0x20 |
||
785 | out dx,al |
||
786 | mov dx,0x20 |
||
787 | out dx,al |
||
788 | |||
789 | mov ds,cx |
||
790 | mov es,cx |
||
791 | mov fs,cx |
||
792 | |||
793 | call return_to_caller |
||
794 | |||
795 | jmp irqD |
||
796 | |||
797 | p_irq2: |
||
798 | |||
799 | call restore_caller |
||
800 | |||
801 | mov edi,2 ; 1 |
||
802 | call irqhandler ; 2/5 |
||
803 | |||
804 | call return_to_caller |
||
805 | |||
806 | jmp p_irq2 |
||
807 | |||
808 | p_irq3: |
||
809 | |||
810 | call restore_caller |
||
811 | |||
812 | mov edi,3 |
||
813 | call irqhandler |
||
814 | |||
815 | call return_to_caller |
||
816 | |||
817 | jmp p_irq3 |
||
818 | |||
819 | p_irq4: |
||
820 | |||
821 | call restore_caller |
||
822 | |||
823 | mov edi,4 |
||
824 | call irqhandler |
||
825 | |||
826 | call return_to_caller |
||
827 | |||
828 | jmp p_irq4 |
||
829 | |||
830 | p_irq5: |
||
831 | |||
832 | call restore_caller |
||
833 | |||
834 | mov edi,5 |
||
835 | call irqhandler |
||
836 | |||
837 | call return_to_caller |
||
838 | |||
839 | jmp p_irq5 |
||
840 | |||
841 | p_irq6: |
||
842 | |||
843 | call restore_caller |
||
844 | |||
845 | call fdc_irq |
||
846 | |||
847 | mov edi,6 |
||
848 | call irqhandler |
||
849 | |||
850 | call return_to_caller |
||
851 | |||
852 | jmp p_irq6 |
||
853 | |||
854 | p_irq7: |
||
855 | |||
856 | call restore_caller |
||
857 | |||
858 | mov edi,7 |
||
859 | call irqhandler |
||
860 | |||
861 | call return_to_caller |
||
862 | |||
863 | jmp p_irq7 |
||
864 | |||
865 | p_irq8: |
||
866 | |||
867 | call restore_caller |
||
868 | |||
869 | mov edi,8 |
||
870 | call irqhandler |
||
871 | |||
872 | call return_to_caller |
||
873 | |||
874 | jmp p_irq8 |
||
875 | |||
876 | p_irq9: |
||
877 | |||
878 | call restore_caller |
||
879 | |||
880 | mov edi,9 |
||
881 | call irqhandler |
||
882 | |||
883 | call return_to_caller |
||
884 | |||
885 | jmp p_irq9 |
||
886 | |||
887 | p_irq10: |
||
888 | |||
889 | call restore_caller |
||
890 | |||
891 | mov edi,10 |
||
892 | call irqhandler |
||
893 | |||
894 | call return_to_caller |
||
895 | |||
896 | jmp p_irq10 |
||
897 | |||
898 | p_irq11: |
||
899 | |||
900 | call restore_caller |
||
901 | |||
902 | mov edi,11 |
||
903 | call irqhandler |
||
904 | |||
905 | call return_to_caller |
||
906 | |||
907 | jmp p_irq11 |
||
908 | |||
909 | p_irq12: |
||
910 | |||
911 | call restore_caller |
||
912 | |||
913 | mov edi,12 |
||
914 | call irqhandler |
||
915 | |||
916 | call return_to_caller |
||
917 | |||
918 | jmp p_irq12 |
||
919 | |||
920 | p_irq13: |
||
921 | |||
922 | call restore_caller |
||
923 | |||
924 | mov edi,13 |
||
925 | call irqhandler |
||
926 | |||
927 | call return_to_caller |
||
928 | |||
929 | jmp p_irq13 |
||
930 | |||
931 | p_irq14: |
||
932 | |||
933 | call restore_caller |
||
934 | |||
935 | mov edi,14 |
||
936 | call irqhandler |
||
937 | |||
938 | call return_to_caller |
||
939 | |||
940 | jmp p_irq14 |
||
941 | |||
942 | p_irq15: |
||
943 | |||
944 | call restore_caller |
||
945 | |||
946 | mov edi,15 |
||
947 | call irqhandler |
||
948 | |||
949 | call return_to_caller |
||
950 | |||
951 | jmp p_irq15 |
||
952 | |||
953 | |||
954 | |||
955 | align 4 |
||
956 | restore_caller: |
||
957 | |||
958 | mov edi,[0x3000] |
||
959 | shl edi, 3 |
||
960 | mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b |
||
961 | |||
962 | ret |
||
963 | |||
964 | align 4 |
||
965 | return_to_caller: |
||
966 | |||
967 | mov ebx,[0x3000] |
||
968 | shl bx,3 |
||
969 | add bx,tss0;t |
||
970 | mov [tss_irq12],bx |
||
971 | |||
972 | db 0xea |
||
973 | dd 0 |
||
974 | tss_irq12 dw tss0;t |
||
975 | |||
976 | ret |
||
977 | |||
978 | uglobal |
||
979 | irqh dd 0x0 |
||
980 | endg |
||
981 | |||
982 | irqhandler: |
||
983 | |||
984 | push edi |
||
985 | |||
986 | mov esi,edi ; 1 |
||
987 | shl esi,6 ; 1 |
||
988 | add esi,irq00read ; 1 |
||
989 | shl edi,12 ; 1 |
||
990 | add edi,0x2E0000 |
||
991 | |||
992 | mov [check_idle_semaphore],5 |
||
993 | |||
994 | irqnewread: |
||
995 | |||
996 | mov dx,[esi] ; 2+ |
||
997 | |||
998 | cmp dx,0 ; 1 |
||
999 | jz irqover |
||
1000 | cmp [esi+3],byte 1 ; 2 ; byte read |
||
1001 | jne noirqbyte ; 4-11 |
||
1002 | |||
1003 | in al,dx |
||
1004 | |||
1005 | mov edx,[edi] |
||
1006 | cmp edx,4000 |
||
1007 | je irqfull |
||
1008 | mov ebx,edi |
||
1009 | add ebx,0x10 |
||
1010 | add ebx,edx |
||
1011 | mov [ebx],al |
||
1012 | inc edx |
||
1013 | mov [edi],edx |
||
1014 | |||
1015 | add esi,4 |
||
1016 | jmp irqnewread |
||
1017 | |||
1018 | noirqbyte: |
||
1019 | |||
1020 | |||
1021 | cmp [esi+3],byte 2 ; word read |
||
1022 | jne noirqword |
||
1023 | |||
1024 | in ax,dx |
||
1025 | |||
1026 | mov edx,[edi] |
||
1027 | cmp edx,4000 |
||
1028 | je irqfull |
||
1029 | mov ebx,edi |
||
1030 | add ebx,0x10 |
||
1031 | add ebx,edx |
||
1032 | mov [ebx],ax |
||
1033 | add edx,2 |
||
1034 | mov [edi],edx |
||
1035 | add esi,4 |
||
1036 | jmp irqnewread |
||
1037 | |||
1038 | noirqword: |
||
1039 | irqfull: |
||
1040 | irqover: |
||
1041 | |||
1042 | mov al,0x20 ; ready for next irq |
||
1043 | out 0x20,al |
||
1044 | |||
1045 | pop ebx |
||
1046 | cmp ebx,7 |
||
1047 | jbe noa0 |
||
1048 | out 0xa0,al |
||
1049 | noa0: |
||
1050 | |||
1051 | ret |
||
1052 | |||
1053 | |||
1054 | ; this code should never get control! |
||
1055 | ; applications can use only 0x40 interrupt |
||
1056 | unknown_interrupt: |
||
1057 | @@: call change_task |
||
1058 | jmp @b |
||
1059 | |||
1060 | |||
1061 | |||
1062 | compare_to_thread: |
||
1063 | |||
1064 | push ebx |
||
1065 | |||
1066 | mov eax,edx |
||
1067 | shl eax, 3 |
||
1068 | add eax,gdts+ app_code-3 |
||
1069 | mov ebx,[eax] |
||
1070 | cmp ebx,[old_code_0] |
||
1071 | jne ctt0 |
||
1072 | mov ebx,[eax+4] |
||
1073 | cmp ebx,[old_code_1] |
||
1074 | jne ctt0 |
||
1075 | |||
1076 | pop ebx |
||
1077 | mov eax,1 |
||
1078 | ret |
||
1079 | |||
1080 | ctt0: |
||
1081 | |||
1082 | pop ebx |
||
1083 | mov eax,0 |
||
1084 | ret |
||
1085 | |||
1086 | |||
1087 | |||
1088 | check_for_thread_mem: |
||
1089 | |||
1090 | pusha |
||
1091 | |||
1092 | mov ecx,[0x3004] |
||
1093 | cftm0: |
||
1094 | mov eax,ecx |
||
1095 | shl eax, 8 |
||
1096 | add eax,gdts+ app_code-3 |
||
1097 | mov ebx,[eax] |
||
1098 | cmp ebx,[old_code_0] |
||
1099 | jne cftm1 |
||
1100 | mov ebx,[eax+4] |
||
1101 | cmp ebx,[old_code_1] |
||
1102 | jne cftm1 |
||
1103 | |||
1104 | mov eax,ecx ; new code segments |
||
1105 | shl eax, 3 ;imul eax,8 |
||
1106 | add eax,gdts+ app_code-3 |
||
1107 | |||
1108 | mov ebx,[new_code_0] |
||
1109 | mov [eax],ebx |
||
1110 | mov ebx,[new_code_1] |
||
1111 | mov [eax+4],ebx |
||
1112 | |||
1113 | mov eax,ecx ; new data segments |
||
1114 | shl eax, 3 |
||
1115 | |||
1116 | add eax,gdts+ app_data-3 |
||
1117 | |||
1118 | mov ebx,[new_data_0] |
||
1119 | mov [eax],ebx |
||
1120 | mov ebx,[new_data_1] |
||
1121 | mov [eax+4],ebx |
||
1122 | |||
1123 | cmp [new_pos],0 ; new memory position segments |
||
1124 | je no_new_postition_for_thread |
||
1125 | mov eax,ecx |
||
1126 | shl eax, 5 |
||
1127 | add eax,0x3000 |
||
1128 | mov ebx,[new_pos] |
||
1129 | mov [eax+0x10],ebx |
||
1130 | no_new_postition_for_thread: |
||
1131 | |||
1132 | mov eax,ecx ; new amount of memory |
||
1133 | shl eax, 8 |
||
1134 | add eax,0x80000 |
||
1135 | mov ebx,[new_amount] |
||
1136 | mov [eax+0x8C],ebx |
||
1137 | |||
1138 | cftm1: |
||
1139 | |||
1140 | dec ecx |
||
1141 | jnz cftm0 |
||
1142 | |||
1143 | popa |
||
1144 | |||
1145 | ret |
||
1146 | |||
1147 | |||
1148 | save_for_thread_check: |
||
1149 | |||
1150 | ; save for thread check |
||
1151 | |||
1152 | pusha |
||
1153 | mov esi,[0x3000] |
||
1154 | ;imul esi,8 |
||
1155 | shl esi, 3 |
||
1156 | add esi,gdts+ app_code-3 +0 |
||
1157 | mov edi,old_code_0 |
||
1158 | mov ecx,8 |
||
1159 | cld |
||
1160 | rep movsb |
||
1161 | popa |
||
1162 | |||
1163 | ret |
||
1164 | |||
1165 | |||
1166 | save_new_position_for_threads: |
||
1167 | |||
1168 | ; new code segment for thread check |
||
1169 | pusha |
||
1170 | mov esi,[0x3000] |
||
1171 | ;imul esi,8 |
||
1172 | shl esi, 3 |
||
1173 | add esi,gdts+ app_code-3 +0 |
||
1174 | mov edi,new_code_0 |
||
1175 | mov ecx,8 |
||
1176 | cld |
||
1177 | rep movsb |
||
1178 | popa |
||
1179 | |||
1180 | ; new data segment for thread check |
||
1181 | pusha |
||
1182 | mov esi,[0x3000] |
||
1183 | ;imul esi,8 |
||
1184 | shl esi, 3 |
||
1185 | add esi,gdts+ app_data-3 +0 |
||
1186 | mov edi,new_data_0 |
||
1187 | mov ecx,8 |
||
1188 | cld |
||
1189 | rep movsb |
||
1190 | popa |
||
1191 | |||
1192 | ret |
||
1193 | |||
1194 | set_application_table_status: |
||
1195 | push eax |
||
1196 | |||
1197 | mov eax,[0x3000] |
||
1198 | ;imul eax,32 |
||
1199 | shl eax, 5 |
||
1200 | add eax,0x3000+4 |
||
1201 | mov eax,[eax] |
||
1202 | |||
1203 | mov [application_table_status],eax |
||
1204 | |||
1205 | pop eax |
||
1206 | |||
1207 | ret |
||
1208 | |||
1209 | |||
1210 | clear_application_table_status: |
||
1211 | push eax |
||
1212 | |||
1213 | mov eax,[0x3000] |
||
1214 | ;imul eax,32 |
||
1215 | shl eax, 5 |
||
1216 | add eax,0x3000+4 |
||
1217 | mov eax,[eax] |
||
1218 | |||
1219 | cmp eax,[application_table_status] |
||
1220 | jne apptsl1 |
||
1221 | mov [application_table_status],0 |
||
1222 | apptsl1: |
||
1223 | |||
1224 | pop eax |
||
1225 | |||
1226 | ret |
||
1227 | |||
1228 | uglobal |
||
1229 | old_code_0 dd 0x0 |
||
1230 | old_code_1 dd 0x0 |
||
1231 | |||
1232 | ; |
||
1233 | |||
1234 | new_code_0 dd 0x0 |
||
1235 | new_code_1 dd 0x0 |
||
1236 | |||
1237 | new_data_0 dd 0x0 |
||
1238 | new_data_1 dd 0x0 |
||
1239 | |||
1240 | new_pos dd 0x0 |
||
1241 | new_amount dd 0x0 |
||
1242 | endg |
||
1243 | |||
1244 | |||
1245 | sys_resize_app_memory: |
||
1246 | ; eax = 1 - resize |
||
1247 | ; ebx = new amount of memory |
||
1248 | |||
1249 | cmp eax,1 |
||
1250 | jne no_application_mem_resize |
||
1251 | |||
1252 | mov eax,[0x3010] |
||
1253 | cmp dword [eax+0x10],std_application_base_address |
||
1254 | jz new_mem_resize ;resize for new type of processes |
||
1255 | |||
1256 | add ebx,4095 |
||
1257 | shr ebx,12 |
||
1258 | shl ebx,12 |
||
1259 | mov ebp,ebx |
||
1260 | |||
1261 | ; wait for process table to be free |
||
1262 | |||
1263 | rsm0: |
||
1264 | |||
1265 | cli |
||
1266 | cmp [application_table_status],0 |
||
1267 | je rsm1 |
||
1268 | sti |
||
1269 | call change_task |
||
1270 | jmp rsm0 |
||
1271 | |||
1272 | rsm1: |
||
1273 | |||
1274 | call set_application_table_status |
||
1275 | sti |
||
1276 | |||
1277 | cmp ebx,0 ; other than zero |
||
1278 | je mem_resize_unsuccess |
||
1279 | |||
1280 | call save_for_thread_check |
||
1281 | |||
1282 | ; find a free place |
||
1283 | |||
1284 | mov esi,[0xfe84] ; application memory start |
||
1285 | mov edi,ebp |
||
1286 | add edi,esi |
||
1287 | dec edi |
||
1288 | |||
1289 | rfgdt: |
||
1290 | |||
1291 | mov edx,2 |
||
1292 | |||
1293 | rfindgdtl1: |
||
1294 | |||
1295 | call compare_to_thread |
||
1296 | cmp eax,1 |
||
1297 | je rfindfl3 |
||
1298 | |||
1299 | mov ecx,edx |
||
1300 | shl ecx,3 |
||
1301 | |||
1302 | ; eax run base -> ebx limit |
||
1303 | |||
1304 | mov al,[ecx+gdts+ app_code-3 +4] |
||
1305 | mov ah,[ecx+gdts+ app_code-3 +7] |
||
1306 | shl eax,16 |
||
1307 | mov ax,[ecx+gdts+ app_code-3 +2] |
||
1308 | |||
1309 | ;!!mem |
||
1310 | cmp eax,std_application_base_address |
||
1311 | jz rfindfl3 |
||
1312 | ;!!mem |
||
1313 | |||
1314 | movzx ebx,word [ecx+gdts+ app_code-3 +0] |
||
1315 | shl ebx,12 |
||
1316 | add ebx,eax |
||
1317 | |||
1318 | cmp eax,edi |
||
1319 | jg rfindfl3 |
||
1320 | cmp ebx,esi |
||
1321 | jb rfindfl3 |
||
1322 | |||
1323 | add esi,4096 |
||
1324 | add edi,4096 |
||
1325 | |||
1326 | cmp edi,[0xfe8c] ; < c_memory |
||
1327 | jbe rfgdt |
||
1328 | |||
1329 | jmp rfind_free_ret_2 ;; not enough memory |
||
1330 | |||
1331 | rfindfl3: |
||
1332 | |||
1333 | inc edx |
||
1334 | cmp edx,[0x3004] |
||
1335 | jbe rfindgdtl1 |
||
1336 | |||
1337 | rfindfl1: |
||
1338 | rthread_c: |
||
1339 | |||
1340 | mov ecx,[0x3000] |
||
1341 | shl ecx,3 |
||
1342 | |||
1343 | inc edi |
||
1344 | sub edi,esi |
||
1345 | add edi,4095 |
||
1346 | shr edi,12 |
||
1347 | dec edi |
||
1348 | |||
1349 | ; code |
||
1350 | |||
1351 | mov eax,esi |
||
1352 | mov ebx,edi |
||
1353 | |||
1354 | mov [ecx+gdts+ app_code-3 +2], ax ; base 0:15 |
||
1355 | shr eax,16 |
||
1356 | mov [ecx+gdts+ app_code-3 +4], al ; base 23:16 |
||
1357 | mov [ecx+gdts+ app_code-3 +7], ah ; base 31:24 |
||
1358 | mov [ecx+gdts+ app_code-3 +0], bx ; limit |
||
1359 | |||
1360 | ; data |
||
1361 | |||
1362 | mov eax,esi |
||
1363 | mov [ecx+gdts+ app_data-3 +2], ax ; base 0:15 |
||
1364 | shr eax,16 |
||
1365 | mov [ecx+gdts+ app_data-3 +4], al ; base 23:16 |
||
1366 | mov [ecx+gdts+ app_data-3 +7], ah ; base 31:24 |
||
1367 | |||
1368 | movzx edx,word [ecx+gdts+ app_code-3 +0] ; save limit |
||
1369 | |||
1370 | mov [ecx+gdts+ app_data-3 +0], bx ; limit |
||
1371 | |||
1372 | and ebx,0xffff |
||
1373 | |||
1374 | cmp ebx,edx ; copy smaller from memory sizes |
||
1375 | jge noedxebxxchg |
||
1376 | mov edx,ebx |
||
1377 | noedxebxxchg: |
||
1378 | |||
1379 | movzx ecx,dx |
||
1380 | shl ecx,12 |
||
1381 | add ecx,4096 |
||
1382 | |||
1383 | mov edi,esi |
||
1384 | |||
1385 | mov eax,[0x3010] |
||
1386 | mov esi,[eax+0x10] |
||
1387 | |||
1388 | mov [eax+0x10],edi ; new memory position |
||
1389 | |||
1390 | mov eax,[0x3000] ; new memory size |
||
1391 | shl eax,8 |
||
1392 | add eax,0x80000 |
||
1393 | mov [eax+0x8c],ebp |
||
1394 | |||
1395 | mov [new_pos],edi ; new position for threads |
||
1396 | mov [new_amount],ebp ; new amount of mem for threads |
||
1397 | |||
1398 | cmp esi,edi |
||
1399 | je no_app_move |
||
1400 | |||
1401 | cld |
||
1402 | rep movsb ; move the app image to the new position |
||
1403 | |||
1404 | no_app_move: |
||
1405 | |||
1406 | call save_new_position_for_threads |
||
1407 | call check_for_thread_mem |
||
1408 | |||
1409 | mov [application_table_status],0 |
||
1410 | |||
1411 | mov [esp+36],dword 0 ; eax <- 0 ; successfull |
||
1412 | |||
1413 | ret |
||
1414 | |||
1415 | rfind_free_ret_2: |
||
1416 | |||
1417 | mem_resize_unsuccess: |
||
1418 | |||
1419 | mov [application_table_status],0 |
||
1420 | |||
1421 | mov [esp+36],dword 1 ; eax <- 1 ; unsuccessfull |
||
1422 | |||
1423 | ret |
||
1424 | |||
1425 | no_application_mem_resize: |
||
1426 | |||
1427 | |||
1428 | ret |
||
1429 | |||
1430 | |||
1431 | align 4 |
||
1432 | find_free_mem: |
||
1433 | |||
1434 | push eax |
||
1435 | push ebx |
||
1436 | push ecx |
||
1437 | push edx |
||
1438 | push edi |
||
1439 | |||
1440 | call find_free_process_slot |
||
1441 | mov eax,[new_process_place] |
||
1442 | |||
1443 | cmp eax,max_processes |
||
1444 | jg find_free_ret_2 |
||
1445 | |||
1446 | cmp [thread_create],1 |
||
1447 | je thread_c |
||
1448 | |||
1449 | mov esi,[0xfe84] |
||
1450 | add edi,esi |
||
1451 | dec edi |
||
1452 | |||
1453 | mov eax,2 |
||
1454 | cmp dword [0x3004],1 |
||
1455 | je findf4 |
||
1456 | |||
1457 | fgdt: |
||
1458 | |||
1459 | mov edx,2 |
||
1460 | |||
1461 | findgdtl1: |
||
1462 | |||
1463 | mov ecx,edx |
||
1464 | shl ecx,3 |
||
1465 | |||
1466 | ; eax run base -> ebx limit |
||
1467 | |||
1468 | mov al,[ecx+gdts+ app_code-3 +4] |
||
1469 | mov ah,[ecx+gdts+ app_code-3 +7] |
||
1470 | shl eax,16 |
||
1471 | mov ax,[ecx+gdts+ app_code-3 +2] |
||
1472 | ;!!mem |
||
1473 | cmp eax,std_application_base_address |
||
1474 | jz findfl3 |
||
1475 | ;!!mem |
||
1476 | |||
1477 | movzx ebx,word [ecx+gdts+ app_code-3 +0] |
||
1478 | shl ebx,12 |
||
1479 | add ebx,eax |
||
1480 | |||
1481 | cmp eax,edi |
||
1482 | jg findfl3 |
||
1483 | cmp ebx,esi |
||
1484 | jb findfl3 |
||
1485 | |||
1486 | add esi,4096 |
||
1487 | add edi,4096 |
||
1488 | |||
1489 | cmp edi,[0xfe8c] ; < c_memory |
||
1490 | jbe fgdt |
||
1491 | |||
1492 | jmp find_free_ret_2 |
||
1493 | |||
1494 | findfl3: |
||
1495 | |||
1496 | inc edx |
||
1497 | cmp edx,[check_processes] |
||
1498 | jbe findgdtl1 |
||
1499 | |||
1500 | findfl1: |
||
1501 | thread_c: |
||
1502 | |||
1503 | mov eax,[new_process_place] |
||
1504 | |||
1505 | findf4: |
||
1506 | |||
1507 | mov [first_gdt_search],eax |
||
1508 | mov [gdt_place],eax |
||
1509 | |||
1510 | mov ecx,eax |
||
1511 | shl ecx,3 |
||
1512 | |||
1513 | inc edi |
||
1514 | sub edi,esi |
||
1515 | add edi,4095 |
||
1516 | shr edi,12 |
||
1517 | dec edi |
||
1518 | |||
1519 | ; code |
||
1520 | |||
1521 | mov eax,esi |
||
1522 | mov ebx,edi |
||
1523 | |||
1524 | mov [ecx+gdts+ app_code-3 +2], ax ; base 0:15 |
||
1525 | shr eax,16 |
||
1526 | mov [ecx+gdts+ app_code-3 +4], al ; base 23:16 |
||
1527 | mov [ecx+gdts+ app_code-3 +7], ah ; base 31:24 |
||
1528 | mov [ecx+gdts+ app_code-3 +0], bx ; limit |
||
1529 | mov [ecx+gdts+ app_code-3 +5], word 11010000b *256 +11111010b |
||
1530 | |||
1531 | ; data |
||
1532 | |||
1533 | mov eax,esi |
||
1534 | mov [ecx+gdts+ app_data-3 +2], ax ; base 0:15 |
||
1535 | shr eax,16 |
||
1536 | mov [ecx+gdts+ app_data-3 +4], al ; base 23:16 |
||
1537 | mov [ecx+gdts+ app_data-3 +7], ah ; base 31:24 |
||
1538 | mov [ecx+gdts+ app_data-3 +0], bx ; limit |
||
1539 | mov [ecx+gdts+ app_data-3 +5], word 11010000b *256 +11110010b |
||
1540 | |||
1541 | push esi |
||
1542 | mov esi,process_loading |
||
1543 | call sys_msg_board_str |
||
1544 | pop esi |
||
1545 | |||
1546 | find_free_ret: |
||
1547 | |||
1548 | pop edi |
||
1549 | pop edx |
||
1550 | pop ecx |
||
1551 | pop ebx |
||
1552 | pop eax |
||
1553 | ret |
||
1554 | |||
1555 | find_free_ret_2: |
||
1556 | |||
1557 | cmp [dec3004],0 |
||
1558 | je no3004inc |
||
1559 | dec dword [0x3004] |
||
1560 | no3004inc: |
||
1561 | |||
1562 | pop edi |
||
1563 | pop edx |
||
1564 | pop ecx |
||
1565 | pop ebx |
||
1566 | pop eax |
||
1567 | mov esi,0 |
||
1568 | ret |
||
1569 | |||
1570 | |||
1571 | get_app_params: |
||
1572 | |||
1573 | push eax |
||
1574 | |||
1575 | cmp [0x90000+6],word '00' |
||
1576 | jne no_00_header |
||
1577 | |||
1578 | mov eax,[0x90000+12] |
||
1579 | mov [app_start],eax |
||
1580 | mov eax,[0x90000+16] |
||
1581 | mov [app_i_end],eax |
||
1582 | mov eax,[0x90000+20] |
||
1583 | mov [app_mem],eax |
||
1584 | shr eax,1 |
||
1585 | sub eax,0x10 |
||
1586 | mov [app_esp],eax |
||
1587 | mov eax,[0x90000+24] |
||
1588 | mov [app_i_param],eax |
||
1589 | mov [app_i_icon],dword 0 |
||
1590 | |||
1591 | pop eax |
||
1592 | mov esi,1 |
||
1593 | ret |
||
1594 | |||
1595 | no_00_header: |
||
1596 | |||
1597 | |||
1598 | cmp [0x90000+6],word '01' |
||
1599 | jne no_01_header |
||
1600 | |||
1601 | mov eax,[0x90000+12] |
||
1602 | mov [app_start],eax |
||
1603 | mov eax,[0x90000+16] |
||
1604 | mov [app_i_end],eax |
||
1605 | mov eax,[0x90000+20] |
||
1606 | mov [app_mem],eax |
||
1607 | mov eax,[0x90000+24] |
||
1608 | mov [app_esp],eax |
||
1609 | mov eax,[0x90000+28] |
||
1610 | mov [app_i_param],eax |
||
1611 | mov eax,[0x90000+32] |
||
1612 | mov [app_i_icon],eax |
||
1613 | |||
1614 | pop eax |
||
1615 | mov esi,1 |
||
1616 | ret |
||
1617 | |||
1618 | no_01_header: |
||
1619 | |||
1620 | pop eax |
||
1621 | mov esi,0 |
||
1622 | ret |
||
1623 | |||
1624 | |||
1625 | start_application_fl: |
||
1626 | jmp new_start_application_fl |
||
1627 | |||
1628 | ;************************************************************************ |
||
1629 | |||
1630 | start_application_floppy: |
||
1631 | jmp new_start_application_floppy |
||
1632 | |||
1633 | ;******************************************************************** |
||
1634 | |||
1635 | start_application_hd: |
||
1636 | jmp new_start_application_hd |
||
1637 | |||
1638 | uglobal |
||
1639 | threadstring dd 0x0 |
||
1640 | new_process_place dd 0x0 |
||
1641 | check_processes dd 0x0 |
||
1642 | dec3004 db 0x0 |
||
1643 | app_start dd 0x0 |
||
1644 | app_i_end dd 0x0 |
||
1645 | app_mem dd 0x0 |
||
1646 | app_esp dd 0x0 |
||
1647 | app_i_param dd 0x0 |
||
1648 | app_i_icon dd 0x0 |
||
1649 | app_mem_pos dd 0x0 |
||
1650 | thread_create dd 0x0 |
||
1651 | gdt_place dd 0x0 |
||
1652 | endg |
||
1653 | |||
1654 | iglobal |
||
1655 | hd_app_string db 'HDAPP ' |
||
1656 | process_loading db 'K : Process - loading ',13,10,0 |
||
1657 | process_running db 'K : Process - done',13,10,0 |
||
1658 | first_gdt_search dd 0x2 |
||
1659 | endg |
||
1660 | |||
1661 | |||
1662 | sys_threads: |
||
1663 | |||
1664 | ; eax=1 create thread |
||
1665 | ; |
||
1666 | ; ebx=thread start |
||
1667 | ; ecx=thread stack value |
||
1668 | ; |
||
1669 | ; on return : eax = pid |
||
1670 | jmp new_sys_threads |
||
1671 | cli |
||
1672 | cmp [application_table_status],0 |
||
1673 | je stth9 |
||
1674 | sti |
||
1675 | call change_task |
||
1676 | jmp sys_threads |
||
1677 | stth9: |
||
1678 | |||
1679 | call set_application_table_status |
||
1680 | |||
1681 | sti |
||
1682 | |||
1683 | cmp eax,1 |
||
1684 | jne no_sys_thread_create |
||
1685 | cli |
||
1686 | |||
1687 | mov eax,[0x3010] |
||
1688 | mov eax,[eax+0x10] |
||
1689 | mov [app_mem_pos],eax |
||
1690 | |||
1691 | mov [app_i_param],0 |
||
1692 | mov [app_i_icon],0 |
||
1693 | |||
1694 | mov [app_start],ebx |
||
1695 | mov [app_esp],ecx |
||
1696 | |||
1697 | mov ebx,[0x3000] |
||
1698 | shl ebx,8 |
||
1699 | add ebx,0x80000 |
||
1700 | mov [threadstring],ebx |
||
1701 | mov ebx,[ebx+0x8c] |
||
1702 | mov [app_mem],ebx |
||
1703 | |||
1704 | mov esi,[app_mem_pos] |
||
1705 | mov edi,[app_mem] |
||
1706 | add edi,esi |
||
1707 | dec edi |
||
1708 | mov [thread_create],1 |
||
1709 | call find_free_mem |
||
1710 | cmp esi,0 |
||
1711 | jne th_cr1 |
||
1712 | mov [application_table_status],0 |
||
1713 | mov eax,1 ; no free memory |
||
1714 | sti |
||
1715 | ret |
||
1716 | th_cr1: |
||
1717 | push dword 0 |
||
1718 | push dword [threadstring] |
||
1719 | jmp add_app_parameters |
||
1720 | no_sys_thread_create: |
||
1721 | |||
1722 | mov eax,-1 |
||
1723 | mov [application_table_status],0 |
||
1724 | ret |
||
1725 | |||
1726 | |||
1727 | find_free_process_slot: |
||
1728 | |||
1729 | pusha |
||
1730 | |||
1731 | mov ebx,[0x3004] |
||
1732 | mov [check_processes],ebx |
||
1733 | inc ebx |
||
1734 | mov [new_process_place],ebx |
||
1735 | |||
1736 | mov ebx,2 |
||
1737 | |||
1738 | newfps: |
||
1739 | |||
1740 | mov eax,ebx |
||
1741 | ;imul eax,0x20 |
||
1742 | shl eax, 5 |
||
1743 | add eax,0x3000+0xa |
||
1744 | cmp [eax],byte 9 |
||
1745 | je ffpl |
||
1746 | |||
1747 | inc ebx |
||
1748 | cmp ebx,[0x3004] |
||
1749 | jbe newfps |
||
1750 | |||
1751 | ;mov [dec3004],0 |
||
1752 | mov [dec3004],1 |
||
1753 | shl ebx,5 |
||
1754 | mov [0x3000+0xa+ebx],byte 9 |
||
1755 | inc dword [0x3004] |
||
1756 | |||
1757 | popa |
||
1758 | ret |
||
1759 | |||
1760 | ffpl: |
||
1761 | |||
1762 | ;mov [dec3004],1 |
||
1763 | ;dec dword [0x3004] |
||
1764 | mov [dec3004],0 |
||
1765 | mov [new_process_place],ebx |
||
1766 | |||
1767 | popa |
||
1768 | ret |
||
1769 | |||
1770 | |||
1771 | add_app_parameters: |
||
1772 | ; returns: eax = pid or -1 if unsuccesfull |
||
1773 | cmp [app_i_param],dword 0 ; parameter |
||
1774 | jz no_app_params |
||
1775 | xor eax, eax |
||
1776 | mov edi,[app_i_param] |
||
1777 | add edi,[app_mem_pos] |
||
1778 | mov ecx,256/4 |
||
1779 | cld |
||
1780 | rep stosd |
||
1781 | mov esi,[esp+4] |
||
1782 | test esi, esi |
||
1783 | jz no_app_params |
||
1784 | mov eax,[app_i_param] |
||
1785 | add eax,[app_mem_pos] |
||
1786 | mov edi,eax |
||
1787 | mov ecx,256 |
||
1788 | cld |
||
1789 | app_new_param: |
||
1790 | cmp [esi],byte 0 |
||
1791 | jz no_app_params |
||
1792 | movsb |
||
1793 | loop app_new_param |
||
1794 | no_app_params: |
||
1795 | |||
1796 | ;inc dword [0x3004] ; increase number of processes |
||
1797 | mov ebx,[new_process_place] |
||
1798 | |||
1799 | mov edi,ebx ; clear 0x80000 (256 bytes) |
||
1800 | shl edi,8 |
||
1801 | add edi,0x80000 |
||
1802 | mov ecx,256 / 4 |
||
1803 | mov eax,0 |
||
1804 | cld |
||
1805 | rep stosd |
||
1806 | |||
1807 | shl ebx,5 ; * 32 +0x3000 |
||
1808 | add ebx,0x3000 |
||
1809 | |||
1810 | mov al,byte [new_process_place] ; screen id ? |
||
1811 | mov [ebx+0xe],al |
||
1812 | |||
1813 | mov [ebx],dword 1+2+4 ; report events: windowdraw, key, button |
||
1814 | |||
1815 | inc dword [process_number] ; process id number |
||
1816 | mov eax,[process_number] |
||
1817 | mov [ebx+4],eax |
||
1818 | |||
1819 | mov ecx,ebx ; set draw limits |
||
1820 | add ecx,draw_data-0x3000 |
||
1821 | mov [ecx+0],dword 0 |
||
1822 | mov [ecx+4],dword 0 |
||
1823 | mov eax,[0xfe00] |
||
1824 | mov [ecx+8],eax |
||
1825 | mov eax,[0xfe04] |
||
1826 | mov [ecx+12],eax |
||
1827 | |||
1828 | mov eax,[app_mem_pos] ; position in memory |
||
1829 | mov [ebx+0x10],eax |
||
1830 | |||
1831 | ; TSS |
||
1832 | xor ebx,ebx |
||
1833 | cmp [thread_create],ebx |
||
1834 | jnz clone_cr3_table |
||
1835 | mov eax,[new_process_place] |
||
1836 | call create_app_cr3_table |
||
1837 | jmp set_cr3 |
||
1838 | clone_cr3_table: |
||
1839 | ; mov eax,[new_process_place] |
||
1840 | ; mov ebx,[0x3000] |
||
1841 | ; call addreference_app_cr3_table |
||
1842 | mov eax,[0x3000] |
||
1843 | call get_cr3_table |
||
1844 | set_cr3: |
||
1845 | add eax,8+16 |
||
1846 | mov [l.cr3],eax |
||
1847 | |||
1848 | mov eax,[app_start] |
||
1849 | mov [l.eip],eax |
||
1850 | mov eax,[app_esp] |
||
1851 | mov [l.esp],eax |
||
1852 | |||
1853 | mov ebx,[new_process_place] ; gdt's |
||
1854 | shl ebx,3 |
||
1855 | |||
1856 | mov ax,app_code |
||
1857 | add ax,bx |
||
1858 | mov [l.cs],ax |
||
1859 | mov ax,app_data |
||
1860 | add ax,bx |
||
1861 | mov [l.ss],ax |
||
1862 | mov [l.ds],ax |
||
1863 | mov [l.es],ax |
||
1864 | mov [l.fs],ax |
||
1865 | mov ax,graph_data |
||
1866 | mov [l.gs],ax |
||
1867 | mov [l.io],word 128 |
||
1868 | mov [l.eflags],dword 0x11202 |
||
1869 | mov [l.ss0], os_data |
||
1870 | ;mov [l.ss1], ring1_data |
||
1871 | ;mov [l.ss2], ring2_data |
||
1872 | ; [Ivan 07.03.2005] |
||
1873 | mov [l.esp0], 0x8000 ;0x55000 ; used by i38 handler |
||
1874 | ; [/Ivan 07.03.2005] |
||
1875 | mov [l.esp1], 0x56000 |
||
1876 | mov [l.esp2], 0x57000 |
||
1877 | |||
1878 | mov eax,tss_sceleton ; move tss to tss_data+ |
||
1879 | mov ebx,[new_process_place] |
||
1880 | imul ebx,tss_step |
||
1881 | add ebx,tss_data |
||
1882 | mov ecx,120 |
||
1883 | call memmove |
||
1884 | |||
1885 | |||
1886 | ; Add IO access table |
||
1887 | |||
1888 | or eax, -1 |
||
1889 | mov edi, [new_process_place] |
||
1890 | imul edi, tss_step |
||
1891 | add edi, tss_data + 128 |
||
1892 | mov ecx, 2048 ; for 2048 * 4 * 8 bits = 65536 ports |
||
1893 | cld |
||
1894 | rep stosd |
||
1895 | |||
1896 | ; make sure gdt is pointing to the process |
||
1897 | ; and not to i40 handler |
||
1898 | |||
1899 | mov ecx,ebx |
||
1900 | mov edi,[new_process_place] |
||
1901 | ; imul edi,8 |
||
1902 | shl edi, 3 |
||
1903 | |||
1904 | mov [edi+gdts+ tss0 +0], word tss_step ; limit 0:15 |
||
1905 | mov [edi+gdts+ tss0 +2], cx ; base 0:15 |
||
1906 | mov eax,ecx |
||
1907 | shr eax,16 |
||
1908 | mov [edi+gdts+ tss0 +4], al ; base 23:16 |
||
1909 | mov [edi+gdts+ tss0 +7], ah ; base 31:24 |
||
1910 | mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b |
||
1911 | |||
1912 | pop eax |
||
1913 | pop ebx |
||
1914 | |||
1915 | mov ebx,[new_process_place] ; save name of the process |
||
1916 | shl ebx,8 |
||
1917 | add ebx,0x80000 |
||
1918 | mov ecx,11 |
||
1919 | call memmove |
||
1920 | |||
1921 | mov ebx,[new_process_place] ; save image size |
||
1922 | shl ebx,8 |
||
1923 | add ebx,0x80000+0x8C |
||
1924 | mov eax,[app_mem] |
||
1925 | mov [ebx],eax |
||
1926 | |||
1927 | mov [0xf400],byte 0 ; empty keyboard buffer |
||
1928 | mov [0xf500],byte 0 ; empty button buffer |
||
1929 | |||
1930 | mov [application_table_status],0 |
||
1931 | mov eax,[process_number] |
||
1932 | |||
1933 | mov ebx,[new_process_place] |
||
1934 | shl ebx, 5 ;imul ebx,0x20 |
||
1935 | mov [0x3000+ebx+0xa],byte 0 |
||
1936 | |||
1937 | mov edi,[new_process_place] |
||
1938 | shl edi,5 |
||
1939 | add edi,window_data |
||
1940 | |||
1941 | mov ebx,[new_process_place] |
||
1942 | movzx esi, word [0xC000 + ebx*2] |
||
1943 | lea esi, [0xC400 + esi*2] |
||
1944 | call windowactivate |
||
1945 | |||
1946 | sti |
||
1947 | |||
1948 | push esi |
||
1949 | mov esi,process_running |
||
1950 | call sys_msg_board_str |
||
1951 | pop esi |
||
1952 | |||
1953 | ret |
||
1954 | |||
1955 | iglobal |
||
1956 | process_terminating db 'K : Process - terminating',13,10,0 |
||
1957 | process_terminated db 'K : Process - done',13,10,0 |
||
1958 | endg |
||
1959 | |||
1960 | |||
1961 | terminate: ; terminate application |
||
1962 | push esi |
||
1963 | mov esi,process_terminating |
||
1964 | call sys_msg_board_str |
||
1965 | pop esi |
||
1966 | ;start memory manager code |
||
1967 | ; mov eax,esi |
||
1968 | ; call MEM_Heap_Clean |
||
1969 | ;end memory manager code |
||
1970 | |||
1971 | |||
1972 | cli |
||
1973 | cmp [application_table_status],0 |
||
1974 | je term9 |
||
1975 | sti |
||
1976 | call change_task |
||
1977 | jmp terminate |
||
1978 | term9: |
||
1979 | |||
1980 | call set_application_table_status |
||
1981 | |||
1982 | mov eax,esi |
||
1983 | call dispose_app_cr3_table |
||
1984 | |||
1985 | mov [first_gdt_search],0x2 ; start gdt search from beginning |
||
1986 | |||
1987 | cmp [prev_user_of_fpu],esi ; if user fpu last -> fpu user = 1 |
||
1988 | jne fpu_ok_1 |
||
1989 | mov [prev_user_of_fpu],1 |
||
1990 | fpu_ok_1: |
||
1991 | |||
1992 | mov [0xf400],byte 0 ; empty keyboard buffer |
||
1993 | mov [0xf500],byte 0 ; empty button buffer |
||
1994 | |||
1995 | mov ecx,esi ; clear memory reserv. |
||
1996 | shl ecx,3 |
||
1997 | mov [ecx+gdts+ app_code-3 +0],dword 0 |
||
1998 | mov [ecx+gdts+ app_code-3 +4],dword 0 |
||
1999 | mov [ecx+gdts+ app_data-3 +0],dword 0 |
||
2000 | mov [ecx+gdts+ app_data-3 +4],dword 0 |
||
2001 | |||
2002 | mov edi, esi |
||
2003 | ; shl edi, 5 |
||
2004 | ; add edi, 0x3000 |
||
2005 | ; cmp [edi+0xa],byte 3 ; if normal terminate then clear int40 handler |
||
2006 | ; jne nocl40 |
||
2007 | |||
2008 | ; mov edi,esi ; free the used interrupt 0x40 handler |
||
2009 | ; shl edi, 8 ;imul edi,256 |
||
2010 | ; mov eax,[edi+0x80000+0xb0] |
||
2011 | |||
2012 | ; cmp eax,0 ; is application using a systemcall interrupt ? |
||
2013 | ; je nocl40 |
||
2014 | |||
2015 | mov [usedi40+eax],byte 0 |
||
2016 | |||
2017 | ; mov edi,8 |
||
2018 | ; imul edi,eax |
||
2019 | mov edi, eax |
||
2020 | shl edi, 3 |
||
2021 | mov [edi+tss0sys_l +5], word 01010000b *256 +11101001b |
||
2022 | |||
2023 | ; mov edi,128 |
||
2024 | ; imul edi,eax |
||
2025 | mov edi, eax |
||
2026 | shl edi, 7 |
||
2027 | mov [edi+0x298000+l.eip-tss_sceleton],dword i40 |
||
2028 | mov [edi+0x298000+l.eflags-tss_sceleton],dword 0x11002 |
||
2029 | |||
2030 | mov ebx,eax |
||
2031 | shl ebx, 12 ;imul ebx,4096 |
||
2032 | add ebx,sysint_stack_data |
||
2033 | mov [edi+0x298000+l.esp-tss_sceleton],ebx |
||
2034 | |||
2035 | nocl40: |
||
2036 | |||
2037 | mov ecx,esi ; remove buttons |
||
2038 | bnewba2: |
||
2039 | mov edi,[0xfe88] |
||
2040 | mov eax,edi |
||
2041 | cld |
||
2042 | movzx ebx,word [edi] |
||
2043 | inc bx |
||
2044 | bnewba: |
||
2045 | dec bx |
||
2046 | jz bnmba |
||
2047 | add eax,0x10 |
||
2048 | cmp cx,[eax] |
||
2049 | jnz bnewba |
||
2050 | pusha |
||
2051 | mov ecx,ebx |
||
2052 | inc ecx |
||
2053 | shl ecx,4 |
||
2054 | mov ebx,eax |
||
2055 | add eax,0x10 |
||
2056 | call memmove |
||
2057 | dec dword [edi] |
||
2058 | popa |
||
2059 | jmp bnewba2 |
||
2060 | bnmba: |
||
2061 | |||
2062 | pusha ; save window coordinates for window restoring |
||
2063 | cld |
||
2064 | shl esi,5 |
||
2065 | add esi,window_data |
||
2066 | mov ax,[esi+0] |
||
2067 | mov word [dlx],ax |
||
2068 | mov bx,[esi+8] |
||
2069 | add ax,bx |
||
2070 | mov word [dlxe],ax |
||
2071 | mov ax,[esi+4] |
||
2072 | mov word [dly],ax |
||
2073 | mov bx,[esi+12] |
||
2074 | add ax,bx |
||
2075 | mov word [dlye],ax |
||
2076 | mov [esi+0],word 0 |
||
2077 | mov [esi+8],word 5 |
||
2078 | mov ax,[0xFE04] |
||
2079 | mov [esi+4],ax |
||
2080 | mov [esi+12],word 5 |
||
2081 | xor eax, eax |
||
2082 | mov [esi+16],eax;dword 0 |
||
2083 | mov [esi+20],eax;dword 0 |
||
2084 | mov [esi+24],eax;dword 0 |
||
2085 | mov [esi+28],eax;dword 0 |
||
2086 | popa |
||
2087 | |||
2088 | pusha |
||
2089 | mov edi,esi |
||
2090 | shl edi,5 |
||
2091 | add edi,window_data |
||
2092 | mov ecx,32/4 |
||
2093 | xor eax, eax |
||
2094 | ; cld |
||
2095 | rep stosd |
||
2096 | |||
2097 | mov eax,[0xFE04] ; set window to start from maxy+1 |
||
2098 | add eax,2 |
||
2099 | |||
2100 | mov edi,esi |
||
2101 | shl edi,5 |
||
2102 | add edi,window_data |
||
2103 | mov [edi+4],eax |
||
2104 | |||
2105 | popa |
||
2106 | |||
2107 | pusha |
||
2108 | mov edi,esi |
||
2109 | shl edi,5 |
||
2110 | add edi,draw_data |
||
2111 | mov ecx,32/4 |
||
2112 | xor eax, eax |
||
2113 | ; cld |
||
2114 | rep stosd |
||
2115 | popa |
||
2116 | |||
2117 | pusha ; at 0x80000+ |
||
2118 | mov edi,esi |
||
2119 | shl edi,8 |
||
2120 | add edi,0x80000 |
||
2121 | mov ecx,256/4 |
||
2122 | xor eax, eax |
||
2123 | ; cld |
||
2124 | rep stosd |
||
2125 | popa |
||
2126 | |||
2127 | pusha ; name to spaces |
||
2128 | mov edi,esi |
||
2129 | shl edi,8 |
||
2130 | add edi,0x80000 |
||
2131 | mov ecx,11 |
||
2132 | mov eax,' ' |
||
2133 | ; cld |
||
2134 | rep stosb |
||
2135 | popa |
||
2136 | |||
2137 | pusha ; C000 --> C400 |
||
2138 | mov eax, 0xc000 |
||
2139 | mov esi, 0 |
||
2140 | nlc40: |
||
2141 | add eax, 2 |
||
2142 | inc esi |
||
2143 | cmp esi, [0x3004] |
||
2144 | jae nlc41 |
||
2145 | movzx ecx, word [eax] |
||
2146 | mov [0xC400 + ecx*2], si |
||
2147 | jmp nlc40 |
||
2148 | nlc41: |
||
2149 | ; ivan 08.12.2004 begin |
||
2150 | ;mov ebx, [0x3004] |
||
2151 | ;dec ebx |
||
2152 | ;lea esi, [0xC400 + ebx*2] |
||
2153 | ;call windowactivate |
||
2154 | ; ivan 08.12.2004 end |
||
2155 | popa |
||
2156 | |||
2157 | pusha ; remove hd1 reservation |
||
2158 | mov edx,esi |
||
2159 | shl edx, 5 ;imul edx,0x20 |
||
2160 | add edx,0x3000 |
||
2161 | mov edx,[edx+4] |
||
2162 | cmp [hd1_status],edx |
||
2163 | jne no_hd1_s_remove |
||
2164 | mov [hd1_status],0 |
||
2165 | no_hd1_s_remove: |
||
2166 | popa |
||
2167 | |||
2168 | pusha ; remove all irq reservations |
||
2169 | mov edx,esi |
||
2170 | shl edx, 5 ;imul edx,0x20 |
||
2171 | add edx,0x3000 |
||
2172 | mov edx,[edx+4] |
||
2173 | mov edi,irq_owner |
||
2174 | mov ecx,16 |
||
2175 | newirqfree: |
||
2176 | cmp [edi],edx |
||
2177 | jne nofreeirq |
||
2178 | mov [edi],dword 0 |
||
2179 | nofreeirq: |
||
2180 | add edi,4 |
||
2181 | loop newirqfree |
||
2182 | popa |
||
2183 | |||
2184 | |||
2185 | pusha ; remove all port reservations |
||
2186 | |||
2187 | mov edx,esi |
||
2188 | shl edx, 5 ;imul edx,0x20 |
||
2189 | add edx,0x3000 |
||
2190 | mov edx,[edx+4] |
||
2191 | |||
2192 | rmpr0: |
||
2193 | |||
2194 | mov esi,[0x2d0000] |
||
2195 | |||
2196 | cmp esi,0 |
||
2197 | je rmpr9 |
||
2198 | |||
2199 | rmpr3: |
||
2200 | |||
2201 | mov edi,esi |
||
2202 | shl edi,4 |
||
2203 | add edi,0x2d0000 |
||
2204 | |||
2205 | cmp edx,[edi] |
||
2206 | je rmpr4 |
||
2207 | |||
2208 | dec esi |
||
2209 | jnz rmpr3 |
||
2210 | |||
2211 | jmp rmpr9 |
||
2212 | |||
2213 | rmpr4: |
||
2214 | |||
2215 | mov ecx,256 |
||
2216 | sub ecx,esi |
||
2217 | shl ecx,4 |
||
2218 | |||
2219 | mov esi,edi |
||
2220 | add esi,16 |
||
2221 | cld |
||
2222 | rep movsb |
||
2223 | |||
2224 | dec dword [0x2d0000] |
||
2225 | |||
2226 | jmp rmpr0 |
||
2227 | |||
2228 | rmpr9: |
||
2229 | |||
2230 | popa |
||
2231 | mov edi,esi ; do not run this process slot |
||
2232 | shl edi, 5 ;imul edi,0x20 |
||
2233 | ; add edi,0x3000 |
||
2234 | mov [edi+0x300A],byte 9 |
||
2235 | ; call systest |
||
2236 | sti ; .. and life goes on |
||
2237 | |||
2238 | ; movzx eax,word [dlx] |
||
2239 | ; movzx ebx,word [dly] |
||
2240 | ; movzx ecx,word [dlxe] |
||
2241 | ; movzx edx,word [dlye] |
||
2242 | call calculatescreen |
||
2243 | |||
2244 | xor eax, eax |
||
2245 | xor esi, esi |
||
2246 | call redrawscreen |
||
2247 | |||
2248 | mov [0xfff4],byte 0 ; no mouse background |
||
2249 | mov [0xfff5],byte 0 ; draw mouse |
||
2250 | |||
2251 | mov [application_table_status],0 |
||
2252 | |||
2253 | mov esi,process_terminated |
||
2254 | call sys_msg_board_str |
||
2255 | |||
2256 | ;* start code - fix error redraw for terminate (2) - Mario79 |
||
2257 | ; cmp [draw_present],1 |
||
2258 | ; je no_draw_background_temp |
||
2259 | ; mov [0xfff0],byte 1 |
||
2260 | ;no_draw_background_temp: |
||
2261 | ; mov [draw_present],0 |
||
2262 | ret |
||
2263 | ;draw_present db 0 |
||
2264 | ;* end code - fix error redraw for terminate (2) - Mario79 |
||
2265 | |||
2266 | iglobal |
||
2267 | boot_sched_1 db 'Building gdt tss pointer',0 |
||
2268 | ;boot_sched_2 db 'Building gdt gate pointer',0 |
||
2269 | boot_sched_3 db 'Building interrupt table - TSS',0 |
||
2270 | boot_sched_3_2 db 'Building interrupt table - GDT',0 |
||
2271 | boot_sched_3_3 db 'Building interrupt table - IDT',0 |
||
2272 | boot_sched_4 db 'Building syscall interrupt table',0 |
||
2273 | endg |
||
2274 | |||
2275 | |||
2276 | build_scheduler: |
||
2277 | ; { Ivan 06.03.2005 |
||
2278 | mov edi, usedi40 |
||
2279 | mov ecx, 256/4 |
||
2280 | xor eax, eax |
||
2281 | rep stosd |
||
2282 | ; } Ivan 06.03.2005 |
||
2283 | |||
2284 | mov esi,boot_sched_1 |
||
2285 | call boot_log |
||
2286 | call build_process_gdt_tss_pointer |
||
2287 | |||
2288 | ; mov esi,boot_sched_2 |
||
2289 | ; call boot_log |
||
2290 | ; call build_process_gdt_gate_pointer |
||
2291 | |||
2292 | mov esi,boot_sched_3 |
||
2293 | call boot_log |
||
2294 | call build_interrupt_table |
||
2295 | |||
2296 | mov esi,boot_sched_4 |
||
2297 | call boot_log |
||
2298 | call build_syscall_interrupt_table |
||
2299 | |||
2300 | ret>->->> |
||
2301 |