Subversion Repositories Kolibri OS

Rev

Rev 420 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
164 serge 1
 
2
proc alloc_page
3
4
 
5
           cli
6
           mov ebx, [page_start]
7
           mov ecx, [page_end]
8
.l1:
9
           bsf eax,[ebx];
10
           jnz .found
11
           add ebx,4
12
           cmp ebx, ecx
13
           jb .l1
14
           popfd
15
           xor eax,eax
16
           ret
17
.found:
18
           btr [ebx], eax
19
           mov [page_start],ebx
20
           sub ebx, sys_pgmap
21
           lea eax, [eax+ebx*8]
254 serge 22
           shl eax, 12
164 serge 23
           dec [pg_data.pages_free]
24
           popfd
25
           ret
26
endp
27
28
 
29
proc alloc_pages stdcall, count:dword
30
           pushfd
31
           cli
32
           mov eax, [count]
33
           add eax, 7
34
           shr eax, 3
35
           mov [count], eax
36
           cmp eax, [pg_data.pages_free]
37
           ja .fail
38
39
 
40
           mov ebx, [page_end]
41
.find:
42
           mov edx, [count]
43
           mov edi, ecx
44
.match:
45
           cmp byte [ecx], 0xFF
46
           jne .next
47
           dec edx
48
           jz .ok
49
           inc ecx
50
           cmp ecx,ebx
51
           jb .match
52
.fail:     xor eax, eax
53
           popfd
54
           ret
55
.next:
56
           inc ecx
57
           cmp ecx, ebx
58
           jb .find
59
           popfd
60
           xor eax, eax
61
           ret
62
.ok:
63
           sub ecx, edi
64
           inc ecx
65
           mov esi, edi
66
           xor eax, eax
67
           rep stosb
68
           sub esi, sys_pgmap
69
           shl esi, 3+12
70
           mov eax, esi
71
           mov ebx, [count]
72
           shl ebx, 3
73
           sub [pg_data.pages_free], ebx
74
           popfd
75
           ret
76
endp
77
78
 
79
proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword
80
           push ebx
321 diamond 81
           mov eax, [phis_addr]
164 serge 82
           and eax, not 0xFFF
83
           or eax, [flags]
84
           mov ebx, [lin_addr]
85
           shr ebx, 12
86
           mov [page_tabs+ebx*4], eax
365 serge 87
           mov eax, [lin_addr]
164 serge 88
           invlpg [eax]
89
           pop ebx
321 diamond 90
           ret
164 serge 91
endp
92
93
 
94
map_space:    ;not implemented
281 serge 95
96
 
97
 
98
99
 
100
 
101
proc free_page
164 serge 102
;arg:  eax  page address
103
           pushfd
104
           cli
105
           shr eax, 12              ;page index
106
           mov ebx, sys_pgmap
107
           bts [ebx], eax           ;that's all!
108
           cmc
291 serge 109
           adc [pg_data.pages_free], 0
328 serge 110
           shr eax, 3
164 serge 111
           and eax, not 3           ;dword offset from page_map
112
           add eax, ebx
113
           cmp [page_start], eax
114
           ja @f
115
           popfd
116
           ret
117
@@:
118
           mov [page_start], eax
119
           popfd
120
           ret
121
endp
122
123
 
279 serge 124
;  eax= page base + page flags
328 serge 125
;  ebx= liear address
281 serge 126
;  ecx= count
127
128
 
129
commit_pages:
328 serge 130
281 serge 131
 
328 serge 132
           jz .fail
133
281 serge 134
 
328 serge 135
           mov ebx, pg_data.pg_mutex
136
           call wait_mutex      ;ebx
137
138
 
139
           mov ebx, edi
140
           shr ebx, 12
141
@@:
142
           mov [page_tabs+ebx*4], eax
365 serge 143
           invlpg [edi]
328 serge 144
           add edi, edx
145
           add eax, edx
146
           inc ebx
147
           dec ecx
148
           jnz @B
149
           mov [pg_data.pg_mutex],ecx
150
.fail:
151
           ret
281 serge 152
153
 
328 serge 154
 
281 serge 155
;  eax= base
279 serge 156
;  ecx= count
281 serge 157
279 serge 158
 
164 serge 159
release_pages:
279 serge 160
321 diamond 161
 
162
           mov ebx, pg_data.pg_mutex
279 serge 163
           call wait_mutex      ;ebx
164
165
 
166
           mov edi, eax
167
168
 
169
           add esi, page_tabs
