Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
430 serge 1
; $Revision$
164 serge 2
 
3
align 4
4
proc alloc_page
5
 
6
           pushfd
7
           cli
8
           mov ebx, [page_start]
9
           mov ecx, [page_end]
10
.l1:
11
           bsf eax,[ebx];
12
           jnz .found
13
           add ebx,4
14
           cmp ebx, ecx
15
           jb .l1
16
           popfd
17
           xor eax,eax
18
           ret
19
.found:
20
           btr [ebx], eax
21
           mov [page_start],ebx
22
           sub ebx, sys_pgmap
254 serge 23
           lea eax, [eax+ebx*8]
164 serge 24
           shl eax, 12
25
           dec [pg_data.pages_free]
26
           popfd
27
           ret
28
endp
29
 
30
align 4
31
proc alloc_pages stdcall, count:dword
32
           pushfd
33
           cli
34
           mov eax, [count]
35
           add eax, 7
36
           shr eax, 3
37
           mov [count], eax
38
           cmp eax, [pg_data.pages_free]
39
           ja .fail
40
 
41
           mov ecx, [page_start]
42
           mov ebx, [page_end]
43
.find:
44
           mov edx, [count]
45
           mov edi, ecx
46
.match:
47
           cmp byte [ecx], 0xFF
48
           jne .next
49
           dec edx
50
           jz .ok
51
           inc ecx
52
           cmp ecx,ebx
53
           jb .match
54
.fail:     xor eax, eax
55
           popfd
56
           ret
57
.next:
58
           inc ecx
59
           cmp ecx, ebx
60
           jb .find
61
           popfd
62
           xor eax, eax
63
           ret
64
.ok:
65
           sub ecx, edi
66
           inc ecx
67
           mov esi, edi
68
           xor eax, eax
69
           rep stosb
70
           sub esi, sys_pgmap
71
           shl esi, 3+12
72
           mov eax, esi
73
           mov ebx, [count]
74
           shl ebx, 3
75
           sub [pg_data.pages_free], ebx
76
           popfd
77
           ret
78
endp
79
 
80
align 4
81
proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword
321 diamond 82
           push ebx
164 serge 83
           mov eax, [phis_addr]
84
           and eax, not 0xFFF
85
           or eax, [flags]
86
           mov ebx, [lin_addr]
87
           shr ebx, 12
365 serge 88
           mov [page_tabs+ebx*4], eax
164 serge 89
           mov eax, [lin_addr]
90
           invlpg [eax]
321 diamond 91
           pop ebx
164 serge 92
           ret
93
endp
94
 
95
align 4
281 serge 96
map_space:    ;not implemented
97
 
98
 
99
           ret
100
 
101
 
102
align 4
164 serge 103
proc free_page
104
;arg:  eax  page address
105
           pushfd
106
           cli
107
           shr eax, 12              ;page index
108
           mov ebx, sys_pgmap
109
           bts [ebx], eax           ;that's all!
291 serge 110
           cmc
328 serge 111
           adc [pg_data.pages_free], 0
164 serge 112
           shr eax, 3
113
           and eax, not 3           ;dword offset from page_map
114
           add eax, ebx
115
           cmp [page_start], eax
116
           ja @f
117
           popfd
118
           ret
119
@@:
120
           mov [page_start], eax
121
           popfd
122
           ret
123
endp
124
 
279 serge 125
; param
328 serge 126
;  eax= page base + page flags
281 serge 127
;  ebx= liear address
128
;  ecx= count
129
 
130
align 4
328 serge 131
commit_pages:
281 serge 132
 
328 serge 133
           test ecx, ecx
134
           jz .fail
281 serge 135
 
328 serge 136
           mov edi, ebx
137
           mov ebx, pg_data.pg_mutex
138
           call wait_mutex      ;ebx
139
 
140
           mov edx, 0x1000
141
           mov ebx, edi
142
           shr ebx, 12
143
@@:
365 serge 144
           mov [page_tabs+ebx*4], eax
328 serge 145
           invlpg [edi]
146
           add edi, edx
147
           add eax, edx
148
           inc ebx
149
           dec ecx
150
           jnz @B
151
           mov [pg_data.pg_mutex],ecx
152
.fail:
281 serge 153
           ret
154
 
328 serge 155
 
281 serge 156
; param
279 serge 157
;  eax= base
281 serge 158
;  ecx= count
279 serge 159
 
164 serge 160
align 4
279 serge 161
release_pages:
321 diamond 162
 
163
           pushad
279 serge 164
           mov ebx, pg_data.pg_mutex
165
           call wait_mutex      ;ebx
166
 
167
           mov esi, eax
168
           mov edi, eax
169
 
170
           shr esi, 10
365 serge 171
           add esi, page_tabs
328 serge 172
 
173
           mov ebp, [pg_data.pages_free]
279 serge 174
           mov ebx, [page_start]
175
           mov edx, sys_pgmap
176
@@:
177
           xor eax, eax
178
           xchg eax, [esi]
179
           invlpg [edi]
180
 
181
           test eax, 1
182
           jz .next
183
 
184
           shr eax, 12
185
           bts [edx], eax
291 serge 186
           cmc
328 serge 187
           adc ebp, 0
279 serge 188
           shr eax, 3
189
           and eax, -4
