Subversion Repositories Kolibri OS

Rev

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

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