Subversion Repositories Kolibri OS

Rev

Rev 233 | Rev 247 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 233 Rev 237
Line 19... Line 19...
19
  .stack_top   dd ?    ;+24
19
  .stack_top   dd ?    ;+24
20
  .i_param     dd ?    ;+28
20
  .i_param     dd ?    ;+28
21
  .i_icon      dd ?    ;+32
21
  .i_icon      dd ?    ;+32
22
}
22
}
Line 23... Line 23...
23
 
23
 
-
 
24
struc TSS
-
 
25
{
-
 
26
  ._back   rw 2
-
 
27
  ._esp0   rd 1
-
 
28
  ._ss0    rw 2
-
 
29
  ._esp1   rd 1
-
 
30
  ._ss1    rw 2
-
 
31
  ._esp2   rd 1
-
 
32
  ._ss2    rw 2
-
 
33
  ._cr3    rd 1
-
 
34
  ._eip    rd 1
-
 
35
  ._eflags rd 1
-
 
36
  ._eax    rd 1
-
 
37
  ._ecx    rd 1
-
 
38
  ._edx    rd 1
-
 
39
  ._ebx    rd 1
-
 
40
  ._esp    rd 1
-
 
41
  ._ebp    rd 1
24
align 4
42
  ._esi    rd 1
-
 
43
  ._edi    rd 1
-
 
44
  ._es     rw 2
-
 
45
  ._cs     rw 2
-
 
46
  ._ss     rw 2
-
 
47
  ._ds     rw 2
25
proc test_app_header stdcall, header:dword
48
  ._fs     rw 2
-
 
49
  ._gs     rw 2
-
 
50
  ._ldt    rw 2
26
           virtual at ebx
51
  ._trap   rw 1
-
 
52
  ._io     rw 1
-
 
53
}
-
 
54
 
-
 
55
virtual at 0
27
             APP_HEADER_00 APP_HEADER_00
56
  TSS  TSS
Line -... Line 57...
-
 
57
end virtual
-
 
58
 
-
 
59
struc APP_PARAMS
-
 
60
{ .app_cmdline   ;0x00
-
 
61
  .app_path      ;0x04
-
 
62
  .app_eip       ;0x08
-
 
63
  .app_esp       ;0x0C
-
 
64
  .app_mem       ;0x10
-
 
65
}
-
 
66
 
-
 
67
macro _clear_ op
-
 
68
{  mov ecx, op/4
-
 
69
   xor eax, eax
-
 
70
   cld
-
 
71
   rep stosd
-
 
72
}
-
 
73
 
-
 
74
align 4
-
 
75
proc fs_exec_EX stdcall file_name:dword, cmd_line:dword, flags:dword
-
 
76
           locals
-
 
77
             save_cr3      dd ?
-
 
78
             slot          dd ?
-
 
79
             slot_base     dd ?
-
 
80
             file_base     dd ?
-
 
81
             file_size     dd ?
-
 
82
 
-
 
83
             app_cmdline   dd ? ;0x00
-
 
84
             app_path      dd ? ;0x04
-
 
85
             app_eip       dd ? ;0x08
-
 
86
             app_esp       dd ? ;0x0C
-
 
87
             app_mem       dd ? ;0x10
-
 
88
           endl
-
 
89
 
-
 
90
           stdcall load_file,[file_name]
28
           end virtual
91
           mov  ecx, -ERROR_FILE_NOT_FOUND
-
 
92
 
-
 
93
           test eax, eax
-
 
94
           jz .err   ;fail
-
 
95
 
-
 
96
           mov [file_base], eax
29
 
97
           mov [file_size], ebx
30
           mov ebx, [header]
98
 
-
 
99
           lea ebx, [app_cmdline]
-
 
100
           call test_app_header
-
 
101
           mov ecx, -0x1F
Line 31... Line -...
31
           cmp [ebx+6], word '00'
-
 
32
           jne  .check_01_header
-
 
33
 
102
           test eax, eax
34
           mov  eax,[APP_HEADER_00.start]
-
 
35
           mov  [app_start],eax
103
           jz .err   ;fail
-
 
104
 
36
           mov  eax,[APP_HEADER_00.i_end]
105
           mov esi, new_process_loading
37
           mov  [app_i_end],eax
106
           call sys_msg_board_str       ; write message to message board
-
 
107
 
38
           mov  eax,[APP_HEADER_00.mem_size]
108
           pushfd
39
           mov  [app_mem],eax
109
           cli
40
           shr  eax,1
110
 
41
           sub  eax,0x10
111
.wait_lock:
42
           mov  [app_esp],eax
112
           cmp [application_table_status],0
Line -... Line 113...
-
 
113
           je .get_lock
43
           mov  eax,[APP_HEADER_00.i_param]
114
           call   change_task
-
 
115
           jmp .wait_lock
-
 
116
 
-
 
117
.get_lock:
-
 
118
           mov eax, 1
-
 
119
           xchg eax, [application_table_status]
-
 
120
           cmp eax, 0
-
 
121
           jne .wait_lock
-
 
122
 
-
 
123
           call set_application_table_status
-
 
124
 
-
 
125
           call get_new_process_place
-
 
126
           test eax, eax
-
 
127
           mov ecx, -0x20      ; too many processes
-
 
128
           jz .err
-
 
129
 
-
 
130
           mov [slot], eax
-
 
131
           shl eax, 8
-
 
132
           add eax, PROC_BASE
-
 
133
           mov [slot_base], eax
-
 
134
           mov edi, eax
-
 
135
           _clear_ 256     ;clean extended information about process
-
 
136
 
-
 
137
; write application name
-
 