365 serge 170
328 serge 171
 
172
           mov ebx, [page_start]
279 serge 173
           mov edx, sys_pgmap
174
@@:
175
           xor eax, eax
176
           xchg eax, [esi]
177
           invlpg [edi]
178
179
 
180
           jz .next
181
182
 
183
           bts [edx], eax
184
           cmc
291 serge 185
           adc ebp, 0
328 serge 186
           shr eax, 3
279 serge 187
           and eax, -4
188
           add eax, edx
189
           cmp eax, ebx
190
           jae .next
191
192
 
193
.next:
194
           add edi, 0x1000
195
           add esi, 4
196
           dec ecx
197
           jnz @B
198
           mov [pg_data.pages_free], ebp
328 serge 199
           and [pg_data.pg_mutex],0
279 serge 200
           popad
321 diamond 201
           ret
279 serge 202
203
 
204
proc map_page_table stdcall, lin_addr:dword, phis_addr:dword
188 serge 205
           push ebx
321 diamond 206
           mov ebx, [lin_addr]
164 serge 207
           shr ebx, 22
208
           mov eax, [phis_addr]
209
           and eax, not 0xFFF
210
           or eax, PG_UW          ;+PG_NOCACHE
211
           mov dword [master_tab+ebx*4], eax
378 serge 212
           mov eax, [lin_addr]
164 serge 213
           shr eax, 10
214
           add eax, page_tabs
365 serge 215
           invlpg [eax]
164 serge 216
           pop ebx
321 diamond 217
           ret
164 serge 218
endp
219
220
 
221
proc init_LFB
222
           locals
378 serge 223
             pg_count dd ?
224
           endl
225
226
 
164 serge 227
           jne @f
228
           mov [BOOT_VAR+0x901c],byte 2
388 serge 229
           stdcall kernel_alloc, 0x280000
164 serge 230
           mov [LFBAddress], eax
231
           ret
232
@@:
233
           test [SCR_MODE],word 0100000000000000b
234
           jnz @f
211 serge 235
           mov [BOOT_VAR+0x901c],byte 2
388 serge 236
           ret
211 serge 237
@@:
238
           mov edx, LFB_BASE
378 serge 239
           mov esi, [LFBAddress]
240
           mov edi, 0x00800000
388 serge 241
           mov dword [exp_lfb+4], edx
379 serge 242
214 serge 243
 
164 serge 244
           mov [pg_count], edi
245
           shr edi, 10
246
247
 
248
           jnc .map_page_tables
249
           or esi, PG_LARGE+PG_UW
250
           mov edx, sys_pgdir+(LFB_BASE shr 20)
400 serge 251
@@:
164 serge 252
           mov [edx], esi
400 serge 253
           add edx, 4
378 serge 254
           add esi, 0x00400000
164 serge 255
           dec edi
256
           jnz @B
257
258
 
207 serge 259
           jnc @F
260
           or dword [sys_pgdir+(LFB_BASE shr 20)], PG_GLOBAL
400 serge 261
@@:
207 serge 262
           mov dword [LFBAddress], LFB_BASE
378 serge 263
           mov eax, cr3       ;flush TLB
164 serge 264
           mov cr3, eax
265
           ret
266
267
 
268
269
 
270
           call alloc_page
271
           stdcall map_page_table, edx, eax
378 serge 272
           add edx, 0x00400000
388 serge 273
           dec edi
164 serge 274
           jnz @B
275
276
 
277
           mov edi, page_tabs + (LFB_BASE shr 10)
378 serge 278
           or eax, PG_UW
164 serge 279
           mov ecx, [pg_count]
280
           cld
378 serge 281
@@:
388 serge 282
           stosd
283
           add eax, 0x1000
284
           dec ecx
285
           jnz @B
286
164 serge 287
 
378 serge 288
           mov eax, cr3       ;flush TLB
164 serge 289
           mov cr3, eax
290
291
 
292
endp
293
294
 
295
proc new_mem_resize stdcall, new_size:dword
296
297
 
276 serge 298
           call wait_mutex    ;ebx
299
164 serge 300
 
301
           add edi,4095
302
           and edi,not 4095
303
           mov [new_size], edi
304
305
 
427 serge 306
           cmp [edx+APPDATA.heap_base],0
307
           jne .exit
172 serge 308
309
 
427 serge 310
           add esi, 4095
164 serge 311
           and esi, not 4095
312
313
 
314
           jae .expand
315
316
 
317
           shr esi, 12