190
           add eax, edx
191
           cmp eax, ebx
192
           jae .next
193
 
194
           mov ebx, eax
195
.next:
196
           add edi, 0x1000
197
           add esi, 4
198
           dec ecx
199
           jnz @B
328 serge 200
           mov [pg_data.pages_free], ebp
279 serge 201
           and [pg_data.pg_mutex],0
321 diamond 202
           popad
279 serge 203
           ret
204
 
205
align 4
188 serge 206
proc map_page_table stdcall, lin_addr:dword, phis_addr:dword
321 diamond 207
           push ebx
164 serge 208
           mov ebx, [lin_addr]
209
           shr ebx, 22
210
           mov eax, [phis_addr]
211
           and eax, not 0xFFF
212
           or eax, PG_UW          ;+PG_NOCACHE
378 serge 213
           mov dword [master_tab+ebx*4], eax
164 serge 214
           mov eax, [lin_addr]
215
           shr eax, 10
365 serge 216
           add eax, page_tabs
164 serge 217
           invlpg [eax]
321 diamond 218
           pop ebx
164 serge 219
           ret
220
endp
221
 
222
align 4
223
proc init_LFB
378 serge 224
           locals
225
             pg_count dd ?
226
           endl
227
 
164 serge 228
           cmp dword [LFBAddress], -1
229
           jne @f
388 serge 230
           mov [BOOT_VAR+0x901c],byte 2
164 serge 231
           stdcall kernel_alloc, 0x280000
232
           mov [LFBAddress], eax
233
           ret
234
@@:
235
           test [SCR_MODE],word 0100000000000000b
211 serge 236
           jnz @f
388 serge 237
           mov [BOOT_VAR+0x901c],byte 2
211 serge 238
           ret
239
@@:
378 serge 240
           mov edx, LFB_BASE
241
           mov esi, [LFBAddress]
388 serge 242
           mov edi, 0x00800000
379 serge 243
           mov dword [exp_lfb+4], edx
214 serge 244
 
164 serge 245
           shr edi, 12
246
           mov [pg_count], edi
247
           shr edi, 10
248
 
249
           bt [cpu_caps], CAPS_PSE
250
           jnc .map_page_tables
251
           or esi, PG_LARGE+PG_UW
400 serge 252
           mov edx, sys_pgdir+(LFB_BASE shr 20)
164 serge 253
@@:
400 serge 254
           mov [edx], esi
378 serge 255
           add edx, 4
164 serge 256
           add esi, 0x00400000
257
           dec edi
258
           jnz @B
259
 
207 serge 260
           bt [cpu_caps], CAPS_PGE
261
           jnc @F
400 serge 262
           or dword [sys_pgdir+(LFB_BASE shr 20)], PG_GLOBAL
207 serge 263
@@:
378 serge 264
           mov dword [LFBAddress], LFB_BASE
164 serge 265
           mov eax, cr3       ;flush TLB
266
           mov cr3, eax
267
           ret
268
 
269
.map_page_tables:
270
 
271
@@:
272
           call alloc_page
378 serge 273
           stdcall map_page_table, edx, eax
388 serge 274
           add edx, 0x00400000
164 serge 275
           dec edi
276
           jnz @B
277
 
278
           mov eax, [LFBAddress]
378 serge 279
           mov edi, page_tabs + (LFB_BASE shr 10)
164 serge 280
           or eax, PG_UW
281
           mov ecx, [pg_count]
378 serge 282
           cld
388 serge 283
@@:
284
           stosd
285
           add eax, 0x1000
286
           dec ecx
287
           jnz @B
164 serge 288
 
378 serge 289
           mov dword [LFBAddress], LFB_BASE
164 serge 290
           mov eax, cr3       ;flush TLB
291
           mov cr3, eax
292
 
293
           ret
294
endp
295
 
296
align 4
297
proc new_mem_resize stdcall, new_size:dword
298
 
276 serge 299
           mov ebx, pg_data.pg_mutex
300
           call wait_mutex    ;ebx
164 serge 301
 
302
           mov edi, [new_size]
303
           add edi,4095
304
           and edi,not 4095
305
           mov [new_size], edi
306
 
427 serge 307
           mov edx,[current_slot]
308
           cmp [edx+APPDATA.heap_base],0
172 serge 309
           jne .exit
310
 
427 serge 311
           mov esi, [edx+APPDATA.mem_size]
164 serge 312
           add esi, 4095
313
           and esi, not 4095
314
 
315
           cmp edi, esi
316
           jae .expand
317
 
318
           shr edi, 12
319
           shr esi, 12
320
@@:
378 serge 321
           mov eax, [app_page_tabs+edi*4]
164 serge 322
           test eax, 1
323
           jz .next
378 serge 324
           mov dword [app_page_tabs+edi*4], 2
164 serge 325
           mov ebx, edi
326
           shl ebx, 12
327
           invlpg [ebx+std_application_base_address]
328
           call free_page
329
 
330
.next:     add edi, 1
331
           cmp edi, esi
332
           jb @B
333
 
334
.update_size:
427 serge 335
           mov     ebx, [new_size]
336
           call    update_mem_size
164 serge 337
 
338
           xor eax, eax
339
           dec [pg_data.pg_mutex]
340
           ret
341
.expand:
342
 
343
           push esi
