Subversion Repositories Kolibri OS

Rev

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

Rev 430 Rev 432
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                               ;;
2
;;                                                               ;;
3
;;  MenuetOS process management, protected ring3                 ;;
3
;;  MenuetOS process management, protected ring3                 ;;
4
;;                                                               ;;
4
;;                                                               ;;
5
;;  Distributed under GPL. See file COPYING for details.         ;;
5
;;  Distributed under GPL. See file COPYING for details.         ;;
6
;;  Copyright 2003 Ville Turjanmaa                               ;;
6
;;  Copyright 2003 Ville Turjanmaa                               ;;
7
;;                                                               ;;
7
;;                                                               ;;
8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
 
9
 
10
align 4
10
align 4
11
idtreg:
11
idtreg:
12
     dw   8*0x41-1
12
     dw   8*0x41-1
13
     dd   idts+8
13
     dd   idts+8
14
 
14
 
15
build_interrupt_table:
15
build_interrupt_table:
16
 
16
 
17
        mov    edi, idts+8
17
        mov    edi, idts+8
18
        mov    esi, sys_int
18
        mov    esi, sys_int
19
        mov    ecx, 0x40
19
        mov    ecx, 0x40
20
     @@:
20
     @@:
21
        mov    eax, [esi]
21
        mov    eax, [esi]
22
        mov    [edi],   ax           ; lower part of offset
22
        mov    [edi],   ax           ; lower part of offset
23
        mov    [edi+2], word os_code ; segment selector
23
        mov    [edi+2], word os_code ; segment selector
24
        shr    eax, 16
24
        shr    eax, 16
25
        mov    [edi+4], word 10001110b shl 8 ; interrupt descriptor
25
        mov    [edi+4], word 10001110b shl 8 ; interrupt descriptor
26
        mov    [edi+6], ax
26
        mov    [edi+6], ax
27
        add    esi, 4
27
        add    esi, 4
28
        add    edi, 8
28
        add    edi, 8
29
        dec    ecx
29
        dec    ecx
30
        jnz    @b
30
        jnz    @b
31
 
31
 
32
        ;mov    edi,8*0x40+idts+8
32
        ;mov    edi,8*0x40+idts+8
33
        mov    [edi + 0], word (i40 and ((1 shl 16)-1))
33
        mov    [edi + 0], word (i40 and ((1 shl 16)-1))
34
        mov    [edi + 2], word os_code
34
        mov    [edi + 2], word os_code
35
        mov    [edi + 4], word 11101110b*256
35
        mov    [edi + 4], word 11101110b*256
36
        mov    [edi + 6], word (i40 shr 16)
36
        mov    [edi + 6], word (i40 shr 16)
37
 
37
 
38
        ret
38
        ret
39
 
39
 
40
iglobal
40
iglobal
41
  sys_int:
41
  sys_int:
42
    dd e0,debug_exc,e2,e3
42
    dd e0,debug_exc,e2,e3
43
    dd e4,e5,e6,e7
43
    dd e4,e5,e6,e7
44
    dd e8,e9,e10,e11
44
    dd e8,e9,e10,e11
45
    dd e12,e13,page_fault_handler,e15
45
    dd e12,e13,page_fault_handler,e15
46
 
46
 
47
    dd except_16, e17,e18, except_19
47
    dd except_16, e17,e18, except_19
48
    times 12 dd unknown_interrupt
48
    times 12 dd unknown_interrupt
49
 
49
 
50
    dd   irq0  , irq_serv.irq_1, p_irq2 , p_irq3     ;irq_serv.irq_3
50
    dd   irq0  , irq_serv.irq_1, p_irq2 , p_irq3     ;irq_serv.irq_3
51
    dd   irq_serv.irq_4 ,irq_serv.irq_5,p_irq6,irq_serv.irq_7
51
    dd   irq_serv.irq_4 ,irq_serv.irq_5,p_irq6,irq_serv.irq_7
52
    dd   irq_serv.irq_8, irq_serv.irq_9, irq_serv.irq_10
52
    dd   irq_serv.irq_8, irq_serv.irq_9, irq_serv.irq_10
53
    dd   irq_serv.irq_11,p_irq12,irqD ,p_irq14,p_irq15
53
    dd   irq_serv.irq_11,p_irq12,irqD ,p_irq14,p_irq15
54
 
54
 
55
    times 16 dd unknown_interrupt
55
    times 16 dd unknown_interrupt
56
 
56
 
57
    dd   i40
57
    dd   i40
58
endg
58
endg
59
 
59
 
60
macro save_ring3_context
60
macro save_ring3_context
61
{
61
{
62
    pushad
62
    pushad
63
}
63
}
64
macro restore_ring3_context
64
macro restore_ring3_context
65
{
65
{
66
    popad
66
    popad
67
}
67
}
68
 
68
 
69
; simply return control to interrupted process
69
; simply return control to interrupted process
70
unknown_interrupt:
70
unknown_interrupt:
71
     iret
71
     iret
72
 
72
 
73
macro exc_wo_code [num]
73
macro exc_wo_code [num]
74
{
74
{
75
  forward
75
  forward
76
  e#num :
76
  e#num :
77
      save_ring3_context
77
      save_ring3_context
78
      mov bl, num
78
      mov bl, num
79
      jmp exc_c
79
      jmp exc_c
80
}
80
}
81
 
81
 
82
macro exc_w_code [num]
82
macro exc_w_code [num]
83
{
83
{
84
  forward
84
  forward
85
  e#num :
85
  e#num :
86
      add esp, 4
86
      add esp, 4
87
      save_ring3_context
87
      save_ring3_context
88
      mov bl, num
88
      mov bl, num
89
      jmp exc_c
89
      jmp exc_c
90
}
90
}
91
 
91
 
92
exc_wo_code 0, 1, 2, 3, 4, 5, 6, 9, 15, 18
92
exc_wo_code 0, 1, 2, 3, 4, 5, 6, 9, 15, 18
93
exc_w_code 8, 10, 11, 12, 13, 14, 17
93
exc_w_code 8, 10, 11, 12, 13, 14, 17
94
 
94
 
95
exc_c:
95
exc_c:
96
        mov   ax, app_data  ;èñêëþ÷åíèå
96
        mov   ax, app_data  ;èñêëþ÷åíèå
