Subversion Repositories Kolibri OS

Rev

Rev 281 | Rev 291 | 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
 
285 serge 569
;  eax= linear address
570
;
571
; retval
572
;  eax= phisical page address
573
574
 
164 serge 575
get_pg_addr:
285 serge 576
           shr eax, 12
577
           mov eax, [pages_tab+eax*4]
578
           and eax, 0xFFFFF000
164 serge 579
           ret
580
581
 
188 serge 582
proc page_fault_handler
164 serge 583
           pushad
584
585
 
586
           mov eax, cr2
587
           push eax
172 serge 588
           push ds
164 serge 589
           push es
188 serge 590
164 serge 591
 
592
           mov ds, ax
593
           mov es, ax
188 serge 594
164 serge 595
 
188 serge 596
597
 
164 serge 598
599
 
600
           jae .lfb_addr
601
602
 
603
           jae .user_space
604
605
 
188 serge 606
           jae .alloc
607
608
 
164 serge 609
           jae .tab_space
610
611
 
612
613
 
614
           shr ebx, 12
615
           mov ecx, ebx
172 serge 616
           shr ecx, 10
617
           mov edx, [master_tab+ecx*4]
618
           test edx, 1
619
           jz .fail
620
621
 
164 serge 622
           test eax, 2
623
           jz .fail
172 serge 624
.alloc:
188 serge 625
           call alloc_page
164 serge 626
           and eax, eax
627
           jz .exit
628
629
 
630
631
 
188 serge 632
           and edi, 0xFFFFF000
633
           mov ecx, 1024
164 serge 634
           xor eax, eax
635
           cld
188 serge 636
           rep stosd
637
.exit:
164 serge 638
           pop es
188 serge 639
           pop ds
164 serge 640
           mov esp, ebp
641
           popad
642
           add esp, 4
643
           iretd
644
.fail:
172 serge 645
           pop es
188 serge 646
           pop ds
172 serge 647
           mov esp, ebp
648
           popad
649
           add esp, 4
650
164 serge 651
 
172 serge 652
653
 
654
           jmp exc_c
655
           iretd
656
657
 
164 serge 658
;           shr ebx, 12
188 serge 659
;           mov eax, [pages_tab+ebx*4]
660
;           shr ebx, 10
661
;           mov eax, [master_tab+ebx*4]
662
           jmp .exit
663
.old_addr:
164 serge 664
;           shr ebx, 12
188 serge 665
;           mov eax, [pages_tab+ebx*4]
164 serge 666
;           shr ebx, 10
188 serge 667
;           mov eax, [master_tab+ebx*4]
668
           jmp .exit
669
.lfb_addr:
164 serge 670
;           shr ebx, 22
188 serge 671
;           ;mov ecx, [sys_page_dir]
672
;           mov eax, [master_tab+ebx*4]
673
           jmp .exit
674
.tab_space:
164 serge 675
;           shr ebx, 12
188 serge 676
;           mov eax, [pages_tab+ebx*4]
164 serge 677
;           shr ebx, 10
188 serge 678
;           ;mov ecx, [sys_page_dir]
679
;           mov eax, [master_tab+ebx*4]
680
           jmp .exit
681
endp
164 serge 682
683
 
684
proc map_mem stdcall, lin_addr:dword,pdir:dword,\
685
                      ofs:dword,buf_size:dword
686
           mov eax, [buf_size]
687
           test eax, eax
688
           jz .exit
689
690
 
691
           and eax, 0xFFFFF000
692
693
 
694
           mov ebx, [ofs]
695
           shr ebx, 22
696
           mov esi, [ipc_pdir]
697
           mov edi, [ipc_ptab]
698
           mov eax, [esi+ebx*4]
699
           and eax, 0xFFFFF000
700
           test eax, eax
701
           jz .exit
702
           stdcall map_page,edi,eax,dword PG_UW
