Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
593 mikedld 8
$Revision: 848 $
9
 
10
 
357 serge 11
GREEDY_KERNEL  equ 0
164 serge 12
 
13
struc APP_HEADER_00
14
{ .banner      dq ?
15
  .version     dd ?    ;+8
16
  .start       dd ?    ;+12
17
  .i_end       dd ?    ;+16
18
  .mem_size    dd ?    ;+20
19
  .i_param     dd ?    ;+24
20
}
21
 
22
struc APP_HEADER_01
23
{ .banner      dq ?
24
  .version     dd ?    ;+8
25
  .start       dd ?    ;+12
26
  .i_end       dd ?    ;+16
27
  .mem_size    dd ?    ;+20
28
  .stack_top   dd ?    ;+24
29
  .i_param     dd ?    ;+28
30
  .i_icon      dd ?    ;+32
31
}
32
 
237 serge 33
 
34
struc APP_PARAMS
774 Rus 35
{ .app_cmdline	 ;0x00
36
  .app_path	 ;0x04
37
  .app_eip	 ;0x08
38
  .app_esp	 ;0x0C
39
  .app_mem	 ;0x10
237 serge 40
}
41
 
42
macro _clear_ op
43
{  mov ecx, op/4
44
   xor eax, eax
45
   cld
46
   rep stosd
47
}
48
 
521 diamond 49
fs_execute_from_sysdir:
774 Rus 50
	xor	ebx, ebx
51
	xor	edx, edx
52
	mov	esi, sysdir_path
363 serge 53
 
164 serge 54
align 4
363 serge 55
proc fs_execute
56
 
57
;fn_read:dword, file_size:dword, cluster:dword
58
 
59
; ebx - cmdline
60
; edx - flags
61
; ebp - full filename
62
; [esp+4] = procedure DoRead, [esp+8] = filesize & [esp+12]... - arguments for it
63
 
774 Rus 64
	   locals
65
	     cmdline	   rd 64	;256/4
66
	     filename	   rd 256	;1024/4
67
	     flags	   dd ?
363 serge 68
 
774 Rus 69
	     save_cr3	   dd ?
70
	     slot	   dd ?
71
	     slot_base	   dd ?
72
	     file_base	   dd ?
73
	     file_size	   dd ?
74
					  ;app header data
75
	     hdr_cmdline   dd ? ;0x00
76
	     hdr_path	   dd ? ;0x04
77
	     hdr_eip	   dd ? ;0x08
78
	     hdr_esp	   dd ? ;0x0C
79
	     hdr_mem	   dd ? ;0x10
80
	     hdr_i_end	   dd ? ;0x14
81
	   endl
164 serge 82
 
774 Rus 83
	   pushad
363 serge 84
 
774 Rus 85
	   mov [flags], edx
363 serge 86
 
87
; [ebp]  pointer to filename
88
 
774 Rus 89
	   lea edi, [filename]
90
	   lea ecx, [edi+1024]
91
	   mov al, '/'
92
	   stosb
521 diamond 93
@@:
774 Rus 94
	   cmp edi, ecx
95
	   jae .bigfilename
96
	   lodsb
97
	   stosb
98
	   test al, al
99
	   jnz @b
100
	   mov esi, [ebp]
101
	   test esi, esi
102
	   jz .namecopied
103
	   mov byte [edi-1], '/'
521 diamond 104
@@:
774 Rus 105
	   cmp edi, ecx
106
	   jae .bigfilename
107
	   lodsb
108
	   stosb
109
	   test al, al
110
	   jnz @b
111
	   jmp .namecopied
521 diamond 112
.bigfilename:
774 Rus 113
	   popad
114
	   mov eax, -ERROR_FILE_NOT_FOUND
115
	   ret
521 diamond 116
.namecopied:
363 serge 117
 
774 Rus 118
	   mov [cmdline], ebx
119
	   test ebx, ebx
120
	   jz @F
519 serge 121
 
774 Rus 122
	   lea eax, [cmdline]
123
	   mov dword [eax+252], 0
124
	   stdcall strncpy, eax, ebx, 255
519 serge 125
@@:
774 Rus 126
	   lea eax, [filename]
127
	   stdcall load_file, eax
128
	   mov	ecx, -ERROR_FILE_NOT_FOUND
129
	   test eax, eax
130
	   jz .err_file
237 serge 131
 
774 Rus 132
	   mov [file_base], eax
133
	   mov [file_size], ebx
237 serge 134
 
774 Rus 135
	   lea ebx, [hdr_cmdline]
136
	   call test_app_header
137
	   mov ecx, -0x1F
138
	   test eax, eax
139
	   jz .err_hdr
237 serge 140
 
774 Rus 141
	   DEBUGF 1,"%s",new_process_loading
237 serge 142
 
143
.wait_lock:
774 Rus 144
	   cmp [application_table_status],0
145
	   je .get_lock
146
	   call   change_task
147
	   jmp .wait_lock
237 serge 148
 
149
.get_lock:
774 Rus 150
	   mov eax, 1
151
	   xchg eax, [application_table_status]
152
	   cmp eax, 0
153
	   jne .wait_lock
237 serge 154
 
774 Rus 155
	   call set_application_table_status
237 serge 156
 
774 Rus 157
	   call get_new_process_place
158
	   test eax, eax
159
	   mov ecx, -0x20      ; too many processes
160
	   jz .err
237 serge 161
 