97
        mov   ds, ax        ;çàãðóçèì ïðàâèëüíûå çíà÷åíè
97
        mov   ds, ax        ;çàãðóçèì ïðàâèëüíûå çíà÷åíè
98
        mov   es, ax        ;â ðåãèñòðû
98
        mov   es, ax        ;â ðåãèñòðû
99
 
99
 
100
; test if debugging
100
; test if debugging
101
        cli
101
        cli
102
        mov   eax, [current_slot]
102
        mov   eax, [current_slot]
103
        mov   eax, [eax+APPDATA.debugger_slot]
103
        mov   eax, [eax+APPDATA.debugger_slot]
104
        test  eax, eax
104
        test  eax, eax
105
        jnz   .debug
105
        jnz   .debug
106
        sti
106
        sti
107
; not debuggee => say error and terminate
107
; not debuggee => say error and terminate
108
        add   esp, 0x20  ;28h
108
        add   esp, 0x20  ;28h
109
        movzx eax, bl
109
        movzx eax, bl
110
        mov   [error_interrupt], eax
110
        mov   [error_interrupt], eax
111
        call  show_error_parameters
111
        call  show_error_parameters
112
 
112
 
113
        mov   edx, [TASK_BASE]
113
        mov   edx, [TASK_BASE]
114
        mov   [edx + TASKDATA.state], byte 4
114
        mov   [edx + TASKDATA.state], byte 4
115
 
115
 
116
        jmp   change_task
116
        jmp   change_task
117
 
117
 
118
.debug:
118
.debug:
119
; we are debugged process, notify debugger and suspend ourself
119
; we are debugged process, notify debugger and suspend ourself
120
; eax=debugger PID
120
; eax=debugger PID
121
        cld
121
        cld
122
        movzx ecx, bl
122
        movzx ecx, bl
123
        push  ecx
123
        push  ecx
124
        mov   ecx, [TASK_BASE]
124
        mov   ecx, [TASK_BASE]
125
        push  dword [ecx+TASKDATA.pid]    ; PID of current process
125
        push  dword [ecx+TASKDATA.pid]    ; PID of current process
126
        push  12
126
        push  12
127
        pop   ecx
127
        pop   ecx
128
        push  1        ; 1=exception
128
        push  1        ; 1=exception
129
        call  debugger_notify
129
        call  debugger_notify
130
        pop   ecx
130
        pop   ecx
131
        pop   ecx
131
        pop   ecx
132
        pop   ecx
132
        pop   ecx
133
        mov   edx, [TASK_BASE]
133
        mov   edx, [TASK_BASE]
134
        mov   byte [edx+TASKDATA.state], 1        ; suspended
134
        mov   byte [edx+TASKDATA.state], 1        ; suspended
135
        call  change_task
135
        call  change_task
136
        restore_ring3_context
136
        restore_ring3_context
137
        iretd
137
        iretd
138
 
138
 
139
writehex:
139
writehex:
140
      pusha
140
      pusha
141
 
141
 
142
      mov  edi, [write_error_to]
142
      mov  edi, [write_error_to]
143
      mov  esi, 8
143
      mov  esi, 8
144
    @@:
144
    @@:
145
      mov  ecx, eax
145
      mov  ecx, eax
146
      and  ecx, 0xf
146
      and  ecx, 0xf
147
 
147
 
148
      mov  cl,[ecx+hexletters]
148
      mov  cl,[ecx+hexletters]
149
      mov  [edi],cl
149
      mov  [edi],cl
150
      dec  edi
150
      dec  edi
151
 
151
 
152
      shr  eax,4
152
      shr  eax,4
153
      dec  esi
153
      dec  esi
154
      jnz  @b
154
      jnz  @b
155
 
155
 
156
      popa
156
      popa
157
      ret
157
      ret
158
 
158
 
159
iglobal
159
iglobal
160
  hexletters  db '0123456789ABCDEF'
160
  hexletters  db '0123456789ABCDEF'
161
 
161
 
162
  error_interrupt         dd  -1
162
  error_interrupt         dd  -1
163
 
163
 
164
  process_error  db 'K : Process - forced terminate INT: 00000000',13,10,0
164
  process_error  db 'K : Process - forced terminate INT: 00000000',13,10,0
165
  process_pid    db 'K : Process - forced terminate PID: 00000000',13,10,0
165
  process_pid    db 'K : Process - forced terminate PID: 00000000',13,10,0
166
  process_eip    db 'K : Process - forced terminate EIP: 00000000',13,10,0
166
  process_eip    db 'K : Process - forced terminate EIP: 00000000',13,10,0
167
  system_error   db 'K : Kernel error',13,10,0
167
  system_error   db 'K : Kernel error',13,10,0
168
endg
168
endg
169
 
169
 
170
uglobal
170
uglobal
171
  write_error_to  dd  0x0
171
  write_error_to  dd  0x0
172
endg
172
endg
173
 
173
 
174
show_error_parameters:
174
show_error_parameters:
175
 
175
 
176
        mov    [write_error_to],process_pid+43
176
        mov    [write_error_to],process_pid+43
177
        mov    eax,[CURRENT_TASK]
177
        mov    eax,[CURRENT_TASK]
178
        shl    eax, 5
178
        shl    eax, 5
179
        mov    eax,[CURRENT_TASK+TASKDATA.pid+eax]
179
        mov    eax,[CURRENT_TASK+TASKDATA.pid+eax]
180
        call   writehex
180
        call   writehex
181
 
181
 
182
        mov    [write_error_to],process_error+43
182
        mov    [write_error_to],process_error+43
183
        mov    eax,[error_interrupt]
183
        mov    eax,[error_interrupt]
184
        call   writehex
184
        call   writehex
185
 
185
 
186
        cmp    dword [esp+4+4], os_code ; CS
186
        cmp    dword [esp+4+4], os_code ; CS
187
        jnz    @f
187
        jnz    @f
188
        mov    esi,system_error
188
        mov    esi,system_error
189
        call   sys_msg_board_str
189
        call   sys_msg_board_str
190
      @@:
190
      @@:
191
        mov    eax, [esp+4] ; EIP
191
        mov    eax, [esp+4] ; EIP
192
 
192
 
193
        mov    [write_error_to],process_eip+43
