Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1159 hidnplayr 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
 
8
$Revision: 819 $
9
 
10
 
11
GREEDY_KERNEL  equ 0
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
 
33
 
34
struc APP_PARAMS
1198 clevermous 35
{ .app_cmdline   ;0x00
36
  .app_path  ;0x04
37
  .app_eip   ;0x08
38
  .app_esp   ;0x0C
39
  .app_mem   ;0x10
1159 hidnplayr 40
}
41
 
42
macro _clear_ op
43
{  mov ecx, op/4
44
   xor eax, eax
45
   cld
46
   rep stosd
47
}
48
 
49
fs_execute_from_sysdir:
1198 clevermous 50
    xor ebx, ebx
51
    xor edx, edx
52
    mov esi, sysdir_path
1159 hidnplayr 53
 
54
align 4
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
 
1198 clevermous 64
       locals
65
         cmdline       rd 64    ;256/4
66
         filename      rd 256   ;1024/4
67
         flags     dd ?
1159 hidnplayr 68
 
1198 clevermous 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
1159 hidnplayr 82
 
1198 clevermous 83
       pushad
1159 hidnplayr 84
 
1198 clevermous 85
       mov [flags], edx
1159 hidnplayr 86
 
87
; [ebp]  pointer to filename
88
 
1198 clevermous 89
       lea edi, [filename]
90
       lea ecx, [edi+1024]
91
       mov al, '/'
92
       stosb
1159 hidnplayr 93
@@:
1198 clevermous 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], '/'
1159 hidnplayr 104
@@:
1198 clevermous 105
       cmp edi, ecx
106
       jae .bigfilename
107
       lodsb
108
       stosb
109
       test al, al
110
       jnz @b
111
       jmp .namecopied
1159 hidnplayr 112
.bigfilename:
1198 clevermous 113
       popad
114
       mov eax, -ERROR_FILE_NOT_FOUND
115
       ret
1159 hidnplayr 116
.namecopied:
117
 
1198 clevermous 118
       mov [cmdline], ebx
119
       test ebx, ebx
120
       jz @F
1159 hidnplayr 121
 
1198 clevermous 122
       lea eax, [cmdline]
123
       mov dword [eax+252], 0
124
       stdcall strncpy, eax, ebx, 255
1159 hidnplayr 125
@@:
1198 clevermous 126
       lea eax, [filename]
127
       stdcall load_file, eax
128
       mov  ecx, -ERROR_FILE_NOT_FOUND
129
       test eax, eax
130
       jz .err_file
1159 hidnplayr 131
 
1198 clevermous 132
       mov [file_base], eax
133
       mov [file_size], ebx
1159 hidnplayr 134
 
1198 clevermous 135
       lea ebx, [hdr_cmdline]
136
       call test_app_header
137
       mov ecx, -0x1F
138
       test eax, eax
139
       jz .err_hdr
1159 hidnplayr 140
 
1198 clevermous 141
       ;mov esi, new_process_loading
142
       ;call sys_msg_board_str       ; write message to message board
1159 hidnplayr 143
 
144
.wait_lock:
1198 clevermous 145
       cmp [application_table_status],0
146
       je .get_lock
147
       call   change_task
148
       jmp .wait_lock
1159 hidnplayr 149
 
150
.get_lock:
1198 clevermous 151
       mov eax, 1
152
       xchg eax, [application_table_status]
153
       cmp eax, 0
154
       jne .wait_lock
1159 hidnplayr 155
 
1198 clevermous 156
       call set_application_table_status
1159 hidnplayr 157
 
1198 clevermous 158
       call get_new_process_place
159
       test eax, eax
160
       mov ecx, -0x20      ; too many processes
161
       jz .err
1159 hidnplayr 162
 
1198 clevermous 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
1159 hidnplayr 169
 
170
; write application name
1198 clevermous 171
       lea eax, [filename]
172
       stdcall strrchr,  eax, '/'  ; now eax points to name without path
1159 hidnplayr 173
 