138
           mov edi, [file_name]
-
 
139
           mov al, '/'
-
 
140
           call k_strrchr  ; now eax points to name without path
-
 
141
 
-
 
142
           lea esi, [eax+1]
-
 
143
           test eax, eax
-
 
144
           jnz @F
-
 
145
           mov esi, [file_name]
-
 
146
@@:
-
 
147
           mov ecx, 8  ; 8 chars for name
-
 
148
           mov edi, [slot_base]
-
 
149
.copy_process_name_loop:
-
 
150
           lodsb
-
 
151
           cmp al, '.'
-
 
152
           jz .copy_process_name_done
-
 
153
           test al, al
-
 
154
           jz .copy_process_name_done
-
 
155
           stosb
-
 
156
           loop .copy_process_name_loop
-
 
157
.copy_process_name_done:
-
 
158
 
-
 
159
           mov ebx, cr3
-
 
160
           mov [save_cr3], ebx
-
 
161
     if GREEDY_KERNEL
-
 
162
           stdcall create_app_space,[app_mem],[file_size]
-
 
163
     else
-
 
164
           stdcall create_app_space,[app_mem],[app_mem]
-
 
165
     end if
-
 
166
           test eax, eax
-
 
167
           jz .failed
-
 
168
 
-
 
169
           mov   ebx,[slot_base]
-
 
170
           mov   [ebx+APPDATA.dir_table],eax
-
 
171
           mov   eax,[app_mem]
-
 
172
           mov   [ebx+APPDATA.mem_size],eax
-
 
173
 
-
 
174
           mov ecx, [file_size]
-
 
175
           add ecx, 3
-
 
176
           shr ecx, 2
-
 
177
           mov esi, [file_base]
-
 
178
           mov edi, new_app_base
-
 
179
           cld
-
 
180
           rep movsd
-
 
181
 
-
 
182
           stdcall kernel_free, [file_base]
-
 
183
           lea eax, [app_cmdline]
-
 
184
           stdcall set_app_params ,[slot],eax,[cmd_line],\
-
 
185
                                         [file_name], dword 0 ;[flags]
-
 
186
 
-
 
187
           mov eax, [save_cr3]
-
 
188
           call set_cr3
-
 
189
 
44
           mov  [app_i_param],eax
190
           xor eax, eax
-
 
191
           mov    [application_table_status],eax ;unlock application_table_status mutex
-
 
192
           popfd
-
 
193
           mov    eax,[process_number]  ;set result
-
 
194
           ret
-
 
195
.failed:
-
 
196
           mov eax, [save_cr3]
-
 
197
           call set_cr3
-
 
198
.err:
-
 
199
           popfd
Line -... Line 200...
-
 
200
           xor eax, eax
45
           mov  [app_i_icon],dword 0
201
           mov [application_table_status],eax
-
 
202
           ret
-
 
203
endp
-
 
204
 
46
 
205
align 4
47
           mov  eax,1
206
test_app_header:
48
           ret
207
           virtual at eax
Line -... Line 208...
-
 
208
             APP_HEADER_00 APP_HEADER_00
-
 
209
           end virtual
49
 
210
           virtual at eax
50
 .check_01_header:
211
             APP_HEADER_01 APP_HEADER_01
Line 51... Line -...
51
           virtual at ebx
-
 
52
             APP_HEADER_01 APP_HEADER_01
212
           end virtual
53
           end virtual
-
 
54
 
213
 
55
           cmp  [ebx+6],word '01'
-
 
56
           jne  .no_01_header
-
 
57
 
-
 
58
           mov  eax,[APP_HEADER_01.start]
-
 
59
           mov  [app_start],eax
-
 
60
           mov  eax,[APP_HEADER_01.i_end]
-
 
61
           mov  [app_i_end],eax
-
 
62
           mov  eax,[APP_HEADER_01.mem_size]
-
 
Line -... Line 214...
-
 
214
           cmp dword [eax], 'MENU'
-
 
215
           jne .fail
-
 
216
           cmp word [eax+4],'ET'
-
 
217
           jne .fail
63
           mov  [app_mem],eax
218
 
-
 
219
           cmp [eax+6], word '00'
-
 
220
           jne  .check_01_header
-
 
221
 
-
 
222
           mov  ecx,[APP_HEADER_00.start]
-
 
223
           mov  [ebx+0x08], ecx                ;app_eip
64
           mov  eax,[APP_HEADER_01.stack_top]
224
           mov  edx,[APP_HEADER_00.mem_size]
Line 65... Line 225...
65
           mov  [app_esp],eax
225
           mov  [ebx+0x10], edx                ;app_mem
-
 
226
           shr  edx,1
-
 
227
           sub  edx,0x10
-
 
228
           mov  [ebx+0x0C], edx                ;app_esp
Line -... Line 229...
-
 
229
           mov  ecx,[APP_HEADER_00.i_param]
-
 
230
           mov  [ebx], ecx                     ;app_cmdline
-
 
231
           mov  [ebx+4], dword 0               ;app_path
-
 
232
           ret
-
 
233
 
-
 
234
 .check_01_header:
-
 
235
 
-
 
236
           cmp  [eax+6],word '01'
-
 
237
           jne  .fail
-
 
238
 
-
 
239
           mov  ecx,[APP_HEADER_01.start]
-
 
240
           mov  [ebx+0x08], ecx                ;app_eip
66
           mov  eax,[APP_HEADER_01.i_param]
241
           mov  edx,[APP_HEADER_01.mem_size]
67
           mov  [app_i_param],eax
242
           mov  [ebx+0x10], edx                ;app_mem