703
;           inc ebx
704
;           add edi, 0x1000
705
;           mov eax, [esi+ebx*4]
706
;           test eax, eax
707
;           jz @f
708
;          and eax, 0xFFFFF000
709
;           stdcall map_page, edi, eax
710
711
 
712
           and edi, 0xFFFFF000
713
           mov ecx, [buf_size]
714
           add ecx, 4095
715
           shr ecx, 12
716
           inc ecx
717
718
 
719
           shr edx, 12
720
           and edx, 0x3FF
721
           mov esi, [ipc_ptab]
722
723
 
724
           and eax, 0xFFFFF000
725
           test eax, eax
726
           jz .exit
727
           stdcall map_page,edi,eax,dword PG_UW
728
           add edi, 0x1000
729
           inc edx
730
           dec ecx
731
           jnz .map
732
733
 
734
           ret
735
endp
736
737
 
738
proc map_memEx stdcall, lin_addr:dword,pdir:dword,\
739
                        ofs:dword,buf_size:dword
740
           mov eax, [buf_size]
741
           test eax, eax
742
           jz .exit
743
744
 
745
           and eax, 0xFFFFF000
746
747
 
748
           mov ebx, [ofs]
749
           shr ebx, 22
750
           mov esi, [proc_mem_pdir]
751
           mov edi, [proc_mem_tab]
752
           mov eax, [esi+ebx*4]
753
           and eax, 0xFFFFF000
754
           test eax, eax
755
           jz .exit
756
           stdcall map_page,edi,eax,dword PG_UW
757
758
 
759
           and edi, 0xFFFFF000
760
           mov ecx, [buf_size]
761
           add ecx, 4095
762
           shr ecx, 12
763
           inc ecx
764
765
 
766
           shr edx, 12
767
           and edx, 0x3FF
768
           mov esi, [proc_mem_tab]
769
770
 
771
;           and eax, 0xFFFFF000
772
;           test eax, eax
773
;           jz .exit
774
           stdcall map_page,edi,eax,dword PG_UW
775
           add edi, 0x1000
776
           inc edx
777
           dec ecx
778
           jnz .map
779
.exit:
780
           ret
781
endp
782
783
 
784
 
785
 
786
 
787
;input:
788
;  eax=1 - set ipc buffer area
789
;    ebx=address of buffer
790
;    ecx=size of buffer
791
;  eax=2 - send message
792
;    ebx=PID
793
;    ecx=address of message
794
;    edx=size of message
795
796
 
797
           jne @f
798
           call set_ipc_buff
799
           mov [esp+36], eax
800
           ret
801
@@:
802
           cmp eax, 2
803
           jne @f
804
           stdcall sys_ipc_send, ebx, ecx, edx
805
           mov [esp+36], eax
806
           ret
807
@@:
808
           xor eax, eax
809
           not eax
810
           mov [esp+36], eax
811
           ret
812
813
 
814
proc set_ipc_buff
815
816
 
817
           shl  eax,8
818
           add  eax, PROC_BASE
819
           pushf
820
           cli
821
           mov  [eax+0xA0],ebx     ;set fields in extended information area
822
           mov  [eax+0xA4],ecx
823
824
 
825
           add ecx, ebx
826
           add ecx, 4095
827
           and ecx, not 4095
828
829
 
830
           add ebx, 0x1000
831
           cmp ebx, ecx
832
           jna .touch
833
834
 
835
           xor eax, eax
836
           ret
837
endp
838
839
 
840
           locals
841
             dst_slot   dd ?
842
             dst_offset dd ?
843
             buf_size   dd ?
844
           endl
845
846
 
847
           cli
848
849
 
850
           call pid_to_slot
851
           test eax,eax
852
           jz   .no_pid
853
854
 
855
           shl  eax,8
856
           mov  edi,[eax+PROC_BASE+0xa0]  ;is ipc area defined?
857
           test edi,edi
858
           jz   .no_ipc_area
859
860
 
861
           add edi, new_app_base
862
           and ebx, 0xFFF