344
           push edi
345
 
346
           add edi, 0x3FFFFF
347
           and edi, not(0x3FFFFF)
348
           add esi, 0x3FFFFF
349
           and esi, not(0x3FFFFF)
350
 
351
           cmp esi, edi
352
           jae .grow
353
 
354
           xchg esi, edi
355
 
356
@@:
357
           call alloc_page
358
           test eax, eax
359
           jz .exit
360
 
188 serge 361
           stdcall map_page_table, edi, eax
164 serge 362
 
363
           push edi
364
           shr edi, 10
365 serge 365
           add edi, page_tabs
164 serge 366
           mov ecx, 1024
367
           xor eax, eax
368
           cld
369
           rep stosd
370
           pop edi
371
 
372
           add edi, 0x00400000
373
           cmp edi, esi
374
           jb @B
375
.grow:
376
           pop edi
377
           pop esi
378
@@:
379
           call alloc_page
380
           test eax, eax
381
           jz .exit
382
           stdcall map_page,esi,eax,dword PG_UW
383
 
384
           push edi
385
           mov edi, esi
386
           xor eax, eax
387
           mov ecx, 1024
388
           cld
389
           rep stosd
390
           pop edi
391
 
392
           add esi, 0x1000
393
           cmp esi, edi
294 diamond 394
           jb  @B
164 serge 395
 
396
           jmp .update_size
397
.exit:
398
           xor eax, eax
399
           inc eax
400
           dec [pg_data.pg_mutex]
401
           ret
402
endp
403
 
294 diamond 404
update_mem_size:
427 serge 405
; in: edx = slot base
294 diamond 406
;     ebx = new memory size
407
; destroys eax,ecx,edx
408
 
427 serge 409
           mov    [APPDATA.mem_size+edx],ebx
294 diamond 410
;search threads and update
411
;application memory size infomation
427 serge 412
           mov    ecx,[APPDATA.dir_table+edx]
294 diamond 413
           mov    eax,2
414
 
415
.search_threads:
416
;eax = current slot
417
;ebx = new memory size
418
;ecx = page directory
419
           cmp    eax,[TASK_COUNT]
420
           jg     .search_threads_end
421
           mov    edx,eax
422
           shl    edx,5
423
           cmp    word [CURRENT_TASK+edx+TASKDATA.state],9 ;if slot empty?
424
           jz     .search_threads_next
425
           shl    edx,3
380 serge 426
           cmp    [SLOT_BASE+edx+APPDATA.dir_table],ecx     ;if it is our thread?
294 diamond 427
           jnz    .search_threads_next
380 serge 428
           mov    [SLOT_BASE+edx+APPDATA.mem_size],ebx     ;update memory size
294 diamond 429
.search_threads_next:
430
           inc    eax
431
           jmp    .search_threads
432
.search_threads_end:
433
           ret
434
 
285 serge 435
; param
436
;  eax= linear address
437
;
438
; retval
439
;  eax= phisical page address
440
 
164 serge 441
align 4
285 serge 442
get_pg_addr:
443
           shr eax, 12
365 serge 444
           mov eax, [page_tabs+eax*4]
164 serge 445
           and eax, 0xFFFFF000
446
           ret
447
 
418 serge 448
 
188 serge 449
align 4
164 serge 450
proc page_fault_handler
418 serge 451
 
452
        .err_code equ ebp+32
453
        .err_addr equ ebp-4
454
 
164 serge 455
           pushad
456
           mov ebp, esp
457
           mov eax, cr2
172 serge 458
           push eax
164 serge 459
 
427 serge 460
           mov ax, app_data
164 serge 461
           mov ds, ax
188 serge 462
           mov es, ax
164 serge 463
 
188 serge 464
           inc [pg_data.pages_faults]
465
 
427 serge 466
     push eax
467
     push edx
468
     mov edx, 0x400   ;bochs
469
     mov al,0xff      ;bochs
470
     out dx, al       ;bochs
471
     pop edx
472
     pop eax
473
 
418 serge 474
           mov ebx, [.err_addr]
419 serge 475
           mov eax, [.err_code]
164 serge 476
 
419 serge 477
           cmp ebx, OS_BASE
427 serge 478
           jb .user_space      ;ñòðàíèöà â ïàìÿòè ïðèëîæåíèÿ ;
164 serge 479
 
419 serge 480
           cmp ebx, page_tabs
481
           jb .kernel_space    ;ñòðàíèöà â ïàìÿòè ÿäðà
394 serge 482
 
419 serge 483
           cmp ebx, kernel_tabs
427 serge 484
           jb .alloc;.app_tabs ;òàáëèöû ñòðàíèö ïðèëîæåíèÿ ;
419 serge 485
                               ;ïðîñòî ñîçäàäèì îäíó
188 serge 486
 
419 serge 487
           cmp ebx, LFB_BASE
488
           jb .core_tabs       ;òàáëèöû ñòðàíèö ÿäðà
489
                               ;Îøèáêà
490
.lfb:
491
                               ;îáëàñòü LFB
492
                               ;Îøèáêà
493
           jmp .fail
378 serge 494
 
419 serge 495
align 4
496
.user_space:
497
           test eax, PG_MAP
498
           jnz .err_access     ;Ñòðàíèöà ïðèñóòñòâóåò
