📄 single_armpage.c
字号:
//无效当前系统的所有的页
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 + -