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 | endp0>> |
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 |