Subversion Repositories Kolibri OS

Rev

Rev 1038 | Rev 1074 | 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: 1072 $
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
	   ;mov esi, new_process_loading
142
	   ;call sys_msg_board_str       ; write message to message board
237 serge 143
 
144
.wait_lock:
774 Rus 145
	   cmp [application_table_status],0
146
	   je .get_lock
147
	   call   change_task
148
	   jmp .wait_lock
237 serge 149
 
150
.get_lock:
774 Rus 151
	   mov eax, 1
152
	   xchg eax, [application_table_status]
153
	   cmp eax, 0
154
	   jne .wait_lock
237 serge 155
 
774 Rus 156
	   call set_application_table_status
237 serge 157
 
774 Rus 158
	   call get_new_process_place
159
	   test eax, eax
160
	   mov ecx, -0x20      ; too many processes
161
	   jz .err
237 serge 162
 
774 Rus 163
	   mov [slot], eax
164
	   shl eax, 8
165
	   add eax, SLOT_BASE
166
	   mov [slot_base], eax
167
	   mov edi, eax
168
	   _clear_ 256	   ;clean extended information about process
237 serge 169
 
170
; write application name
774 Rus 171
	   lea eax, [filename]
172
	   stdcall strrchr,  eax, '/'  ; now eax points to name without path
237 serge 173
 
774 Rus 174
	   lea esi, [eax+1]
175
	   test eax, eax
176
	   jnz @F
177
	   lea esi, [filename]
237 serge 178
@@:
774 Rus 179
	   mov ecx, 8  ; 8 chars for name
180
	   mov edi, [slot_base]
237 serge 181
.copy_process_name_loop:
774 Rus 182
	   lodsb
183
	   cmp al, '.'
184
	   jz .copy_process_name_done
185
	   test al, al
186
	   jz .copy_process_name_done
187
	   stosb
188
	   loop .copy_process_name_loop
237 serge 189
.copy_process_name_done:
190
 
774 Rus 191
	   mov ebx, cr3
192
	   mov [save_cr3], ebx
269 serge 193
 
774 Rus 194
	   stdcall create_app_space,[hdr_mem],[file_base],[file_size]
195
	   mov ecx, -30  ; no memory
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
774 Rus 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
390
	   stdcall map_page,[tmp_task_pdir],eax,dword PG_SW
164 serge 391
 
774 Rus 392
	   mov edi, [tmp_task_pdir]
393
	   mov ecx, (OS_BASE shr 20)/4
394
	   xor eax, eax
395
	   cld
396
	   rep stosd
465 serge 397
 
774 Rus 398
	   mov ecx, (OS_BASE shr 20)/4
399
	   mov esi, sys_pgdir+(OS_BASE shr 20)
400
	   rep movsd
164 serge 401
 
774 Rus 402
	   mov eax, [dir_addr]
403
	   or eax, PG_SW
404
	   mov [edi-4096+(page_tabs shr 20)], eax
378 serge 405
 
774 Rus 406
	   and eax, -4096
407
	   call set_cr3
164 serge 408
 
774 Rus 409
	   mov edx, [app_tabs]
410
	   mov edi, new_app_base
164 serge 411
@@:
774 Rus 412
	   call alloc_page
413
	   test eax, eax
414
	   jz .fail
164 serge 415
 
774 Rus 416
	   stdcall map_page_table, edi, eax
417
	   add edi, 0x00400000
418
	   dec edx
419
	   jnz @B
164 serge 420
 
774 Rus 421
	   mov edi, new_app_base
422
	   shr edi, 10
423
	   add edi, page_tabs
269 serge 424
 
774 Rus 425
	   mov ecx, [app_tabs]
426
	   shl ecx, 10
427
	   xor eax, eax
428
	   rep stosd
164 serge 429
 
774 Rus 430
	   mov ecx, [img_pages]
431
	   mov ebx, PG_UW
432
	   mov edx, new_app_base
433
	   mov esi, [img_base]
434
	   mov edi, new_app_base
435
	   shr esi, 10
436
	   shr edi, 10
