Subversion Repositories Kolibri OS

Rev

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

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