Subversion Repositories Kolibri OS

Rev

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