Subversion Repositories Kolibri OS

Rev

Rev 2166 | Rev 2465 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2166 Rev 2434
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;                                                              ;;
6
;;                                                              ;;
7
;;  MenuetOS process management, protected ring3                ;;
7
;;  MenuetOS process management, protected ring3                ;;
8
;;                                                              ;;
8
;;                                                              ;;
9
;;  Distributed under GPL. See file COPYING for details.        ;;
9
;;  Distributed under GPL. See file COPYING for details.        ;;
10
;;  Copyright 2003 Ville Turjanmaa                              ;;
10
;;  Copyright 2003 Ville Turjanmaa                              ;;
11
;;                                                              ;;
11
;;                                                              ;;
12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13
 
13
 
14
$Revision: 2166 $
14
$Revision: 2434 $
15
 
15
 
16
 
16
 
17
align 4 ;3A08
17
align 4 ;3A08
18
build_interrupt_table:
18
build_interrupt_table:
19
        mov     edi, idts
19
        mov     edi, idts
20
        mov     esi, sys_int
20
        mov     esi, sys_int
21
        mov     ecx, 0x40
21
        mov     ecx, 0x40
22
        mov     eax, (10001110b shl 24) + os_code
22
        mov     eax, (10001110b shl 24) + os_code
-
 
23
  @@:
23
  @@:   movsw   ;low word of code-entry
24
        movsw   ;low word of code-entry
24
        stosd   ;interrupt gate type : os_code selector
25
        stosd   ;interrupt gate type : os_code selector
25
        movsw   ;high word of code-entry
26
        movsw   ;high word of code-entry
26
        loop    @b
27
        loop    @b
27
        movsd   ;copy low  dword of trap gate for int 0x40
28
        movsd   ;copy low  dword of trap gate for int 0x40
28
        movsd   ;copy high dword of trap gate for int 0x40
29
        movsd   ;copy high dword of trap gate for int 0x40
29
        lidt    [esi]
30
        lidt    [esi]
30
        ret
31
        ret
31
 
32
 
32
iglobal
33
iglobal
33
  align 4
34
  align 4
34
  sys_int:
35
  sys_int:
35
    ;exception handlers addresses (for interrupt gate construction)
36
    ;exception handlers addresses (for interrupt gate construction)
36
        dd      e0,e1,e2,e3,e4,e5,e6,except_7 ; SEE: core/fpu.inc
37
        dd      e0,e1,e2,e3,e4,e5,e6,except_7 ; SEE: core/fpu.inc
37
        dd      e8,e9,e10,e11,e12,e13,page_fault_exc,e15
38
        dd      e8,e9,e10,e11,e12,e13,page_fault_exc,e15
38
        dd      e16, e17,e18, e19
39
        dd      e16, e17,e18, e19
39
        times   12 dd unknown_interrupt ;int_20..int_31
40
        times   12 dd unknown_interrupt ;int_20..int_31
40
 
41
 
41
    ;interrupt handlers addresses (for interrupt gate construction)
42
    ;interrupt handlers addresses (for interrupt gate construction)
42
	; 0x20 .. 0x2F - IRQ handlers
43
        ; 0x20 .. 0x2F - IRQ handlers
43
        dd      irq0, irq_serv.irq_1, irq_serv.irq_2
44
        dd      irq0, irq_serv.irq_1, irq_serv.irq_2
44
        dd      irq_serv.irq_3, irq_serv.irq_4
45
        dd      irq_serv.irq_3, irq_serv.irq_4
45
        dd      irq_serv.irq_5,  irq_serv.irq_6,  irq_serv.irq_7
46
        dd      irq_serv.irq_5,  irq_serv.irq_6,  irq_serv.irq_7
46
        dd      irq_serv.irq_8,  irq_serv.irq_9,  irq_serv.irq_10
47
        dd      irq_serv.irq_8,  irq_serv.irq_9,  irq_serv.irq_10
47
        dd      irq_serv.irq_11, irq_serv.irq_12, irqD, irq_serv.irq_14, irq_serv.irq_15
48
        dd      irq_serv.irq_11, irq_serv.irq_12, irqD, irq_serv.irq_14, irq_serv.irq_15
48
	dd irq_serv.irq_16
49
        dd irq_serv.irq_16
49
	dd irq_serv.irq_17
50
        dd irq_serv.irq_17
50
	dd irq_serv.irq_18
51
        dd irq_serv.irq_18
51
	dd irq_serv.irq_19
52
        dd irq_serv.irq_19
52
	dd irq_serv.irq_20
53
        dd irq_serv.irq_20
53
	dd irq_serv.irq_21
54
        dd irq_serv.irq_21
54
	dd irq_serv.irq_22
55
        dd irq_serv.irq_22
55
	dd irq_serv.irq_23
56
        dd irq_serv.irq_23
56
 
57
 
57
    times 32 - IRQ_RESERVED dd unknown_interrupt
58
    times 32 - IRQ_RESERVED dd unknown_interrupt
58
    ;int_0x40 gate trap (for directly copied)
59
    ;int_0x40 gate trap (for directly copied)
59
        dw      i40 and 0xFFFF, os_code, 11101111b shl 8, i40 shr 16
60
        dw      i40 and 0xFFFF, os_code, 11101111b shl 8, i40 shr 16
60
 
61
 
61
  idtreg: ; data for LIDT instruction (!!! must be immediately below sys_int data)
62
  idtreg: ; data for LIDT instruction (!!! must be immediately below sys_int data)
62
        dw      2*($-sys_int-4)-1
63
        dw      2*($-sys_int-4)-1
63
        dd      idts ;0x8000B100
64
        dd      idts ;0x8000B100
64
        dw      0    ;ïðîñòî âûðàâíèâàíèå
65
        dw      0    ;ïðîñòî âûðàâíèâàíèå
65
 
66
 
66
  msg_fault_sel dd  msg_exc_8,msg_exc_u,msg_exc_a,msg_exc_b
67
  msg_fault_sel dd  msg_exc_8,msg_exc_u,msg_exc_a,msg_exc_b
67
                dd  msg_exc_c,msg_exc_d,msg_exc_e
68
                dd  msg_exc_c,msg_exc_d,msg_exc_e
68
 
69
 
69
  msg_exc_8     db "Double fault", 0
70
  msg_exc_8     db "Double fault", 0
70
  msg_exc_u     db "Undefined Exception", 0
71
  msg_exc_u     db "Undefined Exception", 0
71
  msg_exc_a     db "Invalid TSS", 0
