Subversion Repositories Kolibri OS

Rev

Rev 1076 | Rev 1306 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
709 diamond 3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
431 serge 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;                                                              ;;
7
;;  MenuetOS process management, protected ring3                ;;
8
;;                                                              ;;
9
;;  Distributed under GPL. See file COPYING for details.        ;;
10
;;  Copyright 2003 Ville Turjanmaa                              ;;
11
;;                                                              ;;
12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1 ha 13
 
593 mikedld 14
$Revision: 1086 $
15
 
16
 
1056 Galkov 17
align 4 ;3A08
1 ha 18
build_interrupt_table:
1056 Galkov 19
        mov     edi, idts
20
        mov     esi, sys_int
21
        mov     ecx, 0x40
22
        mov     eax, (10001110b shl 24) + os_code
23
  @@:   movsw   ;low word of code-entry
24
        stosd   ;interrupt gate type : os_code selector
25
        movsw   ;high word of code-entry
26
        loop    @b
27
        movsd   ;copy low  dword of trap gate for int 0x40
28
        movsd   ;copy high dword of trap gate for int 0x40
29
        lidt    [esi]
30
        ret
1 ha 31
 
1056 Galkov 32
iglobal
33
  align 4
34
  sys_int:
35
    ;exception handlers addresses (for interrupt gate construction)
1076 Galkov 36
        dd      e0,e1,e2,e3,e4,e5,e6,except_7 ; SEE: core/fpu.inc
1056 Galkov 37
        dd      e8,e9,e10,e11,e12,e13,page_fault_exc,e15
38
        dd      e16, e17,e18, e19
39
        times   12 dd unknown_interrupt ;int_20..int_31
164 serge 40
 
1056 Galkov 41
    ;interrupt handlers addresses (for interrupt gate construction)
42
        dd      irq0, irq_serv.irq_1, irq_serv.irq_2
43
    if  USE_COM_IRQ
44
        dd      irq_serv.irq_3, irq_serv.irq_4
45
    else
46
        dd      p_irq3, p_irq4 ;??? нестыковка
47
    end if
48
        dd      irq_serv.irq_5,  p_irq6,          irq_serv.irq_7
49
        dd      irq_serv.irq_8,  irq_serv.irq_9,  irq_serv.irq_10
50
        dd      irq_serv.irq_11, irq_serv.irq_12, irqD,p_irq14,p_irq15
51
        times   16 dd unknown_interrupt ;int_0x30..int_0x3F
1 ha 52
 
1056 Galkov 53
    ;int_0x40 gate trap (for directly copied)
54
        dw      i40 and 0xFFFF, os_code, 11101111b shl 8, i40 shr 16
656 mikedld 55
 
1076 Galkov 56
  idtreg: ; data for LIDT instruction (!!! must be immediately below sys_int data)
1056 Galkov 57
        dw      2*($-sys_int-4)-1
58
        dd      idts ;0x8000B100
59
        dw      0    ;просто выравнивание
656 mikedld 60
 
1056 Galkov 61
  msg_fault_sel dd  msg_exc_8,msg_exc_u,msg_exc_a,msg_exc_b
62
                dd  msg_exc_c,msg_exc_d,msg_exc_e
164 serge 63
 
1056 Galkov 64
  msg_exc_8     db "Double fault", 0
65
  msg_exc_u     db "Undefined Exception", 0
66
  msg_exc_a     db "Invalid TSS", 0
67
  msg_exc_b     db "Segment not present", 0
68
  msg_exc_c     db "Stack fault", 0
69
  msg_exc_d     db "General protection fault", 0
70
  msg_exc_e     db "Page fault", 0
1 ha 71
 
1056 Galkov 72
  msg_sel_ker   db "kernel", 0
73
  msg_sel_app   db "application", 0
1 ha 74
 
75
endg
76
 
1056 Galkov 77
macro save_ring3_context {
78
        pushad
40 halyavin 79
}
1056 Galkov 80
macro restore_ring3_context {
81
        popad
40 halyavin 82
}
1056 Galkov 83
macro exc_wo_code [num] {
8 poddubny 84
  e#num :
1056 Galkov 85
        save_ring3_context
86
        mov     bl, num
87
        jmp     exc_c
88
} exc_wo_code   0,1,2,3,4,5,6,15,16,19
1 ha 89
 