499
                               ;Îøèáêà äîñòóïà ?
395 serge 500
 
164 serge 501
           shr ebx, 12
172 serge 502
           mov ecx, ebx
503
           shr ecx, 10
504
           mov edx, [master_tab+ecx*4]
419 serge 505
           test edx, PG_MAP
506
           jz .fail            ;òàáëèöà ñòðàíèö íå ñîçäàíà
507
                               ;íåâåðíûé àäðåñ â ïðîãðàììå
172 serge 508
 
365 serge 509
           mov eax, [page_tabs+ebx*4]
164 serge 510
           test eax, 2
427 serge 511
           jz .fail            ;àäðåñ íå çàðåçåðâèðîâàí äëÿ ;
419 serge 512
                               ;èñïîëüçîâàíèÿ. Îøèáêà
188 serge 513
.alloc:
164 serge 514
           call alloc_page
515
           and eax, eax
419 serge 516
           jz .fail
164 serge 517
 
518
           stdcall map_page,[ebp-4],eax,dword PG_UW
519
 
188 serge 520
           mov edi, [ebp-4]
521
           and edi, 0xFFFFF000
164 serge 522
           mov ecx, 1024
523
           xor eax, eax
188 serge 524
           cld
525
           rep stosd
164 serge 526
.exit:
527
           mov esp, ebp
528
           popad
529
           add esp, 4
530
           iretd
419 serge 531
 
532
.err_access:
533
;íèêîãäà íå ïðîèñõîäèò
534
           jmp .fail
535
 
536
.kernel_space:
537
           test eax, PG_MAP
538
           jz .fail        ;ñòðàíèöà íå ïðèñóòñòâóåò
539
 
540
           test eax, 4     ;U/S
541
           jnz .fail       ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè
542
                           ;ÿäðà
543
           test eax, 8
544
           jnz .fail       ;óñòàíîâëåí çàðåçåðâèðîâàííûé áèò
545
                           ;â òàáëèöàõ ñòðàíèö. äîáàâëåíî â P4/Xeon
546
 
547
;ïîïûòêà çàïèñè â çàùèù¸ííóþ ñòðàíèöó ÿäðà
430 serge 548
 
549
           cmp ebx, tss._io_map_0
550
           jb .fail
551
 
552
           cmp ebx, tss._io_map_0+8192
553
           jae .fail
554
 
555
; io permission map
556
; copy-on-write protection
557
 
558
           call alloc_page
559
           and eax, eax
560
           jz .fail
561
 
562
           push eax
563
           stdcall map_page,[ebp-4],eax,dword PG_SW
564
           pop eax
565
           mov edi, [.err_addr]
566
           and edi, -4096
567
           lea esi, [edi+(not tss._io_map_0)+1]; -tss._io_map_0
568
 
569
           mov ebx, esi
570
           shr ebx, 12
571
           mov edx, [current_slot]
572
           or eax, PG_SW
573
           mov [edx+APPDATA.io_map+ebx*4], eax
574
 
575
           add esi, [default_io_map]
576
           mov ecx, 4096/4
577
           cld
578
           rep movsd
579
           jmp .exit
580
 
581
 
419 serge 582
;íå îáðàáàòûâàåì. Îøèáêà
583
 
584
.core_tabs:
172 serge 585
.fail:
586
           mov esp, ebp
587
           popad
588
           add esp, 4
388 serge 589
           iretd
164 serge 590
 
172 serge 591
           save_ring3_context     ;debugger support
592
 
593
           mov bl, 14
594
           jmp exc_c
595
           iretd
596
 
419 serge 597
;.kernel_space:
188 serge 598
;           shr ebx, 12
365 serge 599
;           mov eax, [page_tabs+ebx*4]
188 serge 600
;           shr ebx, 10
601
;           mov eax, [master_tab+ebx*4]
602
           jmp .exit
419 serge 603
;.old_addr:
188 serge 604
;           shr ebx, 12
365 serge 605
;           mov eax, [page_tabs+ebx*4]
188 serge 606
;           shr ebx, 10
607
;           mov eax, [master_tab+ebx*4]
608
           jmp .exit
419 serge 609
;.lfb_addr:
188 serge 610
;           shr ebx, 22
611
;           ;mov ecx, [sys_page_dir]
612
;           mov eax, [master_tab+ebx*4]
613
           jmp .exit
419 serge 614
;.tab_space:
188 serge 615
;           shr ebx, 12
365 serge 616
;           mov eax, [page_tabs+ebx*4]
188 serge 617
;           shr ebx, 10
618
;           ;mov ecx, [sys_page_dir]
619
;           mov eax, [master_tab+ebx*4]
419 serge 620
;           jmp .exit
164 serge 621
endp
622
 
623
align 4
624
proc map_mem stdcall, lin_addr:dword,pdir:dword,\
625
                      ofs:dword,buf_size:dword
626
           mov eax, [buf_size]
627
           test eax, eax
628
           jz .exit
629
 
630
           mov eax, [pdir]
631
           and eax, 0xFFFFF000
632
 
633
           stdcall map_page,[ipc_pdir],eax,dword PG_UW
634
           mov ebx, [ofs]
635
           shr ebx, 22
636
           mov esi, [ipc_pdir]
637
           mov edi, [ipc_ptab]