774 Rus 162
	   mov [slot], eax
163
	   shl eax, 8
164
	   add eax, SLOT_BASE
165
	   mov [slot_base], eax
166
	   mov edi, eax
167
	   _clear_ 256	   ;clean extended information about process
237 serge 168
 
169
; write application name
774 Rus 170
	   lea eax, [filename]
171
	   stdcall strrchr,  eax, '/'  ; now eax points to name without path
237 serge 172
 
774 Rus 173
	   lea esi, [eax+1]
174
	   test eax, eax
175
	   jnz @F
176
	   lea esi, [filename]
237 serge 177
@@:
774 Rus 178
	   mov ecx, 8  ; 8 chars for name
179
	   mov edi, [slot_base]
237 serge 180
.copy_process_name_loop:
774 Rus 181
	   lodsb
182
	   cmp al, '.'
183
	   jz .copy_process_name_done
184
	   test al, al
185
	   jz .copy_process_name_done
186
	   stosb
187
	   loop .copy_process_name_loop
237 serge 188
.copy_process_name_done:
189
 
839 serge 190
 
774 Rus 191
	   mov ebx, cr3
192
	   mov [save_cr3], ebx
269 serge 193
 
843 serge 194
           stdcall create_app_space,[hdr_mem],[file_base],[file_size]
195
           mov ecx, -30  ; no memory
774 Rus 196
	   test eax, eax
197
	   jz .failed
237 serge 198
 
774 Rus 199
	   mov	 ebx,[slot_base]
200
	   mov	 [ebx+APPDATA.dir_table],eax
201
	   mov	 eax,[hdr_mem]
202
	   mov	 [ebx+APPDATA.mem_size],eax
237 serge 203
 
357 serge 204
if GREEDY_KERNEL
205
else
774 Rus 206
	   mov ecx, [hdr_mem]
207
	   mov edi, [file_size]
208
	   add edi, 4095
209
	   and edi, not 4095
210
	   sub ecx, edi
211
	   jna @F
269 serge 212
 
774 Rus 213
	   xor eax, eax
819 serge 214
           cld
774 Rus 215
	   rep stosb
247 serge 216
@@:
269 serge 217
end if
218
 
219
; release only virtual space, not phisical memory
220
 
774 Rus 221
	   stdcall free_kernel_space, [file_base]
222
	   lea eax, [hdr_cmdline]
223
	   lea ebx, [cmdline]
224
	   lea ecx, [filename]
225
	   stdcall set_app_params ,[slot],eax,ebx,ecx,[flags]
237 serge 226
 
774 Rus 227
	   mov eax, [save_cr3]
228
	   call set_cr3
237 serge 229
 
774 Rus 230
	   xor ebx, ebx
231
	   mov [application_table_status],ebx ;unlock application_table_status mutex
232
	   mov eax,[process_number]  ;set result
233
	   ret
237 serge 234
.failed:
774 Rus 235
	   mov eax, [save_cr3]
236
	   call set_cr3
269 serge 237
.err:
247 serge 238
.err_hdr:
774 Rus 239
	   stdcall kernel_free,[file_base]
247 serge 240
.err_file:
774 Rus 241
	   xor eax, eax
242
	   mov [application_table_status],eax
243
	   mov eax, ecx
244
	   ret
237 serge 245
endp
164 serge 246
 
237 serge 247
align 4
248
test_app_header:
774 Rus 249
	   virtual at eax
250
	     APP_HEADER_00 APP_HEADER_00
251
	   end virtual
252
	   virtual at eax
253
	     APP_HEADER_01 APP_HEADER_01
254
	   end virtual
164 serge 255
 
774 Rus 256
	   cmp dword [eax], 'MENU'
257
	   jne .fail
258
	   cmp word [eax+4],'ET'
259
	   jne .fail
164 serge 260
 
774 Rus 261
	   cmp [eax+6], word '00'
262
	   jne	.check_01_header
164 serge 263
 
774 Rus 264
	   mov	ecx,[APP_HEADER_00.start]
265
	   mov	[ebx+0x08], ecx 	       ;app_eip
266
	   mov	edx,[APP_HEADER_00.mem_size]
267
	   mov	[ebx+0x10], edx 	       ;app_mem
268
	   shr	edx,1
269
	   sub	edx,0x10
270
	   mov	[ebx+0x0C], edx 	       ;app_esp
271
	   mov	ecx,[APP_HEADER_00.i_param]
272
	   mov	[ebx], ecx		       ;app_cmdline
273
	   mov	[ebx+4], dword 0	       ;app_path
274
	   mov	edx, [APP_HEADER_00.i_end]
275
	   mov	[ebx+0x14], edx
276
	   ret
164 serge 277
 
237 serge 278
 .check_01_header:
164 serge 279
 
774 Rus 280
	   cmp	[eax+6],word '01'
281
	   jne	.fail
237 serge 282
 
774 Rus 283
	   mov	ecx,[APP_HEADER_01.start]
284
	   mov	[ebx+0x08], ecx 	       ;app_eip
285
	   mov	edx,[APP_HEADER_01.mem_size]
381 serge 286
 
287
; \begin{diamond}[20.08.2006]
288
; sanity check (functions 19,58 load app_i_end bytes and that must
289
; fit in allocated memory to prevent kernel faults)
774 Rus 290
	   cmp	edx,[APP_HEADER_01.i_end]
291
	   jb	.fail
