kernel/eka/memmodel/epoc/flexible/mmu/mmapping.cpp
changeset 6 0173bcd7697c
parent 4 56f325a607ea
child 14 5d2844f35677
equal deleted inserted replaced
4:56f325a607ea 6:0173bcd7697c
   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();