Subversion Repositories Kolibri OS

Rev

Rev 448 | Rev 490 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 448 Rev 465
Line 1... Line 1...
1
$Revision: 448 $
1
$Revision: 465 $
2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3
;;                                                              ;;
3
;;                                                              ;;
4
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
5
;; Distributed under terms of the GNU General Public License    ;;
5
;; Distributed under terms of the GNU General Public License    ;;
6
;;                                                              ;;
6
;;                                                              ;;
7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 8... Line -...
8
 
-
 
9
tmp_page_tab      equ HEAP_BASE
-
 
10
 
-
 
11
align 4
-
 
12
proc mem_test
-
 
13
 
-
 
14
           mov eax, cr0
-
 
15
           and eax, not (CR0_CD+CR0_NW)
-
 
16
           or eax, CR0_CD         ;disable caching
-
 
17
           mov cr0, eax
-
 
18
           wbinvd                 ;invalidate cache
-
 
19
 
-
 
20
           xor edi, edi
-
 
21
           mov ebx, 'TEST'
-
 
22
@@:
-
 
23
           add edi, 0x400000
-
 
24
           xchg ebx, dword [edi]
-
 
25
           cmp dword [edi], 'TEST'
-
 
26
           xchg ebx, dword [edi]
-
 
27
           je @b
-
 
28
           mov [MEM_AMOUNT], edi
-
 
29
 
-
 
30
           and eax, not (CR0_CD+CR0_NW)  ;enable caching
-
 
31
           mov cr0, eax
-
 
32
           mov eax, edi
-
 
33
           mov [LFBSize], 0x00800000
-
 
34
           ret
-
 
35
endp
-
 
36
 
-
 
37
align 4
-
 
38
proc init_mem
-
 
39
 
-
 
40
           mov eax, [MEM_AMOUNT]
-
 
41
 
-
 
42
           mov [pg_data.mem_amount], eax
-
 
43
           mov [pg_data.kernel_max], eax
-
 
44
 
-
 
45
           shr eax, 12
-
 
46
           mov edx, eax
-
 
47
           mov [pg_data.pages_count], eax
-
 
48
           mov [pg_data.kernel_pages], eax
-
 
49
 
-
 
50
           shr eax, 3
-
 
51
           mov [pg_data.pagemap_size], eax
-
 
52
 
-
 
53
           shr edx, 10
-
 
54
           cmp edx, 3
-
 
55
           ja @f
-
 
56
           inc edx       ;at least 4Mb for kernel heap
-
 
57
@@:
-
 
58
           mov [pg_data.kernel_tables], edx
-
 
59
 
-
 
60
           xor eax, eax
-
 
61
           mov edi, sys_pgdir
-
 
62
           mov ecx, 2048
-
 
63
           cld
-
 
64
           rep stosd
-
 
65
 
-
 
66
           mov edx, sys_pgdir
-
 
67
           bt [cpu_caps], CAPS_PSE
-
 
68
           jnc .no_PSE
-
 
69
 
-
 
70
           mov ebx, cr4
-
 
71
           or ebx, CR4_PSE
-
 
72
           mov eax, PG_LARGE+PG_SW
-
 
73
           bt [cpu_caps], CAPS_PGE
-
 
74
           jnc @F
-
 
75
           or eax, PG_GLOBAL
-
 
76
           or ebx, CR4_PGE
-
 
77
@@:
-
 
78
           mov cr4, ebx
-
 
79
           sub [pg_data.kernel_tables], 2
-
 
80
 
-
 
81
           mov [edx], eax
-
 
82
           add eax, 0x00400000
-
 
83
           mov [edx+4], eax
-
 
84
           add edx, 8
-
 
85
 
-
 
86
           mov eax, 0x800000+PG_SW
-
 
87
           mov ecx, (HEAP_BASE-0x800000)/4096
-
 
88
           jmp .map_low
-
 
89
.no_PSE:
-
 
90
           mov eax, PG_SW
-
 
91
           mov ecx, HEAP_BASE/4096
-
 
92
.map_low:
-
 
93
           mov edi, tmp_page_tab
-
 
94
@@:                                   ;
-
 
95
           stosd
-
 
96
           add eax, 0x1000
-
 
97
           dec ecx
-
 
98
           jnz @B
-
 
99
 
-
 
100
           mov ecx, [pg_data.kernel_tables]
-
 
101
           shl ecx, 10
-
 
102
           xor eax, eax
-
 
103
           rep stosd
-
 
104
 
-
 
105
           mov ecx, [pg_data.kernel_tables]
-
 
106
           mov eax, tmp_page_tab+PG_SW
-
 
107
           mov edi, edx
-
 
108
 
-
 
109
.map_kernel_tabs:
-
 
110
 
-
 
111
           stosd
-
 
112
           add eax, 0x1000
-
 
113
           dec ecx
-
 
114
           jnz .map_kernel_tabs
-
 
115
 
-
 
116
           mov dword [sys_pgdir+(page_tabs shr 20)], sys_pgdir+PG_SW
-
 
117
           ret
-
 
118
endp
-
 
119
 
-
 
120
align 4
-
 
121
proc init_page_map
-
 
