Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2288 clevermous 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
9715 Doczom 3
;; Copyright (C) KolibriOS team 2004-2022. All rights reserved. ;;
6793 pathoswith 4
;;  Distributed under terms of the GNU General Public License.  ;;
2288 clevermous 5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
8
$Revision: 9976 $
9
 
9975 Jurgen 10
struct EXCEPT_STACK
11
    RegEIP     dd ?
12
    ExcCode    dd ? ; only exception 12 overflow stack
13
    OldESP     dd ?
14
    RegCR2     dd ?
15
    LockAccess dd ?
16
ends
17
 
2288 clevermous 18
align 4 ;3A08
19
build_interrupt_table:
20
        mov     edi, idts
21
        mov     esi, sys_int
22
        mov     ecx, 0x40
23
        mov     eax, (10001110b shl 24) + os_code
24
  @@:
8050 rgimad 25
        movsw   ; low word of code-entry
26
        stosd   ; interrupt gate type : os_code selector
27
        movsw   ; high word of code-entry
2288 clevermous 28
        loop    @b
8050 rgimad 29
        movsd   ; copy low  dword of trap gate for int 0x40
30
        movsd   ; copy high dword of trap gate for int 0x40
7733 dunkaist 31
        mov     ecx, 23
32
        mov     eax, (10001110b shl 24) + os_code
33
  @@:
8050 rgimad 34
        movsw   ; low word of code-entry
35
        stosd   ; interrupt gate type : os_code selector
36
        movsw   ; high word of code-entry
7733 dunkaist 37
        loop    @b
2288 clevermous 38
        lidt    [esi]
39
        ret
40
 
41
iglobal
42
  align 4
43
  sys_int:
8050 rgimad 44
    ; exception handlers addresses (for interrupt gate construction)
2288 clevermous 45
        dd      e0,e1,e2,e3,e4,e5,e6,except_7 ; SEE: core/fpu.inc
46
        dd      e8,e9,e10,e11,e12,e13,page_fault_exc,e15
47
        dd      e16, e17,e18, e19
48
        times   12 dd unknown_interrupt ;int_20..int_31
49
 
8050 rgimad 50
    ; interrupt handlers addresses (for interrupt gate construction)
7733 dunkaist 51
        ; 0x20+ are IRQ handlers
52
        dd irq0