381 serge 292
; \end{diamond}[20.08.2006]
293
 
774 Rus 294
	   mov	[ebx+0x10], edx 	       ;app_mem
295
	   mov	ecx,[APP_HEADER_01.stack_top]
296
	   mov	[ebx+0x0C], ecx 	       ;app_esp
297
	   mov	edx,[APP_HEADER_01.i_param]
298
	   mov	[ebx], edx		       ;app_cmdline
299
	   mov	ecx,[APP_HEADER_01.i_icon]
300
	   mov	[ebx+4], ecx		       ;app_path
301
	   mov	edx, [APP_HEADER_01.i_end]
302
	   mov	[ebx+0x14], edx
303
	   ret
237 serge 304
.fail:
774 Rus 305
	   xor eax, eax
306
	   ret
164 serge 307
 
308
align 4
309
proc get_new_process_place
310
;input:
311
;  none
312
;result:
313
;  eax=[new_process_place]<>0 - ok
314
;      0 - failed.
315
;This function find least empty slot.
316
;It doesn't increase [TASK_COUNT]!
774 Rus 317
	   mov	  eax,CURRENT_TASK
318
	   mov	  ebx,[TASK_COUNT]
319
	   inc	  ebx
320
	   shl	  ebx,5
321
	   add	  ebx,eax		;ebx - address of process information for (last+1) slot
164 serge 322
.newprocessplace:
323
;eax = address of process information for current slot
774 Rus 324
	   cmp	  eax,ebx
325
	   jz	  .endnewprocessplace	;empty slot after high boundary
326
	   add	  eax,0x20
327
	   cmp	  word [eax+0xa],9	;check process state, 9 means that process slot is empty
328
	   jnz	  .newprocessplace
164 serge 329
.endnewprocessplace:
774 Rus 330
	   mov	  ebx,eax
331
	   sub	  eax,CURRENT_TASK
332
	   shr	  eax,5 		;calculate slot index
333
	   cmp	  eax,256
334
	   jge	  .failed		;it should be <256
335
	   mov	  word [ebx+0xa],9	;set process state to 9 (for slot after hight boundary)
336
	   ret
164 serge 337
.failed:
774 Rus 338
	   xor	  eax,eax
339
	   ret
164 serge 340
endp
341
 
342
align 4
269 serge 343
proc create_app_space stdcall, app_size:dword,img_base:dword,img_size:dword
774 Rus 344
	   locals
345
	     app_pages	 dd ?
346
	     img_pages	 dd ?
347
	     dir_addr	 dd ?
348
	     app_tabs	 dd ?
349
	   endl
164 serge 350
 
774 Rus 351
	   mov ebx, pg_data.pg_mutex
352
	   call wait_mutex   ;ebx
164 serge 353
 
774 Rus 354
	   xor eax, eax
355
	   mov [dir_addr], eax
164 serge 356
 
774 Rus 357
	   mov eax, [app_size]
358
	   add eax, 4095
359
	   and eax, NOT(4095)
360
	   mov [app_size], eax
361
	   mov ebx, eax
362
	   shr eax, 12
363
	   mov [app_pages], eax
170 serge 364
 
774 Rus 365
	   add ebx, 0x3FFFFF
366
	   and ebx, NOT(0x3FFFFF)
367
	   shr ebx, 22
368
	   mov [app_tabs], ebx
164 serge 369
 
774 Rus 370
	   mov ecx, [img_size]
371
	   add ecx, 4095
372
	   and ecx, NOT(4095)
164 serge 373
 
774 Rus 374
	   mov [img_size], ecx
375
	   shr ecx, 12
376
	   mov [img_pages], ecx
164 serge 377
 
170 serge 378
     if GREEDY_KERNEL
774 Rus 379
	   lea eax, [ecx+ebx+2]    ;only image size
170 serge 380
     else
774 Rus 381
	   lea eax, [eax+ebx+2]    ;all requested memory
170 serge 382
     end if
843 serge 383
      ;     cmp eax, [pg_data.pages_free]
384
      ;     ja .fail
170 serge 385
 
774 Rus 386
	   call alloc_page
387
	   test eax, eax
388
	   jz .fail
389
	   mov [dir_addr], eax
164 serge 390
 
839 serge 391
           lea edi, [eax + OS_BASE]
392
           mov ecx, (OS_BASE shr 20)/4
774 Rus 393
	   xor eax, eax
394
	   cld
395
	   rep stosd
465 serge 396
 
837 serge 397
           mov ecx, 1024-(OS_BASE shr 20)/4
848 serge 398
           mov esi, _sys_pdbr+(OS_BASE shr 20)
774 Rus 399
	   rep movsd
164 serge 400
 
839 serge 401
           mov edi, [dir_addr]
402
           lea eax, [edi+PG_SW]
403
           mov [edi+OS_BASE+(page_tabs shr 20)], eax
378 serge 404
 
839 serge 405
           and eax, -4096
774 Rus 406
	   call set_cr3
164 serge 407
 
774 Rus 408
	   mov edx, [app_tabs]
839 serge 409
           xor edi, edi
164 serge 410
@@:
774 Rus 411
	   call alloc_page
412
	   test eax, eax
413
	   jz .fail
164 serge 414
 
774 Rus 415
	   stdcall map_page_table, edi, eax
416
	   add edi, 0x00400000
417
	   dec edx
418
	   jnz @B
164 serge 419
 
839 serge 420
           mov edi, page_tabs