1056 Galkov 90
macro exc_w_code [num] {
22 poddubny 91
  e#num :
1056 Galkov 92
        add     esp, 4
93
        save_ring3_context
94
        mov     bl, num
95
        jmp     exc_c
96
} exc_w_code    8,9,10,11,12,13,17,18
22 poddubny 97
 
98
 
1056 Galkov 99
uglobal
100
  pf_err_code   dd ?
101
endg
1 ha 102
 
1086 Galkov 103
page_fault_exc:                 ; дуракоусточивость: селекторы испорчены...
104
        pop     [ss:pf_err_code]; действительно до следующего #PF
1056 Galkov 105
        save_ring3_context
106
        mov     bl,14
1086 Galkov 107
 
108
exc_c:                          ; исключения (все, кроме 7-го - #NM)
1056 Galkov 109
; Фрэйм стека при исключении/прерывании из 3-го кольца + pushad (т.е., именно здесь)
110
  reg_ss        equ esp+0x30
111
  reg_esp3      equ esp+0x2C
112
  reg_eflags    equ esp+0x28
113
  reg_cs3       equ esp+0x24
114
  reg_eip       equ esp+0x20
115
 ; это фрэйм от pushad
116
  reg_eax       equ esp+0x1C
117
  reg_ecx       equ esp+0x18
118
  reg_edx       equ esp+0x14
119
  reg_ebx       equ esp+0x10
120
  reg_esp0      equ esp+0x0C
121
  reg_ebp       equ esp+0x08
122
  reg_esi       equ esp+0x04
123
  reg_edi       equ esp+0x00
124
 
125
        Mov     ds,ax,app_data  ; загрузим правильные значения
126
        mov     es,ax           ; в сегментные регистры
127
        cld                     ; и приводим DF к стандарту
1074 Galkov 128
        movzx   ebx,bl
709 diamond 129
; redirect to V86 manager? (EFLAGS & 0x20000) != 0?
1056 Galkov 130
        test    byte[reg_eflags+2],2
131
        jnz     v86_exc_c
132
        cmp     bl,14           ; #PF
1074 Galkov 133
        jne     @f
1076 Galkov 134
        call    page_fault_handler ; SEE: core/memory.inc
1074 Galkov 135
  @@:   mov     esi, [current_slot]
136
        btr     [esi+APPDATA.except_mask], ebx
137
        jnc     @f
138
        mov     eax,[esi+APPDATA.exc_handler]
139
        test    eax, eax
1056 Galkov 140
        jnz     IRetToUserHook
1074 Galkov 141
  @@:   cli
1056 Galkov 142
        mov     eax, [esi+APPDATA.debugger_slot]
143
        test    eax, eax
144
        jnz     .debug
145
        sti
40 halyavin 146
; not debuggee => say error and terminate
1056 Galkov 147
        call    show_error_parameters ;; only ONE using, inline ???
148
       ;mov     edx, [TASK_BASE]
149
        mov     [edx + TASKDATA.state], byte 4 ; terminate
1076 Galkov 150
        jmp     change_task     ; stack - here it does not matter at all, SEE: core/shed.inc
40 halyavin 151
.debug:
152
; we are debugged process, notify debugger and suspend ourself
153
; eax=debugger PID
1076 Galkov 154
        mov     ecx,1           ; debug_message code=other_exception
1056 Galkov 155
        cmp     bl,1            ; #DB
1076 Galkov 156
        jne     .notify         ; notify debugger and suspend ourself
157
        mov     ebx, dr6        ; debug_message data=DR6_image
158
        xor     edx, edx
159
        mov     dr6, edx
160
        mov     edx, dr7
161
        mov     cl, not 8
162
  .l1:  shl     dl,2
163
        jc      @f
164
        and     bl, cl
165
  @@:   sar     cl,1
166
        jc      .l1
167
        mov     cl, 3           ; debug_message code=debug_exception
168
.notify:
169
        push    ebx             ; debug_message data
170
        mov     ebx, [TASK_BASE]
171
        push    [ebx+TASKDATA.pid] ; PID
172
        push    ecx             ; debug_message code ((here: ecx==1/3))
173
        mov     cl, 12          ; debug_message size
174
        call    debugger_notify ;; only ONE using, inline ??? SEE: core/debug.inc
175
        add     esp,12
176
        mov     edx, [TASK_BASE]
177
        mov     byte [edx+TASKDATA.state], 1 ; suspended
178
        call    change_task     ; SEE: core/shed.inc
179
        restore_ring3_context
180
        iretd
1 ha 181
 
1056 Galkov 182
IRetToUserHook:
183
        xchg    eax, [reg_eip]
1074 Galkov 184
        sub     dword[reg_esp3], 8
1056 Galkov 185
        mov     edi, [reg_esp3]
186
        stosd
1074 Galkov 187
        mov     [edi], ebx
1056 Galkov 188
        restore_ring3_context
189
unknown_interrupt:
190
        iretd
1 ha 191
 
658 Ghost 192
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
1 ha 193
show_error_parameters:
1056 Galkov 194
        mov     edx,[TASK_BASE] ;not scratched below
195
        DEBUGF  1, "K : Process - forced terminate PID: %x\n", [edx+TASKDATA.pid]
196
        cmp     bl, 0x08
197
        jb      .l0
198
        cmp     bl, 0x0e
199
        jbe     .l1
200
  .l0:  mov     bl, 0x09
1074 Galkov 201
  .l1:  mov     eax,[msg_fault_sel+ebx*4 - 0x08*4]
1056 Galkov 202
        DEBUGF  1, "K : %s\n", eax
203
        mov     eax, [reg_cs3+4]
204
        mov     edi, msg_sel_app
205
        mov     ebx, [reg_esp3+4]
206
        cmp     eax, app_code
207
        je      @f
208
        mov     edi, msg_sel_ker
209
        mov     ebx, [reg_esp0+4]
210
    @@: DEBUGF  1, "K : EAX : %x EBX : %x ECX : %x\n", [reg_eax+4], [reg_ebx+4], [reg_ecx+4]
211
        DEBUGF  1, "K : EDX : %x ESI : %x EDI : %x\n", [reg_edx+4], [reg_esi+4], [reg_edi+4]
212
        DEBUGF  1, "K : EBP : %x EIP : %x ESP : %x\n", [reg_ebp+4], [reg_eip+4], ebx
213
        DEBUGF  1, "K : Flags : %x CS : %x (%s)\n", [reg_eflags+4], eax, edi
214
        ret
658 Ghost 215
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
164 serge 216
 
1056 Galkov 217
  restore  reg_ss
218
  restore  reg_esp3
219
  restore  reg_eflags
220
  restore  reg_cs
221
  restore  reg_eip
222
  restore  reg_eax
223
  restore  reg_ecx
224
  restore  reg_edx
225
  restore  reg_ebx
226
  restore  reg_esp0
227
  restore  reg_ebp
228
  restore  reg_esi
229
  restore  reg_edi
16 poddubny 230
 
6 poddubny 231
; irq1  ->  hid/keyboard.inc
1056 Galkov 232
macro irqh [num] {
8 poddubny 233
  p_irq#num :
1056 Galkov 234
        mov     edi, num
235
        jmp     irqhandler
8 poddubny 236
}
1 ha 237
 
238
 
11 poddubny 239
 
240
p_irq6:
980 diamond 241
        save_ring3_context
242
        mov     ax, app_data  ;os_data
243
        mov     ds, ax
244
        mov     es, ax
982 diamond 245
        mov     edi, 6
980 diamond 246
        cmp     [v86_irqhooks+edi*8], 0
247
        jnz     v86_irq2
248
        call    fdc_irq
249
        call    ready_for_next_irq
250
        restore_ring3_context
251
        iret
15 poddubny 252
 
253
 
160 diamond 254
p_irq14:
1056 Galkov 255
        save_ring3_context
256
        mov     ax, app_data  ;os_data
257
        mov     ds, ax
258
        mov     es, ax
259
        mov     edi, 14
260
        cmp     [v86_irqhooks+edi*8], 0
261
        jnz     v86_irq2
262
;       mov     byte [BOOT_VAR + 0x48E], 0xFF
263
        call    [irq14_func]
264
        call    ready_for_next_irq_1
265
        restore_ring3_context
266
        iret
160 diamond 267
p_irq15:
1056 Galkov 268
        save_ring3_context
269
        mov     ax, app_data  ;os_data
270
        mov     ds, ax
271
        mov     es, ax
272
        mov     edi, 15
273
        cmp     [v86_irqhooks+edi*8], 0
274
        jnz     v86_irq2
275
;       mov     byte [BOOT_VAR + 0x48E], 0xFF
276
        call    [irq15_func]
277
        call    ready_for_next_irq_1
278
        restore_ring3_context
279
        iret
160 diamond 280
 
33 mario79 281
ready_for_next_irq:
1056 Galkov 282
        mov     [check_idle_semaphore],5
283
        mov     al, 0x20
284
        out     0x20, al
285
        ret
33 mario79 286
 
287
ready_for_next_irq_1:
1056 Galkov 288
        mov     [check_idle_semaphore],5
289
        mov     al, 0x20
290
        out     0xa0,al
291
        out     0x20, al
292
        ret
33 mario79 293
 
6 poddubny 294
irqD:
1056 Galkov 295
        push  eax
296
        mov   al,0
297
        out   0xf0,al
298
        mov   al,0x20
299
        out   0xa0,al
300
        out   0x20,al
301
        pop   eax
302
        iret
164 serge 303
 
1 ha 304
 
1056 Galkov 305
irqh 2,3,4,5,7,8,9,10,11
40 halyavin 306
 
1 ha 307
irqhandler:
308
 
1056 Galkov 309
     mov    esi,edi          ; 1
310
     shl    esi,6            ; 1
1 ha 311
     add    esi,irq00read    ; 1
1056 Galkov 312
     shl    edi,12           ; 1
381 serge 313
     add    edi,IRQ_SAVE
75 diamond 314
     mov    ecx,16
1 ha 315
 
316
   irqnewread:
75 diamond 317
     dec    ecx
318
     js     irqover
1 ha 319
 
1056 Galkov 320
     movzx  edx, word [esi]        ; 2+
1 ha 321
 
1056 Galkov 322
     test   edx, edx               ; 1
1 ha 323
     jz     irqover
324
 
325
 
1056 Galkov 326
     mov    ebx, [edi]             ; address of begin of buffer in edi      ; + 0x0 dword - data size
327
     mov    eax, 4000                                                       ; + 0x4 dword - data begin offset
759 Rus 328
     cmp    ebx, eax
1 ha 329
     je     irqfull
1056 Galkov 330
     add    ebx, [edi + 0x4]       ; add data size to data begin offset
331
     cmp    ebx, eax               ; if end of buffer, begin cycle again
759 Rus 332
     jb     @f
1 ha 333
 
759 Rus 334
     xor    ebx, ebx
1 ha 335
 
759 Rus 336
  @@:
337
     add    ebx, edi
1056 Galkov 338
     movzx  eax, byte[esi + 3]     ; get type of data being received 1 - byte, 2 - word
759 Rus 339
     dec    eax
340
     jz     irqbyte
341
     dec    eax
342
     jnz    noirqword
1 ha 343
 
759 Rus 344
     in     ax,dx
1056 Galkov 345
     cmp    ebx, 3999              ; check for address odd in the end of buffer
759 Rus 346
     jne    .odd
347
     mov    [ebx + 0x10], ax
348
     jmp    .add_size
349
  .odd:
1056 Galkov 350
     mov    [ebx + 0x10], al       ; I could make mistake here :)
