Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
164 serge 1
 
212 serge 2
164 serge 3
 
4
proc mem_test
5
214 serge 6
 
164 serge 7
           and eax, not (CR0_CD+CR0_NW)
212 serge 8
           or eax, CR0_CD         ;disable caching
214 serge 9
           mov cr0, eax
164 serge 10
           wbinvd                 ;invalidate cache
214 serge 11
164 serge 12
 
214 serge 13
           mov ebx, 'TEST'
164 serge 14
@@:
15
           add edi, 0x400000
16
           xchg ebx, dword [edi]
17
           cmp dword [edi], 'TEST'
18
           xchg ebx, dword [edi]
19
           je @b
20
21
 
212 serge 22
           mov cr0, eax
164 serge 23
           mov eax, edi
24
           mov [LFBSize], 0x00800000
214 serge 25
           ret
164 serge 26
endp
27
28
 
29
proc init_memEx
30
           xor eax, eax
31
           mov edi, sys_pgdir
32
           mov ecx, 2048
33
           rep stosd
34
35
 
36
           jnc .no_PSE
37
38
 
39
           or ebx, CR4_PSE
40
           mov eax, PG_LARGE+PG_SW
41
           bt [cpu_caps], CAPS_PGE
42
           jnc @F
43
           or eax, PG_GLOBAL
44
           or ebx, CR4_PGE
45
@@:
46
           mov cr4, ebx
168 serge 47
48
 
164 serge 49
           add eax, 0x00400000
50
           mov dword [sys_pgdir+4], eax
51
           add eax, 0x00400000
52
           mov dword [sys_pgdir+8], eax
53
54
 
188 serge 55
164 serge 56
 
57
           sub ecx, 3 ;4
212 serge 58
           mov eax, tmp_page_tab+PG_SW
164 serge 59
           mov edi, sys_pgdir+12     ;16
212 serge 60
164 serge 61
 
62
.no_PSE:
63
           mov eax, PG_SW
64
           mov esi, tmp_page_tab
65
           mov ecx, 3072/4;  4096/4      ;0x0 - 0x00FFFFFF
212 serge 66
.map_low:
164 serge 67
           mov [esi], eax
68
           add eax, 0x1000
69
           mov [esi+4], eax
70
           add eax, 0x1000
71
           mov [esi+8], eax
72
           add eax, 0x1000
73
           mov [esi+12], eax
74
           add eax, 0x1000
75
           add esi, 16
76
           dec ecx
77
           jnz .map_low            ;ядро
78
79
 
80
           mov eax, tmp_page_tab+PG_SW
81
           mov edi, sys_pgdir
82
83
 
84
85
 
86
           add eax, 0x1000
87
           add edi, 4
88
           dec ecx
89
           jnz .map_kernel_tabs
90
91
 
92
           bt [cpu_caps], CAPS_PSE
93
           jc @F
94
           add edi, 3072*4    ;4096*4  ;skip low kernel memory
212 serge 95
@@:
164 serge 96
           mov ecx, [pg_data.kernel_tables]
97
           sub ecx, 3
212 serge 98
           shl ecx, 10
164 serge 99
           xor eax, eax
100
           cld
101
           rep stosd
102
103
 
188 serge 104
105
 
164 serge 106
endp
107
108
 
109
proc init_page_map
110
           mov edi, sys_pgmap
111
           mov ecx, 384/4
212 serge 112
           xor eax,eax
164 serge 113
           cld
114
           rep stosd
115
116
 
117
           mov ecx, [pg_data.pagemap_size]
118
           sub ecx, 384
212 serge 119
           shr ecx, 2
164 serge 120
           rep stosd
121
122
 
212 serge 123
           mov edx, [pg_data.pages_count]
164 serge 124
           mov ecx, [pg_data.kernel_tables]
125
           bt [cpu_caps], CAPS_PSE
126
           jnc @f
127
           sub ecx, 3
212 serge 128
@@:
164 serge 129
           sub edx, 3072
212 serge 130
           sub edx, ecx
164 serge 131
           mov [pg_data.pages_free], edx
132
133
 
134
           mov ebx, ecx
135
           shr ecx, 5
136
           rep stosd
137
138
 
139
           mov ecx, ebx
140
           and ecx, 31
141
           shl eax, cl
142
           stosd
143
144
 
212 serge 145
           mov ebx, sys_pgmap
164 serge 146
           add ebx, [pg_data.pagemap_size]
147
           mov [page_end], ebx
148
149
 
150
151
 
152
endp
153
154
 
155
proc alloc_page
156
157
 
158
           cli
159
           mov ebx, [page_start]
160
           mov ecx, [page_end]
161
.l1:
162
           bsf eax,[ebx];
163
           jnz .found
164
           add ebx,4
165
           cmp ebx, ecx
166
           jb .l1
167
           popfd
168
           xor eax,eax
169
           ret
170
.found:
171
           btr [ebx], eax
172
           mov [page_start],ebx
173
           sub ebx, sys_pgmap
174
           lea eax, [eax+ebx*8]
254 serge 175
           shl eax, 12
164 serge 176
           dec [pg_data.pages_free]
177
           popfd
178
           ret
179
endp
180
181
 
182
proc alloc_pages stdcall, count:dword
183
           pushfd
184
           cli