437
	   add esi, page_tabs
438
	   add edi, page_tabs
269 serge 439
.remap:
774 Rus 440
	   lodsd
441
	   or eax, ebx	    ; force user level r/w access
442
	   stosd
443
	   add edx, 0x1000
444
	   dec [app_pages]
445
	   dec ecx
446
	   jnz .remap
269 serge 447
 
774 Rus 448
	   mov ecx, [app_pages]
449
	   test ecx, ecx
450
	   jz .done
269 serge 451
 
452
if GREEDY_KERNEL
774 Rus 453
	   mov eax, 0x02
819 serge 454
           rep stosd
269 serge 455
else
456
 
164 serge 457
.alloc:
774 Rus 458
	   call alloc_page
459
	   test eax, eax
460
	   jz .fail
164 serge 461
 
774 Rus 462
	   stdcall map_page,edx,eax,dword PG_UW
463
	   add edx, 0x1000
464
	   dec [app_pages]
465
	   jnz .alloc
269 serge 466
end if
164 serge 467
 
269 serge 468
.done:
774 Rus 469
	   stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP
164 serge 470
 
774 Rus 471
	   dec [pg_data.pg_mutex]
472
	   mov eax, [dir_addr]
473
	   ret
164 serge 474
.fail:
774 Rus 475
	   dec [pg_data.pg_mutex]
476
	   cmp [dir_addr], 0
477
	   je @f
478
	   stdcall destroy_app_space, [dir_addr]
164 serge 479
@@:
774 Rus 480
	   xor eax, eax
481
	   ret
164 serge 482
endp
483
 
484
align 4
485
set_cr3:
465 serge 486
 
774 Rus 487
	   mov ebx, [current_slot]
488
	   mov [ebx+APPDATA.dir_table], eax
489
	   mov cr3, eax
490
	   ret
164 serge 491
 
492
align 4
493
proc destroy_page_table stdcall, pg_tab:dword
494
 
774 Rus 495
	   push esi
164 serge 496
 
774 Rus 497
	   mov esi, [pg_tab]
498
	   mov ecx, 1024
164 serge 499
.free:
774 Rus 500
	   mov eax, [esi]
501
	   test eax, 1
502
	   jz .next
819 serge 503
           test eax, 1 shl 9
504
           jnz .next                      ;skip shared pages
774 Rus 505
	   call free_page
164 serge 506
.next:
774 Rus 507
	   add esi, 4
508
	   dec ecx
509
	   jnz .free
510
	   pop esi
511
	   ret
164 serge 512
endp
513
 
514
align 4
515
proc destroy_app_space stdcall, pg_dir:dword
516
 
774 Rus 517
	   mov ebx, pg_data.pg_mutex
518
	   call wait_mutex   ;ebx
164 serge 519
 
774 Rus 520
	   xor	 edx,edx
521
	   mov	 eax,0x2
522
	   mov ebx, [pg_dir]
164 serge 523
.loop:
524
;eax = current slot of process
774 Rus 525
	   mov	 ecx,eax
526
	   shl	 ecx,5
527
	   cmp	 byte [CURRENT_TASK+ecx+0xa],9	;if process running?
528
	   jz	 @f				 ;skip empty slots
529
	   shl	 ecx,3
530
	   cmp	 [SLOT_BASE+ecx+0xB8],ebx	;compare page directory addresses
531
	   jnz	 @f
532
	   inc	 edx				;thread found
164 serge 533
@@:
774 Rus 534
	   inc	 eax
535
	   cmp	 eax,[TASK_COUNT]		;exit loop if we look through all processes
536
	   jle	 .loop
164 serge 537
 
538
;edx = number of threads
539
;our process is zombi so it isn't counted
774 Rus 540
	   cmp	 edx,1
541
	   jg	 .exit
164 serge 542
;if there isn't threads then clear memory.
543
 
774 Rus 544
	   mov eax, [pg_dir]
545
	   and eax, not 0xFFF
546
	   stdcall map_page,[tmp_task_pdir],eax,dword PG_SW
547
	   mov esi, [tmp_task_pdir]