269 serge 421
 
774 Rus 422
	   mov ecx, [app_tabs]
423
	   shl ecx, 10
424
	   xor eax, eax
425
	   rep stosd
164 serge 426
 
774 Rus 427
	   mov ecx, [img_pages]
428
	   mov ebx, PG_UW
839 serge 429
           mov esi, [img_base]
774 Rus 430
	   shr esi, 10
431
	   add esi, page_tabs
839 serge 432
           xor edx, edx
433
           mov edi, page_tabs
269 serge 434
.remap:
774 Rus 435
	   lodsd
436
	   or eax, ebx	    ; force user level r/w access
437
	   stosd
438
	   add edx, 0x1000
439
	   dec [app_pages]
440
	   dec ecx
441
	   jnz .remap
269 serge 442
 
774 Rus 443
	   mov ecx, [app_pages]
444
	   test ecx, ecx
445
	   jz .done
269 serge 446
 
447
if GREEDY_KERNEL
774 Rus 448
	   mov eax, 0x02
819 serge 449
           rep stosd
269 serge 450
else
451
 
164 serge 452
.alloc:
774 Rus 453
	   call alloc_page
454
	   test eax, eax
455
	   jz .fail
164 serge 456
 
774 Rus 457
	   stdcall map_page,edx,eax,dword PG_UW
458
	   add edx, 0x1000
459
	   dec [app_pages]
460
	   jnz .alloc
269 serge 461
end if
164 serge 462
 
269 serge 463
.done:
839 serge 464
           dec [pg_data.pg_mutex]
774 Rus 465
	   mov eax, [dir_addr]
466
	   ret
164 serge 467
.fail:
774 Rus 468
	   dec [pg_data.pg_mutex]
469
	   cmp [dir_addr], 0
470
	   je @f
471
	   stdcall destroy_app_space, [dir_addr]
164 serge 472
@@:
774 Rus 473
	   xor eax, eax
474
	   ret
164 serge 475
endp
476
 
477
align 4
478
set_cr3:
465 serge 479
 
774 Rus 480
	   mov ebx, [current_slot]
481
	   mov [ebx+APPDATA.dir_table], eax
482
	   mov cr3, eax
483
	   ret
164 serge 484
 
485
align 4
486
proc destroy_page_table stdcall, pg_tab:dword
487
 
774 Rus 488
	   push esi
164 serge 489
 
774 Rus 490
	   mov esi, [pg_tab]
491
	   mov ecx, 1024
164 serge 492
.free:
774 Rus 493
	   mov eax, [esi]
494
	   test eax, 1
495
	   jz .next
819 serge 496
           test eax, 1 shl 9
497
           jnz .next                      ;skip shared pages
774 Rus 498
	   call free_page
164 serge 499
.next:
774 Rus 500
	   add esi, 4
501
	   dec ecx
502
	   jnz .free
503
	   pop esi
504
	   ret
164 serge 505
endp
506
 
507
align 4
508
proc destroy_app_space stdcall, pg_dir:dword
509
 
774 Rus 510
	   mov ebx, pg_data.pg_mutex
511
	   call wait_mutex   ;ebx
164 serge 512
 
774 Rus 513
	   xor	 edx,edx
514
	   mov	 eax,0x2
515
	   mov ebx, [pg_dir]
164 serge 516
.loop:
517
;eax = current slot of process
774 Rus 518
	   mov	 ecx,eax
519
	   shl	 ecx,5
520
	   cmp	 byte [CURRENT_TASK+ecx+0xa],9	;if process running?
521
	   jz	 @f				 ;skip empty slots
522
	   shl	 ecx,3
523
	   cmp	 [SLOT_BASE+ecx+0xB8],ebx	;compare page directory addresses
524
	   jnz	 @f
525
	   inc	 edx				;thread found
164 serge 526
@@:
774 Rus 527
	   inc	 eax
528
	   cmp	 eax,[TASK_COUNT]		;exit loop if we look through all processes
529
	   jle	 .loop
164 serge 530
 
531
;edx = number of threads
532
;our process is zombi so it isn't counted
774 Rus 533
	   cmp	 edx,1
534
	   jg	 .exit
164 serge 535
;if there isn't threads then clear memory.
536
 
774 Rus 537
	   mov eax, [pg_dir]
839 serge 538
           and eax, -4096
539
           add eax, OS_BASE
540
           mov [tmp_task_pdir], eax
541
           mov esi, eax
542
           mov edi, (HEAP_BASE shr 20)/4
164 serge 543
.destroy:
774 Rus 544
	   mov eax, [esi]
545
	   test eax, 1
546
	   jz .next
547
	   and eax, not 0xFFF
839 serge 548
           add eax, OS_BASE
549
 
550
           stdcall destroy_page_table, eax
551
 
552
           mov eax, [esi]
774 Rus 553
	   call free_page
164 serge 554
.next:
774 Rus 555
	   add esi, 4
556
	   dec edi
557
	   jnz .destroy
164 serge 558
 
774 Rus 559
	   mov eax, [pg_dir]
560
	   call free_page
164 serge 561
.exit:
774 Rus 562
	   dec [pg_data.pg_mutex]
563
	   ret
164 serge 564
endp
565
 
520 serge 566
align 4
567
get_pid:
774 Rus 568
	   mov eax, [TASK_BASE]
819 serge 569
           mov eax, [eax+TASKDATA.pid]
774 Rus 570
	   ret