863
           mov [dst_offset], ebx
864
865
 
866
           mov [buf_size], esi
867
868
 
869
                             edi, esi
870
871
 
872
           add edi, [ipc_tmp]
873
           cmp dword [edi], 0
874
           jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
875
227 serge 876
 
164 serge 877
           mov edx, ebx
878
           add ebx, 8
879
           add ebx, [msg_size]
880
           cmp ebx, [buf_size]
881
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
882
227 serge 883
 
164 serge 884
           mov eax,[TASK_BASE]
885
           mov eax, [eax+0x04]         ;eax - our PID
886
           mov edi, [dst_offset]
887
           add edi, [ipc_tmp]
888
           add edi, edx
889
           mov [edi], eax
890
           mov ecx, [msg_size]
891
892
 
893
           add edi, 8
894
           mov esi, [msg_addr]
895
           add esi, new_app_base
896
           cld
897
           rep movsb
898
899
 
900
           mov edx, ebx
901
           shr ebx, 12
902
           xor eax, eax
903
           mov [pages_tab+ebx*4], eax
904
           invlpg [edx]
905
906
 
907
           mov edx, ebx
908
           shr ebx, 12
909
           xor eax, eax
910
           mov [pages_tab+ebx*4], eax
911
           invlpg [edx]
912
913
 
914
           mov edx, ebx
915
           shr ebx, 12
916
           xor eax, eax
917
           mov [pages_tab+ebx*4], eax
918
           invlpg [edx]
919
920
 
921
           shl eax, 8
922
           or   [eax+PROC_BASE+0xA8],dword 0x40
923
           cmp  dword [check_idle_semaphore],20
924
           jge  .ipc_no_cis
925
926
 
927
.ipc_no_cis:
928
           popf
929
           xor eax, eax
930
           ret
931
.no_pid:
932
           popf
933
           mov  eax, 4
934
           ret
935
.no_ipc_area:
936
           popf
937
           xor eax, eax
938
           inc eax
939
           ret
940
.ipc_blocked:
941
           popf
942
           mov  eax, 2
943
           ret
944
.buffer_overflow:
945
           popf
946
           mov  eax, 3
947
           ret
948
endp
949
950
 
951
sysfn_meminfo:
170 serge 952
164 serge 953
 
170 serge 954
           cmp ebx, new_app_base
172 serge 955
           jb .fail
956
957
 
164 serge 958
           mov [ebx], eax
170 serge 959
           shl eax, 12
172 serge 960
           mov [esp+36], eax
961
           mov ecx, [pg_data.pages_free]
170 serge 962
           mov [ebx+4], ecx
963
           mov edx, [pg_data.pages_faults]
964
           mov [ebx+8], edx
965
           mov esi, [heap_size]
966
           mov [ebx+12], esi
967
           mov edi, [heap_free]
968
           mov [ebx+16], edi
969
           mov eax, [heap_blocks]
970
           mov [ebx+20], eax
971
           mov ecx, [free_blocks]
972
           mov [ebx+24], ecx
973
           ret
164 serge 974
.fail:
172 serge 975
           mov dword [esp+36], -1
976
           ret
977
164 serge 978
 
979
new_services:
980
981
 
982
           jle  sys_sheduler
983
984
 
170 serge 985
           jb .fail
164 serge 986
           ja @f
987
988
 
188 serge 989
           mov [esp+36], eax
164 serge 990
           ret
991
@@:
992
           cmp eax, 12
993
           ja @f
994
995
 
996
           mov [esp+36], eax
997
           ret
998
@@:
999
           cmp eax, 13
1000
           ja @f
1001
           add ebx, new_app_base
188 serge 1002
           stdcall user_free, ebx
164 serge 1003
           mov [esp+36], eax
1004
           ret
1005
@@:
1006
           cmp eax, 14
1007
           ja @f
1008
           add ebx, new_app_base
227 serge 1009
           cmp ebx, new_app_base
172 serge 1010
           jb .fail
