Subversion Repositories Kolibri OS

Rev

Rev 1664 | 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: 3487 $
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
 
1664 art_zh 103
page_fault_exc:                 ; fool-proofing: if selectors damaged...
104
        pop     [ss:pf_err_code]; active to the next #PF
1056 Galkov 105
        save_ring3_context
106
        mov     bl,14
1086 Galkov 107
 
1664 art_zh 108
exc_c:                          ; exceptions (all but the 7th - #NM)
109
; the stack frame for an exception/interrupt occured in Ring3 + pushad (i.e. here)
1056 Galkov 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
1664 art_zh 115
 ; pushad's frame
1056 Galkov 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
 
1664 art_zh 125
        Mov     ds,ax,app_data  ; load the correct values
126
        mov     es,ax           ; to segregs
127
        cld                     ; and clear 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
3487 art_zh 248
;        call    fdc_irq
980 diamond 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
        call    [irq14_func]
263
        call    ready_for_next_irq_1
264
        restore_ring3_context
265
        iret
160 diamond 266
p_irq15:
1056 Galkov 267
        save_ring3_context
268
        mov     ax, app_data  ;os_data
269
        mov     ds, ax
270
        mov     es, ax
271
        mov     edi, 15
272
        cmp     [v86_irqhooks+edi*8], 0
273
        jnz     v86_irq2
274
        call    [irq15_func]
275
        call    ready_for_next_irq_1
276
        restore_ring3_context
277
        iret
160 diamond 278
 
33 mario79 279
ready_for_next_irq:
1306 Lrz 280
	mov	eax,5
281
        mov     [check_idle_semaphore],eax
282
	add 	eax,(0x20-0x5)
1056 Galkov 283
        out     0x20, al
284
        ret
1664 art_zh 285
 
1306 Lrz 286
;destroy eax
33 mario79 287
ready_for_next_irq_1:
1306 Lrz 288
	mov	eax,5
289
        mov     [check_idle_semaphore],eax
290
;        mov     al, 0x20
291
	add 	eax,(0x20-0x5)
1056 Galkov 292
        out     0xa0,al
293
        out     0x20, al
294
        ret
33 mario79 295
 
6 poddubny 296
irqD:
1056 Galkov 297
        push  eax
1306 Lrz 298
	xor   eax,eax
1056 Galkov 299
        out   0xf0,al
300
        mov   al,0x20
301
        out   0xa0,al
302
        out   0x20,al
303
        pop   eax
304
        iret
164 serge 305
 
1 ha 306
 
1056 Galkov 307
irqh 2,3,4,5,7,8,9,10,11
40 halyavin 308
 
1 ha 309
irqhandler:
310
 
1056 Galkov 311
     mov    esi,edi          ; 1
312
     shl    esi,6            ; 1
1 ha 313
     add    esi,irq00read    ; 1
1056 Galkov 314
     shl    edi,12           ; 1
381 serge 315
     add    edi,IRQ_SAVE
75 diamond 316
     mov    ecx,16
1 ha 317
 
318
   irqnewread:
75 diamond 319
     dec    ecx
320
     js     irqover
1 ha 321
 
1056 Galkov 322
     movzx  edx, word [esi]        ; 2+
1 ha 323
 
1056 Galkov 324
     test   edx, edx               ; 1
1 ha 325
     jz     irqover
326
 
327
 
1056 Galkov 328
     mov    ebx, [edi]             ; address of begin of buffer in edi      ; + 0x0 dword - data size
329
     mov    eax, 4000                                                       ; + 0x4 dword - data begin offset
759 Rus 330
     cmp    ebx, eax
1 ha 331
     je     irqfull
1056 Galkov 332
     add    ebx, [edi + 0x4]       ; add data size to data begin offset
333
     cmp    ebx, eax               ; if end of buffer, begin cycle again
759 Rus 334
     jb     @f
1 ha 335
 
759 Rus 336
     xor    ebx, ebx
1 ha 337
 
759 Rus 338
  @@:
339
     add    ebx, edi
1056 Galkov 340
     movzx  eax, byte[esi + 3]     ; get type of data being received 1 - byte, 2 - word
759 Rus 341
     dec    eax
342
     jz     irqbyte
343
     dec    eax
344
     jnz    noirqword
1 ha 345
 
759 Rus 346
     in     ax,dx
1056 Galkov 347
     cmp    ebx, 3999              ; check for address odd in the end of buffer
759 Rus 348
     jne    .odd
349
     mov    [ebx + 0x10], ax
350
     jmp    .add_size
351
  .odd:
1056 Galkov 352
     mov    [ebx + 0x10], al       ; I could make mistake here :)