122
 
-
 
123
           mov edi, sys_pgmap
-
 
124
           mov ecx, (HEAP_BASE/4096)/32      ;384/4
-
 
125
           mov ebx, ecx
-
 
126
           xor eax,eax
-
 
127
           cld
-
 
128
           rep stosd
-
 
129
 
-
 
130
           not eax
-
 
131
           mov ecx, [pg_data.pagemap_size]
-
 
132
           sub ecx, ebx
-
 
133
           shr ecx, 2
-
 
134
           rep stosd
-
 
135
 
-
 
136
           lea edi, [sys_pgmap+ebx*4]         ;+384
-
 
137
           mov edx, [pg_data.pages_count]
-
 
138
           mov ecx, [pg_data.kernel_tables]
-
 
139
           add ecx, (HEAP_BASE/4096) and 31
-
 
140
           sub edx, HEAP_BASE/4096
-
 
141
           sub edx, ecx
-
 
142
           mov [pg_data.pages_free], edx
-
 
143
 
-
 
144
           xor eax, eax
-
 
145
           mov ebx, ecx
-
 
146
           shr ecx, 5
-
 
147
           rep stosd
-
 
148
 
-
 
149
           not eax
-
 
150
           mov ecx, ebx
-
 
151
           and ecx, 31
-
 
152
           shl eax, cl
-
 
153
           mov [page_start], edi;           sys_pgmap+384
-
 
154
           stosd
-
 
155
 
-
 
156
           mov ebx, sys_pgmap
-
 
157
           add ebx, [pg_data.pagemap_size]
-
 
158
           mov [page_end], ebx
-
 
159
 
-
 
160
           mov [pg_data.pg_mutex], 0
-
 
161
 
-
 
162
           ret
-
 
163
endp
-
 
164
 
8
 
165
align 4
9
align 4
Line 166... Line 10...
166
proc alloc_page
10
proc alloc_page
167
 
11
 
Line 398... Line 242...
398
           mov [BOOT_VAR+0x901c],byte 2
242
           mov [BOOT_VAR+0x901c],byte 2
399
           ret
243
           ret
400
@@:
244
@@:
401
           mov edx, LFB_BASE
245
           mov edx, LFB_BASE
402
           mov esi, [LFBAddress]
246
           mov esi, [LFBAddress]
403
           mov edi, [LFBSize]
247
           mov edi, 0x00800000
404
           mov dword [exp_lfb+4], edx
248
           mov dword [exp_lfb+4], edx
Line 405... Line 249...
405
 
249
 
406
           shr edi, 12
250
           shr edi, 12
407
           mov [pg_count], edi
251
           mov [pg_count], edi
Line 408... Line 252...
408
           shr edi, 10
252
           shr edi, 10
409
 
253
 
410
           bt [cpu_caps], CAPS_PSE
254
           bt [cpu_caps], CAPS_PSE
411
           jnc .map_page_tables
-
 
412
           or esi, PG_LARGE+PG_UW
255
           jnc .map_page_tables
413
           shr edx, 20
256
           or esi, PG_LARGE+PG_UW
414
           mov ecx, edx
257
           mov edx, sys_pgdir+(LFB_BASE shr 20)
415
@@:
258
@@:
416
           mov [sys_pgdir+edx], esi
259
           mov [edx], esi
417
           add edx, 4
260
           add edx, 4
418
           add esi, 0x00400000
261
           add esi, 0x00400000
Line 419... Line 262...
419
           dec edi
262
           dec edi
420
           jnz @B
263
           jnz @B
421
 
264
 
422
           bt [cpu_caps], CAPS_PGE
265
           bt [cpu_caps], CAPS_PGE
423
           jnc @F
266
           jnc @F
424
           or dword [sys_pgdir+ecx], PG_GLOBAL
267
           or dword [sys_pgdir+(LFB_BASE shr 20)], PG_GLOBAL
425
@@:
268
@@:
426
           mov dword [LFBAddress], LFB_BASE
269
           mov dword [LFBAddress], LFB_BASE
Line 427... Line 270...
427
           mov eax, cr3       ;flush TLB
270
           mov eax, cr3       ;flush TLB
Line -... Line 271...
-
 
271
           mov cr3, eax
428
           mov cr3, eax
272
           ret
429
           ret
273
 
430
 
274
.map_page_tables:
431
.map_page_tables:
275
 
432
 
276
@@:
Line 433... Line 277...
433
           call alloc_page
277
           call alloc_page
434
           stdcall map_page_table, edx, eax
278
           stdcall map_page_table, edx, eax
435
           add edx, 0x00400000
279
           add edx, 0x00400000
436
           dec edi
280
           dec edi
Line 463... Line 307...
463
           mov edi, [new_size]
307
           mov edi, [new_size]
464
           add edi,4095
308
           add edi,4095
465
           and edi,not 4095
309
           and edi,not 4095
466
           mov [new_size], edi
310
           mov [new_size], edi
Line 467... Line 311...
467
 
311
 
468
           mov edx,[CURRENT_TASK]
-
 
469
           shl edx,8
312
           mov edx,[current_slot]