638
           mov eax, [esi+ebx*4]
639
           and eax, 0xFFFFF000
640
           test eax, eax
641
           jz .exit
642
           stdcall map_page,edi,eax,dword PG_UW
643
;           inc ebx
644
;           add edi, 0x1000
645
;           mov eax, [esi+ebx*4]
646
;           test eax, eax
647
;           jz @f
648
;          and eax, 0xFFFFF000
649
;           stdcall map_page, edi, eax
650
 
651
@@:        mov edi, [lin_addr]
652
           and edi, 0xFFFFF000
653
           mov ecx, [buf_size]
654
           add ecx, 4095
655
           shr ecx, 12
656
           inc ecx
657
 
658
           mov edx, [ofs]
659
           shr edx, 12
660
           and edx, 0x3FF
661
           mov esi, [ipc_ptab]
662
 
663
.map:      mov eax, [esi+edx*4]
664
           and eax, 0xFFFFF000
665
           test eax, eax
666
           jz .exit
667
           stdcall map_page,edi,eax,dword PG_UW
668
           add edi, 0x1000
669
           inc edx
670
           dec ecx
671
           jnz .map
672
 
673
.exit:
674
           ret
675
endp
676
 
677
align 4
678
proc map_memEx stdcall, lin_addr:dword,pdir:dword,\
679
                        ofs:dword,buf_size:dword
680
           mov eax, [buf_size]
681
           test eax, eax
682
           jz .exit
683
 
684
           mov eax, [pdir]
685
           and eax, 0xFFFFF000
686
 
687
           stdcall map_page,[proc_mem_pdir],eax,dword PG_UW
688
           mov ebx, [ofs]
689
           shr ebx, 22
690
           mov esi, [proc_mem_pdir]
691
           mov edi, [proc_mem_tab]
692
           mov eax, [esi+ebx*4]
693
           and eax, 0xFFFFF000
694
           test eax, eax
695
           jz .exit
696
           stdcall map_page,edi,eax,dword PG_UW
697
 
698
@@:        mov edi, [lin_addr]
699
           and edi, 0xFFFFF000
700
           mov ecx, [buf_size]
701
           add ecx, 4095
702
           shr ecx, 12
703
           inc ecx
704
 
705
           mov edx, [ofs]
706
           shr edx, 12
707
           and edx, 0x3FF
708
           mov esi, [proc_mem_tab]
709
 
710
.map:      mov eax, [esi+edx*4]
711
;           and eax, 0xFFFFF000
712
;           test eax, eax
713
;           jz .exit
714
           stdcall map_page,edi,eax,dword PG_UW
715
           add edi, 0x1000
716
           inc edx
717
           dec ecx
718
           jnz .map
719
.exit:
720
           ret
721
endp
722
 
723
 
724
 
725
 
726
sys_IPC:
727
;input:
728
;  eax=1 - set ipc buffer area
729
;    ebx=address of buffer
730
;    ecx=size of buffer
731
;  eax=2 - send message
732
;    ebx=PID
733
;    ecx=address of message
734
;    edx=size of message
735
 
736
           cmp  eax,1
737
           jne @f
738
           call set_ipc_buff
739
           mov [esp+36], eax
740
           ret
741
@@:
742
           cmp eax, 2
743
           jne @f
744
           stdcall sys_ipc_send, ebx, ecx, edx
745
           mov [esp+36], eax
746
           ret
747
@@:
748
           xor eax, eax
749
           not eax
750
           mov [esp+36], eax
751
           ret
752
 
753
align 4
754
proc set_ipc_buff
755
 
427 serge 756
           mov  eax,[current_slot]
164 serge 757
           pushf
758
           cli
427 serge 759
           mov  [eax+APPDATA.ipc_start],ebx     ;set fields in extended information area
760
           mov  [eax+APPDATA.ipc_size],ecx
164 serge 761
 
762
           add ecx, ebx
763
           add ecx, 4095
764
           and ecx, not 4095
765
 
766
.touch:    mov eax, [ebx]
767
           add ebx, 0x1000
768
           cmp ebx, ecx
769
           jna .touch
770
 
771
           popf
772
           xor eax, eax
773
           ret
774
endp
775
 
776
proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
777
           locals
778
             dst_slot   dd ?
779
             dst_offset dd ?
780
             buf_size   dd ?
781
           endl
782
 
783
           pushf
784
           cli
785
 
786
           mov  eax, [PID]
787
           call pid_to_slot
788
           test eax,eax
789
           jz   .no_pid
790
 
791
           mov [dst_slot], eax
792
           shl  eax,8
380 serge 793
           mov  edi,[eax+SLOT_BASE+0xa0]  ;is ipc area defined?
164 serge 794
           test edi,edi
795
           jz   .no_ipc_area
796
 
797
           mov ebx, edi
419 serge 798
       ;    add edi, new_app_base
164 serge 799
           and ebx, 0xFFF
800
           mov [dst_offset], ebx
801
 
380 serge 802
           mov esi, [eax+SLOT_BASE+0xa4]
164 serge 803
           mov [buf_size], esi
804
 
380 serge 805
           stdcall map_mem, [ipc_tmp], [SLOT_BASE+eax+0xB8],\
164 serge 806
                             edi, esi
807
 
808
           mov edi, [dst_offset]