759 Rus 353
     mov    [edi + 0x10], ah
354
  .add_size:
355
     add    dword [edi], 2
356
     jmp    nextport
1 ha 357
 
358
 
759 Rus 359
  irqbyte:
360
     in     al,dx
361
     mov    [ebx + 0x10],al
362
     inc    dword [edi]
363
  nextport:
1 ha 364
     add    esi,4
365
     jmp    irqnewread
366
 
759 Rus 367
 
1 ha 368
   noirqword:
369
   irqfull:
370
   irqover:
371
 
372
     ret
373
 
374
 
375
 
376
set_application_table_status:
1056 Galkov 377
        push eax
1 ha 378
 
1056 Galkov 379
        mov  eax,[CURRENT_TASK]
380
        shl  eax, 5
381
        add  eax,CURRENT_TASK+TASKDATA.pid
382
        mov  eax,[eax]
1 ha 383
 
1056 Galkov 384
        mov  [application_table_status],eax
1 ha 385
 
1056 Galkov 386
        pop  eax
1 ha 387
 
1056 Galkov 388
        ret
1 ha 389
 
390
 
391
clear_application_table_status:
1056 Galkov 392
        push eax
1 ha 393
 
1056 Galkov 394
        mov  eax,[CURRENT_TASK]
395
        shl  eax, 5
396
        add  eax,CURRENT_TASK+TASKDATA.pid
397
        mov  eax,[eax]
1 ha 398
 
1056 Galkov 399
        cmp  eax,[application_table_status]
400
        jne  apptsl1
1306 Lrz 401
	xor  eax,eax
402
        mov  [application_table_status],eax
1 ha 403
      apptsl1:
404
 
1056 Galkov 405
        pop  eax
1 ha 406
 
1056 Galkov 407
        ret
1 ha 408
 
1664 art_zh 409
;  * eax = 64 - sysFn #
410
;  * ebx = 1  - subFn
411
;  * ecx = new memory size
412
;Returns:
413
;  * eax = 0 - OK
414
;  * eax = 1 - insufficient memory
1306 Lrz 415
 
1 ha 416
sys_resize_app_memory:
1306 Lrz 417
	dec	ebx
418
        jnz    .no_application_mem_resize
1307 Lrz 419
        stdcall new_mem_resize, ecx
1306 Lrz 420
        mov [esp+32], eax
164 serge 421
.no_application_mem_resize:
1056 Galkov 422
        ret
1 ha 423
 
424
iglobal
1664 art_zh 425
  msg_obj_destroy       db 'K : app object destroyed',13,10,0
1 ha 426
endg
427
 
1664 art_zh 428
; terminate application
329 serge 429
; param
430
;  esi= slot
1 ha 431
 
1664 art_zh 432
terminate:
1 ha 433
 
1056 Galkov 434
           .slot equ esp   ;locals
329 serge 435
 
1056 Galkov 436
           push   esi      ;save .slot
334 serge 437
 
1056 Galkov 438
           shl esi, 8
439
           cmp [SLOT_BASE+esi+APPDATA.dir_table], 0
440
           jne @F