470
           cmp [SLOT_BASE+APPDATA.heap_base+edx],0
313
           cmp [edx+APPDATA.heap_base],0
Line 471... Line 314...
471
           jne .exit
314
           jne .exit
472
 
315
 
473
           mov esi, [SLOT_BASE+APPDATA.mem_size+edx]
316
           mov esi, [edx+APPDATA.mem_size]
Line 474... Line 317...
474
           add esi, 4095
317
           add esi, 4095
475
           and esi, not 4095
318
           and esi, not 4095
Line 498... Line 341...
498
        call    update_mem_size
341
           call    update_mem_size
Line 499... Line 342...
499
 
342
 
500
           xor eax, eax
343
           xor eax, eax
501
           dec [pg_data.pg_mutex]
344
           dec [pg_data.pg_mutex]
502
           ret
-
 
503
 
345
           ret
504
.expand:
-
 
505
           add edi, new_app_base
-
 
Line 506... Line 346...
506
           add esi, new_app_base
346
.expand:
507
 
347
 
Line 508... Line 348...
508
           push esi
348
           push esi
Line 565... Line 405...
565
           dec [pg_data.pg_mutex]
405
           dec [pg_data.pg_mutex]
566
           ret
406
           ret
567
endp
407
endp
Line 568... Line 408...
568
 
408
 
569
update_mem_size:
409
update_mem_size:
570
; in: edx = slot shl 8
410
; in: edx = slot base
571
;     ebx = new memory size
411
;     ebx = new memory size
Line 572... Line 412...
572
; destroys eax,ecx,edx
412
; destroys eax,ecx,edx
573
 
413
 
574
           mov    [SLOT_BASE+APPDATA.mem_size+edx],ebx
414
           mov    [APPDATA.mem_size+edx],ebx
575
;search threads and update
415
;search threads and update
576
;application memory size infomation
416
;application memory size infomation
Line 577... Line 417...
577
           mov    ecx,[SLOT_BASE+APPDATA.dir_table+edx]
417
           mov    ecx,[APPDATA.dir_table+edx]
578
           mov    eax,2
418
           mov    eax,2
579
 
419
 
Line 608... Line 448...
608
           shr eax, 12
448
           shr eax, 12
609
           mov eax, [page_tabs+eax*4]
449
           mov eax, [page_tabs+eax*4]
610
           and eax, 0xFFFFF000
450
           and eax, 0xFFFFF000
611
           ret
451
           ret
Line -... Line 452...
-
 
452
 
612
 
453
 
613
align 4
454
align 4
614
proc page_fault_handler
-
 
Line -... Line 455...
-
 
455
proc page_fault_handler
-
 
456
 
-
 
457
        .err_code equ ebp+32
-
 
458
        .err_addr equ ebp-4
615
           pushad
459
 
616
 
460
           pushad
617
           mov ebp, esp
461
           mov ebp, esp
618
           mov eax, cr2
-
 
619
           push eax
-
 
Line 620... Line 462...
620
           push ds
462
           mov eax, cr2
621
           push es
463
           push eax
622
 
464
 
Line 623... Line 465...
623
           mov ax, 0x10
465
           mov ax, app_data
Line -... Line 466...
-
 
466
           mov ds, ax
-
 
467
           mov es, ax
-
 
468
 
-
 
469
           inc [pg_data.pages_faults]
624
           mov ds, ax
470
 
-
 
471
;     push eax
-
 
472
;     push edx
Line 625... Line 473...
625
           mov es, ax
473
;     mov edx, 0x400   ;bochs
626
 
474
;     mov al,0xff      ;bochs
Line 627... Line 475...
627
           inc [pg_data.pages_faults]
475
;     out dx, al       ;bochs
628
 
476
;     pop edx
Line 629... Line 477...
629
           mov ebx, [ebp-4]
477
;     pop eax
630
 
478
 
631
           cmp ebx, 0x80000000
-
 
632
           jae .user_space
-
 
633
 
-
 
Line 634... Line 479...
634
           cmp ebx, app_page_tabs
479
           mov ebx, [.err_addr]
-
 
480
           mov eax, [.err_code]
-
 
481
 
-
 
482
           cmp ebx, OS_BASE
-
 
483
           jb .user_space      ;ñòðàíèöà â ïàìÿòè ïðèëîæåíèÿ ;
-
 
484
 
-
 
485
           cmp ebx, page_tabs
-
 
486
           jb .kernel_space    ;ñòðàíèöà â ïàìÿòè ÿäðà
-
 
487
 
-
 
488
           cmp ebx, kernel_tabs
-
 
489
           jb .alloc;.app_tabs ;òàáëèöû ñòðàíèö ïðèëîæåíèÿ ;
Line -... Line 490...
-
 
490
                               ;ïðîñòî ñîçäàäèì îäíó
635
           jae .alloc
491
 
-
 
492
           cmp ebx, LFB_BASE
-
 
493
           jb .core_tabs       ;òàáëèöû ñòðàíèö ÿäðà
-
 
494
                               ;Îøèáêà
-
 
495
.lfb:
636
 
496
                               ;îáëàñòü LFB
637
           cmp ebx, page_tabs
497
                               ;Îøèáêà