759 Rus 351
     mov    [edi + 0x10], ah
352
  .add_size:
353
     add    dword [edi], 2
354
     jmp    nextport
1 ha 355
 
356
 
759 Rus 357
  irqbyte:
358
     in     al,dx
359
     mov    [ebx + 0x10],al
360
     inc    dword [edi]
361
  nextport:
1 ha 362
     add    esi,4
363
     jmp    irqnewread
364
 
759 Rus 365
 
1 ha 366
   noirqword:
367
   irqfull:
368
   irqover:
369
 
370
     ret
371
 
372
 
373
 
374
set_application_table_status:
1056 Galkov 375
        push eax
1 ha 376
 
1056 Galkov 377
        mov  eax,[CURRENT_TASK]
378
        shl  eax, 5
379
        add  eax,CURRENT_TASK+TASKDATA.pid
380
        mov  eax,[eax]
1 ha 381
 
1056 Galkov 382
        mov  [application_table_status],eax
1 ha 383
 
1056 Galkov 384
        pop  eax
1 ha 385
 
1056 Galkov 386
        ret
1 ha 387
 
388
 
389
clear_application_table_status:
1056 Galkov 390
        push eax
1 ha 391
 
1056 Galkov 392
        mov  eax,[CURRENT_TASK]
393
        shl  eax, 5