548
	   mov edi, (OS_BASE shr 20)/4
164 serge 549
.destroy:
774 Rus 550
	   mov eax, [esi]
551
	   test eax, 1
552
	   jz .next
553
	   and eax, not 0xFFF
554
	   stdcall map_page,[tmp_task_ptab],eax,dword PG_SW
555
	   stdcall destroy_page_table, [tmp_task_ptab]
556
	   mov eax, [esi]
557
	   call free_page
164 serge 558
.next:
774 Rus 559
	   add esi, 4
560
	   dec edi
561
	   jnz .destroy
164 serge 562
 
774 Rus 563
	   mov eax, [pg_dir]
564
	   call free_page
164 serge 565
.exit:
774 Rus 566
	   stdcall map_page,[tmp_task_ptab],dword 0,dword PG_UNMAP
567
	   stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP
568
	   dec [pg_data.pg_mutex]
569
	   ret
164 serge 570
endp
571
 
520 serge 572
align 4
573
get_pid:
774 Rus 574
	   mov eax, [TASK_BASE]
819 serge 575
           mov eax, [eax+TASKDATA.pid]
774 Rus 576
	   ret
520 serge 577
 
164 serge 578
pid_to_slot:
579
;Input:
580
;  eax - pid of process
581
;Output:
582
;  eax - slot of process or 0 if process don't exists
583
;Search process by PID.
584
    push   ebx
585
    push   ecx
586
    mov    ebx,[TASK_COUNT]
587
    shl    ebx,5
588
    mov    ecx,2*32
589
 
590
.loop:
591
;ecx=offset of current process info entry
592
;ebx=maximum permitted offset
593
    cmp    byte [CURRENT_TASK+ecx+0xa],9
774 Rus 594
    jz	   .endloop		 ;skip empty slots
164 serge 595
    cmp    [CURRENT_TASK+ecx+0x4],eax ;check PID
774 Rus 596
    jz	   .pid_found
164 serge 597
.endloop:
598
    add    ecx,32
599
    cmp    ecx,ebx
600
    jle    .loop
601
 
602
    pop    ecx
603
    pop    ebx
604
    xor    eax,eax
605
    ret
606
 
607
.pid_found:
608
    shr    ecx,5
774 Rus 609
    mov    eax,ecx		 ;convert offset to index of slot
164 serge 610
    pop    ecx
611
    pop    ebx
612
    ret
613
 
614
check_region:
615
;input:
616
;  ebx - start of buffer
617
;  ecx - size of buffer
618
;result:
619
;  eax = 1 region lays in app memory
620
;  eax = 0 region don't lays in app memory
621
     mov  eax,[CURRENT_TASK]
622
     jmp  check_process_region
623
;-----------------------------------------------------------------------------
624
check_process_region:
625
;input:
626
;  eax - slot
627
;  ebx - start of buffer
628
;  ecx - size of buffer
629
;result:
630
;  eax = 1 region lays in app memory
631
;  eax = 0 region don't lays in app memory
632
 
633
     test ecx,ecx
634
     jle  .ok
635
     shl  eax,5
636
     cmp  word [CURRENT_TASK+eax+0xa],0
637
     jnz  .failed
638
     shl  eax,3
380 serge 639
     mov  eax,[SLOT_BASE+eax+0xb8]
164 serge 640
     test eax,eax
641
     jz   .failed
642
 
643
     mov  eax,1
644
     ret
645
 
646
 