638
           jae .tab_space
498
           jmp .fail
639
 
499
 
640
           cmp ebx, 0x7DC00000
500
align 4
641
           jae .lfb_addr
501
.user_space:
-
 
502
           test eax, PG_MAP
Line 642... Line 503...
642
 
503
           jnz .err_access     ;Ñòðàíèöà ïðèñóòñòâóåò
643
           jmp .kernel_space
504
                               ;Îøèáêà äîñòóïà ?
644
 
505
 
-
 
506
           shr ebx, 12
645
.user_space:
507
           mov ecx, ebx
646
           shr ebx, 12
508
           shr ecx, 10
647
           mov ecx, ebx
509
           mov edx, [master_tab+ecx*4]
648
           shr ecx, 10
510
           test edx, PG_MAP
Line 649... Line 511...
649
           mov edx, [master_tab+ecx*4]
511
           jz .fail            ;òàáëèöà ñòðàíèö íå ñîçäàíà
Line 650... Line 512...
650
           test edx, 1
512
                               ;íåâåðíûé àäðåñ â ïðîãðàììå
651
           jz .fail
513
 
652
 
514
           mov eax, [page_tabs+ebx*4]
653
           mov eax, [page_tabs+ebx*4]
515
           test eax, 2
654
           test eax, 2
516
           jz .fail            ;àäðåñ íå çàðåçåðâèðîâàí äëÿ ;
655
           jz .fail
517
                               ;èñïîëüçîâàíèÿ. Îøèáêà
656
.alloc:
518
.alloc:
657
           call alloc_page
-
 
658
           and eax, eax
-
 
659
           jz .exit
519
           call alloc_page
660
 
520
           and eax, eax
661
           stdcall map_page,[ebp-4],eax,dword PG_UW
521
           jz .fail
662
 
522
 
-
 
523
           stdcall map_page,[ebp-4],eax,dword PG_UW
-
 
524
 
-
 
525
           mov edi, [ebp-4]
-
 
526
           and edi, 0xFFFFF000
-
 
527
           mov ecx, 1024
-
 
528
           xor eax, eax
-
 
529
           cld
-
 
530
           rep stosd
-
 
531
.exit:
-
 
532
           mov esp, ebp
-
 
533
           popad
-
 
534
           add esp, 4
-
 
535
           iretd
-
 
536
 
-
 
537
.err_access:
-
 
538
;íèêîãäà íå ïðîèñõîäèò
-
 
539
           jmp .fail
-
 
540
 
-
 
541
.kernel_space:
-
 
542
           test eax, PG_MAP
-
 
543
           jz .fail        ;ñòðàíèöà íå ïðèñóòñòâóåò
-
 
544
 
-
 
545
           test eax, 4     ;U/S
-
 
546
           jnz .fail       ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè
-
 
547
                           ;ÿäðà
-
 
548
           test eax, 8
-
 
549
           jnz .fail       ;óñòàíîâëåí çàðåçåðâèðîâàííûé áèò
-
 
550
                           ;â òàáëèöàõ ñòðàíèö. äîáàâëåíî â P4/Xeon
-
 
551
 
-
 
552
;ïîïûòêà çàïèñè â çàùèù¸ííóþ ñòðàíèöó ÿäðà
-
 
553
 
-
 
554
           cmp ebx, tss._io_map_0
-
 
555
           jb .fail
-
 
556
 
-
 
557
           cmp ebx, tss._io_map_0+8192
-
 
558
           jae .fail
-
 
559
 
-
 
560
; io permission map
-
 
561
; copy-on-write protection
-
 
562
 
-
 
563
           call alloc_page
-
 
564
           and eax, eax
-
 
565
           jz .fail
-
 
566
 
-
 
567
           push eax
-
 
568
           stdcall map_page,[ebp-4],eax,dword PG_SW
-
 
569
           pop eax
-
 
570
           mov edi, [.err_addr]
-
 
571
           and edi, -4096
-
 
572
           lea esi, [edi+(not tss._io_map_0)+1]; -tss._io_map_0
-
 
573
 
-
 
574
           mov ebx, esi
-
 
575
           shr ebx, 12
-
 
576
           mov edx, [current_slot]
663
           mov edi, [ebp-4]
577
           or eax, PG_SW
664
           and edi, 0xFFFFF000
-
 
665
           mov ecx, 1024
-
 
666
           xor eax, eax
578
           mov [edx+APPDATA.io_map+ebx*4], eax
667
           cld
579
 
668
           rep stosd
580
           add esi, [default_io_map]
Line -... Line 581...
-
 
581
           mov ecx, 4096/4
-
 
582
           cld
669
.exit:
583
           rep movsd
Line 670... Line 584...
670
           pop es
584
           jmp .exit
671
           pop ds
585
 
672
           mov esp, ebp
586
 
673
           popad
-
 
674
           add esp, 4
-
 
675
           iretd
-
 
676
.fail:
-
 
677
           pop es
-
 
678
           pop ds
-
 
679
           mov esp, ebp
-
 
680
           popad
-
 
681
           add esp, 4
-
 
682
 
-
 
683
           save_ring3_context     ;debugger support
-
 
