Subversion Repositories Kolibri OS

Rev

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