185
           mov eax, [count]
186
           add eax, 7
187
           shr eax, 3
188
           mov [count], eax
189
           cmp eax, [pg_data.pages_free]
190
           ja .fail
191
192
 
193
           mov ebx, [page_end]
194
.find:
195
           mov edx, [count]
196
           mov edi, ecx
197
.match:
198
           cmp byte [ecx], 0xFF
199
           jne .next
200
           dec edx
201
           jz .ok
202
           inc ecx
203
           cmp ecx,ebx
204
           jb .match
205
.fail:     xor eax, eax
206
           popfd
207
           ret
208
.next:
209
           inc ecx
210
           cmp ecx, ebx
211
           jb .find
212
           popfd
213
           xor eax, eax
214
           ret
215
.ok:
216
           sub ecx, edi
217
           inc ecx
218
           mov esi, edi
219
           xor eax, eax
220
           rep stosb
221
           sub esi, sys_pgmap
222
           shl esi, 3+12
223
           mov eax, esi
224
           mov ebx, [count]
225
           shl ebx, 3
226
           sub [pg_data.pages_free], ebx
227
           popfd
228
           ret
229
endp
230
231
 
232
proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword
233
           mov eax, [phis_addr]
234
           and eax, not 0xFFF
235
           or eax, [flags]
236
           mov ebx, [lin_addr]
237
           shr ebx, 12
238
           mov [pages_tab+ebx*4], eax
239
           mov eax, [lin_addr]
240
           invlpg [eax]
241
           ret
242
endp
243
244
 
245
map_space:    ;not implemented
281 serge 246
247
 
248
 
249
250
 
251
 
252
proc free_page
164 serge 253
;arg:  eax  page address
254
           pushfd
255
           cli
256
           inc [pg_data.pages_free]
257
           shr eax, 12              ;page index
258
           mov ebx, sys_pgmap
259
           bts [ebx], eax           ;that's all!
260
           shr eax, 3
261
           and eax, not 3           ;dword offset from page_map
262
           add eax, ebx
263
           cmp [page_start], eax
264
           ja @f
265
           popfd
266
           ret
267
@@:
268
           mov [page_start], eax
269
           popfd
270
           ret
271
endp
272
273
 
279 serge 274
;  eax= page base
281 serge 275
;  ebx= liear address
276
;  ecx= count
277
278
 
279
commit_pages:   ;not implemented
280
281
 
282
 
283
284
 
285
;  eax= base
279 serge 286
;  ecx= count
281 serge 287
279 serge 288
 
164 serge 289
release_pages:
279 serge 290
291
 
292
           call wait_mutex      ;ebx
293
294
 
295
           mov edi, eax
296
297
 
298
           add esi, pages_tab
299
300
 
301
           mov edx, sys_pgmap
302
@@:
303
           xor eax, eax
304
           xchg eax, [esi]
305
           invlpg [edi]
306
307
 
308
           jz .next
309
310
 
311
           bts [edx], eax
312
           inc [pg_data.pages_free]
313
           shr eax, 3
314
           and eax, -4
315
           add eax, edx
316
           cmp eax, ebx
317
           jae .next
318
319
 
320
.next:
321
           add edi, 0x1000
322
           add esi, 4
323
           dec ecx
324
           jnz @B
325
326
 
327
           ret
328
329
 
330
proc map_page_table stdcall, lin_addr:dword, phis_addr:dword
188 serge 331
           mov ebx, [lin_addr]
164 serge 332
           shr ebx, 22
333
           mov eax, [phis_addr]
334
           and eax, not 0xFFF
335
           or eax, PG_UW          ;+PG_NOCACHE
336
           mov dword [current_pgdir+ebx*4], eax
188 serge 337
           mov eax, [lin_addr]
164 serge 338
           shr eax, 10
339
           add eax, pages_tab
340
           invlpg [eax]
341
           ret
342
endp
343
344
 
345
proc init_LFB
346
           cmp dword [LFBAddress], -1
347
           jne @f
348
           mov [0x2f0000+0x901c],byte 2
201 serge 349
           stdcall kernel_alloc, 0x280000
164 serge 350
           mov [LFBAddress], eax
351
           ret
352
@@:
353
           test [SCR_MODE],word 0100000000000000b
354
           jnz @f
211 serge 355
           mov [0x2f0000+0x901c],byte 2
356
           ret
357
@@:
358
           call map_LFB
164 serge 359
           ret
360
endp
361
362
 
363
proc map_LFB
364
           locals
365
             pg_count dd ?
366
           endl
367
368
 
369
           mov esi, [LFBAddress]
370
           mov dword [exp_lfb+4], esi
214 serge 371
372
 
164 serge 373
           mov [pg_count], edi
374
           shr edi, 10
375
376
 
377
           jnc .map_page_tables
378
           mov ebx, esi
379
           or esi, PG_LARGE+PG_UW
380
           shr ebx, 20
381
           mov ecx, ebx
382
@@:
383
           mov [sys_pgdir+ebx], esi
384
           add ebx, 4
385
           add esi, 0x00400000
386
           dec edi
387
           jnz @B
388
389
 
207 serge 390
           jnc @F
391
           or dword [sys_pgdir+ecx], PG_GLOBAL
164 serge 392
@@:
207 serge 393
           mov eax, cr3       ;flush TLB