318
@@:
319
           mov eax, [app_page_tabs+edi*4]
378 serge 320
           test eax, 1
164 serge 321
           jz .next
322
           mov dword [app_page_tabs+edi*4], 2
378 serge 323
           mov ebx, edi
164 serge 324
           shl ebx, 12
325
           invlpg [ebx+std_application_base_address]
326
           call free_page
327
328
 
329
           cmp edi, esi
330
           jb @B
331
332
 
333
           mov     ebx, [new_size]
427 serge 334
           call    update_mem_size
335
164 serge 336
 
337
           dec [pg_data.pg_mutex]
338
           ret
339
.expand:
340
341
 
342
           push edi
343
344
 
345
           and edi, not(0x3FFFFF)
346
           add esi, 0x3FFFFF
347
           and esi, not(0x3FFFFF)
348
349
 
350
           jae .grow
351
352
 
353
354
 
355
           call alloc_page
356
           test eax, eax
357
           jz .exit
358
359
 
188 serge 360
164 serge 361
 
362
           shr edi, 10
363
           add edi, page_tabs
365 serge 364
           mov ecx, 1024
164 serge 365
           xor eax, eax
366
           cld
367
           rep stosd
368
           pop edi
369
370
 
371
           cmp edi, esi
372
           jb @B
373
.grow:
374
           pop edi
375
           pop esi
376
@@:
377
           call alloc_page
378
           test eax, eax
379
           jz .exit
380
           stdcall map_page,esi,eax,dword PG_UW
381
382
 
383
           mov edi, esi
384
           xor eax, eax
385
           mov ecx, 1024
386
           cld
387
           rep stosd
388
           pop edi
389
390
 
391
           cmp esi, edi
392
           jb  @B
294 diamond 393
164 serge 394
 
395
.exit:
396
           xor eax, eax
397
           inc eax
398
           dec [pg_data.pg_mutex]
399
           ret
400
endp
401
402
 
294 diamond 403
; in: edx = slot base
427 serge 404
;     ebx = new memory size
294 diamond 405
; destroys eax,ecx,edx
406
407
 
427 serge 408
;search threads and update
294 diamond 409
;application memory size infomation
410
           mov    ecx,[APPDATA.dir_table+edx]
427 serge 411
           mov    eax,2
294 diamond 412
413
 
414
;eax = current slot
415
;ebx = new memory size
416
;ecx = page directory
417
           cmp    eax,[TASK_COUNT]
418
           jg     .search_threads_end
419
           mov    edx,eax
420
           shl    edx,5
421
           cmp    word [CURRENT_TASK+edx+TASKDATA.state],9 ;if slot empty?
422
           jz     .search_threads_next
423
           shl    edx,3
424
           cmp    [SLOT_BASE+edx+APPDATA.dir_table],ecx     ;if it is our thread?
380 serge 425
           jnz    .search_threads_next
294 diamond 426
           mov    [SLOT_BASE+edx+APPDATA.mem_size],ebx     ;update memory size
380 serge 427
.search_threads_next:
294 diamond 428
           inc    eax
429
           jmp    .search_threads
430
.search_threads_end:
431
           ret
432
433
 
285 serge 434
;  eax= linear address
435
;
436
; retval
437
;  eax= phisical page address
438
439
 
164 serge 440
get_pg_addr:
285 serge 441
           shr eax, 12
442
           mov eax, [page_tabs+eax*4]
365 serge 443
           and eax, 0xFFFFF000
164 serge 444
           ret
445
446
 
418 serge 447
 
188 serge 448
proc page_fault_handler
164 serge 449
418 serge 450
 
451
        .err_addr equ ebp-4
452
453
 
164 serge 454
           mov ebp, esp
455
           mov eax, cr2
456
           push eax
172 serge 457
164 serge 458
 
427 serge 459
           mov ds, ax
164 serge 460
           mov es, ax
188 serge 461
164 serge 462
 
188 serge 463
464
 
427 serge 465
     push edx
466
     mov edx, 0x400   ;bochs
467
     mov al,0xff      ;bochs
468
     out dx, al       ;bochs
469
     pop edx
470
     pop eax
471
472
 
418 serge 473
           mov eax, [.err_code]
419 serge 474
164 serge 475
 
419 serge 476
           jb .user_space      ;ñòðàíèöà â ïàìÿòè ïðèëîæåíèÿ ;
427 serge 477
164 serge 478
 