394
        add  eax,CURRENT_TASK+TASKDATA.pid
395
        mov  eax,[eax]
1 ha 396
 
1056 Galkov 397
        cmp  eax,[application_table_status]
398
        jne  apptsl1
399
        mov  [application_table_status],0
1 ha 400
      apptsl1:
401
 
1056 Galkov 402
        pop  eax
1 ha 403
 
1056 Galkov 404
        ret
1 ha 405
 
406
sys_resize_app_memory:
1056 Galkov 407
        ; eax = 1 - resize
408
        ;     ebx = new amount of memory
1 ha 409
 
1056 Galkov 410
        cmp    eax,1
411
        jne    .no_application_mem_resize
1 ha 412
 
1056 Galkov 413
        stdcall new_mem_resize, ebx
414
        mov [esp+36], eax
415
        ret
1 ha 416
 
164 serge 417
.no_application_mem_resize:
1056 Galkov 418
        ret
1 ha 419
 
420
sys_threads:
421
 
422
; eax=1 create thread
423
;
424
;   ebx=thread start
425
;   ecx=thread stack value
426
;
427
; on return : eax = pid
428
jmp new_sys_threads
429
 
430
iglobal
1056 Galkov 431
;  process_terminating  db 'K : Process - terminating',13,10,0
432
;  process_terminated   db 'K : Process - done',13,10,0
433
  msg_obj_destroy       db 'K : destroy app object',13,10,0