1198 clevermous 174
       lea esi, [eax+1]
175
       test eax, eax
176
       jnz @F
177
       lea esi, [filename]
1159 hidnplayr 178
@@:
1198 clevermous 179
       mov ecx, 8  ; 8 chars for name
180
       mov edi, [slot_base]
1159 hidnplayr 181
.copy_process_name_loop:
1198 clevermous 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
1159 hidnplayr 189
.copy_process_name_done:
190
 
1198 clevermous 191
       mov ebx, cr3
192
       mov [save_cr3], ebx
1159 hidnplayr 193
 
1198 clevermous 194
       stdcall create_app_space,[hdr_mem],[file_base],[file_size]
195
       mov ecx, -30  ; no memory
196
       test eax, eax
197
       jz .failed
1159 hidnplayr 198
 
1198 clevermous 199
       mov   ebx,[slot_base]
200
       mov   [ebx+APPDATA.dir_table],eax
201
       mov   eax,[hdr_mem]
202
       mov   [ebx+APPDATA.mem_size],eax
1159 hidnplayr 203
 
204
if GREEDY_KERNEL
205
else
1198 clevermous 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
1159 hidnplayr 212
 
1198 clevermous 213
       xor eax, eax
1159 hidnplayr 214
           cld
1198 clevermous 215
       rep stosb
1159 hidnplayr 216
@@:
217
end if
218
 
219
; release only virtual space, not phisical memory
220
 
1198 clevermous 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]
1159 hidnplayr 226
 
1198 clevermous 227
       mov eax, [save_cr3]
228
       call set_cr3
1159 hidnplayr 229
 
1198 clevermous 230
       xor ebx, ebx
231
       mov [application_table_status],ebx ;unlock application_table_status mutex
232
       mov eax,[process_number]  ;set result
233
       ret
1159 hidnplayr 234
.failed:
1198 clevermous 235
       mov eax, [save_cr3]
236
       call set_cr3
1159 hidnplayr 237
.err:
238
.err_hdr:
1198 clevermous 239
       stdcall kernel_free,[file_base]
1159 hidnplayr 240
.err_file:
1198 clevermous 241
       xor eax, eax
242
       mov [application_table_status],eax
243
       mov eax, ecx
244
       ret
1159 hidnplayr 245
endp
246
 
247
align 4
248
test_app_header:
1198 clevermous 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
1159 hidnplayr 255
 
1198 clevermous 256
       cmp dword [eax], 'MENU'
257
       jne .fail
258
       cmp word [eax+4],'ET'
259
       jne .fail
1159 hidnplayr 260
 
1198 clevermous 261
       cmp [eax+6], word '00'
262
       jne  .check_01_header
1159 hidnplayr 263
 
1198 clevermous 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
1159 hidnplayr 277
 
278
 .check_01_header:
279
 
1198 clevermous 280
       cmp  [eax+6],word '01'
281
       jne  .fail
1159 hidnplayr 282
 
1198 clevermous 283
       mov  ecx,[APP_HEADER_01.start]
284
       mov  [ebx+0x08], ecx            ;app_eip
285
       mov  edx,[APP_HEADER_01.mem_size]
1159 hidnplayr 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)
1198 clevermous 290
       cmp  edx,[APP_HEADER_01.i_end]
291
       jb   .fail
1159 hidnplayr 292
; \end{diamond}[20.08.2006]
293
 
1198 clevermous 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
1159 hidnplayr 304
.fail:
1198 clevermous 305
       xor eax, eax
306
       ret
1159 hidnplayr 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]!
1198 clevermous 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
1159 hidnplayr 322
.newprocessplace:
323
;eax = address of process information for current slot
1198 clevermous 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
1159 hidnplayr 329
.endnewprocessplace:
1198 clevermous 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
1159 hidnplayr 337
.failed:
1198 clevermous 338
       xor    eax,eax
339
       ret
1159 hidnplayr 340
endp
341
 
342
align 4
343
proc create_app_space stdcall, app_size:dword,img_base:dword,img_size:dword
1198 clevermous 344
       locals
