Subversion Repositories Kolibri OS

Rev

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