1 ha 434
endg
435
 
329 serge 436
; param
437
;  esi= slot
1 ha 438
 
439
terminate: ; terminate application
440
 
1056 Galkov 441
           .slot equ esp   ;locals
329 serge 442
 
1056 Galkov 443
           push   esi      ;save .slot
334 serge 444
 
1056 Galkov 445
           shl esi, 8
446
           cmp [SLOT_BASE+esi+APPDATA.dir_table], 0
447
           jne @F
448
           pop    esi
449
           shl    esi, 5
450
           mov    [CURRENT_TASK+esi+TASKDATA.state], 9
451
           ret
334 serge 452
@@:
1056 Galkov 453
           ;mov    esi,process_terminating
454
           ;call   sys_msg_board_str
40 halyavin 455
@@:
1056 Galkov 456
           cli
457
           cmp   [application_table_status],0
458
           je    term9
459
           sti
460
           call  change_task
461
           jmp   @b
329 serge 462
term9:
1056 Galkov 463
           call  set_application_table_status
1 ha 464
 
709 diamond 465
; if the process is in V86 mode...
1056 Galkov 466
        mov     eax, [.slot]
467
        shl     eax, 8
468
        mov     esi, [eax+SLOT_BASE+APPDATA.pl0_stack]
469
        add     esi, RING0_STACK_SIZE
470
        cmp     [eax+SLOT_BASE+APPDATA.saved_esp0], esi
471
        jz      .nov86
709 diamond 472
; ...it has page directory for V86 mode
1056 Galkov 473
        mov     esi, [eax+SLOT_BASE+APPDATA.saved_esp0]
474
        mov     ecx, [esi+4]
475
        mov     [eax+SLOT_BASE+APPDATA.dir_table], ecx
709 diamond 476
; ...and I/O permission map for V86 mode
1056 Galkov 477
        mov     ecx, [esi+12]
478
        mov     [eax+SLOT_BASE+APPDATA.io_map], ecx
479
        mov     ecx, [esi+8]
480
        mov     [eax+SLOT_BASE+APPDATA.io_map+4], ecx
709 diamond 481
.nov86:
482
 
1056 Galkov 483
           mov esi, [.slot]
484
           shl esi,8
485
           add esi, SLOT_BASE+APP_OBJ_OFFSET
329 serge 486
@@:
1056 Galkov 487
           mov eax, [esi+APPOBJ.fd]
488
           test eax, eax
489
           jz @F
334 serge 490
 
1056 Galkov 491
           cmp eax, esi
492
           je @F
164 serge 493
 
1056 Galkov 494
           push esi
495
           call [eax+APPOBJ.destroy]
496
           DEBUGF 1,"%s",msg_obj_destroy
497
           pop esi
498
           jmp @B
329 serge 499
@@:
1056 Galkov 500
           mov eax, [.slot]
501
           shl eax, 8
502
           mov eax,[SLOT_BASE+eax+APPDATA.dir_table]
503
           stdcall destroy_app_space, eax
1 ha 504
 
1056 Galkov 505
           mov esi, [.slot]
