Subversion Repositories Kolibri OS

Rev

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

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