193
        mov    [write_error_to],process_eip+43
194
        call   writehex
194
        call   writehex
195
 
195
 
196
        mov    esi,process_error
196
        mov    esi,process_error
197
        call   sys_msg_board_str
197
        call   sys_msg_board_str
198
 
198
 
199
        mov    esi,process_pid
199
        mov    esi,process_pid
200
        call   sys_msg_board_str
200
        call   sys_msg_board_str
201
 
201
 
202
        mov    esi,process_eip
202
        mov    esi,process_eip
203
        call   sys_msg_board_str
203
        call   sys_msg_board_str
204
 
204
 
205
        ret
205
        ret
206
 
206
 
207
 
207
 
208
 
208
 
209
; irq1  ->  hid/keyboard.inc
209
; irq1  ->  hid/keyboard.inc
210
 
210
 
211
 
211
 
212
macro irqh [num]
212
macro irqh [num]
213
{
213
{
214
  forward
214
  forward
215
  p_irq#num :
215
  p_irq#num :
216
     save_ring3_context
216
     save_ring3_context
217
     mov   edi, num
217
     mov   edi, num
218
     jmp   irq_c
218
     jmp   irq_c
219
}
219
}
220
 
220
 
221
irqh 2,5,7,8,9,10,11
221
irqh 2,5,7,8,9,10,11
222
 
222
 
223
irq_c:
223
irq_c:
224
     mov   ax, app_data  ;os_data
224
     mov   ax, app_data  ;os_data
225
     mov   ds, ax
225
     mov   ds, ax
226
     mov   es, ax
226
     mov   es, ax
227
     call  irqhandler
227
     call  irqhandler
228
     restore_ring3_context
228
     restore_ring3_context
229
     iret
229
     iret
230
 
230
 
231
p_irq6:
231
p_irq6:
232
     save_ring3_context
232
     save_ring3_context
233
     mov   ax, app_data  ;os_data
233
     mov   ax, app_data  ;os_data
234
     mov   ds, ax
234
     mov   ds, ax
235
     mov   es, ax
235
     mov   es, ax
236
     call  fdc_irq
236
     call  fdc_irq
237
     call  ready_for_next_irq
237
     call  ready_for_next_irq
238
     restore_ring3_context
238
     restore_ring3_context
239
     iret
239
     iret
240
 
240
 
241
p_irq3:
241
p_irq3:
242
     save_ring3_context
242
     save_ring3_context
243
     mov   ax, app_data  ;os_data
243
     mov   ax, app_data  ;os_data
244
     mov   ds, ax
244
     mov   ds, ax
245
     mov   es, ax
245
     mov   es, ax
246
     cmp   [com2_mouse_detected],0
246
     cmp   [com2_mouse_detected],0
247
     je    old_irq3_handler
247
     je    old_irq3_handler
248
     call  check_mouse_data_com2
248
     call  check_mouse_data_com2
249
     jmp   p_irq3_1
249
     jmp   p_irq3_1
250
 old_irq3_handler:
250
 old_irq3_handler:
251
     mov   edi,3
251
     mov   edi,3
252
     call  irqhandler
252
     call  irqhandler
253
  p_irq3_1:
253
  p_irq3_1:
254
     restore_ring3_context
254
     restore_ring3_context
255
     iret
255
     iret
256
 
256
 
257
p_irq4:
257
p_irq4:
258
     save_ring3_context
258
     save_ring3_context
259
     mov   ax, app_data  ;os_data
259
     mov   ax, app_data  ;os_data
260
     mov   ds, ax
260
     mov   ds, ax
261
     mov   es, ax
261
     mov   es, ax
262
     cmp   [com1_mouse_detected],0
262
     cmp   [com1_mouse_detected],0
263
     je    old_irq4_handler
263
     je    old_irq4_handler
264
     call  check_mouse_data_com1
264
     call  check_mouse_data_com1
265
     jmp   p_irq4_1
265
     jmp   p_irq4_1
266
 old_irq4_handler:
266
 old_irq4_handler:
267
     mov   edi,4
267
     mov   edi,4
268
     call  irqhandler
268
     call  irqhandler
269
  p_irq4_1:
269
  p_irq4_1:
270
     restore_ring3_context
270
     restore_ring3_context
271
     iret
271
     iret
272
 
272
 
273
p_irq12:
273
p_irq12:
274
     save_ring3_context
274
     save_ring3_context
275
     mov   ax, app_data  ;os_data
275
     mov   ax, app_data  ;os_data
276
     mov   ds, ax
276
     mov   ds, ax
277
     mov   es, ax
277
     mov   es, ax
278
     call  check_mouse_data_ps2
278
     call  check_mouse_data_ps2
279
     restore_ring3_context
279
     restore_ring3_context
280
     iret
280
     iret
281
 
281
 
282
p_irq14:
282
p_irq14:
283
        save_ring3_context
283
        save_ring3_context
284
        mov     ax, app_data  ;os_data
284
        mov     ax, app_data  ;os_data
285
        mov     ds, ax
285
        mov     ds, ax
286
        mov     es, ax
286
        mov     es, ax
287
        call    [irq14_func]
287
        call    [irq14_func]
288
        call    ready_for_next_irq_1
288
        call    ready_for_next_irq_1
289
        restore_ring3_context
289
        restore_ring3_context
290
        iret
290
        iret
291
p_irq15:
291
p_irq15:
292
        save_ring3_context
292
        save_ring3_context
293
        mov     ax, app_data  ;os_data
293
        mov     ax, app_data  ;os_data
294
        mov     ds, ax
294
        mov     ds, ax
295
        mov     es, ax
295
        mov     es, ax
296
        call    [irq15_func]
296
        call    [irq15_func]
297
        call    ready_for_next_irq_1
297
        call    ready_for_next_irq_1
298
        restore_ring3_context
298
        restore_ring3_context
299
        iret
299
        iret
300
 
300
 
301
ready_for_next_irq:
301
ready_for_next_irq:
302
     mov    [check_idle_semaphore],5
302
     mov    [check_idle_semaphore],5
303
     mov   al, 0x20
303
     mov   al, 0x20
304
     out   0x20, al
304
     out   0x20, al
305
     ret
305
     ret
306
 
306
 