506
           cmp [fpu_owner],esi   ; if user fpu last -> fpu user = 1
507
           jne @F
164 serge 508
 
1056 Galkov 509
           mov [fpu_owner],1
510
           mov eax, [256+SLOT_BASE+APPDATA.fpu_state]
511
           clts
512
           bt [cpu_caps], CAPS_SSE
513
           jnc .no_SSE
514
           fxrstor [eax]
515
           jmp @F
203 serge 516
.no_SSE:
1056 Galkov 517
           fnclex
518
           frstor [eax]
357 serge 519
@@:
203 serge 520
 
1056 Galkov 521
    mov   [KEY_COUNT],byte 0           ; empty keyboard buffer
522
    mov   [BTN_COUNT],byte 0           ; empty button buffer
1 ha 523
 
524
 
92 diamond 525
; remove defined hotkeys
1056 Galkov 526
        mov     eax, hotkey_list
92 diamond 527
.loop:
1056 Galkov 528
        cmp     [eax+8], esi
529
        jnz     .cont
530
        mov     ecx, [eax]
531
        jecxz   @f
532
        push    dword [eax+12]
533
        pop     dword [ecx+12]
92 diamond 534
@@:
1056 Galkov 535
        mov     ecx, [eax+12]
536
        push    dword [eax]
537
        pop     dword [ecx]
538
        xor     ecx, ecx
539
        mov     [eax], ecx
540
        mov     [eax+4], ecx
541
        mov     [eax+8], ecx
542
        mov     [eax+12], ecx
92 diamond 543
.cont:
1056 Galkov 544
        add     eax, 16
545
        cmp     eax, hotkey_list+256*16
546
        jb      .loop
92 diamond 547
; remove hotkeys in buffer
1056 Galkov 548
        mov     eax, hotkey_buffer
92 diamond 549
.loop2:
1056 Galkov 550
        cmp     [eax], esi
551
        jnz     .cont2
552
        and     dword [eax+4], 0
553
        and     dword [eax], 0
92 diamond 554
.cont2:
1056 Galkov 555
        add     eax, 8
556
        cmp     eax, hotkey_buffer+120*8
557
        jb      .loop2
92 diamond 558
 
1056 Galkov 559
    mov   ecx,esi                 ; remove buttons
1 ha 560
  bnewba2:
381 serge 561
    mov   edi,[BTN_ADDR]
1 ha 562
    mov   eax,edi
563
    cld
564
    movzx ebx,word [edi]
565
    inc   bx
566
  bnewba:
567
    dec   bx
1056 Galkov 568
    jz    bnmba
1 ha 569
    add   eax,0x10
570
    cmp   cx,[eax]
571
    jnz   bnewba
572
    pusha
573
    mov   ecx,ebx
574
    inc   ecx
575
    shl   ecx,4
576
    mov   ebx,eax
577
    add   eax,0x10
578
    call  memmove
579
    dec   dword [edi]
580
    popa
581
    jmp   bnewba2
582
  bnmba:
583
 
584
    pusha     ; save window coordinates for window restoring
585
    cld
586
    shl   esi,5
587
    add   esi,window_data
114 mikedld 588
    mov   eax,[esi+WDATA.box.left]
102 poddubny 589
    mov   [dlx],eax
114 mikedld 590
    add   eax,[esi+WDATA.box.width]
102 poddubny 591
    mov   [dlxe],eax
114 mikedld 592
    mov   eax,[esi+WDATA.box.top]
102 poddubny 593
    mov   [dly],eax
114 mikedld 594
    add   eax,[esi+WDATA.box.height]
102 poddubny 595
    mov   [dlye],eax
1 ha 596
 
142 diamond 597
    xor   eax, eax
598
    mov   [esi+WDATA.box.left],eax
599
    mov   [esi+WDATA.box.width],eax
114 mikedld 600
    mov   [esi+WDATA.box.top],eax
142 diamond 601
    mov   [esi+WDATA.box.height],eax
115 poddubny 602
    mov   [esi+WDATA.cl_workarea],eax
603
    mov   [esi+WDATA.cl_titlebar],eax
604
    mov   [esi+WDATA.cl_frames],eax
605
    mov   dword [esi+WDATA.reserved],eax ; clear all flags: wstate, redraw, wdrawn
102 poddubny 606
    lea   edi, [esi-window_data+draw_data]
1 ha 607
    mov   ecx,32/4