520 serge 571
 
164 serge 572
pid_to_slot:
573
;Input:
574
;  eax - pid of process
575
;Output:
576
;  eax - slot of process or 0 if process don't exists
577
;Search process by PID.
578
    push   ebx
579
    push   ecx
580
    mov    ebx,[TASK_COUNT]
581
    shl    ebx,5
582
    mov    ecx,2*32
583
 
584
.loop:
585
;ecx=offset of current process info entry
586
;ebx=maximum permitted offset
587
    cmp    byte [CURRENT_TASK+ecx+0xa],9
774 Rus 588
    jz	   .endloop		 ;skip empty slots
164 serge 589
    cmp    [CURRENT_TASK+ecx+0x4],eax ;check PID
774 Rus 590
    jz	   .pid_found
164 serge 591
.endloop:
592
    add    ecx,32
593
    cmp    ecx,ebx
594
    jle    .loop
595
 
596
    pop    ecx
597
    pop    ebx
598
    xor    eax,eax
599
    ret
600
 
601
.pid_found:
602
    shr    ecx,5
774 Rus 603
    mov    eax,ecx		 ;convert offset to index of slot
164 serge 604
    pop    ecx
605
    pop    ebx
606
    ret
607
 
608
check_region:
609
;input:
610
;  ebx - start of buffer
611
;  ecx - size of buffer
612
;result:
613
;  eax = 1 region lays in app memory
614
;  eax = 0 region don't lays in app memory
615
     mov  eax,[CURRENT_TASK]
616
     jmp  check_process_region
617
;-----------------------------------------------------------------------------
618
check_process_region:
619
;input:
620
;  eax - slot
621
;  ebx - start of buffer
622
;  ecx - size of buffer
623
;result:
624
;  eax = 1 region lays in app memory
625
;  eax = 0 region don't lays in app memory
626
 
627
     test ecx,ecx
628
     jle  .ok
629
     shl  eax,5
630
     cmp  word [CURRENT_TASK+eax+0xa],0
631
     jnz  .failed
632
     shl  eax,3
380 serge 633
     mov  eax,[SLOT_BASE+eax+0xb8]
164 serge 634
     test eax,eax
635
     jz   .failed
636
 
637
     mov  eax,1
638
     ret
639
 
640
 
641
;    call MEM_Get_Linear_Address
642
;    push ebx
643
;    push ecx
644
;    push edx
645
;    mov  edx,ebx
646
;    and  edx,not (4096-1)
647
;    sub  ebx,edx
648
;    add  ecx,ebx
649
;    mov  ebx,edx
650
;    add  ecx,(4096-1)
651
;    and  ecx,not (4096-1)
652
;.loop:
653
;;eax - linear address of page directory
654
;;ebx - current page
655
;;ecx - current size
656
;    mov  edx,ebx
657
;    shr  edx,22
658
;    mov  edx,[eax+4*edx]
659
;    and  edx,not (4096-1)
660
;    test edx,edx
661
;    jz   .failed1
662
;    push eax
663
;    mov  eax,edx
664
;    call MEM_Get_Linear_Address
665
;    mov  edx,ebx
666
;    shr  edx,12
667
;    and  edx,(1024-1)
668
;    mov  eax,[eax+4*edx]
669
;    and  eax,not (4096-1)
670
;    test eax,eax
671
;    pop  eax
672
;    jz   .failed1
673
;    add  ebx,4096
674
;    sub  ecx,4096
675
;    jg   .loop
676
;    pop  edx
677
;    pop  ecx
678
;    pop  ebx
679
.ok:
680
    mov  eax,1
681
    ret
682
;
683
;.failed1:
684
;    pop  edx
685
;    pop  ecx
686
;    pop  ebx
687
.failed:
688
    xor  eax,eax
689
    ret
690
 
691
align 4
692
proc read_process_memory
693
;Input:
694
;  eax - process slot
695
;  ebx - buffer address
696
;  ecx - buffer size
697
;  edx - start address in other process
698
;Output:
699
;  eax - number of bytes read.
774 Rus 700
	   locals
701
	     slot	dd ?
702
	     buff	dd ?
703
	     r_count	dd ?
704
	     offset	dd ?
705
	     tmp_r_cnt	dd ?
706
	   endl
164 serge 707
 
774 Rus 708
	   mov [slot], eax
709
	   mov [buff], ebx
710
	   and [r_count], 0
711
	   mov [tmp_r_cnt], ecx
712
	   mov [offset], edx
164 serge 713
 
774 Rus 714
	   pushad
164 serge 715
.read_mem:
774 Rus 716
	   mov edx, [offset]
717
	   mov ebx, [tmp_r_cnt]
164 serge 718
 
774 Rus 719
	   mov ecx, 0x400000
720
	   and edx, 0x3FFFFF
721
	   sub ecx, edx
722
	   cmp ecx, ebx
723
	   jbe @f
724
	   mov ecx, ebx
164 serge 725
@@:
774 Rus 726
	   cmp ecx, 0x8000
727
	   jna @F
728
	   mov ecx, 0x8000
164 serge 729
@@:
774 Rus 730
	   mov eax, [slot]
731
	   shl	eax,8
732
	   mov ebx, [offset]
465 serge 733
     ;      add ebx, new_app_base
774 Rus 734
	   push ecx
735
	   stdcall map_memEx, [proc_mem_map],\
736
			      [SLOT_BASE+eax+0xB8],\