307
ready_for_next_irq_1:
307
ready_for_next_irq_1:
308
     mov    [check_idle_semaphore],5
308
     mov    [check_idle_semaphore],5
309
     mov   al, 0x20
309
     mov   al, 0x20
310
     out    0xa0,al
310
     out    0xa0,al
311
     out   0x20, al
311
     out   0x20, al
312
     ret
312
     ret
313
 
313
 
314
irqD:
314
irqD:
315
     save_ring3_context
315
     save_ring3_context
316
     mov   ax, app_data  ;os_data
316
     mov   ax, app_data  ;os_data
317
     mov   ds, ax
317
     mov   ds, ax
318
     mov   es, ax
318
     mov   es, ax
319
 
319
 
320
     mov   dx,0xf0
320
     mov   dx,0xf0
321
     mov   al,0
321
     mov   al,0
322
     out   dx,al
322
     out   dx,al
323
 
323
 
324
     mov   dx,0xa0
324
     mov   dx,0xa0
325
     mov   al,0x20
325
     mov   al,0x20
326
     out   dx,al
326
     out   dx,al
327
     mov   dx,0x20
327
     mov   dx,0x20
328
     out   dx,al
328
     out   dx,al
329
 
329
 
330
     restore_ring3_context
330
     restore_ring3_context
331
 
331
 
332
     iret
332
     iret
333
 
333
 
334
 
334
 
335
irqhandler:
335
irqhandler:
336
 
336
 
337
     push   edi
337
     push   edi
338
 
338
 
339
     mov    esi,edi          ; 1
339
     mov    esi,edi          ; 1
340
     shl    esi,6            ; 1
340
     shl    esi,6            ; 1
341
     add    esi,irq00read    ; 1
341
     add    esi,irq00read    ; 1
342
     shl    edi,12           ; 1
342
     shl    edi,12           ; 1
343
     add    edi,IRQ_SAVE
343
     add    edi,IRQ_SAVE
344
     mov    ecx,16
344
     mov    ecx,16
345
 
345
 
346
     mov    [check_idle_semaphore],5
346
     mov    [check_idle_semaphore],5
347
 
347
 
348
   irqnewread:
348
   irqnewread:
349
     dec    ecx
349
     dec    ecx
350
     js     irqover
350
     js     irqover
351
 
351
 
352
     mov    dx,[esi]         ; 2+
352
     mov    dx,[esi]         ; 2+
353
 
353
 
354
     cmp    dx,0             ; 1
354
     cmp    dx,0             ; 1
355
     jz     irqover
355
     jz     irqover
356
     cmp    [esi+3],byte 1   ; 2     ; byte read
356
     cmp    [esi+3],byte 1   ; 2     ; byte read
357
     jne    noirqbyte        ; 4-11
357
     jne    noirqbyte        ; 4-11
358
 
358
 
359
     in     al,dx
359
     in     al,dx
360
 
360
 
361
     mov    edx,[edi]
361
     mov    edx,[edi]
362
     cmp    edx,4000
362
     cmp    edx,4000
363
     je     irqfull
363
     je     irqfull
364
     mov    ebx,edi
364
     mov    ebx,edi
365
     add    ebx,0x10
365
     add    ebx,0x10
366
     add    ebx,edx
366
     add    ebx,edx
367
     mov    [ebx],al
367
     mov    [ebx],al
368
     inc    edx
368
     inc    edx
369
     mov    [edi],edx
369
     mov    [edi],edx
370
 
370
 
371
     add    esi,4
371
     add    esi,4
372
     jmp    irqnewread
372
     jmp    irqnewread
373
 
373
 
374
   noirqbyte:
374
   noirqbyte:
375
 
375
 
376
 
376
 
377
     cmp    [esi+3],byte 2     ; word read
377
     cmp    [esi+3],byte 2     ; word read
378
     jne    noirqword
378
     jne    noirqword
379
 
379
 
380
     in     ax,dx
380
     in     ax,dx
381
 
381
 
382
     mov    edx,[edi]
382
     mov    edx,[edi]
383
     cmp    edx,4000
383
     cmp    edx,4000
384
     je     irqfull
384
     je     irqfull
385
     mov    ebx,edi
385
     mov    ebx,edi
386
     add    ebx,0x10
386
     add    ebx,0x10
387
     add    ebx,edx
387
     add    ebx,edx
388
     mov    [ebx],ax
388
     mov    [ebx],ax
389
     add    edx,2
389
     add    edx,2
390
     mov    [edi],edx
390
     mov    [edi],edx
391
     add    esi,4
391
     add    esi,4
392
     jmp    irqnewread
392
     jmp    irqnewread
393
 
393
 
394
   noirqword:
394
   noirqword:
395
   irqfull:
395
   irqfull:
396
   irqover:
396
   irqover:
397
 
397
 
398
     mov    al,0x20            ; ready for next irq
398
     mov    al,0x20            ; ready for next irq
399
     out    0x20,al
399
     out    0x20,al
400
 
400
 
401
     pop    ebx
401
     pop    ebx
402
     cmp    ebx,7
402
     cmp    ebx,7
403
     jbe    noa0
403
     jbe    noa0
404
     out    0xa0,al
404
     out    0xa0,al
405
   noa0:
405
   noa0:
406
 
406
 
407
     ret
407
     ret
408
 
408
 
409
 
409
 
410
 
410
 
411
set_application_table_status:
411
set_application_table_status:
412
        push eax
412
        push eax
413
 
413
 
414
        mov  eax,[CURRENT_TASK]
414
        mov  eax,[CURRENT_TASK]
415
        shl  eax, 5
415
        shl  eax, 5
416
        add  eax,CURRENT_TASK+TASKDATA.pid
416
        add  eax,CURRENT_TASK+TASKDATA.pid
417
        mov  eax,[eax]
417
        mov  eax,[eax]
418
 
418
 
419
        mov  [application_table_status],eax
419
        mov  [application_table_status],eax
420
 
420
 
421
        pop  eax
421
        pop  eax
422
 
422
 
423
        ret
423
        ret
424
 
424
 
425
 
425
 
426
clear_application_table_status:
426
clear_application_table_status:
427
        push eax
427
        push eax
428
 
428
 
429
        mov  eax,[CURRENT_TASK]
429
        mov  eax,[CURRENT_TASK]