164 serge 394
           mov cr3, eax
395
           ret
396
397
 
398
399
 
400
           call alloc_page
401
           stdcall map_page_table, esi, eax
188 serge 402
           add esi, 0x00400000
164 serge 403
           dec edi
404
           jnz @B
405
406
 
407
           mov esi, eax
408
           shr esi, 10
409
           add esi, pages_tab
410
           or eax, PG_UW
411
           mov ecx, [pg_count]
412
           shr ecx, 2
413
.map:
414
           mov [esi], eax
415
           add eax, 0x1000
416
           mov [esi+4], eax
417
           add eax, 0x1000
418
           mov [esi+8], eax
419
           add eax, 0x1000
420
           mov [esi+12], eax
421
           add eax, 0x1000
422
           add esi, 16
423
           sub ecx, 1
424
           jnz .map
425
426
 
427
           mov cr3, eax
428
429
 
430
endp
431
432
 
433
proc new_mem_resize stdcall, new_size:dword
434
435
 
276 serge 436
           call wait_mutex    ;ebx
437
164 serge 438
 
439
           add edi,4095
440
           and edi,not 4095
441
           mov [new_size], edi
442
443
 
444
           shl edx,8
445
           cmp [PROC_BASE+APPDATA.heap_base+edx],0
172 serge 446
           jne .exit
447
448
 
449
           add esi, 4095
164 serge 450
           and esi, not 4095
451
452
 
453
           jae .expand
454
455
 
456
           shr esi, 12
457
@@:
458
           mov eax, [pages_tab+0x00181000+edi*4]
459
           test eax, 1
460
           jz .next
461
           mov dword [pages_tab+0x00181000+edi*4], 2
462
           mov ebx, edi
463
           shl ebx, 12
464
           invlpg [ebx+std_application_base_address]
465
           call free_page
466
467
 
468
           cmp edi, esi
469
           jb @B
470
471
 
472
473
 
474
           mov    [PROC_BASE+0x8c+edx],ebx
475
476
 
477
;application memory size infomation
478
           mov    ecx,[PROC_BASE+0xb8+edx]
479
           mov    eax,2
480
481
 
482
;eax = current slot
483
;ebx = new memory size
484
;ecx = page directory
485
           cmp    eax,[TASK_COUNT]
486
           jg     .search_threads_end
487
           mov    edx,eax
488
           shl    edx,5
489
           cmp    word [CURRENT_TASK+edx+0xa],9 ;if slot empty?
490
           jz     .search_threads_next
491
           shl    edx,3
492
           cmp    [PROC_BASE+edx+0xb8],ecx     ;if it is our thread?
493
           jnz    .search_threads_next
494
           mov    [PROC_BASE+edx+0x8c],ebx     ;update memory size
495
.search_threads_next:
496
           inc    eax
497
           jmp    .search_threads
498
.search_threads_end:
499
           xor eax, eax
500
           dec [pg_data.pg_mutex]
501
           ret
502
503
 
504
           add edi, new_app_base
505
           add esi, new_app_base
506
507
 
508
           push edi
509
510
 
511
           and edi, not(0x3FFFFF)
512
           add esi, 0x3FFFFF
513
           and esi, not(0x3FFFFF)
514
515
 
516
           jae .grow
517
518
 
519
520
 
521
           call alloc_page
522
           test eax, eax
523
           jz .exit
524
525
 
188 serge 526
164 serge 527
 
528
           shr edi, 10
529
           add edi, pages_tab
530
           mov ecx, 1024
531
           xor eax, eax
532
           cld
533
           rep stosd
534
           pop edi
535
536
 
537
           cmp edi, esi
538
           jb @B
539
.grow:
540
           pop edi
541
           pop esi
542
@@:
543
           call alloc_page
544
           test eax, eax
545
           jz .exit
546
           stdcall map_page,esi,eax,dword PG_UW
547
548
 
549
           mov edi, esi
550
           xor eax, eax
551
           mov ecx, 1024
552
           cld
553
           rep stosd
554
           pop edi
555
556
 
557
           cmp esi, edi
558
           jna @B
559
560
 
561
.exit:
562
           xor eax, eax
563
           inc eax
564
           dec [pg_data.pg_mutex]
565
           ret
566
endp
567
568
 
569
proc get_pg_addr stdcall, lin_addr:dword
570
           mov ebx, [lin_addr]
571
           shr ebx, 12
572
           mov eax, [pages_tab+ebx*4]
573
           and eax, 0xFFFFF000
574
           ret
575
endp
576
577
 
188 serge 578
proc page_fault_handler
164 serge 579
           pushad
580
581
 
582
           mov eax, cr2
583
           push eax
172 serge 584
           push ds
164 serge 585
           push es
188 serge 586
164 serge 587
 
588
           mov ds, ax
589
           mov es, ax
188 serge 590
164 serge 591
 
188 serge 592
593
 
164 serge 594
595
 
596
           jae .lfb_addr
597
598
 
599
           jae .user_space
600
601
 
188 serge 602
           jae .alloc
603
604
 
164 serge 605
           jae .tab_space
606
607
 
608
609
 
610
           shr ebx, 12
611
           mov ecx, ebx
172 serge 612
           shr ecx, 10
