Subversion Repositories Kolibri OS

Rev

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