345
         app_pages   dd ?
346
         img_pages   dd ?
347
         dir_addr    dd ?
348
         app_tabs    dd ?
349
       endl
1159 hidnplayr 350
 
1198 clevermous 351
       mov ebx, pg_data.pg_mutex
352
       call wait_mutex   ;ebx
1159 hidnplayr 353
 
1198 clevermous 354
       xor eax, eax
355
       mov [dir_addr], eax
1159 hidnplayr 356
 
1198 clevermous 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
1159 hidnplayr 364
 
1198 clevermous 365
       add ebx, 0x3FFFFF
366
       and ebx, NOT(0x3FFFFF)
367
       shr ebx, 22
368
       mov [app_tabs], ebx
1159 hidnplayr 369
 
1198 clevermous 370
       mov ecx, [img_size]
371
       add ecx, 4095
372
       and ecx, NOT(4095)
1159 hidnplayr 373
 
1198 clevermous 374
       mov [img_size], ecx
375
       shr ecx, 12
376
       mov [img_pages], ecx
1159 hidnplayr 377
 
378
     if GREEDY_KERNEL
1198 clevermous 379
       lea eax, [ecx+ebx+2]    ;only image size
1159 hidnplayr 380
     else
1198 clevermous 381
       lea eax, [eax+ebx+2]    ;all requested memory
1159 hidnplayr 382
     end if
1198 clevermous 383
       cmp eax, [pg_data.pages_free]
384
       ja .fail
1159 hidnplayr 385
 
1198 clevermous 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
1159 hidnplayr 391
 
1198 clevermous 392
       mov edi, [tmp_task_pdir]
393
       mov ecx, (OS_BASE shr 20)/4
394
       xor eax, eax
395
       cld
396
       rep stosd
1159 hidnplayr 397
 
1198 clevermous 398
       mov ecx, (OS_BASE shr 20)/4
399
       mov esi, sys_pgdir+(OS_BASE shr 20)
400
       rep movsd
1159 hidnplayr 401
 
1198 clevermous 402
       mov eax, [dir_addr]
403
       or eax, PG_SW
404
       mov [edi-4096+(page_tabs shr 20)], eax
1159 hidnplayr 405
 
1198 clevermous 406
       and eax, -4096
407
       call set_cr3
1159 hidnplayr 408
 
1198 clevermous 409
       mov edx, [app_tabs]
410
       mov edi, new_app_base
1159 hidnplayr 411
@@:
1198 clevermous 412
       call alloc_page
413
       test eax, eax
414
       jz .fail
1159 hidnplayr 415
 
1198 clevermous 416
       stdcall map_page_table, edi, eax
417
       add edi, 0x00400000
418
       dec edx
419
       jnz @B
1159 hidnplayr 420
 
1198 clevermous 421
       mov edi, new_app_base
422
       shr edi, 10
423
       add edi, page_tabs
1159 hidnplayr 424
 
1198 clevermous 425
       mov ecx, [app_tabs]
426
       shl ecx, 10
427
       xor eax, eax
428
       rep stosd
1159 hidnplayr 429
 
1198 clevermous 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
1159 hidnplayr 439
.remap:
1198 clevermous 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
1159 hidnplayr 447
 
1198 clevermous 448
       mov ecx, [app_pages]
449
       test ecx, ecx
450
       jz .done
1159 hidnplayr 451
 
452
if GREEDY_KERNEL
1198 clevermous 453
       mov eax, 0x02
1159 hidnplayr 454
           rep stosd
455
else
456
 
457
.alloc:
1198 clevermous 458
       call alloc_page
459
       test eax, eax
460
       jz .fail
1159 hidnplayr 461
 
1198 clevermous 462
       stdcall map_page,edx,eax,dword PG_UW
463
       add edx, 0x1000
464
       dec [app_pages]
465
       jnz .alloc
1159 hidnplayr 466
end if
467
 
468
.done:
1198 clevermous 469
       stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP
1159 hidnplayr 470
 
1198 clevermous 471
       dec [pg_data.pg_mutex]
472
       mov eax, [dir_addr]
473
       ret
1159 hidnplayr 474
.fail:
1198 clevermous 475
       dec [pg_data.pg_mutex]
476
       cmp [dir_addr], 0
477
       je @f
478
       stdcall destroy_app_space, [dir_addr]
1159 hidnplayr 479
@@:
1198 clevermous 480
       xor eax, eax
481
       ret
1159 hidnplayr 482
endp
483
 
484
align 4
485
set_cr3:
486
 
1198 clevermous 487
       mov ebx, [current_slot]
488
       mov [ebx+APPDATA.dir_table], eax
489
       mov cr3, eax
490
       ret
1159 hidnplayr 491
 
492
align 4
493
proc destroy_page_table stdcall, pg_tab:dword
494
 
1198 clevermous 495
       push esi
1159 hidnplayr 496
 
1198 clevermous 497
       mov esi, [pg_tab]
498
       mov ecx, 1024
1159 hidnplayr 499
.free:
1198 clevermous 500
       mov eax, [esi]
501
       test eax, 1
502
       jz .next
1159 hidnplayr 503
           test eax, 1 shl 9
504
           jnz .next                      ;skip shared pages
1198 clevermous 505
       call free_page
1159 hidnplayr 506
.next:
1198 clevermous 507
       add esi, 4
508
       dec ecx
509
       jnz .free
510
       pop esi
511
       ret
1159 hidnplayr 512
endp
513
 
514
align 4
515
proc destroy_app_space stdcall, pg_dir:dword
516
 
1198 clevermous 517
       mov ebx, pg_data.pg_mutex
518
       call wait_mutex   ;ebx
1159 hidnplayr 519
 
1198 clevermous 520
       xor   edx,edx
521
       mov   eax,0x2
522
       mov ebx, [pg_dir]
1159 hidnplayr 523
.loop:
524
;eax = current slot of process
1198 clevermous 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
1159 hidnplayr 533
@@:
1198 clevermous 534
       inc   eax
535
       cmp   eax,[TASK_COUNT]       ;exit loop if we look through all processes
536
       jle   .loop
1159 hidnplayr 537
 
538
;edx = number of threads
539
;our process is zombi so it isn't counted
1198 clevermous 540
       cmp   edx,1
541
       jg    .exit
1159 hidnplayr 542
;if there isn't threads then clear memory.
543
 
1198 clevermous 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
1159 hidnplayr 549
.destroy:
1198 clevermous 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
1159 hidnplayr 558
.next:
1198 clevermous 559
       add esi, 4
560
       dec edi
561
       jnz .destroy
1159 hidnplayr 562
 
1198 clevermous 563
       mov eax, [pg_dir]
564
       call free_page
1159 hidnplayr 565
.exit:
1198 clevermous 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
1159 hidnplayr 570
endp
571
 
572
align 4
573
get_pid:
1198 clevermous 574
       mov eax, [TASK_BASE]
1159 hidnplayr 575
           mov eax, [eax+TASKDATA.pid]
1198 clevermous 576
       ret
1159 hidnplayr 577
 
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
1198 clevermous 594
    jz     .endloop      ;skip empty slots
1159 hidnplayr 595
    cmp    [CURRENT_TASK+ecx+0x4],eax ;check PID
1198 clevermous 596
    jz     .pid_found
1159 hidnplayr 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
1198 clevermous 609
    mov    eax,ecx       ;convert offset to index of slot
1159 hidnplayr 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
639
     mov  eax,[SLOT_BASE+eax+0xb8]
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.
1198 clevermous 706
       locals
707
         slot   dd ?
708
         buff   dd ?
709
         r_count    dd ?
710
         offset dd ?
711
         tmp_r_cnt  dd ?
712
       endl
1159 hidnplayr 713
 
1198 clevermous 714
       mov [slot], eax
715
       mov [buff], ebx