684
 
-
 
685
           mov bl, 14
-
 
686
           jmp exc_c
-
 
687
           iretd
-
 
688
 
-
 
689
.kernel_space:
-
 
690
;           shr ebx, 12
-
 
691
;           mov eax, [page_tabs+ebx*4]
-
 
692
;           shr ebx, 10
-
 
693
;           mov eax, [master_tab+ebx*4]
-
 
694
           jmp .exit
-
 
695
.old_addr:
-
 
696
;           shr ebx, 12
-
 
697
;           mov eax, [page_tabs+ebx*4]
-
 
698
;           shr ebx, 10
587
;íå îáðàáàòûâàåì. Îøèáêà
Line 699... Line 588...
699
;           mov eax, [master_tab+ebx*4]
588
 
700
           jmp .exit
589
.core_tabs:
701
.lfb_addr:
590
.fail:
Line 843... Line 732...
843
           ret
732
           ret
Line 844... Line 733...
844
 
733
 
845
align 4
734
align 4
Line 846... Line 735...
846
proc set_ipc_buff
735
proc set_ipc_buff
847
 
-
 
848
           mov  eax,[CURRENT_TASK]
-
 
849
           shl  eax,8
736
 
850
           add  eax, SLOT_BASE
737
           mov  eax,[current_slot]
851
           pushf
738
           pushf
852
           cli
739
           cli
Line 853... Line -...
853
           mov  [eax+0xA0],ebx     ;set fields in extended information area
-
 
854
           mov  [eax+0xA4],ecx
740
           mov  [eax+APPDATA.ipc_start],ebx     ;set fields in extended information area
855
 
741
           mov  [eax+APPDATA.ipc_size],ecx
856
           add ebx,  new_app_base
742
 
Line 857... Line 743...
857
           add ecx, ebx
743
           add ecx, ebx
Line 888... Line 774...
888
           mov  edi,[eax+SLOT_BASE+0xa0]  ;is ipc area defined?
774
           mov  edi,[eax+SLOT_BASE+0xa0]  ;is ipc area defined?
889
           test edi,edi
775
           test edi,edi
890
           jz   .no_ipc_area
776
           jz   .no_ipc_area
Line 891... Line 777...
891
 
777
 
892
           mov ebx, edi
778
           mov ebx, edi
893
           add edi, new_app_base
779
       ;    add edi, new_app_base
894
           and ebx, 0xFFF
780
           and ebx, 0xFFF
Line 895... Line 781...
895
           mov [dst_offset], ebx
781
           mov [dst_offset], ebx
896
 
782
 
Line 922... Line 808...
922
           mov ecx, [msg_size]
808
           mov ecx, [msg_size]
Line 923... Line 809...
923
 
809
 
924
           mov [edi+4], ecx
810
           mov [edi+4], ecx
925
           add edi, 8
811
           add edi, 8
926
           mov esi, [msg_addr]
812
           mov esi, [msg_addr]
927
           add esi, new_app_base
813
       ;    add esi, new_app_base
928
           cld
814
           cld
Line 929... Line 815...
929
           rep movsb
815
           rep movsb
930
 
816
 
Line 980... Line 866...
980
endp
866
endp
Line 981... Line 867...
981
 
867
 
982
align 4
868
align 4
Line 983... Line 869...
983
sysfn_meminfo:
869
sysfn_meminfo:
984
 
870
 
985
           add ebx, new_app_base
871
        ;   add ebx, new_app_base
Line 986... Line 872...
986
           cmp ebx, new_app_base
872
           cmp ebx, OS_BASE
987
           jb .fail
873
           jae .fail
988
 
874
 
989
           mov eax, [pg_data.pages_count]
875
           mov eax, [pg_data.pages_count]
Line 1028... Line 914...
1028
           mov [esp+36], eax
914
           mov [esp+36], eax
1029
           ret
915
           ret
1030
@@:
916
@@:
1031
           cmp eax, 13
917
           cmp eax, 13
1032
           ja @f
918
           ja @f
1033
           add ebx, new_app_base
-
 
1034
           stdcall user_free, ebx
919
           stdcall user_free, ebx
1035
           mov [esp+36], eax
920
           mov [esp+36], eax
1036
           ret
921
           ret
1037
@@:
922
@@:
1038
           cmp eax, 14
923
           cmp eax, 14
1039
           ja @f
924
           ja @f
1040
           add ebx, new_app_base
-
 
1041
           cmp ebx, new_app_base
925
           cmp ebx, OS_BASE
1042
           jb .fail
926
           jae .fail
1043
           stdcall get_event_ex, ebx, ecx
927
           stdcall get_event_ex, ebx, ecx
1044
           mov [esp+36], eax
928
           mov [esp+36], eax
1045
           ret
929
           ret
1046
@@:
930
@@:
1047
           cmp eax, 15
931
           cmp eax, 15
1048
           ja @f
932
           ja @f
1049
           mov ecx, [CURRENT_TASK]
933
           mov ecx, [current_slot]
1050
           shl ecx, 8
-
 
1051
           mov eax, [ecx+SLOT_BASE+APPDATA.fpu_handler]
