diff -r 000000000000 -r 96e5fb8b040d kerneltest/e32test/demandpaging/t_dpcmn.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/demandpaging/t_dpcmn.cpp Thu Dec 17 09:24:54 2009 +0200 @@ -0,0 +1,188 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\demandpaging\t_dpcmn.cpp +// +// + +#include +#include +#include +#include +#include +#include +#include "u32std.h" + +TInt gPageSize; +TBool gPagingSupported = EFalse; +TBool gRomPagingSupported = EFalse; +TBool gCodePagingSupported = EFalse; +TBool gDataPagingSupported = EFalse; +TInt gDataPagingPolicy; +TBool gProcessPaged; + +TBool gGlobalNoPaging = EFalse; +TBool gGlobalAlwaysPage = EFalse; +TBool gGlobalDefaultUnpaged = EFalse; +TBool gGlobalDefaultPage = EFalse; + +// Size of paging cache in pages +TUint gMinCacheSize = 0; +TUint gMaxCacheSize = 0; +TUint gCurrentCacheSize = 0; + +RChunk gChunk; + +// +// GetGlobalPolicies +// +// Determine the global dapaging policies as specified at rombuild time +// +TInt GetGlobalPolicies() + { + // Determine which types of paging are supported + TUint32 attrs = DPTest::Attributes(); + + gRomPagingSupported = (attrs & DPTest::ERomPaging) != 0; + gCodePagingSupported = (attrs & DPTest::ECodePaging) != 0; + gDataPagingSupported = (attrs & DPTest::EDataPaging) != 0; + gPagingSupported = gRomPagingSupported || gCodePagingSupported || gDataPagingSupported; + + if (gRomPagingSupported) + RDebug::Printf("Rom paging supported"); + if (gCodePagingSupported) + RDebug::Printf("Code paging supported"); + if (gDataPagingSupported) + RDebug::Printf("Data paging supported"); + + // Determine the data paging attributes + TInt kernelFlags = UserSvr::HalFunction(EHalGroupKernel, EKernelHalConfigFlags, 0, 0); + if (kernelFlags < 0) + return kernelFlags; + + gDataPagingPolicy = kernelFlags & EKernelConfigDataPagingPolicyMask; + if (gDataPagingPolicy == EKernelConfigDataPagingPolicyNoPaging) + { + RDebug::Printf("Global NO PAGING policy is set"); + gGlobalNoPaging = ETrue; + } + if (gDataPagingPolicy == EKernelConfigDataPagingPolicyAlwaysPage) + { + RDebug::Printf("Global ALWAYS PAGE policy is set"); + gGlobalAlwaysPage = ETrue; + } + if (gDataPagingPolicy == EKernelConfigDataPagingPolicyDefaultUnpaged) + { + RDebug::Printf("Global DEFAULT UNPAGED policy is set"); + gGlobalDefaultUnpaged = ETrue; + } + if (gDataPagingPolicy == EKernelConfigDataPagingPolicyDefaultPaged) + { + RDebug::Printf("Global DEFAULT PAGED policy is set"); + gGlobalDefaultPage = ETrue; + } + + // Determine this process' data paging attribute + RProcess process; // Default to point to current process. + gProcessPaged = process.DefaultDataPaged(); + RDebug::Printf(gProcessPaged ? "This process is paged" : "This process is not paged"); + + // Get page size + TInt r = UserHal::PageSizeInBytes(gPageSize); + if (r != KErrNone) + return r; + + if (gPagingSupported) + { + TUint minSize; + TUint maxSize; + TUint currentSize; + r = DPTest::CacheSize(minSize, maxSize, currentSize); + if (r != KErrNone) + return r; + + gMinCacheSize = minSize / gPageSize; + gMaxCacheSize = maxSize / gPageSize; + gCurrentCacheSize = currentSize / gPageSize; + RDebug::Printf("Cache size (pages): min == %d, max == %d, current == %d", + gMinCacheSize, gMaxCacheSize, gCurrentCacheSize); + } + + return r; + } + +// +// IsDataPagingSupported +// +// Determine whether data paging is supported +// +TBool IsDataPagingSupported() + { + return gDataPagingSupported; + } + +// +// UpdatePaged +// +// Update whether the expected paged status based on the global paging policy. +// +void UpdatePaged(TBool& aPaged) + { + if (gGlobalNoPaging) + aPaged = EFalse; + if (gGlobalAlwaysPage) + aPaged = ETrue; + if (!gDataPagingSupported) + aPaged = EFalse; + } + + +// +// TestThreadExit +// +// Resume the specified thread and verify the exit reason. +// +TInt TestThreadExit(RThread& aThread, TExitType aExitType, TInt aExitReason) + { + // Disable JIT debugging. + TBool justInTime=User::JustInTime(); + User::SetJustInTime(EFalse); + + TRequestStatus status; + aThread.Logon(status); + aThread.Resume(); + User::WaitForRequest(status); + if (aExitType != aThread.ExitType()) + return KErrGeneral; + + if (aExitReason != status.Int()) + return KErrGeneral; + + if (aExitReason != aThread.ExitReason()) + return KErrGeneral; + + + if (aExitType == EExitPanic) + { + if (aThread.ExitCategory()!=_L("USER")) + { + return KErrGeneral; + } + } + + CLOSE_AND_WAIT(aThread); + + // Put JIT debugging back to previous status. + User::SetJustInTime(justInTime); + return KErrNone; + }