441
           pop    esi
442
           shl    esi, 5
443
           mov    [CURRENT_TASK+esi+TASKDATA.state], 9
444
           ret
334 serge 445
@@:
1056 Galkov 446
           cli
447
           cmp   [application_table_status],0
448
           je    term9
449
           sti
450
           call  change_task
451
           jmp   @b
329 serge 452
term9:
1056 Galkov 453
           call  set_application_table_status
1 ha 454
 
709 diamond 455
; if the process is in V86 mode...
1056 Galkov 456
        mov     eax, [.slot]
457
        shl     eax, 8
458
        mov     esi, [eax+SLOT_BASE+APPDATA.pl0_stack]
459
        add     esi, RING0_STACK_SIZE
460
        cmp     [eax+SLOT_BASE+APPDATA.saved_esp0], esi
461
        jz      .nov86
709 diamond 462
; ...it has page directory for V86 mode
1056 Galkov 463
        mov     esi, [eax+SLOT_BASE+APPDATA.saved_esp0]
464
        mov     ecx, [esi+4]
465
        mov     [eax+SLOT_BASE+APPDATA.dir_table], ecx
709 diamond 466
; ...and I/O permission map for V86 mode
1056 Galkov 467
        mov     ecx, [esi+12]
468
        mov     [eax+SLOT_BASE+APPDATA.io_map], ecx
469
        mov     ecx, [esi+8]
470
        mov     [eax+SLOT_BASE+APPDATA.io_map+4], ecx
709 diamond 471
.nov86:
472
 
1056 Galkov 473
           mov esi, [.slot]
474
           shl esi,8
475
           add esi, SLOT_BASE+APP_OBJ_OFFSET
329 serge 476
@@:
1056 Galkov 477
           mov eax, [esi+APPOBJ.fd]
478
           test eax, eax
479
           jz @F
334 serge 480
 
1056 Galkov 481
           cmp eax, esi
482
           je @F
164 serge 483
 
1056 Galkov 484
           push esi
485
           call [eax+APPOBJ.destroy]
486
           DEBUGF 1,"%s",msg_obj_destroy
487
           pop esi
488
           jmp @B
329 serge 489
@@:
1311 diamond 490
 
1056 Galkov 491
           mov eax, [.slot]
492
           shl eax, 8
1311 diamond 493
           stdcall destroy_app_space, [SLOT_BASE+eax+APPDATA.dir_table], [SLOT_BASE+eax+APPDATA.dlls_list_ptr]
1 ha 494
 
1056 Galkov 495
           mov esi, [.slot]
496
           cmp [fpu_owner],esi   ; if user fpu last -> fpu user = 1
497
           jne @F
164 serge 498
 
1056 Galkov 499
           mov [fpu_owner],1
500
           mov eax, [256+SLOT_BASE+APPDATA.fpu_state]
501
           clts
502
           bt [cpu_caps], CAPS_SSE
503
           jnc .no_SSE
504
           fxrstor [eax]
505
           jmp @F
203 serge 506
.no_SSE:
1056 Galkov 507
           fnclex
508
           frstor [eax]
357 serge 509
@@:
203 serge 510
 
1056 Galkov 511
    mov   [KEY_COUNT],byte 0           ; empty keyboard buffer
512
    mov   [BTN_COUNT],byte 0           ; empty button buffer
1 ha 513
 
514
 
92 diamond 515
; remove defined hotkeys
1056 Galkov 516
        mov     eax, hotkey_list
92 diamond 517
.loop:
1056 Galkov 518
        cmp     [eax+8], esi
519
        jnz     .cont
520
        mov     ecx, [eax]
521
        jecxz   @f
522
        push    dword [eax+12]
523
        pop     dword [ecx+12]
92 diamond 524
@@:
1056 Galkov 525
        mov     ecx, [eax+12]
526
        push    dword [eax]
527
        pop     dword [ecx]
