Subversion Repositories Kolibri OS

Rev

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

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