72
  msg_exc_a     db "Invalid TSS", 0
72
  msg_exc_b     db "Segment not present", 0
73
  msg_exc_b     db "Segment not present", 0
73
  msg_exc_c     db "Stack fault", 0
74
  msg_exc_c     db "Stack fault", 0
74
  msg_exc_d     db "General protection fault", 0
75
  msg_exc_d     db "General protection fault", 0
75
  msg_exc_e     db "Page fault", 0
76
  msg_exc_e     db "Page fault", 0
76
 
77
 
77
  msg_sel_ker   db "kernel", 0
78
  msg_sel_ker   db "kernel", 0
78
  msg_sel_app   db "application", 0
79
  msg_sel_app   db "application", 0
79
 
80
 
80
endg
81
endg
81
 
82
 
82
macro save_ring3_context {
83
macro save_ring3_context {
83
        pushad
84
        pushad
84
}
85
}
85
macro restore_ring3_context {
86
macro restore_ring3_context {
86
        popad
87
        popad
87
}
88
}
88
macro exc_wo_code [num] {
89
macro exc_wo_code [num] {
89
  e#num :
90
  e#num :
90
        save_ring3_context
91
        save_ring3_context
91
        mov     bl, num
92
        mov     bl, num
92
        jmp     exc_c
93
        jmp     exc_c
93
} exc_wo_code   0,1,2,3,4,5,6,15,16,19
94
} exc_wo_code   0,1,2,3,4,5,6,15,16,19
94
 
95
 
95
macro exc_w_code [num] {
96
macro exc_w_code [num] {
96
  e#num :
97
  e#num :
97
        add     esp, 4
98
        add     esp, 4
98
        save_ring3_context
99
        save_ring3_context
99
        mov     bl, num
100
        mov     bl, num
100
        jmp     exc_c
101
        jmp     exc_c
101
} exc_w_code    8,9,10,11,12,13,17,18
102
} exc_w_code    8,9,10,11,12,13,17,18
102
 
103
 
103
 
104
 
104
uglobal
105
uglobal
105
  pf_err_code   dd ?
106
  pf_err_code   dd ?
106
endg
107
endg
107
 
108
 
108
page_fault_exc:                 ; äóðàêîóñòî÷èâîñòü: ñåëåêòîðû èñïîð÷åíû...
109
page_fault_exc:                 ; äóðàêîóñòî÷èâîñòü: ñåëåêòîðû èñïîð÷åíû...
109
        pop     [ss:pf_err_code]; äåéñòâèòåëüíî äî ñëåäóþùåãî #PF
110
        pop     [ss:pf_err_code]; äåéñòâèòåëüíî äî ñëåäóþùåãî #PF
110
        save_ring3_context
111
        save_ring3_context
111
        mov     bl,14
112
        mov     bl, 14
112
 
113
 