528
        xor     ecx, ecx
529
        mov     [eax], ecx
530
        mov     [eax+4], ecx
531
        mov     [eax+8], ecx
532
        mov     [eax+12], ecx
92 diamond 533
.cont:
1056 Galkov 534
        add     eax, 16
535
        cmp     eax, hotkey_list+256*16
536
        jb      .loop
92 diamond 537
; remove hotkeys in buffer
1056 Galkov 538
        mov     eax, hotkey_buffer
92 diamond 539
.loop2:
1056 Galkov 540
        cmp     [eax], esi
541
        jnz     .cont2
542
        and     dword [eax+4], 0
543
        and     dword [eax], 0
92 diamond 544
.cont2:
1056 Galkov 545
        add     eax, 8
546
        cmp     eax, hotkey_buffer+120*8
547
        jb      .loop2
92 diamond 548
 
1056 Galkov 549
    mov   ecx,esi                 ; remove buttons
1 ha 550
  bnewba2:
381 serge 551
    mov   edi,[BTN_ADDR]
1 ha 552
    mov   eax,edi
553
    cld
554
    movzx ebx,word [edi]
555
    inc   bx
556
  bnewba:
557
    dec   bx
1056 Galkov 558
    jz    bnmba
1 ha 559
    add   eax,0x10
560
    cmp   cx,[eax]
561
    jnz   bnewba
562
    pusha
563
    mov   ecx,ebx
564
    inc   ecx
565
    shl   ecx,4
566
    mov   ebx,eax
567
    add   eax,0x10
568
    call  memmove
569
    dec   dword [edi]
570
    popa
571
    jmp   bnewba2
572
  bnmba:
573
 
574
    pusha     ; save window coordinates for window restoring
575
    cld
576
    shl   esi,5
577
    add   esi,window_data
114 mikedld 578
    mov   eax,[esi+WDATA.box.left]
1362 mikedld 579
    mov   [draw_limits.left],eax
114 mikedld 580
    add   eax,[esi+WDATA.box.width]
1362 mikedld 581
    mov   [draw_limits.right],eax
114 mikedld 582
    mov   eax,[esi+WDATA.box.top]
1362 mikedld 583
    mov   [draw_limits.top],eax
114 mikedld 584
    add   eax,[esi+WDATA.box.height]
1362 mikedld 585
    mov   [draw_limits.bottom],eax
1 ha 586
 
142 diamond 587
    xor   eax, eax
588
    mov   [esi+WDATA.box.left],eax
589
    mov   [esi+WDATA.box.width],eax
114 mikedld 590
    mov   [esi+WDATA.box.top],eax
142 diamond 591
    mov   [esi+WDATA.box.height],eax
115 poddubny 592
    mov   [esi+WDATA.cl_workarea],eax
593
    mov   [esi+WDATA.cl_titlebar],eax
594
    mov   [esi+WDATA.cl_frames],eax
595
    mov   dword [esi+WDATA.reserved],eax ; clear all flags: wstate, redraw, wdrawn
102 poddubny 596
    lea   edi, [esi-window_data+draw_data]
1 ha 597
    mov   ecx,32/4
598
    rep   stosd
599
    popa
600
 
40 halyavin 601
; debuggee test
602
    pushad
603
    mov  edi, esi
604
    shl  edi, 5
380 serge 605
    mov  eax, [SLOT_BASE+edi*8+APPDATA.debugger_slot]
40 halyavin 606
    test eax, eax
1056 Galkov 607
    jz   .nodebug
40 halyavin 608
    push 8
609
    pop  ecx
1056 Galkov 610
    push dword [CURRENT_TASK+edi+TASKDATA.pid]   ; PID
40 halyavin 611
    push 2
612
    call debugger_notify
613
    pop  ecx
614
    pop  ecx
615
.nodebug:
616
    popad
617
 
1056 Galkov 618
           mov ebx, [.slot]
