Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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