934
           mov eax, [ecx+APPDATA.fpu_handler]
1052
           mov [ecx+SLOT_BASE+APPDATA.fpu_handler], ebx
935
           mov [ecx+APPDATA.fpu_handler], ebx
1053
           mov [esp+36], eax
936
           mov [esp+36], eax
1054
           ret
937
           ret
1055
@@:
938
@@:
1056
           cmp eax, 16
939
           cmp eax, 16
1057
           ja @f
940
           ja @f
Line 1058... Line 941...
1058
 
941
 
1059
           test ebx, ebx
942
           test ebx, ebx
1060
           jz .fail
-
 
1061
           add ebx, new_app_base
943
           jz .fail
1062
           cmp ebx, new_app_base
944
           cmp ebx, OS_BASE
1063
           jb .fail
945
           jae .fail
1064
           stdcall get_service, ebx
946
           stdcall get_service, ebx
1065
           mov [esp+36], eax
947
           mov [esp+36], eax
1066
           ret
948
           ret
1067
@@:
949
@@:
Line 1071... Line 953...
1071
           mov [esp+36], eax
953
           mov [esp+36], eax
1072
           ret
954
           ret
1073
@@:
955
@@:
1074
           cmp eax, 18
956
           cmp eax, 18
1075
           ja @f
957
           ja @f
1076
           mov ecx, [CURRENT_TASK]
958
           mov ecx, [current_slot]
1077
           shl ecx, 8
-
 
1078
           mov eax, [ecx+SLOT_BASE+APPDATA.sse_handler]
959
           mov eax, [ecx+APPDATA.sse_handler]
1079
           mov [ecx+SLOT_BASE+APPDATA.sse_handler], ebx
960
           mov [ecx+APPDATA.sse_handler], ebx
1080
           mov [esp+36], eax
961
           mov [esp+36], eax
1081
           ret
962
           ret
1082
@@:
963
@@:
1083
           cmp eax, 19
964
           cmp eax, 19
1084
           ja @f
965
           ja @f
1085
           add ebx, new_app_base
-
 
1086
           cmp ebx, new_app_base
966
           cmp ebx, OS_BASE
1087
           jb .fail
967
           jae .fail
1088
           stdcall load_library, ebx
968
           stdcall load_library, ebx
1089
           mov [esp+36], eax
969
           mov [esp+36], eax
1090
           ret
970
           ret
Line 1091... Line 971...
1091
 
971
 
Line 1101... Line 981...
1101
           xor eax, eax
981
           xor eax, eax
1102
           mov [esp+36], eax
982
           mov [esp+36], eax
1103
           ret
983
           ret
Line 1104... Line 984...
1104
 
984
 
1105
align 4
-
 
1106
proc strncmp stdcall, str1:dword, str2:dword, count:dword
-
 
1107
 
-
 
1108
          mov ecx,[count]
-
 
1109
          jecxz .end
-
 
1110
 
-
 
1111
          mov ebx,ecx
-
 
1112
 
-
 
1113
          mov edi,[str1]
-
 
1114
          mov esi,edi
-
 
1115
          xor eax,eax
-
 
1116
          repne scasb
-
 
1117
          neg ecx             ; cx = count - strlen
-
 
1118
          add ecx,ebx         ; strlen + count - strlen
-
 
1119
 
-
 
1120
.okay:
-
 
1121
          mov edi,esi
-
 
1122
          mov esi,[str2]
-
 
1123
          repe cmpsb
-
 
1124
          mov al,[esi-1]
-
 
1125
          xor ecx,ecx
-
 
1126
 
-
 
1127
          cmp al,[edi-1]
-
 
1128
          ja .str2_big
-
 
1129
          je .end
-
 
1130
 
-
 
1131
.str1_big:
-
 
1132
          sub ecx,2
-
 
1133
 
-
 
1134
.str2_big:
-
 
1135
          not ecx
-
 
1136
.end:
-
 
1137
          mov eax,ecx
-
 
1138
          ret
-
 
1139
endp
-
 
1140
 
-
 
1141
align 4
-
 
1142
proc test_cpu
-
 
1143
           locals
-
 
1144
              cpu_type   dd ?
-
 
1145
              cpu_id     dd ?
-
 
1146
              cpu_Intel  dd ?
-
 
1147
              cpu_AMD    dd ?
-
 
1148
           endl
-
 
1149
 
-
 
1150
           mov [cpu_type], 0
-
 
1151
           xor eax, eax
-
 
1152
           mov [cpu_caps], eax
-
 
1153
           mov [cpu_caps+4], eax
-
 
1154
 
-
 
1155
           pushfd
-
 
1156
           pop eax
-
 
1157
           mov ecx, eax
-
 
1158
           xor eax, 0x40000
-
 
1159
           push eax
-
 
1160
           popfd
-
 
1161
           pushfd
-
 
1162
           pop eax
-
 
1163
           xor eax, ecx
-
 
1164
           mov [cpu_type], CPU_386
-
 
1165
           jz .end_cpuid
-
 
1166
           push ecx
-
 
1167
           popfd
-
 
1168
 
-
 
1169
           mov [cpu_type], CPU_486
-
 