613
           mov edx, [master_tab+ecx*4]
614
           test edx, 1
615
           jz .fail
616
617
 
164 serge 618
           test eax, 2
619
           jz .fail
172 serge 620
.alloc:
188 serge 621
           call alloc_page
164 serge 622
           and eax, eax
623
           jz .exit
624
625
 
626
627
 
188 serge 628
           and edi, 0xFFFFF000
629
           mov ecx, 1024
164 serge 630
           xor eax, eax
631
           cld
188 serge 632
           rep stosd
633
.exit:
164 serge 634
           pop es
188 serge 635
           pop ds
164 serge 636
           mov esp, ebp
637
           popad
638
           add esp, 4
639
           iretd
640
.fail:
172 serge 641
           pop es
188 serge 642
           pop ds
172 serge 643
           mov esp, ebp
644
           popad
645
           add esp, 4
646
164 serge 647
 
172 serge 648
649
 
650
           jmp exc_c
651
           iretd
652
653
 
164 serge 654
;           shr ebx, 12
188 serge 655
;           mov eax, [pages_tab+ebx*4]
656
;           shr ebx, 10
657
;           mov eax, [master_tab+ebx*4]
658
           jmp .exit
659
.old_addr:
164 serge 660
;           shr ebx, 12
188 serge 661
;           mov eax, [pages_tab+ebx*4]
164 serge 662
;           shr ebx, 10
188 serge 663
;           mov eax, [master_tab+ebx*4]
664
           jmp .exit
665
.lfb_addr:
164 serge 666
;           shr ebx, 22
188 serge 667
;           ;mov ecx, [sys_page_dir]
668
;           mov eax, [master_tab+ebx*4]
669
           jmp .exit
670
.tab_space:
164 serge 671
;           shr ebx, 12
188 serge 672
;           mov eax, [pages_tab+ebx*4]
164 serge 673
;           shr ebx, 10
188 serge 674
;           ;mov ecx, [sys_page_dir]
675
;           mov eax, [master_tab+ebx*4]
676
           jmp .exit
677
endp
164 serge 678
679
 
680
proc map_mem stdcall, lin_addr:dword,pdir:dword,\
681
                      ofs:dword,buf_size:dword
682
           mov eax, [buf_size]
683
           test eax, eax
684
           jz .exit
685
686
 
687
           and eax, 0xFFFFF000
688
689
 
690
           mov ebx, [ofs]
691
           shr ebx, 22
692
           mov esi, [ipc_pdir]
693
           mov edi, [ipc_ptab]
694
           mov eax, [esi+ebx*4]
695
           and eax, 0xFFFFF000
696
           test eax, eax
697
           jz .exit
698
           stdcall map_page,edi,eax,dword PG_UW
699
;           inc ebx
700
;           add edi, 0x1000
701
;           mov eax, [esi+ebx*4]
702
;           test eax, eax
703
;           jz @f
704
;          and eax, 0xFFFFF000
705
;           stdcall map_page, edi, eax
706
707
 
708
           and edi, 0xFFFFF000
709
           mov ecx, [buf_size]
710
           add ecx, 4095
711
           shr ecx, 12
712
           inc ecx
713
714
 
715
           shr edx, 12
716
           and edx, 0x3FF
717
           mov esi, [ipc_ptab]
718
719
 
720
           and eax, 0xFFFFF000
721
           test eax, eax
722
           jz .exit
723
           stdcall map_page,edi,eax,dword PG_UW
724
           add edi, 0x1000
725
           inc edx
726
           dec ecx
727
           jnz .map
728
729
 
730
           ret
731
endp
732
733
 
734
proc map_memEx stdcall, lin_addr:dword,pdir:dword,\
735
                        ofs:dword,buf_size:dword
736
           mov eax, [buf_size]
737
           test eax, eax
738
           jz .exit
739
740
 
741
           and eax, 0xFFFFF000
742
743
 
744
           mov ebx, [ofs]
745
           shr ebx, 22
746
           mov esi, [proc_mem_pdir]
747
           mov edi, [proc_mem_tab]
748
           mov eax, [esi+ebx*4]
749
           and eax, 0xFFFFF000
750
           test eax, eax
751
           jz .exit
752
           stdcall map_page,edi,eax,dword PG_UW
753
754
 
755
           and edi, 0xFFFFF000
756
           mov ecx, [buf_size]
757
           add ecx, 4095
758
           shr ecx, 12
759
           inc ecx
760
761
 
762
           shr edx, 12
763
           and edx, 0x3FF
764
           mov esi, [proc_mem_tab]
765
766
 
767
;           and eax, 0xFFFFF000
768
;           test eax, eax
769
;           jz .exit
770
           stdcall map_page,edi,eax,dword PG_UW
771
           add edi, 0x1000
772
           inc edx
773
           dec ecx
774
           jnz .map
775
.exit:
776
           ret
777
endp
778
779
 
780
 
781
 
782
 
783
;input:
784
;  eax=1 - set ipc buffer area
785
;    ebx=address of buffer
786
;    ecx=size of buffer
787
;  eax=2 - send message
788
;    ebx=PID
789
;    ecx=address of message
790
;    edx=size of message
791
792
 
793
           jne @f
794
           call set_ipc_buff
795
           mov [esp+36], eax
796
           ret