737
			      ebx, ecx
738
	   pop ecx
164 serge 739
 
774 Rus 740
	   mov esi, [offset]
741
	   and esi, 0xfff
742
	   add esi, [proc_mem_map]
743
	   mov edi, [buff]
744
	   mov edx, ecx
745
	   rep movsb
746
	   add [r_count], edx
164 serge 747
 
774 Rus 748
	   add [offset], edx
749
	   sub [tmp_r_cnt], edx
750
	   jnz .read_mem
164 serge 751
 
774 Rus 752
	   popad
753
	   mov eax, [r_count]
754
	   ret
164 serge 755
endp
756
 
757
align 4
758
proc write_process_memory
759
;Input:
760
;  eax - process slot
761
;  ebx - buffer address
762
;  ecx - buffer size
763
;  edx - start address in other process
764
;Output:
765
;  eax - number of bytes written
766
 
774 Rus 767
	   locals
768
	     slot	dd ?
769
	     buff	dd ?
770
	     w_count	dd ?
771
	     offset	dd ?
772
	     tmp_w_cnt	dd ?
773
	   endl
164 serge 774
 
774 Rus 775
	   mov [slot], eax
776
	   mov [buff], ebx
777
	   and [w_count], 0
778
	   mov [tmp_w_cnt], ecx
779
	   mov [offset], edx
164 serge 780
 
774 Rus 781
	   pushad
164 serge 782
.read_mem:
774 Rus 783
	   mov edx, [offset]
784
	   mov ebx, [tmp_w_cnt]
164 serge 785
 
774 Rus 786
	   mov ecx, 0x400000
787
	   and edx, 0x3FFFFF
788
	   sub ecx, edx
789
	   cmp ecx, ebx
790
	   jbe @f
791
	   mov ecx, ebx
164 serge 792
@@:
774 Rus 793
	   cmp ecx, 0x8000
794
	   jna @F
795
	   mov ecx, 0x8000
164 serge 796
@@:
774 Rus 797
	   mov eax, [slot]
798
	   shl	eax,8
799
	   mov ebx, [offset]
465 serge 800
      ;     add ebx, new_app_base
774 Rus 801
	   push ecx
802
	   stdcall map_memEx, [proc_mem_map],\
803
			      [SLOT_BASE+eax+0xB8],\
804
			      ebx, ecx
805
	   pop ecx
164 serge 806
 
774 Rus 807
	   mov edi, [offset]
808
	   and edi, 0xfff
809
	   add edi, [proc_mem_map]
810
	   mov esi, [buff]
811
	   mov edx, ecx
812
	   rep movsb
164 serge 813
 
774 Rus 814
	   add [w_count], edx
815
	   add [offset], edx
816
	   sub [tmp_w_cnt], edx
817
	   jnz .read_mem
164 serge 818
 
774 Rus 819
	   popad
820
	   mov eax, [w_count]
821
	   ret
164 serge 822
endp
823
 
824
align 4
825
proc new_sys_threads
774 Rus 826
	   locals
827
	     slot	   dd ?
828
	     app_cmdline   dd ? ;0x00
829
	     app_path	   dd ? ;0x04
830
	     app_eip	   dd ? ;0x08
831
	     app_esp	   dd ? ;0x0C
832
	     app_mem	   dd ? ;0x10
833
	   endl
164 serge 834
 
774 Rus 835
	   cmp eax,1
836
	   jne .failed			;other subfunctions
164 serge 837
 
774 Rus 838
	   xor	eax,eax
839
	   mov [app_cmdline], eax
840
	   mov [app_path], eax
841
	   mov [app_eip], ebx
842
	   mov [app_esp], ecx
164 serge 843
 
774 Rus 844
	   ;mov    esi,new_process_loading
845
	   ;call   sys_msg_board_str
846
	   DEBUGF 1,"%s",new_process_loading
164 serge 847
.wait_lock:
774 Rus 848
	   cmp [application_table_status],0
849
	   je .get_lock
850
	   call   change_task
851
	   jmp .wait_lock
164 serge 852
 
853
.get_lock:
774 Rus 854
	   mov eax, 1
855
	   xchg eax, [application_table_status]
856
	   cmp eax, 0
857
	   jne .wait_lock
164 serge 858
 
774 Rus 859
	   call   set_application_table_status
164 serge 860
 
774 Rus 861
	   call get_new_process_place
862
	   test eax, eax
863
	   jz .failed
164 serge 864
 
774 Rus 865
	   mov [slot], eax
164 serge 866
 
774 Rus 867
	   mov	  esi,[current_slot]
868
	   mov	  ebx,esi	      ;ebx=esi - pointer to extended information about current thread
164 serge 869
 
774 Rus 870
	   mov	  edi, eax
871
	   shl	  edi,8
872
	   add	  edi,SLOT_BASE
873
	   mov	  edx,edi	      ;edx=edi - pointer to extended infomation about new thread
874
	   mov	  ecx,256/4
875
	   xor eax, eax
876
	   cld
877
	   rep	  stosd 	      ;clean extended information about new thread
878
	   mov	  esi,ebx
879
	   mov	  edi,edx
880
	   mov	  ecx,11
881
	   rep	  movsb 	      ;copy process name
164 serge 882
 
774 Rus 883
	   mov eax,[ebx+APPDATA.heap_base]
884
	   mov [edx+APPDATA.heap_base], eax
164 serge 885
 