1170
           mov eax, ecx
-
 
1171
           xor eax, 0x200000
-
 
1172
           push eax
-
 
1173
           popfd
-
 
1174
           pushfd
-
 
1175
           pop eax
-
 
1176
           xor eax, ecx
-
 
1177
           je .end_cpuid
-
 
1178
           mov [cpu_id], 1
-
 
1179
 
-
 
1180
           xor eax, eax
-
 
1181
           cpuid
-
 
1182
           mov [cpu_vendor], ebx
-
 
1183
           mov [cpu_vendor+4], edx
-
 
1184
           mov [cpu_vendor+8], ecx
-
 
1185
           cmp ebx, dword [intel_str]
-
 
1186
           jne .check_AMD
-
 
1187
           cmp edx, dword [intel_str+4]
-
 
1188
           jne .check_AMD
-
 
1189
           cmp ecx, dword [intel_str+8]
-
 
1190
           jne .check_AMD
-
 
1191
           mov [cpu_Intel], 1
-
 
1192
           cmp eax, 1
-
 
1193
           jl .end_cpuid
-
 
1194
           mov eax, 1
-
 
1195
           cpuid
-
 
1196
           mov [cpu_sign], eax
-
 
1197
           mov [cpu_info],  ebx
-
 
1198
           mov [cpu_caps],  edx
-
 
1199
           mov [cpu_caps+4],ecx
-
 
1200
 
-
 
1201
           shr eax, 8
-
 
1202
           and eax, 0x0f
-
 
1203
           ret
-
 
1204
.end_cpuid:
-
 
1205
           mov eax, [cpu_type]
-
 
1206
           ret
-
 
1207
 
-
 
1208
.check_AMD:
-
 
1209
           cmp ebx, dword [AMD_str]
-
 
1210
           jne .unknown
-
 
1211
           cmp edx, dword [AMD_str+4]
-
 
1212
           jne .unknown
-
 
1213
           cmp ecx, dword [AMD_str+8]
-
 
1214
           jne .unknown
-
 
1215
           mov [cpu_AMD], 1
-
 
1216
           cmp eax, 1
-
 
1217
           jl .unknown
-
 
1218
           mov eax, 1
-
 
1219
           cpuid
-
 
1220
           mov [cpu_sign], eax
-
 
1221
           mov [cpu_info],  ebx
-
 
1222
           mov [cpu_caps],  edx
-
 
1223
           mov [cpu_caps+4],ecx
-
 
1224
           shr eax, 8
-
 
1225
           and eax, 0x0f
-
 
1226
           ret
-
 
1227
.unknown:
-
 
1228
           mov eax, 1
-
 
1229
           cpuid
-
 
1230
           mov [cpu_sign], eax
-
 
1231
           mov [cpu_info],  ebx
-
 
1232
           mov [cpu_caps],  edx
-
 
1233
           mov [cpu_caps+4],ecx
-
 
1234
           shr eax, 8
-
 
1235
           and eax, 0x0f
-
 
1236
           ret
-
 
1237
endp
-
 
1238
 
-
 
1239
MEM_WB     equ 6               ;write-back memory
-
 
1240
MEM_WC     equ 1               ;write combined memory
-
 
1241
MEM_UC     equ 0               ;uncached memory
-
 
1242
 
-
 
1243
align 4
985
align 4
Line 1244... Line 986...
1244
proc init_mtrr
986
proc init_mtrr
1245
 
987
 
Line 1312... Line 1054...
1312
           inc ecx
1054
           inc ecx
1313
           wrmsr
1055
           wrmsr
1314
           ret
1056
           ret
1315
endp
1057
endp
Line -... Line 1058...
-
 
1058
 
-
 
1059
 
-
 
1060
align 4
-
 
1061
proc strncmp stdcall, str1:dword, str2:dword, count:dword
-
 
1062
 
-
 
1063
          mov ecx,[count]
-
 
1064
          jecxz .end
-
 
1065
 
-
 
1066
          mov ebx,ecx
-
 
1067
 
-
 
1068
          mov edi,[str1]
-
 
1069
          mov esi,edi
-
 
1070
          xor eax,eax
-
 
1071
          repne scasb
-
 
1072
          neg ecx             ; cx = count - strlen
-
 
1073
          add ecx,ebx         ; strlen + count - strlen
-
 
1074
 
-
 
1075
.okay:
-
 
1076
          mov edi,esi
-
 
1077
          mov esi,[str2]
-
 
1078
          repe cmpsb
-
 
1079
          mov al,[esi-1]
-
 
1080
          xor ecx,ecx
-
 
1081
 
-
 
1082
          cmp al,[edi-1]
-
 
1083
          ja .str2_big
-
 
1084
          je .end
-
 
1085
 
-
 
1086
.str1_big:
-
 
1087
          sub ecx,2
-
 
1088
 
-
 
1089
.str2_big:
-
 
1090
          not ecx
-
 
1091
.end:
-
 
1092
          mov eax,ecx
-
 
1093
          ret
-
 
1094
endp
1316
 
1095
 
1317
align 4
1096
align 4
1318
proc stall stdcall, delay:dword
1097
proc stall stdcall, delay:dword
1319
           push ecx