716
       and [r_count], 0
717
       mov [tmp_r_cnt], ecx
718
       mov [offset], edx
1159 hidnplayr 719
 
1198 clevermous 720
       pushad
1159 hidnplayr 721
.read_mem:
1198 clevermous 722
       mov edx, [offset]
723
       mov ebx, [tmp_r_cnt]
1159 hidnplayr 724
 
1198 clevermous 725
       mov ecx, 0x400000
726
       and edx, 0x3FFFFF
727
       sub ecx, edx
728
       cmp ecx, ebx
729
       jbe @f
730
       mov ecx, ebx
1159 hidnplayr 731
@@:
1198 clevermous 732
       cmp ecx, 0x8000
733
       jna @F
734
       mov ecx, 0x8000
1159 hidnplayr 735
@@:
1198 clevermous 736
       mov eax, [slot]
737
       shl  eax,8
738
       mov ebx, [offset]
1159 hidnplayr 739
     ;      add ebx, new_app_base
1198 clevermous 740
       push ecx
741
       stdcall map_memEx, [proc_mem_map],\
742
                  [SLOT_BASE+eax+0xB8],\
743
                  ebx, ecx
744
       pop ecx
1159 hidnplayr 745
 
1198 clevermous 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
1159 hidnplayr 753
 
1198 clevermous 754
       add [offset], edx
755
       sub [tmp_r_cnt], edx
756
       jnz .read_mem
1159 hidnplayr 757
 
1198 clevermous 758
       popad
759
       mov eax, [r_count]
760
       ret
1159 hidnplayr 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
 
1198 clevermous 773
       locals
774
         slot   dd ?
775
         buff   dd ?
776
         w_count    dd ?
777
         offset dd ?
778
         tmp_w_cnt  dd ?
779
       endl
1159 hidnplayr 780
 
1198 clevermous 781
       mov [slot], eax
782
       mov [buff], ebx
783
       and [w_count], 0
784
       mov [tmp_w_cnt], ecx
785
       mov [offset], edx
1159 hidnplayr 786
 
1198 clevermous 787
       pushad
1159 hidnplayr 788
.read_mem:
1198 clevermous 789
       mov edx, [offset]
790
       mov ebx, [tmp_w_cnt]
1159 hidnplayr 791
 
1198 clevermous 792
       mov ecx, 0x400000
793
       and edx, 0x3FFFFF
794
       sub ecx, edx
795
       cmp ecx, ebx
796
       jbe @f
797
       mov ecx, ebx
1159 hidnplayr 798
@@:
1198 clevermous 799
       cmp ecx, 0x8000
800
       jna @F
801
       mov ecx, 0x8000
1159 hidnplayr 802
@@:
1198 clevermous 803
       mov eax, [slot]
804
       shl  eax,8
805
       mov ebx, [offset]
1159 hidnplayr 806
      ;     add ebx, new_app_base
1198 clevermous 807
       push ecx
808
       stdcall map_memEx, [proc_mem_map],\
809
                  [SLOT_BASE+eax+0xB8],\
810
                  ebx, ecx
811
       pop ecx
1159 hidnplayr 812
 
1198 clevermous 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
1159 hidnplayr 819
 
1198 clevermous 820
       add [w_count], edx
821
       add [offset], edx
822
       sub [tmp_w_cnt], edx
823
       jnz .read_mem
1159 hidnplayr 824
 
1198 clevermous 825
       popad
826
       mov eax, [w_count]
827
       ret
1159 hidnplayr 828
endp
829
 
830
align 4
831
proc new_sys_threads
1198 clevermous 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
1159 hidnplayr 840
 
1198 clevermous 841
       cmp eax,1
842
       jne .failed          ;other subfunctions
1159 hidnplayr 843
 
1198 clevermous 844
       xor  eax,eax
845
       mov [app_cmdline], eax
846
       mov [app_path], eax
847
       mov [app_eip], ebx
848
       mov [app_esp], ecx
1159 hidnplayr 849
 