430
        shl  eax, 5
430
        shl  eax, 5
431
        add  eax,CURRENT_TASK+TASKDATA.pid
431
        add  eax,CURRENT_TASK+TASKDATA.pid
432
        mov  eax,[eax]
432
        mov  eax,[eax]
433
 
433
 
434
        cmp  eax,[application_table_status]
434
        cmp  eax,[application_table_status]
435
        jne  apptsl1
435
        jne  apptsl1
436
        mov  [application_table_status],0
436
        mov  [application_table_status],0
437
      apptsl1:
437
      apptsl1:
438
 
438
 
439
        pop  eax
439
        pop  eax
440
 
440
 
441
        ret
441
        ret
442
 
442
 
443
sys_resize_app_memory:
443
sys_resize_app_memory:
444
        ; eax = 1 - resize
444
        ; eax = 1 - resize
445
        ;     ebx = new amount of memory
445
        ;     ebx = new amount of memory
446
 
446
 
447
        cmp    eax,1
447
        cmp    eax,1
448
        jne    .no_application_mem_resize
448
        jne    .no_application_mem_resize
449
 
449
 
450
        stdcall new_mem_resize, ebx
450
        stdcall new_mem_resize, ebx
451
        mov [esp+36], eax
451
        mov [esp+36], eax
452
        ret
452
        ret
453
 
453
 
454
.no_application_mem_resize:
454
.no_application_mem_resize:
455
        ret
455
        ret
456
 
456
 
457
sys_threads:
457
sys_threads:
458
 
458
 
459
; eax=1 create thread
459
; eax=1 create thread
460
;
460
;
461
;   ebx=thread start
461
;   ebx=thread start
462
;   ecx=thread stack value
462
;   ecx=thread stack value
463
;
463
;
464
; on return : eax = pid
464
; on return : eax = pid
465
jmp new_sys_threads
465
jmp new_sys_threads
466
 
466
 
467
iglobal
467
iglobal
468
  process_terminating   db 'K : Process - terminating',13,10,0
468
  process_terminating   db 'K : Process - terminating',13,10,0
469
  process_terminated    db 'K : Process - done',13,10,0
469
  process_terminated    db 'K : Process - done',13,10,0
470
  msg_obj_destroy       db 'K : destroy app object',13,10,0
470
  msg_obj_destroy       db 'K : destroy app object',13,10,0
471
endg
471
endg
472
 
472
 
473
; param
473
; param
474
;  esi= slot
474
;  esi= slot
475
 
475
 
476
terminate: ; terminate application
476
terminate: ; terminate application
477
 
477
 
478
           .slot equ esp   ;locals
478
           .slot equ esp   ;locals
479
 
479
 
480
           push   esi      ;save .slot
480
           push   esi      ;save .slot
481
 
481
 
482
           shl esi, 8
482
           shl esi, 8
483
           cmp [SLOT_BASE+esi+APPDATA.dir_table], 0
483
           cmp [SLOT_BASE+esi+APPDATA.dir_table], 0
484
           jne @F
484
           jne @F
485
           add esp, 4
485
           add esp, 4
486
           ret
486
           ret
487
@@:
487
@@:
488
           mov    esi,process_terminating
488
           mov    esi,process_terminating
489
           call   sys_msg_board_str
489
           call   sys_msg_board_str
490
@@:
490
@@:
491
           cli
491
           cli
492
           cmp   [application_table_status],0
492
           cmp   [application_table_status],0
493
           je    term9
493
           je    term9
494
           sti
494
           sti
495
           call  change_task
495
           call  change_task
496
           jmp   @b
496
           jmp   @b
497
term9:
497
term9:
498
           call  set_application_table_status
498
           call  set_application_table_status
499
 
499
 
500
           mov esi, [.slot]
500
           mov esi, [.slot]
501
           shl esi,8
501
           shl esi,8
502
           add esi, SLOT_BASE+APP_OBJ_OFFSET
502
           add esi, SLOT_BASE+APP_OBJ_OFFSET
503
@@:
503
@@:
504
           mov eax, [esi+APPOBJ.fd]
504
           mov eax, [esi+APPOBJ.fd]
505
           test eax, eax
505
           test eax, eax
506
           jz @F
506
           jz @F
507
 
507
 
508
           cmp eax, esi
508
           cmp eax, esi
509
           je @F
509
           je @F
510
 
510
 
511
           push esi
511
           push esi
512
           call [eax+APPOBJ.destroy]
512
           call [eax+APPOBJ.destroy]
513
           mov  esi, msg_obj_destroy
513
           mov  esi, msg_obj_destroy
514
           call sys_msg_board_str
514
           call sys_msg_board_str
515
           pop esi
515
           pop esi
516
           jmp @B
516
           jmp @B
517
@@:
517
@@:
518
           mov eax, [.slot]
518
           mov eax, [.slot]
519
           shl eax, 8
519
           shl eax, 8
520
           mov eax,[SLOT_BASE+eax+APPDATA.dir_table]
520
           mov eax,[SLOT_BASE+eax+APPDATA.dir_table]
521
           stdcall destroy_app_space, eax
521
           stdcall destroy_app_space, eax
522
 
522
 
523
           mov esi, [.slot]
523
           mov esi, [.slot]
524
           cmp [fpu_owner],esi   ; if user fpu last -> fpu user = 1
524
           cmp [fpu_owner],esi   ; if user fpu last -> fpu user = 1
525
           jne @F
525
           jne @F
526
 
526
 
527
           mov [fpu_owner],1
527
           mov [fpu_owner],1
528
           mov eax, [256+SLOT_BASE+APPDATA.fpu_state]
528
           mov eax, [256+SLOT_BASE+APPDATA.fpu_state]
529
           clts
529
           clts
530
           bt [cpu_caps], CAPS_SSE
530
           bt [cpu_caps], CAPS_SSE
531
           jnc .no_SSE
531
           jnc .no_SSE
532
           fxrstor [eax]
532
           fxrstor [eax]
533
           jmp @F
533
           jmp @F
534
.no_SSE:
534
.no_SSE:
535
           fnclex
535
           fnclex
536
           frstor [eax]
536
           frstor [eax]
537
@@:
537
@@:
538
 
538
 
539
    mov   [KEY_COUNT],byte 0           ; empty keyboard buffer