68
           mov  eax,[APP_HEADER_01.i_icon]
-
 
Line 69... Line 243...
69
           mov  [app_i_icon],eax
243
           mov  ecx,[APP_HEADER_01.stack_top]
70
 
244
           mov  [ebx+0x0C], ecx                ;app_esp
71
           mov  eax,1
245
           mov  edx,[APP_HEADER_01.i_param]
72
           ret
246
           mov  [ebx], edx                     ;app_cmdline
Line 397... Line 571...
397
           mov eax, TMP_FILE_NAME
571
           mov eax, TMP_FILE_NAME
398
           add eax, [tmp_task_data]
572
           add eax, [tmp_task_data]
399
           mov ebx, [tmp_task_data]    ;cmd line
573
           mov ebx, [tmp_task_data]    ;cmd line
400
           add ebx, TMP_CMD_LINE
574
           add ebx, TMP_CMD_LINE
Line -... Line 575...
-
 
575
 
-
 
576
           stdcall fs_exec_EX, eax, ebx, [flags]
401
 
577
 
402
           stdcall fs_exec, eax, ebx, [flags], [ebp+8],\
578
;           stdcall fs_exec, eax, ebx, [flags], [ebp+8],\
403
                            [ebp+12], [ebp+16],[ebp+20]
579
;                            [ebp+12], [ebp+16],[ebp+20]
404
           mov [retval], eax
580
           mov [retval], eax
405
           popad
581
           popad
406
           mov [pg_data.tmp_task_mutex], 0
582
           mov [pg_data.tmp_task_mutex], 0
407
           mov eax, [retval]
583
           mov eax, [retval]
Line 408... Line 584...
408
           ret
584
           ret
Line 409... Line -...
409
 
-
 
410
endp
-
 
411
 
-
 
412
align 4
-
 
413
proc fs_exec stdcall file_name:dword, cmd_line:dword, flags:dword,\
-
 
414
                       fn_read:dword, file_size:dword,\
-
 
415
                       cluster:dword, some_data:dword
-
 
416
 
-
 
417
           locals
-
 
418
             slot          dd ?
-
 
419
             app_path_size dd ?
-
 
420
             save_cr3      dd ?
-
 
421
             img_size      dd ?
-
 
422
           endl
-
 
423
 
-
 
424
; check filename length - with terminating NULL must be no more than 1024 symbols
-
 
425
 
-
 
426
           mov edi, [file_name]
-
 
427
           mov ecx, 1024
-
 
428
           xor eax, eax
-
 
429
           repnz scasb
-
 
430
           jz @f
-
 
431
           mov     eax, -ERROR_FILE_NOT_FOUND
-
 
432
           ret
-
 
433
@@:
-
 
434
           sub edi, [file_name]
-
 
435
           mov [app_path_size], edi
-
 
436
 
-
 
437
           mov esi, new_process_loading
-
 
438
           call sys_msg_board_str       ; write message to message board
-
 
439
 
-
 
440
           pushfd
-
 
441
           cli
-
 
442
 
-
 
443
.wait_lock:
-
 
444
           cmp [application_table_status],0
-
 
445
           je .get_lock
-
 
446
           call   change_task
-
 
447
           jmp .wait_lock
-
 
448
 
-
 
449
.get_lock:
-
 
450
           mov eax, 1
-
 
451
           xchg eax, [application_table_status]
-
 
452
           cmp eax, 0
-
 
453
           jne .wait_lock
-
 
454
 
-
 
455
           call   set_application_table_status
-
 
456
 
-
 
457
           call get_new_process_place
-
 
458
           test eax, eax
-
 
459
           mov ecx, -0x20      ; too many processes
-
 
460
           jz .err
-
 
461
           mov [slot], eax
-
 
462
 
-
 
463
           mov    edi,eax
-
 
464
           shl    edi,8
-
 
465
           add    edi,PROC_BASE
-
 
466
           mov    ecx,256/4
-
 
467
           xor    eax,eax
-
 
468
           cld
-
 
469
           rep    stosd              ;clean extended information about process
-
 
470
 
-
 
471
; write application name
-
 
472
 
-
 
473
           mov edi, [file_name]
-
 
474
           mov ecx, [app_path_size]
-
 
475
           add edi, ecx
-
 
476
           dec edi
-
 
477
           std
-
 
478
           mov al, '/'
-
 
479
           repnz scasb
-
 
480
           cld
-
 
481
           jnz @f
-
 
482
           inc edi
-
 
483
@@:
-
 
484
           inc edi
-
 
485
; now edi points to name without path
-
 
486
 
-
 
487
           mov esi, edi
-
 
488
           mov ecx, 8  ; 8 chars for name
-
 
489
           mov edi, [slot]
-
 
490
           shl edi, cl
-
 
491
           add edi, PROC_BASE
-
 
492
.copy_process_name_loop:
-
 
493
           lodsb
-
 
494
           cmp al, '.'
-
 
495
           jz .copy_process_name_done
-
 
496
           test al, al
-
 
497
           jz .copy_process_name_done
-
 
498
           stosb
-
 
499
           loop .copy_process_name_loop
-
 
500
.copy_process_name_done:
-
 
501
           mov al, ' '
-
 
502
           rep stosb
-
 
503
           pop eax
-
 
504
           mov cl, 3   ; 3 chars for extension
-
 
505
           dec esi
-
 
506
@@:
-
 
507
           dec eax
-
 
508
           cmp eax, esi
-
 
509
           jbe .copy_process_ext_done
-
 
510
           cmp byte [eax], '.'
-
 
511
           jnz @b
-
 
512
           lea esi, [eax+1]
-
 