809
           add edi, [ipc_tmp]
810
           cmp dword [edi], 0
811
           jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
227 serge 812
 
164 serge 813
           mov ebx, dword [edi+4]
814
           mov edx, ebx
815
           add ebx, 8
816
           add ebx, [msg_size]
817
           cmp ebx, [buf_size]
818
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
227 serge 819
 
164 serge 820
           mov dword [edi+4], ebx
821
           mov eax,[TASK_BASE]
822
           mov eax, [eax+0x04]         ;eax - our PID
823
           mov edi, [dst_offset]
824
           add edi, [ipc_tmp]
825
           add edi, edx
826
           mov [edi], eax
827
           mov ecx, [msg_size]
828
 
829
           mov [edi+4], ecx
830
           add edi, 8
831
           mov esi, [msg_addr]
419 serge 832
       ;    add esi, new_app_base
164 serge 833
           cld
834
           rep movsb
835
 
836
           mov ebx, [ipc_tmp]
837
           mov edx, ebx
838
           shr ebx, 12
839
           xor eax, eax
365 serge 840
           mov [page_tabs+ebx*4], eax
164 serge 841
           invlpg [edx]
842
 
843
           mov ebx, [ipc_pdir]
844
           mov edx, ebx
845
           shr ebx, 12
846
           xor eax, eax
365 serge 847
           mov [page_tabs+ebx*4], eax
164 serge 848
           invlpg [edx]
849
 
850
           mov ebx, [ipc_ptab]
851
           mov edx, ebx
852
           shr ebx, 12
853
           xor eax, eax
365 serge 854
           mov [page_tabs+ebx*4], eax
164 serge 855
           invlpg [edx]
856
 
857
           mov  eax, [dst_slot]
858
           shl eax, 8
380 serge 859
           or   [eax+SLOT_BASE+0xA8],dword 0x40
164 serge 860
           cmp  dword [check_idle_semaphore],20
861
           jge  .ipc_no_cis
862
 
863
           mov  dword [check_idle_semaphore],5
864
.ipc_no_cis:
865
           popf
866
           xor eax, eax
867
           ret
868
.no_pid:
869
           popf
870
           mov  eax, 4
871
           ret
872
.no_ipc_area:
873
           popf
874
           xor eax, eax
875
           inc eax
876
           ret
877
.ipc_blocked:
878
           popf
879
           mov  eax, 2
880
           ret
881
.buffer_overflow:
882
           popf
883
           mov  eax, 3
884
           ret
885
endp
886
 
887
align 4
170 serge 888
sysfn_meminfo:
164 serge 889
 
419 serge 890
        ;   add ebx, new_app_base
891
           cmp ebx, OS_BASE
892
           jae .fail
172 serge 893
 
164 serge 894
           mov eax, [pg_data.pages_count]
170 serge 895
           mov [ebx], eax
172 serge 896
           shl eax, 12
897
           mov [esp+36], eax
170 serge 898
           mov ecx, [pg_data.pages_free]
899
           mov [ebx+4], ecx
900
           mov edx, [pg_data.pages_faults]
901
           mov [ebx+8], edx
902
           mov esi, [heap_size]
903
           mov [ebx+12], esi
904
           mov edi, [heap_free]
905
           mov [ebx+16], edi
906
           mov eax, [heap_blocks]
907
           mov [ebx+20], eax
908
           mov ecx, [free_blocks]
909
           mov [ebx+24], ecx
164 serge 910
           ret
172 serge 911
.fail:
912
           mov dword [esp+36], -1
913
           ret
164 serge 914
 
915
align 4
916
new_services:
917
 
918
           cmp  eax,4
919
           jle  sys_sheduler
920
 
170 serge 921
           cmp eax, 11
164 serge 922
           jb .fail
923
           ja @f
924
 
188 serge 925
           call init_heap
164 serge 926
           mov [esp+36], eax
927
           ret
928
@@:
929
           cmp eax, 12
930
           ja @f
931
 
932
           stdcall user_alloc, ebx
933
           mov [esp+36], eax
934
           ret
935
@@:
936
           cmp eax, 13
937
           ja @f
938
           stdcall user_free, ebx
939
           mov [esp+36], eax
940
           ret
941
@@:
942
           cmp eax, 14
943
           ja @f
419 serge 944
           cmp ebx, OS_BASE
945
           jae .fail
227 serge 946
           stdcall get_event_ex, ebx, ecx
947
           mov [esp+36], eax
164 serge 948
           ret
949
@@:
950
           cmp eax, 15
951
           ja @f
427 serge 952
           mov ecx, [current_slot]
953
           mov eax, [ecx+APPDATA.fpu_handler]
954
           mov [ecx+APPDATA.fpu_handler], ebx
164 serge 955
           mov [esp+36], eax
956
           ret
957
@@:
958
           cmp eax, 16
959
           ja @f
960
 
188 serge 961
           test ebx, ebx
962
           jz .fail
419 serge 963
           cmp ebx, OS_BASE
964
           jae .fail
164 serge 965
           stdcall get_service, ebx
966
           mov [esp+36], eax
967
           ret
968
@@:
969
           cmp eax, 17
970
           ja @f
378 serge 971
           call srv_handlerEx   ;ebx
164 serge 972
           mov [esp+36], eax
973
           ret