419 serge 479
           jb .kernel_space    ;ñòðàíèöà â ïàìÿòè ÿäðà
480
394 serge 481
 
419 serge 482
           jb .alloc;.app_tabs ;òàáëèöû ñòðàíèö ïðèëîæåíèÿ ;
427 serge 483
                               ;ïðîñòî ñîçäàäèì îäíó
419 serge 484
188 serge 485
 
419 serge 486
           jb .core_tabs       ;òàáëèöû ñòðàíèö ÿäðà
487
                               ;Îøèáêà
488
.lfb:
489
                               ;îáëàñòü LFB
490
                               ;Îøèáêà
491
           jmp .fail
492
378 serge 493
 
419 serge 494
.user_space:
495
           test eax, PG_MAP
496
           jnz .err_access     ;Ñòðàíèöà ïðèñóòñòâóåò
497
                               ;Îøèáêà äîñòóïà ?
498
395 serge 499
 
164 serge 500
           mov ecx, ebx
172 serge 501
           shr ecx, 10
502
           mov edx, [master_tab+ecx*4]
503
           test edx, PG_MAP
419 serge 504
           jz .fail            ;òàáëèöà ñòðàíèö íå ñîçäàíà
505
                               ;íåâåðíûé àäðåñ â ïðîãðàììå
506
172 serge 507
 
365 serge 508
           test eax, 2
164 serge 509
           jz .fail            ;àäðåñ íå çàðåçåðâèðîâàí äëÿ ;
427 serge 510
                               ;èñïîëüçîâàíèÿ. Îøèáêà
419 serge 511
.alloc:
188 serge 512
           call alloc_page
164 serge 513
           and eax, eax
514
           jz .fail
419 serge 515
164 serge 516
 
517
518
 
188 serge 519
           and edi, 0xFFFFF000
520
           mov ecx, 1024
164 serge 521
           xor eax, eax
522
           cld
188 serge 523
           rep stosd
524
.exit:
164 serge 525
           mov esp, ebp
526
           popad
527
           add esp, 4
528
           iretd
529
419 serge 530
 
531
;íèêîãäà íå ïðîèñõîäèò
532
           jmp .fail
533
534
 
535
           test eax, PG_MAP
536
           jz .fail        ;ñòðàíèöà íå ïðèñóòñòâóåò
537
538
 
539
           jnz .fail       ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè
540
                           ;ÿäðà
541
           test eax, 8
542
           jnz .fail       ;óñòàíîâëåí çàðåçåðâèðîâàííûé áèò
543
                           ;â òàáëèöàõ ñòðàíèö. äîáàâëåíî â P4/Xeon
544
545
 
546
;íå îáðàáàòûâàåì. Îøèáêà
547
548
 
549
.fail:
172 serge 550
           mov esp, ebp
551
           popad
552
           add esp, 4
553
           iretd
388 serge 554
164 serge 555
 
172 serge 556
557
 
558
           jmp exc_c
559
           iretd
560
561
 
419 serge 562
;           shr ebx, 12
188 serge 563
;           mov eax, [page_tabs+ebx*4]
365 serge 564
;           shr ebx, 10
188 serge 565
;           mov eax, [master_tab+ebx*4]
566
           jmp .exit
567
;.old_addr:
419 serge 568
;           shr ebx, 12
188 serge 569
;           mov eax, [page_tabs+ebx*4]
365 serge 570
;           shr ebx, 10
188 serge 571
;           mov eax, [master_tab+ebx*4]
572
           jmp .exit
573
;.lfb_addr:
419 serge 574
;           shr ebx, 22
188 serge 575
;           ;mov ecx, [sys_page_dir]
576
;           mov eax, [master_tab+ebx*4]
577
           jmp .exit
578
;.tab_space:
419 serge 579
;           shr ebx, 12
188 serge 580
;           mov eax, [page_tabs+ebx*4]
365 serge 581
;           shr ebx, 10
188 serge 582
;           ;mov ecx, [sys_page_dir]
583
;           mov eax, [master_tab+ebx*4]
584
;           jmp .exit
419 serge 585
endp
164 serge 586
587
 
588
proc map_mem stdcall, lin_addr:dword,pdir:dword,\
589
                      ofs:dword,buf_size:dword
590
           mov eax, [buf_size]
591
           test eax, eax
592
           jz .exit
593
594
 
595
           and eax, 0xFFFFF000
596
597
 
598
           mov ebx, [ofs]
599
           shr ebx, 22
600
           mov esi, [ipc_pdir]