539
    mov   [KEY_COUNT],byte 0           ; empty keyboard buffer
540
    mov   [BTN_COUNT],byte 0           ; empty button buffer
540
    mov   [BTN_COUNT],byte 0           ; empty button buffer
541
 
541
 
542
 
542
 
543
; remove defined hotkeys
543
; remove defined hotkeys
544
        mov     eax, hotkey_list
544
        mov     eax, hotkey_list
545
.loop:
545
.loop:
546
        cmp     [eax+8], esi
546
        cmp     [eax+8], esi
547
        jnz     .cont
547
        jnz     .cont
548
        mov     ecx, [eax]
548
        mov     ecx, [eax]
549
        jecxz   @f
549
        jecxz   @f
550
        push    dword [eax+12]
550
        push    dword [eax+12]
551
        pop     dword [ecx+12]
551
        pop     dword [ecx+12]
552
@@:
552
@@:
553
        mov     ecx, [eax+12]
553
        mov     ecx, [eax+12]
554
        push    dword [eax]
554
        push    dword [eax]
555
        pop     dword [ecx]
555
        pop     dword [ecx]
556
        xor     ecx, ecx
556
        xor     ecx, ecx
557
        mov     [eax], ecx
557
        mov     [eax], ecx
558
        mov     [eax+4], ecx
558
        mov     [eax+4], ecx
559
        mov     [eax+8], ecx
559
        mov     [eax+8], ecx
560
        mov     [eax+12], ecx
560
        mov     [eax+12], ecx
561
.cont:
561
.cont:
562
        add     eax, 16
562
        add     eax, 16
563
        cmp     eax, hotkey_list+256*16
563
        cmp     eax, hotkey_list+256*16
564
        jb      .loop
564
        jb      .loop
565
; remove hotkeys in buffer
565
; remove hotkeys in buffer
566
        mov     eax, hotkey_buffer
566
        mov     eax, hotkey_buffer
567
.loop2:
567
.loop2:
568
        cmp     [eax], esi
568
        cmp     [eax], esi
569
        jnz     .cont2
569
        jnz     .cont2
570
        and     dword [eax+4], 0
570
        and     dword [eax+4], 0
571
        and     dword [eax], 0
571
        and     dword [eax], 0
572
.cont2:
572
.cont2:
573
        add     eax, 8
573
        add     eax, 8
574
        cmp     eax, hotkey_buffer+120*8
574
        cmp     eax, hotkey_buffer+120*8
575
        jb      .loop2
575
        jb      .loop2
576
 
576
 
577
    mov   ecx,esi                 ; remove buttons
577
    mov   ecx,esi                 ; remove buttons
578
  bnewba2:
578
  bnewba2:
579
    mov   edi,[BTN_ADDR]
579
    mov   edi,[BTN_ADDR]
580
    mov   eax,edi
580
    mov   eax,edi
581
    cld
581
    cld
582
    movzx ebx,word [edi]
582
    movzx ebx,word [edi]
583
    inc   bx
583
    inc   bx
584
  bnewba:
584
  bnewba:
585
    dec   bx
585
    dec   bx
586
    jz    bnmba
586
    jz    bnmba
587
    add   eax,0x10
587
    add   eax,0x10
588
    cmp   cx,[eax]
588
    cmp   cx,[eax]
589
    jnz   bnewba
589
    jnz   bnewba
590
    pusha
590
    pusha
591
    mov   ecx,ebx
591
    mov   ecx,ebx
592
    inc   ecx
592
    inc   ecx
593
    shl   ecx,4
593
    shl   ecx,4
594
    mov   ebx,eax
594
    mov   ebx,eax
595
    add   eax,0x10
595
    add   eax,0x10
596
    call  memmove
596
    call  memmove
597
    dec   dword [edi]
597
    dec   dword [edi]
598
    popa
598
    popa
599
    jmp   bnewba2
599
    jmp   bnewba2
600
  bnmba:
600
  bnmba:
601
 
601
 
602
    pusha     ; save window coordinates for window restoring
602
    pusha     ; save window coordinates for window restoring
603
    cld
603
    cld
604
    shl   esi,5
604
    shl   esi,5
605
    add   esi,window_data
605
    add   esi,window_data
606
    mov   eax,[esi+WDATA.box.left]
606
    mov   eax,[esi+WDATA.box.left]
607
    mov   [dlx],eax
607
    mov   [dlx],eax
608
    add   eax,[esi+WDATA.box.width]
608
    add   eax,[esi+WDATA.box.width]
609
    mov   [dlxe],eax
609
    mov   [dlxe],eax
610
    mov   eax,[esi+WDATA.box.top]
610
    mov   eax,[esi+WDATA.box.top]
611
    mov   [dly],eax
611
    mov   [dly],eax
612
    add   eax,[esi+WDATA.box.height]
612
    add   eax,[esi+WDATA.box.height]
613
    mov   [dlye],eax
613
    mov   [dlye],eax
614
 
614
 
615
    xor   eax, eax
615
    xor   eax, eax
616
    mov   [esi+WDATA.box.left],eax
616
    mov   [esi+WDATA.box.left],eax
617
    mov   [esi+WDATA.box.width],eax
617
    mov   [esi+WDATA.box.width],eax
618
    mov   [esi+WDATA.box.top],eax
618
    mov   [esi+WDATA.box.top],eax
619
    mov   [esi+WDATA.box.height],eax
619
    mov   [esi+WDATA.box.height],eax
620
    mov   [esi+WDATA.cl_workarea],eax
620
    mov   [esi+WDATA.cl_workarea],eax
621
    mov   [esi+WDATA.cl_titlebar],eax
621
    mov   [esi+WDATA.cl_titlebar],eax
622
    mov   [esi+WDATA.cl_frames],eax
622
    mov   [esi+WDATA.cl_frames],eax
623
    mov   dword [esi+WDATA.reserved],eax ; clear all flags: wstate, redraw, wdrawn
623
    mov   dword [esi+WDATA.reserved],eax ; clear all flags: wstate, redraw, wdrawn
624
    lea   edi, [esi-window_data+draw_data]
624
    lea   edi, [esi-window_data+draw_data]
625
    mov   ecx,32/4
625
    mov   ecx,32/4