774 Rus 886
	   mov ecx,[ebx+APPDATA.heap_top]
887
	   mov [edx+APPDATA.heap_top], ecx
237 serge 888
 
774 Rus 889
	   mov eax,[ebx+APPDATA.mem_size]
890
	   mov [edx+APPDATA.mem_size], eax
237 serge 891
 
774 Rus 892
	   mov ecx,[ebx+APPDATA.dir_table]
893
	   mov [edx+APPDATA.dir_table],ecx	;copy page directory
237 serge 894
 
774 Rus 895
	   lea eax, [app_cmdline]
896
	   stdcall set_app_params ,[slot],eax,dword 0,\
897
					 dword 0,dword 0
237 serge 898
 
774 Rus 899
	   ;mov    esi,new_process_running
900
	   ;call   sys_msg_board_str     ;output information about succefull startup
901
	   DEBUGF 1,"%s",new_process_running
164 serge 902
 
774 Rus 903
	   mov	  [application_table_status],0 ;unlock application_table_status mutex
904
	   mov	  eax,[process_number]	;set result
905
	   ret
164 serge 906
.failed:
774 Rus 907
	   mov	  [application_table_status],0
908
	   mov	  eax,-1
909
	   ret
164 serge 910
endp
911
 
276 serge 912
; param
913
;  ebx=mutex
914
 
164 serge 915
align 4
276 serge 916
wait_mutex:
774 Rus 917
	   push eax
918
	   push ebx
321 diamond 919
.do_wait:
774 Rus 920
	   cmp dword [ebx],0
921
	   je .get_lock
922
	   call change_task
923
	   jmp .do_wait
164 serge 924
.get_lock:
774 Rus 925
	   mov eax, 1
926
	   xchg eax, [ebx]
927
	   test eax, eax
928
	   jnz .do_wait
929
	   pop ebx
930
	   pop eax
931
	   ret
164 serge 932
 
774 Rus 933
EFL_IF	    equ 0x0200
465 serge 934
EFL_IOPL1   equ 0x1000
935
EFL_IOPL2   equ 0x2000
936
EFL_IOPL3   equ 0x3000
937
 
938
 
237 serge 939
align 4
940
proc set_app_params stdcall,slot:dword, params:dword,\
774 Rus 941
			cmd_line:dword, app_path:dword, flags:dword
164 serge 942
 
774 Rus 943
	   locals
944
	     pl0_stack dd ?
945
	   endl
237 serge 946
 
839 serge 947
           stdcall alloc_pages, (RING0_STACK_SIZE+512) shr 12
948
           add eax, OS_BASE
774 Rus 949
	   mov [pl0_stack], eax
357 serge 950
 
774 Rus 951
	   lea edi, [eax+RING0_STACK_SIZE]
357 serge 952
 
774 Rus 953
	   mov eax, [slot]
954
	   mov ebx, eax
357 serge 955
 
774 Rus 956
	   shl eax, 8
957
	   mov [eax+SLOT_BASE+APPDATA.fpu_state], edi
958
	   mov [eax+SLOT_BASE+APPDATA.fpu_handler], 0
959
	   mov [eax+SLOT_BASE+APPDATA.sse_handler], 0
357 serge 960
 
465 serge 961
;set default io permission map
774 Rus 962
	   mov [eax+SLOT_BASE+APPDATA.io_map],\
963
		  (tss._io_map_0-OS_BASE+PG_MAP)
964
	   mov [eax+SLOT_BASE+APPDATA.io_map+4],\
965
		  (tss._io_map_1-OS_BASE+PG_MAP)
465 serge 966
 
774 Rus 967
	   mov esi, fpu_data
968
	   mov ecx, 512/4
969
	   rep movsd
237 serge 970
 
774 Rus 971
	   cmp	  ebx,[TASK_COUNT]
972
	   jle	  .noinc
973
	   inc	  dword [TASK_COUNT]	   ;update number of processes
237 serge 974
.noinc:
774 Rus 975
	   shl ebx,8
976
	   lea edx, [ebx+SLOT_BASE+APP_EV_OFFSET]
977
	   mov [SLOT_BASE+APPDATA.fd_ev+ebx],edx
978
	   mov [SLOT_BASE+APPDATA.bk_ev+ebx],edx
354 serge 979
 
774 Rus 980
	   add edx, APP_OBJ_OFFSET-APP_EV_OFFSET
981
	   mov [SLOT_BASE+APPDATA.fd_obj+ebx],edx
982
	   mov [SLOT_BASE+APPDATA.bk_obj+ebx],edx
237 serge 983
 
774 Rus 984
	   mov ecx, [def_cursor]
985
	   mov [SLOT_BASE+APPDATA.cursor+ebx],ecx
986
	   mov eax, [pl0_stack]
987
	   mov [SLOT_BASE+APPDATA.pl0_stack+ebx],eax
988
	   add eax, RING0_STACK_SIZE
989
	   mov [SLOT_BASE+APPDATA.saved_esp0+ebx], eax
281 serge 990
 
839 serge 991
           call alloc_page
992
           add eax, OS_BASE
774 Rus 993
	   mov esi,[current_slot]
994
	   mov esi,[esi+APPDATA.cur_dir]
995
	   mov ecx,0x1000/4
996
	   mov edi,eax
997
	   mov [ebx+SLOT_BASE+APPDATA.cur_dir],eax
998
	   rep movsd
521 diamond 999
 