797
@@:
798
           cmp eax, 2
799
           jne @f
800
           stdcall sys_ipc_send, ebx, ecx, edx
801
           mov [esp+36], eax
802
           ret
803
@@:
804
           xor eax, eax
805
           not eax
806
           mov [esp+36], eax
807
           ret
808
809
 
810
proc set_ipc_buff
811
812
 
813
           shl  eax,8
814
           add  eax, PROC_BASE
815
           pushf
816
           cli
817
           mov  [eax+0xA0],ebx     ;set fields in extended information area
818
           mov  [eax+0xA4],ecx
819
820
 
821
           add ecx, ebx
822
           add ecx, 4095
823
           and ecx, not 4095
824
825
 
826
           add ebx, 0x1000
827
           cmp ebx, ecx
828
           jna .touch
829
830
 
831
           xor eax, eax
832
           ret
833
endp
834
835
 
836
           locals
837
             dst_slot   dd ?
838
             dst_offset dd ?
839
             buf_size   dd ?
840
           endl
841
842
 
843
           cli
844
845
 
846
           call pid_to_slot
847
           test eax,eax
848
           jz   .no_pid
849
850
 
851
           shl  eax,8
852
           mov  edi,[eax+PROC_BASE+0xa0]  ;is ipc area defined?
853
           test edi,edi
854
           jz   .no_ipc_area
855
856
 
857
           add edi, new_app_base
858
           and ebx, 0xFFF
859
           mov [dst_offset], ebx
860
861
 
862
           mov [buf_size], esi
863
864
 
865
                             edi, esi
866
867
 
868
           add edi, [ipc_tmp]
869
           cmp dword [edi], 0
870
           jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
871
227 serge 872
 
164 serge 873
           mov edx, ebx
874
           add ebx, 8
875
           add ebx, [msg_size]
876
           cmp ebx, [buf_size]
877
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
878
227 serge 879
 
164 serge 880
           mov eax,[TASK_BASE]
881
           mov eax, [eax+0x04]         ;eax - our PID
882
           mov edi, [dst_offset]
883
           add edi, [ipc_tmp]
884
           add edi, edx
885
           mov [edi], eax
886
           mov ecx, [msg_size]
887
888
 
889
           add edi, 8
890
           mov esi, [msg_addr]
891
           add esi, new_app_base
892
           cld
893
           rep movsb
894
895
 
896
           mov edx, ebx
897
           shr ebx, 12
898
           xor eax, eax
899
           mov [pages_tab+ebx*4], eax
900
           invlpg [edx]
901
902
 
903
           mov edx, ebx
904
           shr ebx, 12
905
           xor eax, eax
906
           mov [pages_tab+ebx*4], eax
907
           invlpg [edx]
908
909
 
910
           mov edx, ebx
911
           shr ebx, 12
912
           xor eax, eax
913
           mov [pages_tab+ebx*4], eax
914
           invlpg [edx]
915
916
 
917
           shl eax, 8
918
           or   [eax+PROC_BASE+0xA8],dword 0x40
919
           cmp  dword [check_idle_semaphore],20
920
           jge  .ipc_no_cis
921
922
 
923
.ipc_no_cis:
924
           popf
925
           xor eax, eax
926
           ret
927
.no_pid:
928
           popf
929
           mov  eax, 4
930
           ret
931
.no_ipc_area:
932
           popf
933
           xor eax, eax
934
           inc eax
935
           ret
936
.ipc_blocked:
937
           popf
938
           mov  eax, 2
939
           ret
940
.buffer_overflow:
941
           popf
942
           mov  eax, 3
943
           ret
944
endp
945
946
 
947
sysfn_meminfo:
170 serge 948
164 serge 949
 
170 serge 950
           cmp ebx, new_app_base
172 serge 951
           jb .fail
952
953
 
164 serge 954
           mov [ebx], eax
170 serge 955
           shl eax, 12
172 serge 956
           mov [esp+36], eax
957
           mov ecx, [pg_data.pages_free]
170 serge 958
           mov [ebx+4], ecx
959
           mov edx, [pg_data.pages_faults]
960
           mov [ebx+8], edx
961
           mov esi, [heap_size]
962
           mov [ebx+12], esi
963
           mov edi, [heap_free]
964
           mov [ebx+16], edi
965
           mov eax, [heap_blocks]
966
           mov [ebx+20], eax
967
           mov ecx, [free_blocks]
968
           mov [ebx+24], ecx
969
           ret
164 serge 970
.fail:
172 serge 971
           mov dword [esp+36], -1
972
           ret
973
164 serge 974
 
975
new_services:
976
977
 
978
           jle  sys_sheduler
979
980
 
170 serge 981
           jb .fail
164 serge 982
           ja @f
983
984
 
188 serge 985
           mov [esp+36], eax
164 serge 986
           ret
987
@@:
988
           cmp eax, 12
989
           ja @f
990
991
 
992
           mov [esp+36], eax
993
           ret
994
@@:
995
           cmp eax, 13
996
           ja @f
997
           add ebx, new_app_base
188 serge 998
           stdcall user_free, ebx
164 serge 999
           mov [esp+36], eax
1000
           ret
1001
@@:
1002
           cmp eax, 14
1003
           ja @f
1004
           add ebx, new_app_base