1098
           push ecx
1320
           push edx
1099
           push edx
Line 1339... Line 1118...
1339
           pop edx
1118
           pop edx
1340
           pop ecx
1119
           pop ecx
1341
           ret
1120
           ret
1342
endp
1121
endp
Line 1343... Line -...
1343
 
-
 
1344
iglobal
-
 
1345
align 4
-
 
1346
  intel_str    db "GenuineIntel",0
-
 
1347
  AMD_str      db "AuthenticAMD",0
-
 
1348
endg
-
 
1349
 
-
 
1350
uglobal
-
 
1351
align 16
-
 
1352
  irq_tab           rd 16
-
 
1353
 
-
 
1354
  MEM_FreeSpace     rd 1
-
 
1355
 
-
 
1356
  ipc_tmp           rd 1
-
 
1357
  ipc_pdir          rd 1
-
 
1358
  ipc_ptab          rd 1
-
 
1359
 
-
 
1360
  proc_mem_map      rd 1
-
 
1361
  proc_mem_pdir     rd 1
-
 
1362
  proc_mem_tab      rd 1
-
 
1363
 
-
 
1364
  tmp_task_pdir     rd 1
-
 
1365
  tmp_task_ptab     rd 1
-
 
1366
 
-
 
1367
  fdd_buff          rd 1
-
 
1368
  LFBSize           rd 1
-
 
1369
 
-
 
1370
  stall_mcs         rd 1
-
 
1371
;;CPUID information
-
 
1372
 
-
 
1373
  cpu_vendor        rd 3
-
 
1374
  cpu_sign          rd 1
-
 
1375
  cpu_info          rd 1
-
 
1376
 
-
 
1377
;;;;;   cursors data
-
 
1378
 
-
 
1379
align 16
-
 
1380
cur_saved_data   rb 4096
-
 
1381
 
-
 
1382
def_cursor       rd 1
-
 
1383
hw_cursor        rd 1
-
 
1384
 
-
 
1385
scr_width        rd 1
-
 
1386
scr_height       rd 1
-
 
1387
 
-
 
1388
cur_def_interl   rd 1
-
 
1389
cur_saved_base   rd 1
-
 
1390
cur_saved_interl rd 1
-
 
1391
cur_saved_w      rd 1
-
 
1392
cur_saved_h      rd 1
-
 
1393
 
-
 
1394
endg
-
 
1395
 
-
 
1396
uglobal
-
 
1397
align 16
-
 
1398
   fpu_data:
-
 
1399
                   rb 512
-
 
1400
 
-
 
1401
   mst MEM_STATE
-
 
1402
 
-
 
1403
   mem_block_map   rb 512
-
 
1404
   event_map       rb 64
-
 
1405
   mem_block_list  rd 64
-
 
1406
   mem_block_mask  rd 2
-
 
1407
 
-
 
1408
   srv.fd          rd 1
-
 
1409
   srv.bk          rd 1
-
 
1410
 
-
 
1411
   mem_used.fd     rd 1
-
 
1412
   mem_used.bk     rd 1
-
 
1413
 
-
 
1414
   mem_block_arr   rd 1
-
 
1415
   mem_block_start rd 1
-
 
1416
   mem_block_end   rd 1
-
 
1417
 
-
 
1418
   heap_mutex      rd 1
-
 
1419
   heap_size       rd 1
-
 
1420
   heap_free       rd 1
-
 
1421
   heap_blocks     rd 1
-
 
1422
   free_blocks     rd 1
-
 
1423
 
-
 
1424
   page_start      rd 1
-
 
1425
   page_end        rd 1
-
 
1426
   events          rd 1
-
 
1427
   event_start     rd 1
-
 
1428
   event_end       rd 1
-
 
1429
   event_uid       rd 1
-
 
1430
   sys_page_map    rd 1
-
 
1431
   os_stack        rd 1
-
 
1432
endg
-
 
1433
 
-
 
1434
if 0
-
 
1435
     push eax
-
 
1436
     push edx
-
 
1437
     mov edx, 0x400   ;bocsh
-
 
1438
     mov al,0xff      ;bocsh
-
 
1439
     out dx, al       ;bocsh
-
 
1440
     pop edx
-
 
1441
     pop eax
-
 
1442
end if
-
 
1443
 
1122
 
1444
align 4
1123
align 4
1445
k_strrchr:
1124
k_strrchr:
1446
        push eax
1125
        push eax
1447
        xor eax,eax
1126
        xor eax,eax
Line 1658... Line 1337...
1658
.L2:
1337
.L2:
1659
        sub eax, [esp+4]
1338
        sub eax, [esp+4]
1660
	ret
1339
	ret
Line 1661... Line 1340...
1661
 
1340
 
-
 
1341
end if
-
 
1342
 
-
 
1343
if 0
-
 
1344
     push eax
-
 
1345
     push edx
-
 
1346
     mov edx, 0x400   ;bochs
-
 
1347
     mov al,0xff      ;bochs
-
 
1348
     out dx, al       ;bochs
-
 
1349
     pop edx
-
 
1350
     pop eax
-
 
1351
end if
-
 
1352