774 Rus 1000
	   shr ebx,3
840 serge 1001
           mov dword [CURRENT_TASK+ebx+0x10], 0
237 serge 1002
 
1003
.add_command_line:
774 Rus 1004
	   mov edx,[params]
1005
	   mov edx,[edx]	   ;app_cmdline
1006
	   test edx,edx
1007
	   jz @f		   ;application doesn't need parameters
281 serge 1008
 
774 Rus 1009
	   mov	   eax, edx
1010
	   add	   eax, 256
1011
	   jc	   @f
281 serge 1012
 
774 Rus 1013
	   cmp	   eax, [SLOT_BASE+APPDATA.mem_size+ebx*8]
1014
	   ja	   @f
281 serge 1015
 
774 Rus 1016
	   mov	   byte [edx], 0   ;force empty string if no cmdline given
1017
	   mov	   eax, [cmd_line]
1018
	   test    eax, eax
1019
	   jz	   @f
1020
	   stdcall strncpy, edx, eax, 256
237 serge 1021
@@:
774 Rus 1022
	   mov edx,[params]
1023
	   mov edx, [edx+4]	   ;app_path
1024
	   test edx,edx
1025
	   jz @F		   ;application don't need path of file
1026
	   mov	   eax, edx
1027
	   add	   eax, 1024
1028
	   jc	   @f
1029
	   cmp	   eax, [SLOT_BASE+APPDATA.mem_size+ebx*8]
1030
	   ja	   @f
1031
	   stdcall strncpy, edx, [app_path], 1024
237 serge 1032
@@:
774 Rus 1033
	   mov	  ebx,[slot]
1034
	   mov	  eax,ebx
1035
	   shl	  ebx,5
1036
	   lea	  ecx,[draw_data+ebx]  ;ecx - pointer to draw data
465 serge 1037
 
237 serge 1038
; set window state to 'normal' (non-minimized/maximized/rolled-up) state
774 Rus 1039
	   mov	   [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL
1040
	   mov	   [ebx+window_data+WDATA.fl_redraw], 1
1041
	   add	  ebx,CURRENT_TASK	      ;ebx - pointer to information about process
1042
	   mov	  [ebx+TASKDATA.wnd_number],al;set window number on screen = process slot
237 serge 1043
 
774 Rus 1044
	   mov	  [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function)
237 serge 1045
 
774 Rus 1046
	   inc	  dword [process_number]
1047
	   mov	  eax,[process_number]
1048
	   mov	  [ebx+4],eax		;set PID
237 serge 1049
 
1050
;set draw data to full screen
1051
 
774 Rus 1052
	   mov	  [ecx+0],dword 0
1053
	   mov	  [ecx+4],dword 0
1054
	   mov	  eax,[Screen_Max_X]
1055
	   mov	  [ecx+8],eax
1056
	   mov	  eax,[Screen_Max_Y]
1057
	   mov	  [ecx+12],eax
237 serge 1058
 
774 Rus 1059
	   mov ebx, [pl0_stack]
1060
	   mov esi,[params]
1061
	   lea ecx, [ebx+REG_EIP]
1062
	   xor eax, eax
237 serge 1063
 
774 Rus 1064
	   mov [ebx+REG_RET], dword irq0.return
1065
	   mov [ebx+REG_EDI], eax
1066
	   mov [ebx+REG_ESI], eax
1067
	   mov [ebx+REG_EBP], eax
1068
	   mov [ebx+REG_ESP], ecx   ;ebx+REG_EIP
1069
	   mov [ebx+REG_EBX], eax
1070
	   mov [ebx+REG_EDX], eax
1071
	   mov [ebx+REG_ECX], eax
1072
	   mov [ebx+REG_EAX], eax
237 serge 1073
 
774 Rus 1074
	   mov eax, [esi+0x08]	     ;app_eip
1075
	   mov [ebx+REG_EIP],  eax   ;app_entry
1076
	   mov [ebx+REG_CS], dword app_code
1077
	   mov [ebx+REG_EFLAGS], dword EFL_IOPL1+EFL_IF
465 serge 1078
 
774 Rus 1079
	   mov eax, [esi+0x0C]	     ;app_esp
1080
	   mov [ebx+REG_APP_ESP], eax	 ;app_stack
1081
	   mov [ebx+REG_SS], dword app_data
237 serge 1082
 
774 Rus 1083
	   lea ecx, [ebx+REG_RET]
1084
	   mov ebx, [slot]
1085
	   shl ebx, 5
1086
	   mov [ebx*8+SLOT_BASE+APPDATA.saved_esp], ecx
237 serge 1087
 
774 Rus 1088
	   xor	ecx, ecx	; process state - running
237 serge 1089
; set if debuggee
774 Rus 1090
	   test byte [flags], 1
1091
	   jz	.no_debug
1092
	   inc	ecx		; process state - suspended
1093
	   mov	eax,[CURRENT_TASK]
1094
	   mov	[SLOT_BASE+ebx*8+APPDATA.debugger_slot],eax
237 serge 1095
.no_debug:
774 Rus 1096
	   mov	[CURRENT_TASK+ebx+TASKDATA.state], cl
1097
	   ;mov    esi,new_process_running
1098
	   ;call   sys_msg_board_str     ;output information about succefull startup
1099
	   DEBUGF 1,"%s",new_process_running
1100
	   ret
237 serge 1101
endp
1102
 
164 serge 1103
include "debug.inc"