619
           shl ebx, 8
620
           push ebx
621
           mov ebx,[SLOT_BASE+ebx+APPDATA.pl0_stack]
1 ha 622
 
1056 Galkov 623
           stdcall kernel_free, ebx
1 ha 624
 
1056 Galkov 625
           pop ebx
626
           mov ebx,[SLOT_BASE+ebx+APPDATA.cur_dir]
627
           stdcall kernel_free, ebx
521 diamond 628
 
1056 Galkov 629
           mov edi, [.slot]
630
           shl edi,8
631
           add edi,SLOT_BASE
465 serge 632
 
1056 Galkov 633
           mov eax, [edi+APPDATA.io_map]
1310 diamond 634
           cmp eax, [SLOT_BASE+256+APPDATA.io_map]
1056 Galkov 635
           je @F
636
           call free_page
465 serge 637
@@:
1056 Galkov 638
           mov eax, [edi+APPDATA.io_map+4]
1310 diamond 639
           cmp eax, [SLOT_BASE+256+APPDATA.io_map+4]
1056 Galkov 640
           je @F
641
           call free_page
465 serge 642
@@:
1056 Galkov 643
           mov eax, 0x20202020
644
           stosd
645
           stosd
646
           stosd
647
           mov ecx,244/4
648
           xor eax, eax
649
           rep stosd
1 ha 650
 
102 poddubny 651
  ; activate window
1056 Galkov 652
        movzx  eax, word [WIN_STACK + esi*2]
653
        cmp    eax, [TASK_COUNT]
654
        jne    .dont_activate
655
        pushad
102 poddubny 656
 .check_next_window:
1056 Galkov 657
        dec    eax
658
        cmp    eax, 1
659
        jbe    .nothing_to_activate
660
        lea    esi, [WIN_POS+eax*2]
661
        movzx  edi, word [esi]               ; edi = process
662
        shl    edi, 5
663
        cmp    [CURRENT_TASK + edi + TASKDATA.state], byte 9  ; skip dead slots
664
        je     .check_next_window
665
        add    edi, window_data
1664 art_zh 666
 