608
    rep   stosd
609
    popa
610
 
40 halyavin 611
; debuggee test
612
    pushad
613
    mov  edi, esi
614
    shl  edi, 5
380 serge 615
    mov  eax, [SLOT_BASE+edi*8+APPDATA.debugger_slot]
40 halyavin 616
    test eax, eax
1056 Galkov 617
    jz   .nodebug
40 halyavin 618
    push 8
619
    pop  ecx
1056 Galkov 620
    push dword [CURRENT_TASK+edi+TASKDATA.pid]   ; PID
40 halyavin 621
    push 2
622
    call debugger_notify
623
    pop  ecx
624
    pop  ecx
625
.nodebug:
626
    popad
627
 
1056 Galkov 628
           mov ebx, [.slot]
629
           shl ebx, 8
630
           push ebx
631
           mov ebx,[SLOT_BASE+ebx+APPDATA.pl0_stack]
1 ha 632
 
1056 Galkov 633
           stdcall kernel_free, ebx
1 ha 634
 
1056 Galkov 635
           pop ebx
636
           mov ebx,[SLOT_BASE+ebx+APPDATA.cur_dir]
637
           stdcall kernel_free, ebx
521 diamond 638
 
1056 Galkov 639
           mov edi, [.slot]
640
           shl edi,8
641
           add edi,SLOT_BASE
465 serge 642
 
1056 Galkov 643
           mov eax, [edi+APPDATA.io_map]
644
           cmp eax, (tss._io_map_0-OS_BASE+PG_MAP)
645
           je @F
646
           call free_page
465 serge 647
@@:
1056 Galkov 648
           mov eax, [edi+APPDATA.io_map+4]
649
           cmp eax, (tss._io_map_1-OS_BASE+PG_MAP)
650
           je @F
651
           call free_page
465 serge 652
@@:
1056 Galkov 653
           mov eax, 0x20202020
654
           stosd
655
           stosd
656
           stosd
657
           mov ecx,244/4
658
           xor eax, eax
659
           rep stosd
1 ha 660
 
102 poddubny 661
  ; activate window
1056 Galkov 662
        movzx  eax, word [WIN_STACK + esi*2]
663
        cmp    eax, [TASK_COUNT]
664
        jne    .dont_activate
665
        pushad
102 poddubny 666
 .check_next_window:
1056 Galkov 667
        dec    eax
668
        cmp    eax, 1
669
        jbe    .nothing_to_activate
670
        lea    esi, [WIN_POS+eax*2]
671
        movzx  edi, word [esi]               ; edi = process
672
        shl    edi, 5
673
        cmp    [CURRENT_TASK + edi + TASKDATA.state], byte 9  ; skip dead slots
674
        je     .check_next_window
675
        add    edi, window_data