626
    rep   stosd
626
    rep   stosd
627
    popa
627
    popa
628
 
628
 
629
; debuggee test
629
; debuggee test
630
    pushad
630
    pushad
631
    mov  edi, esi
631
    mov  edi, esi
632
    shl  edi, 5
632
    shl  edi, 5
633
    mov  eax, [SLOT_BASE+edi*8+APPDATA.debugger_slot]
633
    mov  eax, [SLOT_BASE+edi*8+APPDATA.debugger_slot]
634
    test eax, eax
634
    test eax, eax
635
    jz   .nodebug
635
    jz   .nodebug
636
    push 8
636
    push 8
637
    pop  ecx
637
    pop  ecx
638
    push dword [CURRENT_TASK+edi+TASKDATA.pid]   ; PID
638
    push dword [CURRENT_TASK+edi+TASKDATA.pid]   ; PID
639
    push 2
639
    push 2
640
    call debugger_notify
640
    call debugger_notify
641
    pop  ecx
641
    pop  ecx
642
    pop  ecx
642
    pop  ecx
643
.nodebug:
643
.nodebug:
644
    popad
644
    popad
645
 
645
 
646
           mov ebx, [.slot]
646
           mov ebx, [.slot]
647
           shl ebx, 8
647
           shl ebx, 8
648
           mov ebx,[SLOT_BASE+ebx+APPDATA.pl0_stack]
648
           mov ebx,[SLOT_BASE+ebx+APPDATA.pl0_stack]
649
 
649
 
650
           stdcall kernel_free, ebx
650
           stdcall kernel_free, ebx
651
 
651
 
652
           mov edi, [.slot]
652
           mov edi, [.slot]
653
           shl edi,8
653
           shl edi,8
654
           add edi,SLOT_BASE
654
           add edi,SLOT_BASE
-
 
655
 
-
 
656
           mov eax, [edi+APPDATA.io_map]
-
 
657
           cmp eax, (tss._io_map_0-OS_BASE+PG_MAP)
-
 
658
           je @F
-
 
659
           call free_page
-
 
660
@@:
-
 
661
           mov eax, [edi+APPDATA.io_map+4]
-
 
662
           cmp eax, (tss._io_map_0-OS_BASE+PG_MAP)
-
 
663
           je @F
-
 
664
           call free_page
-
 
665
@@:
655
           mov eax, 0x20202020
666
           mov eax, 0x20202020
656
           stosd
667
           stosd
657
           stosd
668
           stosd
658
           stosd
669
           stosd
659
           mov ecx,244/4
670
           mov ecx,244/4
660
           xor eax, eax
671
           xor eax, eax
661
           rep stosd
672
           rep stosd
662
 
673
 
663
  ; activate window
674
  ; activate window
664
        movzx  eax, word [WIN_STACK + esi*2]
675
        movzx  eax, word [WIN_STACK + esi*2]
665
        cmp    eax, [TASK_COUNT]
676
        cmp    eax, [TASK_COUNT]
666
        jne    .dont_activate
677
        jne    .dont_activate
667
        pushad
678
        pushad
668
 .check_next_window:
679
 .check_next_window:
669
        dec    eax
680
        dec    eax
670
        cmp    eax, 1
681
        cmp    eax, 1
671
        jbe    .nothing_to_activate
682
        jbe    .nothing_to_activate
672
        lea    esi, [WIN_POS+eax*2]
683
        lea    esi, [WIN_POS+eax*2]
673
        movzx  edi, word [esi]               ; edi = process
684
        movzx  edi, word [esi]               ; edi = process
674
        shl    edi, 5
685
        shl    edi, 5
675
        cmp    [CURRENT_TASK + edi + TASKDATA.state], byte 9  ; skip dead slots
686
        cmp    [CURRENT_TASK + edi + TASKDATA.state], byte 9  ; skip dead slots
676
        je     .check_next_window
687
        je     .check_next_window
677
        add    edi, window_data
688
        add    edi, window_data