647
;    call MEM_Get_Linear_Address
648
;    push ebx
649
;    push ecx
650
;    push edx
651
;    mov  edx,ebx
652
;    and  edx,not (4096-1)
653
;    sub  ebx,edx
654
;    add  ecx,ebx
655
;    mov  ebx,edx
656
;    add  ecx,(4096-1)
657
;    and  ecx,not (4096-1)
658
;.loop:
659
;;eax - linear address of page directory
660
;;ebx - current page
661
;;ecx - current size
662
;    mov  edx,ebx
663
;    shr  edx,22
664
;    mov  edx,[eax+4*edx]
665
;    and  edx,not (4096-1)
666
;    test edx,edx
667
;    jz   .failed1
668
;    push eax
669
;    mov  eax,edx
670
;    call MEM_Get_Linear_Address
671
;    mov  edx,ebx
672
;    shr  edx,12
673
;    and  edx,(1024-1)
674
;    mov  eax,[eax+4*edx]
675
;    and  eax,not (4096-1)
676
;    test eax,eax
677
;    pop  eax
678
;    jz   .failed1
679
;    add  ebx,4096
680
;    sub  ecx,4096
681
;    jg   .loop
682
;    pop  edx
683
;    pop  ecx
684
;    pop  ebx
685
.ok:
686
    mov  eax,1
687
    ret
688
;
689
;.failed1:
690
;    pop  edx
691
;    pop  ecx
692
;    pop  ebx
693
.failed:
694
    xor  eax,eax
695
    ret
696
 
697
align 4
698
proc read_process_memory
699
;Input:
700
;  eax - process slot
701
;  ebx - buffer address
702
;  ecx - buffer size
703
;  edx - start address in other process
704
;Output:
705
;  eax - number of bytes read.
774 Rus 706
	   locals
707
	     slot	dd ?
708
	     buff	dd ?
709
	     r_count	dd ?
710
	     offset	dd ?
711
	     tmp_r_cnt	dd ?
712
	   endl
164 serge 713
 
774 Rus 714
	   mov [slot], eax
715
	   mov [buff], ebx
716
	   and [r_count], 0
717
	   mov [tmp_r_cnt], ecx
718
	   mov [offset], edx
164 serge 719
 
774 Rus 720
	   pushad
164 serge 721
.read_mem:
774 Rus 722
	   mov edx, [offset]
723
	   mov ebx, [tmp_r_cnt]
164 serge 724
 
774 Rus 725
	   mov ecx, 0x400000
726
	   and edx, 0x3FFFFF
727
	   sub ecx, edx
728
	   cmp ecx, ebx
729
	   jbe @f
730
	   mov ecx, ebx
164 serge 731
@@:
774 Rus 732
	   cmp ecx, 0x8000
733
	   jna @F
734
	   mov ecx, 0x8000
164 serge 735
@@:
774 Rus 736
	   mov eax, [slot]
737
	   shl	eax,8
738
	   mov ebx, [offset]
465 serge 739
     ;      add ebx, new_app_base
774 Rus 740
	   push ecx
741
	   stdcall map_memEx, [proc_mem_map],\
742
			      [SLOT_BASE+eax+0xB8],\
743
			      ebx, ecx
744
	   pop ecx
164 serge 745
 
774 Rus 746
	   mov esi, [offset]
747
	   and esi, 0xfff
748
	   add esi, [proc_mem_map]
749
	   mov edi, [buff]
750
	   mov edx, ecx
751
	   rep movsb
752
	   add [r_count], edx
164 serge 753
 
774 Rus 754
	   add [offset], edx
755
	   sub [tmp_r_cnt], edx
756
	   jnz .read_mem
164 serge 757
 
774 Rus 758
	   popad
759
	   mov eax, [r_count]
760
	   ret
164 serge 761
endp
762
 
763
align 4
764
proc write_process_memory
765
;Input:
766
;  eax - process slot
767
;  ebx - buffer address
768
;  ecx - buffer size
769
;  edx - start address in other process
770
;Output:
771
;  eax - number of bytes written
772
 
774 Rus 773
	   locals
774
	     slot	dd ?
775
	     buff	dd ?
776
	     w_count	dd ?
777
	     offset	dd ?
778
	     tmp_w_cnt	dd ?
779
	   endl
164 serge 780
 
774 Rus 781
	   mov [slot], eax
782
	   mov [buff], ebx
783
	   and [w_count], 0
784
	   mov [tmp_w_cnt], ecx
785
	   mov [offset], edx
164 serge 786
 
774 Rus 787
	   pushad
164 serge 788
.read_mem:
774 Rus 789
	   mov edx, [offset]