113
exc_c:                          ; èñêëþ÷åíèÿ (âñå, êðîìå 7-ãî - #NM)
114
exc_c:                          ; èñêëþ÷åíèÿ (âñå, êðîìå 7-ãî - #NM)
114
; Ôðýéì ñòåêà ïðè èñêëþ÷åíèè/ïðåðûâàíèè èç 3-ãî êîëüöà + pushad (ò.å., èìåííî çäåñü)
115
; Ôðýéì ñòåêà ïðè èñêëþ÷åíèè/ïðåðûâàíèè èç 3-ãî êîëüöà + pushad (ò.å., èìåííî çäåñü)
115
  reg_ss        equ esp+0x30
116
  reg_ss        equ esp+0x30
116
  reg_esp3      equ esp+0x2C
117
  reg_esp3      equ esp+0x2C
117
  reg_eflags    equ esp+0x28
118
  reg_eflags    equ esp+0x28
118
  reg_cs3       equ esp+0x24
119
  reg_cs3       equ esp+0x24
119
  reg_eip       equ esp+0x20
120
  reg_eip       equ esp+0x20
120
 ; ýòî ôðýéì îò pushad
121
 ; ýòî ôðýéì îò pushad
121
  reg_eax       equ esp+0x1C
122
  reg_eax       equ esp+0x1C
122
  reg_ecx       equ esp+0x18
123
  reg_ecx       equ esp+0x18
123
  reg_edx       equ esp+0x14
124
  reg_edx       equ esp+0x14
124
  reg_ebx       equ esp+0x10
125
  reg_ebx       equ esp+0x10
125
  reg_esp0      equ esp+0x0C
126
  reg_esp0      equ esp+0x0C
126
  reg_ebp       equ esp+0x08
127
  reg_ebp       equ esp+0x08
127
  reg_esi       equ esp+0x04
128
  reg_esi       equ esp+0x04
128
  reg_edi       equ esp+0x00
129
  reg_edi       equ esp+0x00
129
 
130
 
130
	    mov	ax, app_data	    ;èñêëþ÷åíèå
131
        mov     ax, app_data        ;èñêëþ÷åíèå
131
	    mov	ds, ax		        ;çàãðóçèì ïðàâèëüíûå çíà÷åíèÿ
132
        mov     ds, ax                  ;çàãðóçèì ïðàâèëüíûå çíà÷åíèÿ
132
	    mov	es, ax		        ;â ðåãèñòðû
133
        mov     es, ax                  ;â ðåãèñòðû
133
        cld                     ; è ïðèâîäèì DF ê ñòàíäàðòó
134
        cld                     ; è ïðèâîäèì DF ê ñòàíäàðòó
134
        movzx   ebx,bl
135
        movzx   ebx, bl
135
; redirect to V86 manager? (EFLAGS & 0x20000) != 0?
136
; redirect to V86 manager? (EFLAGS & 0x20000) != 0?
136
        test    byte[reg_eflags+2],2
137
        test    byte[reg_eflags+2], 2
137
        jnz     v86_exc_c
138
        jnz     v86_exc_c
138
        cmp     bl,14           ; #PF
139
        cmp     bl, 14          ; #PF
139
        jne     @f
140
        jne     @f
140
        call    page_fault_handler ; SEE: core/memory.inc
141
        call    page_fault_handler ; SEE: core/memory.inc
-
 
142
  @@:
141
  @@:   mov     esi, [current_slot]
143
        mov     esi, [current_slot]
142
        btr     [esi+APPDATA.except_mask], ebx
144
        btr     [esi+APPDATA.except_mask], ebx
143
        jnc     @f
145
        jnc     @f
144
        mov     eax,[esi+APPDATA.exc_handler]
146
        mov     eax, [esi+APPDATA.exc_handler]
145
        test    eax, eax
147
        test    eax, eax
146
        jnz     IRetToUserHook
148
        jnz     IRetToUserHook
-
 
149
  @@:
147
  @@:   cli
150
        cli
148
        mov     eax, [esi+APPDATA.debugger_slot]
151
        mov     eax, [esi+APPDATA.debugger_slot]
149
        test    eax, eax
152
        test    eax, eax
150
        jnz     .debug
153
        jnz     .debug
151
        sti
154
        sti
152
; not debuggee => say error and terminate
155
; not debuggee => say error and terminate
153
        call    show_error_parameters ;; only ONE using, inline ???
156
        call    show_error_parameters ;; only ONE using, inline ???
154
       ;mov     edx, [TASK_BASE]
157
       ;mov     edx, [TASK_BASE]
155
        mov     [edx + TASKDATA.state], byte 4 ; terminate
158
        mov     [edx + TASKDATA.state], byte 4 ; terminate
156
        jmp     change_task     ; stack - here it does not matter at all, SEE: core/shed.inc
159
        jmp     change_task     ; stack - here it does not matter at all, SEE: core/shed.inc
157
.debug:
160
.debug:
158
; we are debugged process, notify debugger and suspend ourself
161
; we are debugged process, notify debugger and suspend ourself
159
; eax=debugger PID
162
; eax=debugger PID
160
        mov     ecx,1           ; debug_message code=other_exception
163
        mov     ecx, 1          ; debug_message code=other_exception
161
        cmp     bl,1            ; #DB
164
        cmp     bl, 1           ; #DB
162
        jne     .notify         ; notify debugger and suspend ourself
165
        jne     .notify         ; notify debugger and suspend ourself
163
        mov     ebx, dr6        ; debug_message data=DR6_image
166
        mov     ebx, dr6        ; debug_message data=DR6_image
164
        xor     edx, edx
167
        xor     edx, edx
165
        mov     dr6, edx
168
        mov     dr6, edx
166
        mov     edx, dr7
169
        mov     edx, dr7
167
        mov     cl, not 8
170
        mov     cl, not 8
-
 
171
  .l1:
168
  .l1:  shl     dl,2
172
        shl     dl, 2
169
        jc      @f
173
        jc      @f
170
        and     bl, cl
174
        and     bl, cl
-
 
175
  @@:
171
  @@:   sar     cl,1
176
        sar     cl, 1
172
        jc      .l1
177
        jc      .l1
173
        mov     cl, 3           ; debug_message code=debug_exception
178
        mov     cl, 3           ; debug_message code=debug_exception
174
.notify:
179
.notify:
175
        push    ebx             ; debug_message data
180
        push    ebx             ; debug_message data
176
        mov     ebx, [TASK_BASE]
181
        mov     ebx, [TASK_BASE]
177
        push    [ebx+TASKDATA.pid] ; PID
182
        push    [ebx+TASKDATA.pid] ; PID
178
        push    ecx             ; debug_message code ((here: ecx==1/3))
183
        push    ecx             ; debug_message code ((here: ecx==1/3))
179
        mov     cl, 12          ; debug_message size
184
        mov     cl, 12          ; debug_message size
180
        call    debugger_notify ;; only ONE using, inline ??? SEE: core/debug.inc
185
        call    debugger_notify ;; only ONE using, inline ??? SEE: core/debug.inc
181
        add     esp,12
186
        add     esp, 12
182
        mov     edx, [TASK_BASE]
187
        mov     edx, [TASK_BASE]
183
        mov     byte [edx+TASKDATA.state], 1 ; suspended
188
        mov     byte [edx+TASKDATA.state], 1 ; suspended
184
        call    change_task     ; SEE: core/shed.inc
189
        call    change_task     ; SEE: core/shed.inc
185
        restore_ring3_context
190
        restore_ring3_context
186
        iretd
191
        iretd
187
 
192
 
188
IRetToUserHook:
193
IRetToUserHook:
189
        xchg    eax, [reg_eip]
194
        xchg    eax, [reg_eip]
190
        sub     dword[reg_esp3], 8
195
        sub     dword[reg_esp3], 8
191
        mov     edi, [reg_esp3]
196
        mov     edi, [reg_esp3]
192
        stosd
197
        stosd
193
        mov     [edi], ebx
198
        mov     [edi], ebx
194
        restore_ring3_context
199
        restore_ring3_context
195
; simply return control to interrupted process
200
; simply return control to interrupted process
196
unknown_interrupt:
201
unknown_interrupt:
197
        iretd
202
        iretd
198
 
203
 
199
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
204
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
200
; bl - error vector
205
; bl - error vector
201
show_error_parameters:
206
show_error_parameters:
202
        cmp     bl, 0x06
207
        cmp     bl, 0x06
203
        jnz     .no_ud
208
        jnz     .no_ud
204
        push    ebx
209
        push    ebx
205
        mov     ebx, ud_user_message
210
        mov     ebx, ud_user_message
206
        mov     ebp, notifyapp
211
        mov     ebp, notifyapp
207
        call    fs_execute_from_sysdir_param
212
        call    fs_execute_from_sysdir_param
208
        pop     ebx
213
        pop     ebx
209
.no_ud:
214
.no_ud:
210
        mov     edx,[TASK_BASE] ;not scratched below
215
        mov     edx, [TASK_BASE];not scratched below
211
        DEBUGF  1, "K : Process - forced terminate PID: %x\n", [edx+TASKDATA.pid]
216
        DEBUGF  1, "K : Process - forced terminate PID: %x\n", [edx+TASKDATA.pid]
212
        cmp     bl, 0x08
217
        cmp     bl, 0x08
213
        jb      .l0
218
        jb      .l0
214
        cmp     bl, 0x0e
219
        cmp     bl, 0x0e
215
        jbe     .l1
220
        jbe     .l1
-
 
221
  .l0:
216
  .l0:  mov     bl, 0x09
222
        mov     bl, 0x09
-
 
223
  .l1:
217
  .l1:  mov     eax,[msg_fault_sel+ebx*4 - 0x08*4]
224
        mov     eax, [msg_fault_sel+ebx*4 - 0x08*4]
218
        DEBUGF  1, "K : %s\n", eax
225
        DEBUGF  1, "K : %s\n", eax
219
        mov     eax, [reg_cs3+4]
226
        mov     eax, [reg_cs3+4]
220
        mov     edi, msg_sel_app
227
        mov     edi, msg_sel_app
221
        mov     ebx, [reg_esp3+4]
228
        mov     ebx, [reg_esp3+4]
222
        cmp     eax, app_code
229
        cmp     eax, app_code
223
        je      @f
230
        je      @f
224
        mov     edi, msg_sel_ker
231
        mov     edi, msg_sel_ker
225
        mov     ebx, [reg_esp0+4]
232
        mov     ebx, [reg_esp0+4]
-
 
233
    @@:
226
    @@: DEBUGF  1, "K : EAX : %x EBX : %x ECX : %x\n", [reg_eax+4], [reg_ebx+4], [reg_ecx+4]
234
        DEBUGF  1, "K : EAX : %x EBX : %x ECX : %x\n", [reg_eax+4], [reg_ebx+4], [reg_ecx+4]
227
        DEBUGF  1, "K : EDX : %x ESI : %x EDI : %x\n", [reg_edx+4], [reg_esi+4], [reg_edi+4]
235
        DEBUGF  1, "K : EDX : %x ESI : %x EDI : %x\n", [reg_edx+4], [reg_esi+4], [reg_edi+4]
228
        DEBUGF  1, "K : EBP : %x EIP : %x ESP : %x\n", [reg_ebp+4], [reg_eip+4], ebx
236
        DEBUGF  1, "K : EBP : %x EIP : %x ESP : %x\n", [reg_ebp+4], [reg_eip+4], ebx
229
        DEBUGF  1, "K : Flags : %x CS : %x (%s)\n", [reg_eflags+4], eax, edi
237
        DEBUGF  1, "K : Flags : %x CS : %x (%s)\n", [reg_eflags+4], eax, edi
230
        ret
238
        ret
231
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
239
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
232
 
240
 
233
  restore  reg_ss
241
  restore  reg_ss
234
  restore  reg_esp3
242
  restore  reg_esp3
235
  restore  reg_eflags
243
  restore  reg_eflags
236
  restore  reg_cs
244
  restore  reg_cs
237
  restore  reg_eip
245
  restore  reg_eip
238
  restore  reg_eax
246
  restore  reg_eax
239
  restore  reg_ecx
247
  restore  reg_ecx
240
  restore  reg_edx
248
  restore  reg_edx
241
  restore  reg_ebx
249
  restore  reg_ebx
242
  restore  reg_esp0
250
  restore  reg_esp0
243
  restore  reg_ebp
251
  restore  reg_ebp
244
  restore  reg_esi
252
  restore  reg_esi
245
  restore  reg_edi
253
  restore  reg_edi
246
 
254
 
247
 
255
 
248
align 4
256
align 4
249
set_application_table_status:
257
set_application_table_status:
250
        push eax
258
        push    eax
251
 
259
 
252
        mov  eax,[CURRENT_TASK]
260
        mov     eax, [CURRENT_TASK]
253
        shl  eax, 5
261
        shl     eax, 5
254
        add  eax,CURRENT_TASK+TASKDATA.pid
262
        add     eax, CURRENT_TASK+TASKDATA.pid
255
        mov  eax,[eax]
263
        mov     eax, [eax]
256
 
264
 
257
        mov  [application_table_status],eax
265
        mov     [application_table_status], eax
258
 
266
 
259
        pop  eax
267
        pop     eax
260
 
268
 
261
        ret
269
        ret
262
 
270
 
263
align 4
271
align 4
264
clear_application_table_status:
272
clear_application_table_status:
265
        push eax
273
        push    eax
266
 
274
 
267
        mov  eax,[CURRENT_TASK]
275
        mov     eax, [CURRENT_TASK]
268
        shl  eax, 5
276
        shl     eax, 5
269
        add  eax,CURRENT_TASK+TASKDATA.pid
277
        add     eax, CURRENT_TASK+TASKDATA.pid
270
        mov  eax,[eax]
278
        mov     eax, [eax]
271
 
279
 
272
        cmp  eax,[application_table_status]
280
        cmp     eax, [application_table_status]
273
        jne  apptsl1
281
        jne     apptsl1
274
	xor  eax,eax
282
        xor     eax, eax
275
        mov  [application_table_status],eax
283
        mov     [application_table_status], eax
276
      apptsl1:
284
      apptsl1:
277
 
285
 
278
        pop  eax
286
        pop     eax
279
 
287
 
280
        ret
288
        ret
281
 
289
 
282
;  * eax = 64 - íîìåð ôóíêöèè
290
;  * eax = 64 - íîìåð ôóíêöèè
283
;  * ebx = 1 - åäèíñòâåííàÿ ïîäôóíêöèÿ
291
;  * ebx = 1 - åäèíñòâåííàÿ ïîäôóíêöèÿ
284
;  * ecx = íîâûé ðàçìåð ïàìÿòè
292
;  * ecx = íîâûé ðàçìåð ïàìÿòè
285
;Âîçâðàùàåìîå çíà÷åíèå:
293
;Âîçâðàùàåìîå çíà÷åíèå:
286
;  * eax = 0 - óñïåøíî
294
;  * eax = 0 - óñïåøíî
287
;  * eax = 1 - íåäîñòàòî÷íî ïàìÿòè
295
;  * eax = 1 - íåäîñòàòî÷íî ïàìÿòè
288
 
296
 
289
align 4
297
align 4
290
sys_resize_app_memory:
298
sys_resize_app_memory:
291
        ; ebx = 1 - resize
299
        ; ebx = 1 - resize
292
        ; ecx = new amount of memory
300
        ; ecx = new amount of memory
293
 
301
 
294
;        cmp    eax,1
302
;        cmp    eax,1
295
	dec	ebx
303
        dec     ebx
296
        jnz    .no_application_mem_resize
304
        jnz     .no_application_mem_resize
297
        stdcall new_mem_resize, ecx
305
        stdcall new_mem_resize, ecx
298
        mov [esp+32], eax
306
        mov     [esp+32], eax
299
.no_application_mem_resize:
307
.no_application_mem_resize:
300
        ret
308
        ret
301
 
309
 
302
iglobal
310
iglobal
303
;  process_terminating  db 'K : Process - terminating',13,10,0
311
;  process_terminating  db 'K : Process - terminating',13,10,0
304
;  process_terminated   db 'K : Process - done',13,10,0
312
;  process_terminated   db 'K : Process - done',13,10,0
305
  msg_obj_destroy       db 'K : destroy app object',13,10,0
313
  msg_obj_destroy       db 'K : destroy app object',13,10,0
306
endg
314
endg
307
 
315
 
308
; param
316
; param
309
;  esi= slot
317
;  esi= slot
310
 
318
 
311
align 4
319
align 4
312
terminate: ; terminate application
320
terminate: ; terminate application
313
 
321
 
314
           .slot equ esp   ;locals
322
           .slot equ esp   ;locals
315
 
323
 
316
           push   esi      ;save .slot
324
        push    esi        ;save .slot
317
 
325
 
318
           shl esi, 8
326
        shl     esi, 8
319
           cmp [SLOT_BASE+esi+APPDATA.dir_table], 0
327
        cmp     [SLOT_BASE+esi+APPDATA.dir_table], 0
320
           jne @F
328
        jne     @F
321
           pop    esi
329
        pop     esi
322
           shl    esi, 5
330
        shl     esi, 5
323
           mov    [CURRENT_TASK+esi+TASKDATA.state], 9
331
        mov     [CURRENT_TASK+esi+TASKDATA.state], 9
324
           ret
332
        ret
325
@@:
333
@@:
326
           ;mov    esi,process_terminating
334
           ;mov    esi,process_terminating
327
           ;call   sys_msg_board_str
335
           ;call   sys_msg_board_str
328
@@:
336
@@:
329
           cli
337
        cli
330
           cmp   [application_table_status],0
338
        cmp     [application_table_status], 0
331
           je    term9
339
        je      term9
332
           sti
340
        sti
333
           call  change_task
341
        call    change_task
334
           jmp   @b
342
        jmp     @b
335
term9:
343
term9:
336
           call  set_application_table_status
344
        call    set_application_table_status
337
 
345
 
338
; if the process is in V86 mode...
346
; if the process is in V86 mode...
339
        mov     eax, [.slot]
347
        mov     eax, [.slot]
340
        shl     eax, 8
348
        shl     eax, 8
341
        mov     esi, [eax+SLOT_BASE+APPDATA.pl0_stack]
349
        mov     esi, [eax+SLOT_BASE+APPDATA.pl0_stack]
342
        add     esi, RING0_STACK_SIZE
350
        add     esi, RING0_STACK_SIZE
343
        cmp     [eax+SLOT_BASE+APPDATA.saved_esp0], esi
351
        cmp     [eax+SLOT_BASE+APPDATA.saved_esp0], esi
344
        jz      .nov86
352
        jz      .nov86
345
; ...it has page directory for V86 mode
353
; ...it has page directory for V86 mode
346
        mov     esi, [eax+SLOT_BASE+APPDATA.saved_esp0]
354
        mov     esi, [eax+SLOT_BASE+APPDATA.saved_esp0]
347
        mov     ecx, [esi+4]
355
        mov     ecx, [esi+4]
348
        mov     [eax+SLOT_BASE+APPDATA.dir_table], ecx
356
        mov     [eax+SLOT_BASE+APPDATA.dir_table], ecx
349
; ...and I/O permission map for V86 mode
357
; ...and I/O permission map for V86 mode
350
        mov     ecx, [esi+12]
358
        mov     ecx, [esi+12]
351
        mov     [eax+SLOT_BASE+APPDATA.io_map], ecx
359
        mov     [eax+SLOT_BASE+APPDATA.io_map], ecx
352
        mov     ecx, [esi+8]
360
        mov     ecx, [esi+8]
353
        mov     [eax+SLOT_BASE+APPDATA.io_map+4], ecx
361
        mov     [eax+SLOT_BASE+APPDATA.io_map+4], ecx
354
.nov86:
362
.nov86:
355
 
363
 
356
           mov esi, [.slot]
364
        mov     esi, [.slot]
357
           shl esi,8
365
        shl     esi, 8
358
           add esi, SLOT_BASE+APP_OBJ_OFFSET
366
        add     esi, SLOT_BASE+APP_OBJ_OFFSET
359
@@:
367
@@:
360
           mov eax, [esi+APPOBJ.fd]
368
        mov     eax, [esi+APPOBJ.fd]
361
           test eax, eax
369
        test    eax, eax
362
           jz @F
370
        jz      @F
363
 
371
 
364
           cmp eax, esi
372
        cmp     eax, esi
365
           je @F
373
        je      @F
366
 
374
 
367
           push esi
375
        push    esi
368
           call [eax+APPOBJ.destroy]
376
        call    [eax+APPOBJ.destroy]
369
           DEBUGF 1,"%s",msg_obj_destroy
377
           DEBUGF 1,"%s",msg_obj_destroy
370
           pop esi
378
        pop     esi
371
           jmp @B
379
        jmp     @B
372
@@:
380
@@:
373
 
381
 
374
           mov eax, [.slot]
382
        mov     eax, [.slot]
375
           shl eax, 8
383
        shl     eax, 8
376
           stdcall destroy_app_space, [SLOT_BASE+eax+APPDATA.dir_table], [SLOT_BASE+eax+APPDATA.dlls_list_ptr]
384
        stdcall destroy_app_space, [SLOT_BASE+eax+APPDATA.dir_table], [SLOT_BASE+eax+APPDATA.dlls_list_ptr]
377
 
385
 
378
           mov esi, [.slot]
386
        mov     esi, [.slot]
379
           cmp [fpu_owner],esi   ; if user fpu last -> fpu user = 1
387
        cmp     [fpu_owner], esi ; if user fpu last -> fpu user = 1
380
           jne @F
388
        jne     @F
381
 
389
 
382
           mov [fpu_owner],1
390
        mov     [fpu_owner], 1
383
           mov eax, [256+SLOT_BASE+APPDATA.fpu_state]
391
        mov     eax, [256+SLOT_BASE+APPDATA.fpu_state]
384
           clts
392
        clts
385
           bt [cpu_caps], CAPS_SSE
393
        bt      [cpu_caps], CAPS_SSE
386
           jnc .no_SSE
394
        jnc     .no_SSE
387
           fxrstor [eax]
395
        fxrstor [eax]
388
           jmp @F
396
        jmp     @F
389
.no_SSE:
397
.no_SSE:
390
           fnclex
398
        fnclex
391
           frstor [eax]
399
        frstor  [eax]
392
@@:
400
@@:
393
 
401
 
394
    mov   [KEY_COUNT],byte 0           ; empty keyboard buffer
402
        mov     [KEY_COUNT], byte 0    ; empty keyboard buffer
395
    mov   [BTN_COUNT],byte 0           ; empty button buffer
403
        mov     [BTN_COUNT], byte 0    ; empty button buffer
396
 
404
 
397
 
405
 
398
; remove defined hotkeys
406
; remove defined hotkeys
399
        mov     eax, hotkey_list
407
        mov     eax, hotkey_list
400
.loop:
408
.loop:
401
        cmp     [eax+8], esi
409
        cmp     [eax+8], esi
402
        jnz     .cont
410
        jnz     .cont
403
        mov     ecx, [eax]
411
        mov     ecx, [eax]
404
        jecxz   @f
412
        jecxz   @f
405
        push    dword [eax+12]
413
        push    dword [eax+12]
406
        pop     dword [ecx+12]
414
        pop     dword [ecx+12]
407
@@:
415
@@:
408
        mov     ecx, [eax+12]
416
        mov     ecx, [eax+12]
409
        push    dword [eax]
417
        push    dword [eax]
410
        pop     dword [ecx]
418
        pop     dword [ecx]
411
        xor     ecx, ecx
419
        xor     ecx, ecx
412
        mov     [eax], ecx
420
        mov     [eax], ecx
413
        mov     [eax+4], ecx
421
        mov     [eax+4], ecx
414
        mov     [eax+8], ecx
422
        mov     [eax+8], ecx
415
        mov     [eax+12], ecx
423
        mov     [eax+12], ecx
416
.cont:
424
.cont:
417
        add     eax, 16
425
        add     eax, 16
418
        cmp     eax, hotkey_list+256*16
426
        cmp     eax, hotkey_list+256*16
419
        jb      .loop
427
        jb      .loop
420
; remove hotkeys in buffer
428
; remove hotkeys in buffer
421
        mov     eax, hotkey_buffer
429
        mov     eax, hotkey_buffer
422
.loop2:
430
.loop2:
423
        cmp     [eax], esi
431
        cmp     [eax], esi
424
        jnz     .cont2
432
        jnz     .cont2
425
        and     dword [eax+4], 0
433
        and     dword [eax+4], 0
426
        and     dword [eax], 0
434
        and     dword [eax], 0
427
.cont2:
435
.cont2:
428
        add     eax, 8
436
        add     eax, 8
429
        cmp     eax, hotkey_buffer+120*8
437
        cmp     eax, hotkey_buffer+120*8
430
        jb      .loop2
438
        jb      .loop2
431
 
439
 
432
    mov   ecx,esi                 ; remove buttons
440
        mov     ecx, esi          ; remove buttons
433
  bnewba2:
441
  bnewba2:
434
    mov   edi,[BTN_ADDR]
442
        mov     edi, [BTN_ADDR]
435
    mov   eax,edi
443
        mov     eax, edi
436
    cld
444
        cld
437
    movzx ebx,word [edi]
445
        movzx   ebx, word [edi]
438
    inc   bx
446
        inc     bx
439
  bnewba:
447
  bnewba:
440
    dec   bx
448
        dec     bx
441
    jz    bnmba
449
        jz      bnmba
442
    add   eax,0x10
450
        add     eax, 0x10
443
    cmp   cx,[eax]
451
        cmp     cx, [eax]
444
    jnz   bnewba
452
        jnz     bnewba
445
    pusha
453
        pusha
446
    mov   ecx,ebx
454
        mov     ecx, ebx
447
    inc   ecx
455
        inc     ecx
448
    shl   ecx,4
456
        shl     ecx, 4
449
    mov   ebx,eax
457
        mov     ebx, eax
450
    add   eax,0x10
458
        add     eax, 0x10
451
    call  memmove
459
        call    memmove
452
    dec   dword [edi]
460
        dec     dword [edi]
453
    popa
461
        popa
454
    jmp   bnewba2
462
        jmp     bnewba2
455
  bnmba:
463
  bnmba:
456
 
464
 
457
    pusha     ; save window coordinates for window restoring
465
        pusha   ; save window coordinates for window restoring
458
    cld
466
        cld
459
    shl   esi,5
467
        shl     esi, 5
460
    add   esi,window_data
468
        add     esi, window_data
461
    mov   eax,[esi+WDATA.box.left]
469
        mov     eax, [esi+WDATA.box.left]
462
    mov   [draw_limits.left],eax
470
        mov     [draw_limits.left], eax
463
    add   eax,[esi+WDATA.box.width]
471
        add     eax, [esi+WDATA.box.width]
464
    mov   [draw_limits.right],eax
472
        mov     [draw_limits.right], eax
465
    mov   eax,[esi+WDATA.box.top]
473
        mov     eax, [esi+WDATA.box.top]
466
    mov   [draw_limits.top],eax
474
        mov     [draw_limits.top], eax
467
    add   eax,[esi+WDATA.box.height]
475
        add     eax, [esi+WDATA.box.height]
468
    mov   [draw_limits.bottom],eax
476
        mov     [draw_limits.bottom], eax
469
 
477
 
470
    xor   eax, eax
478
        xor     eax, eax
471
    mov   [esi+WDATA.box.left],eax
479
        mov     [esi+WDATA.box.left], eax
472
    mov   [esi+WDATA.box.width],eax
480
        mov     [esi+WDATA.box.width], eax
473
    mov   [esi+WDATA.box.top],eax
481
        mov     [esi+WDATA.box.top], eax
474
    mov   [esi+WDATA.box.height],eax
482
        mov     [esi+WDATA.box.height], eax
475
    mov   [esi+WDATA.cl_workarea],eax
483
        mov     [esi+WDATA.cl_workarea], eax
476
    mov   [esi+WDATA.cl_titlebar],eax
484
        mov     [esi+WDATA.cl_titlebar], eax
477
    mov   [esi+WDATA.cl_frames],eax
485
        mov     [esi+WDATA.cl_frames], eax
478
    mov   dword [esi+WDATA.reserved],eax ; clear all flags: wstate, redraw, wdrawn
486
        mov     dword [esi+WDATA.reserved], eax; clear all flags: wstate, redraw, wdrawn
479
    lea   edi, [esi-window_data+draw_data]
487
        lea     edi, [esi-window_data+draw_data]
480
    mov   ecx,32/4
488
        mov     ecx, 32/4
481
    rep   stosd
489
        rep stosd
482
    popa
490
        popa
483
 
491
 
484
; debuggee test
492
; debuggee test
485
    pushad
493
        pushad
486
    mov  edi, esi
494
        mov     edi, esi
487
    shl  edi, 5
495
        shl     edi, 5
488
    mov  eax, [SLOT_BASE+edi*8+APPDATA.debugger_slot]
496
        mov     eax, [SLOT_BASE+edi*8+APPDATA.debugger_slot]
489
    test eax, eax
497
        test    eax, eax
490
    jz   .nodebug
498
        jz      .nodebug
491
    push 8
499
        push    8
492
    pop  ecx
500
        pop     ecx
493
    push dword [CURRENT_TASK+edi+TASKDATA.pid]   ; PID
501
        push    dword [CURRENT_TASK+edi+TASKDATA.pid]; PID
494
    push 2
502
        push    2
495
    call debugger_notify
503
        call    debugger_notify
496
    pop  ecx
504
        pop     ecx
497
    pop  ecx
505
        pop     ecx
498
.nodebug:
506
.nodebug:
499
    popad
507
        popad
500
 
508
 
501
           mov ebx, [.slot]
509
        mov     ebx, [.slot]
502
           shl ebx, 8
510
        shl     ebx, 8
503
           push ebx
511
        push    ebx
504
           mov ebx,[SLOT_BASE+ebx+APPDATA.pl0_stack]
512
        mov     ebx, [SLOT_BASE+ebx+APPDATA.pl0_stack]
505
 
513
 
506
           stdcall kernel_free, ebx
514
        stdcall kernel_free, ebx
507
 
515
 
508
           pop ebx
516
        pop     ebx
509
           mov ebx,[SLOT_BASE+ebx+APPDATA.cur_dir]
517
        mov     ebx, [SLOT_BASE+ebx+APPDATA.cur_dir]
510
           stdcall kernel_free, ebx
518
        stdcall kernel_free, ebx
511
 
519
 
512
           mov edi, [.slot]
520
        mov     edi, [.slot]
513
           shl edi,8
521
        shl     edi, 8
514
           add edi,SLOT_BASE
522
        add     edi, SLOT_BASE
515
 
523
 
516
           mov eax, [edi+APPDATA.io_map]
524
        mov     eax, [edi+APPDATA.io_map]
517
           cmp eax, [SLOT_BASE+256+APPDATA.io_map]
525
        cmp     eax, [SLOT_BASE+256+APPDATA.io_map]
518
           je @F
526
        je      @F
519
           call free_page
527
        call    free_page
520
@@:
528
@@:
521
           mov eax, [edi+APPDATA.io_map+4]
529
        mov     eax, [edi+APPDATA.io_map+4]
522
           cmp eax, [SLOT_BASE+256+APPDATA.io_map+4]
530
        cmp     eax, [SLOT_BASE+256+APPDATA.io_map+4]
523
           je @F
531
        je      @F
524
           call free_page
532
        call    free_page
525
@@:
533
@@:
526
           mov eax, 0x20202020
534
        mov     eax, 0x20202020
527
           stosd
535
        stosd
528
           stosd
536
        stosd
529
           stosd
537
        stosd
530
           mov ecx,244/4
538
        mov     ecx, 244/4
531
           xor eax, eax
539
        xor     eax, eax
532
           rep stosd
540
        rep stosd
533
 
541
 
534
  ; activate window
542
  ; activate window
535
        movzx  eax, word [WIN_STACK + esi*2]
543
        movzx   eax, word [WIN_STACK + esi*2]
536
        cmp    eax, [TASK_COUNT]
544
        cmp     eax, [TASK_COUNT]
537
        jne    .dont_activate
545
        jne     .dont_activate
538
        pushad
546
        pushad
539
 .check_next_window:
547
 .check_next_window:
540
        dec    eax
548
        dec     eax
541
        cmp    eax, 1
549
        cmp     eax, 1
542
        jbe    .nothing_to_activate
550
        jbe     .nothing_to_activate
543
        lea    esi, [WIN_POS+eax*2]
551
        lea     esi, [WIN_POS+eax*2]
544
        movzx  edi, word [esi]               ; edi = process
552
        movzx   edi, word [esi]              ; edi = process
545
        shl    edi, 5
553
        shl     edi, 5
546
        cmp    [CURRENT_TASK + edi + TASKDATA.state], byte 9  ; skip dead slots
554
        cmp     [CURRENT_TASK + edi + TASKDATA.state], byte 9 ; skip dead slots
547
        je     .check_next_window
555
        je      .check_next_window
548
        add    edi, window_data
556
        add     edi, window_data
549
; \begin{diamond}[19.09.2006]
557
; \begin{diamond}[19.09.2006]
550
; skip minimized windows
558
; skip minimized windows
551
        test   [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
559
        test    [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
552
        jnz    .check_next_window
560
        jnz     .check_next_window
553
; \end{diamond}
561
; \end{diamond}
554
        call   waredraw
562
        call    waredraw
555
 .nothing_to_activate:
563
 .nothing_to_activate:
556
        popad
564
        popad
557
 .dont_activate:
565
 .dont_activate:
558
 
566
 
559
        push    esi     ; remove hd1 & cd & flp reservation
567
        push    esi     ; remove hd1 & cd & flp reservation
560
        shl     esi, 5
568
        shl     esi, 5
561
        mov     esi, [esi+CURRENT_TASK+TASKDATA.pid]
569
        mov     esi, [esi+CURRENT_TASK+TASKDATA.pid]
562
        cmp     [hd1_status], esi
570
        cmp     [hd1_status], esi
563
        jnz     @f
571
        jnz     @f
564
        call    free_hd_channel
572
        call    free_hd_channel
565
        and     [hd1_status], 0
573
        and     [hd1_status], 0
566
@@:
574
@@:
567
        cmp     [cd_status], esi
575
        cmp     [cd_status], esi
568
        jnz     @f
576
        jnz     @f
569
        call    free_cd_channel
577
        call    free_cd_channel
570
        and     [cd_status], 0
578
        and     [cd_status], 0
571
@@:
579
@@:
572
        cmp     [flp_status], esi
580
        cmp     [flp_status], esi
573
        jnz     @f
581
        jnz     @f
574
        and     [flp_status], 0
582
        and     [flp_status], 0
575
@@:
583
@@:
576
        pop     esi
584
        pop     esi
577
        cmp     [bgrlockpid], esi
585
        cmp     [bgrlockpid], esi
578
        jnz     @f
586
        jnz     @f
579
        and     [bgrlockpid], 0
587
        and     [bgrlockpid], 0
580
        and     [bgrlock], 0
588
        and     [bgrlock], 0
581
@@:
589
@@:
582
 
590
 
583
    pusha                     ; remove all port reservations
591
        pusha                 ; remove all port reservations
584
    mov   edx,esi
592
        mov     edx, esi
585
    shl   edx, 5
593
        shl     edx, 5
586
    add   edx,CURRENT_TASK
594
        add     edx, CURRENT_TASK
587
    mov   edx,[edx+TASKDATA.pid]
595
        mov     edx, [edx+TASKDATA.pid]
588
 
596
 
589
  rmpr0:
597
  rmpr0:
590
 
598
 
591
    mov   esi,[RESERVED_PORTS]
599
        mov     esi, [RESERVED_PORTS]
592
 
600
 
593
    test  esi,esi
601
        test    esi, esi
594
    jz    rmpr9
602
        jz      rmpr9
595
 
603
 
596
  rmpr3:
604
  rmpr3:
597
 
605
 
598
    mov   edi,esi
606
        mov     edi, esi
599
    shl   edi,4
607
        shl     edi, 4
600
    add   edi,RESERVED_PORTS
608
        add     edi, RESERVED_PORTS
601
 
609
 
602
    cmp   edx,[edi]
610
        cmp     edx, [edi]
603
    je    rmpr4
611
        je      rmpr4
604
 
612
 
605
    dec   esi
613
        dec     esi
606
    jnz   rmpr3
614
        jnz     rmpr3
607
 
615
 
608
    jmp   rmpr9
616
        jmp     rmpr9
609
 
617
 
610
  rmpr4:
618
  rmpr4:
611
 
619
 
612
    mov   ecx,256
620
        mov     ecx, 256
613
    sub   ecx,esi
621
        sub     ecx, esi
614
    shl   ecx,4
622
        shl     ecx, 4
615
 
623
 
616
    mov   esi,edi
624
        mov     esi, edi
617
    add   esi,16
625
        add     esi, 16
618
    cld
626
        cld
619
    rep   movsb
627
        rep movsb
620
 
628
 
621
    dec   dword [RESERVED_PORTS]
629
        dec     dword [RESERVED_PORTS]
622
 
630
 
623
    jmp   rmpr0
631
        jmp     rmpr0
624
 
632
 
625
  rmpr9:
633
  rmpr9:
626
 
634
 
627
    popa
635
        popa
628
    mov  edi,esi         ; do not run this process slot
636
        mov     edi, esi ; do not run this process slot
629
    shl  edi, 5
637
        shl     edi, 5
630
    mov  [edi+CURRENT_TASK + TASKDATA.state],byte 9
638
        mov     [edi+CURRENT_TASK + TASKDATA.state], byte 9
631
; debugger test - terminate all debuggees
639
; debugger test - terminate all debuggees
632
    mov  eax, 2
640
        mov     eax, 2
633
    mov  ecx, SLOT_BASE+2*0x100+APPDATA.debugger_slot
641
        mov     ecx, SLOT_BASE+2*0x100+APPDATA.debugger_slot
634
.xd0:
642
.xd0:
635
    cmp  eax, [TASK_COUNT]
643
        cmp     eax, [TASK_COUNT]
636
    ja   .xd1
644
        ja      .xd1
637
    cmp  dword [ecx], esi
645
        cmp     dword [ecx], esi
638
    jnz  @f
646
        jnz     @f
639
    and  dword [ecx], 0
647
        and     dword [ecx], 0
640
    pushad
648
        pushad
641
    xchg eax, ecx
649
        xchg    eax, ecx
642
    mov  ebx, 2
650
        mov     ebx, 2
643
    call sys_system
651
        call    sys_system
644
    popad
652
        popad
645
@@:
653
@@:
646
    inc  eax
654
        inc     eax
647
    add  ecx, 0x100
655
        add     ecx, 0x100
648
    jmp  .xd0
656
        jmp     .xd0
649
.xd1:
657
.xd1:
650
;    call  systest
658
;    call  systest
651
    sti  ; .. and life goes on
659
        sti     ; .. and life goes on
652
 
660
 
653
    mov   eax, [draw_limits.left]
661
        mov     eax, [draw_limits.left]
654
    mov   ebx, [draw_limits.top]
662
        mov     ebx, [draw_limits.top]
655
    mov   ecx, [draw_limits.right]
663
        mov     ecx, [draw_limits.right]
656
    mov   edx, [draw_limits.bottom]
664
        mov     edx, [draw_limits.bottom]
657
    call  calculatescreen
665
        call    calculatescreen
658
    xor   eax, eax
666
        xor     eax, eax
659
    xor   esi, esi
667
        xor     esi, esi
660
    call  redrawscreen
668
        call    redrawscreen
661
 
669
 
662
    mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
670
        mov     [MOUSE_BACKGROUND], byte 0; no mouse background
663
    mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
671
        mov     [DONT_DRAW_MOUSE], byte 0; draw mouse
664
 
672
 
665
    and   [application_table_status],0
673
        and     [application_table_status], 0
666
    ;mov   esi,process_terminated
674
    ;mov   esi,process_terminated
667
    ;call  sys_msg_board_str
675
    ;call  sys_msg_board_str
668
    add esp, 4
676
        add     esp, 4
669
    ret
677
        ret
670
restore .slot
678
restore .slot
671
 
679
 
672
iglobal
680
iglobal
673
if lang eq ru
681
if lang eq ru
674
  boot_sched_1    db   '‘®§¤ ­¨¥ GDT TSS 㪠§ â¥«ï',0
682
  boot_sched_1    db   '‘®§¤ ­¨¥ GDT TSS 㪠§ â¥«ï',0
675
  boot_sched_2    db   '‘®§¤ ­¨¥ IDT â ¡«¨æë',0
683
  boot_sched_2    db   '‘®§¤ ­¨¥ IDT â ¡«¨æë',0
676
else
684
else
677
  boot_sched_1    db   'Building gdt tss pointer',0
685
  boot_sched_1    db   'Building gdt tss pointer',0
678
  boot_sched_2    db   'Building IDT table',0
686
  boot_sched_2    db   'Building IDT table',0
679
end if
687
end if
680
endg
688
endg
681
 
689
 
682
 
690
 
683
build_scheduler:
691
build_scheduler:
684
 
692
 
685
        mov    esi,boot_sched_1
693
        mov     esi, boot_sched_1
686
        call   boot_log
694
        call    boot_log
687
  ;      call   build_process_gdt_tss_pointer
695
  ;      call   build_process_gdt_tss_pointer
688
 
696
 
689
  ;      mov    esi,boot_sched_2
697
  ;      mov    esi,boot_sched_2
690
  ;      call   boot_log
698
  ;      call   boot_log
691
 
699
 
692
        ret
700
        ret