1011
           stdcall get_event_ex, ebx, ecx
227 serge 1012
           mov [esp+36], eax
1013
           ret
164 serge 1014
@@:
1015
           cmp eax, 15
1016
           ja @f
1017
           mov ecx, [CURRENT_TASK]
1018
           shl ecx, 8
1019
           mov eax, [ecx+PROC_BASE+APPDATA.fpu_handler]
1020
           mov [ecx+PROC_BASE+APPDATA.fpu_handler], ebx
1021
           mov [esp+36], eax
1022
           ret
1023
@@:
1024
           cmp eax, 16
1025
           ja @f
1026
1027
 
188 serge 1028
           jz .fail
1029
           add ebx, new_app_base
164 serge 1030
           cmp ebx, new_app_base
172 serge 1031
           jb .fail
1032
           stdcall get_service, ebx
164 serge 1033
           mov [esp+36], eax
1034
           ret
1035
@@:
1036
           cmp eax, 17
1037
           ja @f
1038
           stdcall srv_handlerEx, ebx
1039
           mov [esp+36], eax
1040
           ret
1041
@@:
168 serge 1042
           cmp eax, 18
1043
           ja @f
1044
           mov ecx, [CURRENT_TASK]
1045
           shl ecx, 8
1046
           mov eax, [ecx+PROC_BASE+APPDATA.sse_handler]
1047
           mov [ecx+PROC_BASE+APPDATA.sse_handler], ebx
1048
           mov [esp+36], eax
1049
           ret
1050
@@:
164 serge 1051
           cmp eax, 19
198 serge 1052
           ja .fail
227 serge 1053
           add ebx, new_app_base
198 serge 1054
           cmp ebx, new_app_base
1055
           jb .fail
1056
           stdcall load_library, ebx
1057
           mov [esp+36], eax
1058
           ret
1059
227 serge 1060
 
164 serge 1061
           xor eax, eax
1062
           mov [esp+36], eax
1063
           ret
1064
1065
 
1066
proc strncmp stdcall, str1:dword, str2:dword, count:dword
1067
1068
 
1069
          jecxz .end
1070
1071
 
1072
1073
 
1074
          mov esi,edi
1075
          xor eax,eax
1076
          repne scasb
1077
          neg ecx             ; cx = count - strlen
1078
          add ecx,ebx         ; strlen + count - strlen
1079
1080
 
1081
          mov edi,esi
1082
          mov esi,[str2]
1083
          repe cmpsb
1084
          mov al,[esi-1]
1085
          xor ecx,ecx
1086
1087
 
1088
          ja .str2_big
1089
          je .end
1090
1091
 
1092
          sub ecx,2
1093
1094
 
1095
          not ecx
1096
.end:
1097
          mov eax,ecx
1098
          ret
1099
endp
1100
1101
 
1102
proc test_cpu
1103
           locals
1104
              cpu_type   dd ?
166 serge 1105
              cpu_id     dd ?
1106
              cpu_Intel  dd ?
1107
              cpu_AMD    dd ?
1108
           endl
164 serge 1109
1110
 
1111
           xor eax, eax
211 serge 1112
           mov [cpu_caps], eax
1113
           mov [cpu_caps+4], eax
1114
164 serge 1115
 
1116
           pop eax
1117
           mov ecx, eax
1118
           xor eax, 0x40000
1119
           push eax
1120
           popfd
1121
           pushfd
1122
           pop eax
1123
           xor eax, ecx
1124
           mov [cpu_type], CPU_386
1125
           jz .end_cpuid
221 serge 1126
           push ecx
164 serge 1127
           popfd
1128
1129
 
1130
           mov eax, ecx
1131
           xor eax, 0x200000
1132
           push eax
1133
           popfd
1134
           pushfd
1135
           pop eax
1136
           xor eax, ecx
1137
           je .end_cpuid
221 serge 1138
           mov [cpu_id], 1
164 serge 1139
1140
 
1141
           cpuid