601
           mov edi, [ipc_ptab]
602
           mov eax, [esi+ebx*4]
603
           and eax, 0xFFFFF000
604
           test eax, eax
605
           jz .exit
606
           stdcall map_page,edi,eax,dword PG_UW
607
;           inc ebx
608
;           add edi, 0x1000
609
;           mov eax, [esi+ebx*4]
610
;           test eax, eax
611
;           jz @f
612
;          and eax, 0xFFFFF000
613
;           stdcall map_page, edi, eax
614
615
 
616
           and edi, 0xFFFFF000
617
           mov ecx, [buf_size]
618
           add ecx, 4095
619
           shr ecx, 12
620
           inc ecx
621
622
 
623
           shr edx, 12
624
           and edx, 0x3FF
625
           mov esi, [ipc_ptab]
626
627
 
628
           and eax, 0xFFFFF000
629
           test eax, eax
630
           jz .exit
631
           stdcall map_page,edi,eax,dword PG_UW
632
           add edi, 0x1000
633
           inc edx
634
           dec ecx
635
           jnz .map
636
637
 
638
           ret
639
endp
640
641
 
642
proc map_memEx stdcall, lin_addr:dword,pdir:dword,\
643
                        ofs:dword,buf_size:dword
644
           mov eax, [buf_size]
645
           test eax, eax
646
           jz .exit
647
648
 
649
           and eax, 0xFFFFF000
650
651
 
652
           mov ebx, [ofs]
653
           shr ebx, 22
654
           mov esi, [proc_mem_pdir]
655
           mov edi, [proc_mem_tab]
656
           mov eax, [esi+ebx*4]
657
           and eax, 0xFFFFF000
658
           test eax, eax
659
           jz .exit
660
           stdcall map_page,edi,eax,dword PG_UW
661
662
 
663
           and edi, 0xFFFFF000
664
           mov ecx, [buf_size]
665
           add ecx, 4095
666
           shr ecx, 12
667
           inc ecx
668
669
 
670
           shr edx, 12
671
           and edx, 0x3FF
672
           mov esi, [proc_mem_tab]
673
674
 
675
;           and eax, 0xFFFFF000
676
;           test eax, eax
677
;           jz .exit
678
           stdcall map_page,edi,eax,dword PG_UW
679
           add edi, 0x1000
680
           inc edx
681
           dec ecx
682
           jnz .map
683
.exit:
684
           ret
685
endp
686
687
 
688
 
689
 
690
 
691
;input:
692
;  eax=1 - set ipc buffer area
693
;    ebx=address of buffer
694
;    ecx=size of buffer
695
;  eax=2 - send message
696
;    ebx=PID
697
;    ecx=address of message
698
;    edx=size of message
699
700
 
701
           jne @f
702
           call set_ipc_buff
703
           mov [esp+36], eax
704
           ret
705
@@:
706
           cmp eax, 2
707
           jne @f
708
           stdcall sys_ipc_send, ebx, ecx, edx
709
           mov [esp+36], eax
710
           ret
711
@@:
712
           xor eax, eax
713
           not eax
714
           mov [esp+36], eax
715
           ret
716
717
 
718
proc set_ipc_buff
719
720
 
427 serge 721
           pushf
164 serge 722
           cli
723
           mov  [eax+APPDATA.ipc_start],ebx     ;set fields in extended information area
427 serge 724
           mov  [eax+APPDATA.ipc_size],ecx
725
164 serge 726
 
727
           add ecx, 4095
728
           and ecx, not 4095
729
730
 
731
           add ebx, 0x1000
732
           cmp ebx, ecx
733
           jna .touch
734
735
 
736
           xor eax, eax
737
           ret
738
endp
739
740
 
741
           locals
742
             dst_slot   dd ?
743
             dst_offset dd ?
744
             buf_size   dd ?
745
           endl
746
747
 
748
           cli
749
750
 
751
           call pid_to_slot
752
           test eax,eax
753
           jz   .no_pid
754
755
 
756
           shl  eax,8
757
           mov  edi,[eax+SLOT_BASE+0xa0]  ;is ipc area defined?
380 serge 758
           test edi,edi
164 serge 759
           jz   .no_ipc_area
760
761
 
762
       ;    add edi, new_app_base
419 serge 763
           and ebx, 0xFFF
164 serge 764
           mov [dst_offset], ebx
765
766
 
380 serge 767
           mov [buf_size], esi
164 serge 768
769
 
380 serge 770
                             edi, esi