53
        rept 12 irqn:1  \{dd irq_serv.irq_\#irqn\}
54
        dd irqD
55
        rept 18 irqn:14 \{dd irq_serv.irq_\#irqn\}
2288 clevermous 56
 
7733 dunkaist 57
        ; int_0x40 gate trap (for directly copied)
58
        dw i40 and 0xFFFF, os_code, 11101111b shl 8, i40 shr 16
2288 clevermous 59
 
7733 dunkaist 60
        rept 23 irqn:33 \{dd irq_serv.irq_\#irqn\}
61
 
2288 clevermous 62
  idtreg: ; data for LIDT instruction (!!! must be immediately below sys_int data)
63
        dw      2*($-sys_int-4)-1
8050 rgimad 64
        dd      idts ; 0x8000B100
65
        dw      0    ; alignment
2288 clevermous 66
 
67
  msg_fault_sel dd  msg_exc_8,msg_exc_u,msg_exc_a,msg_exc_b
6817 dunkaist 68
                dd  msg_exc_c,msg_exc_d,msg_exc_e,msg_exc_u
69
                dd  msg_exc_u,msg_exc_11
2288 clevermous 70
 
71
  msg_exc_8     db "Double fault", 0
72
  msg_exc_u     db "Undefined Exception", 0
73
  msg_exc_a     db "Invalid TSS", 0
74
  msg_exc_b     db "Segment not present", 0
75
  msg_exc_c     db "Stack fault", 0
76
  msg_exc_d     db "General protection fault", 0
77
  msg_exc_e     db "Page fault", 0
6817 dunkaist 78
  msg_exc_11    db "Alignment Check", 0
2288 clevermous 79
 
3342 yogev_ezra 80
  if lang eq sp
3344 yogev_ezra 81
    include 'core/sys32-sp.inc'
3342 yogev_ezra 82
  else
83
    msg_sel_ker   db "kernel", 0
84
    msg_sel_app   db "application", 0
3309 esevece 85
  end if
2288 clevermous 86
 
87
endg
88
 
89
macro save_ring3_context {
90
        pushad
91
}
92
macro restore_ring3_context {
93
        popad
94
}
95
macro exc_wo_code [num] {
96
  e#num :
97
        save_ring3_context
98
        mov     bl, num
99
        jmp     exc_c
100
} exc_wo_code   0,1,2,3,4,5,6,15,16,19
101
 
102
macro exc_w_code [num] {
103
  e#num :
104
        add     esp, 4
105
        save_ring3_context
106
        mov     bl, num
107
        jmp     exc_c
108
} exc_w_code    8,9,10,11,12,13,17,18
109
 
110
 
111
uglobal
112
  pf_err_code   dd ?
113
endg
114
 
8050 rgimad 115
page_fault_exc:                   ; foolproof: selectors are clobbered ...
116
        pop     [ss:pf_err_code]  ; actually, until the next #PF
2288 clevermous 117
        save_ring3_context
118
        mov     bl, 14
119
 
8050 rgimad 120
exc_c:                            ; exceptions (all but 7th - #NM)
121
 ; stack frame when exception/interrupt from ring3 + pushad (i.e right here)
2288 clevermous 122
  reg_ss        equ esp+0x30
123
  reg_esp3      equ esp+0x2C
124
  reg_eflags    equ esp+0x28
125
  reg_cs3       equ esp+0x24
126
  reg_eip       equ esp+0x20
8050 rgimad 127
 ; this if frame from pushad
2288 clevermous 128
  reg_eax       equ esp+0x1C
129
  reg_ecx       equ esp+0x18
130
  reg_edx       equ esp+0x14
131
  reg_ebx       equ esp+0x10
132
  reg_esp0      equ esp+0x0C
133
  reg_ebp       equ esp+0x08
134
  reg_esi       equ esp+0x04
135
  reg_edi       equ esp+0x00
136
 
8050 rgimad 137
        mov     ax, app_data       ; exception
138
        mov     ds, ax             ; load proper values
139
        mov     es, ax             ; to registers
8051 rgimad 140
        cld                        ; clear the direction flag
2288 clevermous 141
        movzx   ebx, bl
142
; redirect to V86 manager? (EFLAGS & 0x20000) != 0?
143
        test    byte[reg_eflags+2], 2
144
        jnz     v86_exc_c
8050 rgimad 145
        cmp     bl, 14             ; #PF
2288 clevermous 146
        jne     @f
147
        call    page_fault_handler ; SEE: core/memory.inc
148
  @@:
149
        mov     esi, [current_slot]
9715 Doczom 150
        btr     [esi + APPDATA.except_mask], ebx
2288 clevermous 151
        jnc     @f
9715 Doczom 152
        mov     eax, [esi + APPDATA.exc_handler]
2288 clevermous 153
        test    eax, eax
154
        jnz     IRetToUserHook
155
  @@:
156
        cli
9715 Doczom 157
        mov     eax, [esi + APPDATA.debugger_slot]
2288 clevermous 158
        test    eax, eax
159
        jnz     .debug
6793 pathoswith 160
; not debuggee => say error and terminate
9709 Doczom 161
        call    show_error_parameters  ; this function output in edx = current_slot
2288 clevermous 162
        sti
9709 Doczom 163
        mov     [edx + APPDATA.state], TSTATE_TERMINATING
3534 clevermous 164
        call    wakeup_osloop
3615 clevermous 165
        call    change_task
166
; If we're here, then the main OS thread has crashed before initializing IDLE thread.
167
; Or they both have crashed. Anyway, things are hopelessly broken.
168
        hlt
169
        jmp     $-1
2288 clevermous 170
.debug:
171
; we are debugged process, notify debugger and suspend ourself
172
; eax=debugger PID
173
        mov     ecx, 1          ; debug_message code=other_exception
174
        cmp     bl, 1           ; #DB
175
        jne     .notify         ; notify debugger and suspend ourself
176
        mov     ebx, dr6        ; debug_message data=DR6_image
177
        xor     edx, edx
178
        mov     dr6, edx
179
        mov     edx, dr7
180
        mov     cl, not 8
181
  .l1:
182
        shl     dl, 2
183
        jc      @f
184
        and     bl, cl
185
  @@:
186
        sar     cl, 1
187
        jc      .l1
188
        mov     cl, 3           ; debug_message code=debug_exception
189
.notify:
190
        push    ebx             ; debug_message data
9692 Doczom 191
        mov     ebx, [current_slot]
192
        push    [ebx + APPDATA.tid] ; PID
2288 clevermous 193
        push    ecx             ; debug_message code ((here: ecx==1/3))
194
        mov     cl, 12          ; debug_message size
195
        call    debugger_notify ;; only ONE using, inline ??? SEE: core/debug.inc
196
        add     esp, 12
9709 Doczom 197
        mov     edx, [current_slot]
198
        mov     [edx + APPDATA.state], TSTATE_RUN_SUSPENDED
2288 clevermous 199
        call    change_task     ; SEE: core/shed.inc
200
        restore_ring3_context
201
        iretd
202
 
203
IRetToUserHook:
9976 Jurgen 204
        cmp     ebx, 12
205
        je      .ex_stack
206
        cmp     ebx, 14
207
        jne     .nostack
208
        mov     ecx, cr2
209
        sub     ecx, [reg_esp3]
210
        jg      .nostack
211
        add     ecx, 1000h
212
        jl      .nostack
213
.ex_stack:
214
        xor     ecx, ecx
215
        mov     ecx, [ecx+APP_HEADER_01_.except_stack_top]
216
        test    ecx, ecx
217
        jle     .nostack
218
        xchg    edi, eax
219
        sub     ecx, sizeof.EXCEPT_STACK
220
        push    ebx
221
        push    1
222
        pop     ebx
223
.lock:
224
        lock bts [ecx+EXCEPT_STACK.LockAccess], 0
225
        jnc     .lock1
226
        call    delay_hs_unprotected
227
        jmp     .lock
228
.lock1:
229
        pop     ebx
230
        cmp     ebx, 14
231
        jne     .ex12
232
        btr     [esi+APPDATA.except_mask], 12
233
        jc      .ex_stack1
234
        xchg    eax, edi
235
        jmp     .nostack
236
.ex_stack1:
237
        bts     [esi+APPDATA.except_mask], ebx
238
        dec     ebx
239
        dec     ebx
240
.ex12:
241
        mov     [ecx+EXCEPT_STACK.ExcCode], ebx
242
        mov     eax, ecx
243
        xchg    [reg_esp3], eax
244
        mov     [ecx+EXCEPT_STACK.OldESP], eax
245
        mov     eax, cr2
246
        mov     [ecx+EXCEPT_STACK.RegCR2], eax
247
        xchg    edi, [reg_eip]
248
        mov     [ecx+EXCEPT_STACK.RegEIP], edi
249
        jmp     .end
250
.nostack:
2288 clevermous 251
        xchg    eax, [reg_eip]
252
        sub     dword[reg_esp3], 8
253
        mov     edi, [reg_esp3]
254
        stosd
255
        mov     [edi], ebx
9976 Jurgen 256
.end:
2288 clevermous 257
        restore_ring3_context
258
; simply return control to interrupted process
259
unknown_interrupt:
260
        iretd
261
 
262
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
263
; bl - error vector
264
show_error_parameters:
265
        cmp     bl, 0x06
266
        jnz     .no_ud
267
        push    ebx
268
        mov     ebx, ud_user_message
269
        mov     ebp, notifyapp
270
        call    fs_execute_from_sysdir_param
271
        pop     ebx
272
.no_ud:
9692 Doczom 273
        mov     edx, [current_slot];not scratched below
3309 esevece 274
        if lang eq sp
9692 Doczom 275
        DEBUGF  1, "K : Proceso - terminado forzado PID: %x [%s]\n", [edx + APPDATA.tid], [current_slot]
3309 esevece 276
        else
9692 Doczom 277
        DEBUGF  1, "K : Process - forced terminate PID: %x [%s]\n", [edx + APPDATA.tid], [current_slot]
3309 esevece 278
        end if
2288 clevermous 279
        cmp     bl, 0x08
280
        jb      .l0
6817 dunkaist 281
        cmp     bl, 0x11
2288 clevermous 282
        jbe     .l1
283
  .l0:
284
        mov     bl, 0x09
285
  .l1:
286
        mov     eax, [msg_fault_sel+ebx*4 - 0x08*4]
287
        DEBUGF  1, "K : %s\n", eax
288
        mov     eax, [reg_cs3+4]
289
        mov     edi, msg_sel_app
290
        mov     ebx, [reg_esp3+4]
291
        cmp     eax, app_code
292
        je      @f
293
        mov     edi, msg_sel_ker
294
        mov     ebx, [reg_esp0+4]
295
    @@:
296
        DEBUGF  1, "K : EAX : %x EBX : %x ECX : %x\n", [reg_eax+4], [reg_ebx+4], [reg_ecx+4]
297
        DEBUGF  1, "K : EDX : %x ESI : %x EDI : %x\n", [reg_edx+4], [reg_esi+4], [reg_edi+4]
298
        DEBUGF  1, "K : EBP : %x EIP : %x ESP : %x\n", [reg_ebp+4], [reg_eip+4], ebx
299
        DEBUGF  1, "K : Flags : %x CS : %x (%s)\n", [reg_eflags+4], eax, edi
3911 mario79 300
 
3909 mario79 301
        DEBUGF  1, "K : Stack dump:\n"
3911 mario79 302
        push    eax ebx ecx edx
303
        call    .check_ESP
304
        test    eax, eax
305
        jnz     .error_ESP
306
        DEBUGF  1, "K : [ESP+00]: %x",[ebx]
307
        add     ebx, 4
308
        call    .check_ESP
309
        test    eax, eax
310
        jnz     .error_ESP
311
        DEBUGF  1, " [ESP+04]: %x",[ebx]
312
        add     ebx, 4
313
        call    .check_ESP
314
        test    eax, eax
315
        jnz     .error_ESP
5356 serge 316
        DEBUGF  1, " [ESP+08]: %x\n",[ebx]
3911 mario79 317
        add     ebx, 4
318
        call    .check_ESP
319
        test    eax, eax
320
        jnz     .error_ESP
321
        DEBUGF  1, "K : [ESP+12]: %x",[ebx]
322
        add     ebx, 4
323
        call    .check_ESP
324
        test    eax, eax
325
        jnz     .error_ESP
326
        DEBUGF  1, " [ESP+16]: %x",[ebx]
327
        add     ebx, 4
328
        call    .check_ESP
329
        test    eax, eax
330
        jnz     .error_ESP
331
        DEBUGF  1, " [ESP+20]: %x\n",[ebx]
332
        add     ebx, 4
333
        call    .check_ESP
334
        test    eax, eax
335
        jnz     .error_ESP
336
        DEBUGF  1, "K : [ESP+24]: %x",[ebx]
337
        add     ebx, 4
338
        call    .check_ESP
339
        test    eax, eax
340
        jnz     .error_ESP
341
        DEBUGF  1, " [ESP+28]: %x",[ebx]
342
        add     ebx, 4
343
        call    .check_ESP
344
        test    eax, eax
345
        jnz     .error_ESP
5356 serge 346
        DEBUGF  1, " [ESP+32]: %x\n",[ebx]
3911 mario79 347
        pop     edx ecx ebx eax
2288 clevermous 348
        ret
3911 mario79 349
.error_ESP:
350
        pop     edx ecx ebx eax
351
        DEBUGF  1, "\n"
352
        DEBUGF  1, "K : Unexpected end of the stack\n"
353
        ret
354
;--------------------------------------
355
.check_ESP:
356
        push    ebx
357
        shr     ebx, 12
358
        mov     ecx, ebx
359
        shr     ecx, 10
9715 Doczom 360
        mov     edx, [master_tab + ecx*4]
5356 serge 361
        test    edx, PG_READ
8050 rgimad 362
        jz      .fail             ; page table is not created
363
                                  ; incorrect address in the program
3911 mario79 364
 
9715 Doczom 365
        mov     eax, [page_tabs + ebx*4]
3911 mario79 366
        test    eax, 2
8050 rgimad 367
        jz      .fail             ; address not reserved for use. error
5356 serge 368
 
369
        pop     ebx
3911 mario79 370
        xor     eax, eax
5356 serge 371
        ret
372
 
3911 mario79 373
.fail:
374
        pop     ebx
375
        xor     eax, eax
376
        dec     eax
377
        ret
2288 clevermous 378
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
379
 
380
  restore  reg_ss
381
  restore  reg_esp3
382
  restore  reg_eflags
383
  restore  reg_cs
384
  restore  reg_eip
385
  restore  reg_eax
386
  restore  reg_ecx
387
  restore  reg_edx
388
  restore  reg_ebx
389
  restore  reg_esp0
390
  restore  reg_ebp
391
  restore  reg_esi
392
  restore  reg_edi
393
 
394
 
395
align 4
3534 clevermous 396
lock_application_table:
397
        push    eax ecx edx
398
        mov     ecx, application_table_mutex
399
        call    mutex_lock
2288 clevermous 400
 
9828 Doczom 401
        mov     eax, [current_slot]
402
        mov     eax, [eax + APPDATA.tid]
2288 clevermous 403
 
3534 clevermous 404
        mov     [application_table_owner], eax
2288 clevermous 405
 
3534 clevermous 406
        pop     edx ecx eax
2288 clevermous 407
 
408
        ret
409
 
410
align 4
3534 clevermous 411
unlock_application_table:
412
        push    eax ecx edx
2288 clevermous 413
 
3534 clevermous 414
        mov     [application_table_owner], 0
415
        mov     ecx, application_table_mutex
416
        call    mutex_unlock
2288 clevermous 417
 
3534 clevermous 418
        pop     edx ecx eax
2288 clevermous 419
 
420
        ret
421
 
8050 rgimad 422
; sysfn 64 implementation
2288 clevermous 423
align 4
424
sys_resize_app_memory:
8050 rgimad 425
; in:   eax = 64 - function number
426
;       ebx = 1 - number of its only subfunction
427
;       ecx = new amount of memory
428
; out:
429
;       eax = 0 - success
430
;       eax = 1 - out of memory
2288 clevermous 431
 
432
;        cmp    eax,1
433
        dec     ebx
434
        jnz     .no_application_mem_resize
4313 mario79 435
 
436
        mov     eax, [pg_data.pages_free]
437
        shl     eax, 12
438
        cmp     eax, ecx
439
        jae     @f
440
 
441
        xor     eax, eax
442
        inc     eax
443
        jmp     .store_result
444
@@:
2288 clevermous 445
        stdcall new_mem_resize, ecx
4313 mario79 446
.store_result:
9831 dunkaist 447
        mov     [esp + SYSCALL_STACK.eax], eax
2288 clevermous 448
.no_application_mem_resize:
449
        ret
450
 
451
iglobal
452
;  process_terminating  db 'K : Process - terminating',13,10,0
453
;  process_terminated   db 'K : Process - done',13,10,0
454
  msg_obj_destroy       db 'K : destroy app object',13,10,0
455
endg
456
 
457
; param
458
;  esi= slot
459
 
460
align 4
461
terminate: ; terminate application
5130 serge 462
destroy_thread:
2288 clevermous 463
 
5130 serge 464
        .slot     equ esp+4             ;locals
465
        .process  equ esp               ;ptr to parent process
2288 clevermous 466
 
5130 serge 467
 
2288 clevermous 468
        push    esi        ;save .slot
469
 
9709 Doczom 470
        shl     esi, BSF sizeof.APPDATA
9715 Doczom 471
        mov     edx, [SLOT_BASE + esi + APPDATA.process]
5130 serge 472
        test    edx, edx
473
        jnz     @F
9709 Doczom 474
        mov     [SLOT_BASE + esi + APPDATA.state], TSTATE_FREE
2288 clevermous 475
        pop     esi
476
        ret
477
@@:
5130 serge 478
        push    edx                     ;save .process
9715 Doczom 479
        lea     edx, [SLOT_BASE + esi]
3534 clevermous 480
        call    scheduler_remove_thread
481
        call    lock_application_table
2288 clevermous 482
 
483
; if the process is in V86 mode...
484
        mov     eax, [.slot]
9709 Doczom 485
        shl     eax, BSF sizeof.APPDATA
9715 Doczom 486
        mov     esi, [SLOT_BASE + eax + APPDATA.pl0_stack]
2288 clevermous 487
        add     esi, RING0_STACK_SIZE
9715 Doczom 488
        cmp     [SLOT_BASE + eax + APPDATA.saved_esp0], esi
2288 clevermous 489
        jz      .nov86
490
; ...it has page directory for V86 mode
9715 Doczom 491
        mov     esi, [SLOT_BASE + eax + APPDATA.saved_esp0]
2288 clevermous 492
        mov     ecx, [esi+4]
9715 Doczom 493
        mov     [SLOT_BASE + eax + APPDATA.process], ecx
2288 clevermous 494
; ...and I/O permission map for V86 mode
495
        mov     ecx, [esi+12]
9715 Doczom 496
        mov     [SLOT_BASE + eax + APPDATA.io_map], ecx
2288 clevermous 497
        mov     ecx, [esi+8]
9715 Doczom 498
        mov     [SLOT_BASE + eax + APPDATA.io_map+4], ecx
2288 clevermous 499
.nov86:
8050 rgimad 500
; destroy per-thread kernel objects
2288 clevermous 501
        mov     esi, [.slot]
9709 Doczom 502
        shl     esi, BSF sizeof.APPDATA
9715 Doczom 503
        add     esi, SLOT_BASE + APP_OBJ_OFFSET
2288 clevermous 504
@@:
9715 Doczom 505
        mov     eax, [esi + APPOBJ.fd]
2288 clevermous 506
        test    eax, eax
507
        jz      @F
508
 
509
        cmp     eax, esi
510
        je      @F
511
 
512
        push    esi
9715 Doczom 513
        call    [eax + APPOBJ.destroy]
2288 clevermous 514
           DEBUGF 1,"%s",msg_obj_destroy
515
        pop     esi
516
        jmp     @B
517
@@:
518
        mov     esi, [.slot]
3534 clevermous 519
        cmp     [fpu_owner], esi ; if user fpu last -> fpu user = 2
2288 clevermous 520
        jne     @F
521
 
3534 clevermous 522
        mov     [fpu_owner], 2
9715 Doczom 523
        mov     eax, [SLOT_BASE + sizeof.APPDATA*2 + APPDATA.fpu_state]
2288 clevermous 524
        clts
525
        bt      [cpu_caps], CAPS_SSE
526
        jnc     .no_SSE
527
        fxrstor [eax]
528
        jmp     @F
529
.no_SSE:
530
        fnclex
531
        frstor  [eax]
532
@@:
533
 
534
        mov     [KEY_COUNT], byte 0    ; empty keyboard buffer
535
        mov     [BTN_COUNT], byte 0    ; empty button buffer
536
 
537
 
538
; remove defined hotkeys
539
        mov     eax, hotkey_list
540
.loop:
541
        cmp     [eax+8], esi
542
        jnz     .cont
543
        mov     ecx, [eax]
544
        jecxz   @f
545
        push    dword [eax+12]
546
        pop     dword [ecx+12]
547
@@:
548
        mov     ecx, [eax+12]
549
        push    dword [eax]
550
        pop     dword [ecx]
551
        xor     ecx, ecx
552
        mov     [eax], ecx
553
        mov     [eax+4], ecx
554
        mov     [eax+8], ecx
555
        mov     [eax+12], ecx
556
.cont:
557
        add     eax, 16
558
        cmp     eax, hotkey_list+256*16
559
        jb      .loop
2709 mario79 560
; get process PID
561
        mov     eax, esi
9692 Doczom 562
        shl     eax, BSF sizeof.APPDATA
563
        mov     eax, [eax + SLOT_BASE + APPDATA.tid]
2709 mario79 564
; compare current lock input with process PID
565
        cmp     eax, [PID_lock_input]
566
        jne     @f
567
 
568
        xor     eax, eax
569
        mov     [PID_lock_input], eax
570
@@:
2288 clevermous 571
; remove hotkeys in buffer
572
        mov     eax, hotkey_buffer
573
.loop2:
574
        cmp     [eax], esi
575
        jnz     .cont2
576
        and     dword [eax+4], 0
577
        and     dword [eax], 0
578
.cont2:
579
        add     eax, 8
580
        cmp     eax, hotkey_buffer+120*8
581
        jb      .loop2
582
 
583
        mov     ecx, esi          ; remove buttons
9910 Doczom 584
  .bnewba2:
2288 clevermous 585
        mov     edi, [BTN_ADDR]
586
        mov     eax, edi
587
        cld
588
        movzx   ebx, word [edi]
589
        inc     bx
9910 Doczom 590
  .bnewba:
2288 clevermous 591
        dec     bx
9910 Doczom 592
        jz      .bnmba
2288 clevermous 593
        add     eax, 0x10
594
        cmp     cx, [eax]
9910 Doczom 595
        jnz     .bnewba
2288 clevermous 596
        pusha
597
        mov     ecx, ebx
598
        inc     ecx
599
        shl     ecx, 4
600
        mov     ebx, eax
601
        add     eax, 0x10
602
        call    memmove
603
        dec     dword [edi]
604
        popa
9910 Doczom 605
        jmp     .bnewba2
606
  .bnmba:
2288 clevermous 607
 
608
        pusha   ; save window coordinates for window restoring
609
        cld
8858 rgimad 610
        shl     esi, BSF sizeof.WDATA
2288 clevermous 611
        add     esi, window_data
9715 Doczom 612
        mov     eax, [esi + WDATA.box.left]
2288 clevermous 613
        mov     [draw_limits.left], eax
9715 Doczom 614
        add     eax, [esi + WDATA.box.width]
2288 clevermous 615
        mov     [draw_limits.right], eax
9715 Doczom 616
        mov     eax, [esi + WDATA.box.top]
2288 clevermous 617
        mov     [draw_limits.top], eax
9715 Doczom 618
        add     eax, [esi + WDATA.box.height]
2288 clevermous 619
        mov     [draw_limits.bottom], eax
620
 
621
        xor     eax, eax
8858 rgimad 622
        mov     edi, esi
623
        mov     ecx, sizeof.WDATA/4
624
        rep stosd
2288 clevermous 625
        popa
626
 
627
; debuggee test
628
        pushad
629
        mov     edi, esi
9692 Doczom 630
        shl     edi, BSF sizeof.APPDATA
631
        mov     eax, [SLOT_BASE + edi + APPDATA.debugger_slot]
2288 clevermous 632
        test    eax, eax
633
        jz      .nodebug
3598 clevermous 634
        movi    ecx, 8
9692 Doczom 635
        push    dword [SLOT_BASE + edi + APPDATA.tid]; PID
2288 clevermous 636
        push    2
637
        call    debugger_notify
638
        pop     ecx
639
        pop     ecx
640
.nodebug:
641
        popad
642
 
643
        mov     ebx, [.slot]
9709 Doczom 644
        shl     ebx, BSF sizeof.APPDATA
2288 clevermous 645
        push    ebx
9715 Doczom 646
        mov     ebx, [SLOT_BASE + ebx + APPDATA.pl0_stack]
2288 clevermous 647
 
648
        stdcall kernel_free, ebx
649
 
650
        pop     ebx
9715 Doczom 651
        mov     ebx, [SLOT_BASE + ebx + APPDATA.cur_dir]
2288 clevermous 652
        stdcall kernel_free, ebx
653
 
654
        mov     edi, [.slot]
9709 Doczom 655
        shl     edi, BSF sizeof.APPDATA
2288 clevermous 656
        add     edi, SLOT_BASE
657
 
9715 Doczom 658
        mov     eax, [edi + APPDATA.io_map]
659
        cmp     eax, [SLOT_BASE + sizeof.APPDATA+APPDATA.io_map]
2288 clevermous 660
        je      @F
661
        call    free_page
662
@@:
663
        mov     eax, [edi+APPDATA.io_map+4]
8093 dunkaist 664
        cmp     eax, [SLOT_BASE+sizeof.APPDATA+APPDATA.io_map+4]
2288 clevermous 665
        je      @F
666
        call    free_page
667
@@:
9715 Doczom 668
        lea     ebx, [edi + APPDATA.list]
5130 serge 669
        list_del ebx                    ;destroys edx, ecx
670
 
2288 clevermous 671
  ; activate window
672
        movzx   eax, word [WIN_STACK + esi*2]
8866 rgimad 673
        cmp     eax, [thread_count]
2288 clevermous 674
        jne     .dont_activate
675
        pushad
676
 .check_next_window:
677
        dec     eax
678
        cmp     eax, 1
679
        jbe     .nothing_to_activate
9715 Doczom 680
        lea     esi, [WIN_POS + eax*2]
2288 clevermous 681
        movzx   edi, word [esi]              ; edi = process
9709 Doczom 682
        shl     edi, BSF sizeof.APPDATA
683
        cmp     [SLOT_BASE + edi + APPDATA.state], TSTATE_FREE ; skip free slots
2288 clevermous 684
        je      .check_next_window
9926 Doczom 685
        shr     edi, (BSF sizeof.APPDATA - BSF sizeof.WDATA)
2288 clevermous 686
        add     edi, window_data
687
; \begin{diamond}[19.09.2006]
688
; skip minimized windows
689
        test    [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
690
        jnz     .check_next_window
691
; \end{diamond}
692
        call    waredraw
693
 .nothing_to_activate:
694
        popad
695
 .dont_activate:
696
 
697
        push    esi     ; remove hd1 & cd & flp reservation
9692 Doczom 698
        shl     esi, BSF sizeof.APPDATA
9715 Doczom 699
        mov     esi, [SLOT_BASE + esi + APPDATA.tid]
2288 clevermous 700
        cmp     [cd_status], esi
701
        jnz     @f
702
        call    free_cd_channel
703
        and     [cd_status], 0
704
@@:
705
        pop     esi
706
        cmp     [bgrlockpid], esi
707
        jnz     @f
708
        and     [bgrlockpid], 0
709
        and     [bgrlock], 0
710
@@:
711
 
712
        pusha                 ; remove all port reservations
713
        mov     edx, esi
9692 Doczom 714
        shl     edx, BSF sizeof.APPDATA
9715 Doczom 715
        mov     edx, [SLOT_BASE + edx + APPDATA.tid]
2288 clevermous 716
 
9910 Doczom 717
  .rmpr0:
2288 clevermous 718
        mov     esi, [RESERVED_PORTS]
719
 
720
        test    esi, esi
9910 Doczom 721
        jz      .rmpr9
2288 clevermous 722
 
9910 Doczom 723
  .rmpr3:
2288 clevermous 724
 
725
        mov     edi, esi
726
        shl     edi, 4
727
        add     edi, RESERVED_PORTS
728
 
729
        cmp     edx, [edi]
9910 Doczom 730
        je      .rmpr4
2288 clevermous 731
 
732
        dec     esi
9910 Doczom 733
        jnz     .rmpr3
2288 clevermous 734
 
9910 Doczom 735
        jmp     .rmpr9
2288 clevermous 736
 
9910 Doczom 737
  .rmpr4:
2288 clevermous 738
 
739
        mov     ecx, 256
740
        sub     ecx, esi
741
        shl     ecx, 4
742
 
743
        mov     esi, edi
744
        add     esi, 16
745
        cld
746
        rep movsb
747
 
748
        dec     dword [RESERVED_PORTS]
749
 
9910 Doczom 750
        jmp     .rmpr0
2288 clevermous 751
 
9910 Doczom 752
  .rmpr9:
9743 Doczom 753
        popa
2288 clevermous 754
 
9743 Doczom 755
; clearing APPDATA structure this thread
756
        pushad
757
        mov     edi, esi
758
        shl     edi, BSF sizeof.APPDATA
759
        add     edi, SLOT_BASE
760
        mov     eax, 0x20202020
761
        stosd
762
        stosd
763
        stosd
764
        mov     ecx, 244/4
765
        xor     eax, eax
766
        rep stosd
767
        popad
768
 
2288 clevermous 769
        mov     edi, esi ; do not run this process slot
9709 Doczom 770
        shl     edi, BSF sizeof.APPDATA
9715 Doczom 771
        mov     [SLOT_BASE + edi + APPDATA.state], TSTATE_FREE
2288 clevermous 772
; debugger test - terminate all debuggees
773
        mov     eax, 2
9715 Doczom 774
        mov     ecx, SLOT_BASE + 2*sizeof.APPDATA + APPDATA.debugger_slot
2288 clevermous 775
.xd0:
8866 rgimad 776
        cmp     eax, [thread_count]
2288 clevermous 777
        ja      .xd1
778
        cmp     dword [ecx], esi
779
        jnz     @f
780
        and     dword [ecx], 0
781
        pushad
782
        xchg    eax, ecx
783
        mov     ebx, 2
784
        call    sys_system
785
        popad
786
@@:
787
        inc     eax
9692 Doczom 788
        add     ecx, sizeof.APPDATA
2288 clevermous 789
        jmp     .xd0
790
.xd1:
5130 serge 791
;release slot
792
 
793
        bts     [thr_slot_map], esi
794
 
795
        mov     ecx, [.process]
9715 Doczom 796
        lea     eax, [ecx + PROC.thr_list]
797
        cmp     eax, [eax + LHEAD.next]
5130 serge 798
        jne     @F
799
 
800
        call    destroy_process.internal
801
@@:
2288 clevermous 802
        sti     ; .. and life goes on
803
 
804
        mov     eax, [draw_limits.left]
805
        mov     ebx, [draw_limits.top]
806
        mov     ecx, [draw_limits.right]
807
        mov     edx, [draw_limits.bottom]
808
        call    calculatescreen
809
        xor     eax, eax
810
        xor     esi, esi
811
        call    redrawscreen
812
 
3534 clevermous 813
        call    unlock_application_table
2288 clevermous 814
    ;mov   esi,process_terminated
815
    ;call  sys_msg_board_str
5130 serge 816
        add     esp, 8
2288 clevermous 817
        ret
818
restore .slot
5130 serge 819
restore .process
2288 clevermous 820
 
3296 clevermous 821
; Three following procedures are used to guarantee that
822
; some part of kernel code will not be terminated from outside
823
; while it is running.
824
; Note: they do not protect a thread from terminating due to errors inside
825
; the thread; accessing a nonexisting memory would still terminate it.
826
 
827
; First two procedures must be used in pair by thread-to-be-protected
828
; to signal the beginning and the end of an important part.
829
; It is OK to have nested areas.
830
 
831
; The last procedure must be used by outside wanna-be-terminators;
832
; if it is safe to terminate the given thread immediately, it returns eax=1;
833
; otherwise, it returns eax=0 and notifies the target thread that it should
834
; terminate itself when leaving a critical area (the last critical area if
835
; they are nested).
836
 
837
; Implementation. Those procedures use one dword in APPDATA for the thread,
838
; APPDATA.terminate_protection.
839
; * The upper bit is 1 during normal operations and 0 when terminate is requested.
840
; * Other bits form a number = depth of critical regions,
841
;   plus 1 if the upper bit is 1.
842
; * When this dword goes to zero, the thread should be destructed,
843
;   and the procedure in which it happened becomes responsible for destruction.
844
 
845
; Enter critical area. Called by thread which wants to be protected.
846
proc protect_from_terminate
847
        mov     edx, [current_slot]
848
; Atomically increment depth of critical areas and get the old value.
849
        mov     eax, 1
9715 Doczom 850
        lock xadd [edx + APPDATA.terminate_protection], eax
3296 clevermous 851
; If the old value was zero, somebody has started to terminate us,
852
; so we are destructing and cannot do anything protected.
853
; Otherwise, return to the caller.
854
        test    eax, eax
855
        jz      @f
856
        ret
857
@@:
858
; Wait for somebody to finish us.
859
        call    change_task
860
        jmp     @b
861
endp
862
 
863
; Leave critical area. Called by thread which wants to be protected.
864
proc unprotect_from_terminate
865
        mov     edx, [current_slot]
866
; Atomically decrement depth of critical areas.
9715 Doczom 867
        lock dec [edx + APPDATA.terminate_protection]
3296 clevermous 868
; If the result of decrement is zero, somebody has requested termination,
869
; but at that moment we were inside a critical area; terminate now.
870
        jz      sys_end
871
; Otherwise, return to the caller.
872
        ret
873
endp
874
 
8093 dunkaist 875
; Request termination of thread identified by edx = SLOT_BASE + slot*sizeof.APPDATA.
3296 clevermous 876
; Called by anyone.
877
proc request_terminate
878
        xor     eax, eax        ; set return value
879
; Atomically clear the upper bit. If it was already zero, then
880
; somebody has requested termination before us, so just exit.
9715 Doczom 881
        lock btr [edx + APPDATA.terminate_protection], 31
3296 clevermous 882
        jnc     .unsafe
883
; Atomically decrement depth of critical areas.
9715 Doczom 884
        lock dec [edx + APPDATA.terminate_protection]
3296 clevermous 885
; If the result of decrement is nonzero, the target thread is inside a
886
; critical area; leave termination to leaving that area.
887
        jnz     .unsafe
888
; Otherwise, it is safe to kill the target now and the caller is responsible
889
; for this. Return eax=1.
890
        inc     eax
891
.unsafe:
892
        ret
893
endp
894