1142
           mov [cpu_vendor], ebx
1143
           mov [cpu_vendor+4], edx
1144
           mov [cpu_vendor+8], ecx
1145
           cmp ebx, dword [intel_str]
1146
           jne .check_AMD
1147
           cmp edx, dword [intel_str+4]
1148
           jne .check_AMD
1149
           cmp ecx, dword [intel_str+8]
1150
           jne .check_AMD
1151
           mov [cpu_Intel], 1
1152
           cmp eax, 1
1153
           jl .end_cpuid
1154
           mov eax, 1
1155
           cpuid
1156
           mov [cpu_sign], eax
1157
           mov [cpu_info],  ebx
1158
           mov [cpu_caps],  edx
1159
           mov [cpu_caps+4],ecx
1160
1161
 
1162
           and eax, 0x0f
1163
           ret
1164
.end_cpuid:
1165
           mov eax, [cpu_type]
1166
           ret
1167
1168
 
1169
           cmp ebx, dword [AMD_str]
1170
           jne .unknown
221 serge 1171
           cmp edx, dword [AMD_str+4]
164 serge 1172
           jne .unknown
221 serge 1173
           cmp ecx, dword [AMD_str+8]
164 serge 1174
           jne .unknown
221 serge 1175
           mov [cpu_AMD], 1
164 serge 1176
           cmp eax, 1
1177
           jl .unknown
221 serge 1178
           mov eax, 1
164 serge 1179
           cpuid
1180
           mov [cpu_sign], eax
1181
           mov [cpu_info],  ebx
1182
           mov [cpu_caps],  edx
1183
           mov [cpu_caps+4],ecx
1184
           shr eax, 8
1185
           and eax, 0x0f
1186
           ret
1187
.unknown:
221 serge 1188
           mov eax, 1
1189
           cpuid
1190
           mov [cpu_sign], eax
1191
           mov [cpu_info],  ebx
1192
           mov [cpu_caps],  edx
1193
           mov [cpu_caps+4],ecx
1194
           shr eax, 8
1195
           and eax, 0x0f
1196
           ret
1197
endp
164 serge 1198
1199
 
1200
MEM_WC     equ 1               ;write combined memory
1201
MEM_UC     equ 0               ;uncached memory
1202
1203
 
1204
proc init_mtrr
1205
1206
 
1207
           je  .exit
1208
1209
 
211 serge 1210
           jnc .exit
1211
1212
 
164 serge 1213
           or eax, 0x60000000   ;disable caching
1214
           mov cr0, eax
1215
           wbinvd               ;invalidate cache
1216
1217
 
1218
           rdmsr                ;
1219
           push eax
1220
1221
 
1222
           xor eax, eax
1223
           mov ecx, 0x2FF
1224
           wrmsr                ;disable all MTRR
1225
1226
 
1227
           stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
1228
           xor edx, edx
1229
           xor eax, eax
1230
           mov ecx, 0x204
1231
           mov ebx, 6
1232
@@:
1233
           wrmsr                ;disable unused MTRR
1234
           inc ecx
1235
           wrmsr
1236
           inc ecx
1237
           dec ebx
1238
           jnz @b
1239
1240
 
1241
1242
 
1243
           or eax, 0x800        ;set default memtype to UC
1244
           and al, 0xF0
1245
           mov ecx, 0x2FF
1246
           wrmsr                ;and enable MTRR
1247
1248
 
1249
           and eax, not 0x60000000
1250
           mov cr0, eax         ; enable caching
1251
.exit:
1252
           ret
1253
endp
1254
1255
 
1256
proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
1257
1258
 
1259
           mov eax, [base]
1260
           or eax, [mem_type]
1261
           mov ecx, [reg]
1262
           lea ecx, [0x200+ecx*2]
1263
           wrmsr
1264
1265
 
1266
           dec ebx
1267
           mov eax, 0xFFFFFFFF
1268
           mov edx, 0x0000000F
1269
           sub eax, ebx
1270
           sbb edx, 0
1271
           or eax, 0x800
1272
           inc ecx
1273
           wrmsr
1274
           ret
1275
endp
1276
1277
 
172 serge 1278
proc stall stdcall, delay:dword
1279
           push ecx
1280
           push edx
1281
           push ebx
1282
           push eax
1283
1284
 
1285
           mul [stall_mcs]
1286
           mov ebx, eax       ;low
1287
           mov ecx, edx       ;high
1288
           rdtsc
1289
           add ebx, eax
1290
           adc ecx,edx
1291
@@:
1292
           rdtsc
1293
           sub eax, ebx
1294
           sbb edx, ecx
1295
           jb @B
1296
1297
 
1298
           pop ebx
1299
           pop edx
1300
           pop ecx
1301
           ret
1302
endp
1303
1304
 
164 serge 1305
align 4
1306
  intel_str    db "GenuineIntel",0
1307
  AMD_str      db "AuthenticAMD",0
1308
endg
1309
1310
 
1311
align 16
1312
  irq_tab           rd 16
1313
1314
 
1315
 
1316
1317
 
1318
  ipc_pdir          rd 1
1319
  ipc_ptab          rd 1
1320
1321
 
1322
  proc_mem_pdir     rd 1
1323
  proc_mem_tab      rd 1
1324
1325
 
1326
  tmp_task_ptab     rd 1
1327
  tmp_task_data     rd 1
1328
1329
 
1330
  fdd_buff          rd 1
1331
  LFBSize           rd 1
214 serge 1332
164 serge 1333
 
172 serge 1334
;;CPUID information
164 serge 1335
1336
 
1337
  cpu_sign          rd 1
1338
  cpu_info          rd 1
1339
1340
 
221 serge 1341
1342
 
1343
cur_saved_data   rb 4096
1344
1345
 
276 serge 1346
;cursor_map       rd 2
1347
;cursor_start     rd 1
1348
;cursor_end       rd 1
1349
221 serge 1350
 
1351
hw_cursor        rd 1
233 serge 1352
221 serge 1353
 
1354
scr_height       rd 1
1355
1356
 
1357
cur_saved_base   rd 1
1358
cur_saved_interl rd 1
1359
cur_saved_w      rd 1
1360
cur_saved_h      rd 1
1361
1362
 
164 serge 1363
1364
 
1365
align 16
1366
227 serge 1367
 
276 serge 1368
1369
 
278 serge 1370
;   srv_tab         rb 36*32
1371
   mem_block_map   rb 512
227 serge 1372
   event_map       rb 128
1373
   mem_block_list  rd 64
1374
   mem_block_mask  rd 2
1375
1376
 
278 serge 1377
;   srv_map         rd 1
1378
164 serge 1379
 
278 serge 1380
   srv.bk          rd 1
1381
1382
 
164 serge 1383
   mem_block_arr   rd 1
1384
   mem_block_start rd 1
1385
   mem_block_end   rd 1
1386
279 serge 1387
 
1388
   heap_size       rd 1
170 serge 1389
   heap_free       rd 1
1390
   heap_blocks     rd 1
1391
   free_blocks     rd 1
1392
164 serge 1393
 
1394
   page_end        rd 1
1395
   events          rd 1
227 serge 1396
   event_start     rd 1
1397
   event_end       rd 1
1398
1399
 
164 serge 1400
endg
1401
1402
 
1403
 
1404
;     push edx
1405
;     mov edx, 0x400   ;bocsh
1406
;     mov al,0xff      ;bocsh
1407
;     out dx, al       ;bocsh
1408
;     pop edx
1409
;     pop eax
1410
1411
 
237 serge 1412
 
1413
k_strrchr:
1414
        push eax
1415
        xor eax,eax
1416
        or  ecx,-1
1417
        repne scasb
1418
        add ecx,1
1419
        neg ecx
1420
        sub edi,1
1421
        pop eax
1422
        std