513
.copy_process_ext_loop:
-
 
514
           lodsb
-
 
515
           test al, al
-
 
516
           jz  .copy_process_ext_done
-
 
517
           stosb
-
 
518
           loop .copy_process_ext_loop
-
 
519
.copy_process_ext_done:
-
 
520
           mov al, ' '
-
 
521
           rep stosb
-
 
522
 
-
 
523
; read header
-
 
524
           lea  eax, [file_size]
-
 
525
           mov ebx, [eax]
-
 
526
           mov [img_size], ebx
-
 
527
           mov  edi, TMP_BUFF
-
 
528
           call [fn_read]
-
 
529
 
-
 
530
           test eax, eax
-
 
531
           jnz .err
-
 
532
 
-
 
533
; check menuet signature
-
 
534
 
-
 
535
           mov ecx, -0x1F
-
 
536
;check MENUET signature
-
 
537
           cmp    [TMP_BUFF],dword 'MENU'
-
 
538
           jnz    .err
-
 
539
           cmp    [TMP_BUFF+4],word 'ET'
-
 
540
           jnz    .err
-
 
541
 
-
 
542
           stdcall test_app_header, TMP_BUFF
-
 
543
           test eax, eax
-
 
544
           jz .err
-
 
545
 
-
 
546
           mov eax, cr3
-
 
547
           mov [save_cr3], eax
-
 
548
     if GREEDY_KERNEL
-
 
549
           stdcall create_app_space,[app_mem],[img_size]
-
 
550
     else
-
 
551
           stdcall create_app_space,[app_mem],[app_mem]
-
 
552
     end if
-
 
553
           test eax, eax
-
 
554
           jz .failed
-
 
555
 
-
 
556
           mov    ebx,[slot]
-
 
557
           shl   ebx,8
-
 
558
           mov   [PROC_BASE+ebx+0xB8],eax
-
 
559
 
-
 
560
           mov esi, TMP_BUFF
-
 
561
           mov edi, new_app_base
-
 
562
           mov ecx, 512/4
-
 
563
           cld
-
 
564
           rep movsd
-
 
565
 
-
 
566
;read file
-
 
567
@@:
-
 
568
           lea  eax, [file_size]
-
 
569
           cmp dword [eax], 0
-
 
570
           jz .done
-
 
571
           push edi
-
 
572
           call [fn_read]
-
 
573
           pop edi
-
 
574
           add edi, 512
-
 
575
           test eax, eax
-
 
576
           jz  @b
-
 
577
           cmp ebx, 6
-
 
578
           jne .failed
-
 
579
.done:
-
 
580
           stdcall add_app_parameters, [slot], new_app_base,\
-
 
581
                                       [cmd_line],[file_name],[flags]
-
 
582
 
-
 
583
           mov eax, [save_cr3]
-
 
584
           call set_cr3
-
 
585
 
-
 
586
           xor eax, eax
-
 
587
           mov    [application_table_status],eax ;unlock application_table_status mutex
-
 
588
           popfd
-
 
589
           mov    eax,[process_number]  ;set result
-
 
590
           ret
-
 
591
 
-
 
592
.failed:
-
 
593
           mov eax, [save_cr3]
-
 
594
           call set_cr3
-
 
595
.err:
-
 
596
 
-
 
597
           popfd
-
 
598
           xor eax, eax
-
 
599
           mov [application_table_status],eax
-
 
600
           ret
-
 
601
endp
-
 
602
 
-
 
603
align 4
-
 
604
proc add_app_parameters stdcall,slot:dword,img_base:dword,\
-
 
605
                        cmd_line:dword, app_path:dword, flags:dword
-
 
606
 
-
 
607
           mov edi, [slot]
-
 
608
           mov esi, [fpu_data]
-
 
609
           bt [cpu_caps], CAPS_SSE
-
 
610
           jnc .no_SSE
-
 
611
 
-
 
612
           shl edi, 8
-
 
613
           mov eax, edi
-
 
614
           lea edi, [esi+edi*2]
-
 
615
           mov [eax+PROC_BASE+APPDATA.fpu_state], edi
-
 
616
           mov [eax+PROC_BASE+APPDATA.fpu_handler], 0
-
 
617
           mov [eax+PROC_BASE+APPDATA.sse_handler], 0
-
 
618
           mov ecx, 512/4
-
 
619
           jmp @F
-
 
620
.no_SSE:
-
 
621
           mov eax, edi
-
 
622
           shl eax, 8
-
 
623
           mov ebx, edi
-
 
624
           shl edi, 7
-
 
625
           shl ebx, 4
-
 
626
           sub edi, ebx       ;edi*=112
-
 
627
           add edi, esi
-
 
628
           mov [eax+PROC_BASE+APPDATA.fpu_state], edi
-
 
629
           mov [eax+PROC_BASE+APPDATA.fpu_handler], 0
-
 
630
           mov [eax+PROC_BASE+APPDATA.sse_handler], 0
-
 
631
           mov ecx, 112/4
-
 
632
@@:
-
 
633
           rep movsd
-
 
634
 
-
 
635
           mov    ebx,[slot]
-
 
636
           cmp    ebx,[TASK_COUNT]
-
 
637
           jle    .noinc
-
 
638
           inc    dword [TASK_COUNT]       ;update number of processes
-
 
639
.noinc:
-
 
640
           shl    ebx,8
-
 
641
           mov    eax,[app_mem]
-
 
642
           mov    [PROC_BASE+APPDATA.mem_size+ebx],eax
-
 
643
 
-
 
644
           mov    ecx, [def_cursor]
-
 
645
           mov    [PROC_BASE+APPDATA.cursor+ebx],ecx