678
; \begin{diamond}[19.09.2006]
689
; \begin{diamond}[19.09.2006]
679
; skip minimized windows
690
; skip minimized windows
680
        test   [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
691
        test   [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
681
        jnz    .check_next_window
692
        jnz    .check_next_window
682
; \end{diamond}
693
; \end{diamond}
683
        call   waredraw
694
        call   waredraw
684
 .nothing_to_activate:
695
 .nothing_to_activate:
685
        popad
696
        popad
686
 .dont_activate:
697
 .dont_activate:
687
 
698
 
688
        push    esi     ; remove hd1 & cd & flp reservation
699
        push    esi     ; remove hd1 & cd & flp reservation
689
        shl     esi, 5
700
        shl     esi, 5
690
        mov     esi, [esi+CURRENT_TASK+TASKDATA.pid]
701
        mov     esi, [esi+CURRENT_TASK+TASKDATA.pid]
691
        cmp     [hd1_status], esi
702
        cmp     [hd1_status], esi
692
        jnz     @f
703
        jnz     @f
693
        call    free_hd_channel
704
        call    free_hd_channel
694
        mov     [hd1_status], 0
705
        mov     [hd1_status], 0
695
@@:
706
@@:
696
        cmp     [cd_status], esi
707
        cmp     [cd_status], esi
697
        jnz     @f
708
        jnz     @f
698
        call    free_cd_channel
709
        call    free_cd_channel
699
        mov     [cd_status], 0
710
        mov     [cd_status], 0
700
@@:
711
@@:
701
        cmp     [flp_status], esi
712
        cmp     [flp_status], esi
702
        jnz     @f
713
        jnz     @f
703
        mov     [flp_status], 0
714
        mov     [flp_status], 0
704
@@:
715
@@:
705
        pop     esi
716
        pop     esi
706
 
717
 
707
    pusha ; remove all irq reservations
718
    pusha ; remove all irq reservations
708
    mov   eax,esi
719
    mov   eax,esi
709
    shl   eax, 5
720
    shl   eax, 5
710
    mov   eax,[eax+CURRENT_TASK+TASKDATA.pid]
721
    mov   eax,[eax+CURRENT_TASK+TASKDATA.pid]
711
    mov   edi,irq_owner
722
    mov   edi,irq_owner
712
    mov   ecx,16
723
    mov   ecx,16
713
  newirqfree:
724
  newirqfree:
714
    scasd
725
    scasd
715
    jne   nofreeirq
726
    jne   nofreeirq
716
    mov   [edi-4],dword 0
727
    mov   [edi-4],dword 0
717
  nofreeirq:
728
  nofreeirq:
718
    loop   newirqfree
729
    loop   newirqfree
719
    popa
730
    popa
720
 
731
 
721
    pusha                     ; remove all port reservations
732
    pusha                     ; remove all port reservations
722
    mov   edx,esi
733
    mov   edx,esi
723
    shl   edx, 5
734
    shl   edx, 5
724
    add   edx,CURRENT_TASK
735
    add   edx,CURRENT_TASK
725
    mov   edx,[edx+TASKDATA.pid]
736
    mov   edx,[edx+TASKDATA.pid]
726
 
737
 
727
  rmpr0:
738
  rmpr0:
728
 
739
 
729
    mov   esi,[RESERVED_PORTS]
740
    mov   esi,[RESERVED_PORTS]
730
 
741
 
731
    cmp   esi,0
742
    cmp   esi,0
732
    je    rmpr9
743
    je    rmpr9
733
 
744
 
734
  rmpr3:
745
  rmpr3:
735
 
746
 
736
    mov   edi,esi
747
    mov   edi,esi
737
    shl   edi,4
748
    shl   edi,4
738
    add   edi,RESERVED_PORTS
749
    add   edi,RESERVED_PORTS
739
 
750
 
740
    cmp   edx,[edi]
751
    cmp   edx,[edi]
741
    je    rmpr4
752
    je    rmpr4
742
 
753
 
743
    dec   esi
754
    dec   esi
744
    jnz   rmpr3
755
    jnz   rmpr3
745
 
756
 
746
    jmp   rmpr9
757
    jmp   rmpr9
747
 
758
 
748
  rmpr4:
759
  rmpr4:
749
 
760
 
750
    mov   ecx,256
761
    mov   ecx,256
751
    sub   ecx,esi
762
    sub   ecx,esi
752
    shl   ecx,4
763
    shl   ecx,4
753
 
764
 
754
    mov   esi,edi
765
    mov   esi,edi
755
    add   esi,16
766
    add   esi,16
756
    cld
767
    cld
757
    rep   movsb
768
    rep   movsb
758
 
769
 
759
    dec   dword [RESERVED_PORTS]
770
    dec   dword [RESERVED_PORTS]
760
 
771
 
761
    jmp   rmpr0
772
    jmp   rmpr0
762
 
773
 
763
  rmpr9:
774
  rmpr9:
764
 
775
 
765
    popa
776
    popa
766
    mov  edi,esi         ; do not run this process slot
777
    mov  edi,esi         ; do not run this process slot
767
    shl  edi, 5
778
    shl  edi, 5
768
    mov  [edi+CURRENT_TASK + TASKDATA.state],byte 9
779
    mov  [edi+CURRENT_TASK + TASKDATA.state],byte 9
769
; debugger test - terminate all debuggees
780
; debugger test - terminate all debuggees
770
    mov  eax, 2
781
    mov  eax, 2
771
    mov  ecx, SLOT_BASE+2*0x100+APPDATA.debugger_slot
782
    mov  ecx, SLOT_BASE+2*0x100+APPDATA.debugger_slot
772
.xd0:
783
.xd0:
773
    cmp  eax, [TASK_COUNT]
784
    cmp  eax, [TASK_COUNT]
774
    ja   .xd1
785
    ja   .xd1
775
    cmp  dword [ecx], esi
786
    cmp  dword [ecx], esi
776
    jnz  @f
787
    jnz  @f
777
    and  dword [ecx], 0
788
    and  dword [ecx], 0
778
    pushad
789
    pushad
779
    xchg eax, ebx
790
    xchg eax, ebx
780
    mov  eax, 2
791
    mov  eax, 2
781
    call sys_system
792
    call sys_system
782
    popad
793
    popad
783
@@:
794
@@:
784
    inc  eax
795
    inc  eax
785
    add  ecx, 0x100
796
    add  ecx, 0x100
786
    jmp  .xd0
797
    jmp  .xd0
787
.xd1:
798
.xd1:
788
;    call  systest
799
;    call  systest
789
    sti  ; .. and life goes on
800
    sti  ; .. and life goes on
790
 
801
 
791
    mov   eax, [dlx]
802
    mov   eax, [dlx]
792
    mov   ebx, [dly]
803
    mov   ebx, [dly]
793
    mov   ecx, [dlxe]
804
    mov   ecx, [dlxe]
794
    mov   edx, [dlye]
805
    mov   edx, [dlye]
795
    call  calculatescreen
806
    call  calculatescreen
796
    xor   eax, eax
807
    xor   eax, eax
797
    xor   esi, esi
808
    xor   esi, esi
798
    call  redrawscreen
809
    call  redrawscreen
799
 
810
 
800
    mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
811
    mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
801
    mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
812
    mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
802
 
813
 
803
    mov   [application_table_status],0
814
    mov   [application_table_status],0
804
    mov   esi,process_terminated
815
    mov   esi,process_terminated
805
    call  sys_msg_board_str
816
    call  sys_msg_board_str
806
    add esp, 4
817
    add esp, 4
807
    ret
818
    ret
808
restore .slot
819
restore .slot
809
 
820
 
810
iglobal
821
iglobal
811
  boot_sched_1    db   'Building gdt tss pointer',0
822
  boot_sched_1    db   'Building gdt tss pointer',0
812
  boot_sched_2    db   'Building IDT table',0
823
  boot_sched_2    db   'Building IDT table',0
813
endg
824
endg
814
 
825
 
815
 
826
 
816
build_scheduler:
827
build_scheduler:
817
 
828
 
818
        mov    esi,boot_sched_1
829
        mov    esi,boot_sched_1
819
        call   boot_log
830
        call   boot_log
820
  ;      call   build_process_gdt_tss_pointer
831
  ;      call   build_process_gdt_tss_pointer
821
 
832
 
822
  ;      mov    esi,boot_sched_2
833
  ;      mov    esi,boot_sched_2
823
  ;      call   boot_log
834
  ;      call   boot_log
824
 
835
 
825
        ret
836
        ret