equal
deleted
inserted
replaced
505 TPte* pt = GetOrAllocatePageTable(aAddr); |
505 TPte* pt = GetOrAllocatePageTable(aAddr); |
506 |
506 |
507 if(pinnedPt && pinnedPt!=pt) |
507 if(pinnedPt && pinnedPt!=pt) |
508 { |
508 { |
509 // previously pinned page table not needed... |
509 // previously pinned page table not needed... |
510 PageTableAllocator::UnpinPageTable(pinnedPt,aPinArgs); |
510 ::PageTables.UnpinPageTable(pinnedPt,aPinArgs); |
511 |
511 |
512 // make sure we have memory for next pin attempt... |
512 // make sure we have memory for next pin attempt... |
513 MmuLock::Unlock(); |
513 MmuLock::Unlock(); |
514 aPinArgs.AllocReplacementPages(KNumPagesToPinOnePageTable); |
514 aPinArgs.AllocReplacementPages(KNumPagesToPinOnePageTable); |
515 MmuLock::Lock(); |
|
516 if(!aPinArgs.HaveSufficientPages(KNumPagesToPinOnePageTable)) // if out of memory... |
515 if(!aPinArgs.HaveSufficientPages(KNumPagesToPinOnePageTable)) // if out of memory... |
517 { |
516 { |
518 // make sure we free any unneeded page table we allocated... |
517 // make sure we free any unneeded page table we allocated... |
519 if(pt) |
518 if(pt) |
520 FreePageTable(Mmu::PageDirectoryEntry(OsAsid(),aAddr)); |
519 FreePageTable(Mmu::PageDirectoryEntry(OsAsid(),aAddr)); |
|
520 MmuLock::Lock(); |
521 return 0; |
521 return 0; |
522 } |
522 } |
|
523 MmuLock::Lock(); |
523 } |
524 } |
524 |
525 |
525 if(!pt) |
526 if(!pt) |
526 return 0; // out of memory |
527 return 0; // out of memory |
527 |
528 |
537 SPageTableInfo* pti = SPageTableInfo::FromPtPtr(pt); |
538 SPageTableInfo* pti = SPageTableInfo::FromPtPtr(pt); |
538 if(!pti->IsDemandPaged()) |
539 if(!pti->IsDemandPaged()) |
539 return pt; |
540 return pt; |
540 |
541 |
541 // pin the page table... |
542 // pin the page table... |
|
543 if (::PageTables.PinPageTable(pt,aPinArgs) != KErrNone) |
|
544 {// Couldn't pin the page table... |
|
545 MmuLock::Unlock(); |
|
546 // make sure we free any unneeded page table we allocated... |
|
547 FreePageTable(Mmu::PageDirectoryEntry(OsAsid(),aAddr)); |
|
548 MmuLock::Lock(); |
|
549 return 0; |
|
550 } |
|
551 |
542 pinnedPt = pt; |
552 pinnedPt = pt; |
543 PageTableAllocator::PinPageTable(pinnedPt,aPinArgs); |
|
544 } |
553 } |
545 } |
554 } |
546 |
555 |
547 |
556 |
548 TInt DFineMapping::AllocateVirtualMemory(TMappingCreateFlags aFlags, TInt aOsAsid, TLinAddr aAddr, TUint aSize, TLinAddr aColourOffset) |
557 TInt DFineMapping::AllocateVirtualMemory(TMappingCreateFlags aFlags, TInt aOsAsid, TLinAddr aAddr, TUint aSize, TLinAddr aColourOffset) |
1483 TPte** pPt = PageTableArray(); |
1492 TPte** pPt = PageTableArray(); |
1484 TPte** pPtEnd = pPt+iNumPinnedPageTables; |
1493 TPte** pPtEnd = pPt+iNumPinnedPageTables; |
1485 |
1494 |
1486 MmuLock::Lock(); |
1495 MmuLock::Lock(); |
1487 while(pPt<pPtEnd) |
1496 while(pPt<pPtEnd) |
1488 PageTableAllocator::UnpinPageTable(*pPt++,aPinArgs); |
1497 ::PageTables.UnpinPageTable(*pPt++,aPinArgs); |
1489 MmuLock::Unlock(); |
1498 MmuLock::Unlock(); |
1490 iNumPinnedPageTables = 0; |
1499 iNumPinnedPageTables = 0; |
1491 |
1500 |
1492 if(!iMaxCount) |
1501 if(!iMaxCount) |
1493 FreePageTableArray(); |
1502 FreePageTableArray(); |