sl@0: // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // Bootstrap Shadow Memory Region Test Driver sl@0: // sl@0: sl@0: sl@0: // -- INCLUDES ---------------------------------------------------------------- sl@0: sl@0: #include "d_trace.h" sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include "d_smr.h" sl@0: sl@0: sl@0: // -- CLASSES ----------------------------------------------------------------- sl@0: sl@0: sl@0: class DSMRTestFactory : public DLogicalDevice sl@0: { sl@0: public: sl@0: virtual TInt Install(); sl@0: virtual void GetCaps(TDes8& aDes) const; sl@0: virtual TInt Create(DLogicalChannelBase*& aChannel); sl@0: }; sl@0: sl@0: sl@0: class DSMRTestChannel : public DLogicalChannelBase sl@0: { sl@0: public: sl@0: DSMRTestChannel(); sl@0: virtual ~DSMRTestChannel(); sl@0: sl@0: // Inherited from DObject sl@0: virtual TInt RequestUserHandle(DThread* aThread, TOwnerType aType); sl@0: sl@0: // Inherited from DLogicalChannelBase sl@0: virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer); sl@0: virtual TInt Request(TInt aReqNo, TAny* a1, TAny* a2); sl@0: sl@0: public: sl@0: static void TestTrace(DSMRTestChannel* aSelf); sl@0: sl@0: private: sl@0: DThread* iClient; sl@0: sl@0: }; sl@0: sl@0: TInt OpenDumpCloseChunk(TUint32 aBase, TUint32 aSize); sl@0: sl@0: sl@0: // -- GLOBALS ----------------------------------------------------------------- sl@0: // sl@0: sl@0: sl@0: sl@0: // -- METHODS ----------------------------------------------------------------- sl@0: // sl@0: // TEST FUNCTIONS sl@0: // sl@0: sl@0: static TInt ECtrlCheckSMRIBPtr() sl@0: { sl@0: SMR_FUNC("DSMRTestChannel::Request::ECtrlCheckSMRIBPtr"); sl@0: sl@0: TSuperPage& superPage = Kern::SuperPage(); sl@0: TLinAddr smrib = superPage.iSmrData; sl@0: sl@0: SMR_TRACE1("SMRIB - Virtual address %x", smrib); sl@0: sl@0: return smrib; sl@0: } sl@0: sl@0: static TInt ECtrlPrintSMRIB() sl@0: { sl@0: SMR_FUNC("DSMRTestChannel::Request::ECtrlPrintSMRIB"); sl@0: sl@0: TSuperPage& superPage = Kern::SuperPage(); sl@0: TLinAddr smrib = superPage.iSmrData; sl@0: sl@0: SMR_TRACE1("SMRIB - Virtual address %x", smrib); sl@0: sl@0: if (smrib == KSuperPageAddressFieldUndefined) sl@0: SMR_LOGMSG_RETURN ("SMRIB Does not exist!", KErrBadHandle); sl@0: sl@0: SSmrBank* smrPtr = (SSmrBank*)(smrib); sl@0: int x=0; sl@0: while (smrPtr->iBase != 0) sl@0: { sl@0: SMR_TRACE6("SMRIB entry %d (0x%x): %x, %x, %x, %x", x, smrPtr, smrPtr->iBase, smrPtr->iSize, smrPtr->iPayloadUID, smrPtr->iPayloadFlags); sl@0: x++; sl@0: smrPtr++; sl@0: } sl@0: if (x==0) sl@0: SMR_TRACE0("SMRIB Zero, no valid entries"); sl@0: else sl@0: SMR_TRACE1("SMRIB Contained %d entries", x); sl@0: sl@0: return x; sl@0: } sl@0: sl@0: sl@0: static TInt ECtrlAccessAllSMRs() sl@0: { sl@0: SMR_FUNC("DSMRTestChannel::Request::ECtrlAccessAllSMRs"); sl@0: sl@0: TInt err=0; sl@0: TSuperPage& superPage = Kern::SuperPage(); sl@0: TLinAddr smrib = superPage.iSmrData; sl@0: sl@0: if (smrib == KSuperPageAddressFieldUndefined) sl@0: return KErrBadHandle; sl@0: sl@0: SSmrBank* smrPtr = (SSmrBank*)(smrib); sl@0: int x=0; sl@0: while (smrPtr->iBase != 0) sl@0: { sl@0: SMR_TRACE6("SMRIB item %d (0x%x): %x, %x, %x, %x", x, smrPtr, smrPtr->iBase, smrPtr->iSize, smrPtr->iPayloadUID, smrPtr->iPayloadFlags); sl@0: sl@0: err = OpenDumpCloseChunk(smrPtr->iBase, smrPtr->iSize); sl@0: if (err != KErrNone) sl@0: return err; sl@0: sl@0: x++; sl@0: smrPtr++; sl@0: } sl@0: if (x==0) sl@0: SMR_TRACE0("SMRIB Zero, no valid entries"); sl@0: else sl@0: SMR_TRACE1("SMRIB Contained %d entries", x); sl@0: sl@0: return x; sl@0: } sl@0: sl@0: sl@0: static TInt ECtrlFreeHalfSMR1PhysicalRam() sl@0: { sl@0: SMR_FUNC("DSMRTestChannel::Request::ECtrlFreeHalfSMR1PhysicalRam"); sl@0: sl@0: TInt err=0; sl@0: TSuperPage& superPage = Kern::SuperPage(); sl@0: TLinAddr smrib = superPage.iSmrData; sl@0: sl@0: sl@0: if (smrib == KSuperPageAddressFieldUndefined) sl@0: return KErrBadHandle; sl@0: sl@0: SSmrBank* smrPtr = (SSmrBank*)(smrib); sl@0: int x=0; sl@0: sl@0: if ((smrPtr->iBase == 0) || (smrPtr->iSize == 0)) sl@0: SMR_LOGMSG_RETURN("SMRIB Does not contain one entry!", 0); sl@0: sl@0: SMR_TRACE6("SMRIB item before %d (0x%x): %x, %x, %x, %x", x, smrPtr, smrPtr->iBase, smrPtr->iSize, smrPtr->iPayloadUID, smrPtr->iPayloadFlags); sl@0: sl@0: TInt halfSize = smrPtr->iSize >> 1; sl@0: sl@0: NKern::ThreadEnterCS(); sl@0: err = Epoc::FreePhysicalRam(smrPtr->iBase+halfSize, halfSize); sl@0: NKern::ThreadLeaveCS(); sl@0: if (err != KErrNone) sl@0: SMR_LOGMSG_RETURN("Epoc::FreePhysicalRam() gave error", err) sl@0: else sl@0: SMR_TRACE0("Success - half of physical ram freed for SMR 1"); sl@0: sl@0: smrPtr->iSize = halfSize; sl@0: sl@0: SMR_TRACE6("SMRIB item after %d (0x%x): %x, %x, %x, %x", x, smrPtr, smrPtr->iBase, smrPtr->iSize, smrPtr->iPayloadUID, smrPtr->iPayloadFlags); sl@0: sl@0: err = OpenDumpCloseChunk(smrPtr->iBase, smrPtr->iSize); sl@0: if (err != KErrNone) sl@0: return err; sl@0: sl@0: return halfSize; sl@0: } sl@0: sl@0: sl@0: static TInt ECtrlFreeAllSMR2PhysicalRam() sl@0: { sl@0: SMR_FUNC("DSMRTestChannel::Request::ECtrlFreeAllSMR2PhysicalRam"); sl@0: sl@0: TInt err=0; sl@0: TSuperPage& superPage = Kern::SuperPage(); sl@0: TLinAddr smrib = superPage.iSmrData; sl@0: sl@0: if (smrib == KSuperPageAddressFieldUndefined) sl@0: return KErrBadHandle; sl@0: sl@0: SSmrBank* smrPtr = (SSmrBank*)(smrib); sl@0: int x=0; sl@0: sl@0: if ((smrPtr->iBase == 0) || (smrPtr->iSize == 0)) sl@0: SMR_LOGMSG_RETURN("SMRIB Does not contain first entry!", 0); sl@0: sl@0: smrPtr++; x++; sl@0: if ((smrPtr->iBase == 0) || (smrPtr->iSize == 0)) sl@0: SMR_LOGMSG_RETURN("SMRIB Does not contain two entries!", 0); sl@0: sl@0: smrPtr++; x++; sl@0: if ((smrPtr->iBase == 0) || (smrPtr->iSize == 0)) sl@0: SMR_LOGMSG_RETURN("SMRIB Does not contain three entries!", 0); sl@0: sl@0: SMR_TRACE6("SMRIB item before %d (0x%x): %x, %x, %x, %x", x, smrPtr, smrPtr->iBase, smrPtr->iSize, smrPtr->iPayloadUID, smrPtr->iPayloadFlags); sl@0: TInt sizeToFree = smrPtr->iSize; sl@0: sl@0: NKern::ThreadEnterCS(); sl@0: err = Epoc::FreePhysicalRam(smrPtr->iBase, sizeToFree); sl@0: NKern::ThreadLeaveCS(); sl@0: if (err != KErrNone) sl@0: SMR_LOGMSG_RETURN("Epoc::FreePhysicalRam() gave error", err) sl@0: else sl@0: SMR_TRACE0("Success - all physical ram freed for SMR 2"); sl@0: sl@0: sl@0: smrPtr->iBase = 0; sl@0: smrPtr->iSize = 0; sl@0: smrPtr->iPayloadUID = 0; sl@0: smrPtr->iPayloadFlags = 0; sl@0: sl@0: SMR_TRACE6("SMRIB item after %d (0x%x): %x, %x, %x, %x", x, smrPtr, smrPtr->iBase, smrPtr->iSize, smrPtr->iPayloadUID, smrPtr->iPayloadFlags); sl@0: return sizeToFree; sl@0: } sl@0: sl@0: sl@0: TInt OpenDumpCloseChunk(TUint32 aBase, TUint32 aSize) sl@0: { sl@0: TInt err; sl@0: TChunkCreateInfo cci; sl@0: DChunk *chunkPtr; sl@0: TLinAddr kernAddr = 0; sl@0: TUint32 mapAttr = 0; sl@0: sl@0: cci.iType = TChunkCreateInfo::ESharedKernelSingle; sl@0: cci.iMaxSize = 0x800000; sl@0: cci.iMapAttr = EMapAttrCachedMax | EMapAttrSupRw; sl@0: cci.iOwnsMemory = EFalse; sl@0: cci.iDestroyedDfc = 0; sl@0: sl@0: NKern::ThreadEnterCS(); sl@0: err = Kern::ChunkCreate(cci, chunkPtr, kernAddr, mapAttr); sl@0: NKern::ThreadLeaveCS(); sl@0: if (err != KErrNone) sl@0: SMR_LOGMSG_RETURN("Kern::ChunkCreate() gave error", err); sl@0: sl@0: NKern::ThreadEnterCS(); sl@0: err = Kern::ChunkCommitPhysical(chunkPtr, 0, aSize, aBase); sl@0: NKern::ThreadLeaveCS(); sl@0: if (err != KErrNone) sl@0: SMR_LOGMSG_RETURN("Kern::ChunkCommitPhysical() gave error", err); sl@0: sl@0: TUint32* setting = (TUint32*)(kernAddr); sl@0: SMR_TRACE1("SMR Image Memory Dump First Kb @ %08x", setting); sl@0: sl@0: for (TInt y=0; y < 0x80; y+=16) sl@0: { sl@0: SMR_TRACE5(" %08x: %08x %08x %08x %08x", setting, setting[0], setting[1], setting[2], setting[3]); sl@0: setting+=4; sl@0: } sl@0: sl@0: setting = (TUint32*)(kernAddr+aSize-0x80); sl@0: SMR_TRACE1("SMR Image Memory Dump Last Kb @ %08x", setting); sl@0: sl@0: for (TInt y=0; y < 0x80; y+=16) sl@0: { sl@0: SMR_TRACE5(" %08x: %08x %08x %08x %08x", setting, setting[0], setting[1], setting[2], setting[3]); sl@0: setting+=4; sl@0: } sl@0: sl@0: NKern::ThreadEnterCS(); sl@0: TBool chunkRefCntZero = Kern::ChunkClose(chunkPtr); sl@0: NKern::ThreadLeaveCS(); sl@0: if (chunkRefCntZero == 0) sl@0: SMR_LOGMSG_RETURN("Kern::ChunkClose gave false result", KErrGeneral); sl@0: sl@0: return KErrNone; sl@0: } sl@0: sl@0: // -- METHODS ----------------------------------------------------------------- sl@0: // sl@0: // DSMRTestFactory sl@0: // sl@0: sl@0: TInt DSMRTestFactory::Install() sl@0: { sl@0: SMR_FUNC("DSMRTestFactory::Install"); sl@0: return SetName(&RSMRTest::Name()); sl@0: } sl@0: sl@0: void DSMRTestFactory::GetCaps(TDes8& aDes) const sl@0: { sl@0: SMR_FUNC("DSMRTestFactory::GetCaps"); sl@0: Kern::InfoCopy(aDes,0,0); sl@0: } sl@0: sl@0: TInt DSMRTestFactory::Create(DLogicalChannelBase*& aChannel) sl@0: { sl@0: SMR_FUNC("DSMRTestFactory::Create"); sl@0: sl@0: aChannel=new DSMRTestChannel(); sl@0: if(!aChannel) sl@0: return KErrNoMemory; sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: // -- METHODS ----------------------------------------------------------------- sl@0: // sl@0: // DSMRTestChannel sl@0: // sl@0: sl@0: DSMRTestChannel::DSMRTestChannel() sl@0: { sl@0: SMR_FUNC("DSMRTestChannel"); sl@0: } sl@0: sl@0: DSMRTestChannel::~DSMRTestChannel() sl@0: { sl@0: SMR_FUNC("~DSMRTestChannel"); sl@0: } sl@0: sl@0: TInt DSMRTestChannel::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& /*aVer*/) sl@0: { sl@0: SMR_FUNC("DSMRTestChannel::DoCreate"); sl@0: sl@0: iClient = &Kern::CurrentThread(); sl@0: return KErrNone; sl@0: } sl@0: sl@0: TInt DSMRTestChannel::RequestUserHandle(DThread* aThread, TOwnerType aType) sl@0: { sl@0: SMR_FUNC("DSMRTestChannel::RequestUserHandle"); sl@0: sl@0: if (aType!=EOwnerThread || aThread!=iClient) sl@0: return KErrAccessDenied; sl@0: return KErrNone; sl@0: } sl@0: sl@0: TInt DSMRTestChannel::Request(TInt aReqNo, TAny* a1, TAny*) sl@0: { sl@0: SMR_FUNC("DSMRTestChannel::Request"); sl@0: TBool aEnforce = (TBool) a1; sl@0: sl@0: switch(aReqNo) sl@0: { sl@0: sl@0: case RSMRTest::ECtrlCheckSMRIBPtr: sl@0: { sl@0: TInt rc = ECtrlCheckSMRIBPtr(); sl@0: if (rc < 0) sl@0: return rc; sl@0: if (aEnforce && rc == 0) sl@0: return KErrBadHandle; sl@0: sl@0: break; // fall through, return KErrNone sl@0: } sl@0: sl@0: case RSMRTest::ECtrlPrintSMRIB: sl@0: { sl@0: TInt rc = ECtrlPrintSMRIB(); sl@0: if (rc < 0) sl@0: return rc; sl@0: if (aEnforce && rc == 0) sl@0: return KErrNotFound; sl@0: sl@0: break; // fall through, return KErrNone sl@0: } sl@0: sl@0: case RSMRTest::ECtrlAccessAllSMRs: sl@0: { sl@0: TInt rc = ECtrlAccessAllSMRs(); sl@0: if (rc < 0) sl@0: return rc; sl@0: if (aEnforce && rc == 0) sl@0: return KErrNotFound; sl@0: sl@0: break; // fall through, return KErrNone sl@0: } sl@0: sl@0: case RSMRTest::ECtrlFreeHalfSMR1PhysicalRam: sl@0: { sl@0: TInt rc = ECtrlFreeHalfSMR1PhysicalRam(); sl@0: if (rc < 0) sl@0: return rc; sl@0: if (aEnforce && rc == 0) sl@0: return KErrNotFound; sl@0: sl@0: break; // fall through, return KErrNone sl@0: } sl@0: sl@0: case RSMRTest::ECtrlFreeAllSMR2PhysicalRam: sl@0: { sl@0: sl@0: TInt rc = ECtrlFreeAllSMR2PhysicalRam(); sl@0: if (rc < 0) sl@0: return rc; sl@0: if (aEnforce && rc == 0) sl@0: return KErrNotFound; sl@0: sl@0: break; // fall through, return KErrNone sl@0: } sl@0: sl@0: default: sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: // -- GLOBALS ----------------------------------------------------------------- sl@0: sl@0: sl@0: DECLARE_STANDARD_LDD() sl@0: { sl@0: SMR_FUNC("D_SMR_DECLARE_STANDARD_LDD"); sl@0: sl@0: const TRomHeader& romHdr = Epoc::RomHeader(); sl@0: sl@0: TInt RHsize = sizeof(TRomHeader); sl@0: SMR_TRACE2("RomHeader - addr %0x; size %d", &romHdr, RHsize); sl@0: sl@0: TSuperPage& superPage = Kern::SuperPage(); sl@0: TInt SPsize = sizeof(SSuperPageBase); sl@0: sl@0: TInt startupReason = superPage.iHwStartupReason; sl@0: TLinAddr rootDirList = superPage.iRootDirList; sl@0: sl@0: SMR_TRACE2("SuperPage - addr %0x; size %d", &superPage, SPsize); sl@0: SMR_TRACE2("SuperPage - StartupReason: %0x; rootDirList %0x", startupReason, rootDirList); sl@0: sl@0: return new DSMRTestFactory; sl@0: } sl@0: