Subversion Repositories Kolibri OS

Rev

Rev 821 | Rev 940 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 821 Rev 924
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 821 $
8
$Revision: 924 $
9
 
9
 
Line 239... Line 239...
239
           mov ebx, [page_start]
239
           mov ebx, [page_start]
240
           mov edx, sys_pgmap
240
           mov edx, sys_pgmap
241
@@:
241
@@:
242
           xor eax, eax
242
           xor eax, eax
243
           xchg eax, [esi]
243
           xchg eax, [esi]
-
 
244
           push eax
244
           invlpg [edi]
245
           invlpg [edi]
-
 
246
           pop eax
Line 245... Line 247...
245
 
247
 
246
           test eax, 1
248
           test eax, 1
Line 247... Line 249...
247
           jz .next
249
           jz .next
Line 415... Line 417...
415
           test eax, 1
417
           test eax, 1
416
           jz .next
418
           jz .next
417
           mov dword [app_page_tabs+edi*4], 2
419
           mov dword [app_page_tabs+edi*4], 2
418
           mov ebx, edi
420
           mov ebx, edi
419
           shl ebx, 12
421
           shl ebx, 12
-
 
422
           push eax
420
           invlpg [ebx]
423
           invlpg [ebx]
-
 
424
           pop eax
421
           call free_page
425
           call free_page
Line 422... Line 426...
422
 
426
 
423
.next:     add edi, 1
427
.next:     add edi, 1
424
           cmp edi, esi
428
           cmp edi, esi
Line 1281... Line 1285...
1281
           shl edx, 2
1285
           shl edx, 2
1282
           shr edi, 10
1286
           shr edi, 10
1283
@@:
1287
@@:
1284
           mov [page_tabs+edi], eax
1288
           mov [page_tabs+edi], eax
1285
           mov [page_tabs+edi+edx], eax
1289
           mov [page_tabs+edi+edx], eax
-
 
1290
           invlpg [ebx]
-
 
1291
           invlpg [ebx+0x10000]
1286
           add eax, 0x1000
1292
           add eax, 0x1000
1287
           add ebx, 0x1000
1293
           add ebx, 0x1000
1288
           add edi, 4
1294
           add edi, 4
1289
           dec ecx
1295
           dec ecx
1290
           jnz @B
1296
           jnz @B
Line 1300... Line 1306...
1300
.fail:
1306
.fail:
1301
           ret
1307
           ret
1302
endp
1308
endp
Line -... Line 1309...
-
 
1309
 
-
 
1310
 
-
 
1311
 
-
 
1312
if 0
-
 
1313
 
-
 
1314
; under constuction
-
 
1315
 
-
 
1316
 
-
 
1317
shmem_list:
-
 
1318
    .bk       dd shmem_list
-
 
1319
    .fd       dd shmem_list
-
 
1320
 
-
 
1321
 
-
 
1322
shmem
-
 
1323
    .bk         dd ?
-
 
1324
    .fd         dd ?
-
 
1325
    .base       dd ?
-
 
1326
    .size       dd ?
-
 
1327
    .access     dd ?
-
 
1328
    .refcount   dd ?
-
 
1329
    .name       rb 32
-
 
1330
 
-
 
1331
 
-
 
1332
align 4
-
 
1333
proc shmem_open stdcall name:dword, size:dword, access:dword
-
 
1334
           locals
-
 
1335
              mapped    dd ?
-
 
1336
              shm       dd ?
-
 
1337
              pages     dd ?
-
 
1338
           endl
-
 
1339
 
-
 
1340
           push esi
-
 
1341
           push edi
-
 
1342
 
-
 
1343
           mov [mapped], 0
-
 
1344
 
-
 
1345
           mov eax, [name]
-
 
1346
           test eax, eax
-
 
1347
           jz .exit
-
 
1348
 
-
 
1349
           pushfd                      ;mutex required
-
 
1350
           cli
-
 
1351
 
-
 
1352
           mov ebx, [shmem_list.fd]
-
 
1353
@@:
-
 
1354
           cmp ebx, shmem_list
-
 
1355
           je .not_found
-
 
1356
 
-
 
1357
           lea edx, [edx+24] ; link , base, size
-
 
1358
           stdcall strncmp, edx, eax, 32
-
 
1359
           test eax, eax
-
 
1360
           je .found
-
 
1361
 
-
 
1362
           mov ebx, [ebx+4]
-
 
1363
           jmp @B
-
 
1364
.found:                               ;check access rights
-
 
1365
           mov eax, [access]
-
 
1366
           test eax, SHM_CREATE
-
 
1367
           mov ecx, [ebx+8]
-
 
1368
           jnz .fail_exist
-
 
1369
 
-
 
1370
           and eax, ACC_MASK
-
 
1371
           and ecx, ACC_MASK