164 serge 771
772
 
773
           add edi, [ipc_tmp]
774
           cmp dword [edi], 0
775
           jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
776
227 serge 777
 
164 serge 778
           mov edx, ebx
779
           add ebx, 8
780
           add ebx, [msg_size]
781
           cmp ebx, [buf_size]
782
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
783
227 serge 784
 
164 serge 785
           mov eax,[TASK_BASE]
786
           mov eax, [eax+0x04]         ;eax - our PID
787
           mov edi, [dst_offset]
788
           add edi, [ipc_tmp]
789
           add edi, edx
790
           mov [edi], eax
791
           mov ecx, [msg_size]
792
793
 
794
           add edi, 8
795
           mov esi, [msg_addr]
796
       ;    add esi, new_app_base
419 serge 797
           cld
164 serge 798
           rep movsb
799
800
 
801
           mov edx, ebx
802
           shr ebx, 12
803
           xor eax, eax
804
           mov [page_tabs+ebx*4], eax
365 serge 805
           invlpg [edx]
164 serge 806
807
 
808
           mov edx, ebx
809
           shr ebx, 12
810
           xor eax, eax
811
           mov [page_tabs+ebx*4], eax
365 serge 812
           invlpg [edx]
164 serge 813
814
 
815
           mov edx, ebx
816
           shr ebx, 12
817
           xor eax, eax
818
           mov [page_tabs+ebx*4], eax
365 serge 819
           invlpg [edx]
164 serge 820
821
 
822
           shl eax, 8
823
           or   [eax+SLOT_BASE+0xA8],dword 0x40
380 serge 824
           cmp  dword [check_idle_semaphore],20
164 serge 825
           jge  .ipc_no_cis
826
827
 
828
.ipc_no_cis:
829
           popf
830
           xor eax, eax
831
           ret
832
.no_pid:
833
           popf
834
           mov  eax, 4
835
           ret
836
.no_ipc_area:
837
           popf
838
           xor eax, eax
839
           inc eax
840
           ret
841
.ipc_blocked:
842
           popf
843
           mov  eax, 2
844
           ret
845
.buffer_overflow:
846
           popf
847
           mov  eax, 3
848
           ret
849
endp
850
851
 
852
sysfn_meminfo:
170 serge 853
164 serge 854
 
419 serge 855
           cmp ebx, OS_BASE
856
           jae .fail
857
172 serge 858
 
164 serge 859
           mov [ebx], eax
170 serge 860
           shl eax, 12
172 serge 861
           mov [esp+36], eax
862
           mov ecx, [pg_data.pages_free]
170 serge 863
           mov [ebx+4], ecx
864
           mov edx, [pg_data.pages_faults]
865
           mov [ebx+8], edx
866
           mov esi, [heap_size]
867
           mov [ebx+12], esi
868
           mov edi, [heap_free]
869
           mov [ebx+16], edi
870
           mov eax, [heap_blocks]
871
           mov [ebx+20], eax
872
           mov ecx, [free_blocks]
873
           mov [ebx+24], ecx
874
           ret
164 serge 875
.fail:
172 serge 876
           mov dword [esp+36], -1
877
           ret
878
164 serge 879
 
880
new_services:
881
882
 
883
           jle  sys_sheduler
884
885
 
170 serge 886
           jb .fail
164 serge 887
           ja @f
888
889
 
188 serge 890
           mov [esp+36], eax
164 serge 891
           ret
892
@@:
893
           cmp eax, 12
894
           ja @f
895
896
 
897
           mov [esp+36], eax
898
           ret
899
@@:
900
           cmp eax, 13
901
           ja @f
902
           stdcall user_free, ebx
903
           mov [esp+36], eax
904
           ret
905
@@:
906
           cmp eax, 14
907
           ja @f
908
           cmp ebx, OS_BASE
419 serge 909
           jae .fail
910
           stdcall get_event_ex, ebx, ecx
227 serge 911
           mov [esp+36], eax
912
           ret
164 serge 913
@@:
914
           cmp eax, 15
915
           ja @f
916
           mov ecx, [current_slot]
427 serge 917
           mov eax, [ecx+APPDATA.fpu_handler]
918
           mov [ecx+APPDATA.fpu_handler], ebx
919
           mov [esp+36], eax
164 serge 920
           ret
921
@@:
922
           cmp eax, 16
923
           ja @f
924
925
 
188 serge 926
           jz .fail
927
           cmp ebx, OS_BASE
419 serge 928
           jae .fail
