⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 single_armpage.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 2 页
字号:

//无效当前系统的所有的页
static void ClearPageTable ( LPTHREAD lpThread )// PAGE_TABLE_SLOTS * lpCurPTS )
{
//	if( lpThread->pageTable.lpdwFirstLevelEntry )
//		ClearThreadPageTable( &lpThread->pageTable );
	if( pageTable.lpdwFirstLevelEntry )
		ClearThreadPageTable( &pageTable );
}

#define DEBUG_FlushCacheAndClearTLB 0
void FlushCacheAndClearTLB( void )
{
	UINT uiSave;

	DEBUGMSG( DEBUG_FlushCacheAndClearTLB, ( "FlushCacheAndClearTLB++.\r\n" ) );
	LockIRQSave( &uiSave );


    FlushDCache();
    FlushICache();
	ClearPageTable( lpCurThread );
    TLBClear();     // clear h/w TLBs

	UnlockIRQRestore( &uiSave );
	DEBUGMSG( DEBUG_FlushCacheAndClearTLB, ( "FlushCacheAndClearTLB--.\r\n" ) );    	
}

//void GetMMUContext( LPTHREAD lpThread, UINT flag )
void GetMMUContext( LPTHREAD lpThread, UINT uiDebugFlag, LPPROCESS lpNewProcess )
{
//#ifdef VIRTUAL_MEM
//	LPPROCESS lpProcess;	
	LPPROCESS_SEGMENTS lpSeg;
	UINT cPageCount;
	DWORD dwPhySecondPageTable;
	LPDWORD lpdwEntry;
	

	lpThread->lpCurProcess = lpNewProcess;
	lpSeg = lpNewProcess->lpProcessSegments;

	if( lpNewProcess != &InitKernelProcess )  // LN, 2003-06-04, ADD
	    lppProcessSegmentSlots[0] = lpSeg;//->lpSeg;
	else              // LN, 2003-06-04, ADD
		lppProcessSegmentSlots[0] = 0;         // LN, 2003-06-04, ADD

	SetCPUId( lpNewProcess->dwVirtualAddressBase );

	ClearPageTable( lpThread );  //好象只需要清除当前线程的?	
	//清除旧的页表
	cPageCount = lpSeg->uiPageTableCount;
	while( cPageCount-- )
	{
		*lpdwProcessPageEntry++ = 0;
	}
	//设置新的页表
	cPageCount = lpSeg->uiPageTableCount;
	dwPhySecondPageTable = (DWORD)lpSeg->lpdwPhySecondPageTable;
	lpdwEntry = lpdwProcessPageEntry = FirstPageTableEntryAdr( GET_FIRST_LEVEL_ENTRY( lpSeg->dwSegBaseAddress ) );

	while( cPageCount-- )
	{
		*lpdwEntry++ = dwPhySecondPageTable;
		dwPhySecondPageTable += 1024;
	}
   
    TLBClear();

#ifdef __DEBUG
/*
	if( lpThread->lpCurProcess->dwVirtualAddressBase != 0 && 
		lpThread->lpCurProcess->dwVirtualAddressBase !=  GetCPUId() )
	{
		if( uiDebugFlag != 0 )
		{
		    RETAILMSG( 1, ("ERROR:flag=%d,lpProcess(%x)->dwVirtualAddressBase=%x,lpThread->lpCurProcess(%x)->dwVirtualAddressBase=%x.\r\n", uiDebugFlag, lpProcess, lpProcess->dwVirtualAddressBase,lpThread->lpCurProcess, lpThread->lpCurProcess->dwVirtualAddressBase ) );
		}
	}
*/
#endif	

//#endif
}

// call by data abort or prefetch abort
//#define COUNT_HIT
//#define CHECK_LoadFailurePage
#define DEBUG_LoadFailurePage 0