154 diamond 676
; \begin{diamond}[19.09.2006]
677
; skip minimized windows
1056 Galkov 678
        test   [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
679
        jnz    .check_next_window
154 diamond 680
; \end{diamond}
1056 Galkov 681
        call   waredraw
102 poddubny 682
 .nothing_to_activate:
1056 Galkov 683
        popad
102 poddubny 684
 .dont_activate:
685
 
1056 Galkov 686
        push    esi     ; remove hd1 & cd & flp reservation
687
        shl     esi, 5
688
        mov     esi, [esi+CURRENT_TASK+TASKDATA.pid]
689
        cmp     [hd1_status], esi
690
        jnz     @f
691
        call    free_hd_channel
692
        mov     [hd1_status], 0
92 diamond 693
@@:
1056 Galkov 694
        cmp     [cd_status], esi
695
        jnz     @f
696
        call    free_cd_channel
697
        mov     [cd_status], 0
92 diamond 698
@@:
1056 Galkov 699
        cmp     [flp_status], esi
700
        jnz     @f
701
        mov     [flp_status], 0
92 diamond 702
@@:
1056 Galkov 703
        pop     esi
704
        cmp     [bgrlockpid], esi
705
        jnz     @f
706
        and     [bgrlockpid], 0
707
        mov     [bgrlock], 0
546 diamond 708
@@:
1 ha 709
 
710
    pusha ; remove all irq reservations
92 diamond 711
    mov   eax,esi
115 poddubny 712
    shl   eax, 5
379 serge 713
    mov   eax,[eax+CURRENT_TASK+TASKDATA.pid]
1 ha 714
    mov   edi,irq_owner
774 Rus 715
    xor   ebx, ebx
716
    xor   edx, edx
1 ha 717
  newirqfree:
774 Rus 718
    cmp   [edi + 4 * ebx], eax
1 ha 719
    jne   nofreeirq
1056 Galkov 720
    mov   [edi + 4 * ebx], edx                          ; remove irq reservation
721
    mov   [irq_tab + 4 * ebx], edx                      ; remove irq handler
722
    mov   [irq_rights + 4 * ebx], edx                   ; set access rights to full access
1 ha 723
  nofreeirq:
774 Rus 724
    inc   ebx
725
    cmp   ebx, 16
1056 Galkov 726
    jb    newirqfree
1 ha 727
    popa
728
 
1056 Galkov 729
    pusha                     ; remove all port reservations
1 ha 730
    mov   edx,esi
115 poddubny 731
    shl   edx, 5
379 serge 732
    add   edx,CURRENT_TASK
115 poddubny 733
    mov   edx,[edx+TASKDATA.pid]
1 ha 734
 
735
  rmpr0:
736
 
381 serge 737
    mov   esi,[RESERVED_PORTS]
1 ha 738
 
739
    cmp   esi,0
1056 Galkov 740
    je    rmpr9
1 ha 741
 
742
  rmpr3:
743
 
744
    mov   edi,esi
745
    shl   edi,4
381 serge 746
    add   edi,RESERVED_PORTS
1 ha 747
 
748
    cmp   edx,[edi]
1056 Galkov 749
    je    rmpr4
1 ha 750
 
751
    dec   esi
752
    jnz   rmpr3
753
 
754
    jmp   rmpr9
755
 
756
  rmpr4:
757
 
758
    mov   ecx,256
759
    sub   ecx,esi
760
    shl   ecx,4
761
 
762
    mov   esi,edi
763
    add   esi,16
764
    cld
765
    rep   movsb
766
 
381 serge 767
    dec   dword [RESERVED_PORTS]
1 ha 768
 
769
    jmp   rmpr0
770
 
771
  rmpr9:
772
 
773
    popa
1056 Galkov 774
    mov  edi,esi         ; do not run this process slot
6 poddubny 775
    shl  edi, 5
379 serge 776
    mov  [edi+CURRENT_TASK + TASKDATA.state],byte 9
40 halyavin 777
; debugger test - terminate all debuggees
778
    mov  eax, 2
380 serge 779
    mov  ecx, SLOT_BASE+2*0x100+APPDATA.debugger_slot
40 halyavin 780
.xd0:
379 serge 781
    cmp  eax, [TASK_COUNT]
1056 Galkov 782
    ja   .xd1
40 halyavin 783
    cmp  dword [ecx], esi
784
    jnz  @f
785
    and  dword [ecx], 0
786
    pushad
684 diamond 787
    xchg eax, ecx
788
    mov  ebx, 2
40 halyavin 789
    call sys_system
790
    popad
791
@@:
792
    inc  eax
793
    add  ecx, 0x100
794
    jmp  .xd0
795
.xd1:
1 ha 796
;    call  systest
797
    sti  ; .. and life goes on
798
 
112 poddubny 799
    mov   eax, [dlx]
800
    mov   ebx, [dly]
801
    mov   ecx, [dlxe]
802
    mov   edx, [dlye]
1 ha 803
    call  calculatescreen
804
    xor   eax, eax
805
    xor   esi, esi
806
    call  redrawscreen
807
 
381 serge 808
    mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
809
    mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
1 ha 810
 
811
    mov   [application_table_status],0
506 mikedld 812
    ;mov   esi,process_terminated
813
    ;call  sys_msg_board_str
357 serge 814
    add esp, 4
1 ha 815
    ret
345 serge 816
restore .slot
1 ha 817
 
818
iglobal
1056 Galkov 819
  boot_sched_1    db   'Building gdt tss pointer',0
820
  boot_sched_2    db   'Building IDT table',0
1 ha 821
endg
822
 
823
 
824
build_scheduler:
825
 
1056 Galkov 826
        mov    esi,boot_sched_1
827
        call   boot_log
465 serge 828
  ;      call   build_process_gdt_tss_pointer
1 ha 829
 
465 serge 830
  ;      mov    esi,boot_sched_2
831
  ;      call   boot_log
1 ha 832
 
1056 Galkov 833
        ret