929
           stdcall get_service, ebx
164 serge 930
           mov [esp+36], eax
931
           ret
932
@@:
933
           cmp eax, 17
934
           ja @f
935
           call srv_handlerEx   ;ebx
378 serge 936
           mov [esp+36], eax
164 serge 937
           ret
938
@@:
168 serge 939
           cmp eax, 18
940
           ja @f
941
           mov ecx, [current_slot]
427 serge 942
           mov eax, [ecx+APPDATA.sse_handler]
943
           mov [ecx+APPDATA.sse_handler], ebx
944
           mov [esp+36], eax
168 serge 945
           ret
946
@@:
164 serge 947
           cmp eax, 19
198 serge 948
           ja .fail
227 serge 949
      ;     add ebx, new_app_base
419 serge 950
           cmp ebx, OS_BASE
951
           jae .fail
952
           stdcall load_library, ebx
198 serge 953
           mov [esp+36], eax
954
           ret
955
227 serge 956
 
164 serge 957
           xor eax, eax
958
           mov [esp+36], eax
959
           ret
960
961
 
962
proc init_mtrr
963
964
 
388 serge 965
           je  .exit
164 serge 966
967
 
211 serge 968
           jnc .exit
969
970
 
164 serge 971
           or eax, 0x60000000   ;disable caching
972
           mov cr0, eax
973
           wbinvd               ;invalidate cache
974
975
 
976
           rdmsr                ;
977
           push eax
978
979
 
980
           xor eax, eax
981
           mov ecx, 0x2FF
982
           wrmsr                ;disable all MTRR
983
984
 
985
           stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
986
           xor edx, edx
987
           xor eax, eax
988
           mov ecx, 0x204
989
           mov ebx, 6
990
@@:
991
           wrmsr                ;disable unused MTRR
992
           inc ecx
993
           wrmsr
994
           inc ecx
995
           dec ebx
996
           jnz @b
997
998
 
999
1000
 
1001
           or eax, 0x800        ;set default memtype to UC
1002
           and al, 0xF0
1003
           mov ecx, 0x2FF
1004
           wrmsr                ;and enable MTRR
1005
1006
 
1007
           and eax, not 0x60000000
1008
           mov cr0, eax         ; enable caching
1009
.exit:
1010
           ret
1011
endp
1012
1013
 
1014
proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
1015
1016
 
1017
           mov eax, [base]
1018
           or eax, [mem_type]
1019
           mov ecx, [reg]
1020
           lea ecx, [0x200+ecx*2]
1021
           wrmsr
1022
1023
 
1024
           dec ebx
1025
           mov eax, 0xFFFFFFFF
1026
           mov edx, 0x0000000F
1027
           sub eax, ebx
1028
           sbb edx, 0
1029
           or eax, 0x800
1030
           inc ecx
1031
           wrmsr
1032
           ret
1033
endp
1034
1035
 
388 serge 1036
 
172 serge 1037
proc strncmp stdcall, str1:dword, str2:dword, count:dword
388 serge 1038
1039
 
1040
          jecxz .end
1041
1042
 
1043
1044
 
1045
          mov esi,edi
1046
          xor eax,eax
1047
          repne scasb
1048
          neg ecx             ; cx = count - strlen
1049
          add ecx,ebx         ; strlen + count - strlen
1050
1051
 
1052
          mov edi,esi
1053
          mov esi,[str2]
1054
          repe cmpsb
1055
          mov al,[esi-1]
1056
          xor ecx,ecx
1057
1058
 
1059
          ja .str2_big
1060
          je .end
1061
1062
 
1063
          sub ecx,2
1064
1065
 
1066
          not ecx
1067
.end:
1068
          mov eax,ecx
1069
          ret
1070
endp
1071
1072
 
1073
proc stall stdcall, delay:dword
172 serge 1074
           push ecx
1075
           push edx
1076
           push ebx
1077
           push eax
1078
1079
 
1080
           mul [stall_mcs]
1081
           mov ebx, eax       ;low
1082
           mov ecx, edx       ;high
1083
           rdtsc
1084
           add ebx, eax
1085
           adc ecx,edx
1086
@@:
1087
           rdtsc
1088
           sub eax, ebx
1089
           sbb edx, ecx
1090
           jb @B
1091
1092
 
1093
           pop ebx
1094
           pop edx
1095
           pop ecx
1096
           ret
1097
endp
1098
1099
 
164 serge 1100
k_strrchr:
237 serge 1101
        push eax