227 serge 1005
           cmp ebx, new_app_base
172 serge 1006
           jb .fail
1007
           stdcall get_event_ex, ebx, ecx
227 serge 1008
           mov [esp+36], eax
1009
           ret
164 serge 1010
@@:
1011
           cmp eax, 15
1012
           ja @f
1013
           mov ecx, [CURRENT_TASK]
1014
           shl ecx, 8
1015
           mov eax, [ecx+PROC_BASE+APPDATA.fpu_handler]
1016
           mov [ecx+PROC_BASE+APPDATA.fpu_handler], ebx
1017
           mov [esp+36], eax
1018
           ret
1019
@@:
1020
           cmp eax, 16
1021
           ja @f
1022
1023
 
188 serge 1024
           jz .fail
1025
           add ebx, new_app_base
164 serge 1026
           cmp ebx, new_app_base
172 serge 1027
           jb .fail
1028
           stdcall get_service, ebx
164 serge 1029
           mov [esp+36], eax
1030
           ret
1031
@@:
1032
           cmp eax, 17
1033
           ja @f
1034
           stdcall srv_handlerEx, ebx
1035
           mov [esp+36], eax
1036
           ret
1037
@@:
168 serge 1038
           cmp eax, 18
1039
           ja @f
1040
           mov ecx, [CURRENT_TASK]
1041
           shl ecx, 8
1042
           mov eax, [ecx+PROC_BASE+APPDATA.sse_handler]
1043
           mov [ecx+PROC_BASE+APPDATA.sse_handler], ebx
1044
           mov [esp+36], eax
1045
           ret
1046
@@:
164 serge 1047
           cmp eax, 19
198 serge 1048
           ja .fail
227 serge 1049
           add ebx, new_app_base
198 serge 1050
           cmp ebx, new_app_base
1051
           jb .fail
1052
           stdcall load_library, ebx
1053
           mov [esp+36], eax
1054
           ret
1055
227 serge 1056
 
164 serge 1057
           xor eax, eax
1058
           mov [esp+36], eax
1059
           ret
1060
1061
 
1062
proc strncmp stdcall, str1:dword, str2:dword, count:dword
1063
1064
 
1065
          jecxz .end
1066
1067
 
1068
1069
 
1070
          mov esi,edi
1071
          xor eax,eax
1072
          repne scasb
1073
          neg ecx             ; cx = count - strlen
1074
          add ecx,ebx         ; strlen + count - strlen
1075
1076
 
1077
          mov edi,esi
1078
          mov esi,[str2]
1079
          repe cmpsb
1080
          mov al,[esi-1]
1081
          xor ecx,ecx
1082
1083
 
1084
          ja .str2_big
1085
          je .end
1086
1087
 
1088
          sub ecx,2
1089
1090
 
1091
          not ecx
1092
.end:
1093
          mov eax,ecx
1094
          ret
1095
endp
1096
1097
 
1098
proc test_cpu
1099
           locals
1100
              cpu_type   dd ?
166 serge 1101
              cpu_id     dd ?
1102
              cpu_Intel  dd ?
1103
              cpu_AMD    dd ?
1104
           endl
164 serge 1105
1106
 
1107
           xor eax, eax
211 serge 1108
           mov [cpu_caps], eax
1109
           mov [cpu_caps+4], eax
1110
164 serge 1111
 
1112
           pop eax
1113
           mov ecx, eax
1114
           xor eax, 0x40000
1115
           push eax
1116
           popfd
1117
           pushfd
1118
           pop eax
1119
           xor eax, ecx
1120
           mov [cpu_type], CPU_386
1121
           jz .end_cpuid
221 serge 1122
           push ecx
164 serge 1123
           popfd
1124
1125
 
1126
           mov eax, ecx
1127
           xor eax, 0x200000
1128
           push eax
1129
           popfd
1130
           pushfd
1131
           pop eax
1132
           xor eax, ecx
1133
           je .end_cpuid
221 serge 1134
           mov [cpu_id], 1
164 serge 1135
1136
 
1137
           cpuid
1138
           mov [cpu_vendor], ebx
1139
           mov [cpu_vendor+4], edx
1140
           mov [cpu_vendor+8], ecx
1141
           cmp ebx, dword [intel_str]
1142
           jne .check_AMD
1143
           cmp edx, dword [intel_str+4]
1144
           jne .check_AMD
1145
           cmp ecx, dword [intel_str+8]
1146
           jne .check_AMD
1147
           mov [cpu_Intel], 1
1148
           cmp eax, 1
1149
           jl .end_cpuid
1150
           mov eax, 1
1151
           cpuid
1152
           mov [cpu_sign], eax
1153
           mov [cpu_info],  ebx
1154
           mov [cpu_caps],  edx
1155
           mov [cpu_caps+4],ecx
1156
1157
 
1158
           and eax, 0x0f
1159
           ret
1160
.end_cpuid:
1161
           mov eax, [cpu_type]
1162
           ret
1163
1164
 
1165
           cmp ebx, dword [AMD_str]
1166
           jne .unknown
221 serge 1167
           cmp edx, dword [AMD_str+4]
164 serge 1168
           jne .unknown
221 serge 1169
           cmp ecx, dword [AMD_str+8]
164 serge 1170
           jne .unknown