790
	   mov ebx, [tmp_w_cnt]
164 serge 791
 
774 Rus 792
	   mov ecx, 0x400000
793
	   and edx, 0x3FFFFF
794
	   sub ecx, edx
795
	   cmp ecx, ebx
796
	   jbe @f
797
	   mov ecx, ebx
164 serge 798
@@:
774 Rus 799
	   cmp ecx, 0x8000
800
	   jna @F
801
	   mov ecx, 0x8000
164 serge 802
@@:
774 Rus 803
	   mov eax, [slot]
804
	   shl	eax,8
805
	   mov ebx, [offset]
465 serge 806
      ;     add ebx, new_app_base
774 Rus 807
	   push ecx
808
	   stdcall map_memEx, [proc_mem_map],\
809
			      [SLOT_BASE+eax+0xB8],\
810
			      ebx, ecx
811
	   pop ecx
164 serge 812
 
774 Rus 813
	   mov edi, [offset]
814
	   and edi, 0xfff
815
	   add edi, [proc_mem_map]
816
	   mov esi, [buff]
817
	   mov edx, ecx
818
	   rep movsb
164 serge 819
 
774 Rus 820
	   add [w_count], edx
821
	   add [offset], edx
822
	   sub [tmp_w_cnt], edx
823
	   jnz .read_mem
164 serge 824
 
774 Rus 825
	   popad
826
	   mov eax, [w_count]
827
	   ret
164 serge 828
endp
829
 
830
align 4
831
proc new_sys_threads
774 Rus 832
	   locals
833
	     slot	   dd ?
834
	     app_cmdline   dd ? ;0x00
835
	     app_path	   dd ? ;0x04
836
	     app_eip	   dd ? ;0x08
837
	     app_esp	   dd ? ;0x0C
838
	     app_mem	   dd ? ;0x10
839
	   endl
164 serge 840
 
774 Rus 841
	   cmp eax,1
842
	   jne .failed			;other subfunctions
164 serge 843
 
774 Rus 844
	   xor	eax,eax
845
	   mov [app_cmdline], eax
846
	   mov [app_path], eax
847
	   mov [app_eip], ebx
848
	   mov [app_esp], ecx
164 serge 849
 
774 Rus 850
	   ;mov    esi,new_process_loading
851
	   ;call   sys_msg_board_str
164 serge 852
.wait_lock:
774 Rus 853
	   cmp [application_table_status],0
854
	   je .get_lock
855
	   call   change_task
856
	   jmp .wait_lock
164 serge 857
 
858
.get_lock:
774 Rus 859
	   mov eax, 1
860
	   xchg eax, [application_table_status]
861
	   cmp eax, 0
862
	   jne .wait_lock
164 serge 863
 
774 Rus 864
	   call   set_application_table_status
164 serge 865
 
774 Rus 866
	   call get_new_process_place
867
	   test eax, eax
868
	   jz .failed
164 serge 869
 
774 Rus 870
	   mov [slot], eax
164 serge 871
 
774 Rus 872
	   mov	  esi,[current_slot]
873
	   mov	  ebx,esi	      ;ebx=esi - pointer to extended information about current thread
164 serge 874
 
774 Rus 875
	   mov	  edi, eax
876
	   shl	  edi,8
877
	   add	  edi,SLOT_BASE
878
	   mov	  edx,edi	      ;edx=edi - pointer to extended infomation about new thread
879
	   mov	  ecx,256/4
880
	   xor eax, eax
881
	   cld
882
	   rep	  stosd 	      ;clean extended information about new thread
883
	   mov	  esi,ebx
884
	   mov	  edi,edx
885
	   mov	  ecx,11
886
	   rep	  movsb 	      ;copy process name
164 serge 887
 
774 Rus 888
	   mov eax,[ebx+APPDATA.heap_base]
889
	   mov [edx+APPDATA.heap_base], eax
164 serge 890
 
774 Rus 891
	   mov ecx,[ebx+APPDATA.heap_top]
892
	   mov [edx+APPDATA.heap_top], ecx
237 serge 893
 