168 serge 974
@@:
975
           cmp eax, 18
976
           ja @f
427 serge 977
           mov ecx, [current_slot]
978
           mov eax, [ecx+APPDATA.sse_handler]
979
           mov [ecx+APPDATA.sse_handler], ebx
168 serge 980
           mov [esp+36], eax
981
           ret
164 serge 982
@@:
198 serge 983
           cmp eax, 19
227 serge 984
           ja .fail
419 serge 985
      ;     add ebx, new_app_base
986
           cmp ebx, OS_BASE
987
           jae .fail
198 serge 988
           stdcall load_library, ebx
989
           mov [esp+36], eax
990
           ret
227 serge 991
 
164 serge 992
.fail:
993
           xor eax, eax
994
           mov [esp+36], eax
995
           ret
996
 
997
align 4
998
proc init_mtrr
999
 
388 serge 1000
           cmp [BOOT_VAR+0x901c],byte 2
164 serge 1001
           je  .exit
1002
 
211 serge 1003
           bt [cpu_caps], CAPS_MTRR
1004
           jnc .exit
1005
 
164 serge 1006
           mov eax, cr0
1007
           or eax, 0x60000000   ;disable caching
1008
           mov cr0, eax
1009
           wbinvd               ;invalidate cache
1010
 
1011
           mov ecx, 0x2FF
1012
           rdmsr                ;
1013
           push eax
1014
 
1015
           xor edx, edx
1016
           xor eax, eax
1017
           mov ecx, 0x2FF
1018
           wrmsr                ;disable all MTRR
1019
 
1020
           stdcall set_mtrr, dword 0,dword 0,[MEM_AMOUNT],MEM_WB
1021
           stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
1022
           xor edx, edx
1023
           xor eax, eax
1024
           mov ecx, 0x204
1025
           mov ebx, 6
1026
@@:
1027
           wrmsr                ;disable unused MTRR
1028
           inc ecx
1029
           wrmsr
1030
           inc ecx
1031
           dec ebx
1032
           jnz @b
1033
 
1034
           wbinvd               ;again invalidate
1035
 
1036
           pop eax
1037
           or eax, 0x800        ;set default memtype to UC
1038
           and al, 0xF0
1039
           mov ecx, 0x2FF
1040
           wrmsr                ;and enable MTRR
1041
 
1042
           mov eax, cr0
1043
           and eax, not 0x60000000
1044
           mov cr0, eax         ; enable caching
1045
.exit:
1046
           ret
1047
endp
1048
 
1049
align 4
1050
proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
1051
 
1052
           xor edx, edx
1053
           mov eax, [base]
1054
           or eax, [mem_type]
1055
           mov ecx, [reg]
1056
           lea ecx, [0x200+ecx*2]
1057
           wrmsr
1058
 
1059
           mov ebx, [size]
1060
           dec ebx
1061
           mov eax, 0xFFFFFFFF
1062
           mov edx, 0x0000000F
1063
           sub eax, ebx
1064
           sbb edx, 0
1065
           or eax, 0x800
1066
           inc ecx
1067
           wrmsr
1068
           ret
1069
endp
1070
 
388 serge 1071
 
172 serge 1072
align 4
388 serge 1073
proc strncmp stdcall, str1:dword, str2:dword, count:dword
1074
 
1075
          mov ecx,[count]
1076
          jecxz .end
1077
 
1078
          mov ebx,ecx
1079
 
1080
          mov edi,[str1]
1081
          mov esi,edi
1082
          xor eax,eax
1083
          repne scasb
1084
          neg ecx             ; cx = count - strlen
1085
          add ecx,ebx         ; strlen + count - strlen
1086
 
1087
.okay:
1088
          mov edi,esi
1089
          mov esi,[str2]
1090
          repe cmpsb
1091
          mov al,[esi-1]
1092
          xor ecx,ecx
1093
 
1094
          cmp al,[edi-1]
1095
          ja .str2_big
1096
          je .end
1097
 
1098
.str1_big:
1099
          sub ecx,2
1100
 
1101
.str2_big:
1102
          not ecx
1103
.end:
1104
          mov eax,ecx
1105
          ret
1106
endp
1107
 
1108
align 4
172 serge 1109
proc stall stdcall, delay:dword
1110
           push ecx
1111
           push edx
1112
           push ebx
1113
           push eax
1114
 
1115
           mov eax, [delay]
1116
           mul [stall_mcs]
1117
           mov ebx, eax       ;low
1118
           mov ecx, edx       ;high
1119
           rdtsc
1120
           add ebx, eax
1121
           adc ecx,edx
1122
@@:
1123
           rdtsc
1124
           sub eax, ebx
1125
           sbb edx, ecx
1126
           jb @B
1127
 
1128
           pop eax
1129
           pop ebx
1130
           pop edx
1131
           pop ecx
1132
           ret
1133
endp
1134
 
164 serge 1135
align 4
237 serge 1136
k_strrchr:
1137
        push eax
1138
        xor eax,eax
1139
        or  ecx,-1
1140
        repne scasb
1141
        add ecx,1
1142
        neg ecx
1143
        sub edi,1
1144
        pop eax
1145
        std
1146
        repne scasb
1147
        cld
1148
        add edi,1
1149
 
1150
        cmp [edi],al