221 serge 1171
           mov [cpu_AMD], 1
164 serge 1172
           cmp eax, 1
1173
           jl .unknown
221 serge 1174
           mov eax, 1
164 serge 1175
           cpuid
1176
           mov [cpu_sign], eax
1177
           mov [cpu_info],  ebx
1178
           mov [cpu_caps],  edx
1179
           mov [cpu_caps+4],ecx
1180
           shr eax, 8
1181
           and eax, 0x0f
1182
           ret
1183
.unknown:
221 serge 1184
           mov eax, 1
1185
           cpuid
1186
           mov [cpu_sign], eax
1187
           mov [cpu_info],  ebx
1188
           mov [cpu_caps],  edx
1189
           mov [cpu_caps+4],ecx
1190
           shr eax, 8
1191
           and eax, 0x0f
1192
           ret
1193
endp
164 serge 1194
1195
 
1196
MEM_WC     equ 1               ;write combined memory
1197
MEM_UC     equ 0               ;uncached memory
1198
1199
 
1200
proc init_mtrr
1201
1202
 
1203
           je  .exit
1204
1205
 
211 serge 1206
           jnc .exit
1207
1208
 
164 serge 1209
           or eax, 0x60000000   ;disable caching
1210
           mov cr0, eax
1211
           wbinvd               ;invalidate cache
1212
1213
 
1214
           rdmsr                ;
1215
           push eax
1216
1217
 
1218
           xor eax, eax
1219
           mov ecx, 0x2FF
1220
           wrmsr                ;disable all MTRR
1221
1222
 
1223
           stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
1224
           xor edx, edx
1225
           xor eax, eax
1226
           mov ecx, 0x204
1227
           mov ebx, 6
1228
@@:
1229
           wrmsr                ;disable unused MTRR
1230
           inc ecx
1231
           wrmsr
1232
           inc ecx
1233
           dec ebx
1234
           jnz @b
1235
1236
 
1237
1238
 
1239
           or eax, 0x800        ;set default memtype to UC
1240
           and al, 0xF0
1241
           mov ecx, 0x2FF
1242
           wrmsr                ;and enable MTRR
1243
1244
 
1245
           and eax, not 0x60000000
1246
           mov cr0, eax         ; enable caching
1247
.exit:
1248
           ret
1249
endp
1250
1251
 
1252
proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
1253
1254
 
1255
           mov eax, [base]
1256
           or eax, [mem_type]
1257
           mov ecx, [reg]
1258
           lea ecx, [0x200+ecx*2]
1259
           wrmsr
1260
1261
 
1262
           dec ebx
1263
           mov eax, 0xFFFFFFFF
1264
           mov edx, 0x0000000F
1265
           sub eax, ebx
1266
           sbb edx, 0
1267
           or eax, 0x800
1268
           inc ecx
1269
           wrmsr
1270
           ret
1271
endp
1272
1273
 
172 serge 1274
proc stall stdcall, delay:dword
1275
           push ecx
1276
           push edx
1277
           push ebx
1278
           push eax
1279
1280
 
1281
           mul [stall_mcs]
1282
           mov ebx, eax       ;low
1283
           mov ecx, edx       ;high
1284
           rdtsc
1285
           add ebx, eax
1286
           adc ecx,edx
1287
@@:
1288
           rdtsc
1289
           sub eax, ebx
1290
           sbb edx, ecx
1291
           jb @B
1292
1293
 
1294
           pop ebx
1295
           pop edx
1296
           pop ecx
1297
           ret
1298
endp
1299
1300
 
164 serge 1301
align 4
1302
  intel_str    db "GenuineIntel",0
1303
  AMD_str      db "AuthenticAMD",0
1304
endg
1305
1306
 
1307
align 16
1308
  irq_tab           rd 16
1309
1310
 
1311
 
1312
1313
 
1314
  ipc_pdir          rd 1
1315
  ipc_ptab          rd 1
1316
1317
 
1318
  proc_mem_pdir     rd 1
1319
  proc_mem_tab      rd 1
1320
1321
 
1322
  tmp_task_ptab     rd 1
1323
  tmp_task_data     rd 1
1324
1325
 
1326
  fdd_buff          rd 1
1327
  LFBSize           rd 1
214 serge 1328
164 serge 1329
 
172 serge 1330
;;CPUID information
164 serge 1331
1332
 
1333
  cpu_sign          rd 1
1334
  cpu_info          rd 1
1335
1336
 
221 serge 1337
1338
 
1339
cur_saved_data   rb 4096
1340
1341
 
276 serge 1342
;cursor_map       rd 2
1343
;cursor_start     rd 1
1344
;cursor_end       rd 1
1345
221 serge 1346
 
1347
hw_cursor        rd 1
233 serge 1348
221 serge 1349
 
1350
scr_height       rd 1
1351
1352
 
1353
cur_saved_base   rd 1
1354
cur_saved_interl rd 1
1355
cur_saved_w      rd 1
1356
cur_saved_h      rd 1
1357
1358
 
164 serge 1359
1360
 
1361
align 16
1362
227 serge 1363
 
276 serge 1364
1365
 
278 serge 1366
;   srv_tab         rb 36*32
1367
   mem_block_map   rb 512
227 serge 1368
   event_map       rb 128
1369
   mem_block_list  rd 64