774 Rus 894
	   mov eax,[ebx+APPDATA.mem_size]
895
	   mov [edx+APPDATA.mem_size], eax
237 serge 896
 
774 Rus 897
	   mov ecx,[ebx+APPDATA.dir_table]
898
	   mov [edx+APPDATA.dir_table],ecx	;copy page directory
237 serge 899
 
774 Rus 900
	   lea eax, [app_cmdline]
901
	   stdcall set_app_params ,[slot],eax,dword 0,\
902
					 dword 0,dword 0
237 serge 903
 
774 Rus 904
	   ;mov    esi,new_process_running
905
	   ;call   sys_msg_board_str     ;output information about succefull startup
164 serge 906
 
774 Rus 907
	   mov	  [application_table_status],0 ;unlock application_table_status mutex
908
	   mov	  eax,[process_number]	;set result
909
	   ret
164 serge 910
.failed:
774 Rus 911
	   mov	  [application_table_status],0
912
	   mov	  eax,-1
913
	   ret
164 serge 914
endp
915
 
276 serge 916
; param
917
;  ebx=mutex
918
 
164 serge 919
align 4
276 serge 920
wait_mutex:
1072 diamond 921
;;Maxis use atomic bts for mutex 4.4.2009
774 Rus 922
	   push eax
923
	   push ebx
321 diamond 924
.do_wait:
1072 diamond 925
           bts dword [ebx],0
926
           jnc .locked
774 Rus 927
	   call change_task
928
	   jmp .do_wait
1072 diamond 929
.locked:
774 Rus 930
	   pop ebx
931
	   pop eax
932
	   ret
164 serge 933
 
774 Rus 934
EFL_IF	    equ 0x0200
465 serge 935
EFL_IOPL1   equ 0x1000
936
EFL_IOPL2   equ 0x2000
937
EFL_IOPL3   equ 0x3000
938
 
939
 
237 serge 940
align 4
941
proc set_app_params stdcall,slot:dword, params:dword,\
774 Rus 942
			cmd_line:dword, app_path:dword, flags:dword
164 serge 943
 
774 Rus 944
	   locals
945
	     pl0_stack dd ?
946
	   endl
237 serge 947
 
774 Rus 948
	   stdcall kernel_alloc, RING0_STACK_SIZE+512
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
 
774 Rus 991
	   push ebx
992
	   stdcall kernel_alloc, 0x1000
993
	   pop ebx
994
	   mov esi,[current_slot]
995
	   mov esi,[esi+APPDATA.cur_dir]
996
	   mov ecx,0x1000/4
997
	   mov edi,eax
998
	   mov [ebx+SLOT_BASE+APPDATA.cur_dir],eax
999
	   rep movsd
521 diamond 1000
 
774 Rus 1001
	   shr ebx,3
1002
	   mov eax, new_app_base
1003
	   mov dword [CURRENT_TASK+ebx+0x10],eax
237 serge 1004
 
1005
.add_command_line:
774 Rus 1006
	   mov edx,[params]
1007
	   mov edx,[edx]	   ;app_cmdline
1008
	   test edx,edx
1009
	   jz @f		   ;application doesn't need parameters
281 serge 1010
 
774 Rus 1011
	   mov	   eax, edx
1012
	   add	   eax, 256
1013
	   jc	   @f
281 serge 1014
 
774 Rus 1015
	   cmp	   eax, [SLOT_BASE+APPDATA.mem_size+ebx*8]
1016
	   ja	   @f
281 serge 1017
 
774 Rus 1018
	   mov	   byte [edx], 0   ;force empty string if no cmdline given
1019
	   mov	   eax, [cmd_line]
1020
	   test    eax, eax
1021
	   jz	   @f
1022
	   stdcall strncpy, edx, eax, 256
237 serge 1023
@@:
774 Rus 1024
	   mov edx,[params]
1025
	   mov edx, [edx+4]	   ;app_path
1026
	   test edx,edx
1027
	   jz @F		   ;application don't need path of file
1028
	   mov	   eax, edx
1029
	   add	   eax, 1024
1030
	   jc	   @f