int LoadFailurePage( DWORD dwAddress, UINT uFailurePC ) 
{
//	extern LPSEGMENT Seg_FindSegment( DWORD dwAddress );
	extern LPSEGMENT Seg_FindSegmentByIndex( UINT index );

	LPSEGMENT lpSeg;
	LPMEMBLOCK lpBlk;
	UINT uiPhyAdr;
	DWORD dwSegIndex;
	ACCESS_KEY aky;
	
	dwSegIndex = GET_SEGMENT_INDEX( dwAddress );	


//	RETAILMSG( 1, ( "p.\r\n" ) );

//	ASSERT( lpCurThread != lpInitKernelThread );
#ifdef COUNT_HIT
	//////////FOR TEST///////////

	static UINT uiTotalCount = 0;
	static UINT uiFirstOkCount = 0;
	static UINT uiFirstOkCacheCount = 0;
	static UINT uiTickCount = 0;	
	static UINT uiProcessCount = 0;
	static UINT uiProcessIndexCount[32];
/////////////////////

	//////////FOR TEST///////////

	uiTotalCount++;
//	if( uiFirstLevelEntry < 32 )
//	{
		//uiProcessCount++;
//		uiProcessIndexCount[uiFirstLevelEntry]++;
//	}
	{
		uiProcessIndexCount[(dwAddress >> 20)&(32-1)]++;
	}
		
	if( uiTotalCount == 500000 )
	{
		int idx = 0;
		DWORD dwCur = KL_GetTickCount();
		RETAILMSG( 1, ( "perform:uiTotal/tick=%d,Pro=%d,tickDiff=%d.\r\n", uiTotalCount / ( ( dwCur - uiTickCount ) / 1000 ), uiProcessCount, dwCur - uiTickCount  ) );
		
		while( idx < 32 )
		{
			if( uiProcessIndexCount[idx] )
			{
				RETAILMSG( 1, ( "idx=%dm,count=%d.\r\n", idx,  uiProcessIndexCount[idx] ) );
				uiProcessIndexCount[idx] = 0;
			}
			idx++;
		}	 

		uiTotalCount = 0;
		uiFirstOkCount = 0;
		uiFirstOkCacheCount = 0;
		uiProcessCount = 0;
		uiTickCount = KL_GetTickCount();
	}
	////////////////////////////
#endif

#ifdef CHECK_LoadFailurePage
	{
		DWORD dwVirtualAddressBase = lpCurThread->lpCurProcess->dwVirtualAddressBase;
		if( dwVirtualAddressBase != 0 && dwVirtualAddressBase !=  GetCPUId() )
		{
			ASSERT( 0 );
			RETAILMSG( 1, ( "lpCurProcess->lpName=%s,lpCurProcess->dwVirtualAddressBase=%x,GetCPUId()=%x,Address=%x.\r\n", lpCurThread->lpCurProcess->lpszApplicationName, lpCurThread->lpCurProcess->dwVirtualAddressBase, GetCPUId(), dwAddress ) );
		}
	}
	ASSERT( lpCurPTS );
#endif


		
	lpSeg = Seg_FindSegmentByIndex( dwSegIndex );

//	if( lpSeg &&
//		dwSegIndex < MAX_PROCESSES &&
//		( 
//		  dwSegIndex == 0 ||
//		  ( ( aky = (1 << dwSegIndex) ) & lpCurThread->akyAccessKey  )
//		)
//	  )
	if( lpSeg &&
		(
		  ( ( aky = (1 << dwSegIndex) ) & lpCurThread->akyAccessKey ) ||
		  dwSegIndex == SHARE_SEGMENT_INDEX ||
		  dwSegIndex == KERNEL_SEGMENT_INDEX		 
		)
	  )
	{
_REPEAT:
		if( ( lpBlk = lpSeg->lpBlks[BLOCK_INDEX(dwAddress)] ) > RESERVED_BLOCK &&
			( uiPhyAdr = lpBlk->uiPages[PAGE_INDEX(dwAddress)] ) )
		{   // the page has been commit
			register LPTHREAD_PAGE_TABLE lpCurPTS = &pageTable;//&lpCurThread->pageTable;
			LPDWORD lpdwFirstLevelEntry, lpdwSecondLevelEntry;

//			lpdwFirstLevelEntry = FirstPageTableEntryAdr( GET_FIRST_LEVEL_ENTRY( dwAddress, lpCurThread->lpCurProcess->dwVirtualAddressBase ) );
			lpdwFirstLevelEntry = FirstPageTableEntryAdr( GET_FIRST_LEVEL_ENTRY( dwAddress ) );			
			lpdwSecondLevelEntry = (LPDWORD)lpCurPTS->lpdwVirtualPageTable + GET_SECOND_LEVEL_ENTRY( dwAddress );
			
//			if( ( GET_FIRST_LEVEL_ENTRY( dwAddress ) & 31 ) == 0 )
//			{
		//		RETAILMSG( 1, ( "zero addr(0x%x),0 entry=0x%x,*entry=0x%x,Proc=%s.\r\n", dwAddress, GET_FIRST_LEVEL_ENTRY( dwAddress ),*lpdwFirstLevelEntry,lpCurThread->lpCurProcess->lpszApplicationName ) );
//			}
			
				
			//if( lpCurPTS->uiPageSlotsIndex != INVALID_SECOND_LEVEL_ENTRY )
			//{
				//lpCurPTS->lpdwVirtualPageTable[ lpCurPTS->uiPageSlotsIndex ] = 0;  //clear
			*lpCurPTS->lpdwSecondLevelEntry = 0;//FirstPageTableEntryAdr(0)
			lpCurPTS->lpdwSecondLevelEntry = lpdwSecondLevelEntry;//lpCurPTS->lpdwVirtualPageTable + uiSecondLevelEntry;
			*lpCurPTS->lpdwSecondLevelEntry = uiPhyAdr;
			//}
			//lpCurPTS->lpdwVirtualPageTable[lpCurPTS->uiPageSlotsIndex = uiSecondLevelEntry] = uiPhyAdr;
			
			//if( lpCurPTS->uiFirstLevelEntry != INVALID_FIRST_LEVEL_ENTRY )
			//{
				//*FirstPageTableEntryAdr(lpCurPTS->uiFirstLevelEntry) = 0; //clear
			//}
			//*FirstPageTableEntryAdr( lpCurPTS->uiFirstLevelEntry = uiFirstLevelEntry ) = (DWORD)lpCurPTS->lpdwPhyPageTable;  // 1 mean second level 
			*lpCurPTS->lpdwFirstLevelEntry = 0;
			lpCurPTS->lpdwFirstLevelEntry = lpdwFirstLevelEntry;//FirstPageTableEntryAdr( uiFirstLevelEntry );
			*lpCurPTS->lpdwFirstLevelEntry = (DWORD)lpCurPTS->lpdwPhyPageTable;

		    return TRUE;
		}
		else
		{
			//RETAILMSG( 1, ( "autocommit ?.\r\n" ) );
			if( lpBlk > RESERVED_BLOCK && 
				(lpBlk->uiFlag & MF_AUTO_COMMIT) && 
				uiPhyAdr == 0 )
			{
				extern BOOL AutoCommitPage( LPMEMBLOCK lpBlk, int idxStartPage );
				RETAILMSG( 1, ( "autocommit page:lpBlk=%x,dwAddress=%x.\r\n", lpBlk, dwAddress ) );
				//2005-02-03, change				
				//if( AutoCommitPage( lpBlk, PAGE_INDEX(dwAddress) ) == TRUE )
				if( AutoCommitPage( lpBlk, dwAddress ) == TRUE )				
				//
				{
					goto _REPEAT;
				}
			}
			RETAILMSG( 1, ( "page error:lpBlk=%x,uiPhyAdr=%x.\r\n", lpBlk, uiPhyAdr ) );
		}
		//RETAILMSG( 1, ( "page4.\r\n" ) );
_error_return:
		{		
			UINT index = dwAddress >> 20;
	        RETAILMSG( 1, ( "page_error: dwAddress=0x%x,pc=0x%x,dwSegIndex=%d,lpSeg=%x,lpBlk=%x,uiPhyAdr=%x,ProcessName=%s,lpProcessSegIndex=%x,lpPTE[%d]=%x,cur sp(0x%x),OwnerProces=(%s),ThreadId(0x%x),ThreadHandle(0x%x),VM=0x%x.\r\n", 
							dwAddress, uFailurePC, dwSegIndex, lpSeg, lpBlk, uiPhyAdr, lpCurThread->lpCurProcess->lpszApplicationName, lpCurThread->lpCurProcess->lpProcessSegments, index, lpdwFirstPTE[index], &index, 
							lpCurThread->lpOwnerProcess->lpszApplicationName, lpCurThread->dwThreadId, lpCurThread->hThread, lpCurThread->lpCurProcess->dwVirtualAddressBase ) );	
		}
	}
	else{
		UINT index = dwAddress >> 20;
        RETAILMSG( 1, ( "page_error: invalid lpSeg=0x%x,dwAddress=0x%x,pc=0x%x,dwSegIndex=%d,ProcessName=%s,lpProcessSegIndex=%x,lpPTE[%d]=%x,cur sp(0x%x),OwnerProces=(%s),ThreadId(0x%x),ThreadHandle(0x%x),aky=0x%x,VM=0x%x.\r\n", 
			lpSeg, dwAddress, uFailurePC, dwSegIndex, lpCurThread->lpCurProcess->lpszApplicationName, lpCurThread->lpCurProcess->lpProcessSegments, index, lpdwFirstPTE[index], &index, 
			lpCurThread->lpOwnerProcess->lpszApplicationName, lpCurThread->dwThreadId, lpCurThread->hThread,lpCurThread->akyAccessKey, lpCurThread->lpCurProcess->dwVirtualAddressBase ) );
        RETAILMSG( 1, ( "page_error: CurAky=0x%x,CurProcessAky=0x%x,OwnerProcessAky=0x%x.\r\n",
			                         lpCurThread->akyAccessKey,
			                         lpCurThread->lpCurProcess->akyAccessKey,
			                         lpCurThread->lpOwnerProcess->akyAccessKey ) );
			
	}
    return FALSE;
}

//int LoadPrefetchFailurePage( DWORD dwAddress ) 
//{
//	int retv;
//	retv = LoadFailurePage( dwAddress );
//	RETAILMSG( 1, ( "LoadPrefetchFailurePage1:dwAddress=%x,retv=%d.\r\n",dwAddress,retv ) );
//	return retv;
//}

//LPVOID AllocThreadKernelStackPage( VOID )
//{
//	if( lpCurThread->lpdwThreadKernelStack == NULL )
//	{
//		lpCurThread->lpdwThreadKernelStack = KHeap_Alloc( PAGE_SIZE );
//	}
//	return lpCurThread->lpdwThreadKernelStack;
//}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -