Subversion Repositories Kolibri OS

Rev

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