1198 clevermous 850
       ;mov    esi,new_process_loading
851
       ;call   sys_msg_board_str
1159 hidnplayr 852
.wait_lock:
1198 clevermous 853
       cmp [application_table_status],0
854
       je .get_lock
855
       call   change_task
856
       jmp .wait_lock
1159 hidnplayr 857
 
858
.get_lock:
1198 clevermous 859
       mov eax, 1
860
       xchg eax, [application_table_status]
861
       cmp eax, 0
862
       jne .wait_lock
1159 hidnplayr 863
 
1198 clevermous 864
       call   set_application_table_status
1159 hidnplayr 865
 
1198 clevermous 866
       call get_new_process_place
867
       test eax, eax
868
       jz .failed
1159 hidnplayr 869
 
1198 clevermous 870
       mov [slot], eax
1159 hidnplayr 871
 
1198 clevermous 872
       mov    esi,[current_slot]
873
       mov    ebx,esi         ;ebx=esi - pointer to extended information about current thread
1159 hidnplayr 874
 
1198 clevermous 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
1159 hidnplayr 887
 
1198 clevermous 888
       mov eax,[ebx+APPDATA.heap_base]
889
       mov [edx+APPDATA.heap_base], eax
1159 hidnplayr 890
 
1198 clevermous 891
       mov ecx,[ebx+APPDATA.heap_top]
892
       mov [edx+APPDATA.heap_top], ecx
1159 hidnplayr 893
 
1198 clevermous 894
       mov eax,[ebx+APPDATA.mem_size]
895
       mov [edx+APPDATA.mem_size], eax
1159 hidnplayr 896
 
1198 clevermous 897
       mov ecx,[ebx+APPDATA.dir_table]
898
       mov [edx+APPDATA.dir_table],ecx  ;copy page directory
1159 hidnplayr 899
 
1198 clevermous 900
       lea eax, [app_cmdline]
901
       stdcall set_app_params ,[slot],eax,dword 0,\
902
                     dword 0,dword 0
1159 hidnplayr 903
 
1198 clevermous 904
       ;mov    esi,new_process_running
905
       ;call   sys_msg_board_str     ;output information about succefull startup
1159 hidnplayr 906
 
1198 clevermous 907
       mov    [application_table_status],0 ;unlock application_table_status mutex
908
       mov    eax,[process_number]  ;set result
909
       ret
1159 hidnplayr 910
.failed:
1198 clevermous 911
       mov    [application_table_status],0
912
       mov    eax,-1
913
       ret
1159 hidnplayr 914
endp
915
 
916
; param
917
;  ebx=mutex
918
 
919
align 4
920
wait_mutex:
1198 clevermous 921
;;Maxis use atomic bts for mutex 4.4.2009
922
       push eax
923
       push ebx
1159 hidnplayr 924
.do_wait:
1198 clevermous 925
           bts dword [ebx],0
926
           jnc .locked
927
       call change_task
928
       jmp .do_wait
929
.locked:
930
       pop ebx
931
       pop eax
932
       ret
1159 hidnplayr 933
 
1198 clevermous 934
EFL_IF      equ 0x0200
1159 hidnplayr 935
EFL_IOPL1   equ 0x1000
936
EFL_IOPL2   equ 0x2000
937
EFL_IOPL3   equ 0x3000
938
 
939
 
940
align 4
941
proc set_app_params stdcall,slot:dword, params:dword,\
1198 clevermous 942
            cmd_line:dword, app_path:dword, flags:dword
1159 hidnplayr 943
 
1198 clevermous 944
       locals
945
         pl0_stack dd ?
946
       endl
1159 hidnplayr 947
 
1198 clevermous 948
       stdcall kernel_alloc, RING0_STACK_SIZE+512
949
       mov [pl0_stack], eax
1159 hidnplayr 950
 
1198 clevermous 951
       lea edi, [eax+RING0_STACK_SIZE]
1159 hidnplayr 952
 
1198 clevermous 953
       mov eax, [slot]
954
       mov ebx, eax