154 diamond 667
; skip minimized windows
1056 Galkov 668
        test   [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
669
        jnz    .check_next_window
670
        call   waredraw
102 poddubny 671
 .nothing_to_activate:
1056 Galkov 672
        popad
102 poddubny 673
 .dont_activate:
674
 
1056 Galkov 675
        push    esi     ; remove hd1 & cd & flp reservation
676
        shl     esi, 5
677
        mov     esi, [esi+CURRENT_TASK+TASKDATA.pid]
678
        cmp     [hd1_status], esi
679
        jnz     @f
680
        call    free_hd_channel
1306 Lrz 681
        and     [hd1_status], 0
1664 art_zh 682
;@@:
683
;        cmp     [cd_status], esi
684
;        jnz     @f
685
;        call    free_cd_channel
686
;        and     [cd_status], 0
3487 art_zh 687
;@@:
688
;        cmp     [flp_status], esi
689
;        jnz     @f
690
;        and     [flp_status], 0
92 diamond 691
@@:
1056 Galkov 692
        pop     esi
693
        cmp     [bgrlockpid], esi
694
        jnz     @f
695
        and     [bgrlockpid], 0
1306 Lrz 696
        and     [bgrlock], 0
546 diamond 697
@@:
1 ha 698
 
699
    pusha ; remove all irq reservations
92 diamond 700
    mov   eax,esi
115 poddubny 701
    shl   eax, 5
379 serge 702
    mov   eax,[eax+CURRENT_TASK+TASKDATA.pid]
1 ha 703
    mov   edi,irq_owner
774 Rus 704
    xor   ebx, ebx
705
    xor   edx, edx
1 ha 706
  newirqfree:
774 Rus 707
    cmp   [edi + 4 * ebx], eax
1 ha 708
    jne   nofreeirq
1056 Galkov 709
    mov   [edi + 4 * ebx], edx                          ; remove irq reservation
710
    mov   [irq_tab + 4 * ebx], edx                      ; remove irq handler
711
    mov   [irq_rights + 4 * ebx], edx                   ; set access rights to full access
1 ha 712
  nofreeirq:
774 Rus 713
    inc   ebx
714
    cmp   ebx, 16
1056 Galkov 715
    jb    newirqfree
1 ha 716
    popa
717
 
1056 Galkov 718
    pusha                     ; remove all port reservations
1 ha 719
    mov   edx,esi
115 poddubny 720
    shl   edx, 5
379 serge 721
    add   edx,CURRENT_TASK
115 poddubny 722
    mov   edx,[edx+TASKDATA.pid]
1 ha 723
 
724
  rmpr0:
725
 
381 serge 726
    mov   esi,[RESERVED_PORTS]
1 ha 727
 
1306 Lrz 728
    test  esi,esi
729
    jz    rmpr9
1 ha 730
 
731
  rmpr3:
732
 
733
    mov   edi,esi
734
    shl   edi,4
381 serge 735
    add   edi,RESERVED_PORTS
1 ha 736
 
737
    cmp   edx,[edi]
1056 Galkov 738
    je    rmpr4
1 ha 739
 
740
    dec   esi
741
    jnz   rmpr3
742
 
743
    jmp   rmpr9
744
 
745
  rmpr4:
746
 
747
    mov   ecx,256
748
    sub   ecx,esi
749
    shl   ecx,4
750
 
751
    mov   esi,edi
752
    add   esi,16
753
    cld
754
    rep   movsb
755
 
381 serge 756
    dec   dword [RESERVED_PORTS]
1 ha 757
 
758
    jmp   rmpr0
759
 
760
  rmpr9:
761
 
762
    popa
1056 Galkov 763
    mov  edi,esi         ; do not run this process slot
6 poddubny 764
    shl  edi, 5
379 serge 765
    mov  [edi+CURRENT_TASK + TASKDATA.state],byte 9
40 halyavin 766
; debugger test - terminate all debuggees
767
    mov  eax, 2
380 serge 768
    mov  ecx, SLOT_BASE+2*0x100+APPDATA.debugger_slot
40 halyavin 769
.xd0:
379 serge 770
    cmp  eax, [TASK_COUNT]
1056 Galkov 771
    ja   .xd1
40 halyavin 772
    cmp  dword [ecx], esi
773
    jnz  @f
774
    and  dword [ecx], 0
775
    pushad
684 diamond 776
    xchg eax, ecx
777
    mov  ebx, 2
40 halyavin 778
    call sys_system
779
    popad
780
@@:
781
    inc  eax
782
    add  ecx, 0x100
783
    jmp  .xd0
784
.xd1:
1 ha 785
    sti  ; .. and life goes on
786
 
1362 mikedld 787
    mov   eax, [draw_limits.left]
788
    mov   ebx, [draw_limits.top]
789
    mov   ecx, [draw_limits.right]
790
    mov   edx, [draw_limits.bottom]
1 ha 791
    call  calculatescreen
792
    xor   eax, eax
793
    xor   esi, esi
794
    call  redrawscreen
795
 
381 serge 796
    mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
797
    mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
1 ha 798
 
1306 Lrz 799
    and   [application_table_status],0
357 serge 800
    add esp, 4
1 ha 801
    ret
345 serge 802
restore .slot
1 ha 803
 
804
iglobal
1056 Galkov 805
  boot_sched_1    db   'Building gdt tss pointer',0
1664 art_zh 806
;  boot_sched_2    db   'Building IDT table',0
1 ha 807
endg
808
 
809
 
810
build_scheduler:
811
 
1056 Galkov 812
        mov    esi,boot_sched_1
813
        call   boot_log
814
        ret