-
 
646
 
-
 
647
           shr    ebx,3
-
 
648
           mov eax, new_app_base
-
 
649
           mov    dword [CURRENT_TASK+ebx+0x10],eax
-
 
650
 
-
 
651
.add_command_line:
-
 
652
           mov    edx,[app_i_param]
-
 
653
           test   edx,edx
-
 
654
           jz     .no_command_line      ;application don't need parameters
-
 
655
           mov    eax,[cmd_line]
-
 
656
           test   eax,eax
-
 
657
           jz     .no_command_line      ;no parameters specified
-
 
658
;calculate parameter length
-
 
659
           xor    ecx,ecx
-
 
660
.command_line_len:
-
 
661
           cmp    byte [eax],0
-
 
662
           jz     .command_line_len_end
-
 
663
           inc    eax
-
 
664
           inc    ecx
-
 
665
           cmp    ecx,255
-
 
666
           jl     .command_line_len
-
 
667
 
-
 
668
.command_line_len_end:
-
 
669
;ecx - parameter length
-
 
670
;edx - address of parameters in new process address space
-
 
671
           inc ecx
-
 
672
           mov edi, [img_base]
-
 
673
           add edi, edx
-
 
674
           mov esi, [cmd_line]
-
 
675
           rep movsb
-
 
676
 
-
 
677
.no_command_line:
-
 
678
 
-
 
679
            mov    edx,[app_i_icon]
-
 
680
            test   edx,edx
-
 
681
            jz     .no_command_line_1      ;application don't need path of file
-
 
682
            mov    esi,[app_path]
-
 
683
            test esi, esi
-
 
684
            jz     .no_command_line_1      ;application don't need path of file
-
 
685
            mov    ecx, 64
-
 
686
            mov    edi, [img_base]
-
 
687
            add edi, edx
-
 
688
            rep movsb
-
 
689
 
-
 
690
.no_command_line_1:
-
 
691
           mov    ebx,[slot]
-
 
692
           mov    eax,ebx
-
 
693
           shl    ebx,5
-
 
694
; set window state to 'normal' (non-minimized/maximized/rolled-up) state
-
 
