Subversion Repositories Kolibri OS

Rev

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