Subversion Repositories Kolibri OS

Rev

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

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