1031
	   cmp	   eax, [SLOT_BASE+APPDATA.mem_size+ebx*8]
1032
	   ja	   @f
1033
	   stdcall strncpy, edx, [app_path], 1024
237 serge 1034
@@:
774 Rus 1035
	   mov	  ebx,[slot]
1036
	   mov	  eax,ebx
1037
	   shl	  ebx,5
1038
	   lea	  ecx,[draw_data+ebx]  ;ecx - pointer to draw data
465 serge 1039
 
237 serge 1040
; set window state to 'normal' (non-minimized/maximized/rolled-up) state
774 Rus 1041
	   mov	   [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL
1042
	   mov	   [ebx+window_data+WDATA.fl_redraw], 1
1043
	   add	  ebx,CURRENT_TASK	      ;ebx - pointer to information about process
1044
	   mov	  [ebx+TASKDATA.wnd_number],al;set window number on screen = process slot
237 serge 1045
 
774 Rus 1046
	   mov	  [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function)
237 serge 1047
 
774 Rus 1048
	   inc	  dword [process_number]
1049
	   mov	  eax,[process_number]
1050
	   mov	  [ebx+4],eax		;set PID
237 serge 1051
 
1052
;set draw data to full screen
1053
 
774 Rus 1054
	   mov	  [ecx+0],dword 0
1055
	   mov	  [ecx+4],dword 0
1056
	   mov	  eax,[Screen_Max_X]
1057
	   mov	  [ecx+8],eax
1058
	   mov	  eax,[Screen_Max_Y]
1059
	   mov	  [ecx+12],eax
237 serge 1060
 
774 Rus 1061
	   mov ebx, [pl0_stack]
1062
	   mov esi,[params]
1063
	   lea ecx, [ebx+REG_EIP]
1064
	   xor eax, eax
237 serge 1065
 
774 Rus 1066
	   mov [ebx+REG_RET], dword irq0.return
1067
	   mov [ebx+REG_EDI], eax
1068
	   mov [ebx+REG_ESI], eax
1069
	   mov [ebx+REG_EBP], eax
1070
	   mov [ebx+REG_ESP], ecx   ;ebx+REG_EIP
1071
	   mov [ebx+REG_EBX], eax
1072
	   mov [ebx+REG_EDX], eax
1073
	   mov [ebx+REG_ECX], eax
1074
	   mov [ebx+REG_EAX], eax
237 serge 1075
 
774 Rus 1076
	   mov eax, [esi+0x08]	     ;app_eip
1077
	   mov [ebx+REG_EIP],  eax   ;app_entry
1078
	   mov [ebx+REG_CS], dword app_code
1079
	   mov [ebx+REG_EFLAGS], dword EFL_IOPL1+EFL_IF
465 serge 1080
 
774 Rus 1081
	   mov eax, [esi+0x0C]	     ;app_esp
1082
	   mov [ebx+REG_APP_ESP], eax	 ;app_stack
1083
	   mov [ebx+REG_SS], dword app_data
237 serge 1084
 
774 Rus 1085
	   lea ecx, [ebx+REG_RET]
1086
	   mov ebx, [slot]
1087
	   shl ebx, 5
1088
	   mov [ebx*8+SLOT_BASE+APPDATA.saved_esp], ecx
237 serge 1089
 
774 Rus 1090
	   xor	ecx, ecx	; process state - running
237 serge 1091
; set if debuggee
774 Rus 1092
	   test byte [flags], 1
1093
	   jz	.no_debug
1094
	   inc	ecx		; process state - suspended
1095
	   mov	eax,[CURRENT_TASK]
1096
	   mov	[SLOT_BASE+ebx*8+APPDATA.debugger_slot],eax
237 serge 1097
.no_debug:
774 Rus 1098
	   mov	[CURRENT_TASK+ebx+TASKDATA.state], cl
1099
	   ;mov    esi,new_process_running
1100
	   ;call   sys_msg_board_str     ;output information about succefull startup
1101
	   ret
237 serge 1102
endp
1103
 
164 serge 1104
include "debug.inc"