695
        mov     [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL
-
 
696
        mov     [ebx+window_data+WDATA.fl_redraw], 1
-
 
697
           add    ebx,CURRENT_TASK            ;ebx - pointer to information about process
-
 
698
           mov    [ebx+TASKDATA.wnd_number],al;set window number on screen = process slot
-
 
699
 
-
 
700
           mov    [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function)
-
 
701
 
-
 
702
           inc    dword [process_number]
-
 
703
           mov    eax,[process_number]
-
 
704
           mov    [ebx+4],eax           ;set PID
-
 
705
 
-
 
706
           mov    ecx,ebx
-
 
707
           add    ecx,(draw_data-CURRENT_TASK)  ;ecx - pointer to draw data
-
 
708
;set draw data to full screen
-
 
709
 
-
 
710
           mov    [ecx+0],dword 0
-
 
711
           mov    [ecx+4],dword 0
-
 
712
           mov    eax,[SCR_X_SIZE]
-
 
713
           mov    [ecx+8],eax
-
 
714
           mov    eax,[SCR_Y_SIZE]
-
 
715
           mov    [ecx+12],eax
-
 
716
;set cr3 register in TSS of application
-
 
717
 
-
 
718
           mov    ecx,[slot]
-
 
719
           shl    ecx,8
-
 
720
           mov    eax,[PROC_BASE+0xB8+ecx]
-
 
721
           ;or     eax,  PG_NOCACHE
-
 
722
           mov    [l.cr3],eax
-
 
723
 
-
 
724
           mov    eax,[app_start]
-
 
725
           mov    [l.eip],eax           ;set eip in TSS
-
 
726
           mov    eax,[app_esp]
-
 
727
           mov    [l.esp],eax           ;set stack in TSS
-
 
728
 
-
 
729
;gdt
-
 
730
           mov    ax,app_code           ;ax - selector of code segment
-
 
731
           mov    [l.cs],ax
-
 
732
           mov    ax,app_data
-
 
733
           mov    [l.ss],ax
-
 
734
           mov    [l.ds],ax
-
 
735
           mov    [l.es],ax
-
 
736
           mov    [l.fs],ax
-
 
737
           mov    ax,graph_data         ;ax - selector of graphic segment
-
 
738
           mov    [l.gs],ax
-
 
739
           mov    [l.io],word 128
-
 
740
           mov    [l.eflags],dword 0x1202
-
 
741
 
-
 
742
           mov    [l.ss0],os_data
-
 
743
           mov    ebx,[slot]
-
 
744
           shl    ebx,12
-
 
745
           add    ebx,sysint_stack_data+4096
-
 
746
           mov    [l.esp0],ebx
-
 
747
 
-
 
748
;copy tss to it place
-
 
749
           mov    eax,tss_sceleton
-
 
750
           mov    ebx,[slot]
-
 
751
           imul   ebx,tss_step
-
 
752
           add    ebx,tss_data          ;ebx - address of application TSS
-
 
753
           mov    ecx,120
-
 
754
           call   memmove
-
 
755
 
-
 
756
;Add IO access table - bit array of permitted ports
-
 
757
           or     eax,-1
-
 
758
           mov    edi,[slot]
-
 
759
           imul   edi,tss_step
-
 
760
           add    edi,tss_data+128
-
 
761
           mov    ecx,2048
-
 
762
           cld
-
 
763
           rep    stosd                 ;full access to 2048*8=16384 ports
-
 
764
 
-
 
765
           mov    ecx,ebx               ;ecx - address of application TSS
-
 
766
           mov    edi,[slot]
-
 
767
           shl    edi,3
-
 
768
;set TSS descriptor
-
 
769
           mov    [edi+gdts+tss0+0],word tss_step ;limit (size)
-
 
770
           mov    [edi+gdts+tss0+2],cx  ;part of offset
-
 
771
           mov    eax,ecx
-
 
772
           shr    eax,16
-
 
773
           mov    [edi+gdts+tss0+4],al  ;part of offset
-
 
774
           mov    [edi+gdts+tss0+7],ah  ;part of offset
-
 
775
           mov    [edi+gdts+tss0+5],word 01010000b*256+11101001b ;system flags
-
 
776
 
-
 
777
;flush keyboard and buttons queue
-
 
778
           mov    [KEY_COUNT],byte 0
-
 
779
           mov    [BTN_COUNT],byte 0
-
 
780
 
-
 
781
           mov    edi,[slot]
-
 
782
           shl    edi,5
-
 
783
           add    edi,window_data
-
 
784
           mov    ebx,[slot]
-
 
785
           movzx  esi,word [WIN_STACK+ebx*2]
-
 
786
           lea    esi,[WIN_POS+esi*2]
-
 
787
           call   windowactivate        ;gui initialization
-
 
788
 
-
 
789
           mov    ebx,[slot]
-
 
790
           shl    ebx,5
-
 
791
           mov    [CURRENT_TASK+ebx+0xa],byte 0 ;set process state - running
-
 
792
; set if debuggee
-
 
793
           mov eax, [flags]
-
 
794
           test   byte [flags], 1
-
 
795
           jz     .no_debug
-
 
796
           mov    [CURRENT_TASK+ebx+0xa],byte 1 ;set process state - suspended
-
 
797
           mov    eax,[CURRENT_TASK]
-
 
798
           mov    [PROC_BASE+ebx*8+0xac],eax ;set debugger PID - current
-
 
799
.no_debug:
-
 
800
 
-
 
801
           mov    esi,new_process_running
-
 
802
           call   sys_msg_board_str     ;output information about succefull startup
-
 
Line 803... Line 585...
803
 
585
 
804
           ret
586
endp
805
endp
587
 
806
 
588
 
Line 1052... Line 834...
1052
           popad
834
           popad
1053
           mov eax, [w_count]
835
           mov eax, [w_count]
1054
           ret
836
           ret
1055
endp
837
endp
Line 1056... Line -...
1056
 
-
 
1057
 
838
 
1058
align 4
839
align 4
1059
proc new_sys_threads
840
proc new_sys_threads
1060
           locals
-
 
1061
             thread_start  dd ?
-
 
1062
             thread_stack  dd ?
-
 
1063
             params        dd ?
841
           locals
-
 
842
             slot          dd ?
-
 
843
             app_cmdline   dd ? ;0x00
-
 
844
             app_path      dd ? ;0x04
-
 
845
             app_eip       dd ? ;0x08
-
 
846
             app_esp       dd ? ;0x0C
1064
             slot          dd ?
847
             app_mem       dd ? ;0x10
Line 1065... Line 848...
1065
           endl
848
           endl
1066
 
849
 
1067
           mov [thread_start], ebx
-
 
Line 1068... Line 850...
1068
           mov [thread_stack], ecx
850
           cmp eax,1
-
 
851
           jne .failed                  ;other subfunctions
-
 
852
 
-
 
853
           xor  eax,eax
-
 
854
           mov [app_cmdline], eax
Line 1069... Line -...
1069
           mov [params], 0
-
 
1070
 
-
 
1071
           xor    edx,edx      ; flags=0
855
           mov [app_path], eax
1072
 
856
           mov [app_eip], ebx
1073
           cmp    eax,1
-
 
1074
           jnz    .failed                  ;other subfunctions
857
           mov [app_esp], ecx
1075
           mov    esi,new_process_loading
858
 
1076
           call   sys_msg_board_str
859
           mov    esi,new_process_loading
1077
 
860
           call   sys_msg_board_str
1078
.wait_lock:
861
.wait_lock:
Line 1093... Line 876...
1093
           test eax, eax
876
           test eax, eax
1094
           jz .failed
877
           jz .failed
Line 1095... Line 878...
1095
 
878
 
Line 1096... Line -...
1096
           mov [slot], eax
-
 
1097
 
-
 
1098
           xor    eax,eax
-
 
1099
           mov    [app_i_param],eax
-
 
1100
           mov    [app_i_icon],eax
-
 
1101
 
-
 
1102
           mov ebx, [thread_start]
-
 
1103
           mov ecx, [thread_stack]
-
 
1104
 
-
 
1105
           mov    [app_start],ebx
-
 
1106
           mov    [app_esp],ecx
879
           mov [slot], eax
1107
 
880
 
1108
           mov    esi,[CURRENT_TASK]
881
           mov    esi,[CURRENT_TASK]
1109
           shl    esi,8
882
           shl    esi,8
Line 1110... Line 883...
1110
           add    esi,PROC_BASE
883
           add    esi,PROC_BASE
1111
           mov    ebx,esi               ;ebx=esi - pointer to extended information about current thread
884
           mov    ebx,esi             ;ebx=esi - pointer to extended information about current thread
1112
 
885
 
1113
           mov    edi,[slot]
886
           mov    edi, eax
1114
           shl    edi,8
887
           shl    edi,8
-
 
888
           add    edi,PROC_BASE
-
 
889
           mov    edx,edi             ;edx=edi - pointer to extended infomation about new thread
1115
           add    edi,PROC_BASE
890
           mov    ecx,256/4
-
 
891
           xor eax, eax
1116
           mov    edx,edi               ;edx=edi - pointer to extended infomation about new thread
892
           cld
1117
           mov    ecx,256/4
893
           rep    stosd               ;clean extended information about new thread
1118
           rep    stosd                 ;clean extended information about new thread
894
           mov    esi,ebx
-
 
895
           mov    edi,edx
1119
           mov    edi,edx
896
           mov    ecx,11
1120
           mov    ecx,11
897
           rep    movsb               ;copy process name
-
 
898
 
1121
           rep    movsb                 ;copy process name
899
           mov eax,[ebx+APPDATA.heap_base]
1122
           mov    eax,[ebx+APPDATA.heap_base]
900
           mov [edx+APPDATA.heap_base], eax
-
 
901
 
1123
           mov    [edx+APPDATA.heap_base], eax
902
           mov ecx,[ebx+APPDATA.heap_top]
1124
           mov    ecx,[ebx+APPDATA.heap_top]
-
 
1125
           mov    [edx+APPDATA.heap_top], ecx
903
           mov [edx+APPDATA.heap_top], ecx
1126
           mov    eax,[ebx+APPDATA.mem_size]
-
 
Line -... Line 904...
-
 
904
 
-
 
905
           mov eax,[ebx+APPDATA.mem_size]
-
 
906
           mov [edx+APPDATA.mem_size], eax
-
 
907
 
1127
           mov    [app_mem],eax         ;set memory size
908
           mov ecx,[ebx+APPDATA.dir_table]
1128
           mov    eax,[ebx+0xb8]
909
           mov [edx+APPDATA.dir_table],ecx      ;copy page directory
Line 1129... Line 910...
1129
           mov    [edx+0xb8],eax        ;copy page directory
910
 
1130
 
911
           lea eax, [app_cmdline]
Line 1131... Line 912...
1131
           stdcall add_app_parameters, [slot], new_app_base,\
912
           stdcall set_app_params ,[slot],eax,dword 0,\
Line 1160... Line 941...
1160
           test eax, eax
941
           test eax, eax
1161
           jnz .wait_lock
942
           jnz .wait_lock
1162
           ret
943
           ret
1163
endp
944
endp
Line -... Line 945...
-
 
945
 
-
 
946
align 4
-
 
947
proc set_app_params stdcall,slot:dword, params:dword,\
-
 
948
                        cmd_line:dword, app_path:dword, flags:dword
-
 
949
 
-
 
950
           mov edi, [slot]
-
 
951
           mov esi, [fpu_data]
-
 
952
           bt [cpu_caps], CAPS_SSE
-
 
953
           jnc .no_SSE
-
 
954
 
-
 
955
           shl edi, 8
-
 
956
           mov eax, edi
-
 
957
           lea edi, [esi+edi*2]
-
 
958
           mov [eax+PROC_BASE+APPDATA.fpu_state], edi
-
 
959
           mov [eax+PROC_BASE+APPDATA.fpu_handler], 0
-
 
960
           mov [eax+PROC_BASE+APPDATA.sse_handler], 0
-
 
961
           mov ecx, 512/4
-
 
962
           jmp @F
-
 
963
.no_SSE:
-
 
964
           mov eax, edi
-
 
965
           shl eax, 8
-
 
966
           mov ebx, edi
-
 
967
           shl edi, 7
-
 
968
           shl ebx, 4
-
 
969
           sub edi, ebx       ;edi*=112
-
 
970
           add edi, esi
-
 
971
           mov [eax+PROC_BASE+APPDATA.fpu_state], edi
-
 
972
           mov [eax+PROC_BASE+APPDATA.fpu_handler], 0
-
 
973
           mov [eax+PROC_BASE+APPDATA.sse_handler], 0
-
 
974
           mov ecx, 112/4
-
 
975
@@:
-
 
976
           rep movsd
-
 
977
 
-
 
978
           mov    ebx,[slot]
-
 
979
           cmp    ebx,[TASK_COUNT]
-
 
980
           jle    .noinc
-
 
981
           inc    dword [TASK_COUNT]       ;update number of processes
-
 
982
.noinc:
-
 
983
           shl    ebx,8
-
 
984
           mov    ecx, [def_cursor]
-
 
985
           mov    [PROC_BASE+APPDATA.cursor+ebx],ecx
-
 
986
 
-
 
987
           shr    ebx,3
-
 
988
           mov eax, new_app_base
-
 
989
           mov dword [CURRENT_TASK+ebx+0x10],eax
-
 
990
 
-
 
991
.add_command_line:
-
 
992
           mov edx,[params]
-
 
993
           mov edx,[edx]           ;app_cmdline
-
 
994
           test edx,edx
-
 
995
           jz @F                   ;application don't need parameters
-
 
996
           add edx, new_app_base
-
 
997
           stdcall k_strncpy, edx, [cmd_line], 255
-
 
998
@@:
-
 
999
           mov edx,[params]
-
 
1000
           mov edx, [edx+4]        ;app_path
-
 
1001
           test edx,edx
-
 
1002
           jz @F                   ;application don't need path of file
-
 
1003
           add edx, new_app_base
-
 
1004
           stdcall k_strncpy, edx, [app_path], 64
-
 
1005
@@:
-
 
1006
           mov    ebx,[slot]
-
 
1007
           mov    eax,ebx
-
 
1008
           shl    ebx,5
-
 
1009
; set window state to 'normal' (non-minimized/maximized/rolled-up) state
-
 
1010
           mov     [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL
-
 
1011
           mov     [ebx+window_data+WDATA.fl_redraw], 1
-
 
1012
           add    ebx,CURRENT_TASK            ;ebx - pointer to information about process
-
 
1013
           mov    [ebx+TASKDATA.wnd_number],al;set window number on screen = process slot
-
 
1014
 
-
 
1015
           mov    [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function)
-
 
1016
 
-
 
1017
           inc    dword [process_number]
-
 
1018
           mov    eax,[process_number]
-
 
1019
           mov    [ebx+4],eax           ;set PID
-
 
1020
 
-
 
1021
           mov    ecx,ebx
-
 
1022
           add    ecx,(draw_data-CURRENT_TASK)  ;ecx - pointer to draw data
-
 
1023
;set draw data to full screen
-
 
1024
 
-
 
1025
           mov    [ecx+0],dword 0
-
 
1026
           mov    [ecx+4],dword 0
-
 
1027
           mov    eax,[SCR_X_SIZE]
-
 
1028
           mov    [ecx+8],eax
-
 
1029
           mov    eax,[SCR_Y_SIZE]
-
 
1030
           mov    [ecx+12],eax
-
 
1031
 
-
 
1032
           mov edi,[slot]
-
 
1033
           imul edi,tss_step
-
 
1034
           add edi,tss_data
-
 
1035
           mov ecx,128/4
-
 
1036
           xor eax, eax
-
 
1037
           cld
-
 
1038
           rep stosd
-
 
1039
;Add IO access table - bit array of permitted ports
-
 
1040
           not eax
-
 
1041
           mov ecx,2048
-
 
1042
           rep stosd                 ; access to 4096*8=65536 ports
-
 
1043
           sub edi, tss_step
-
 
1044
 
-
 
1045
;set cr3 register in TSS of application
-
 
1046
           mov ecx, [slot]
-
 
1047
           shl ecx, 8
-
 
1048
           mov eax,[PROC_BASE+ecx+APPDATA.dir_table]
-
 
1049
           mov [edi+TSS._cr3],eax
-
 
1050
 
-
 
1051
           mov esi,[params]
-
 
1052
           mov eax, [esi+0x08]       ;app_eip
-
 
1053
           mov [edi+TSS._eip],eax    ;set eip in TSS
-
 
1054
           mov eax, [esi+0x0C]       ;app_esp
-
 
1055
           mov [edi+TSS._esp],eax    ;set stack in TSS
-
 
1056
           mov [edi+TSS._eflags],dword 0x1202
-
 
1057
 
-
 
1058
           mov [edi+TSS._cs],app_code  ;selector of code segment
-
 
1059
           mov [edi+TSS._ss],app_data
-
 
1060
           mov [edi+TSS._ds],app_data
-
 
1061
           mov [edi+TSS._es],app_data
-
 
1062
           mov [edi+TSS._fs],app_data
-
 
1063
           mov [edi+TSS._gs],graph_data ;selector of graphic segment
-
 
1064
           mov [edi+TSS._io],word 128
-
 
1065
           mov [edi+TSS._ss0], os_data
-
 
1066
           mov ebx,[slot]
-
 
1067
           shl ebx,12
-
 
1068
           add ebx,sysint_stack_data+4096
-
 
1069
           mov [edi+TSS._esp0],ebx
-
 
1070
 
-
 
1071
           mov ecx, edi    ;ecx - address of application TSS
-
 
1072
           mov ebx,[slot]
-
 
1073
           shl ebx,3
-
 
1074
;set TSS descriptor
-
 
1075
           mov [ebx+gdts+tss0+0],word tss_step ;limit (size)
-
 
1076
           mov [ebx+gdts+tss0+2],cx  ;part of offset
-
 
1077
           shr ecx,16
-
 
1078
           mov [ebx+gdts+tss0+4],cl  ;part of offset
-
 
1079
           mov [ebx+gdts+tss0+7],ch  ;part of offset
-
 
1080
           mov [ebx+gdts+tss0+5],word 01010000b*256+11101001b ;system flags
-
 
1081
 
-
 
1082
;flush keyboard and buttons queue
-
 
1083
           mov    [KEY_COUNT],byte 0
-
 
1084
           mov    [BTN_COUNT],byte 0
-
 
1085
 
-
 
1086
           mov    edi,[slot]
-
 
1087
           shl    edi,5
-
 
1088
           add    edi,window_data
-
 
1089
           mov    ebx,[slot]
-
 
1090
           movzx  esi,word [WIN_STACK+ebx*2]
-
 
1091
           lea    esi,[WIN_POS+esi*2]
-
 
1092
           call   windowactivate        ;gui initialization
-
 
1093
 
-
 
1094
           mov    ebx,[slot]
-
 
1095
           shl    ebx,5
-
 
1096
           mov    [CURRENT_TASK+ebx+0xa],byte 0 ;set process state - running
-
 
1097
; set if debuggee
-
 
1098
           mov eax, [flags]
-
 
1099
           test byte [flags], 1
-
 
1100
           jz   .no_debug
-
 
1101
           mov  [CURRENT_TASK+ebx+0xa],byte 1 ;set process state - suspended
-
 
1102
           mov  eax,[CURRENT_TASK]
-
 
1103
           mov  [PROC_BASE+ebx*8+0xac],eax ;set debugger PID - current
-
 
1104
.no_debug:
-
 
1105
           mov    esi,new_process_running
-
 
1106
           call   sys_msg_board_str     ;output information about succefull startup
-
 
1107
           ret
-
 
1108
endp
-
 
1109
 
Line 1164... Line 1110...
1164
 
1110
 
Line 1165... Line 1111...
1165
 
1111
 
1166
include "debug.inc"
1112
include "debug.inc"