Subversion Repositories Kolibri OS

Rev

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