1423
        repne scasb
1424
        cld
1425
        add edi,1
1426
1427
 
1428
        jne @F
1429
        mov eax,edi
1430
        ret
1431
@@:
1432
        xor eax,eax
1433
        ret
1434
1435
 
1436
proc k_strncpy stdcall, dest:dword, src:dword, maxlen:dword
1437
        mov eax, [dest]
1438
        mov esi, [src]
1439
        mov ecx, [maxlen]
1440
        test eax, eax
1441
        jz .L9
1442
        test esi, esi
1443
        jz .L9
1444
        test ecx, ecx
1445
        jz .L9
1446
1447
 
1448
        jmp .L1
1449
1450
 
1451
.L2:
1452
        mov edx, [esi+eax]
1453
        mov [eax], dl
1454
        test dl, dl
1455
        jz .L7
1456
1457
 
1458
        test dh, dh
1459
        jz .L6
1460
1461
 
1462
        mov [eax+2],dl
1463
        test dl, dl
1464
        jz .L5
1465
1466
 
1467
        test dh, dh
1468
        jz .L4
1469
        add eax, 4
1470
.L1:
1471
        sub ecx, 4
1472
        jae .L2
1473
1474
 
1475
        jz .L9
1476
1477
 
1478
        mov [eax], dl
1479
        test dl, dl
1480
        jz .L3
1481
1482
 
1483
        dec ecx
1484
        jz .L9
1485
1486
 
1487
        mov [eax], dl
1488
        test dl, dl
1489
        jz .L3
1490
1491
 
1492
        dec ecx
1493
        jz .L9
1494
1495
 
1496
        mov [eax], dl
1497
        test dl, dl
1498
        jz .L3
1499
1500
 
1501
        jmp .L9
1502
1503
 
1504
        inc eax
1505
1506
 
1507
        inc eax
1508
1509
 
1510
        inc eax
1511
.L7:
1512
        add ecx,3
1513
        jz .L9
1514
.L8:
1515
        mov byte [ecx+eax], 0
1516
.L3:
1517
        dec ecx
1518
        jnz .L8
1519
.L9:
1520
	ret
1521
endp
1522
1523
 
1524
1525
 
1526
1527
 
1528
        mov eax,[esp+4]
1529
        mov edx, 3
1530
1531
 
1532
        jz .L1
1533
        jp .L0
1534
1535
 
1536
        je .L2
1537
1538
 
1539
        cmp dh, byte [eax]
1540
1541
 
1542
1543
 
1544
        xor edx, 2
1545
1546
 
1547
.L0:
1548
        cmp dh, [eax]
1549
        je .L2
1550
1551
 
1552
        xor edx, edx
1553
1554
 
1555
        mov ecx, [eax]
1556
        add eax, 4
1557
1558
 
1559
        add ecx, magic
1560
1561
 
1562
        jnc .L3
1563
1564
 
1565
        and edx, not magic
1566
        jne .L3
1567
1568
 
1569
        add eax, 4
1570
1571
 
1572
        add ecx, magic
1573
        dec edx
1574
        jnc .L3
1575
1576
 
1577
        and edx, not magic
1578
        jne .L3
1579
1580
 
1581
        add eax, 4
1582
1583
 
1584
        add ecx, magic
1585
1586
 
1587
        jnc .L3
1588
1589
 
1590
1591
 
1592
        jne .L3
1593
1594
 
1595
        add eax, 4
1596
1597
 
1598
        add ecx, magic
1599
1600
 
1601
        jnc .L3
1602
1603
 
1604
1605
 
1606
        je .L1
1607
1608
 
1609
        sub ecx, magic
1610
1611
 
1612
        jz .L2
1613
1614
 
1615
        test ch, ch
1616
        jz .L2
1617
1618
 
1619
        inc eax
1620
1621
 
1622
        jz .L2
1623
1624
 
1625
1626
 
1627
        sub eax, [esp+4]
1628
	ret
1629
1630
 
1631