1102
        xor eax,eax
1103
        or  ecx,-1
1104
        repne scasb
1105
        add ecx,1
1106
        neg ecx
1107
        sub edi,1
1108
        pop eax
1109
        std
1110
        repne scasb
1111
        cld
1112
        add edi,1
1113
1114
 
1115
        jne @F
1116
        mov eax,edi
1117
        ret
1118
@@:
1119
        xor eax,eax
1120
        ret
1121
1122
 
1123
proc k_strncpy stdcall, dest:dword, src:dword, maxlen:dword
1124
        mov eax, [dest]
1125
        mov esi, [src]
1126
        mov ecx, [maxlen]
1127
        test eax, eax
1128
        jz .L9
1129
        test esi, esi
1130
        jz .L9
1131
        test ecx, ecx
1132
        jz .L9
1133
1134
 
1135
        jmp .L1
1136
1137
 
1138
.L2:
1139
        mov edx, [esi+eax]
1140
        mov [eax], dl
1141
        test dl, dl
1142
        jz .L7
1143
1144
 
1145
        test dh, dh
1146
        jz .L6
1147
1148
 
1149
        mov [eax+2],dl
1150
        test dl, dl
1151
        jz .L5
1152
1153
 
1154
        test dh, dh
1155
        jz .L4
1156
        add eax, 4
1157
.L1:
1158
        sub ecx, 4
1159
        jae .L2
1160
1161
 
1162
        jz .L9
1163
1164
 
1165
        mov [eax], dl
1166
        test dl, dl
1167
        jz .L3
1168
1169
 
1170
        dec ecx
1171
        jz .L9
1172
1173
 
1174
        mov [eax], dl
1175
        test dl, dl
1176
        jz .L3
1177
1178
 
1179
        dec ecx
1180
        jz .L9
1181
1182
 
1183
        mov [eax], dl
1184
        test dl, dl
1185
        jz .L3
1186
1187
 
1188
        jmp .L9
1189
1190
 
1191
        inc eax
1192
1193
 
1194
        inc eax
1195
1196
 
1197
        inc eax
1198
.L7:
1199
        add ecx,3
1200
        jz .L9
1201
.L8:
1202
        mov byte [ecx+eax], 0
1203
.L3:
1204
        dec ecx
1205
        jnz .L8
1206
.L9:
1207
	ret
1208
endp
1209
1210
 
1211
1212
 
1213
1214
 
1215
        mov eax,[esp+4]
1216
        mov edx, 3
1217
1218
 
1219
        jz .L1
1220
        jp .L0
1221
1222
 
1223
        je .L2
1224
1225
 
1226
        cmp dh, byte [eax]
1227
1228
 
1229
1230
 
1231
        xor edx, 2
1232
1233
 
1234
.L0:
1235
        cmp dh, [eax]
1236
        je .L2
1237
1238
 
1239
        xor edx, edx
1240
1241
 
1242
        mov ecx, [eax]
1243
        add eax, 4
1244
1245
 
1246
        add ecx, magic
1247
1248
 
1249
        jnc .L3
1250
1251
 
1252
        and edx, not magic
1253
        jne .L3
1254
1255
 
1256
        add eax, 4
1257
1258
 
1259
        add ecx, magic
1260
        dec edx
1261
        jnc .L3
1262
1263
 
1264
        and edx, not magic
1265
        jne .L3
1266
1267
 
1268
        add eax, 4
1269
1270
 
1271
        add ecx, magic
1272
1273
 
1274
        jnc .L3
1275
1276
 
1277
1278
 
1279
        jne .L3
1280
1281
 
1282
        add eax, 4
1283
1284
 
1285
        add ecx, magic
1286
1287
 
1288
        jnc .L3
1289
1290
 
1291
1292
 
1293
        je .L1
1294
1295
 
1296
        sub ecx, magic
1297
1298
 
1299
        jz .L2
1300
1301
 
1302
        test ch, ch
1303
        jz .L2
1304
1305
 
1306
        inc eax
1307
1308
 
1309
        jz .L2
1310
1311
 
1312
1313
 
1314
        sub eax, [esp+4]
1315
	ret
1316
1317
 
1318
388 serge 1319
 
1320
     push eax
1321
     push edx
1322
     mov edx, 0x400   ;bochs
420 serge 1323
     mov al,0xff      ;bochs
1324
     out dx, al       ;bochs
1325
     pop edx
388 serge 1326
     pop eax
1327
end if
1328