1159 hidnplayr 955
 
1198 clevermous 956
       shl eax, 8
957
       mov [eax+SLOT_BASE+APPDATA.fpu_state], edi
958
       mov [eax+SLOT_BASE+APPDATA.exc_handler], 0
959
       mov [eax+SLOT_BASE+APPDATA.except_mask], 0
1159 hidnplayr 960
 
961
;set default io permission map
1198 clevermous 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)
1159 hidnplayr 966
 
1198 clevermous 967
       mov esi, fpu_data
968
       mov ecx, 512/4
969
       rep movsd
1159 hidnplayr 970
 
1198 clevermous 971
       cmp    ebx,[TASK_COUNT]
972
       jle    .noinc
973
       inc    dword [TASK_COUNT]       ;update number of processes
1159 hidnplayr 974
.noinc:
1198 clevermous 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
1159 hidnplayr 979
 
1198 clevermous 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
1159 hidnplayr 983
 
1198 clevermous 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
1159 hidnplayr 990
 
1198 clevermous 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
1159 hidnplayr 1000
 
1198 clevermous 1001
       shr ebx,3
1002
       mov eax, new_app_base
1003
       mov dword [CURRENT_TASK+ebx+0x10],eax
1159 hidnplayr 1004
 
1005
.add_command_line:
1198 clevermous 1006
       mov edx,[params]
1007
       mov edx,[edx]       ;app_cmdline
1008
       test edx,edx
1009
       jz @f           ;application doesn't need parameters
1159 hidnplayr 1010
 
1198 clevermous 1011
       mov     eax, edx
1012
       add     eax, 256
1013
       jc      @f
1159 hidnplayr 1014
 
1198 clevermous 1015
       cmp     eax, [SLOT_BASE+APPDATA.mem_size+ebx*8]
1016
       ja      @f
1159 hidnplayr 1017
 
1198 clevermous 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
1159 hidnplayr 1023
@@:
1198 clevermous 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
1159 hidnplayr 1034
@@:
1198 clevermous 1035
       mov    ebx,[slot]
1036
       mov    eax,ebx
1037
       shl    ebx,5
1038
       lea    ecx,[draw_data+ebx]  ;ecx - pointer to draw data
1159 hidnplayr 1039
 
1040
; set window state to 'normal' (non-minimized/maximized/rolled-up) state
1198 clevermous 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
1159 hidnplayr 1045
 
1198 clevermous 1046
       mov    [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function)
1159 hidnplayr 1047
 
1198 clevermous 1048
       inc    dword [process_number]
1049
       mov    eax,[process_number]
1050
       mov    [ebx+4],eax       ;set PID
1159 hidnplayr 1051
 
1052
;set draw data to full screen
1053
 
1198 clevermous 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
1159 hidnplayr 1060
 
1198 clevermous 1061
       mov ebx, [pl0_stack]
1062
       mov esi,[params]
1063
       lea ecx, [ebx+REG_EIP]
1064
       xor eax, eax
1159 hidnplayr 1065
 
1198 clevermous 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
1159 hidnplayr 1075
 
1198 clevermous 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
1159 hidnplayr 1080
 
1198 clevermous 1081
       mov eax, [esi+0x0C]       ;app_esp
1082
       mov [ebx+REG_APP_ESP], eax    ;app_stack
1083
       mov [ebx+REG_SS], dword app_data
1159 hidnplayr 1084
 
1198 clevermous 1085
       lea ecx, [ebx+REG_RET]
1086
       mov ebx, [slot]
1087
       shl ebx, 5
1088
       mov [ebx*8+SLOT_BASE+APPDATA.saved_esp], ecx
1159 hidnplayr 1089
 
1198 clevermous 1090
       xor  ecx, ecx    ; process state - running
1159 hidnplayr 1091
; set if debuggee
1198 clevermous 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
1159 hidnplayr 1097
.no_debug:
1198 clevermous 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
1159 hidnplayr 1102
endp
1103
 
1104
include "debug.inc"