1370
   mem_block_mask  rd 2
1371
1372
 
278 serge 1373
;   srv_map         rd 1
1374
164 serge 1375
 
278 serge 1376
   srv.bk          rd 1
1377
1378
 
164 serge 1379
   mem_block_arr   rd 1
1380
   mem_block_start rd 1
1381
   mem_block_end   rd 1
1382
279 serge 1383
 
1384
   heap_size       rd 1
170 serge 1385
   heap_free       rd 1
1386
   heap_blocks     rd 1
1387
   free_blocks     rd 1
1388
164 serge 1389
 
1390
   page_end        rd 1
1391
   events          rd 1
227 serge 1392
   event_start     rd 1
1393
   event_end       rd 1
1394
1395
 
164 serge 1396
endg
1397
1398
 
1399
 
1400
;     push edx
1401
;     mov edx, 0x400   ;bocsh
1402
;     mov al,0xff      ;bocsh
1403
;     out dx, al       ;bocsh
1404
;     pop edx
1405
;     pop eax
1406
1407
 
237 serge 1408
 
1409
k_strrchr:
1410
        push eax
1411
        xor eax,eax
1412
        or  ecx,-1
1413
        repne scasb
1414
        add ecx,1
1415
        neg ecx
1416
        sub edi,1
1417
        pop eax
1418
        std
1419
        repne scasb
1420
        cld
1421
        add edi,1
1422
1423
 
1424
        jne @F
1425
        mov eax,edi
1426
        ret
1427
@@:
1428
        xor eax,eax
1429
        ret
1430
1431
 
1432
proc k_strncpy stdcall, dest:dword, src:dword, maxlen:dword
1433
        mov eax, [dest]
1434
        mov esi, [src]
1435
        mov ecx, [maxlen]
1436
        test eax, eax
1437
        jz .L9
1438
        test esi, esi
1439
        jz .L9
1440
        test ecx, ecx
1441
        jz .L9
1442
1443
 
1444
        jmp .L1
1445
1446
 
1447
.L2:
1448
        mov edx, [esi+eax]
1449
        mov [eax], dl
1450
        test dl, dl
1451
        jz .L7
1452
1453
 
1454
        test dh, dh
1455
        jz .L6
1456
1457
 
1458
        mov [eax+2],dl
1459
        test dl, dl
1460
        jz .L5
1461
1462
 
1463
        test dh, dh
1464
        jz .L4
1465
        add eax, 4
1466
.L1:
1467
        sub ecx, 4
1468
        jae .L2
1469
1470
 
1471
        jz .L9
1472
1473
 
1474
        mov [eax], dl
1475
        test dl, dl
1476
        jz .L3
1477
1478
 
1479
        dec ecx
1480
        jz .L9
1481
1482
 
1483
        mov [eax], dl
1484
        test dl, dl
1485
        jz .L3
1486
1487
 
1488
        dec ecx
1489
        jz .L9
1490
1491
 
1492
        mov [eax], dl
1493
        test dl, dl
1494
        jz .L3
1495
1496
 
1497
        jmp .L9
1498
1499
 
1500
        inc eax
1501
1502
 
1503
        inc eax
1504
1505
 
1506
        inc eax
1507
.L7:
1508
        add ecx,3
1509
        jz .L9
1510
.L8:
1511
        mov byte [ecx+eax], 0
1512
.L3:
1513
        dec ecx
1514
        jnz .L8
1515
.L9:
1516
	ret
1517
endp
1518
1519
 
1520
1521
 
1522
1523
 
1524
        mov eax,[esp+4]
1525
        mov edx, 3
1526
1527
 
1528
        jz .L1
1529
        jp .L0
1530
1531
 
1532
        je .L2
1533
1534
 
1535
        cmp dh, byte [eax]
1536
1537
 
1538
1539
 
1540
        xor edx, 2
1541
1542
 
1543
.L0:
1544
        cmp dh, [eax]
1545
        je .L2
1546
1547
 
1548
        xor edx, edx
1549
1550
 
1551
        mov ecx, [eax]
1552
        add eax, 4
1553
1554
 
1555
        add ecx, magic
1556
1557
 
1558
        jnc .L3
1559
1560
 
1561
        and edx, not magic
1562
        jne .L3
1563
1564
 
1565
        add eax, 4
1566
1567
 
1568
        add ecx, magic
1569
        dec edx
1570
        jnc .L3
1571
1572
 
1573
        and edx, not magic
1574
        jne .L3
1575
1576
 
1577
        add eax, 4
1578
1579
 
1580
        add ecx, magic
1581
1582
 
1583
        jnc .L3
1584
1585
 
1586
1587
 
1588
        jne .L3
1589
1590
 
1591
        add eax, 4
1592
1593
 
1594
        add ecx, magic
1595
1596
 
1597
        jnc .L3
1598
1599
 
1600
1601
 
1602
        je .L1
1603
1604
 
1605
        sub ecx, magic
1606
1607
 
1608
        jz .L2
1609
1610
 
1611
        test ch, ch
1612
        jz .L2
1613
1614
 
1615
        inc eax
1616
1617
 
1618
        jz .L2
1619
1620
 
1621
1622
 
1623
        sub eax, [esp+4]
1624
	ret
1625
1626
 
1627