1151
        jne @F
1152
        mov eax,edi
1153
        ret
1154
@@:
1155
        xor eax,eax
1156
        ret
1157
 
1158
align 4
1159
proc k_strncpy stdcall, dest:dword, src:dword, maxlen:dword
1160
        mov eax, [dest]
1161
        mov esi, [src]
1162
        mov ecx, [maxlen]
1163
        test eax, eax
1164
        jz .L9
1165
        test esi, esi
1166
        jz .L9
1167
        test ecx, ecx
1168
        jz .L9
1169
 
1170
        sub  esi, eax
1171
        jmp .L1
1172
 
1173
align 4
1174
.L2:
1175
        mov edx, [esi+eax]
1176
        mov [eax], dl
1177
        test dl, dl
1178
        jz .L7
1179
 
1180
        mov [eax+1], dh
1181
        test dh, dh
1182
        jz .L6
1183
 
1184
        shr edx, 16
1185
        mov [eax+2],dl
1186
        test dl, dl
1187
        jz .L5
1188
 
1189
        mov [eax+3], dh
1190
        test dh, dh
1191
        jz .L4
1192
        add eax, 4
1193
.L1:
1194
        sub ecx, 4
1195
        jae .L2
1196
 
1197
        add ecx, 4
1198
        jz .L9
1199
 
1200
        mov dl, [eax+esi]
1201
        mov [eax], dl
1202
        test dl, dl
1203
        jz .L3
1204
 
1205
        inc eax
1206
        dec ecx
1207
        jz .L9
1208
 
1209
        mov dl, [eax+esi]
1210
        mov [eax], dl
1211
        test dl, dl
1212
        jz .L3
1213
 
1214
        inc eax
1215
        dec ecx
1216
        jz .L9
1217
 
1218
        mov dl, [eax+esi]
1219
        mov [eax], dl
1220
        test dl, dl
1221
        jz .L3
1222
 
1223
        inc eax
1224
        jmp .L9
1225
 
1226
.L4:    dec ecx
1227
        inc eax
1228
 
1229
.L5:    dec ecx
1230
        inc eax
1231
 
1232
.L6:    dec ecx
1233
        inc eax
1234
.L7:
1235
        add ecx,3
1236
        jz .L9
1237
.L8:
1238
        mov byte [ecx+eax], 0
1239
.L3:
1240
        dec ecx
1241
        jnz .L8
1242
.L9:
1243
	ret
1244
endp
1245
 
1246
if 0
1247
 
1248
magic equ 0xfefefeff
1249
 
1250
k_strlen:
1251
        mov eax,[esp+4]
1252
        mov edx, 3
1253
 
1254
        and edx, eax
1255
        jz .L1
1256
        jp .L0
1257
 
1258
        cmp dh, byte [eax]
1259
        je .L2
1260
 
1261
        inc eax
1262
        cmp dh, byte [eax]
1263
 
1264
        je .L2
1265
 
1266
        inc eax
1267
        xor edx, 2
1268
 
1269
        jz .L1
1270
.L0:
1271
        cmp dh, [eax]
1272
        je .L2
1273
 
1274
        inc eax
1275
        xor edx, edx
1276
 
1277
.L1:
1278
        mov ecx, [eax]
1279
        add eax, 4
1280
 
1281
        sub edx, ecx
1282
        add ecx, magic
1283
 
1284
        dec edx
1285
        jnc .L3
1286
 
1287
        xor edx, ecx
1288
        and edx, not magic
1289
        jne .L3
1290
 
1291
        mov ecx, [eax]
1292
        add eax, 4
1293
 
1294
        sub edx, ecx
1295
        add ecx, magic
1296
        dec edx
1297
        jnc .L3
1298
 
1299
        xor edx, ecx
1300
        and edx, not magic
1301
        jne .L3
1302
 
1303
        mov ecx, [eax]
1304
        add eax, 4
1305
 
1306
        sub edx, ecx
1307
        add ecx, magic
1308
 
1309
        dec edx
1310
        jnc .L3
1311
 
1312
        xor edx, ecx
1313
 
1314
        and edx, not magic
1315
        jne .L3
1316
 
1317
        mov ecx, [eax]
1318
        add eax, 4
1319
 
1320
        sub edx, ecx
1321
        add ecx, magic
1322
 
1323
        dec edx
1324
        jnc .L3
1325
 
1326
        xor edx, ecx
1327
 
1328
        and edx, not magic
1329
        je .L1
1330
 
1331
.L3:    sub eax ,4
1332
        sub ecx, magic
1333
 
1334
        cmp cl, 0
1335
        jz .L2
1336
 
1337
        inc eax
1338
        test ch, ch
1339
        jz .L2
1340
 
1341
        shr ecx, 16
1342
        inc eax
1343
 
1344
        cmp cl,0
1345
        jz .L2
1346
 
1347
        inc eax
1348
 
1349
.L2:
1350
        sub eax, [esp+4]
1351
	ret
1352
 
1353
end if
388 serge 1354
 
1355
if 0
1356
     push eax
1357
     push edx
420 serge 1358
     mov edx, 0x400   ;bochs
1359
     mov al,0xff      ;bochs
1360
     out dx, al       ;bochs
388 serge 1361
     pop edx
1362
     pop eax
1363
end if
1364