-
 
1372
           cmp eax, ecx
-
 
1373
           jne .fail_acc
-
 
1374
 
-
 
1375
           stdcall user_alloc, [ebx+12]
-
 
1376
           test eax, eax
-
 
1377
           mov [mapped], eax
-
 
1378
           jz .fail_mem
-
 
1379
 
-
 
1380
           mov eax, [ebx+4]
-
 
1381
           mov ecx, [ebx+12]
-
 
1382
           shr ecx, 12
-
 
1383
           mov ebx, [mapped]
-
 
1384
           call commit_pages
-
 
1385
.exit:
-
 
1386
           mov eax, [mapped]
-
 
1387
           pop edi
-
 
1388
           pop esi
-
 
1389
           ret
-
 
1390
 
-
 
1391
.not_found:
-
 
1392
           mov eax, [access]
-
 
1393
           test eax, SHM_CREATE
-
 
1394
           mov ebx, E_NOTFOUND
-
 
1395
           jz .exit
-
 
1396
 
-
 
1397
;create shmem
-
 
1398
           mov ecx, [size]
-
 
1399
           test ecx, ecx
-
 
1400
           mov ebx, E_PARAM
-
 
1401
           jz .exit
-
 
1402
 
-
 
1403
           add ecx, 4095
-
 
1404
           and ecx, -4096
-
 
1405
           mov [size], ecx
-
 
1406
           stdcall user_alloc, ecx
-
 
1407
           test eax, eax
-
 
1408
           mov [mapped], eax
-
 
1409
           mov ebx, E_NOMEM
-
 
1410
           jz .exit
-
 
1411
 
-
 
1412
           mov eax, 24+32
-
 
1413
           call malloc
-
 
1414
           test eax, eax
-
 
1415
           mov [shm], eax
-
 
1416
           mov ebx, E_NOMEM
-
 
1417
           jz .exit                ;FIXME cleanup
-
 
1418
 
-
 
1419
           mov [eax+24+28], dword 0
-
 
1420
           lea edx, [eax+24]
-
 
1421
           stdcall strncpy, edx, [name], 31
-
 
1422
 
-
 
1423
           mov eax, [size]
-
 
1424
           shr eax, 12
-
 
1425
           mov esi, eax
-
 
1426
           stdcall alloc_pages, eax
-
 
1427
           test eax, eax
-
 
1428
           mov [pages], eax
-
 
1429
           mov ebx, E_NOMEM
-
 
1430
           jz .exit                ;FIXME cleanup
-
 
1431
 
-
 
1432
           mov edi, eax
-
 
1433
           add edi, [size]
-
 
1434
           and esi,  7
-
 
1435
           add esi, -8
-
 
1436
           jz @F
-
 
1437
 
-
 
1438
;release unused pages
-
 
1439
 
-
 
1440
.release:
-
 
1441
           mov eax, edi
-
 
1442
           add edi, 4096
-
 
1443
           call free_page
-
 
1444
           dec esi
-
 
1445
           jnz .release
-
 
1446
 
-
 
1447
           mov eax, [ebx+4]
-
 
1448
           mov ecx, [ebx+12]
-
 
1449
           shr ecx, 12
-
 
1450
           mov ebx, [mapped]
-
 
1451
           call commit_pages
-
 
1452
 
-
 
1453
           mov eax, [access]
-
 
1454
           and eax, ACC_MASK
-
 
1455
           or eax,  [pages]
-
 
1456
           mov ebx, [mapped]
-
 
1457
           mov ecx, [size]
-
 
1458
           shr ecx, 12
-
 
1459
           call commit_pages
-
 
1460
 
-
 
1461
           mov edx, [shm]
-
 
1462
           mov ecx, [pages]
-
 
1463
           mov [edx+8], ecx
-
 
1464
           mov ecx, [size]
-
 
1465
           mov [edx+12], ecx
-
 
1466
 
-
 
1467
    ;       mov [edx], shmem
-
 
1468
    ;       mov [edx+4], [shmem.fd]
-
 
1469
    ;       mov [shmem.fd.bk], edx
-
 
1470
    ;       mov [shmem.fd], edx
-
 
1471
 
-
 
1472
           xor ebx, ebx
-
 
1473
           jmp .exit
-
 
1474
 
-
 
1475
.fail_exist:
-
 
1476
           mov ebx, E_EXIST
-
 
1477
           xor eax, eax
-
 
1478
           ret
-
 
1479
.fail_access:
-
 
1480
           mov ebx, E_ACCESS
-
 
1481
           xor eax, eax
-
 
1482
           ret
-
 
1483
.fail_mem:
-
 
1484
           mov ebx, E_NOMEM
-
 
1485
           xor eax, eax
-
 
1486
           ret
-
 
1487
endp