# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1263843070 -7200 # Node ID 329ab00958436eba0fccd0fef45b70973b404fd9 # Parent 36bfc973b146d7f199d27d3c3b6bf74e5a1d0b9d Revision: 201003 Kit: 201003 diff -r 36bfc973b146 -r 329ab0095843 brdbootldr/ubootldr/inflate.c --- a/brdbootldr/ubootldr/inflate.c Thu Jan 07 13:38:45 2010 +0200 +++ b/brdbootldr/ubootldr/inflate.c Mon Jan 18 21:31:10 2010 +0200 @@ -1,19 +1,3 @@ -/* -* Copyright (c) 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: -* -*/ /* inflate.c -- Not copyrighted 1992 by Mark Adler version c10p1, 10 January 1993 */ diff -r 36bfc973b146 -r 329ab0095843 bsptemplate/asspandvariant/template_assp/dma.mmp --- a/bsptemplate/asspandvariant/template_assp/dma.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/bsptemplate/asspandvariant/template_assp/dma.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -12,7 +12,7 @@ // // Description: // template/template_assp/dma.mmp -// +// // #include @@ -27,17 +27,19 @@ noexportlibrary sourcepath ../../../kernel/eka/drivers/dma -source dmapil.cpp +source dma2_pil.cpp dma2_shared.cpp sourcepath . source dmapsl.cpp library VariantTarget(katemplate,lib) -deffile ../../../kernel/eka/~/dma.def +deffile ../../../kernel/eka/~/dma2.def epocallowdlldata capability all VENDORID 0x70000001 + +MACRO DMA_APIV2 diff -r 36bfc973b146 -r 329ab0095843 bsptemplate/asspandvariant/template_assp/dmapsl.cpp --- a/bsptemplate/asspandvariant/template_assp/dmapsl.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/bsptemplate/asspandvariant/template_assp/dmapsl.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -11,23 +11,26 @@ // Contributors: // // Description: -// template\template_assp\dmapsl.cpp +// bsptemplate/asspvariant/template_assp/dmapsl.cpp // Template DMA Platform Specific Layer (PSL). -// +// // #include #include // /assp/template_assp/ + #include +#include + // Debug support -static const char KDmaPanicCat[] = "DMA PSL"; +static const char KDmaPanicCat[] = "DMA PSL - " __FILE__; -static const TInt KMaxTransferLen = 0x1FE0; // max transfer length for this DMAC -static const TInt KMemAlignMask = 7; // memory addresses passed to DMAC must be multiple of 8 -static const TInt KChannelCount = 16; // we got 16 channels -static const TInt KDesCount = 1024; // DMA descriptor count +static const TInt KMaxTransferLen = 0x1FE0; // max transfer length for this DMAC +static const TInt KMemAlignMask = 7; // memory addresses passed to DMAC must be multiple of 8 +static const TInt KChannelCount = 16; // we got 16 channels +static const TInt KDesCount = 160; // Initial DMA descriptor count class TDmaDesc @@ -49,6 +52,9 @@ // Test Support ////////////////////////////////////////////////////////////////////////////// +/** +TO DO: Fill in to provide information to the V1 test harness (t_dma.exe) +*/ TDmaTestInfo TestInfo = { 0, @@ -71,6 +77,26 @@ return TestInfo; } +/** +TO DO: Fill in to provide information to the V2 test harness (t_dma2.exe) +*/ +TDmaV2TestInfo TestInfov2 = + { + 0, + 0, + 0, + 0, + {0}, + 0, + {0}, + 0, + {0} + }; + +EXPORT_C const TDmaV2TestInfo& DmaTestInfoV2() + { + return TestInfov2; + } ////////////////////////////////////////////////////////////////////////////// // Helper Functions @@ -85,14 +111,14 @@ } -static TUint32 DcmdReg(TInt aCount, TUint aFlags, TUint32 aPslInfo) +static TUint32 DmaCmdReg(TUint aCount, TUint aFlags, TUint32 aSrcPslInfo, TUint32 aDstPslInfo) // // Returns value to set in DMA command register or in descriptor command field. // { // TO DO: Construct CMD word from input values. // The return value should reflect the actual control word. - return (aCount | aFlags | aPslInfo); + return (aCount | aFlags | aSrcPslInfo | aDstPslInfo); } @@ -119,14 +145,15 @@ TInt Create(); private: // from TDmac (PIL pure virtual) - virtual void Transfer(const TDmaChannel& aChannel, const SDmaDesHdr& aHdr); virtual void StopTransfer(const TDmaChannel& aChannel); virtual TBool IsIdle(const TDmaChannel& aChannel); - virtual TInt MaxTransferSize(TDmaChannel& aChannel, TUint aFlags, TUint32 aPslInfo); - virtual TUint MemAlignMask(TDmaChannel& aChannel, TUint aFlags, TUint32 aPslInfo); + virtual TUint MaxTransferLength(TDmaChannel& aChannel, TUint aSrcFlags, + TUint aDstFlags, TUint32 aPslInfo); + virtual TUint AddressAlignMask(TDmaChannel& aChannel, TUint aSrcFlags, + TUint aDstFlags, TUint32 aPslInfo); // from TDmac (PIL virtual) - virtual void InitHwDes(const SDmaDesHdr& aHdr, TUint32 aSrc, TUint32 aDest, TInt aCount, - TUint aFlags, TUint32 aPslInfo, TUint32 aCookie); + virtual void Transfer(const TDmaChannel& aChannel, const SDmaDesHdr& aHdr); + virtual TInt InitHwDes(const SDmaDesHdr& aHdr, const TDmaTransferArgs& aTransferArgs); virtual void ChainHwDes(const SDmaDesHdr& aHdr, const SDmaDesHdr& aNextHdr); virtual void AppendHwDes(const TDmaChannel& aChannel, const SDmaDesHdr& aLastHdr, const SDmaDesHdr& aNewHdr); @@ -140,15 +167,16 @@ TTemplateSgChannel iChannels[KChannelCount]; }; + static TTemplateDmac Controller; + const TDmac::SCreateInfo TTemplateDmac::KInfo = { - KChannelCount, - KDesCount, - TDmac::KCapsBitHwDes, - sizeof(TDmaDesc), - EMapAttrSupRw | EMapAttrFullyBlocking + ETrue, // iCapsHwDes + KDesCount, // iDesCount + sizeof(TDmaDesc), // iDesSize + EMapAttrSupRw | EMapAttrFullyBlocking // iDesChunkAttribs }; @@ -173,7 +201,7 @@ { TDmaDesc* pD = HdrToHwDes(*iFreeHdr); iChannels[i].iTmpDes = pD; - iChannels[i].iTmpDesPhysAddr = DesLinToPhys(pD); + iChannels[i].iTmpDesPhysAddr = HwDesLinToPhys(pD); iFreeHdr = iFreeHdr->iNext; } r = Interrupt::Bind(EAsspIntIdDma, Isr, this); @@ -237,9 +265,10 @@ } -TInt TTemplateDmac::MaxTransferSize(TDmaChannel& /*aChannel*/, TUint /*aFlags*/, TUint32 /*aPslInfo*/) +TUint TTemplateDmac::MaxTransferLength(TDmaChannel& /*aChannel*/, TUint /*aSrcFlags*/, + TUint /*aDstFlags*/, TUint32 /*aPslInfo*/) // -// Returns the maximum transfer size for a given transfer. +// Returns the maximum transfer length in bytes for a given transfer. // { // TO DO: Determine the proper return value, based on the arguments. @@ -249,7 +278,8 @@ } -TUint TTemplateDmac::MemAlignMask(TDmaChannel& /*aChannel*/, TUint /*aFlags*/, TUint32 /*aPslInfo*/) +TUint TTemplateDmac::AddressAlignMask(TDmaChannel& aChannel, TUint /*aSrcFlags*/, + TUint /*aDstFlags*/, TUint32 /*aPslInfo*/) // // Returns the memory buffer alignment restrictions mask for a given transfer. // @@ -261,12 +291,12 @@ } -void TTemplateDmac::InitHwDes(const SDmaDesHdr& aHdr, TUint32 aSrc, TUint32 aDest, TInt aCount, - TUint aFlags, TUint32 aPslInfo, TUint32 /*aCookie*/) +TInt TTemplateDmac::InitHwDes(const SDmaDesHdr& aHdr, const TDmaTransferArgs& aTransferArgs) // -// Sets up (from a passed in request) the descriptor with that fragment's source and destination address, -// the fragment size, and the (driver/DMA controller) specific transfer parameters (mem/peripheral, -// burst size, transfer width). +// Sets up (from a passed in request) the descriptor with that fragment's +// source and destination address, the fragment size, and the (driver/DMA +// controller) specific transfer parameters (mem/peripheral, burst size, +// transfer width). // { TDmaDesc* pD = HdrToHwDes(aHdr); @@ -276,10 +306,15 @@ // Unaligned descriptor? Bug in generic layer! __DMA_ASSERTD(IsHwDesAligned(pD)); - pD->iSrcAddr = (aFlags & KDmaPhysAddrSrc) ? aSrc : Epoc::LinearToPhysical(aSrc); - pD->iDestAddr = (aFlags & KDmaPhysAddrDest) ? aDest : Epoc::LinearToPhysical(aDest); - pD->iCmd = DcmdReg(aCount, aFlags, aPslInfo); + const TDmaTransferConfig& src = aTransferArgs.iSrcConfig; + const TDmaTransferConfig& dst = aTransferArgs.iDstConfig; + pD->iSrcAddr = (src.iFlags & KDmaPhysAddr) ? src.iAddr : Epoc::LinearToPhysical(src.iAddr); + pD->iDestAddr = (dst.iFlags & KDmaPhysAddr) ? dst.iAddr : Epoc::LinearToPhysical(dst.iAddr); + pD->iCmd = DmaCmdReg(aTransferArgs.iTransferCount, aTransferArgs.iFlags, + src.iPslTargetInfo, dst.iPslTargetInfo); pD->iDescAddr = TDmaDesc::KStopBitMask; + + return KErrNone; } @@ -299,7 +334,7 @@ // TO DO: Modify pD->iCmd so that no end-of-transfer interrupt gets raised any longer. - pD->iDescAddr = DesLinToPhys(pN); + pD->iDescAddr = HwDesLinToPhys(pN); } @@ -319,7 +354,7 @@ // Unaligned descriptor? Bug in generic layer! __DMA_ASSERTD(IsHwDesAligned(pL) && IsHwDesAligned(pN)); - TPhysAddr newPhys = DesLinToPhys(pN); + TPhysAddr newPhys = HwDesLinToPhys(pN); const TInt irq = NKern::DisableAllInterrupts(); StopTransfer(aChannel); @@ -363,7 +398,7 @@ // TO DO: Implement the behaviour described above, call HandleIsr(). - HandleIsr(me.iChannels[5], 0); // Example + HandleIsr(me.iChannels[5], EDmaCallbackRequestCompletion, ETrue); // Example } @@ -381,7 +416,7 @@ // Channel Opening/Closing (Channel Allocator) ////////////////////////////////////////////////////////////////////////////// -TDmaChannel* DmaChannelMgr::Open(TUint32 aOpenId) +TDmaChannel* DmaChannelMgr::Open(TUint32 aOpenId, TBool /*aDynChannel*/, TUint /*aPriority*/) // // // @@ -392,7 +427,9 @@ TDmaChannel* pC = Controller.iChannels + aOpenId; if (pC->IsOpened()) + { pC = NULL; + } else { pC->iController = &Controller; @@ -403,7 +440,7 @@ } -void DmaChannelMgr::Close(TDmaChannel* /* aChannel */) +void DmaChannelMgr::Close(TDmaChannel* /*aChannel*/) // // // @@ -412,7 +449,7 @@ } -TInt DmaChannelMgr::StaticExtension(TInt /* aCmd */, TAny* /* aArg */) +TInt DmaChannelMgr::StaticExtension(TInt /*aCmd*/, TAny* /*aArg*/) // // // @@ -432,5 +469,10 @@ { __KTRACE_OPT2(KBOOT, KDMA, Kern::Printf("Starting DMA Extension")); + const TInt r = DmaChannelMgr::Initialise(); + if (r != KErrNone) + { + return r; + } return Controller.Create(); } diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/bld.inf --- a/kernel/eka/bld.inf Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/bld.inf Mon Jan 18 21:31:10 2010 +0200 @@ -201,7 +201,14 @@ include/drivers/ethernet.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(drivers/) include/drivers/ethernet.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(drivers/) include/drivers/dma.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(drivers/) -include/drivers/dma.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(drivers/) +include/drivers/dma_v1.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(drivers/) +include/drivers/dma_v1.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(drivers/) +include/drivers/dma_v2.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(drivers/) +include/drivers/dma_v2.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(drivers/) +include/drivers/dmadefs.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(drivers/) +include/drivers/dma_compat.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(drivers/) +include/drivers/dma_hai.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(drivers/) +include/drivers/dma_hai.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(drivers/) include/drivers/iic.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(drivers/) include/drivers/iic.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(drivers/) include/drivers/iic_channel.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(drivers/) @@ -340,6 +347,7 @@ include/d32soundsc.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(d32soundsc.inl) include/e32msgqueue.h SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(e32msgqueue.h) include/e32msgqueue.inl SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(e32msgqueue.inl) +include/d32public.h SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(d32public.h) include/d32usbcshared.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(d32usbcshared.h) include/d32usbcshared.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(d32usbcshared.inl) include/d32usbcsc.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(d32usbcsc.h) diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/bmarm/dma2u.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/bmarm/dma2u.def Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,45 @@ +EXPORTS + __18TDmaTransferConfigUlUiUiUiiiUiUi13TDmaBurstSizeUiUii @ 1 NONAME ; TDmaTransferConfig::TDmaTransferConfig(unsigned long, unsigned int, unsigned int, unsigned int, int, int, unsigned int, unsigned int, TDmaBurstSize, unsigned int, unsigned int, int) + CancelAll__11TDmaChannel @ 2 NONAME R3UNUSED ; TDmaChannel::CancelAll(void) + Close__11TDmaChannel @ 3 NONAME R3UNUSED ; TDmaChannel::Close(void) + DisableDstElementCounting__11DDmaRequest @ 4 NONAME R3UNUSED ; DDmaRequest::DisableDstElementCounting(void) + DisableSrcElementCounting__11DDmaRequest @ 5 NONAME R3UNUSED ; DDmaRequest::DisableSrcElementCounting(void) + DmaTestInfoV2__Fv @ 6 NONAME R3UNUSED ; DmaTestInfoV2(void) + DmaTestInfo__Fv @ 7 NONAME R3UNUSED ; DmaTestInfo(void) + DmacCaps__11TDmaChannel @ 8 NONAME R3UNUSED ; TDmaChannel::DmacCaps(void) + DstFragmentCount__11DDmaRequest @ 9 NONAME R3UNUSED ; DDmaRequest::DstFragmentCount(void) + EnableDstElementCounting__11DDmaRequesti @ 10 NONAME R3UNUSED ; DDmaRequest::EnableDstElementCounting(int) + EnableSrcElementCounting__11DDmaRequesti @ 11 NONAME R3UNUSED ; DDmaRequest::EnableSrcElementCounting(int) + ExpandDesList__11DDmaRequesti @ 12 NONAME R3UNUSED ; DDmaRequest::ExpandDesList(int) + ExpandDstDesList__11DDmaRequesti @ 13 NONAME R3UNUSED ; DDmaRequest::ExpandDstDesList(int) + ExpandSrcDesList__11DDmaRequesti @ 14 NONAME R3UNUSED ; DDmaRequest::ExpandSrcDesList(int) + Extension__11TDmaChanneliPv @ 15 NONAME R3UNUSED ; TDmaChannel::Extension(int, void *) + FailNext__11TDmaChanneli @ 16 NONAME R3UNUSED ; TDmaChannel::FailNext(int) + FragmentCount__11DDmaRequest @ 17 NONAME R3UNUSED ; DDmaRequest::FragmentCount(void) + Fragment__11DDmaRequestRC16TDmaTransferArgs @ 18 NONAME R3UNUSED ; DDmaRequest::Fragment(TDmaTransferArgs const &) + Fragment__11DDmaRequestUlUliUiUl @ 19 NONAME ; DDmaRequest::Fragment(unsigned long, unsigned long, int, unsigned int, unsigned long) + FreeDesList__11DDmaRequest @ 20 NONAME R3UNUSED ; DDmaRequest::FreeDesList(void) + FreeDstDesList__11DDmaRequest @ 21 NONAME R3UNUSED ; DDmaRequest::FreeDstDesList(void) + FreeSrcDesList__11DDmaRequest @ 22 NONAME R3UNUSED ; DDmaRequest::FreeSrcDesList(void) + IsrRedoRequest__11TDmaChannelUlUlUiUli @ 23 NONAME ; TDmaChannel::IsrRedoRequest(unsigned long, unsigned long, unsigned int, unsigned long, int) + LinkToChannel__11TDmaChannelP11TDmaChannel @ 24 NONAME R3UNUSED ; TDmaChannel::LinkToChannel(TDmaChannel *) + MaxTransferLength__11TDmaChannelUiUiUl @ 25 NONAME ; TDmaChannel::MaxTransferLength(unsigned int, unsigned int, unsigned long) + MissNextInterrupts__11TDmaChanneli @ 26 NONAME R3UNUSED ; TDmaChannel::MissNextInterrupts(int) + Open__11TDmaChannelRCQ211TDmaChannel11SCreateInfoRP11TDmaChannel @ 27 NONAME R3UNUSED ; TDmaChannel::Open(TDmaChannel::SCreateInfo const &, TDmaChannel *&) + Pause__11TDmaChannel @ 28 NONAME R3UNUSED ; TDmaChannel::Pause(void) + Queue__11DDmaRequest @ 29 NONAME R3UNUSED ; DDmaRequest::Queue(void) + Resume__11TDmaChannel @ 30 NONAME R3UNUSED ; TDmaChannel::Resume(void) + SrcFragmentCount__11DDmaRequest @ 31 NONAME R3UNUSED ; DDmaRequest::SrcFragmentCount(void) + StaticExtension__11TDmaChanneliPv @ 32 NONAME R3UNUSED ; TDmaChannel::StaticExtension(int, void *) + TotalNumDstElementsTransferred__11DDmaRequest @ 33 NONAME R3UNUSED ; DDmaRequest::TotalNumDstElementsTransferred(void) + TotalNumSrcElementsTransferred__11DDmaRequest @ 34 NONAME R3UNUSED ; DDmaRequest::TotalNumSrcElementsTransferred(void) + "_._11DDmaRequest" @ 35 NONAME R3UNUSED ; DDmaRequest::~DDmaRequest(void) + __11DDmaRequestR11TDmaChannelPFQ211DDmaRequest7TResultPv_vPvi @ 36 NONAME ; DDmaRequest::DDmaRequest(TDmaChannel &, void (*)(DDmaRequest::TResult, void *), void *, int) + __11DDmaRequestR11TDmaChannelPFUi10TDmaResultPvP10SDmaDesHdr_vPvUi @ 37 NONAME ; DDmaRequest::DDmaRequest(TDmaChannel &, void (*)(unsigned int, TDmaResult, void *, SDmaDesHdr *), void *, unsigned int) + __16TDmaTransferArgs @ 38 NONAME R3UNUSED ; TDmaTransferArgs::TDmaTransferArgs(void) + __16TDmaTransferArgsRC18TDmaTransferConfigT1UlUiUi15TDmaGraphicsOpsUl @ 39 NONAME ; TDmaTransferArgs::TDmaTransferArgs(TDmaTransferConfig const &, TDmaTransferConfig const &, unsigned long, unsigned int, unsigned int, TDmaGraphicsOps, unsigned long) + __16TDmaTransferArgsUiUiUiUiUiUi12TDmaAddrModeUiUi13TDmaBurstSizeUi15TDmaGraphicsOpsUl @ 40 NONAME ; TDmaTransferArgs::TDmaTransferArgs(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, TDmaAddrMode, unsigned int, unsigned int, TDmaBurstSize, unsigned int, TDmaGraphicsOps, unsigned long) + __18TDmaTransferConfig @ 41 NONAME R3UNUSED ; TDmaTransferConfig::TDmaTransferConfig(void) + __18TDmaTransferConfigUlUi12TDmaAddrModeUi13TDmaBurstSizeUiUiUii @ 42 NONAME ; TDmaTransferConfig::TDmaTransferConfig(unsigned long, unsigned int, TDmaAddrMode, unsigned int, TDmaBurstSize, unsigned int, unsigned int, unsigned int, int) + AddressAlignMask__11TDmaChannelUiUiUl @ 43 NONAME ; TDmaChannel::AddressAlignMask(unsigned int, unsigned int, unsigned long) + diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/bld.inf --- a/kernel/eka/compsupp/bld.inf Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/bld.inf Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2005-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: -* Compiler runtime support. -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Compiler runtime support. +// +// PRJ_PLATFORMS diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/compsupp.iby --- a/kernel/eka/compsupp/compsupp.iby Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/compsupp.iby Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,21 @@ -/* -* 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: -* This file contains the compiler's run-time support libraries. -* -*/ +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file contains the compiler's run-time support libraries. +// +// +// Make the file acceptable to "e32/rombuild/rom.bat." #if defined(COMPSUPP_DIR) && defined(BUILD) # define ABI_DIR \Epoc32\Release\##COMPSUPP_DIR # define DEBUG_DIR BUILD diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/gcce/gcce.h --- a/kernel/eka/compsupp/gcce/gcce.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/gcce/gcce.h Mon Jan 18 21:31:10 2010 +0200 @@ -1,23 +1,21 @@ -/* -* Copyright (c) 2005-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: -* e32\compsupp\gcce\gcce.h -* This is the preinclude file for the GCC-E compiler -* It contains all the compiler specific definitions required by the SOS source -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\compsupp\gcce\gcce.h +// This is the preinclude file for the GCC-E compiler +// It contains all the compiler specific definitions required by the SOS source +// +// /** @file diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct.h --- a/kernel/eka/compsupp/rvct.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct.h Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* 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: -* This is the preinclude file for the RVCT compiler. It contains all the compiler -* specific definitions required by the Symbian OS source code. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This is the preinclude file for the RVCT compiler. It contains all the compiler +// specific definitions required by the Symbian OS source code. +// +// /** @file diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/aeabidiv0.cpp --- a/kernel/eka/compsupp/rvct/aeabidiv0.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/aeabidiv0.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtaeabi.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtaeabi.dll. +// +// #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/aeabimem.cpp --- a/kernel/eka/compsupp/rvct/aeabimem.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/aeabimem.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtaeabi.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtaeabi.dll. +// +// #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/call_via_rx/r0.cpp --- a/kernel/eka/compsupp/rvct/call_via_rx/r0.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/call_via_rx/r0.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/call_via_rx/r1.cpp --- a/kernel/eka/compsupp/rvct/call_via_rx/r1.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/call_via_rx/r1.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/call_via_rx/r2.cpp --- a/kernel/eka/compsupp/rvct/call_via_rx/r2.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/call_via_rx/r2.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/call_via_rx/r3.cpp --- a/kernel/eka/compsupp/rvct/call_via_rx/r3.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/call_via_rx/r3.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/call_via_rx/r4.cpp --- a/kernel/eka/compsupp/rvct/call_via_rx/r4.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/call_via_rx/r4.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/call_via_rx/r5.cpp --- a/kernel/eka/compsupp/rvct/call_via_rx/r5.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/call_via_rx/r5.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/call_via_rx/r6.cpp --- a/kernel/eka/compsupp/rvct/call_via_rx/r6.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/call_via_rx/r6.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/call_via_rx/r7.cpp --- a/kernel/eka/compsupp/rvct/call_via_rx/r7.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/call_via_rx/r7.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/dfpaeabi.mmp --- a/kernel/eka/compsupp/rvct/dfpaeabi.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/dfpaeabi.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "dfpaeabi_common.mmh" @@ -22,7 +19,7 @@ target dfpaeabi.dll start armcc - #if defined(ARMCC_3_1) + #if defined(ARMCC_3_1) || defined(ARMCC_4_0) ARMLIBS fj_5s.l #else diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/dfpaeabi_common.mmh --- a/kernel/eka/compsupp/rvct/dfpaeabi_common.mmh Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/dfpaeabi_common.mmh Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// targettype dll @@ -26,7 +23,7 @@ armrt arminc - #if defined(ARMCC_3_1) + #if defined(ARMCC_3_1) || defined(ARMCC_4_0) armlibs c_5.l #else diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/dfpaeabi_vfpv2.mmp --- a/kernel/eka/compsupp/rvct/dfpaeabi_vfpv2.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/dfpaeabi_vfpv2.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "dfpaeabi_common.mmh" @@ -24,7 +21,7 @@ noexportlibrary start armcc - #if defined (ARMCC_3_1) + #if defined (ARMCC_3_1) || defined(ARMCC_4_0) armlibs fj_5v.l #else diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/dfprvct-thunk.cpp --- a/kernel/eka/compsupp/rvct/dfprvct-thunk.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/dfprvct-thunk.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,20 @@ -/* -* Copyright (c) 2004-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: -* -*/ +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// +// This file is part of dfprvct-thunk.dll. +// extern "C" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/dfprvct-thunk.mmp --- a/kernel/eka/compsupp/rvct/dfprvct-thunk.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/dfprvct-thunk.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,18 @@ -/* -* Copyright (c) 2004-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: -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// +// target dfprvct-thunk.dll targettype dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/dfprvct.cpp --- a/kernel/eka/compsupp/rvct/dfprvct.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/dfprvct.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,18 @@ -/* -* 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: -* This file is part of dfprvct.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of dfprvct.dll. +// #if __ARMCC_VERSION > 300000 diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/dfprvct.mmp --- a/kernel/eka/compsupp/rvct/dfprvct.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/dfprvct.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "dfprvct_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/dfprvct_common.mmh --- a/kernel/eka/compsupp/rvct/dfprvct_common.mmh Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/dfprvct_common.mmh Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// targettype dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/dfprvct_vfpv2.mmp --- a/kernel/eka/compsupp/rvct/dfprvct_vfpv2.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/dfprvct_vfpv2.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "dfprvct_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/dllexp.cpp --- a/kernel/eka/compsupp/rvct/dllexp.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/dllexp.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" void __DLL_Export_Table__() { } // This function (and the whole file) diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/drtaeabi.cpp --- a/kernel/eka/compsupp/rvct/drtaeabi.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/drtaeabi.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtaeabi.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtaeabi.dll. +// +// #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/drtaeabi.mmp --- a/kernel/eka/compsupp/rvct/drtaeabi.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/drtaeabi.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// target drtaeabi.dll targettype dll @@ -38,7 +35,7 @@ armrt arminc - #if defined(ARMCC_3_1) + #if defined(ARMCC_3_1) || defined(ARMCC_4_0) armlibs c_5.l cpprt_5.l h_5.l #elif defined(ARMCC_2_2) diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/drtrvct.mmp --- a/kernel/eka/compsupp/rvct/drtrvct.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/drtrvct.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "drtrvct_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/drtrvct_common.mmh --- a/kernel/eka/compsupp/rvct/drtrvct_common.mmh Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/drtrvct_common.mmh Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// targettype dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/drtrvct_vfpv2.mmp --- a/kernel/eka/compsupp/rvct/drtrvct_vfpv2.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/drtrvct_vfpv2.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "drtrvct_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/ksrt.mmp --- a/kernel/eka/compsupp/rvct/ksrt.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/ksrt.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #if defined(ARMCC_2_2) target ksrt2_2.lib diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/no_extras.cpp --- a/kernel/eka/compsupp/rvct/no_extras.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/no_extras.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* 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: -* This file is part of all compsupp DLLs. It makes the linker issue an error -* message if semihosting or heap functions get pulled in from RVCT's libraries. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of all compsupp DLLs. It makes the linker issue an error +// message if semihosting or heap functions get pulled in from RVCT's libraries. +// +// #if __ARMCC_VERSION > 300000 #pragma import(__use_no_semihosting) diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/rtabort.cpp --- a/kernel/eka/compsupp/rvct/rtabort.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/rtabort.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtrvct.dll and drtrvct_vfpv2.dll -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtrvct.dll and drtrvct_vfpv2.dll +// +// #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/rtdiv0.cpp --- a/kernel/eka/compsupp/rvct/rtdiv0.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/rtdiv0.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtrvct.dll and drtrvct_vfpv2.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtrvct.dll and drtrvct_vfpv2.dll. +// +// #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/rtexit.cpp --- a/kernel/eka/compsupp/rvct/rtexit.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/rtexit.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtrvct.dll and drtrvct_vfpv2.dll -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtrvct.dll and drtrvct_vfpv2.dll +// +// #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/rtlib.cpp --- a/kernel/eka/compsupp/rvct/rtlib.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/rtlib.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,18 @@ -/* -* Copyright (c) 2002-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: -* This file is part of drtrvct.dll and drtrvct_vfpv2.dll. -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtrvct.dll and drtrvct_vfpv2.dll. +// #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/rtraise.cpp --- a/kernel/eka/compsupp/rvct/rtraise.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/rtraise.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtrvct.dll and drtrvct_vfpv2.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtrvct.dll and drtrvct_vfpv2.dll. +// +// #include #include // Will be found among RVCT's header files. diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/sftfpini.cpp --- a/kernel/eka/compsupp/rvct/sftfpini.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/sftfpini.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtrvct.dll and drtrvct_vfpv2.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtrvct.dll and drtrvct_vfpv2.dll. +// +// #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/type_info.cpp --- a/kernel/eka/compsupp/rvct/type_info.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/type_info.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtaeabi.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtaeabi.dll. +// +// #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/ucppfini.cpp --- a/kernel/eka/compsupp/rvct/ucppfini.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/ucppfini.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib (but not ksrt.lib). -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib (but not ksrt.lib). +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/ucppinit.cpp --- a/kernel/eka/compsupp/rvct/ucppinit.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/ucppinit.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" __asm void __cpp_initialize__aeabi_() diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct/usrt.mmp --- a/kernel/eka/compsupp/rvct/usrt.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct/usrt.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,20 @@ -/* -* 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: -* usrt.mpp -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// usrt.mpp +// +// #if defined(ARMCC_2_2) target usrt2_2.lib diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/callviar0.cpp --- a/kernel/eka/compsupp/rvct2_0/callviar0.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/callviar0.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/callviar1.cpp --- a/kernel/eka/compsupp/rvct2_0/callviar1.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/callviar1.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/callviar2.cpp --- a/kernel/eka/compsupp/rvct2_0/callviar2.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/callviar2.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/callviar3.cpp --- a/kernel/eka/compsupp/rvct2_0/callviar3.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/callviar3.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/callviar4.cpp --- a/kernel/eka/compsupp/rvct2_0/callviar4.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/callviar4.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/callviar5.cpp --- a/kernel/eka/compsupp/rvct2_0/callviar5.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/callviar5.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/callviar6.cpp --- a/kernel/eka/compsupp/rvct2_0/callviar6.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/callviar6.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/callviar7.cpp --- a/kernel/eka/compsupp/rvct2_0/callviar7.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/callviar7.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/cppinit.h --- a/kernel/eka/compsupp/rvct2_0/cppinit.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/cppinit.h Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// /** @file diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/dllexp.cpp --- a/kernel/eka/compsupp/rvct2_0/dllexp.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/dllexp.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/ksrt.mmp --- a/kernel/eka/compsupp/rvct2_0/ksrt.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/ksrt.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2002-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: -* KSRT.MPP -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// KSRT.MPP +// +// ALWAYS_BUILD_AS_ARM diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/rtabort.cpp --- a/kernel/eka/compsupp/rvct2_0/rtabort.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/rtabort.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/rtdiv0.cpp --- a/kernel/eka/compsupp/rvct2_0/rtdiv0.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/rtdiv0.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/rte32dll.cpp --- a/kernel/eka/compsupp/rvct2_0/rte32dll.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/rte32dll.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -2,21 +2,20 @@ * Copyright (c) 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". +// under the terms of the License "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. * * Initial Contributors: * Nokia Corporation - initial contribution. * * Contributors: * -* Description: +* Description: * */ - #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/rtexit.cpp --- a/kernel/eka/compsupp/rvct2_0/rtexit.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/rtexit.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* Copyright (c) 2002-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: -* function the runtime can call to exit process, 'finalizing' -* the runtime library but avoiding atexit processing. -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// function the runtime can call to exit process, 'finalizing' +// the runtime library but avoiding atexit processing. +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/rtlib.cpp --- a/kernel/eka/compsupp/rvct2_0/rtlib.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/rtlib.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* Copyright (c) 2002-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: -* initialize and shutdown (low-level) runtime. -* these are intended to go in user side static runtime lib -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// initialize and shutdown (low-level) runtime. +// these are intended to go in user side static runtime lib +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/rtopdel.cpp --- a/kernel/eka/compsupp/rvct2_0/rtopdel.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/rtopdel.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,19 @@ -/* -* Copyright (c) 2002-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: -* -*/ +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// +//#include #include #include //#include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/rtopnew.cpp --- a/kernel/eka/compsupp/rvct2_0/rtopnew.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/rtopnew.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,19 @@ -/* -* Copyright (c) 2002-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: -* -*/ +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// +//#include #include #include //#include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/rtraise.cpp --- a/kernel/eka/compsupp/rvct2_0/rtraise.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/rtraise.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2001-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: -* function the runtime can call to 'raise an exception' -* -*/ - +// Copyright (c) 2001-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// function the runtime can call to 'raise an exception' +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/rvct2_0.h --- a/kernel/eka/compsupp/rvct2_0/rvct2_0.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/rvct2_0.h Mon Jan 18 21:31:10 2010 +0200 @@ -1,23 +1,21 @@ -/* -* Copyright (c) 2002-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: -* e32\compsupp\rvct2_0\rvct2_0.h -* This is the preinclude file for the rvct 2.0 compiler -* It contains all the compiler specific definitions required by the SOS source -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\compsupp\rvct2_0\rvct2_0.h +// This is the preinclude file for the rvct 2.0 compiler +// It contains all the compiler specific definitions required by the SOS source +// +// #if defined(__PRODUCT_INCLUDE__) diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/sftfpini.cpp --- a/kernel/eka/compsupp/rvct2_0/sftfpini.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/sftfpini.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/ucppfini.cpp --- a/kernel/eka/compsupp/rvct2_0/ucppfini.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/ucppfini.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* Copyright (c) 2002-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: -* toplevel destruction routines for 'user side' code compiled -* with the ARMEDG compiler. -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// toplevel destruction routines for 'user side' code compiled +// with the ARMEDG compiler. +// +// #include "cppinit.h" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/ucppinit.cpp --- a/kernel/eka/compsupp/rvct2_0/ucppinit.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/ucppinit.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* Copyright (c) 2002-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: -* toplevel initialization/destruction routines for 'user side' code compiled -* with the ARMEDG compiler. intended for static linking -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// toplevel initialization/destruction routines for 'user side' code compiled +// with the ARMEDG compiler. intended for static linking +// +// #include "cppinit.h" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/udfp.mmp --- a/kernel/eka/compsupp/rvct2_0/udfp.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/udfp.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2002-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: -* UDFP.MPP -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// UDFP.MPP +// +// TARGET udfp.dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/udfpfrce.cpp --- a/kernel/eka/compsupp/rvct2_0/udfpfrce.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/udfpfrce.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,23 +1,21 @@ -/* -* Copyright (c) 2002-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: -* This function is simple a way to for these EXPORT statements into -* the .in file. These symbols will therefore be referenced from -* the export table and so **forced** into the udfp.dll -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This function is simple a way to for these EXPORT statements into +// the .in file. These symbols will therefore be referenced from +// the export table and so **forced** into the udfp.dll +// +// __asm void __rt_exporter_dummy(void) { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/udrt.mmp --- a/kernel/eka/compsupp/rvct2_0/udrt.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/udrt.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2002-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: -* UDRT.MPP -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// UDRT.MPP +// +// TARGET udrt.dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/udrtfrce.cpp --- a/kernel/eka/compsupp/rvct2_0/udrtfrce.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/udrtfrce.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,23 +1,21 @@ -/* -* Copyright (c) 2002-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: -* This function is simple a way to for these EXPORT statements into -* the .in file. These symbols will therefore be referenced from -* the export table and so **forced** into the udrt.dll -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This function is simple a way to for these EXPORT statements into +// the .in file. These symbols will therefore be referenced from +// the export table and so **forced** into the udrt.dll +// +// __asm void __rt_exporter_dummy(void) { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_0/usrt.mmp --- a/kernel/eka/compsupp/rvct2_0/usrt.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_0/usrt.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2002-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: -* USRT.MPP -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// USRT.MPP +// +// TARGET usrt.lib diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/aeabidiv0.cpp --- a/kernel/eka/compsupp/rvct2_1/aeabidiv0.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/aeabidiv0.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2004-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: -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/aeabimem.cia --- a/kernel/eka/compsupp/rvct2_1/aeabimem.cia Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/aeabimem.cia Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2005-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: -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/callviar0.cpp --- a/kernel/eka/compsupp/rvct2_1/callviar0.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/callviar0.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/callviar1.cpp --- a/kernel/eka/compsupp/rvct2_1/callviar1.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/callviar1.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/callviar2.cpp --- a/kernel/eka/compsupp/rvct2_1/callviar2.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/callviar2.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/callviar3.cpp --- a/kernel/eka/compsupp/rvct2_1/callviar3.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/callviar3.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/callviar4.cpp --- a/kernel/eka/compsupp/rvct2_1/callviar4.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/callviar4.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/callviar5.cpp --- a/kernel/eka/compsupp/rvct2_1/callviar5.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/callviar5.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/callviar6.cpp --- a/kernel/eka/compsupp/rvct2_1/callviar6.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/callviar6.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/callviar7.cpp --- a/kernel/eka/compsupp/rvct2_1/callviar7.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/callviar7.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/cppinit.h --- a/kernel/eka/compsupp/rvct2_1/cppinit.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/cppinit.h Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// /** @file diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/dfpaeabi.cpp --- a/kernel/eka/compsupp/rvct2_1/dfpaeabi.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/dfpaeabi.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,23 +1,21 @@ -/* -* Copyright (c) 2004-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: -* This function is simple a way to get these EXPORT statements into -* the .in file. These symbols will therefore be referenced from -* the export table and so **forced** into the DLL -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This function is simple a way to get these EXPORT statements into +// the .in file. These symbols will therefore be referenced from +// the export table and so **forced** into the DLL +// +// __asm void __rt_exporter_dummy(void) { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/dfpaeabi.mmp --- a/kernel/eka/compsupp/rvct2_1/dfpaeabi.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/dfpaeabi.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2004-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: -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// TARGET dfpaeabi.dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/dfprvct2_1-thunk.cpp --- a/kernel/eka/compsupp/rvct2_1/dfprvct2_1-thunk.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/dfprvct2_1-thunk.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2004-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: -* Thunks for RVCT synonyms for AEABI functions -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Thunks for RVCT synonyms for AEABI functions +// +// extern "C" double __aeabi_l2d(long long val); extern "C" double __aeabi_ul2d(unsigned long long val); diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/dfprvct2_1-thunk.mmp --- a/kernel/eka/compsupp/rvct2_1/dfprvct2_1-thunk.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/dfprvct2_1-thunk.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2004-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: -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// target dfprvct2_1-thunk.dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/dfprvct2_1.cpp --- a/kernel/eka/compsupp/rvct2_1/dfprvct2_1.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/dfprvct2_1.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,23 +1,21 @@ -/* -* Copyright (c) 2004-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: -* This function is simple a way to get these EXPORT statements into -* the .in file. These symbols will therefore be referenced from -* the export table and so **forced** into the DLL -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This function is simple a way to get these EXPORT statements into +// the .in file. These symbols will therefore be referenced from +// the export table and so **forced** into the DLL +// +// __asm void __rt_exporter_dummy(void) { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/dfprvct2_1.mmp --- a/kernel/eka/compsupp/rvct2_1/dfprvct2_1.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/dfprvct2_1.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2004-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: -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// target dfprvct2_1.dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/dllexp.cpp --- a/kernel/eka/compsupp/rvct2_1/dllexp.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/dllexp.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/drtaeabi.cpp --- a/kernel/eka/compsupp/rvct2_1/drtaeabi.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/drtaeabi.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,24 +1,22 @@ -/* -* Copyright (c) 2004-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: -* In preparation for fully CPPABI and RTABI compliant version of RVCT 2.1 -* This function is simple a way to get these EXPORT statements into -* the .in file. These symbols will therefore be referenced from -* the export table and so **forced** into the DLL -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// In preparation for fully CPPABI and RTABI compliant version of RVCT 2.1 +// This function is simple a way to get these EXPORT statements into +// the .in file. These symbols will therefore be referenced from +// the export table and so **forced** into the DLL +// +// __asm void __rt_exporter_dummy(void) { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/drtaeabi.mmp --- a/kernel/eka/compsupp/rvct2_1/drtaeabi.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/drtaeabi.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2004-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: -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// TARGET drtaeabi.dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/drtrvct2_1.cpp --- a/kernel/eka/compsupp/rvct2_1/drtrvct2_1.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/drtrvct2_1.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,23 +1,21 @@ -/* -* Copyright (c) 2004-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: -* This function is simple a way to get these EXPORT statements into -* the .in file. These symbols will therefore be referenced from -* the export table and so **forced** into the DLL -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This function is simple a way to get these EXPORT statements into +// the .in file. These symbols will therefore be referenced from +// the export table and so **forced** into the DLL +// +// __asm void __rt_exporter_dummy(void) { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/drtrvct2_1.mmp --- a/kernel/eka/compsupp/rvct2_1/drtrvct2_1.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/drtrvct2_1.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2004-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: -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// TARGET drtrvct2_1.dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/ksrt.mmp --- a/kernel/eka/compsupp/rvct2_1/ksrt.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/ksrt.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2002-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: -* KSRT.MPP -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// KSRT.MPP +// +// ALWAYS_BUILD_AS_ARM diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/ksrt2_1.mmp --- a/kernel/eka/compsupp/rvct2_1/ksrt2_1.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/ksrt2_1.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2002-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: -* KSRT.MPP -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// KSRT.MPP +// +// ALWAYS_BUILD_AS_ARM diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/rtabort.cpp --- a/kernel/eka/compsupp/rvct2_1/rtabort.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/rtabort.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/rtdiv0.cpp --- a/kernel/eka/compsupp/rvct2_1/rtdiv0.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/rtdiv0.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/rte32dll.cpp --- a/kernel/eka/compsupp/rvct2_1/rte32dll.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/rte32dll.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -2,21 +2,20 @@ * Copyright (c) 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". +// under the terms of the License "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. * * Initial Contributors: * Nokia Corporation - initial contribution. * * Contributors: * -* Description: +* Description: * */ - #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/rtexit.cpp --- a/kernel/eka/compsupp/rvct2_1/rtexit.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/rtexit.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* Copyright (c) 2002-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: -* function the runtime can call to exit process, 'finalizing' -* the runtime library but avoiding atexit processing. -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// function the runtime can call to exit process, 'finalizing' +// the runtime library but avoiding atexit processing. +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/rtlib.cpp --- a/kernel/eka/compsupp/rvct2_1/rtlib.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/rtlib.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* Copyright (c) 2002-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: -* initialize and shutdown (low-level) runtime. -* these are intended to go in user side static runtime lib -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// initialize and shutdown (low-level) runtime. +// these are intended to go in user side static runtime lib +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/rtopdel.cpp --- a/kernel/eka/compsupp/rvct2_1/rtopdel.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/rtopdel.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,19 @@ -/* -* Copyright (c) 2002-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: -* -*/ +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// +//#include #include #include //#include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/rtopnew.cpp --- a/kernel/eka/compsupp/rvct2_1/rtopnew.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/rtopnew.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,19 @@ -/* -* Copyright (c) 2002-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: -* -*/ +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// +//#include #include #include //#include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/rtraise.cpp --- a/kernel/eka/compsupp/rvct2_1/rtraise.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/rtraise.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2001-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: -* function the runtime can call to 'raise an exception' -* -*/ - +// Copyright (c) 2001-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// function the runtime can call to 'raise an exception' +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/rvct2_1.h --- a/kernel/eka/compsupp/rvct2_1/rvct2_1.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/rvct2_1.h Mon Jan 18 21:31:10 2010 +0200 @@ -1,23 +1,21 @@ -/* -* Copyright (c) 2002-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: -* e32\compsupp\rvct2_1\rvct2_1.h -* This is the preinclude file for the rvct 2.1 compiler -* It contains all the compiler specific definitions required by the SOS source -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\compsupp\rvct2_1\rvct2_1.h +// This is the preinclude file for the rvct 2.1 compiler +// It contains all the compiler specific definitions required by the SOS source +// +// /** @file diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/sftfpini.cpp --- a/kernel/eka/compsupp/rvct2_1/sftfpini.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/sftfpini.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/ucppfini.cpp --- a/kernel/eka/compsupp/rvct2_1/ucppfini.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/ucppfini.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* Copyright (c) 2002-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: -* toplevel destruction routines for 'user side' code compiled -* with the ARMEDG compiler. -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// toplevel destruction routines for 'user side' code compiled +// with the ARMEDG compiler. +// +// #include "cppinit.h" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/ucppinit.cpp --- a/kernel/eka/compsupp/rvct2_1/ucppinit.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/ucppinit.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* Copyright (c) 2002-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: -* toplevel initialization/destruction routines for 'user side' code compiled -* with the ARMEDG compiler. intended for static linking -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// toplevel initialization/destruction routines for 'user side' code compiled +// with the ARMEDG compiler. intended for static linking +// +// #include "cppinit.h" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/ucppinit_aeabi.cpp --- a/kernel/eka/compsupp/rvct2_1/ucppinit_aeabi.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/ucppinit_aeabi.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* Copyright (c) 2003-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: -* toplevel initialization/destruction routines for 'user side' code compiled -* with the ARMCC EABI compiler. intended for static linking -* -*/ - +// Copyright (c) 2003-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// toplevel initialization/destruction routines for 'user side' code compiled +// with the ARMCC EABI compiler. intended for static linking +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/usrt.mmp --- a/kernel/eka/compsupp/rvct2_1/usrt.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/usrt.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2002-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: -* USRT.MPP -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// USRT.MPP +// +// TARGET usrt.lib diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_1/usrt2_1.mmp --- a/kernel/eka/compsupp/rvct2_1/usrt2_1.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_1/usrt2_1.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2002-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: -* USRT.MPP -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// USRT.MPP +// +// TARGET usrt2_1.lib diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/aeabidiv0.cpp --- a/kernel/eka/compsupp/rvct2_2/aeabidiv0.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/aeabidiv0.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2004-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: -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/aeabimem.cia --- a/kernel/eka/compsupp/rvct2_2/aeabimem.cia Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/aeabimem.cia Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2005-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: -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/callviar0.cpp --- a/kernel/eka/compsupp/rvct2_2/callviar0.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/callviar0.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/callviar1.cpp --- a/kernel/eka/compsupp/rvct2_2/callviar1.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/callviar1.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/callviar2.cpp --- a/kernel/eka/compsupp/rvct2_2/callviar2.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/callviar2.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/callviar3.cpp --- a/kernel/eka/compsupp/rvct2_2/callviar3.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/callviar3.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/callviar4.cpp --- a/kernel/eka/compsupp/rvct2_2/callviar4.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/callviar4.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/callviar5.cpp --- a/kernel/eka/compsupp/rvct2_2/callviar5.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/callviar5.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/callviar6.cpp --- a/kernel/eka/compsupp/rvct2_2/callviar6.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/callviar6.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/callviar7.cpp --- a/kernel/eka/compsupp/rvct2_2/callviar7.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/callviar7.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/cppinit.h --- a/kernel/eka/compsupp/rvct2_2/cppinit.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/cppinit.h Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// /** @file diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/dfpaeabi.cpp --- a/kernel/eka/compsupp/rvct2_2/dfpaeabi.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/dfpaeabi.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,23 +1,21 @@ -/* -* Copyright (c) 2004-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: -* This function is simple a way to get these EXPORT statements into -* the .in file. These symbols will therefore be referenced from -* the export table and so **forced** into the DLL -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This function is simple a way to get these EXPORT statements into +// the .in file. These symbols will therefore be referenced from +// the export table and so **forced** into the DLL +// +// __asm void __rt_exporter_dummy(void) { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/dfpaeabi.mmp --- a/kernel/eka/compsupp/rvct2_2/dfpaeabi.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/dfpaeabi.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2005-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: -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "dfpaeabi_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/dfpaeabi_common.mmh --- a/kernel/eka/compsupp/rvct2_2/dfpaeabi_common.mmh Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/dfpaeabi_common.mmh Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2005-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: -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// TARGETTYPE dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/dfpaeabi_vfpv2.mmp --- a/kernel/eka/compsupp/rvct2_2/dfpaeabi_vfpv2.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/dfpaeabi_vfpv2.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2005-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: -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "dfpaeabi_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/dfprvct2_2-thunk.cpp --- a/kernel/eka/compsupp/rvct2_2/dfprvct2_2-thunk.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/dfprvct2_2-thunk.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* Copyright (c) 2004-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: -* dfprvct2_1-thunk.cpp -* Thunks for RVCT synonyms for AEABI functions -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// dfprvct2_1-thunk.cpp +// Thunks for RVCT synonyms for AEABI functions +// +// extern "C" double __aeabi_l2d(long long val); extern "C" double __aeabi_ul2d(unsigned long long val); diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/dfprvct2_2-thunk.mmp --- a/kernel/eka/compsupp/rvct2_2/dfprvct2_2-thunk.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/dfprvct2_2-thunk.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2004-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: -* dfprvct2_1-thunk.mmp -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// dfprvct2_1-thunk.mmp +// +// target dfprvct2_2-thunk.dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/dfprvct2_2.cpp --- a/kernel/eka/compsupp/rvct2_2/dfprvct2_2.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/dfprvct2_2.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,24 +1,22 @@ -/* -* Copyright (c) 2004-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: -* DFPRVCT2_1.CPP -* This function is simple a way to get these EXPORT statements into -* the .in file. These symbols will therefore be referenced from -* the export table and so **forced** into the DLL -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// DFPRVCT2_1.CPP +// This function is simple a way to get these EXPORT statements into +// the .in file. These symbols will therefore be referenced from +// the export table and so **forced** into the DLL +// +// __asm void __rt_exporter_dummy(void) { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/dfprvct2_2.mmp --- a/kernel/eka/compsupp/rvct2_2/dfprvct2_2.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/dfprvct2_2.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2005-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: -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "dfprvct2_2_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/dfprvct2_2_common.mmh --- a/kernel/eka/compsupp/rvct2_2/dfprvct2_2_common.mmh Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/dfprvct2_2_common.mmh Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2005-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: -* dfprvct2_2_common.mmp -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// dfprvct2_2_common.mmp +// +// targettype dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/dfprvct2_2_vfpv2.mmp --- a/kernel/eka/compsupp/rvct2_2/dfprvct2_2_vfpv2.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/dfprvct2_2_vfpv2.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2005-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: -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "dfprvct2_2_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/dllexp.cpp --- a/kernel/eka/compsupp/rvct2_2/dllexp.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/dllexp.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/drtaeabi.cpp --- a/kernel/eka/compsupp/rvct2_2/drtaeabi.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/drtaeabi.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2004-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: -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// extern char * _ZTVN10__cxxabiv123__fundamental_type_infoE; extern const char * const $Sub$$_ZTSv = "v"; diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/drtaeabi.mmp --- a/kernel/eka/compsupp/rvct2_2/drtaeabi.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/drtaeabi.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2004-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: -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// TARGET drtaeabi.dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/drtrvct2_2.cpp --- a/kernel/eka/compsupp/rvct2_2/drtrvct2_2.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/drtrvct2_2.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,23 +1,21 @@ -/* -* Copyright (c) 2005-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: -* This function is simple a way to get these EXPORT statements into -* the .in file. These symbols will therefore be referenced from -* the export table and so **forced** into the DLL -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This function is simple a way to get these EXPORT statements into +// the .in file. These symbols will therefore be referenced from +// the export table and so **forced** into the DLL +// +// __asm void __rt_exporter_dummy(void) { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/drtrvct2_2.mmp --- a/kernel/eka/compsupp/rvct2_2/drtrvct2_2.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/drtrvct2_2.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2005-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: -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "drtrvct2_2_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/drtrvct2_2_common.mmh --- a/kernel/eka/compsupp/rvct2_2/drtrvct2_2_common.mmh Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/drtrvct2_2_common.mmh Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2005-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: -* DRTRVCT2_2_COMMON.MMP -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// DRTRVCT2_2_COMMON.MMP +// +// TARGETTYPE dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/drtrvct2_2_vfpv2.mmp --- a/kernel/eka/compsupp/rvct2_2/drtrvct2_2_vfpv2.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/drtrvct2_2_vfpv2.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2005-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: -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "drtrvct2_2_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/ksrt2_2.mmp --- a/kernel/eka/compsupp/rvct2_2/ksrt2_2.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/ksrt2_2.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,23 +1,21 @@ -/* -* Copyright (c) 2002-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: -* KSRT2_2.MPP -* This version is used to support RVCT 2.2 builds. -* Here the init_array (|SHT$$INIT_ARRAY$$Base|) contains pointers rather than offsets. -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// KSRT2_2.MPP +// This version is used to support RVCT 2.2 builds. +// Here the init_array (|SHT$$INIT_ARRAY$$Base|) contains pointers rather than offsets. +// +// ALWAYS_BUILD_AS_ARM diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/rtabort.cpp --- a/kernel/eka/compsupp/rvct2_2/rtabort.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/rtabort.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/rtdiv0.cpp --- a/kernel/eka/compsupp/rvct2_2/rtdiv0.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/rtdiv0.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/rte32dll.cpp --- a/kernel/eka/compsupp/rvct2_2/rte32dll.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/rte32dll.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -2,21 +2,20 @@ * Copyright (c) 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". +// under the terms of the License "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. * * Initial Contributors: * Nokia Corporation - initial contribution. * * Contributors: * -* Description: +* Description: * */ - #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/rtexit.cpp --- a/kernel/eka/compsupp/rvct2_2/rtexit.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/rtexit.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* Copyright (c) 2002-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: -* function the runtime can call to exit process, 'finalizing' -* the runtime library but avoiding atexit processing. -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// function the runtime can call to exit process, 'finalizing' +// the runtime library but avoiding atexit processing. +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/rtlib.cpp --- a/kernel/eka/compsupp/rvct2_2/rtlib.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/rtlib.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* Copyright (c) 2002-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: -* initialize and shutdown (low-level) runtime. -* these are intended to go in user side static runtime lib -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// initialize and shutdown (low-level) runtime. +// these are intended to go in user side static runtime lib +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/rtopdel.cpp --- a/kernel/eka/compsupp/rvct2_2/rtopdel.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/rtopdel.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2005-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: -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/rtopnew.cpp --- a/kernel/eka/compsupp/rvct2_2/rtopnew.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/rtopnew.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2005-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: -* -*/ - +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/rtraise.cpp --- a/kernel/eka/compsupp/rvct2_2/rtraise.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/rtraise.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2001-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: -* function the runtime can call to 'raise an exception' -* -*/ - +// Copyright (c) 2001-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// function the runtime can call to 'raise an exception' +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/rvct2_2.h --- a/kernel/eka/compsupp/rvct2_2/rvct2_2.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/rvct2_2.h Mon Jan 18 21:31:10 2010 +0200 @@ -1,23 +1,21 @@ -/* -* Copyright (c) 2002-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: -* e32\compsupp\rvct2_2\rvct2_2.h -* This is the preinclude file for the rvct 2.2 compiler -* It contains all the compiler specific definitions required by the SOS source -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\compsupp\rvct2_2\rvct2_2.h +// This is the preinclude file for the rvct 2.2 compiler +// It contains all the compiler specific definitions required by the SOS source +// +// /** @file diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/sftfpini.cpp --- a/kernel/eka/compsupp/rvct2_2/sftfpini.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/sftfpini.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* Copyright (c) 2002-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: -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/type_info.cpp --- a/kernel/eka/compsupp/rvct2_2/type_info.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/type_info.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -2,20 +2,19 @@ * Copyright (c) 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". +// under the terms of the License "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. * * Initial Contributors: * Nokia Corporation - initial contribution. * * Contributors: * -* Description: +* Description: * */ - #include EXPORT_C bool std::type_info::operator==(const std::type_info& rhs) const diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/ucppfini.cpp --- a/kernel/eka/compsupp/rvct2_2/ucppfini.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/ucppfini.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* Copyright (c) 2002-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: -* toplevel destruction routines for 'user side' code compiled -* with the ARMEDG compiler. -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// toplevel destruction routines for 'user side' code compiled +// with the ARMEDG compiler. +// +// #include "cppinit.h" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/ucppinit.cpp --- a/kernel/eka/compsupp/rvct2_2/ucppinit.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/ucppinit.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* Copyright (c) 2002-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: -* toplevel initialization/destruction routines for 'user side' code compiled -* with the ARMEDG compiler. intended for static linking -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// toplevel initialization/destruction routines for 'user side' code compiled +// with the ARMEDG compiler. intended for static linking +// +// #include "cppinit.h" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/ucppinit_aeabi.cpp --- a/kernel/eka/compsupp/rvct2_2/ucppinit_aeabi.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/ucppinit_aeabi.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,24 +1,22 @@ -/* -* Copyright (c) 2003-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: -* toplevel initialization/destruction routines for 'user side' code compiled -* with the ARMCC EABI compiler. intended for static linking -* The code supports 2.2 both bpabi and non-bpabi. The values in .init_array are -* pointers in both environments, so the library is common to both. -* -*/ - +// Copyright (c) 2003-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// toplevel initialization/destruction routines for 'user side' code compiled +// with the ARMCC EABI compiler. intended for static linking +// The code supports 2.2 both bpabi and non-bpabi. The values in .init_array are +// pointers in both environments, so the library is common to both. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct2_2/usrt2_2.mmp --- a/kernel/eka/compsupp/rvct2_2/usrt2_2.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct2_2/usrt2_2.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,23 +1,21 @@ -/* -* Copyright (c) 2002-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: -* USRT2_2.MPP -* This version is used to support RVCT 2.2 builds. -* Here the init_array (|SHT$$INIT_ARRAY$$Base|) contains pointers rather than offsets. -* -*/ - +// Copyright (c) 2002-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// USRT2_2.MPP +// This version is used to support RVCT 2.2 builds. +// Here the init_array (|SHT$$INIT_ARRAY$$Base|) contains pointers rather than offsets. +// +// TARGET usrt2_2.lib diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/aeabidiv0.cpp --- a/kernel/eka/compsupp/rvct3_1/aeabidiv0.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/aeabidiv0.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtaeabi.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtaeabi.dll. +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/aeabimem.cia --- a/kernel/eka/compsupp/rvct3_1/aeabimem.cia Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/aeabimem.cia Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtaeabi.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtaeabi.dll. +// +// #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/call_via_rx/r0.cpp --- a/kernel/eka/compsupp/rvct3_1/call_via_rx/r0.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/call_via_rx/r0.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/call_via_rx/r1.cpp --- a/kernel/eka/compsupp/rvct3_1/call_via_rx/r1.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/call_via_rx/r1.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/call_via_rx/r2.cpp --- a/kernel/eka/compsupp/rvct3_1/call_via_rx/r2.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/call_via_rx/r2.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/call_via_rx/r3.cpp --- a/kernel/eka/compsupp/rvct3_1/call_via_rx/r3.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/call_via_rx/r3.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/call_via_rx/r4.cpp --- a/kernel/eka/compsupp/rvct3_1/call_via_rx/r4.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/call_via_rx/r4.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/call_via_rx/r5.cpp --- a/kernel/eka/compsupp/rvct3_1/call_via_rx/r5.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/call_via_rx/r5.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/call_via_rx/r6.cpp --- a/kernel/eka/compsupp/rvct3_1/call_via_rx/r6.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/call_via_rx/r6.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/call_via_rx/r7.cpp --- a/kernel/eka/compsupp/rvct3_1/call_via_rx/r7.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/call_via_rx/r7.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/dfpaeabi.mmp --- a/kernel/eka/compsupp/rvct3_1/dfpaeabi.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/dfpaeabi.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "dfpaeabi_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/dfpaeabi_common.mmh --- a/kernel/eka/compsupp/rvct3_1/dfpaeabi_common.mmh Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/dfpaeabi_common.mmh Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// targettype dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/dfpaeabi_vfpv2.mmp --- a/kernel/eka/compsupp/rvct3_1/dfpaeabi_vfpv2.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/dfpaeabi_vfpv2.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "dfpaeabi_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/dfprvct.cpp --- a/kernel/eka/compsupp/rvct3_1/dfprvct.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/dfprvct.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,24 +1,22 @@ -/* -* 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: -* This file is part of dfprvct.dll. -* According to the EABI: -* 1. "long int" is the same as "int", and -* 2. "long double" is the same as "double". -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of dfprvct.dll. +// According to the EABI: +// 1. "long int" is the same as "int", and +// 2. "long double" is the same as "double". +// +// __asm void __Symbian_exporter_dummy_1() diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/dfprvct.mmp --- a/kernel/eka/compsupp/rvct3_1/dfprvct.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/dfprvct.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "dfprvct_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/dfprvct_common.mmh --- a/kernel/eka/compsupp/rvct3_1/dfprvct_common.mmh Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/dfprvct_common.mmh Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// targettype dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/dfprvct_vfpv2.mmp --- a/kernel/eka/compsupp/rvct3_1/dfprvct_vfpv2.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/dfprvct_vfpv2.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "dfprvct_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/dllexp.cpp --- a/kernel/eka/compsupp/rvct3_1/dllexp.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/dllexp.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" void __DLL_Export_Table__() { } // This function (and the whole file) diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/drtaeabi.cpp --- a/kernel/eka/compsupp/rvct3_1/drtaeabi.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/drtaeabi.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtaeabi.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtaeabi.dll. +// +// #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/drtaeabi.mmp --- a/kernel/eka/compsupp/rvct3_1/drtaeabi.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/drtaeabi.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// target drtaeabi.dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/drtrvct.mmp --- a/kernel/eka/compsupp/rvct3_1/drtrvct.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/drtrvct.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "drtrvct_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/drtrvct_common.mmh --- a/kernel/eka/compsupp/rvct3_1/drtrvct_common.mmh Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/drtrvct_common.mmh Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// targettype dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/drtrvct_vfpv2.mmp --- a/kernel/eka/compsupp/rvct3_1/drtrvct_vfpv2.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/drtrvct_vfpv2.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// #include "drtrvct_common.mmh" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/ksrt.mmp --- a/kernel/eka/compsupp/rvct3_1/ksrt.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/ksrt.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,17 @@ -/* -* 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: -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// target ksrt3_1.lib targettype klib diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/no_extras.cpp --- a/kernel/eka/compsupp/rvct3_1/no_extras.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/no_extras.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* 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: -* This file is part of all compsupp DLLs. It makes the linker issue an error -* message if semihosting or heap functions get pulled in from RVCT's libraries. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of all compsupp DLLs. It makes the linker issue an error +// message if semihosting or heap functions get pulled in from RVCT's libraries. +// +// #pragma import(__use_no_semihosting) diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/rtabort.cpp --- a/kernel/eka/compsupp/rvct3_1/rtabort.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/rtabort.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtrvct.dll and drtrvct_vfpv2.dll -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtrvct.dll and drtrvct_vfpv2.dll +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/rtdiv0.cpp --- a/kernel/eka/compsupp/rvct3_1/rtdiv0.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/rtdiv0.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtrvct.dll and drtrvct_vfpv2.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtrvct.dll and drtrvct_vfpv2.dll. +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/rtexit.cpp --- a/kernel/eka/compsupp/rvct3_1/rtexit.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/rtexit.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtrvct.dll and drtrvct_vfpv2.dll -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtrvct.dll and drtrvct_vfpv2.dll +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/rtraise.cpp --- a/kernel/eka/compsupp/rvct3_1/rtraise.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/rtraise.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtrvct.dll and drtrvct_vfpv2.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtrvct.dll and drtrvct_vfpv2.dll. +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/sftfpini.cpp --- a/kernel/eka/compsupp/rvct3_1/sftfpini.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/sftfpini.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of drtrvct.dll and drtrvct_vfpv2.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of drtrvct.dll and drtrvct_vfpv2.dll. +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/type_info.cpp --- a/kernel/eka/compsupp/rvct3_1/type_info.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/type_info.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -2,20 +2,19 @@ * Copyright (c) 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". +// under the terms of the License "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. * * Initial Contributors: * Nokia Corporation - initial contribution. * * Contributors: * -* Description: +* Description: * */ - #include EXPORT_C bool std::type_info::operator==(const std::type_info& rhs) const diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/ucppfini.cpp --- a/kernel/eka/compsupp/rvct3_1/ucppfini.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/ucppfini.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib (but not ksrt.lib). -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib (but not ksrt.lib). +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/ucppinit.cpp --- a/kernel/eka/compsupp/rvct3_1/ucppinit.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/ucppinit.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of usrt.lib and ksrt.lib. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of usrt.lib and ksrt.lib. +// +// extern "C" { diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/rvct3_1/usrt.mmp --- a/kernel/eka/compsupp/rvct3_1/usrt.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/rvct3_1/usrt.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* usrt.mpp -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// usrt.mpp +// +// target usrt3_1.lib targettype lib diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/symaehabi/basics.h --- a/kernel/eka/compsupp/symaehabi/basics.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/symaehabi/basics.h Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2004-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: -* e32/compsupp/symaehabi/basics.h -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32/compsupp/symaehabi/basics.h +// +// #define __NEW // lie about this diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/symaehabi/callfirstprocessfn.cpp --- a/kernel/eka/compsupp/symaehabi/callfirstprocessfn.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/symaehabi/callfirstprocessfn.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2004-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: -* e32\compsupp\symaehabi\callfirstprocessfn.cpp -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\compsupp\symaehabi\callfirstprocessfn.cpp +// +// #include "unwind_env.h" #include "unwinder.h" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/symaehabi/symbian_rtti.cpp --- a/kernel/eka/compsupp/symaehabi/symbian_rtti.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/symaehabi/symbian_rtti.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2004-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: -* e32/compsupp/symaehabi/symbian_rtti.cpp -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32/compsupp/symaehabi/symbian_rtti.cpp +// +// #include "cxxabi.h" #include "unwind_env.h" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/symaehabi/symbian_support.cpp --- a/kernel/eka/compsupp/symaehabi/symbian_support.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/symaehabi/symbian_support.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2004-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: -* e32/compsupp/symaehabi/symbian_support.cpp -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32/compsupp/symaehabi/symbian_support.cpp +// +// /* Environment: */ #include "unwind_env.h" diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/symaehabi/symbian_support.h --- a/kernel/eka/compsupp/symaehabi/symbian_support.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/symaehabi/symbian_support.h Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* Copyright (c) 2004-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: -* e32/compsupp/symaehabi/symbian_support.h -* -*/ - +// Copyright (c) 2004-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32/compsupp/symaehabi/symbian_support.h +// +// #ifndef SYMBIAN_SUPPORT_H diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/symcpp/rtopdel.cpp --- a/kernel/eka/compsupp/symcpp/rtopdel.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/symcpp/rtopdel.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of scppnwdl.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of scppnwdl.dll. +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/symcpp/rtopnew.cpp --- a/kernel/eka/compsupp/symcpp/rtopnew.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/symcpp/rtopnew.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,19 @@ -/* -* 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: -* This file is part of scppnwdl.dll. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file is part of scppnwdl.dll. +// +// #include #include diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/symcpp/scppnwdl.mmp --- a/kernel/eka/compsupp/symcpp/scppnwdl.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/symcpp/scppnwdl.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,22 +1,20 @@ -/* -* 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: -* Creates scppnwdl.dll which implements Symbian's global operator new and global -* operator delete. -* -*/ - +// 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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Creates scppnwdl.dll which implements Symbian's global operator new and global +// operator delete. +// +// TARGET scppnwdl.dll diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/compsupp/symcpp/symcpp.h --- a/kernel/eka/compsupp/symcpp/symcpp.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/compsupp/symcpp/symcpp.h Mon Jan 18 21:31:10 2010 +0200 @@ -1,21 +1,21 @@ -/* -* Copyright (c) 2005-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: -* This is a preinclude file for the Symbian C++ specific defintions for RVCT. -* -*/ +// Copyright (c) 2005-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 "ARM EABI LICENCE.txt" +// which accompanies this distribution, and is available +// in kernel/eka/compsupp. +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This is a preinclude file for the Symbian C++ specific defintions for RVCT. +// +// +// Deal with operator new issues here #ifdef __cplusplus namespace std { struct nothrow_t { }; diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/drivers/bsp/bld.inf --- a/kernel/eka/drivers/bsp/bld.inf Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/drivers/bsp/bld.inf Mon Jan 18 21:31:10 2010 +0200 @@ -37,6 +37,7 @@ #if !defined(WINS) #if !defined(X86) ../dma/dma_lib +../dma/dma2_lib #endif #endif diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/drivers/dma/dma2_lib.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/drivers/dma/dma2_lib.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,30 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// e32\drivers\dma\dma2_lib.mmp +// +// + +target dma2.lib +targettype implib +linkas dma.dll + +#if defined(EABI) +deffile ../../eabi/dma2.def +#elif defined(GCC32) +deffile ../../bmarm/dma2.def +#endif + +VENDORID 0x70000001 + +SMPSAFE diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/drivers/dma/dma2_pil.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/drivers/dma/dma2_pil.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,2311 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// e32/drivers/dma2_pil.cpp +// DMA Platform Independent Layer (PIL) +// +// + +#include +#include + +#include + + +// Symbian Min() & Max() are broken, so we have to define them ourselves +inline TUint Min(TUint aLeft, TUint aRight) + {return(aLeft < aRight ? aLeft : aRight);} +inline TUint Max(TUint aLeft, TUint aRight) + {return(aLeft > aRight ? aLeft : aRight);} + + +// Uncomment the following #define only when freezing the DMA2 export library. +//#define __FREEZE_DMA2_LIB +#ifdef __FREEZE_DMA2_LIB +TInt DmaChannelMgr::StaticExtension(TInt, TAny*) {return 0;} +TDmaChannel* DmaChannelMgr::Open(TUint32, TBool, TUint) {return 0;} +void DmaChannelMgr::Close(TDmaChannel*) {} +EXPORT_C const TDmaTestInfo& DmaTestInfo() {static TDmaTestInfo a; return a;} +EXPORT_C const TDmaV2TestInfo& DmaTestInfoV2() {static TDmaV2TestInfo a; return a;} +#endif // #ifdef __FREEZE_DMA2_LIB + + +static const char KDmaPanicCat[] = "DMA " __FILE__; + +////////////////////////////////////////////////////////////////////// +// DmaChannelMgr +// +// Wait, Signal, and Initialise are defined here in the PIL. +// Open, Close and Extension must be defined in the PSL. + +NFastMutex DmaChannelMgr::Lock; + + +void DmaChannelMgr::Wait() + { + NKern::FMWait(&Lock); + } + + +void DmaChannelMgr::Signal() + { + NKern::FMSignal(&Lock); + } + + +TInt DmaChannelMgr::Initialise() + { + return KErrNone; + } + + +class TDmaCancelInfo : public SDblQueLink + { +public: + TDmaCancelInfo(); + void Signal(); +public: + NFastSemaphore iSem; + }; + + +TDmaCancelInfo::TDmaCancelInfo() + : iSem(0) + { + iNext = this; + iPrev = this; + } + + +void TDmaCancelInfo::Signal() + { + TDmaCancelInfo* p = this; + FOREVER + { + TDmaCancelInfo* next = (TDmaCancelInfo*)p->iNext; + if (p!=next) + p->Deque(); + NKern::FSSignal(&p->iSem); // Don't dereference p after this + if (p==next) + break; + p = next; + } + } + + +////////////////////////////////////////////////////////////////////////////// + +#ifdef __DMASIM__ +#ifdef __WINS__ +typedef TLinAddr TPhysAddr; +#endif +static inline TPhysAddr LinToPhys(TLinAddr aLin) {return aLin;} +#else +static inline TPhysAddr LinToPhys(TLinAddr aLin) {return Epoc::LinearToPhysical(aLin);} +#endif + +// +// Return minimum of aMaxSize and size of largest physically contiguous block +// starting at aLinAddr. +// +static TInt MaxPhysSize(TLinAddr aLinAddr, const TInt aMaxSize) + { + const TPhysAddr physBase = LinToPhys(aLinAddr); + TLinAddr lin = aLinAddr; + TInt size = 0; + for (;;) + { + // Round up the linear address to the next MMU page boundary + const TLinAddr linBoundary = Kern::RoundToPageSize(lin + 1); + size += linBoundary - lin; + if (size >= aMaxSize) + return aMaxSize; + if ((physBase + size) != LinToPhys(linBoundary)) + return size; + lin = linBoundary; + } + } + + +////////////////////////////////////////////////////////////////////////////// +// TDmac + +TDmac::TDmac(const SCreateInfo& aInfo) + : iMaxDesCount(aInfo.iDesCount), + iAvailDesCount(aInfo.iDesCount), + iHdrPool(NULL), +#ifndef __WINS__ + iHwDesChunk(NULL), +#endif + iDesPool(NULL), + iDesSize(aInfo.iDesSize), + iCapsHwDes(aInfo.iCapsHwDes), + iFreeHdr(NULL) + { + __DMA_ASSERTD(iMaxDesCount > 0); + __DMA_ASSERTD(iDesSize > 0); + } + + +// +// Second-phase c'tor +// +TInt TDmac::Create(const SCreateInfo& aInfo) + { + iHdrPool = new SDmaDesHdr[iMaxDesCount]; + if (iHdrPool == NULL) + { + return KErrNoMemory; + } + + TInt r = AllocDesPool(aInfo.iDesChunkAttribs); + if (r != KErrNone) + { + return KErrNoMemory; + } + + // Link all descriptor headers together on the free list + iFreeHdr = iHdrPool; + for (TInt i = 0; i < iMaxDesCount - 1; i++) + iHdrPool[i].iNext = iHdrPool + i + 1; + iHdrPool[iMaxDesCount-1].iNext = NULL; + + __DMA_INVARIANT(); + return KErrNone; + } + + +TDmac::~TDmac() + { + __DMA_INVARIANT(); + + FreeDesPool(); + delete[] iHdrPool; + } + + +void TDmac::Transfer(const TDmaChannel& /*aChannel*/, const SDmaDesHdr& /*aHdr*/) + { + // TDmac needs to override this function if it has reported the channel + // type for which the PIL calls it. + __DMA_CANT_HAPPEN(); + } + + +void TDmac::Transfer(const TDmaChannel& /*aChannel*/, const SDmaDesHdr& /*aSrcHdr*/, + const SDmaDesHdr& /*aDstHdr*/) + { + // TDmac needs to override this function if it has reported the channel + // type for which the PIL calls it. + __DMA_CANT_HAPPEN(); + } + + +TInt TDmac::PauseTransfer(const TDmaChannel& /*aChannel*/) + { + // TDmac needs to override this function if it has reported support for + // channel pausing/resuming. + return KErrNotSupported; + } + + +TInt TDmac::ResumeTransfer(const TDmaChannel& /*aChannel*/) + { + // TDmac needs to override this function if it has reported support for + // channel pausing/resuming. + return KErrNotSupported; + } + + +TInt TDmac::AllocDesPool(TUint aAttribs) + { + // Calling thread must be in CS + __ASSERT_CRITICAL; + TInt r; + if (iCapsHwDes) + { + const TInt size = iMaxDesCount * iDesSize; +#ifdef __WINS__ + (void)aAttribs; + iDesPool = new TUint8[size]; + r = iDesPool ? KErrNone : KErrNoMemory; +#else + // Chunk not mapped as supervisor r/w user none? incorrect mask passed by PSL + __DMA_ASSERTD((aAttribs & EMapAttrAccessMask) == EMapAttrSupRw); + TPhysAddr phys; + r = Epoc::AllocPhysicalRam(size, phys); + if (r == KErrNone) + { + r = DPlatChunkHw::New(iHwDesChunk, phys, size, aAttribs); + if (r == KErrNone) + { + iDesPool = (TAny*)iHwDesChunk->LinearAddress(); + __KTRACE_OPT(KDMA, Kern::Printf("descriptor hw chunk created lin=0x%08X phys=0x%08X, size=0x%X", + iHwDesChunk->iLinAddr, iHwDesChunk->iPhysAddr, size)); + } + else + Epoc::FreePhysicalRam(phys, size); + } +#endif + } + else + { + iDesPool = new TDmaTransferArgs[iMaxDesCount]; + r = iDesPool ? KErrNone : KErrNoMemory; + } + return r; + } + + +void TDmac::FreeDesPool() + { + // Calling thread must be in CS + __ASSERT_CRITICAL; + if (iCapsHwDes) + { +#ifdef __WINS__ + delete[] iDesPool; +#else + if (iHwDesChunk) + { + const TPhysAddr phys = iHwDesChunk->PhysicalAddress(); + const TInt size = iHwDesChunk->iSize; + iHwDesChunk->Close(NULL); + Epoc::FreePhysicalRam(phys, size); + } +#endif + } + else + { + Kern::Free(iDesPool); + } + } + + +// +// Prealloc the given number of descriptors. +// +TInt TDmac::ReserveSetOfDes(TInt aCount) + { + __KTRACE_OPT(KDMA, Kern::Printf("TDmac::ReserveSetOfDes count=%d", aCount)); + __DMA_ASSERTD(aCount > 0); + TInt r = KErrTooBig; + Wait(); + if (iAvailDesCount - aCount >= 0) + { + iAvailDesCount -= aCount; + r = KErrNone; + } + Signal(); + __DMA_INVARIANT(); + return r; + } + + +// +// Return the given number of preallocated descriptors to the free pool. +// +void TDmac::ReleaseSetOfDes(TInt aCount) + { + __DMA_ASSERTD(aCount >= 0); + Wait(); + iAvailDesCount += aCount; + Signal(); + __DMA_INVARIANT(); + } + + +// +// Queue DFC and update word used to communicate with channel DFC. +// +// Called in interrupt context by PSL. +// +void TDmac::HandleIsr(TDmaChannel& aChannel, TUint aEventMask, TBool aIsComplete) + { + __KTRACE_OPT(KDMA, Kern::Printf("TDmac::HandleIsr")); + + // Function needs to be called by PSL in ISR context + __DMA_ASSERTD(NKern::CurrentContext() == NKern::EInterrupt); + + // First the ISR callback stuff + + // Is this a transfer completion notification? + if (aEventMask & EDmaCallbackRequestCompletion) + { + // If so, has the client requested an ISR callback? + if (__e32_atomic_load_acq32(&aChannel.iIsrCbRequest)) + { + __KTRACE_OPT(KDMA, Kern::Printf("ISR callback")); + + // Since iIsrCbRequest was set no threads will be + // modifying the request queue. + const DDmaRequest* const req = _LOFF(aChannel.iReqQ.First(), DDmaRequest, iLink); + + // We expect the request to have requested + // ISR callback + __NK_ASSERT_DEBUG(req->iIsrCb); + + TDmaCallback const cb = req->iDmaCb; + TAny* const arg = req->iDmaCbArg; + // Execute the client callback + (*cb)(EDmaCallbackRequestCompletion, + (aIsComplete ? EDmaResultOK : EDmaResultError), + arg, + NULL); + // Now let's see if the callback rescheduled the transfer request + // (see TDmaChannel::IsrRedoRequest()). + const TBool redo = aChannel.iRedoRequest; + aChannel.iRedoRequest = EFalse; + const TBool stop = __e32_atomic_load_acq32(&aChannel.iIsrDfc) & + (TUint32)TDmaChannel::KCancelFlagMask; + // There won't be another ISR callback if this callback didn't + // reschedule the request, or the client cancelled all requests, or + // this callback rescheduled the request with a DFC callback. + if (!redo || stop || !req->iIsrCb) + { + __e32_atomic_store_rel32(&aChannel.iIsrCbRequest, EFalse); + } + if (redo && !stop) + { + // We won't queue the channel DFC in this case and just return. + __KTRACE_OPT(KDMA, Kern::Printf("CB rescheduled xfer -> no DFC")); + return; + } + // Not redoing or being cancelled means we've been calling the + // request's ISR callback for the last time. We're going to + // complete the request via the DFC in the usual way. + } + } + + // Now queue a DFC if necessary. The possible scenarios are: + // a) DFC not queued (orig == 0) -> update iIsrDfc + queue DFC + // b) DFC queued, not running yet (orig != 0) -> just update iIsrDfc + // c) DFC running / iIsrDfc not reset yet (orig != 0) -> just update iIsrDfc + // d) DFC running / iIsrDfc already reset (orig == 0) -> update iIsrDfc + requeue DFC + + // Set error flag if necessary. + const TUint32 inc = aIsComplete ? 1u : TUint32(TDmaChannel::KErrorFlagMask) | 1u; + + // Add 'inc' (interrupt count increment + poss. error flag) to 'iIsrDfc' if + // cancel flag is not set, do nothing otherwise. Assign original value of + // 'iIsrDfc' to 'orig' in any case. + const TUint32 orig = __e32_atomic_tau_ord32(&aChannel.iIsrDfc, + TUint32(TDmaChannel::KCancelFlagMask), + 0, + inc); + + // As transfer should be suspended when an error occurs, we + // should never get there with the error flag already set. + __DMA_ASSERTD((orig & inc & (TUint32)TDmaChannel::KErrorFlagMask) == 0); + + if (orig == 0) + { + aChannel.iDfc.Add(); + } + } + + +TInt TDmac::InitDes(const SDmaDesHdr& aHdr, const TDmaTransferArgs& aTransferArgs) + { + __KTRACE_OPT(KDMA, Kern::Printf("TDmac::InitDes")); + TInt r; + if (iCapsHwDes) + { + __KTRACE_OPT(KDMA, Kern::Printf("iCaps.iHwDescriptors")); + r = InitHwDes(aHdr, aTransferArgs); + } + else + { + TDmaTransferArgs& args = HdrToDes(aHdr); + args = aTransferArgs; + r = KErrNone; + } + return r; + } + + +TInt TDmac::InitHwDes(const SDmaDesHdr& /*aHdr*/, const TDmaTransferArgs& /*aTransferArgs*/) + { + // concrete controller must override if SDmacCaps::iHwDescriptors set + __DMA_CANT_HAPPEN(); + return KErrGeneral; + } + + +TInt TDmac::InitSrcHwDes(const SDmaDesHdr& /*aHdr*/, const TDmaTransferArgs& /*aTransferArgs*/) + { + // concrete controller must override if SDmacCaps::iAsymHwDescriptors set + __DMA_CANT_HAPPEN(); + return KErrGeneral; + } + + +TInt TDmac::InitDstHwDes(const SDmaDesHdr& /*aHdr*/, const TDmaTransferArgs& /*aTransferArgs*/) + { + // concrete controller must override if SDmacCaps::iAsymHwDescriptors set + __DMA_CANT_HAPPEN(); + return KErrGeneral; + } + + +TInt TDmac::UpdateDes(const SDmaDesHdr& aHdr, TUint32 aSrcAddr, TUint32 aDstAddr, + TUint aTransferCount, TUint32 aPslRequestInfo) + { + __KTRACE_OPT(KDMA, Kern::Printf("TDmac::UpdateDes")); + TInt r; + if (iCapsHwDes) + { + __KTRACE_OPT(KDMA, Kern::Printf("iCaps.iHwDescriptors")); + r = UpdateHwDes(aHdr, aSrcAddr, aDstAddr, aTransferCount, aPslRequestInfo); + } + else + { + TDmaTransferArgs& args = HdrToDes(aHdr); + if (aSrcAddr != KPhysAddrInvalid) + args.iSrcConfig.iAddr = aSrcAddr; + if (aDstAddr != KPhysAddrInvalid) + args.iDstConfig.iAddr = aDstAddr; + if (aTransferCount) + args.iTransferCount = aTransferCount; + if (aPslRequestInfo) + args.iPslRequestInfo = aPslRequestInfo; + r = KErrNone; + } + return r; + } + + +TInt TDmac::UpdateHwDes(const SDmaDesHdr& /*aHdr*/, TUint32 /*aSrcAddr*/, TUint32 /*aDstAddr*/, + TUint /*aTransferCount*/, TUint32 /*aPslRequestInfo*/) + { + // concrete controller must override if SDmacCaps::iHwDescriptors set + __DMA_CANT_HAPPEN(); + return KErrGeneral; + } + + +TInt TDmac::UpdateSrcHwDes(const SDmaDesHdr& /*aHdr*/, TUint32 /*aSrcAddr*/, + TUint /*aTransferCount*/, TUint32 /*aPslRequestInfo*/) + { + // concrete controller must override if SDmacCaps::iAsymHwDescriptors set + __DMA_CANT_HAPPEN(); + return KErrGeneral; + } + + +TInt TDmac::UpdateDstHwDes(const SDmaDesHdr& /*aHdr*/, TUint32 /*aDstAddr*/, + TUint /*aTransferCount*/, TUint32 /*aPslRequestInfo*/) + { + // concrete controller must override if SDmacCaps::iAsymHwDescriptors set + __DMA_CANT_HAPPEN(); + return KErrGeneral; + } + + +void TDmac::ChainHwDes(const SDmaDesHdr& /*aHdr*/, const SDmaDesHdr& /*aNextHdr*/) + { + // concrete controller must override if SDmacCaps::iHwDescriptors set + __DMA_CANT_HAPPEN(); + } + + +void TDmac::AppendHwDes(const TDmaChannel& /*aChannel*/, const SDmaDesHdr& /*aLastHdr*/, + const SDmaDesHdr& /*aNewHdr*/) + { + // concrete controller must override if SDmacCaps::iHwDescriptors set + __DMA_CANT_HAPPEN(); + } + + +void TDmac::AppendHwDes(const TDmaChannel& /*aChannel*/, + const SDmaDesHdr& /*aSrcLastHdr*/, const SDmaDesHdr& /*aSrcNewHdr*/, + const SDmaDesHdr& /*aDstLastHdr*/, const SDmaDesHdr& /*aDstNewHdr*/) + { + // concrete controller must override if SDmacCaps::iAsymHwDescriptors set + __DMA_CANT_HAPPEN(); + } + + +void TDmac::UnlinkHwDes(const TDmaChannel& /*aChannel*/, SDmaDesHdr& /*aHdr*/) + { + // concrete controller must override if SDmacCaps::iHwDescriptors set + __DMA_CANT_HAPPEN(); + } + + +void TDmac::ClearHwDes(const SDmaDesHdr& /*aHdr*/) + { + // default implementation - NOP; concrete controller may override + return; + } + + +TInt TDmac::LinkChannels(TDmaChannel& /*a1stChannel*/, TDmaChannel& /*a2ndChannel*/) + { + // default implementation - NOP; concrete controller may override + return KErrNotSupported; + } + + +TInt TDmac::UnlinkChannel(TDmaChannel& /*aChannel*/) + { + // default implementation - NOP; concrete controller may override + return KErrNotSupported; + } + + +TInt TDmac::FailNext(const TDmaChannel& /*aChannel*/) + { + // default implementation - NOP; concrete controller may override + return KErrNotSupported; + } + + +TInt TDmac::MissNextInterrupts(const TDmaChannel& /*aChannel*/, TInt /*aInterruptCount*/) + { + // default implementation - NOP; concrete controller may override + return KErrNotSupported; + } + + +TInt TDmac::Extension(TDmaChannel& /*aChannel*/, TInt /*aCmd*/, TAny* /*aArg*/) + { + // default implementation - NOP; concrete controller may override + return KErrNotSupported; + } + + +TUint32 TDmac::HwDesNumDstElementsTransferred(const SDmaDesHdr& /*aHdr*/) + { + // Concrete controller must override if SDmacCaps::iHwDescriptors set. + __DMA_CANT_HAPPEN(); + return 0; + } + + +TUint32 TDmac::HwDesNumSrcElementsTransferred(const SDmaDesHdr& /*aHdr*/) + { + // Concrete controller must override if SDmacCaps::iHwDescriptors set. + __DMA_CANT_HAPPEN(); + return 0; + } + + +#ifdef _DEBUG + +void TDmac::Invariant() + { + Wait(); + __DMA_ASSERTD(0 <= iAvailDesCount && iAvailDesCount <= iMaxDesCount); + __DMA_ASSERTD(! iFreeHdr || IsValidHdr(iFreeHdr)); + for (TInt i = 0; i < iMaxDesCount; i++) + __DMA_ASSERTD(iHdrPool[i].iNext == NULL || IsValidHdr(iHdrPool[i].iNext)); + Signal(); + } + + +TBool TDmac::IsValidHdr(const SDmaDesHdr* aHdr) + { + return (iHdrPool <= aHdr) && (aHdr < iHdrPool + iMaxDesCount); + } + +#endif + + + + +// +// Internal compat version, used by legacy Fragment() +// +TDmaTransferConfig::TDmaTransferConfig(TUint32 aAddr, TUint aFlags, TBool aAddrInc) + : iAddr(aAddr), + iAddrMode(aAddrInc ? KDmaAddrModePostIncrement : KDmaAddrModeConstant), + iElementSize(0), + iElementsPerFrame(0), + iElementsPerPacket(0), + iFramesPerTransfer(0), + iElementSkip(0), + iFrameSkip(0), + iBurstSize(KDmaBurstSizeAny), + iFlags(aFlags), + iSyncFlags(KDmaSyncAuto), + iPslTargetInfo(0), + iRepeatCount(0), + iDelta(~0u), + iReserved(0) + { + } + + + +// +// Internal compat version, used by legacy Fragment() +// +TDmaTransferArgs::TDmaTransferArgs(TUint32 aSrc, TUint32 aDest, TInt aCount, + TUint aFlags, TUint32 aPslInfo) + : iSrcConfig(aSrc, RequestFlags2SrcConfigFlags(aFlags), (aFlags & KDmaIncSrc)), + iDstConfig(aDest, RequestFlags2DstConfigFlags(aFlags), (aFlags & KDmaIncDest)), + iTransferCount(aCount), + iGraphicsOps(KDmaGraphicsOpNone), + iColour(0), + iFlags(0), + iChannelPriority(KDmaPriorityNone), + iPslRequestInfo(aPslInfo), + iDelta(~0u), + iReserved1(0), + iChannelCookie(0), + iReserved2(0) + { + } + + +// +// As DDmaRequest is derived from DBase, the initializations with zero aren't +// strictly necessary here, but this way it's nicer. +// +EXPORT_C DDmaRequest::DDmaRequest(TDmaChannel& aChannel, TCallback aCb, + TAny* aCbArg, TInt aMaxTransferSize) + : iChannel(aChannel), + iCb(aCb), + iCbArg(aCbArg), + iDmaCb(NULL), + iDmaCbArg(NULL), + iIsrCb(EFalse), + iDesCount(0), + iFirstHdr(NULL), + iLastHdr(NULL), + iSrcDesCount(0), + iSrcFirstHdr(NULL), + iSrcLastHdr(NULL), + iDstDesCount(0), + iDstFirstHdr(NULL), + iDstLastHdr(NULL), + iQueued(EFalse), + iMaxTransferSize(aMaxTransferSize), + iTotalNumSrcElementsTransferred(0), + iTotalNumDstElementsTransferred(0) + { + iChannel.iReqCount++; + __DMA_ASSERTD(0 <= aMaxTransferSize); + __DMA_INVARIANT(); + } + + +// +// As DDmaRequest is derived from DBase, the initializations with zero aren't +// strictly necessary here, but this way it's nicer. +// +EXPORT_C DDmaRequest::DDmaRequest(TDmaChannel& aChannel, TDmaCallback aDmaCb, + TAny* aCbArg, TUint aMaxTransferSize) + : iChannel(aChannel), + iCb(NULL), + iCbArg(NULL), + iDmaCb(aDmaCb), + iDmaCbArg(aCbArg), + iIsrCb(EFalse), + iDesCount(0), + iFirstHdr(NULL), + iLastHdr(NULL), + iSrcDesCount(0), + iSrcFirstHdr(NULL), + iSrcLastHdr(NULL), + iDstDesCount(0), + iDstFirstHdr(NULL), + iDstLastHdr(NULL), + iQueued(EFalse), + iMaxTransferSize(aMaxTransferSize), + iTotalNumSrcElementsTransferred(0), + iTotalNumDstElementsTransferred(0) + { + __e32_atomic_add_ord32(&iChannel.iReqCount, 1); + __DMA_INVARIANT(); + } + + +EXPORT_C DDmaRequest::~DDmaRequest() + { + __DMA_ASSERTD(!iQueued); + __DMA_INVARIANT(); + FreeDesList(); + __e32_atomic_add_ord32(&iChannel.iReqCount, TUint32(-1)); + } + + +EXPORT_C TInt DDmaRequest::Fragment(TUint32 aSrc, TUint32 aDest, TInt aCount, + TUint aFlags, TUint32 aPslInfo) + { + __KTRACE_OPT(KDMA, Kern::Printf("DDmaRequest::Fragment thread %O " + "src=0x%08X dest=0x%08X count=%d flags=0x%X psl=0x%08X", + &Kern::CurrentThread(), aSrc, aDest, aCount, aFlags, aPslInfo)); + __DMA_ASSERTD(aCount > 0); + + TDmaTransferArgs args(aSrc, aDest, aCount, aFlags, aPslInfo); + + return Frag(args); + } + + +EXPORT_C TInt DDmaRequest::Fragment(const TDmaTransferArgs& aTransferArgs) + { + __KTRACE_OPT(KDMA, Kern::Printf("DDmaRequest::Fragment thread %O", &Kern::CurrentThread())); + + // Writable temporary working copy of the transfer arguments. + // We need this because we may have to modify some fields before passing it + // to the PSL (for example iChannelCookie, iTransferCount, + // iDstConfig::iAddr, and iSrcConfig::iAddr). + TDmaTransferArgs args(aTransferArgs); + + return Frag(args); + } + + +TUint DDmaRequest::GetTransferCount(const TDmaTransferArgs& aTransferArgs) + { + const TDmaTransferConfig& src = aTransferArgs.iSrcConfig; + const TDmaTransferConfig& dst = aTransferArgs.iDstConfig; + + TUint count = aTransferArgs.iTransferCount; + if (count == 0) + { + __KTRACE_OPT(KDMA, Kern::Printf("iTransferCount == 0")); + count = src.iElementSize * src.iElementsPerFrame * + src.iFramesPerTransfer; + const TUint dst_cnt = dst.iElementSize * dst.iElementsPerFrame * + dst.iFramesPerTransfer; + if (count != dst_cnt) + { + __KTRACE_OPT(KPANIC, Kern::Printf("Error: (count != dst_cnt)")); + return 0; + } + } + else + { + __KTRACE_OPT(KDMA, Kern::Printf("iTransferCount == %d", count)); + // Client shouldn't specify contradictory or incomplete things + if (src.iElementSize != 0) + { + if ((count % src.iElementSize) != 0) + { + __KTRACE_OPT(KPANIC, + Kern::Printf("Error: ((count %% src.iElementSize) != 0)")); + return 0; + } + if (src.iElementsPerFrame != 0) + { + if ((src.iElementSize * src.iElementsPerFrame * src.iFramesPerTransfer) != count) + { + __KTRACE_OPT(KPANIC, + Kern::Printf("Error: ((src.iElementSize * " + "src.iElementsPerFrame * " + "src.iFramesPerTransfer) != count)")); + return 0; + } + } + } + else + { + if (src.iElementsPerFrame != 0) + { + __KTRACE_OPT(KPANIC, + Kern::Printf("Error: (src.iElementsPerFrame != 0)")); + return 0; + } + if (src.iFramesPerTransfer != 0) + { + __KTRACE_OPT(KPANIC, + Kern::Printf("Error: (src.iFramesPerTransfer != 0)")); + return 0; + } + if (src.iElementsPerPacket != 0) + { + __KTRACE_OPT(KPANIC, + Kern::Printf("Error: (src.iElementsPerPacket != 0)")); + return 0; + } + } + if (dst.iElementSize != 0) + { + if ((count % dst.iElementSize) != 0) + { + __KTRACE_OPT(KPANIC, + Kern::Printf("Error: ((count %% dst.iElementSize) != 0)")); + return 0; + } + if (dst.iElementsPerFrame != 0) + { + if ((dst.iElementSize * dst.iElementsPerFrame * dst.iFramesPerTransfer) != count) + { + __KTRACE_OPT(KPANIC, + Kern::Printf("Error: ((dst.iElementSize * " + "dst.iElementsPerFrame * " + "dst.iFramesPerTransfer) != count)")); + return 0; + } + } + } + else + { + if (dst.iElementsPerFrame != 0) + { + __KTRACE_OPT(KPANIC, + Kern::Printf("Error: (dst.iElementsPerFrame != 0)")); + return 0; + } + if (dst.iFramesPerTransfer != 0) + { + __KTRACE_OPT(KPANIC, + Kern::Printf("Error: (dst.iFramesPerTransfer != 0)")); + return 0; + } + if (dst.iElementsPerPacket != 0) + { + __KTRACE_OPT(KPANIC, + Kern::Printf("Error: (dst.iElementsPerPacket != 0)")); + return 0; + } + } + } + return count; + } + + +TInt DDmaRequest::Frag(TDmaTransferArgs& aTransferArgs) + { + __DMA_ASSERTD(!iQueued); + + // Transfer count checks + const TUint count = GetTransferCount(aTransferArgs); + if (count == 0) + { + return KErrArgument; + } + + const TDmaTransferConfig& src = aTransferArgs.iSrcConfig; + const TDmaTransferConfig& dst = aTransferArgs.iDstConfig; + + // Ask the PSL what the maximum length possible for this transfer is + TUint max_xfer_len = iChannel.MaxTransferLength(src.iFlags, dst.iFlags, + aTransferArgs.iPslRequestInfo); + if (iMaxTransferSize) + { + // User has set a size cap + __KTRACE_OPT(KDMA, Kern::Printf("iMaxTransferSize != 0")); + __DMA_ASSERTA((iMaxTransferSize <= max_xfer_len) || (max_xfer_len == 0)); + max_xfer_len = iMaxTransferSize; + } + else + { + // User doesn't care about max size + if (max_xfer_len == 0) + { + // No maximum imposed by controller + max_xfer_len = count; + } + } + + // ISR callback requested? + const TBool isr_cb = (aTransferArgs.iFlags & KDmaRequestCallbackFromIsr); + if (isr_cb) + { + // Requesting an ISR callback w/o supplying one? + if (!iDmaCb) + { + return KErrArgument; + } + } + + // Set the channel cookie for the PSL + aTransferArgs.iChannelCookie = iChannel.PslId(); + + // Now the actual fragmentation + TInt r; + if (iChannel.iDmacCaps->iAsymHwDescriptors) + { + r = FragAsym(aTransferArgs, count, max_xfer_len); + } + else + { + r = FragSym(aTransferArgs, count, max_xfer_len); + } + + if (r == KErrNone) + { + iIsrCb = isr_cb; + } + + __DMA_INVARIANT(); + return r; + }; + + +TInt DDmaRequest::FragSym(TDmaTransferArgs& aTransferArgs, TUint aCount, + TUint aMaxTransferLen) + { + TDmaTransferConfig& src = aTransferArgs.iSrcConfig; + TDmaTransferConfig& dst = aTransferArgs.iDstConfig; + + const TBool mem_src = (src.iFlags & KDmaMemAddr); + const TBool mem_dst = (dst.iFlags & KDmaMemAddr); + + const TUint align_mask_src = iChannel.AddressAlignMask(src.iFlags, + src.iElementSize, + aTransferArgs.iPslRequestInfo); + const TUint align_mask_dst = iChannel.AddressAlignMask(dst.iFlags, + dst.iElementSize, + aTransferArgs.iPslRequestInfo); + // Memory buffers must satisfy alignment constraint + __DMA_ASSERTD(!mem_src || ((src.iAddr & align_mask_src) == 0)); + __DMA_ASSERTD(!mem_dst || ((dst.iAddr & align_mask_dst) == 0)); + + const TUint max_aligned_len = (aMaxTransferLen & + ~(Max(align_mask_src, align_mask_dst))); + // Client and PSL sane? + __DMA_ASSERTD(max_aligned_len > 0); + + FreeDesList(); // revert any previous fragmentation attempt + TInt r; + do + { + // Allocate fragment + r = ExpandDesList(/*1*/); + if (r != KErrNone) + { + FreeDesList(); + break; + } + // Compute fragment size + TUint c = Min(aMaxTransferLen, aCount); + if (mem_src && !(src.iFlags & KDmaPhysAddr)) + { + __KTRACE_OPT(KDMA, Kern::Printf("mem_src && !(src.iFlags & KDmaPhysAddr)")); + // @@@ Should also take into account (src.iFlags & KDmaMemIsContiguous)! + c = MaxPhysSize(src.iAddr, c); + } + if (mem_dst && !(dst.iFlags & KDmaPhysAddr)) + { + __KTRACE_OPT(KDMA, Kern::Printf("mem_dst && !(dst.iFlags & KDmaPhysAddr)")); + // @@@ Should also take into account (dst.iFlags & KDmaMemIsContiguous)! + c = MaxPhysSize(dst.iAddr, c); + } + if ((mem_src || mem_dst) && (c < aCount) && (c > max_aligned_len)) + { + // This is not the last fragment of a transfer to/from memory. + // We must round down the fragment size so the next one is + // correctly aligned. + __KTRACE_OPT(KDMA, Kern::Printf("(mem_src || mem_dst) && (c < aCount) && (c > max_aligned_len)")); + c = max_aligned_len; + } + + // TODO: Make sure an element or frame on neither src or dst side + // (which can be of different sizes) never straddles a DMA subtransfer. + // (This would be a fragmentation error by the PIL.) + + // Set transfer count for the PSL + aTransferArgs.iTransferCount = c; + __KTRACE_OPT(KDMA, Kern::Printf("this fragm.: %d (0x%x) total remain.: %d (0x%x)", + c, c, aCount, aCount)); + // Initialise fragment + r = iChannel.iController->InitDes(*iLastHdr, aTransferArgs); + if (r != KErrNone) + { + FreeDesList(); + break; + } + // Update for next iteration + aCount -= c; + if (mem_src) + src.iAddr += c; + if (mem_dst) + dst.iAddr += c; + } + while (aCount > 0); + + return r; + } + + +TInt DDmaRequest::FragAsym(TDmaTransferArgs& aTransferArgs, TUint aCount, + TUint aMaxTransferLen) + { + TInt r = FragAsymSrc(aTransferArgs, aCount, aMaxTransferLen); + if (r != KErrNone) + { + FreeSrcDesList(); + return r; + } + r = FragAsymDst(aTransferArgs, aCount, aMaxTransferLen); + if (r != KErrNone) + { + FreeSrcDesList(); + FreeDstDesList(); + } + return r; + } + + +TInt DDmaRequest::FragAsymSrc(TDmaTransferArgs& aTransferArgs, TUint aCount, + TUint aMaxTransferLen) + { + TDmaTransferConfig& src = aTransferArgs.iSrcConfig; + + const TBool mem_src = (src.iFlags & KDmaMemAddr); + + const TUint align_mask = iChannel.AddressAlignMask(src.iFlags, + src.iElementSize, + aTransferArgs.iPslRequestInfo); + // Memory buffers must satisfy alignment constraint + __DMA_ASSERTD(!mem_src || ((src.iAddr & align_mask) == 0)); + + const TUint max_aligned_len = (aMaxTransferLen & ~align_mask); + __DMA_ASSERTD(max_aligned_len > 0); // bug in PSL if not true + + FreeSrcDesList(); + TInt r; + do + { + // Allocate fragment + r = ExpandSrcDesList(/*1*/); + if (r != KErrNone) + { + break; + } + // Compute fragment size + TUint c = Min(aMaxTransferLen, aCount); + if (mem_src && !(src.iFlags & KDmaPhysAddr)) + { + __KTRACE_OPT(KDMA, Kern::Printf("mem_src && !(src.iFlags & KDmaPhysAddr)")); + c = MaxPhysSize(src.iAddr, c); + } + if (mem_src && (c < aCount) && (c > max_aligned_len)) + { + // This is not the last fragment of a transfer from memory. + // We must round down the fragment size so the next one is + // correctly aligned. + __KTRACE_OPT(KDMA, Kern::Printf("mem_src && (c < aCount) && (c > max_aligned_len)")); + c = max_aligned_len; + } + // Set transfer count for the PSL + aTransferArgs.iTransferCount = c; + __KTRACE_OPT(KDMA, Kern::Printf("this fragm.: %d (0x%x) total remain.: %d (0x%x)", + c, c, aCount, aCount)); + // Initialise fragment + r = iChannel.iController->InitSrcHwDes(*iSrcLastHdr, aTransferArgs); + if (r != KErrNone) + { + break; + } + // Update for next iteration + aCount -= c; + if (mem_src) + src.iAddr += c; + } + while (aCount > 0); + + return r; + } + + +TInt DDmaRequest::FragAsymDst(TDmaTransferArgs& aTransferArgs, TUint aCount, + TUint aMaxTransferLen) + { + TDmaTransferConfig& dst = aTransferArgs.iDstConfig; + + const TBool mem_dst = (dst.iFlags & KDmaMemAddr); + + const TUint align_mask = iChannel.AddressAlignMask(dst.iFlags, + dst.iElementSize, + aTransferArgs.iPslRequestInfo); + // Memory buffers must satisfy alignment constraint + __DMA_ASSERTD(!mem_dst || ((dst.iAddr & align_mask) == 0)); + + const TUint max_aligned_len = (aMaxTransferLen & ~align_mask); + __DMA_ASSERTD(max_aligned_len > 0); // bug in PSL if not true + + FreeDstDesList(); + TInt r; + do + { + // Allocate fragment + r = ExpandDstDesList(/*1*/); + if (r != KErrNone) + { + break; + } + // Compute fragment size + TUint c = Min(aMaxTransferLen, aCount); + if (mem_dst && !(dst.iFlags & KDmaPhysAddr)) + { + __KTRACE_OPT(KDMA, Kern::Printf("mem_dst && !(dst.iFlags & KDmaPhysAddr)")); + c = MaxPhysSize(dst.iAddr, c); + } + if (mem_dst && (c < aCount) && (c > max_aligned_len)) + { + // This is not the last fragment of a transfer to memory. + // We must round down the fragment size so the next one is + // correctly aligned. + __KTRACE_OPT(KDMA, Kern::Printf("mem_dst && (c < aCount) && (c > max_aligned_len)")); + c = max_aligned_len; + } + // Set transfer count for the PSL + aTransferArgs.iTransferCount = c; + __KTRACE_OPT(KDMA, Kern::Printf("this fragm.: %d (0x%x) total remain.: %d (0x%x)", + c, c, aCount, aCount)); + // Initialise fragment + r = iChannel.iController->InitDstHwDes(*iDstLastHdr, aTransferArgs); + if (r != KErrNone) + { + break; + } + // Update for next iteration + aCount -= c; + if (mem_dst) + dst.iAddr += c; + } + while (aCount > 0); + + return r; + } + + +EXPORT_C TInt DDmaRequest::Queue() + { + __KTRACE_OPT(KDMA, Kern::Printf("DDmaRequest::Queue thread %O", &Kern::CurrentThread())); + __DMA_ASSERTD(iDesCount > 0); // Not configured? Call Fragment() first! + __DMA_ASSERTD(!iQueued); + + // Append request to queue and link new descriptor list to existing one. + iChannel.Wait(); + + TInt r = KErrGeneral; + const TBool ch_isr_cb = __e32_atomic_load_acq32(&iChannel.iIsrCbRequest); + if (ch_isr_cb) + { + // Client mustn't try to queue any new request while one with an ISR + // callback is already queued on this channel. This is to make sure + // that the channel's Transfer() function is not called by both the ISR + // and the client thread at the same time. + __KTRACE_OPT(KPANIC, Kern::Printf("An ISR cb request exists - not queueing")); + } + else if (iIsrCb && !iChannel.IsQueueEmpty()) + { + // Client mustn't try to queue an ISR callback request whilst any + // others are still queued on this channel. This is to make sure that + // the ISR callback doesn't get executed together with the DFC(s) of + // any previous request(s). + __KTRACE_OPT(KPANIC, Kern::Printf("Request queue not empty - not queueing")); + } + else if (iChannel.iIsrDfc & (TUint32)TDmaChannel::KCancelFlagMask) + { + __KTRACE_OPT(KPANIC, Kern::Printf("Channel requests cancelled - not queueing")); + } + else + { + iQueued = ETrue; + iChannel.iReqQ.Add(&iLink); + // iChannel.iNullPtr points to iChannel.iCurHdr for an empty queue + *iChannel.iNullPtr = iFirstHdr; + iChannel.iNullPtr = &(iLastHdr->iNext); + if (iIsrCb) + { + // Since we've made sure that there is no other request in the + // queue before this, the only thing of relevance is the channel + // DFC which might yet have to complete for the previous request, + // and this function might indeed have been called from there via + // the client callback. This should be all right though as once + // we've set the following flag no further Queue()'s will be + // possible. + __e32_atomic_store_rel32(&iChannel.iIsrCbRequest, ETrue); + } + iChannel.DoQueue(const_cast(*this)); + r = KErrNone; + } + iChannel.Signal(); + + __DMA_INVARIANT(); + return r; + } + + +EXPORT_C TInt DDmaRequest::ExpandDesList(TInt aCount) + { + return ExpandDesList(aCount, iDesCount, iFirstHdr, iLastHdr); + } + + +EXPORT_C TInt DDmaRequest::ExpandSrcDesList(TInt aCount) + { + return ExpandDesList(aCount, iSrcDesCount, iSrcFirstHdr, iSrcLastHdr); + } + + +EXPORT_C TInt DDmaRequest::ExpandDstDesList(TInt aCount) + { + return ExpandDesList(aCount, iDstDesCount, iDstFirstHdr, iDstLastHdr); + } + + +TInt DDmaRequest::ExpandDesList(TInt aCount, TInt& aDesCount, + SDmaDesHdr*& aFirstHdr, + SDmaDesHdr*& aLastHdr) + { + __DMA_ASSERTD(!iQueued); + __DMA_ASSERTD(aCount > 0); + + if (aCount > iChannel.iAvailDesCount) + { + return KErrTooBig; + } + + iChannel.iAvailDesCount -= aCount; + aDesCount += aCount; + + TDmac& c = *(iChannel.iController); + c.Wait(); + + if (aFirstHdr == NULL) + { + // Handle an empty list specially to simplify the following loop + aFirstHdr = aLastHdr = c.iFreeHdr; + c.iFreeHdr = c.iFreeHdr->iNext; + --aCount; + } + else + { + aLastHdr->iNext = c.iFreeHdr; + } + + // Remove as many descriptors and headers from the free pool as necessary + // and ensure hardware descriptors are chained together. + while (aCount-- > 0) + { + __DMA_ASSERTD(c.iFreeHdr != NULL); + if (c.iCapsHwDes) + { + c.ChainHwDes(*aLastHdr, *(c.iFreeHdr)); + } + aLastHdr = c.iFreeHdr; + c.iFreeHdr = c.iFreeHdr->iNext; + } + + c.Signal(); + + aLastHdr->iNext = NULL; + + __DMA_INVARIANT(); + return KErrNone; + } + + +EXPORT_C void DDmaRequest::FreeDesList() + { + FreeDesList(iDesCount, iFirstHdr, iLastHdr); + } + + +EXPORT_C void DDmaRequest::FreeSrcDesList() + { + FreeDesList(iSrcDesCount, iSrcFirstHdr, iSrcLastHdr); + } + + +EXPORT_C void DDmaRequest::FreeDstDesList() + { + FreeDesList(iDstDesCount, iDstFirstHdr, iDstLastHdr); + } + + +void DDmaRequest::FreeDesList(TInt& aDesCount, SDmaDesHdr*& aFirstHdr, SDmaDesHdr*& aLastHdr) + { + __DMA_ASSERTD(!iQueued); + + if (aDesCount > 0) + { + iChannel.iAvailDesCount += aDesCount; + TDmac& c = *(iChannel.iController); + const SDmaDesHdr* hdr = aFirstHdr; + while (hdr) + { + c.ClearHwDes(*hdr); + hdr = hdr->iNext; + }; + c.Wait(); + aLastHdr->iNext = c.iFreeHdr; + c.iFreeHdr = aFirstHdr; + c.Signal(); + aFirstHdr = aLastHdr = NULL; + aDesCount = 0; + } + } + + +EXPORT_C void DDmaRequest::EnableSrcElementCounting(TBool /*aResetElementCount*/) + { + // Not yet implemented. + return; + } + + +EXPORT_C void DDmaRequest::EnableDstElementCounting(TBool /*aResetElementCount*/) + { + // Not yet implemented. + return; + } + + +EXPORT_C void DDmaRequest::DisableSrcElementCounting() + { + // Not yet implemented. + return; + } + + +EXPORT_C void DDmaRequest::DisableDstElementCounting() + { + // Not yet implemented. + return; + } + + +EXPORT_C TUint32 DDmaRequest::TotalNumSrcElementsTransferred() + { + // Not yet implemented. + + // So far largely bogus code (just to touch some symbols)... + iTotalNumSrcElementsTransferred = 0; + TDmac& c = *(iChannel.iController); + if (c.iCapsHwDes) + { + for (const SDmaDesHdr* pH = iFirstHdr; pH != NULL; pH = pH->iNext) + { + iTotalNumSrcElementsTransferred += c.HwDesNumDstElementsTransferred(*pH); + } + } + else + { + // Do something different for pseudo descriptors... + } + return iTotalNumSrcElementsTransferred; + } + + +EXPORT_C TUint32 DDmaRequest::TotalNumDstElementsTransferred() + { + // Not yet implemented. + return iTotalNumDstElementsTransferred; + } + + +EXPORT_C TInt DDmaRequest::FragmentCount() + { + return FragmentCount(iFirstHdr); + } + + +EXPORT_C TInt DDmaRequest::SrcFragmentCount() + { + return FragmentCount(iSrcFirstHdr); + } + + +EXPORT_C TInt DDmaRequest::DstFragmentCount() + { + return FragmentCount(iDstFirstHdr); + } + + +TInt DDmaRequest::FragmentCount(const SDmaDesHdr* aHdr) + { + TInt count = 0; + for (const SDmaDesHdr* pH = aHdr; pH != NULL; pH = pH->iNext) + { + count++; + } + return count; + } + + +// +// Called when request is removed from request queue in channel +// +inline void DDmaRequest::OnDeque() + { + iQueued = EFalse; + iLastHdr->iNext = NULL; + iChannel.DoUnlink(*iLastHdr); + } + + +#ifdef _DEBUG +void DDmaRequest::Invariant() + { + iChannel.Wait(); + __DMA_ASSERTD(LOGICAL_XOR(iCb, iDmaCb)); + if (iChannel.iDmacCaps->iAsymHwDescriptors) + { + __DMA_ASSERTD((0 <= iSrcDesCount) && (iSrcDesCount <= iChannel.iMaxDesCount) && + (0 <= iDstDesCount) && (iDstDesCount <= iChannel.iMaxDesCount)); + if (iSrcDesCount == 0) + { + __DMA_ASSERTD(iDstDesCount == 0); + __DMA_ASSERTD(!iQueued); + __DMA_ASSERTD(!iSrcFirstHdr && !iSrcLastHdr && + !iDstFirstHdr && !iDstLastHdr); + } + else + { + __DMA_ASSERTD(iChannel.iController->IsValidHdr(iSrcFirstHdr)); + __DMA_ASSERTD(iChannel.iController->IsValidHdr(iSrcLastHdr)); + __DMA_ASSERTD(iChannel.iController->IsValidHdr(iDstFirstHdr)); + __DMA_ASSERTD(iChannel.iController->IsValidHdr(iDstLastHdr)); + } + } + else + { + __DMA_ASSERTD((0 <= iDesCount) && (iDesCount <= iChannel.iMaxDesCount)); + if (iDesCount == 0) + { + __DMA_ASSERTD(!iQueued); + __DMA_ASSERTD(!iFirstHdr && !iLastHdr); + } + else + { + __DMA_ASSERTD(iChannel.iController->IsValidHdr(iFirstHdr)); + __DMA_ASSERTD(iChannel.iController->IsValidHdr(iLastHdr)); + } + } + iChannel.Signal(); + } +#endif + + +////////////////////////////////////////////////////////////////////////////// +// TDmaChannel + +_LIT(KDmaChannelMutex, "DMA-Channel"); + +TDmaChannel::TDmaChannel() + : iController(NULL), + iDmacCaps(NULL), + iPslId(0), + iDynChannel(EFalse), + iPriority(KDmaPriorityNone), + iCurHdr(NULL), + iNullPtr(&iCurHdr), + iDfc(Dfc, NULL, 0), + iMaxDesCount(0), + iAvailDesCount(0), + iIsrDfc(0), + iReqQ(), + iReqCount(0), + iCancelInfo(NULL), + iRedoRequest(EFalse), + iIsrCbRequest(EFalse) + { + const TInt r = Kern::MutexCreate(iMutex, KDmaChannelMutex, KMutexOrdDmaChannel); + __DMA_ASSERTA(r == KErrNone); + +#ifndef __WINS__ + // On the emulator this code is called from within the codeseg mutex. + // The invariant tries to hold the dma channel mutex, but this is not allowed + __DMA_INVARIANT(); +#endif + } + + +TDmaChannel::~TDmaChannel() + { + Kern::SafeClose((DObject*&)iMutex, NULL); + } + + +// +// static member function +// +EXPORT_C TInt TDmaChannel::Open(const SCreateInfo& aInfo, TDmaChannel*& aChannel) + { + __KTRACE_OPT(KDMA, Kern::Printf("TDmaChannel::Open thread %O", &Kern::CurrentThread())); + + __DMA_ASSERTD(aInfo.iDesCount >= 1); + __DMA_ASSERTD(aInfo.iPriority <= KDmaPriority8); + __DMA_ASSERTD(aInfo.iDfcQ != NULL); + __DMA_ASSERTD(aInfo.iDfcPriority < KNumDfcPriorities); + + aChannel = NULL; + + DmaChannelMgr::Wait(); + TDmaChannel* pC = DmaChannelMgr::Open(aInfo.iCookie, aInfo.iDynChannel, aInfo.iPriority); + DmaChannelMgr::Signal(); + if (!pC) + { + return KErrInUse; + } + __DMA_ASSERTD(pC->iController != NULL); + __DMA_ASSERTD(pC->iDmacCaps != NULL); + __DMA_ASSERTD(pC->iController->iCapsHwDes == pC->DmacCaps().iHwDescriptors); + // PSL needs to set iDynChannel if and only if dynamic channel was requested + __DMA_ASSERTD(!LOGICAL_XOR(aInfo.iDynChannel, pC->iDynChannel)); + + const TInt r = pC->iController->ReserveSetOfDes(aInfo.iDesCount); + if (r != KErrNone) + { + pC->Close(); + return r; + } + pC->iAvailDesCount = pC->iMaxDesCount = aInfo.iDesCount; + + new (&pC->iDfc) TDfc(&Dfc, pC, aInfo.iDfcQ, aInfo.iDfcPriority); + + aChannel = pC; + +#ifdef _DEBUG + pC->Invariant(); +#endif + __KTRACE_OPT(KDMA, Kern::Printf("opened channel %d", pC->iPslId)); + return KErrNone; + } + + +EXPORT_C void TDmaChannel::Close() + { + __KTRACE_OPT(KDMA, Kern::Printf("TDmaChannel::Close %d iReqCount=%d", iPslId, iReqCount)); + __DMA_ASSERTD(IsQueueEmpty()); + __DMA_ASSERTD(iReqCount == 0); + + // Descriptor leak? -> bug in request code + __DMA_ASSERTD(iAvailDesCount == iMaxDesCount); + + __DMA_ASSERTD(!iRedoRequest); + __DMA_ASSERTD(!iIsrCbRequest); + + iController->ReleaseSetOfDes(iMaxDesCount); + iAvailDesCount = iMaxDesCount = 0; + + DmaChannelMgr::Wait(); + DmaChannelMgr::Close(this); + // The following assignment will be removed once IsOpened() has been + // removed. That's because 'this' shouldn't be touched any more once + // Close() has returned from the PSL. + iController = NULL; + DmaChannelMgr::Signal(); + } + + +EXPORT_C TInt TDmaChannel::LinkToChannel(TDmaChannel* aChannel) + { + __KTRACE_OPT(KDMA, Kern::Printf("TDmaChannel::LinkToChannel thread %O", + &Kern::CurrentThread())); + if (aChannel) + { + return iController->LinkChannels(*this, *aChannel); + } + else + { + return iController->UnlinkChannel(*this); + } + } + + +EXPORT_C TInt TDmaChannel::Pause() + { + __KTRACE_OPT(KDMA, Kern::Printf("TDmaChannel::Pause thread %O", + &Kern::CurrentThread())); + return iController->PauseTransfer(*this); + } + + +EXPORT_C TInt TDmaChannel::Resume() + { + __KTRACE_OPT(KDMA, Kern::Printf("TDmaChannel::Resume thread %O", + &Kern::CurrentThread())); + return iController->ResumeTransfer(*this); + } + + +EXPORT_C void TDmaChannel::CancelAll() + { + __KTRACE_OPT(KDMA, Kern::Printf("TDmaChannel::CancelAll thread %O channel - %d", + &Kern::CurrentThread(), iPslId)); + NThread* const nt = NKern::CurrentThread(); + TBool wait = EFalse; + TDmaCancelInfo cancelinfo; + TDmaCancelInfo* waiters = NULL; + + NKern::ThreadEnterCS(); + Wait(); + + NThreadBase* const dfc_nt = iDfc.Thread(); + // Shouldn't be NULL (i.e. an IDFC) + __DMA_ASSERTD(dfc_nt); + + __e32_atomic_store_ord32(&iIsrDfc, (TUint32)KCancelFlagMask); + // ISRs after this point will not post a DFC, however a DFC may already be + // queued or running or both. + if (!IsQueueEmpty()) + { + // There is a transfer in progress. It may complete before the DMAC + // has stopped, but the resulting ISR will not post a DFC. + // ISR should not happen after this function returns. + iController->StopTransfer(*this); + + ResetStateMachine(); + + // Clean-up the request queue. + SDblQueLink* pL; + while ((pL = iReqQ.GetFirst()) != NULL) + { + DDmaRequest* pR = _LOFF(pL, DDmaRequest, iLink); + pR->OnDeque(); + } + } + if (dfc_nt == nt) + { + // DFC runs in this thread, so just cancel it and we're finished + iDfc.Cancel(); + + // If other calls to CancelAll() are waiting for the DFC, release them here + waiters = iCancelInfo; + iCancelInfo = NULL; + + // Reset the ISR count + __e32_atomic_store_rel32(&iIsrDfc, 0); + } + else + { + // DFC runs in another thread. Make sure it's queued and then wait for it to run. + if (iCancelInfo) + { + // Insert cancelinfo into the list so that it precedes iCancelInfo + cancelinfo.InsertBefore(iCancelInfo); + } + else + { + iCancelInfo = &cancelinfo; + } + wait = ETrue; + iDfc.Enque(); + } + + Signal(); + + if (waiters) + { + waiters->Signal(); + } + else if (wait) + { + NKern::FSWait(&cancelinfo.iSem); + } + + NKern::ThreadLeaveCS(); + __DMA_INVARIANT(); + } + + +EXPORT_C TInt TDmaChannel::IsrRedoRequest(TUint32 aSrcAddr, TUint32 aDstAddr, + TUint aTransferCount, + TUint32 aPslRequestInfo, + TBool aIsrCb) + { + __KTRACE_OPT(KDMA, + Kern::Printf("TDmaChannel::IsrRedoRequest src=0x%08x, " + "dst=0x%08x, count=%d, pslInfo=0x%08x, isrCb=%d", + aSrcAddr, aDstAddr, aTransferCount, aPslRequestInfo, + aIsrCb)); + // Function needs to be called in ISR context. + __DMA_ASSERTD(NKern::CurrentContext() == NKern::EInterrupt); + + __DMA_ASSERTD(!iReqQ.IsEmpty()); + __DMA_ASSERTD(iIsrCbRequest); + +#ifdef _DEBUG + if ((aSrcAddr != KPhysAddrInvalid) && (aSrcAddr == aDstAddr)) + { + __KTRACE_OPT(KPANIC, + Kern::Printf("Error: Updating src & dst to same address: 0x%08x", + aSrcAddr)); + return KErrArgument; + } +#endif + + // We assume here that the just completed request is the first one in the + // queue, i.e. that even if there is more than one request in the queue, + // their respective last and first (hw) descriptors are *not* linked. + // (Although that's what apparently happens in TDmaSgChannel::DoQueue() / + // TDmac::AppendHwDes() @@@). + DDmaRequest* const pCurReq = _LOFF(iReqQ.First(), DDmaRequest, iLink); + TInt r; + + if (iDmacCaps->iAsymHwDescriptors) + { + // We don't allow multiple-descriptor chains to be updated here + __DMA_ASSERTD((pCurReq->iSrcDesCount == 1) && (pCurReq->iDstDesCount == 1)); + // Adjust parameters if necessary (asymmetrical s/g variety) + const SDmaDesHdr* const pSrcFirstHdr = pCurReq->iSrcFirstHdr; + if ((aSrcAddr != KPhysAddrInvalid) || aTransferCount || aPslRequestInfo) + { + r = iController->UpdateSrcHwDes(*pSrcFirstHdr, aSrcAddr, + aTransferCount, aPslRequestInfo); + if (r != KErrNone) + { + __KTRACE_OPT(KPANIC, Kern::Printf("Src descriptor updating failed in PSL")); + return r; + } + } + const SDmaDesHdr* const pDstFirstHdr = pCurReq->iDstFirstHdr; + if ((aDstAddr != KPhysAddrInvalid) || aTransferCount || aPslRequestInfo) + { + r = iController->UpdateDstHwDes(*pDstFirstHdr, aSrcAddr, + aTransferCount, aPslRequestInfo); + if (r != KErrNone) + { + __KTRACE_OPT(KPANIC, Kern::Printf("Dst descriptor updating failed in PSL")); + return r; + } + } + // Reschedule the request + iController->Transfer(*this, *pSrcFirstHdr, *pDstFirstHdr); + } + else + { + // We don't allow multiple-descriptor chains to be updated here + __DMA_ASSERTD(pCurReq->iDesCount == 1); + // Adjust parameters if necessary (symmetrical s/g and non-s/g variety) + const SDmaDesHdr* const pFirstHdr = pCurReq->iFirstHdr; + if ((aSrcAddr != KPhysAddrInvalid) || (aDstAddr != KPhysAddrInvalid) || + aTransferCount || aPslRequestInfo) + { + r = iController->UpdateDes(*pFirstHdr, aSrcAddr, aDstAddr, + aTransferCount, aPslRequestInfo); + if (r != KErrNone) + { + __KTRACE_OPT(KPANIC, Kern::Printf("Descriptor updating failed")); + return r; + } + } + // Reschedule the request + iController->Transfer(*this, *pFirstHdr); + } + + if (!aIsrCb) + { + // Not another ISR callback please + pCurReq->iIsrCb = aIsrCb; + } + iRedoRequest = ETrue; + + return KErrNone; + } + + +EXPORT_C TInt TDmaChannel::FailNext(TInt /*aFragmentCount*/) + { + return iController->FailNext(*this); + } + + +EXPORT_C TInt TDmaChannel::MissNextInterrupts(TInt aInterruptCount) + { + return iController->MissNextInterrupts(*this, aInterruptCount); + } + + +EXPORT_C TInt TDmaChannel::Extension(TInt aCmd, TAny* aArg) + { + return iController->Extension(*this, aCmd, aArg); + } + + +// +// static member function +// +EXPORT_C TInt TDmaChannel::StaticExtension(TInt aCmd, TAny* aArg) + { + return DmaChannelMgr::StaticExtension(aCmd, aArg); + } + + +EXPORT_C TUint TDmaChannel::MaxTransferLength(TUint aSrcFlags, TUint aDstFlags, + TUint32 aPslInfo) + { + return iController->MaxTransferLength(*this, aSrcFlags, aDstFlags, aPslInfo); + } + + +EXPORT_C TUint TDmaChannel::AddressAlignMask(TUint aTargetFlags, TUint aElementSize, + TUint32 aPslInfo) + { + return iController->AddressAlignMask(*this, aTargetFlags, aElementSize, aPslInfo); + } + + +EXPORT_C const SDmacCaps& TDmaChannel::DmacCaps() + { + return *iDmacCaps; + } + + +// +// DFC callback function (static member). +// +void TDmaChannel::Dfc(TAny* aArg) + { + static_cast(aArg)->DoDfc(); + } + + +// +// This is quite a long function, but what can you do... +// +void TDmaChannel::DoDfc() + { + __KTRACE_OPT(KDMA, Kern::Printf("TDmaChannel::DoDfc thread %O channel - %d", + &Kern::CurrentThread(), iPslId)); + Wait(); + + // Atomically fetch and reset the number of DFCs queued by the ISR and the + // error flag. Leave the cancel flag alone for now. + const TUint32 w = __e32_atomic_and_ord32(&iIsrDfc, (TUint32)KCancelFlagMask); + TUint32 count = w & KDfcCountMask; + const TBool error = w & (TUint32)KErrorFlagMask; + TBool stop = w & (TUint32)KCancelFlagMask; + __DMA_ASSERTD((count > 0) || stop); + + __DMA_ASSERTD(!iRedoRequest); // We shouldn't be here if this is true + + while (count && !stop) + { + --count; + + __DMA_ASSERTD(!iReqQ.IsEmpty()); + + // If an error occurred it must have been reported on the last + // interrupt since transfers are suspended after an error. + DDmaRequest::TResult const res = (count == 0 && error) ? + DDmaRequest::EError : DDmaRequest::EOk; + DDmaRequest* pCompletedReq = NULL; + DDmaRequest* const pCurReq = _LOFF(iReqQ.First(), DDmaRequest, iLink); + + if (res == DDmaRequest::EOk) + { + // Update state machine, current fragment, completed fragment and + // tell the DMAC to transfer the next fragment if necessary. + SDmaDesHdr* pCompletedHdr = NULL; + DoDfc(const_cast(*pCurReq), pCompletedHdr); + + // If just completed last fragment from current request, switch to + // next request (if any). + if (pCompletedHdr == pCurReq->iLastHdr) + { + pCompletedReq = pCurReq; + pCurReq->iLink.Deque(); + if (iReqQ.IsEmpty()) + iNullPtr = &iCurHdr; + pCompletedReq->OnDeque(); + } + } + else + { + pCompletedReq = pCurReq; + } + + if (pCompletedReq && !pCompletedReq->iIsrCb) + { + // Don't execute ISR callbacks here (they have already been called) + DDmaRequest::TCallback const cb = pCompletedReq->iCb; + if (cb) + { + // Old style callback + TAny* const arg = pCompletedReq->iCbArg; + Signal(); + __KTRACE_OPT(KDMA, Kern::Printf("Client CB res=%d", res)); + (*cb)(res, arg); + Wait(); + } + else + { + // New style callback + TDmaCallback const ncb = pCompletedReq->iDmaCb; + if (ncb) + { + TAny* const arg = pCompletedReq->iDmaCbArg; + TDmaResult const result = (res == DDmaRequest::EOk) ? + EDmaResultOK : EDmaResultError; + Signal(); + __KTRACE_OPT(KDMA, Kern::Printf("Client CB result=%d", result)); + (*ncb)(EDmaCallbackRequestCompletion, result, arg, NULL); + Wait(); + } + } + } + else + { + // Allow another thread in, in case they are trying to cancel + Flash(); + } + stop = __e32_atomic_load_acq32(&iIsrDfc) & (TUint32)KCancelFlagMask; + } + + // Some interrupts may be missed (double-buffer and scatter-gather + // controllers only) if two or more transfers complete while interrupts are + // disabled in the CPU. If this happens, the framework will go out of sync + // and leave some orphaned requests in the queue. + // + // To ensure correctness we handle this case here by checking that the request + // queue is empty when all transfers have completed and, if not, cleaning up + // and notifying the client of the completion of the orphaned requests. + // + // Note that if some interrupts are missed and the controller raises an + // error while transferring a subsequent fragment, the error will be reported + // on a fragment which was successfully completed. There is no easy solution + // to this problem, but this is okay as the only possible action following a + // failure is to flush the whole queue. + if (stop) + { + // If another thread set the cancel flag, it should have + // cleaned up the request queue + __DMA_ASSERTD(IsQueueEmpty()); + + TDmaCancelInfo* const waiters = iCancelInfo; + iCancelInfo = NULL; + + // make sure DFC doesn't run again until a new request completes + iDfc.Cancel(); + + // reset the ISR count - new requests can now be processed + __e32_atomic_store_rel32(&iIsrDfc, 0); + + Signal(); + + // release threads doing CancelAll() + waiters->Signal(); + } + else if (!error && !iReqQ.IsEmpty() && iController->IsIdle(*this)) + { +#ifdef __SMP__ + // On an SMP system we must call stop transfer, it will block until + // any ISRs have completed so that the system does not spuriously + // attempt to recover from a missed interrupt. + // + // On an SMP system it is possible for the code here to execute + // concurrently with the DMA ISR. It is therefore possible that at this + // point the previous transfer has already completed (so that IsIdle + // reports true), but that the ISR has not yet queued a DFC. Therefore + // we must wait for the ISR to complete. + // + // StopTransfer should have no other side effect, given that the + // channel is already idle. + iController->StopTransfer(*this); // should block till ISR completion +#endif + + const TBool cleanup = !iDfc.Queued(); + if(cleanup) + { + __KTRACE_OPT(KDMA, Kern::Printf("Missed interrupt(s) - draining request queue")); + ResetStateMachine(); + + // Move orphaned requests to temporary queue so channel queue can + // accept new requests. + SDblQue q; + q.MoveFrom(&iReqQ); + + SDblQueLink* pL; + while ((pL = q.GetFirst()) != NULL) + { + DDmaRequest* const pR = _LOFF(pL, DDmaRequest, iLink); + __KTRACE_OPT(KDMA, Kern::Printf("Removing request from queue and notifying client")); + pR->OnDeque(); + // Old style callback + DDmaRequest::TCallback const cb = pR->iCb; + if (cb) + { + TAny* const arg = pR->iCbArg; + Signal(); + (*cb)(DDmaRequest::EOk, arg); + Wait(); + } + else + { + // New style callback + TDmaCallback const ncb = pR->iDmaCb; + if (ncb) + { + TAny* const arg = pR->iDmaCbArg; + Signal(); + (*ncb)(EDmaCallbackRequestCompletion, EDmaResultOK, arg, NULL); + Wait(); + } + } + } + } + Signal(); + } + else + Signal(); + + __DMA_INVARIANT(); + } + + +// +// Reset state machine only, request queue is unchanged */ +// +void TDmaChannel::ResetStateMachine() + { + DoCancelAll(); + iCurHdr = NULL; + iNullPtr = &iCurHdr; + } + + +void TDmaChannel::DoQueue(const DDmaRequest& /*aReq*/) + { + // Must be overridden + __DMA_CANT_HAPPEN(); + } + + +// +// Unlink the last item of a LLI chain from the next chain. +// Default implementation does nothing. This is overridden by scatter-gather +// channels. +// +void TDmaChannel::DoUnlink(SDmaDesHdr& /*aHdr*/) + { + } + + +void TDmaChannel::DoDfc(const DDmaRequest& /*aCurReq*/, SDmaDesHdr*& /*aCompletedHdr*/) + { + // To make sure this version of the function isn't called for channels for + // which it isn't appropriate (and which therefore don't override it) we + // put this check in here. + __DMA_CANT_HAPPEN(); + } + + +void TDmaChannel::DoDfc(const DDmaRequest& /*aCurReq*/, SDmaDesHdr*& /*aSrcCompletedHdr*/, + SDmaDesHdr*& /*aDstCompletedHdr*/) + { + // To make sure this version of the function isn't called for channels for + // which it isn't appropriate (and which therefore don't override it) we + // put this check in here. + __DMA_CANT_HAPPEN(); + } + + +#ifdef _DEBUG +void TDmaChannel::Invariant() + { + Wait(); + + __DMA_ASSERTD(iReqCount >= 0); + + __DMA_ASSERTD(iCurHdr == NULL || iController->IsValidHdr(iCurHdr)); + + // should always point to NULL pointer ending fragment queue + __DMA_ASSERTD(*iNullPtr == NULL); + + __DMA_ASSERTD((0 <= iAvailDesCount) && (iAvailDesCount <= iMaxDesCount)); + + __DMA_ASSERTD(LOGICAL_XOR(iCurHdr, IsQueueEmpty())); + if (iCurHdr == NULL) + { + __DMA_ASSERTD(iNullPtr == &iCurHdr); + } + + Signal(); + } +#endif + + +////////////////////////////////////////////////////////////////////////////// +// TDmaSbChannel + +void TDmaSbChannel::DoQueue(const DDmaRequest& /*aReq*/) + { + if (iState != ETransferring) + { + iController->Transfer(*this, *iCurHdr); + iState = ETransferring; + } + } + + +void TDmaSbChannel::DoCancelAll() + { + __DMA_ASSERTD(iState == ETransferring); + iState = EIdle; + } + + +void TDmaSbChannel::DoDfc(const DDmaRequest& /*aCurReq*/, SDmaDesHdr*& aCompletedHdr) + { + __DMA_ASSERTD(iState == ETransferring); + aCompletedHdr = iCurHdr; + iCurHdr = iCurHdr->iNext; + if (iCurHdr != NULL) + { + iController->Transfer(*this, *iCurHdr); + } + else + { + iState = EIdle; + } + } + + +////////////////////////////////////////////////////////////////////////////// +// TDmaDbChannel + +void TDmaDbChannel::DoQueue(const DDmaRequest& aReq) + { + switch (iState) + { + case EIdle: + iController->Transfer(*this, *iCurHdr); + if (iCurHdr->iNext) + { + iController->Transfer(*this, *(iCurHdr->iNext)); + iState = ETransferring; + } + else + iState = ETransferringLast; + break; + case ETransferring: + // nothing to do + break; + case ETransferringLast: + iController->Transfer(*this, *(aReq.iFirstHdr)); + iState = ETransferring; + break; + default: + __DMA_CANT_HAPPEN(); + } + } + + +void TDmaDbChannel::DoCancelAll() + { + iState = EIdle; + } + + +void TDmaDbChannel::DoDfc(const DDmaRequest& /*aCurReq*/, SDmaDesHdr*& aCompletedHdr) + { + aCompletedHdr = iCurHdr; + iCurHdr = iCurHdr->iNext; + switch (iState) + { + case ETransferringLast: + iState = EIdle; + break; + case ETransferring: + if (iCurHdr->iNext == NULL) + iState = ETransferringLast; + else + iController->Transfer(*this, *(iCurHdr->iNext)); + break; + default: + __DMA_CANT_HAPPEN(); + } + } + + +////////////////////////////////////////////////////////////////////////////// +// TDmaSgChannel + +void TDmaSgChannel::DoQueue(const DDmaRequest& aReq) + { + if (iState == ETransferring) + { + __DMA_ASSERTD(!aReq.iLink.Alone()); + DDmaRequest* pReqPrev = _LOFF(aReq.iLink.iPrev, DDmaRequest, iLink); + iController->AppendHwDes(*this, *(pReqPrev->iLastHdr), *(aReq.iFirstHdr)); + } + else + { + iController->Transfer(*this, *(aReq.iFirstHdr)); + iState = ETransferring; + } + } + + +void TDmaSgChannel::DoCancelAll() + { + __DMA_ASSERTD(iState == ETransferring); + iState = EIdle; + } + + +void TDmaSgChannel::DoUnlink(SDmaDesHdr& aHdr) + { + iController->UnlinkHwDes(*this, aHdr); + } + + +void TDmaSgChannel::DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr) + { + __DMA_ASSERTD(iState == ETransferring); + aCompletedHdr = aCurReq.iLastHdr; + iCurHdr = aCompletedHdr->iNext; + iState = (iCurHdr != NULL) ? ETransferring : EIdle; + } + + +////////////////////////////////////////////////////////////////////////////// +// TDmaAsymSgChannel + +void TDmaAsymSgChannel::DoQueue(const DDmaRequest& aReq) + { + if (iState == ETransferring) + { + __DMA_ASSERTD(!aReq.iLink.Alone()); + DDmaRequest* pReqPrev = _LOFF(aReq.iLink.iPrev, DDmaRequest, iLink); + iController->AppendHwDes(*this, + *(pReqPrev->iSrcLastHdr), *(aReq.iSrcFirstHdr), + *(pReqPrev->iDstLastHdr), *(aReq.iDstFirstHdr)); + } + else + { + iController->Transfer(*this, *(aReq.iSrcFirstHdr), *(aReq.iDstFirstHdr)); + iState = ETransferring; + } + } + + +void TDmaAsymSgChannel::DoCancelAll() + { + __DMA_ASSERTD(iState == ETransferring); + iState = EIdle; + } + + +void TDmaAsymSgChannel::DoUnlink(SDmaDesHdr& aHdr) + { + iController->UnlinkHwDes(*this, aHdr); + } + + +void TDmaAsymSgChannel::DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aSrcCompletedHdr, + SDmaDesHdr*& aDstCompletedHdr) + { + __DMA_ASSERTD(iState == ETransferring); + aSrcCompletedHdr = aCurReq.iSrcLastHdr; + iSrcCurHdr = aSrcCompletedHdr->iNext; + aDstCompletedHdr = aCurReq.iDstLastHdr; + iDstCurHdr = aDstCompletedHdr->iNext; + // Must be either both NULL or none of them. + __DMA_ASSERTD(!LOGICAL_XOR(iSrcCurHdr, iDstCurHdr)); + iState = (iSrcCurHdr != NULL) ? ETransferring : EIdle; + } + diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/drivers/dma/dma2_shared.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/drivers/dma/dma2_shared.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,210 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// e32/drivers/dma2_shared.cpp +// DMA Platform Independent Layer (PIL) +// +// + +#include + + +// +// Exported default constructor. +// +#ifdef DMA_APIV2 +KEXPORT_C +#endif +TDmaTransferConfig::TDmaTransferConfig() + : iAddr(0), + iAddrMode(KDmaAddrModeConstant), + iElementSize(0), + iElementsPerFrame(0), + iElementsPerPacket(0), + iFramesPerTransfer(0), + iElementSkip(0), + iFrameSkip(0), + iBurstSize(KDmaBurstSizeAny), + iFlags(0), + iSyncFlags(KDmaSyncAuto), + iPslTargetInfo(0), + iRepeatCount(0), + iDelta(~0u), + iReserved(0) + { + } + + +// +// General use version. +// +#ifdef DMA_APIV2 +KEXPORT_C +#endif +TDmaTransferConfig::TDmaTransferConfig( + TUint32 aAddr, + TUint aTransferFlags, + TDmaAddrMode aAddrMode, + TUint aSyncFlags, + TDmaBurstSize aBurstSize, + TUint aElementSize, + TUint aElementsPerPacket, + TUint aPslTargetInfo, + TInt aRepeatCount + ) + : + iAddr(aAddr), + iAddrMode(aAddrMode), + iElementSize(aElementSize), + iElementsPerFrame(0), + iElementsPerPacket(aElementsPerPacket), + iFramesPerTransfer(0), + iElementSkip(0), + iFrameSkip(0), + iBurstSize(aBurstSize), + iFlags(aTransferFlags), + iSyncFlags(aSyncFlags), + iPslTargetInfo(aPslTargetInfo), + iRepeatCount(aRepeatCount), + iDelta(~0u), + iReserved(0) + { + } + + +// +// 1D/2D version. +// +#ifdef DMA_APIV2 +KEXPORT_C +#endif +TDmaTransferConfig::TDmaTransferConfig( + TUint32 aAddr, + TUint aElementSize, + TUint aElementsPerFrame, + TUint aFramesPerTransfer, + TInt aElementSkip, + TInt aFrameSkip, + TUint aTransferFlags, + TUint aSyncFlags, + TDmaBurstSize aBurstSize, + TUint aElementsPerPacket, + TUint aPslTargetInfo, + TInt aRepeatCount + ) + : + iAddr(aAddr), + iAddrMode( // deduce transfer mode from skips + (aFrameSkip != 0) ? KDmaAddrMode2DIndex : + (aElementSkip != 0)? KDmaAddrMode1DIndex : + KDmaAddrModePostIncrement), + iElementSize(aElementSize), + iElementsPerFrame(aElementsPerFrame), + iElementsPerPacket(aElementsPerPacket), + iFramesPerTransfer(aFramesPerTransfer), + iElementSkip(aElementSkip), + iFrameSkip(aFrameSkip), + iBurstSize(aBurstSize), + iFlags(aTransferFlags), + iSyncFlags(aSyncFlags), + iPslTargetInfo(aPslTargetInfo), + iRepeatCount(aRepeatCount), + iDelta(~0u), + iReserved(0) + { + } + + +// +// Exported default constructor. +// +#ifdef DMA_APIV2 +KEXPORT_C +#endif +TDmaTransferArgs::TDmaTransferArgs() + : iTransferCount(0), + iGraphicsOps(KDmaGraphicsOpNone), + iFlags(0), + iChannelPriority(KDmaPriorityNone), + iPslRequestInfo(0), + iDelta(~0u), + iReserved1(0), + iChannelCookie(0), + iReserved2(0) + { + } + + +// +// . +// +#ifdef DMA_APIV2 +KEXPORT_C +#endif +TDmaTransferArgs::TDmaTransferArgs ( + TUint aSrcAddr, + TUint aDstAddr, + TUint aCount, + TUint aDmaTransferFlags, + TUint aDmaSyncFlags, + TUint aDmaPILFlags, + TDmaAddrMode aMode, + TUint aElementSize, + TUint aChannelPriority, + TDmaBurstSize aBurstSize, + TUint aPslRequestInfo, + TDmaGraphicsOps aGraphicOp, + TUint32 aColour + ) + : + iSrcConfig(aSrcAddr, aDmaTransferFlags, aMode, aDmaSyncFlags, aBurstSize, aElementSize), + iDstConfig(aDstAddr, aDmaTransferFlags, aMode, aDmaSyncFlags, aBurstSize, aElementSize), + iTransferCount(aCount), + iGraphicsOps(aGraphicOp), + iColour(aColour), + iFlags(aDmaPILFlags), + iChannelPriority(aChannelPriority), + iPslRequestInfo(aPslRequestInfo) + { + } + + +// +// . +// +#ifdef DMA_APIV2 +KEXPORT_C +#endif +TDmaTransferArgs::TDmaTransferArgs( + const TDmaTransferConfig& aSrc, + const TDmaTransferConfig& aDst, + TUint32 aFlags, + TUint aChannelPriority, + TUint aPslRequestInfo, + TDmaGraphicsOps aGraphicOp, + TUint32 aColour + ) + : iSrcConfig(aSrc), + iDstConfig(aDst), + iTransferCount(0), + iGraphicsOps(aGraphicOp), + iColour(aColour), + iFlags(aFlags), + iChannelPriority(aChannelPriority), + iPslRequestInfo(aPslRequestInfo), + iDelta(~0u), + iReserved1(0), + iChannelCookie(0), + iReserved2(0) + { + } diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/drivers/dma/dmapil.cpp --- a/kernel/eka/drivers/dma/dmapil.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/drivers/dma/dmapil.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -475,6 +475,15 @@ // append request to queue and link new descriptor list to existing one. iChannel.Wait(); + + TUint32 req_count = iChannel.iQueuedRequests++; + if (req_count == 0) + { + iChannel.Signal(); + iChannel.QueuedRequestCountChanged(); + iChannel.Wait(); + } + if (!(iChannel.iIsrDfc & (TUint32)TDmaChannel::KCancelFlagMask)) { iQueued = ETrue; @@ -482,8 +491,18 @@ *iChannel.iNullPtr = iFirstHdr; iChannel.iNullPtr = &(iLastHdr->iNext); iChannel.DoQueue(*this); + iChannel.Signal(); } - iChannel.Signal(); + else + { + // Someone is cancelling all requests... + req_count = --iChannel.iQueuedRequests; + iChannel.Signal(); + if (req_count == 0) + { + iChannel.QueuedRequestCountChanged(); + } + } __DMA_INVARIANT(); } @@ -586,14 +605,19 @@ TDmaChannel::TDmaChannel() - : iNullPtr(&iCurHdr), - iDfc(Dfc, NULL, 0) + : iController(NULL), + iPslId(0), + iCurHdr(NULL), + iNullPtr(&iCurHdr), + iDfc(Dfc, NULL, 0), + iMaxDesCount(0), + iAvailDesCount(0), + iIsrDfc(0), + iReqQ(), + iReqCount(0), + iQueuedRequests(0), + iCancelInfo(NULL) { - // iController = NULL; - // iPslId = 0; - // iCurHdr = NULL; - // iMaxDesCount = iAvailDesCount = 0; - // iReqCount = 0; __DMA_INVARIANT(); } @@ -640,6 +664,8 @@ __DMA_ASSERTD(IsQueueEmpty()); __DMA_ASSERTD(iReqCount == 0); + __DMA_ASSERTD(iQueuedRequests == 0); + // descriptor leak? bug in request code __DMA_ASSERTD(iAvailDesCount == iMaxDesCount); @@ -665,8 +691,10 @@ TBool wait = FALSE; TDmaCancelInfo c; TDmaCancelInfo* waiters = 0; + NKern::ThreadEnterCS(); Wait(); + const TUint32 req_count_before = iQueuedRequests; NThreadBase* dfcnt = iDfc.Thread(); __e32_atomic_store_ord32(&iIsrDfc, (TUint32)KCancelFlagMask); // ISRs after this point will not post a DFC, however a DFC may already be queued or running or both @@ -683,6 +711,7 @@ SDblQueLink* pL; while ((pL = iReqQ.GetFirst()) != NULL) { + iQueuedRequests--; DDmaRequest* pR = _LOFF(pL, DDmaRequest, iLink); pR->OnDeque(); } @@ -709,12 +738,21 @@ wait = TRUE; iDfc.Enque(); } + const TUint32 req_count_after = iQueuedRequests; Signal(); if (waiters) waiters->Signal(); if (wait) NKern::FSWait(&c.iSem); NKern::ThreadLeaveCS(); + + // Only call PSL if there were requests queued when we entered AND there + // are now no requests left on the queue. + if ((req_count_before != 0) && (req_count_after == 0)) + { + QueuedRequestCountChanged(); + } + __DMA_INVARIANT(); } @@ -740,6 +778,8 @@ const TBool error = w & (TUint32)KErrorFlagMask; TBool stop = w & (TUint32)KCancelFlagMask; __DMA_ASSERTD(count>0 || stop); + const TUint32 req_count_before = iQueuedRequests; + TUint32 req_count_after = 0; while(count && !stop) { @@ -767,6 +807,7 @@ { pCompletedReq = pCurReq; pCurReq->iLink.Deque(); + iQueuedRequests--; if (iReqQ.IsEmpty()) iNullPtr = &iCurHdr; pCompletedReq->OnDeque(); @@ -814,6 +855,7 @@ // reset the ISR count - new requests can now be processed __e32_atomic_store_rel32(&iIsrDfc, 0); + req_count_after = iQueuedRequests; Signal(); // release threads doing CancelAll() @@ -832,6 +874,7 @@ SDblQueLink* pL; while ((pL = q.GetFirst()) != NULL) { + iQueuedRequests--; DDmaRequest* pR = _LOFF(pL, DDmaRequest, iLink); __KTRACE_OPT(KDMA, Kern::Printf("Removing request from queue and notifying client")); pR->OnDeque(); @@ -844,10 +887,22 @@ Wait(); } } + req_count_after = iQueuedRequests; Signal(); } else + { + req_count_after = iQueuedRequests; Signal(); + } + + // Only call PSL if there were requests queued when we entered AND there + // are now no requests left on the queue (after also having executed all + // client callbacks). + if ((req_count_before != 0) && (req_count_after == 0)) + { + QueuedRequestCountChanged(); + } __DMA_INVARIANT(); } @@ -870,6 +925,21 @@ { } + +/** PSL may override */ +void TDmaChannel::QueuedRequestCountChanged() + { +#ifdef _DEBUG + Wait(); + __KTRACE_OPT(KDMA, + Kern::Printf("TDmaChannel::QueuedRequestCountChanged() %d", + iQueuedRequests)); + __DMA_ASSERTA(iQueuedRequests >= 0); + Signal(); +#endif + } + + #ifdef _DEBUG void TDmaChannel::Invariant() diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/drivers/hcr/hcr_debug.h --- a/kernel/eka/drivers/hcr/hcr_debug.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/drivers/hcr/hcr_debug.h Mon Jan 18 21:31:10 2010 +0200 @@ -12,6 +12,7 @@ // // Description: // Hardware Configuration Repository Platform Independent Layer (PIL) +// Contains debugging macros used in PIL and PSL source code of HCR. // #ifndef HCR_DEBUG_H diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/drivers/hcr/hcr_hai.h --- a/kernel/eka/drivers/hcr/hcr_hai.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/drivers/hcr/hcr_hai.h Mon Jan 18 21:31:10 2010 +0200 @@ -12,6 +12,8 @@ // // Description: // Hardware Configuration Respoitory Platform Independent Layer (PIL) +// Contains the hardware abstraction interface implemented in the variant PSL +// HCR kernel extension project. // /** diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/drivers/hcr/hcr_pil.h --- a/kernel/eka/drivers/hcr/hcr_pil.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/drivers/hcr/hcr_pil.h Mon Jan 18 21:31:10 2010 +0200 @@ -12,11 +12,15 @@ // // Description: // Hardware Configuration Respoitory Platform Independent Layer (PIL) +// Contains internal definitions for the PIL software of the HCR component +// which includes the singleton class that contains the algorithms and the +// TRepository hierachy that encapsulated the repository data in all its forms +// hiding the specifics from the algoritms in the singleton HCRInternal object. // /** @file hcr_pil.h -Kernel side definitions for the HCR Platform Indepent Layer. +Kernel side definitions for the HCR Platform Independent Layer. @internalTechnology */ diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/drivers/hcr/hcr_uids.h --- a/kernel/eka/drivers/hcr/hcr_uids.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/drivers/hcr/hcr_uids.h Mon Jan 18 21:31:10 2010 +0200 @@ -12,6 +12,8 @@ // // Description: // Hardware Configuration Respoitory Platform Independent Layer (PIL) +// Contains the registry of UIDs allocated to the HCR component from +// Symbian Foundation and what they are used for. // /** diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/eabi/dma2u.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/eabi/dma2u.def Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,69 @@ +EXPORTS + _Z11DmaTestInfov @ 1 NONAME + _Z13DmaTestInfoV2v @ 2 NONAME + _ZN11DDmaRequest11FreeDesListEv @ 3 NONAME + _ZN11DDmaRequest13ExpandDesListEi @ 4 NONAME + _ZN11DDmaRequest13FragmentCountEv @ 5 NONAME + _ZN11DDmaRequest14FreeDstDesListEv @ 6 NONAME + _ZN11DDmaRequest14FreeSrcDesListEv @ 7 NONAME + _ZN11DDmaRequest16DstFragmentCountEv @ 8 NONAME + _ZN11DDmaRequest16ExpandDstDesListEi @ 9 NONAME + _ZN11DDmaRequest16ExpandSrcDesListEi @ 10 NONAME + _ZN11DDmaRequest16SrcFragmentCountEv @ 11 NONAME + _ZN11DDmaRequest24EnableDstElementCountingEi @ 12 NONAME + _ZN11DDmaRequest24EnableSrcElementCountingEi @ 13 NONAME + _ZN11DDmaRequest25DisableDstElementCountingEv @ 14 NONAME + _ZN11DDmaRequest25DisableSrcElementCountingEv @ 15 NONAME + _ZN11DDmaRequest30TotalNumDstElementsTransferredEv @ 16 NONAME + _ZN11DDmaRequest30TotalNumSrcElementsTransferredEv @ 17 NONAME + _ZN11DDmaRequest5QueueEv @ 18 NONAME + _ZN11DDmaRequest8FragmentERK16TDmaTransferArgs @ 19 NONAME + _ZN11DDmaRequest8FragmentEmmijm @ 20 NONAME + _ZN11DDmaRequestC1ER11TDmaChannelPFvNS_7TResultEPvES3_i @ 21 NONAME + _ZN11DDmaRequestC1ER11TDmaChannelPFvj10TDmaResultPvP10SDmaDesHdrES3_j @ 22 NONAME + _ZN11DDmaRequestC2ER11TDmaChannelPFvNS_7TResultEPvES3_i @ 23 NONAME + _ZN11DDmaRequestC2ER11TDmaChannelPFvj10TDmaResultPvP10SDmaDesHdrES3_j @ 24 NONAME + _ZN11DDmaRequestD0Ev @ 25 NONAME + _ZN11DDmaRequestD1Ev @ 26 NONAME + _ZN11DDmaRequestD2Ev @ 27 NONAME + _ZN11TDmaChannel13LinkToChannelEPS_ @ 28 NONAME + _ZN11TDmaChannel14IsrRedoRequestEmmjmi @ 29 NONAME + _ZN11TDmaChannel15StaticExtensionEiPv @ 30 NONAME + _ZN11TDmaChannel16AddressAlignMaskEjjm @ 31 NONAME + _ZN11TDmaChannel17MaxTransferLengthEjjm @ 32 NONAME + _ZN11TDmaChannel18MissNextInterruptsEi @ 33 NONAME + _ZN11TDmaChannel4OpenERKNS_11SCreateInfoERPS_ @ 34 NONAME + _ZN11TDmaChannel5CloseEv @ 35 NONAME + _ZN11TDmaChannel5PauseEv @ 36 NONAME + _ZN11TDmaChannel6ResumeEv @ 37 NONAME + _ZN11TDmaChannel8DmacCapsEv @ 38 NONAME + _ZN11TDmaChannel8FailNextEi @ 39 NONAME + _ZN11TDmaChannel9CancelAllEv @ 40 NONAME + _ZN11TDmaChannel9ExtensionEiPv @ 41 NONAME + _ZN16TDmaTransferArgsC1ERK18TDmaTransferConfigS2_mjj15TDmaGraphicsOpsm @ 42 NONAME + _ZN16TDmaTransferArgsC1Ejjjjjj12TDmaAddrModejj13TDmaBurstSizej15TDmaGraphicsOpsm @ 43 NONAME + _ZN16TDmaTransferArgsC1Ev @ 44 NONAME + _ZN16TDmaTransferArgsC2ERK18TDmaTransferConfigS2_mjj15TDmaGraphicsOpsm @ 45 NONAME + _ZN16TDmaTransferArgsC2Ejjjjjj12TDmaAddrModejj13TDmaBurstSizej15TDmaGraphicsOpsm @ 46 NONAME + _ZN16TDmaTransferArgsC2Ev @ 47 NONAME + _ZN18TDmaTransferConfigC1Emj12TDmaAddrModej13TDmaBurstSizejjji @ 48 NONAME + _ZN18TDmaTransferConfigC1Emjjjiijj13TDmaBurstSizejji @ 49 NONAME + _ZN18TDmaTransferConfigC1Ev @ 50 NONAME + _ZN18TDmaTransferConfigC2Emj12TDmaAddrModej13TDmaBurstSizejjji @ 51 NONAME + _ZN18TDmaTransferConfigC2Emjjjiijj13TDmaBurstSizejji @ 52 NONAME + _ZN18TDmaTransferConfigC2Ev @ 53 NONAME + _ZTI11DDmaRequest @ 54 NONAME + _ZTI11TDmaChannel @ 55 NONAME + _ZTI13TDmaDbChannel @ 56 NONAME + _ZTI13TDmaSbChannel @ 57 NONAME + _ZTI13TDmaSgChannel @ 58 NONAME + _ZTI17TDmaAsymSgChannel @ 59 NONAME + _ZTI5TDmac @ 60 NONAME + _ZTV11DDmaRequest @ 61 NONAME + _ZTV11TDmaChannel @ 62 NONAME + _ZTV13TDmaDbChannel @ 63 NONAME + _ZTV13TDmaSbChannel @ 64 NONAME + _ZTV13TDmaSgChannel @ 65 NONAME + _ZTV17TDmaAsymSgChannel @ 66 NONAME + _ZTV5TDmac @ 67 NONAME + diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/cpudefs.h --- a/kernel/eka/include/cpudefs.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/include/cpudefs.h Mon Jan 18 21:31:10 2010 +0200 @@ -618,6 +618,11 @@ #endif #endif +// Macro used to get the caller of the function containing a CHECK_PRECONDITIONS() +#if defined(__ARMCC_VERSION) && __ARMCC_VERSION >= 200000 +#define PRECOND_FUNCTION_CALLER __return_address() +#endif + #if !defined(__CPU_ARM_HAS_LDREX_STREX_V6K) #if defined(__CPU_ARM_HAS_LDREX_STREX) #define __ATOMIC64_USE_SLOW_EXEC__ @@ -639,6 +644,15 @@ #define __crash() asm("int 0xff " : : : "memory") #endif +#ifdef __VC32__ +// Not available in the version of MSVC normally used +// #define PRECOND_FUNCTION_CALLER ((TLinAddr)_ReturnAddress()) +#endif + #endif // __CPU_X86 +#ifdef __GCC32__ +#define PRECOND_FUNCTION_CALLER ((TLinAddr)__builtin_return_address(0)) #endif + +#endif diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/d32comm.h --- a/kernel/eka/include/d32comm.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/include/d32comm.h Mon Jan 18 21:31:10 2010 +0200 @@ -27,6 +27,7 @@ #define __D32COMM_H__ #include #include +#include /** Enumeration of number of data bits for serial port configuration. @@ -107,12 +108,6 @@ ESIREnable,ESIRDisable, }; -enum TFlowControl - { - EFlowControlOn,EFlowControlOff - }; -// - const TInt KConfigMaxTerminators=4; // DTE Constants const TUint KConfigObeyXoff=0x01; diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/d32public.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/include/d32public.h Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,37 @@ +// Copyright (c) 1995-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: +// e32\include\d32public.h +// +// D32 enums that are depended on by public headers. +// +// + +/** +@file +@publishedAll +@released +*/ + +#ifndef __D32PUBLIC_H__ +#define __D32PUBLIC_H__ + + +enum TFlowControl + { + EFlowControlOn,EFlowControlOff + }; + + +#endif // __D32PUBLIC_H__ + diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/d32usbdi_errors.h --- a/kernel/eka/include/d32usbdi_errors.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/include/d32usbdi_errors.h Mon Jan 18 21:31:10 2010 +0200 @@ -62,6 +62,14 @@ const TInt KErrUsbRemoteWakeupAlreadyDisabled = -6661; const TInt KErrUsbAlreadyResumed = -6662; +/* +The following two codes are used to indicate attachment/detachment of some malfunction +USB peripherals, which behaviour don't comply with USB specification. For example, some +hubs drive their upstream port VBus, however such behaviour is not allowed according to USB specification. +*/ +const TInt KErrUsbBadDeviceAttached = -6663; +const TInt KEventUsbBadDeviceDetached = -6664; + namespace UsbdiPanics { _LIT(KUsbHubDriverPanicCat, "USBHubDriver"); diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/drivers/dma.h --- a/kernel/eka/include/drivers/dma.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/include/drivers/dma.h Mon Jan 18 21:31:10 2010 +0200 @@ -11,794 +11,20 @@ // Contributors: // // Description: -// e32\include\drivers\dma.h -// DMA framework API -// +// include/drivers/dma.h +// DMA Framework - Client API definition. +// // #ifndef __DMA_H__ #define __DMA_H__ -#include - -////////////////////////////////////////////////////////////////////////////// -// Debug Support - KDmaPanicCat is defined in each source file - -#define __DMA_ASSERTD(e) __ASSERT_DEBUG(e, Kern::Fault(KDmaPanicCat, __LINE__)) -#define __DMA_ASSERTA(e) __ASSERT_ALWAYS(e, Kern::Fault(KDmaPanicCat, __LINE__)) -#ifdef _DEBUG -#define __DMA_CANT_HAPPEN() Kern::Fault(KDmaPanicCat, __LINE__) -#define __DMA_DECLARE_INVARIANT public: void Invariant(); -#define __DMA_INVARIANT() Invariant() +#ifndef DMA_APIV2 +# include #else -#define __DMA_CANT_HAPPEN() -#define __DMA_DECLARE_INVARIANT -#define __DMA_INVARIANT() -#endif - - -////////////////////////////////////////////////////////////////////////////// -// INTERFACE EXPOSED TO DEVICE-DRIVERS -////////////////////////////////////////////////////////////////////////////// - -/** -Bitmasks used for configuring a DMA request. - -In general, specify KDmaMemSrc|KDmaIncSrc (resp. KDmaMemDest|KDmaIncDest) if -the source (resp. destination) is a memory buffer and clear -KDmaMemSrc|KDmaIncSrc (resp. KDmaMemDest|KDmaIncDest) if the source -(resp. destination) is a peripheral. - -If the location is given as a physical address (rather than a linear one) -then also specify KDmaPhysAddrSrc and/or KDmaPhysAddrDest. - -The EKA1 "Fill Mode" can be implemented by omitting KDmaIncSrc. - -Some peripherals may require a post-increment address mode. - -@see DDmaRequest::Fragment -@publishedPartner -@released -*/ - -enum TDmaRequestFlags - { - /** Source is address of memory buffer */ - KDmaMemSrc = 0x01, - /** Destination is address of memory buffer */ - KDmaMemDest = 0x02, - /** Source address must be post-incremented during transfer */ - KDmaIncSrc = 0x04, - /** Destination address must be post-incremented during transfer */ - KDmaIncDest = 0x08, - /** Source address is a physical address (as opposed to a linear one) */ - KDmaPhysAddrSrc = 0x10, - /** Destination address is a physical address (as opposed to a linear one) */ - KDmaPhysAddrDest = 0x20, - /** Request a different max transfer size (for instance for test purposes) */ - KDmaAltTransferLen = 0x40 - }; - - -////////////////////////////////////////////////////////////////////////////// - -class TDmaChannel; -struct SDmaDesHdr; - -/** A DMA request is a list of fragments small enough to be transferred in one go - by the DMAC. - - In general, fragmentation is done in the framework by calling Fragment() but - clients with special needs can allocate a blank descriptor list with - ExpandDesList() and customise it to fit their needs. - - Clients should not set attributes directly, but should use the various functions - instead. - - This class has not been designed to be called from several concurrent threads. - Multithreaded clients must implement their own locking scheme (via DMutex). - - Fast mutexes are used internally to protect data structures accessed both - by the client thread and the DFC thread. Therefore no fast mutex can be held - when calling a request function. - - @publishedPartner - @released - */ -class DDmaRequest : public DBase - { - friend class TDmaChannel; -public: - /** The outcome of the transfer */ - enum TResult {EBadResult=0, EOk, EError}; - /** The signature of the completion/failure callback function */ - typedef void (*TCallback)(TResult, TAny*); -public: - - /** - Create a new transfer request. - - @param aChannel The channel this request is bound to. - @param aCb Callback function called on transfer completion or failure (in channel - DFC context). Can be NULL. - @param aCbArg Argument passed to callback function. - @param aMaxTransferSize Maximum fragment size. If not specified, defaults to the maximum size - supported by the DMA controller for the type of transfer that is later scheduled. - */ - IMPORT_C DDmaRequest(TDmaChannel& aChannel, TCallback aCb=NULL, TAny* aCbArg=NULL, TInt aMaxTransferSize=0); - - - /** - Destructor. - - Assume the request is not being transferred or pending. - */ - IMPORT_C ~DDmaRequest(); - - - /** - Split request into a list of fragments small enough to be fed to the DMAC. - - The size of each fragment is smaller than or equal to the maximum transfer size - supported by the DMAC. If the source and/or destination is memory, each - fragment points to memory which is physically contiguous. - - The kind of transfer to perform is specified via a set of flags used by a PIL - and a magic cookie passed to the PSL. If the source (resp. destination) is a - peripheral, aSrc (resp. aDest) is treated as a magic cookie by the PIL and - passed straight to the PSL. - - The request can be uninitialised or may have been fragmented previously. The - previous configuration if any is lost whether or not the function succeeds. - - @param aSrc Source memory buffer linear address or peripheral magic cookie. - @param aDest Destination memory buffer linear address or peripheral magic cookie. - @param aCount Number of bytes to transfer. - @param aFlags Bitmask characterising the transfer. - @param aPslInfo Hardware-specific information passed to PSL. - - @return KErrNone if success. KErrArgument if aFlags and/or aPslInfo are invalid when finding - the maximum transfer size. May also fail if running out of descriptors. - - @pre The request is not being transferred or pending. - @pre The various parameters must be valid. The PIL or PSL will fault the - kernel if not. - - @see TDmaRequestFlags - */ - IMPORT_C TInt Fragment(TUint32 aSrc, TUint32 aDest, TInt aCount, TUint aFlags, TUint32 aPslInfo); - - - /** - Transfer asynchronously this request. - - If this request's channel is idle, the request is transferred immediately. - Otherwise, it is queued and transferred later. - - The client is responsible for ensuring cache consistency before and/or after the - transfer if necessary. - */ - IMPORT_C void Queue(); - - - /** - Append new descriptor(s) to existing list. - - Clients needing to build a custom descriptor list should call this function to - allocate the list and access the resulting list through iFirstHdr and iLastHdr. - - Clients should not change the value of iFirstHdr, iLastHdr and the iNext field - of the descriptor headers to ensure descriptors can be deallocated. Clients - are free to change hardware descriptors, including chaining, in whatever way - suit them. - - Assume the request is not being transferred or pending. - - @param aCount Number of descriptors to append. - - @return KErrNone or KErrTooBig if not enough descriptors available. - */ - IMPORT_C TInt ExpandDesList(TInt aCount=1); - - - /** - Free resources associated with this request. - - Assume the request is not being transferred or pending. - */ - IMPORT_C void FreeDesList(); -private: - inline void OnDeque(); -public: - // WARNING: The following attributes are accessed both in client and DFC - // context and so accesses must be protected with the channel lock. - TDmaChannel& iChannel; /**< The channel this request is bound to */ - volatile TCallback iCb; /**< Called on completion/failure (can be NULL) */ - TAny* volatile iCbArg; /**< Callback argument */ - TInt iDesCount; /**< The number of fragments in list */ - SDmaDesHdr* iFirstHdr; /**< The first fragment in the list (or NULL) */ - SDmaDesHdr* iLastHdr; /**< The last fragment in the list (or NULL) */ - SDblQueLink iLink; /**< The link on channel queue of pending requests */ - TBool iQueued; /**< Indicates whether request is pending or being transferred */ - TInt iMaxTransferSize; /**< Defaults to DMA controller max. transfer size */ - __DMA_DECLARE_INVARIANT - }; - - -////////////////////////////////////////////////////////////////////////////// - -class TDmac; -class DmaChannelMgr; - -/** DMA channel base class. - - This class has not been designed to be called from several concurrent - client threads. Multithreaded clients must implement their own locking - scheme (via DMutex). - - Fast mutexes are used internally to protect data structures accessed both - by the client thread and the DFC one. Therefore no fast mutex can be held - when calling a channel function. - - Must be allocated in BSS because it relies on being zeroed at - creation-time. If the PSL really needs to allocate channels on the kernel - heap, it must manually zero-initialises the instances. This can be - achieved either by allocating raw memory and using placement new, or by - wrapping channels into a DBase-derived wrapper. - - @publishedPartner - @released - */ -class TDmaCancelInfo; -class TDmaChannel - { - friend class DDmaRequest; - friend class TDmac; - friend class DmaChannelMgr; -public: - /** Information passed by client when opening channel */ - struct SCreateInfo - { - /** Identifier used by PSL to select channel to open */ - TUint32 iCookie; - /** Number of descriptors this channel can use */ - TInt iDesCount; - /** DFC queue used to service DMA interrupts. The DFC thread - priority must be higher than any client thread priority to - avoid a situation where a transfer completes while being - cancelled and another transfer is started before the DFC - thread gets a chance to run. This would lead to a stray - DFC. - */ - TDfcQue* iDfcQ; - /** DFC priority */ - TUint8 iDfcPriority; - }; -public: - /** - Opens the DMA channel. - - Channel selection is done by the hardware-specific layer using a cookie passed in - via aInfo. - - The client should not delete the returned pointer as the framework owns - channel objects. However, the client should explicitly close the channel when - finished with it. - - @param aInfo Information passed by caller to select and configure channel. - @param aChannel Point to open channel on successful return. NULL otherwise. - - @return KErrNone or standard error code. - */ - IMPORT_C static TInt Open(const SCreateInfo& aInfo, TDmaChannel*& aChannel); - - - /** - Closes a previously opened DMA channel. - - Assume the channel is idle and all requests have been deleted. - */ - IMPORT_C void Close(); - - - /** - Cancels the current request and all the pending ones. - */ - IMPORT_C void CancelAll(); - inline TBool IsOpened() const; - inline TBool IsQueueEmpty() const; - inline TUint32 PslId() const; - inline TInt FailNext(TInt aFragmentCount); - inline TInt MissNextInterrupts(TInt aInterruptCount); - inline TInt Extension(TInt aCmd, TAny* aArg); - - /** - This is a function that allows the Platform Specific Layer (PSL) to extend the DMA API - with new channel-independent operations. - - @param aCmd Command identifier. Negative values are reserved for Symbian use. - @param aArg PSL-specific. - - @return KErrNotSupported if aCmd is not supported; a PSL specific value otherwise. - */ - IMPORT_C TInt StaticExtension(TInt aCmd, TAny* aArg); - inline const TDmac* Controller() const; - inline TInt MaxTransferSize(TUint aFlags, TUint32 aPslInfo); - inline TUint MemAlignMask(TUint aFlags, TUint32 aPslInfo); -protected: - // Interface with state machines - TDmaChannel(); - virtual void DoQueue(DDmaRequest& aReq) = 0; - virtual void DoCancelAll() = 0; - virtual void DoUnlink(SDmaDesHdr& aHdr); - virtual void DoDfc(DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr) = 0; -#if defined(__CPU_ARM) && !defined(__EABI__) - inline virtual ~TDmaChannel() {} // kill really annoying warning -#endif -private: - static void Dfc(TAny*); - void DoDfc(); - inline void Wait(); - inline void Signal(); - inline TBool Flash(); - void ResetStateMachine(); -protected: - TDmac* iController; // DMAC this channel belongs to (NULL when closed) - TUint32 iPslId; // unique identifier provided by PSL - NFastMutex iLock; // for data accessed in both client & DFC context - SDmaDesHdr* iCurHdr; // fragment being transferred or NULL - SDmaDesHdr** iNullPtr; // Pointer to NULL pointer following last fragment - TDfc iDfc; // transfer completion/failure DFC - TInt iMaxDesCount; // maximum number of allocable descriptors - TInt iAvailDesCount; // available number of descriptors - volatile TUint32 iIsrDfc; // Interface between ISR and DFC: - enum { KErrorFlagMask = 0x80000000 }; // bit 31 - error flag - enum { KCancelFlagMask = 0x40000000 }; // bit 30 - cancel flag - enum { KDfcCountMask = 0x3FFFFFFF }; // bits 0-29 - number of queued DFCs - SDblQue iReqQ; // being/about to be transferred request queue - TInt iReqCount; // number of requests attached to this channel -private: - TDmaCancelInfo* iCancelInfo; - __DMA_DECLARE_INVARIANT - }; - - -////////////////////////////////////////////////////////////////////////////// -// PIL-PSL INTERFACE -////////////////////////////////////////////////////////////////////////////// - -/** -Generic DMA descriptor used if the DMAC does not have support for hardware -descriptor. -@see DDmaRequest::Fragment -@publishedPartner -@released -*/ - -struct SDmaPseudoDes - { - /** Source linear address or peripheral cookie */ - TUint32 iSrc; - /** Destination linear address or peripheral cookie */ - TUint32 iDest; - /** Number of bytes to transfer */ - TInt iCount; - /** @see TDmaRequestFlags */ - TUint iFlags; - /** PSL-specific information provided by client */ - TUint32 iPslInfo; - /** The same as TDmaChannel::SCreateInfo.iCookie */ - TUint32 iCookie; - }; - - -/** -Each hardware or pseudo descriptor is associated with a header. Headers are -needed because hardware descriptors can not easily be extended to store -additional information. -@publishedPartner -@released -*/ - -struct SDmaDesHdr - { - SDmaDesHdr* iNext; - }; +# include +#endif // #ifndef DMA_APIV2 -/** -Interface used by PIL to open and close DMA channels. - -Must be implemented by PSL. -@publishedPartner -@released -*/ - -class DmaChannelMgr - { -public: - /** Opens a channel using a client-provided identifier. - This function must be implemented by the PSL. - @param aOpenId Magic cookie passed by client - This may identify the channel (if a static channel - allocation scheme is used) or may indicate some - properties which the channel must possess (if a dynamic - channel allocation scheme is used). It may be set to - zero always if dynamic allocation is used and all - channels are equivalent. - @return Pointer to channel if available, NULL otherwise. - @pre The PIL calls this function with a global fast mutex held to - avoid race conditions. - @post If a non-NULL pointer is returned, the object pointed to has its - iController and iPslId members set to valid states. - iController should point to the controller handling that channel. - iPslId should contain a value uniquely identifying the channel - - it is used only for debug tracing by PIL. It can be given any - convenient value by PSL (channel index, I/O port address, ...). - */ - static TDmaChannel* Open(TUint32 aOpenId); - - /** Performs platform-specific operations when a channel is closed. - This function must be implemented by the PSL but the implementation can be - a no-op. - @param aChannel The channel to close - @pre The PIL calls this function with a global fast mutex held to - avoid race conditions. - */ - static void Close(TDmaChannel* aChannel); - - /** Function allowing PSL to extend DMA API with new channel-independent operations. - This function must be implemented by the PSL. - @param aCmd Command identifier. Negative values are reserved for Symbian use. - @param aArg PSL-specific - @return KErrNotSupported if aCmd is not supported. PSL-specific value otherwise. - */ - static TInt StaticExtension(TInt aCmd, TAny* aArg); - - static inline void Wait(); - static inline void Signal(); -private: - static NFastMutex Lock; - }; - - -////////////////////////////////////////////////////////////////////////////// - -/** - Abstract base class representing a DMA controller. - - The class has two purposes. - - First, it is a container for channels, descriptors and descriptor headers. - - Second, it exposes a set of virtual functions implemented by - the PSL (platform-specific layer). - These functions are the main interfaces between - the PIL (platform-independent layer) and PSL. - - Must be allocated in BSS because it relies on being zeroed at creation-time. - - @publishedPartner - @released - */ - -class TDmac - { - friend class DmaChannelMgr; -// protected: VC++ complains when building PSL if following decl is protected -public: - /** Data required for creating a new instance */ - struct SCreateInfo - { - /** Number of channels in controller */ - TInt iChannelCount; - /** Maximum number of descriptors (shared by all channels) */ - TInt iDesCount; - /** Bitmask. The only supported value is KCapsBitHwDes (hardware - descriptors used). */ - TUint32 iCaps; - /** Size of individual descriptors. Use sizeof(SDmaPseudoDes) for - single-buffer and double-buffer controllers. */ - TInt iDesSize; - /** Bitmask used when creating the hardware chunk storing the descriptor - pool. Used only for hardware descriptors. The access part must be - EMapAttrSupRw. If the chunk is cached and/or buffered, the PSL must - flush the data cache and/or drain the write buffer in InitHwDes() - and related functions. - @see TMappingAttributes - */ - TUint iDesChunkAttribs; - }; -public: - TInt Create(const SCreateInfo& aInfo); - virtual ~TDmac(); - TInt ReserveSetOfDes(TInt aCount); - void ReleaseSetOfDes(TInt aCount); - void InitDes(const SDmaDesHdr& aHdr, TUint32 aSrc, TUint32 aDest, TInt aCount, - TUint aFlags, TUint32 aPslInfo, TUint32 aCookie); - inline SDmaPseudoDes& HdrToDes(const SDmaDesHdr& aHdr) const; - inline TAny* HdrToHwDes(const SDmaDesHdr& aHdr) const; - inline TUint32 DesLinToPhys(TAny* aDes) const; - inline void Wait(); - inline void Signal(); -protected: - TDmac(const SCreateInfo& aInfo); - -public: - /** - Called by PIL when one fragment (single-buffer and double-buffer DMACs) or - list of fragments (scatter/gather DMAC) is to be transferred. - - Called when initiating a new transfer and also, for double-buffer DMACs, for - configuring the next fragment to transfer while the current one is - ongoing. Must always be implemented by PSL. - @param aChannel The channel to use - @param aHdr Header associated with fragment to transfer - */ - virtual void Transfer(const TDmaChannel& aChannel, const SDmaDesHdr& aHdr) = 0; - - /** - Called by PIL to suspend transfer on a given channel. - - The suspension must occur synchronously as the PSL assumes the channel - is suspended after calling this function. Must always be implemented by PSL. - @param aChannel The channel to suspend - */ - virtual void StopTransfer(const TDmaChannel& aChannel) = 0; - - /** - Called by PIL to check whether a DMA channel is idle. - @param aChannel The channel to test - @return ETrue if channel idle, EFalse if transferring. - */ - virtual TBool IsIdle(const TDmaChannel& aChannel) = 0; - - /** - Called by PIL to retrieve from the PSL the maximum transfer size based on the - parameters passed. - @param aChannel Channel to be used for the transfer - @param aFlags Bitmask characterising transfer - @param aPslInfo Cookie passed by client and used by PSL - @return 0 if invalid argument(s), -1 if transfer size not limited, the maximum - transfer size otherwise. - */ - virtual TInt MaxTransferSize(TDmaChannel& aChannel, TUint aFlags, TUint32 aPslInfo) = 0; - - /** - Called by PIL to retrieve from the PSL the memory alignment mask based on the - parameters passed. Some DMA controllers impose alignment constraints on the base - address of memory buffers. This mask is AND'ed against memory addresses computed - during fragmentation. - @param aChannel Channel to be used for the transfer - @param aFlags Bitmask characterising transfer - @param aPslInfo Cookie passed by client and used by PSL - @return A value representing the alignment mask (e.g. 3 if buffer must be 4-byte aligned) - */ - virtual TUint MemAlignMask(TDmaChannel& aChannel, TUint aFlags, TUint32 aPslInfo) = 0; - - /** - Called by PIL during fragmentation to initialise a hardware descriptor. - - The PSL must assume the descriptor is the last in the chain and so set the - interrupt bit and set the next descriptor field to an end of chain marker. - Must be implemented by PSL if and only if the DMAC supports hardware - descriptors. - @param aHdr Header associated with hardware descriptor to initialise - @param aSrc Transfer source - @param aDest Transfer destination - @param aCount Number of bytes to transfer (<= max. size supported by DMAC) - @param aFlags Bitmask characterising transfer - @param aPslInfo Cookie passed by client and used by PSL - @param aCookie the channel selection cookie - @see DDmaRequest::Fragment - */ - virtual void InitHwDes(const SDmaDesHdr& aHdr, TUint32 aSrc, TUint32 aDest, TInt aCount, - TUint aFlags, TUint32 aPslInfo, TUint32 aCookie); - - /** - Called by PIL, when fragmenting a request, to append a new hardware - descriptor to an existing descriptor chain. - - Must clear the interrupt bit of the descriptor associated with aHdr. - Must be implemented by PSL if and only if the DMAC supports hardware descriptors. - @param aHdr Header associated with last fragment in chain - @param aNextHdr Header associated with fragment to append - */ - virtual void ChainHwDes(const SDmaDesHdr& aHdr, const SDmaDesHdr& aNextHdr); - - /** - Called by PIL when queuing a new request while the channel is running. - - Must append the first hardware descriptor of the new request to the last - descriptor in the existing chain. Must be implemented by PSL if and only if - the DMAC supports hardware descriptors. - @param aChannel The channel where the transfer takes place - @param aLastHdr Header associated with last hardware descriptor in chain - @param aNewHdr Header associated with first hardware descriptor in new request - */ - virtual void AppendHwDes(const TDmaChannel& aChannel, const SDmaDesHdr& aLastHdr, - const SDmaDesHdr& aNewHdr); - - /** - Called by PIL when completing or cancelling a request to cause the PSL to unlink - the last item in the h/w descriptor chain from a subsequent chain that it was - possibly linked to. Must be implemented by the PSL if and only if the DMAC supports - hardware descriptors. - - @param aChannel The channel where the request (and thus the descriptor) was queued - @param aHdr Header associated with last h/w descriptor in completed/cancelled chain - */ - virtual void UnlinkHwDes(const TDmaChannel& aChannel, SDmaDesHdr& aHdr); - - /** - Called by test harness to force an error when the next fragment is - transferred. - - Must be implemented by the PSL only if possible. - @param aChannel The channel where the error is to occur. - @return KErrNone if implemented. The default PIL implementation returns - KErrNotSupported and the test harness knows how to deal with that. - */ - virtual TInt FailNext(const TDmaChannel& aChannel); - - /** - Called by test harness to force the DMA controller to miss one or - more interrupts. - - Must be implemented by the PSL only if possible. - @param aChannel The channel where the error is to occur - @param aInterruptCount The number of interrupt to miss. - @return KErrNone if implemented. The default PIL implementation returns - KErrNotSupported and the test harness knows how to deal with that. - */ - virtual TInt MissNextInterrupts(const TDmaChannel& aChannel, TInt aInterruptCount); - - /** Function allowing platform-specific layer to extend channel API with - new channel-specific operations. - @param aChannel Channel to operate on - @param aCmd Command identifier. Negative values are reserved for Symbian use. - @param aArg PSL-specific - @return KErrNotSupported if aCmd is not supported. PSL-specific value otherwise. - @see TDmaChannel::Extension - */ - virtual TInt Extension(TDmaChannel& aChannel, TInt aCmd, TAny* aArg); - -protected: - static void HandleIsr(TDmaChannel& aChannel, TBool aIsComplete); -private: - TInt AllocDesPool(TUint aAttribs); - void FreeDesPool(); -private: - NFastMutex iLock; // protect descriptor reservation and allocation - const TInt iMaxDesCount; // initial number of descriptors and headers - TInt iAvailDesCount; // current available number of descriptors and headers - SDmaDesHdr* iHdrPool; // descriptor header dynamic array -#ifndef __WINS__ - DPlatChunkHw* iHwDesChunk; // chunk for hardware descriptor pool -#endif - TAny* iDesPool; // hardware or pseudo descriptor dynamic array - const TInt iDesSize; // descriptor size in bytes -public: - const TUint iCaps; /*< what is supported by DMA controller */ - enum {KCapsBitHwDes = 1}; /*< hardware descriptors supported */ - SDmaDesHdr* iFreeHdr; /*< head of unallocated descriptors linked list */ -#ifdef _DEBUG - TBool IsValidHdr(const SDmaDesHdr* aHdr); -#endif - __DMA_DECLARE_INVARIANT - }; - - -////////////////////////////////////////////////////////////////////////////// - -/** -Single-buffer DMA channel. - -Can be instantiated or further derived by PSL. Not -intended to be instantiated by client device drivers. -@publishedPartner -@released -*/ - -class TDmaSbChannel : public TDmaChannel - { -private: - virtual void DoQueue(DDmaRequest& aReq); - virtual void DoCancelAll(); - virtual void DoDfc(DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); -private: - TBool iTransferring; - }; - - -/** -Double-buffer DMA channel. - -Can be instantiated or further derived by PSL. Not -intended to be instantiated by client device drivers. -@publishedPartner -@released -*/ - -class TDmaDbChannel : public TDmaChannel - { -private: - virtual void DoQueue(DDmaRequest& aReq); - virtual void DoCancelAll(); - virtual void DoDfc(DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); -private: - enum { EIdle = 0, ETransferring, ETransferringLast } iState; - }; - - -/** -Scatter-gather DMA channel. - -Can be instantiated or further derived by PSL. -Not intended to be instantiated by client device drivers. -@publishedPartner -@released -*/ - -class TDmaSgChannel : public TDmaChannel - { -private: - virtual void DoQueue(DDmaRequest& aReq); - virtual void DoCancelAll(); - virtual void DoUnlink(SDmaDesHdr& aHdr); - virtual void DoDfc(DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); -private: - TBool iTransferring; - }; - - -////////////////////////////////////////////////////////////////////////////// -// INTERFACE WITH TEST HARNESS -////////////////////////////////////////////////////////////////////////////// - -/** -Set of information used by test harness. -@publishedPartner -@released -*/ - -struct TDmaTestInfo - { - /** Maximum transfer size in byte */ - TInt iMaxTransferSize; - /** 3->Memory buffers must be 4-byte aligned, 7->8-byte aligned, ... */ - TUint iMemAlignMask; - /** Cookie to pass to DDmaRequest::Fragment for memory-memory transfer*/ - TUint32 iMemMemPslInfo; - /** Number of test single-buffer channels */ - TInt iMaxSbChannels; - /** Pointer to array containing single-buffer test channel ids */ - TUint32* iSbChannels; - /** Number of test double-buffer channels */ - TInt iMaxDbChannels; - /** Pointer to array containing double-buffer test channel ids */ - TUint32* iDbChannels; - /** Number of test scatter-gather channels */ - TInt iMaxSgChannels; - /** Pointer to array containing scatter-gather test channel ids */ - TUint32* iSgChannels; - }; - - -/** -Provides access to test information structure stored in the PSL. - -Must be implemented by the PSL. -@publishedPartner -@released -*/ - -IMPORT_C const TDmaTestInfo& DmaTestInfo(); - - -////////////////////////////////////////////////////////////////////////////// - -#include - -#endif +#endif // #ifndef __DMA_H__ diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/drivers/dma.inl --- a/kernel/eka/include/drivers/dma.inl Thu Jan 07 13:38:45 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,147 +0,0 @@ -// Copyright (c) 2002-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: -// e32\include\drivers\dma.inl -// DMA framework public inline functions -// This file should not be modified when porting the DMA framework to -// new hardware. -// TDmaChannel -// -// WARNING: This file contains some APIs which are internal and are subject -// to change without noticed. Such APIs should therefore not be used -// outside the Kernel and Hardware Services package. -// - -inline void TDmaChannel::Wait() - { - NKern::FMWait(&iLock); - } - -inline void TDmaChannel::Signal() - { - NKern::FMSignal(&iLock); - } - -inline TBool TDmaChannel::Flash() - { - return NKern::FMFlash(&iLock); - } - -inline TBool TDmaChannel::IsOpened() const - { - return iController != NULL; - } - -inline TBool TDmaChannel::IsQueueEmpty() const - { - return const_cast(this)->iReqQ.IsEmpty(); - } - -inline TUint32 TDmaChannel::PslId() const - { - return iPslId; - } - -inline TInt TDmaChannel::FailNext(TInt /*aFragmentCount*/) - { - return iController->FailNext(*this); - } - -inline TInt TDmaChannel::MissNextInterrupts(TInt aInterruptCount) - { - return iController->MissNextInterrupts(*this, aInterruptCount); - } - -/** Function allowing platform-specific layer to extend API with new - channel-specific operations. - @param aCmd Command identifier. Negative values are reserved for Symbian use. - @param aArg PSL-specific - @return KErrNotSupported if aCmd is not supported. PSL-specific value otherwise. - */ - -inline TInt TDmaChannel::Extension(TInt aCmd, TAny* aArg) - { - return iController->Extension(*this, aCmd, aArg); - } - -inline const TDmac* TDmaChannel::Controller() const - { - return iController; - } - -inline TInt TDmaChannel::MaxTransferSize(TUint aFlags, TUint32 aPslInfo) - { - return iController->MaxTransferSize(*this, aFlags, aPslInfo); - } - -inline TUint TDmaChannel::MemAlignMask(TUint aFlags, TUint32 aPslInfo) - { - return iController->MemAlignMask(*this, aFlags, aPslInfo); - } - -// DDmaRequest - -/** Called when request is removed from request queue in channel */ - -inline void DDmaRequest::OnDeque() - { - iQueued = EFalse; - iLastHdr->iNext = NULL; - iChannel.DoUnlink(*iLastHdr); - } - -// TDmac - -inline void TDmac::Wait() - { - NKern::FMWait(&iLock); - } - -inline void TDmac::Signal() - { - NKern::FMSignal(&iLock); - } - -inline SDmaPseudoDes& TDmac::HdrToDes(const SDmaDesHdr& aHdr) const - { - return static_cast(iDesPool)[&aHdr - iHdrPool]; - } - -inline TAny* TDmac::HdrToHwDes(const SDmaDesHdr& aHdr) const - { - return static_cast(iDesPool) + iDesSize*(&aHdr - iHdrPool); - } - -inline TUint32 TDmac::DesLinToPhys(TAny* aDes) const - { -#ifdef __WINS__ - (void)aDes; - return 0xDEADBEEF; -#else - return iHwDesChunk->iPhysAddr + ((TLinAddr)aDes - iHwDesChunk->iLinAddr); -#endif - } - -// DmaChannelMgr - -inline void DmaChannelMgr::Wait() - { - NKern::FMWait(&Lock); - } - -inline void DmaChannelMgr::Signal() - { - NKern::FMSignal(&Lock); - } - -//--- diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/drivers/dma_compat.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/include/drivers/dma_compat.inl Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,62 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// include/drivers/dma_compat.inl +// DMA Framework - Client API definition. +// +// Inline implementations of functions which (originally) exposed DMA HAI +// details that are now, after the header file split into dma_v2.h and +// dma_hai.h, no longer meant to be visible to DMA clients. This file is only +// included for DMA_APIV2 clients. +// +// This file is not meant to be a permanent one, and may eventually be removed +// together with the deprecated functions it implements. +// +// + + +inline const TDmac* TDmaChannel::Controller() const + { + return iController; + } + +static inline TUint32 RequestFlags2SrcConfigFlags(TUint aFlags) + { + TUint32 flags = (aFlags & KDmaMemSrc) ? KDmaMemAddr : 0; + flags |= (aFlags & KDmaPhysAddrSrc) ? KDmaPhysAddr : 0; + return flags; + } + +static inline TUint32 RequestFlags2DstConfigFlags(TUint aFlags) + { + TUint32 flags = (aFlags & KDmaMemDest) ? KDmaMemAddr : 0; + flags |= (aFlags & KDmaPhysAddrDest) ? KDmaPhysAddr : 0; + return flags; + } + +inline TInt TDmaChannel::MaxTransferSize(TUint aFlags, TUint32 aPslInfo) + { + TUint src_flags = RequestFlags2SrcConfigFlags(aFlags); + TUint dst_flags = RequestFlags2DstConfigFlags(aFlags); + return MaxTransferLength(src_flags, dst_flags, aPslInfo); + } + +inline TUint TDmaChannel::MemAlignMask(TUint aFlags, TUint32 aPslInfo) + { + TUint src_flags = RequestFlags2SrcConfigFlags(aFlags); + TUint dst_flags = RequestFlags2DstConfigFlags(aFlags); + return AddressAlignMask(src_flags, dst_flags, aPslInfo); + } + + +// --- diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/drivers/dma_hai.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/include/drivers/dma_hai.h Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,870 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// include/drivers/dma_hai.h +// DMA Framework - Symbian Hardware Abstraction Interface (SHAI). +// +// + +#ifndef __DMA_HAI_H__ +#define __DMA_HAI_H__ + + +#include + + +////////////////////////////////////////////////////////////////////////////// + + +/** Interface used by PIL to open and close DMA channels. + + Must be implemented by the PSL. + + @publishedPartner + @released +*/ +class DmaChannelMgr + { +public: + /** Opens a channel using a client-provided identifier. + + This function must be implemented by the PSL. + + @param aOpenId PSL-specific magic cookie passed by client. This could + identify the channel exactly (by being just the channel number), or at + least sufficiently (for example for use with a certain peripheral), or + it may indicate some properties which the channel must possess. It may + be set to zero always if all channels are equivalent. + + @param aDynChannel ETrue if the Open call is for a dynamic channel. A + dynamic channel is not exclusively reserved for just one client, and + further Open calls for more dynamic channels should succeed as long as + certain resources (but not including the number of available physical + channels) are not exceeded. Different transfer requests on this dynamic + channel may be serviced using different actual channels. + + @param aPriority The desired channel priority as requested by the + client. This may be an actual hardware priority or a + platform-independent value. Not being able to satisfy the requested + value is not a reason for the PSL to return NULL. This parameter may be + ignored if aDynChannel is passed as ETrue. An overriding per-transfer + priority may be requested by a client later via + TDmaTransferArgs::iChannelPriority. + @see SDmacCaps::iChannelPriorities + @see TDmaPriority + + @return Pointer to channel if available, NULL otherwise. It should not + be NULL if the Open call was for a dynamic channel unless a processing + error occurred. + + @pre The PIL calls this function with a global fast mutex held to avoid + race conditions. + + @post If a non-NULL pointer is returned, the object pointed to has its + iController, iDmacCaps, iPslId, iDynChannel and iPriority members set + to valid states. + + iController should point to the controller handling the + channel. + + iDmacCaps should point to a SDmacCaps structure containing values + relating to this particular channel. + + iPslId should contain a value uniquely identifying the channel - the + PIL assigns this value later during request fragmentation to + TDmaTransferArgs::iChannelCookie. It can be given any convenient value + by the PSL (channel index, I/O port address, etc.). + + iDynChannel should be set to ETrue by the PSL if a dynamic channel was + requested and has been opened. + + If applicable, iPriority should contain the actual hardware priority + that has been configured or reserved. Otherwise it may be left at its + default value TDmaPriority::KDmaPriorityNone. + */ + static TDmaChannel* Open(TUint32 aOpenId, TBool aDynChannel, TUint aPriority); + + /** Performs platform-specific operations when a channel is closed. + + If aChannel was opened as a dynamic channel then this call is a sign + that there is a client which does not intend to queue any further + transfer requests via this channel. + + This function must be implemented by the PSL but the implementation can + be a no-op. + + @param aChannel The channel to close + + @pre The PIL calls this function with a global fast mutex held to avoid + race conditions. + */ + static void Close(TDmaChannel* aChannel); + + /** Function allowing PSL to extend DMA API with new channel-independent + operations. + + This function must be implemented by the PSL. + + @param aCmd Command identifier. Negative values are reserved for FW + internal use. + + @param aArg PSL-specific + + @return KErrNotSupported if aCmd is not supported. PSL-specific value + otherwise. + */ + static TInt StaticExtension(TInt aCmd, TAny* aArg); + + /** Acquires the channel manager lock. Called by the PIL before opening and + closing a channel. + */ + static void Wait(); + + /** Releases the channel manager lock. Called by the PIL after opening and + closing a channel. + */ + static void Signal(); + +private: + /** Declared, defined, and called by PSL's DECLARE_STANDARD_EXTENSION(). */ + friend TInt InitExtension(); + + /** Must be called in the DMA DLL entry point. */ + static TInt Initialise(); + + static NFastMutex Lock; + }; + + +////////////////////////////////////////////////////////////////////////////// + + +/** Abstract base class representing a DMA controller. + + The class has two purposes. + + First, it is a container for channels, descriptors and descriptor headers. + + Second, it exposes a set of virtual functions implemented by the PSL + (platform-specific layer). + + These functions are the main interfaces between the PIL + (platform-independent layer) and PSL. + + @publishedPartner + @released +*/ +class TDmac + { + friend class DmaChannelMgr; + +protected: + /** Data required for creating a new instance */ + struct SCreateInfo + { + /** True if DMAC uses hardware descriptors (i.e. supports + scatter/gather mode). + */ + TBool iCapsHwDes; + /** Initial maximum number of descriptors and headers (shared by all + channels) to be allocated by the PIL. If at run time more + descriptors are needed then they will be dynamically allocated and + added to the available pool. + + The PSL may consider a number of factors when providing this + initial value, such as the number of channels on this controller, + the maximum transfer size per descriptor and also likely usage + scenarios for the platform or device (number of drivers using DMA, + their traffic patterns, simultaneity of operations, etc.). + */ + TInt iDesCount; + /** Size of individual descriptors. Use sizeof(TDmaTransferArgs) for + single-buffer and double-buffer (i.e. non-s/g) controllers. + */ + TInt iDesSize; + /** Bitmask used when creating the memory chunk storing the descriptor + pool. Used only for hardware descriptors. + + The access part must be EMapAttrSupRw. If the chunk is cached + and/or buffered, the PSL must flush the data cache and/or drain the + write buffer in InitHwDes() and related functions. + + The physical start address of the chunk will always be MMU page + size aligned. + + @see TMappingAttributes + */ + TUint iDesChunkAttribs; + }; + + /** Base class constructor. */ + TDmac(const SCreateInfo& aInfo); + + /** Base class 2nd-phase constructor. */ + TInt Create(const SCreateInfo& aInfo); + +public: + /** Base class virtual destructor. */ + virtual ~TDmac(); + + /** Allocates a number of headers (and hence also descriptors) from the + header/descriptor pools. Called by the PIL but may also be used by the + PSL. + */ + TInt ReserveSetOfDes(TInt aCount); + + /** Returns previously allocated headers (and hence also descriptors) to + the header/descriptor pools. Called by the PIL but may also be used by + the PSL. + */ + void ReleaseSetOfDes(TInt aCount); + + /** Called by the PIL during request fragmentation to fill a descriptor or + pseudo descriptor with transfer arguments. + */ + TInt InitDes(const SDmaDesHdr& aHdr, const TDmaTransferArgs& aTransferArgs); + + /** Called by the PIL in TDmaChannel::IsrRedoRequest() if any of the + latter's arguments is non-zero. + */ + TInt UpdateDes(const SDmaDesHdr& aHdr, TUint32 aSrcAddr, TUint32 aDstAddr, + TUint aTransferCount, TUint32 aPslRequestInfo); + + /** Returns a reference to the associated pseudo descriptor for a given + descriptor header. For use by PIL and PSL. + */ + inline TDmaTransferArgs& HdrToDes(const SDmaDesHdr& aHdr) const; + + /** Returns a reference to the associated hardware descriptor for a given + descriptor header. For use by PIL and PSL. + */ + inline TAny* HdrToHwDes(const SDmaDesHdr& aHdr) const; + + /** Returns the physical address of the hardware descriptor + pointed to by aDes. For use by PIL and PSL. + */ + inline TUint32 HwDesLinToPhys(TAny* aDes) const; + + /** Called by the PIL to acquire the controller lock which protects the + header and descriptor pools. + */ + inline void Wait(); + + /** Called by the PIL to release the controller lock which protects the + header and descriptor pools. + */ + inline void Signal(); + +public: + /** Called by PIL when one fragment (single-buffer and double-buffer DMACs) + or list of fragments (scatter/gather DMAC) is to be transferred. + + Called when initiating a new transfer and also, for double-buffer + DMACs, for configuring the next fragment to transfer while the current + one is ongoing. + + The function must be implemented by the PSL if + SCreateInfo::iCaps::iAsymHwDescriptors is reported as false. + + @note This function may be called in thread or ISR context by the PIL + + @param aChannel The channel to use. + @param aHdr Header associated with fragment to transfer. + */ + virtual void Transfer(const TDmaChannel& aChannel, const SDmaDesHdr& aHdr); + + /** Called by PIL when two lists of fragments (scatter/gather DMAC with + asymmetrical linked-list capability) are to be transferred. + + Called when initiating a new transfer. + + The function must be implemented by the PSL if + SDmaCaps::iAsymHwDescriptors is reported as true. + + @note This function may be called in thread or ISR context by the PIL + + @param aChannel The channel to use. + @param aSrcHdr Header associated with descriptor to transfer on the + source side. + @param aDstHdr Header associated with descriptor to transfer on the + destination side. + */ + virtual void Transfer(const TDmaChannel& aChannel, const SDmaDesHdr& aSrcHdr, + const SDmaDesHdr& aDstHdr); + + /** Called by PIL to stop a transfer on a given channel. + + The stopping must occur synchronously as the PIL assumes the channel + is halted after calling this function. A channel stopped via this + function is not intended to be resumed. Function must always be + implemented by the PSL. + + @param aChannel The channel to stop + @post The channel will be idle + @post No interrupt will occur from this channel until a new + request is queued. + */ + virtual void StopTransfer(const TDmaChannel& aChannel) = 0; + + /** Called by PIL to pause (suspend) a transfer on a given channel. + + A paused channel transfer must be able to be resumed by calling + ResumeTransfer(). + + The function must be implemented by the PSL if + SDmacCaps::iChannelPauseAndResume is reported as true. + + @return KErrNone if the transfer has been paused successfully, + KErrCompletion if the transfer was already paused, KErrGeneral + if a general error occurred preventing a successful outcome. + + @post No interrupt will occur from this channel until it is + resumed. + */ + virtual TInt PauseTransfer(const TDmaChannel& aChannel); + + /** Called by PIL to resume a paused (suspended) transfer on a given + channel. + + Resume() can be called when the transfer is paused as a result of a + previous call to PauseTransfer() or because the DMAC has encountered a + Pause bit in a H/W descriptor. + + The function must be implemented by the PSL if + SDmacCaps::iChannelPauseAndResume is reported as true. + + @return KErrNone if the transfer has been resumed successfully, + KErrCompletion if there was no paused transfer, KErrGeneral + if a general error occurred preventing a successful outcome. + */ + virtual TInt ResumeTransfer(const TDmaChannel& aChannel); + + /** Called by PIL to check whether a DMA channel is idle. + + 'Idle' here means that the channel is ultimately stopped, for example + because the transfer has finished, or an error was encountered, or it + was manually stopped, but not because it was manually suspended (aka + 'paused'), or it is waiting for a request line assertion to start the + transfer. + + @param aChannel The channel to test + + @return ETrue if channel idle, EFalse if transferring. + */ + virtual TBool IsIdle(const TDmaChannel& aChannel) = 0; + + /** Called by PIL to retrieve from the PSL the maximum transfer length + based on the parameters passed. + + @param aChannel Channel to be used for the transfer + @param aSrcFlags Bitmask characterising transfer source + @see TDmaTransferArgs::iSrcConfig::iFlags + @param aDstFlags Bitmask characterising transfer destination + @see TDmaTransferArgs::iDstConfig::iFlags + @param aPslInfo Cookie passed by client and used by the PSL + @see TDmaTransferArgs::iPslRequestInfo + + @return 0 if transfer length is not limited, the maximum transfer + length in bytes otherwise. + */ + virtual TUint MaxTransferLength(TDmaChannel& aChannel, TUint aSrcFlags, + TUint aDstFlags, TUint32 aPslInfo) = 0; + + /** Called by PIL to retrieve from the PSL the memory alignment mask based + on the parameters passed. Some DMA controllers impose alignment + constraints on the base address of memory buffers. This mask is AND'ed + against memory addresses computed during fragmentation. + + The PIL will call this function separately for source and destination. + + An assumption is that the PSL doesn't need to know if a call to this + function is for the source or the destination side, i.e. both ports + are, as far as the alignment is concerned, equivalent. All that matters + are the values of the relevant configuration parameters. + + Another assumption is that the alignment requirement for a port on a + DMAC with potentially different values for source and destination does + not depend on the configuration of the respective other port. + + @param aChannel Channel used for the transfer + @param aTargetFlags Bitmask characterising transfer source or + destination + @see TDmaTransferArgs::iSrcConfig::iFlags + @see TDmaTransferArgs::iDstConfig::iFlags + @param aElementSize Element size used for the transfer. May be zero if + not known or 'don't care'. + @param aPslInfo Cookie passed by client and used by the PSL + @see TDmaTransferArgs::iPslRequestInfo + + @return A value representing the alignment mask (e.g. 3 if buffer must + be 4-byte aligned) + */ + virtual TUint AddressAlignMask(TDmaChannel& aChannel, TUint aTargetFlags, + TUint aElementSize, TUint32 aPslInfo) = 0; + + /** Called by PIL during fragmentation to initialise a hardware descriptor. + + The PSL must assume the descriptor is the last in the chain and so set + the interrupt bit and set the next descriptor field to an end of chain + marker. + + The function must be implemented by the PSL if and only if the DMAC + supports hardware descriptors and SDmaCaps::iAsymHwDescriptors is + reported as false. + + @param aHdr Header associated with the hardware descriptor to + initialise + @param aTransferArgs The transfer parameters for this descriptor + + @return KErrNone if the descriptor was successfully initialized, + KErrArgument if any of the transfer arguments were detected to be + invalid, KErrGeneral if a general error occurred preventing a + successful outcome. + */ + virtual TInt InitHwDes(const SDmaDesHdr& aHdr, const TDmaTransferArgs& aTransferArgs); + + /** Called by PIL during fragmentation to initialise a hardware descriptor + on the source side of an asymmetric linked list. + + The function must be implemented by the PSL if + SDmaCaps::iAsymHwDescriptors is reported as true. + + @param aHdr Header associated with the hardware descriptor to + initialise + @param aTransferArgs The transfer parameters for this descriptor. Only + the elements relating to the source side should be relevant to the + implementation. + + @return KErrNone if the descriptor was successfully initialized, + KErrArgument if any of the transfer arguments were detected to be + invalid, KErrGeneral if a general error occurred preventing a + successful outcome. + */ + virtual TInt InitSrcHwDes(const SDmaDesHdr& aHdr, const TDmaTransferArgs& aTransferArgs); + + /** Called by PIL during fragmentation to initialise a hardware descriptor + on the destination side of an asymmetric linked list. + + The function must be implemented by the PSL if + SDmaCaps::iAsymHwDescriptors is reported as true. + + @param aHdr Header associated with the hardware descriptor to + initialise + @param aTransferArgs The transfer parameters for this descriptor. Only + the elements relating to the destination side should be relevant to the + implementation. + + @return KErrNone if the descriptor was successfully initialized, + KErrArgument if any of the transfer arguments were detected to be + invalid, KErrGeneral if a general error occurred preventing a + successful outcome. + */ + virtual TInt InitDstHwDes(const SDmaDesHdr& aHdr, const TDmaTransferArgs& aTransferArgs); + + /** Called by the PIL in ISR context to change specific fields in a + hardware descriptor. + + The function must be implemented by the PSL if and only if the DMAC + supports hardware descriptors and SDmaCaps::iAsymHwDescriptors is + reported as false. + + @param aHdr Header associated with the hardware descriptor to be + updated + @param aSrcAddr @see TDmaTransferArgs::iSrcConfig::iAddr + @param aDstAddr @see TDmaTransferArgs::iDstConfig::iAddr + @param aTransferCount @see TDmaTransferArgs::iTransferCount + @param aPslRequestInfo @see TDmaTransferArgs::iPslRequestInfo + + Since Epoc::LinearToPhysical() cannot be called in ISR context the + addresses passed into this function are always physical ones, i.e. + TDmaTransferFlags::KDmaPhysAddr is implied. + + @return KErrNone if the descriptor was successfully modified, + KErrArgument if any of the transfer arguments were detected to be + invalid, KErrGeneral if a general error occurred preventing a + successful outcome. + */ + virtual TInt UpdateHwDes(const SDmaDesHdr& aHdr, TUint32 aSrcAddr, TUint32 aDstAddr, + TUint aTransferCount, TUint32 aPslRequestInfo); + + /** Called by the PIL in ISR context to change specific fields in a + hardware descriptor. + + The function must be implemented by the PSL if + SDmaCaps::iAsymHwDescriptors is reported as true. + + @param aHdr Header associated with the hardware descriptor to be + updated + @param aSrcAddr @see TDmaTransferArgs::iSrcConfig::iAddr + @param aTransferCount @see TDmaTransferArgs::iTransferCount + @param aPslRequestInfo @see TDmaTransferArgs::iPslRequestInfo + + Since Epoc::LinearToPhysical() cannot be called in ISR context the + address passed into this function is always a physical ones, i.e. + TDmaTransferFlags::KDmaPhysAddr is implied. + + @return KErrNone if the descriptor was successfully modified, + KErrArgument if any of the transfer arguments were detected to be + invalid, KErrGeneral if a general error occurred preventing a + successful outcome. + */ + virtual TInt UpdateSrcHwDes(const SDmaDesHdr& aHdr, TUint32 aSrcAddr, + TUint aTransferCount, TUint32 aPslRequestInfo); + + /** Called by the PIL in ISR context to change specific fields in a + hardware descriptor. + + The function must be implemented by the PSL if + SDmaCaps::iAsymHwDescriptors is reported as true. + + @param aHdr Header associated with the hardware descriptor to be + updated + @param aDstAddr @see TDmaTransferArgs::iDstConfig::iAddr + @param aTransferCount @see TDmaTransferArgs::iTransferCount + @param aPslRequestInfo @see TDmaTransferArgs::iPslRequestInfo + + Since Epoc::LinearToPhysical() cannot be called in ISR context the + address passed into this function is always a physical ones, i.e. + TDmaTransferFlags::KDmaPhysAddr is implied. + + @return KErrNone if the descriptor was successfully modified, + KErrArgument if any of the transfer arguments were detected to be + invalid, KErrGeneral if a general error occurred preventing a + successful outcome. + */ + virtual TInt UpdateDstHwDes(const SDmaDesHdr& aHdr, TUint32 aDstAddr, + TUint aTransferCount, TUint32 aPslRequestInfo); + + /** Called by PIL, when fragmenting a request, to append a new hardware + descriptor to an existing descriptor chain. May also be called by + clients who wish to create their own descriptor chains. + + Must clear the interrupt bit of the descriptor associated with aHdr. + + The function must be implemented by the PSL if and only if the DMAC + supports hardware descriptors. + + @param aHdr Header associated with last fragment in chain + @param aNextHdr Header associated with fragment to append + */ + virtual void ChainHwDes(const SDmaDesHdr& aHdr, const SDmaDesHdr& aNextHdr); + + /** Called by PIL when queuing a new request while the channel is running. + + Must append the first hardware descriptor of the new request to the + last descriptor in the existing chain. + + The function must be implemented by the PSL if and only if the DMAC + supports hardware descriptors. + + @param aChannel The channel where the transfer takes place + @param aLastHdr Header associated with last hardware descriptor in + chain + @param aNewHdr Header associated with first hardware descriptor in new + request + */ + virtual void AppendHwDes(const TDmaChannel& aChannel, const SDmaDesHdr& aLastHdr, + const SDmaDesHdr& aNewHdr); + + /** Called by PIL when queuing a new request while the channel is running. + + Must append the first hardware descriptor of the new request to the + last descriptor in the existing chain. + + The function must be implemented by the PSL if + SDmaCaps::iAsymHwDescriptors is reported as true. + + @param aChannel The channel where the transfer takes place + @param aSrcLastHdr Header associated with the last descriptor in the + source side chain + @param aSrcNewHdr Header associated with the first source side + descriptor of the new request + @param aDstLastHdr Header associated with the last descriptor in the + destination side chain + @param aDstNewHdr Header associated with the first destination side + descriptor of the new request + */ + virtual void AppendHwDes(const TDmaChannel& aChannel, + const SDmaDesHdr& aSrcLastHdr, const SDmaDesHdr& aSrcNewHdr, + const SDmaDesHdr& aDstLastHdr, const SDmaDesHdr& aDstNewHdr); + + /** Called by PIL when completing or cancelling a request to cause the PSL + to unlink the last item in the h/w descriptor chain from a subsequent + chain that it was possibly linked to. + + The function must be implemented by the PSL if and only if the DMAC + supports hardware descriptors. + + @param aChannel The channel where the request (and thus the descriptor) + was queued + @param aHdr Header associated with last h/w descriptor in + completed / cancelled chain + */ + virtual void UnlinkHwDes(const TDmaChannel& aChannel, SDmaDesHdr& aHdr); + + /** Called by PIL when freeing descriptors back to the shared pool in + FreeDesList(). The PSL inside ClearHwDes() can clear the contents of + the h/w descriptor. + + This may be necessary if the PSL implementation uses the h/w descriptor + as another header which in turn points to the actual DMA h/w descriptor + (aka LLI). + + The function may be implemented by the PSL if the DMAC supports + hardware descriptors. + + @param aHdr Header associated with the h/w descriptor being freed. + */ + virtual void ClearHwDes(const SDmaDesHdr& aHdr); + + /** Called by PIL to logically link two physical channels. + + The function must be implemented by the PSL if the DMAC supports + logical channel linking. + + @see SDmacCaps::iChannelLinking + + @param a1stChannel The channel which is to be linked to another channel + @param a2ndChannel The channel the first one is to be linked to + + @return KErrNone if the two channels have been linked successfully, + KErrCompletion if a1stChannel was already linked to a2ndChannel, + KErrArgument if a1stChannel was already linked to a different channel, + KErrGeneral if a general error occurred preventing a successful + outcome. The default PIL implementation returns KErrNotSupported. + */ + virtual TInt LinkChannels(TDmaChannel& a1stChannel, TDmaChannel& a2ndChannel); + + /** Called by PIL to logically unlink a physical channel from its linked-to + successor. + + The function must be implemented by the PSL if the DMAC supports + logical channel linking. + + @see SDmacCaps::iChannelLinking + + @param aChannel The channel which is to be unlinked from its successor + + @return KErrNone if the channel has been unlinked successfully, + KErrCompletion if the channel was not linked to another channel, + KErrGeneral if a general error occurred preventing a successful + outcome. The default PIL implementation returns KErrNotSupported. + */ + virtual TInt UnlinkChannel(TDmaChannel& aChannel); + + /** Called by a test harness to force an error when the next fragment is + transferred. + + Must be implemented by the PSL only if possible. + + @param aChannel The channel where the error is to occur. + + @return KErrNone if implemented. The default PIL implementation + returns KErrNotSupported. + */ + virtual TInt FailNext(const TDmaChannel& aChannel); + + /** Called by a test harness to force the DMA controller to miss one or + more interrupts. + + The function must be implemented by the PSL only if possible. + + @param aChannel The channel where the error is to occur + @param aInterruptCount The number of interrupt to miss. + + @return KErrNone if implemented. The default PIL implementation + returns KErrNotSupported. + */ + virtual TInt MissNextInterrupts(const TDmaChannel& aChannel, TInt aInterruptCount); + + /** Function allowing platform-specific layer to extend channel API with + new channel-specific operations. + + @see TDmaChannel::ChannelExtension + + @param aChannel Channel to operate on + @param aCmd Command identifier. Negative values are reserved for use by + Nokia. + @param aArg PSL-specific argument + + @return KErrNotSupported if aCmd is not supported. PSL-specific value + otherwise. + */ + virtual TInt Extension(TDmaChannel& aChannel, TInt aCmd, TAny* aArg); + + /** Called by the PIL to query the number of elements that have so far been + transferred by the hardware descriptor associated with aHdr at the + source port. + + If SDmacCaps::iAsymHwDescriptors is true then the PIL will call this + function only for source-side descriptors, and the PSL should fault the + kernel if this is not the case. + + The function must be implemented (i.e. overridden) by the PSL if and + only if the DMAC supports hardware descriptors. + + @param aHdr Descriptor header associated with the hardware descriptor + to be queried + + @return The number of elements that have been transferred by the + hardware descriptor associated with aHdr at the source port + */ + virtual TUint32 HwDesNumSrcElementsTransferred(const SDmaDesHdr& aHdr); + + /** Called by the PIL to query the number of elements that have so far been + transferred by the hardware descriptor associated with aHdr at the + destination port. + + If SDmacCaps::iAsymHwDescriptors is true then the PIL will call this + function only for destination-side descriptors, and the PSL should + panic if this is not the case. + + The function must be implemented (i.e. overridden) by the PSL if and + only if the DMAC supports hardware descriptors. + + @param aHdr Descriptor header associated with the hardware descriptor + to be queried + + @return The number of elements that have been transferred by the + hardware descriptor associated with aHdr at the destination port + */ + virtual TUint32 HwDesNumDstElementsTransferred(const SDmaDesHdr& aHdr); + +protected: + /** Called by the PSL in interrupt context upon a channel interrupt event. + + @param aChannel The channel the ISR relates to + @param aEventMask Bitmask of one or more TDmaCallbackType values + @param aIsComplete Set to ETrue if no error was encountered + */ + static void HandleIsr(TDmaChannel& aChannel, TUint aEventMask, TBool aIsComplete); + +private: + /** Called in Create() */ + TInt AllocDesPool(TUint aAttribs); + + /** Called in ~TDmac() */ + void FreeDesPool(); + +private: + NFastMutex iLock; // protect descriptor reservation and allocation + const TInt iMaxDesCount; // initial number of descriptors and headers + TInt iAvailDesCount; // current available number of descriptors and headers + SDmaDesHdr* iHdrPool; // descriptor header dynamic array +#ifndef __WINS__ + DPlatChunkHw* iHwDesChunk; // chunk for hardware descriptor pool +#endif + TAny* iDesPool; // hardware or pseudo descriptor dynamic array + const TInt iDesSize; // descriptor size in bytes + +public: + const TBool iCapsHwDes; /*< True if DMAC uses h/w descriptors */ + SDmaDesHdr* iFreeHdr; /*< head of unallocated descriptors linked list */ + +#ifdef _DEBUG + /** Tests whether aHdr points into the descriptor header array. */ + TBool IsValidHdr(const SDmaDesHdr* aHdr); +#endif + __DMA_DECLARE_INVARIANT + }; + + +////////////////////////////////////////////////////////////////////////////// + + +/** Single-buffer DMA channel. + + Can be instantiated or further derived by the PSL. + + @publishedPartner + @released +*/ +class TDmaSbChannel : public TDmaChannel + { +private: + virtual void DoQueue(const DDmaRequest& aReq); + virtual void DoCancelAll(); + virtual void DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); +private: + enum {EIdle = 0, ETransferring} iState; + }; + + +/** Double-buffer DMA channel. + + Can be instantiated or further derived by the PSL. + + @publishedPartner + @released +*/ +class TDmaDbChannel : public TDmaChannel + { +private: + virtual void DoQueue(const DDmaRequest& aReq); + virtual void DoCancelAll(); + virtual void DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); +private: + enum {EIdle = 0, ETransferring, ETransferringLast} iState; + }; + + +/** Scatter-gather DMA channel. + + Can be instantiated or further derived by the PSL. + + @publishedPartner + @released +*/ +class TDmaSgChannel : public TDmaChannel + { +private: + virtual void DoQueue(const DDmaRequest& aReq); + virtual void DoCancelAll(); + virtual void DoUnlink(SDmaDesHdr& aHdr); + virtual void DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); +private: + enum {EIdle = 0, ETransferring} iState; + }; + + +/** Scatter-gather DMA channel with asymmetric linked-lists. + + Can be instantiated or further derived by the PSL. + + @publishedPartner + @released +*/ +class TDmaAsymSgChannel : public TDmaChannel + { +private: + virtual void DoQueue(const DDmaRequest& aReq); + virtual void DoCancelAll(); + virtual void DoUnlink(SDmaDesHdr& aHdr); + virtual void DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aSrcCompletedHdr, + SDmaDesHdr*& aDstCompletedHdr); +private: + SDmaDesHdr* iSrcCurHdr; // source fragment being transferred or NULL + SDmaDesHdr** iSrcNullPtr; // Pointer to NULL pointer following last source fragment + SDmaDesHdr* iDstCurHdr; // destination fragment being transferred or NULL + SDmaDesHdr** iDstNullPtr; // Pointer to NULL pointer following last destination fragment + enum {EIdle = 0, ETransferring} iState; + }; + + +////////////////////////////////////////////////////////////////////////////// + + +#include + + +#endif // #ifndef __DMA_HAI_H__ diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/drivers/dma_hai.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/include/drivers/dma_hai.inl Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,54 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// include/drivers/dma_hai.inl +// DMA Framework - Symbian Hardware Abstraction Interface (SHAI). +// +// + + +// TDmac + +inline void TDmac::Wait() + { + NKern::FMWait(&iLock); + } + +inline void TDmac::Signal() + { + NKern::FMSignal(&iLock); + } + +inline TDmaTransferArgs& TDmac::HdrToDes(const SDmaDesHdr& aHdr) const + { + return static_cast(iDesPool)[&aHdr - iHdrPool]; + } + +inline TAny* TDmac::HdrToHwDes(const SDmaDesHdr& aHdr) const + { + return static_cast(iDesPool) + iDesSize * (&aHdr - iHdrPool); + } + +inline TUint32 TDmac::HwDesLinToPhys(TAny* aDes) const + { +#ifdef __WINS__ + (void)aDes; + return 0xDEADBEEF; +#else + return iHwDesChunk->iPhysAddr + + (reinterpret_cast(aDes) - iHwDesChunk->iLinAddr); +#endif + } + + +// --- diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/drivers/dma_v1.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/include/drivers/dma_v1.h Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,834 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// include/drivers/dma_v1.h +// DMA Framework API v1 +// +// NB: DMA clients should never include this file directly, but only ever the +// generic header file . +// + +#ifndef __DMA_H__ +#error "dma_v1.h must'n be included directly - use instead" +#endif // #ifndef __DMA_H__ + +#ifndef __DMA_V1_H__ +#define __DMA_V1_H__ + +#include + + +////////////////////////////////////////////////////////////////////////////// +// Debug Support - KDmaPanicCat is defined in each source file + +#define __DMA_ASSERTD(e) __ASSERT_DEBUG(e, Kern::Fault(KDmaPanicCat, __LINE__)) +#define __DMA_ASSERTA(e) __ASSERT_ALWAYS(e, Kern::Fault(KDmaPanicCat, __LINE__)) +#ifdef _DEBUG +#define __DMA_CANT_HAPPEN() Kern::Fault(KDmaPanicCat, __LINE__) +#define __DMA_DECLARE_INVARIANT public: void Invariant(); +#define __DMA_INVARIANT() Invariant() +#else +#define __DMA_CANT_HAPPEN() +#define __DMA_DECLARE_INVARIANT +#define __DMA_INVARIANT() +#endif + + +////////////////////////////////////////////////////////////////////////////// +// INTERFACE EXPOSED TO DEVICE-DRIVERS +////////////////////////////////////////////////////////////////////////////// + +/** +Bitmasks used for configuring a DMA request. + +In general, specify KDmaMemSrc|KDmaIncSrc (resp. KDmaMemDest|KDmaIncDest) if +the source (resp. destination) is a memory buffer and clear +KDmaMemSrc|KDmaIncSrc (resp. KDmaMemDest|KDmaIncDest) if the source +(resp. destination) is a peripheral. + +If the location is given as a physical address (rather than a linear one) +then also specify KDmaPhysAddrSrc and/or KDmaPhysAddrDest. + +The EKA1 "Fill Mode" can be implemented by omitting KDmaIncSrc. + +Some peripherals may require a post-increment address mode. + +@see DDmaRequest::Fragment +@publishedPartner +@released +*/ + +enum TDmaRequestFlags + { + /** Source is address of memory buffer */ + KDmaMemSrc = 0x01, + /** Destination is address of memory buffer */ + KDmaMemDest = 0x02, + /** Source address must be post-incremented during transfer */ + KDmaIncSrc = 0x04, + /** Destination address must be post-incremented during transfer */ + KDmaIncDest = 0x08, + /** Source address is a physical address (as opposed to a linear one) */ + KDmaPhysAddrSrc = 0x10, + /** Destination address is a physical address (as opposed to a linear one) */ + KDmaPhysAddrDest = 0x20, + /** Request a different max transfer size (for instance for test purposes) */ + KDmaAltTransferLen = 0x40 + }; + + +////////////////////////////////////////////////////////////////////////////// + +class TDmaChannel; +struct SDmaDesHdr; + +/** A DMA request is a list of fragments small enough to be transferred in one go + by the DMAC. + + In general, fragmentation is done in the framework by calling Fragment() but + clients with special needs can allocate a blank descriptor list with + ExpandDesList() and customise it to fit their needs. + + Clients should not set attributes directly, but should use the various functions + instead. + + This class has not been designed to be called from several concurrent threads. + Multithreaded clients must implement their own locking scheme (via DMutex). + + Fast mutexes are used internally to protect data structures accessed both + by the client thread and the DFC thread. Therefore no fast mutex can be held + when calling a request function. + + @publishedPartner + @released + */ +class DDmaRequest : public DBase + { + friend class TDmaChannel; +public: + /** The outcome of the transfer */ + enum TResult {EBadResult=0, EOk, EError}; + /** The signature of the completion/failure callback function */ + typedef void (*TCallback)(TResult, TAny*); +public: + + /** + Create a new transfer request. + + @param aChannel The channel this request is bound to. + @param aCb Callback function called on transfer completion or failure (in channel + DFC context). Can be NULL. + @param aCbArg Argument passed to callback function. + @param aMaxTransferSize Maximum fragment size. If not specified, defaults to the maximum size + supported by the DMA controller for the type of transfer that is later scheduled. + */ + IMPORT_C DDmaRequest(TDmaChannel& aChannel, TCallback aCb=NULL, TAny* aCbArg=NULL, TInt aMaxTransferSize=0); + + + /** + Destructor. + + Assume the request is not being transferred or pending. + */ + IMPORT_C ~DDmaRequest(); + + + /** + Split request into a list of fragments small enough to be fed to the DMAC. + + The size of each fragment is smaller than or equal to the maximum transfer size + supported by the DMAC. If the source and/or destination is memory, each + fragment points to memory which is physically contiguous. + + The kind of transfer to perform is specified via a set of flags used by a PIL + and a magic cookie passed to the PSL. If the source (resp. destination) is a + peripheral, aSrc (resp. aDest) is treated as a magic cookie by the PIL and + passed straight to the PSL. + + The request can be uninitialised or may have been fragmented previously. The + previous configuration if any is lost whether or not the function succeeds. + + @param aSrc Source memory buffer linear address or peripheral magic cookie. + @param aDest Destination memory buffer linear address or peripheral magic cookie. + @param aCount Number of bytes to transfer. + @param aFlags Bitmask characterising the transfer. + @param aPslInfo Hardware-specific information passed to PSL. + + @return KErrNone if success. KErrArgument if aFlags and/or aPslInfo are invalid when finding + the maximum transfer size. May also fail if running out of descriptors. + + @pre The request is not being transferred or pending. + @pre The various parameters must be valid. The PIL or PSL will fault the + kernel if not. + + @see TDmaRequestFlags + */ + IMPORT_C TInt Fragment(TUint32 aSrc, TUint32 aDest, TInt aCount, TUint aFlags, TUint32 aPslInfo); + + + /** + Transfer asynchronously this request. + + If this request's channel is idle, the request is transferred immediately. + Otherwise, it is queued and transferred later. + + The client is responsible for ensuring cache consistency before and/or after the + transfer if necessary. + */ + IMPORT_C void Queue(); + + + /** + Append new descriptor(s) to existing list. + + Clients needing to build a custom descriptor list should call this function to + allocate the list and access the resulting list through iFirstHdr and iLastHdr. + + Clients should not change the value of iFirstHdr, iLastHdr and the iNext field + of the descriptor headers to ensure descriptors can be deallocated. Clients + are free to change hardware descriptors, including chaining, in whatever way + suit them. + + Assume the request is not being transferred or pending. + + @param aCount Number of descriptors to append. + + @return KErrNone or KErrTooBig if not enough descriptors available. + */ + IMPORT_C TInt ExpandDesList(TInt aCount=1); + + + /** + Free resources associated with this request. + + Assume the request is not being transferred or pending. + */ + IMPORT_C void FreeDesList(); +private: + inline void OnDeque(); +public: + // WARNING: The following attributes are accessed both in client and DFC + // context and so accesses must be protected with the channel lock. + TDmaChannel& iChannel; /**< The channel this request is bound to */ + volatile TCallback iCb; /**< Called on completion/failure (can be NULL) */ + TAny* volatile iCbArg; /**< Callback argument */ + TInt iDesCount; /**< The number of fragments in list */ + SDmaDesHdr* iFirstHdr; /**< The first fragment in the list (or NULL) */ + SDmaDesHdr* iLastHdr; /**< The last fragment in the list (or NULL) */ + SDblQueLink iLink; /**< The link on channel queue of pending requests */ + TBool iQueued; /**< Indicates whether request is pending or being transferred */ + TInt iMaxTransferSize; /**< Defaults to DMA controller max. transfer size */ + __DMA_DECLARE_INVARIANT + }; + + +////////////////////////////////////////////////////////////////////////////// + +class TDmac; +class DmaChannelMgr; + +/** DMA channel base class. + + This class has not been designed to be called from several concurrent + client threads. Multithreaded clients must implement their own locking + scheme (via DMutex). + + Fast mutexes are used internally to protect data structures accessed both + by the client thread and the DFC one. Therefore no fast mutex can be held + when calling a channel function. + + Must be allocated in BSS because it relies on being zeroed at + creation-time. If the PSL really needs to allocate channels on the kernel + heap, it must manually zero-initialises the instances. This can be + achieved either by allocating raw memory and using placement new, or by + wrapping channels into a DBase-derived wrapper. + + @publishedPartner + @released + */ +class TDmaCancelInfo; +class TDmaChannel + { + friend class DDmaRequest; + friend class TDmac; + friend class DmaChannelMgr; +public: + /** Information passed by client when opening channel */ + struct SCreateInfo + { + /** Identifier used by PSL to select channel to open */ + TUint32 iCookie; + /** Number of descriptors this channel can use */ + TInt iDesCount; + /** DFC queue used to service DMA interrupts. The DFC thread + priority must be higher than any client thread priority to + avoid a situation where a transfer completes while being + cancelled and another transfer is started before the DFC + thread gets a chance to run. This would lead to a stray + DFC. + */ + TDfcQue* iDfcQ; + /** DFC priority */ + TUint8 iDfcPriority; + }; +public: + /** + Opens the DMA channel. + + Channel selection is done by the hardware-specific layer using a cookie passed in + via aInfo. + + The client should not delete the returned pointer as the framework owns + channel objects. However, the client should explicitly close the channel when + finished with it. + + @param aInfo Information passed by caller to select and configure channel. + @param aChannel Point to open channel on successful return. NULL otherwise. + + @return KErrNone or standard error code. + */ + IMPORT_C static TInt Open(const SCreateInfo& aInfo, TDmaChannel*& aChannel); + + + /** + Closes a previously opened DMA channel. + + Assume the channel is idle and all requests have been deleted. + */ + IMPORT_C void Close(); + + + /** + Cancels the current request and all the pending ones. + */ + IMPORT_C void CancelAll(); + inline TBool IsOpened() const; + inline TBool IsQueueEmpty() const; + inline TUint32 PslId() const; + inline TInt FailNext(TInt aFragmentCount); + inline TInt MissNextInterrupts(TInt aInterruptCount); + inline TInt Extension(TInt aCmd, TAny* aArg); + + /** + This is a function that allows the Platform Specific Layer (PSL) to extend the DMA API + with new channel-independent operations. + + @param aCmd Command identifier. Negative values are reserved for Symbian use. + @param aArg PSL-specific. + + @return KErrNotSupported if aCmd is not supported; a PSL specific value otherwise. + */ + IMPORT_C TInt StaticExtension(TInt aCmd, TAny* aArg); + inline const TDmac* Controller() const; + inline TInt MaxTransferSize(TUint aFlags, TUint32 aPslInfo); + inline TUint MemAlignMask(TUint aFlags, TUint32 aPslInfo); +protected: + // Interface with state machines + TDmaChannel(); + virtual void DoQueue(DDmaRequest& aReq) = 0; + virtual void DoCancelAll() = 0; + virtual void DoUnlink(SDmaDesHdr& aHdr); + virtual void DoDfc(DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr) = 0; + /** + This function allows the Platform Specific Layer (PSL) to control the + power management of the channel or its controller by overriding the + PIL's default implementation (which does nothing) and making appropriate + use of the Power Resource Manager (PRM). + + The function gets called by the PIL whenever the channel's queued + requests count has changed in a significant way, either before the + channel's Transfer() method is invoked for a request on a previously + empty request queue, or immediately after the request count has become + zero because of request cancellation or completion. + + Depending on the current value of iQueuedRequests, the PSL may power + down or power up the channel. Note that iQueuedRequests gets accessed + and changed by different threads, so the PSL needs to take the usual + precautions when evaluating the variable's value. + + None of the internal DMA framework mutexes is being held by the PIL when + calling this function. + + @see iQueuedRequests + */ + virtual void QueuedRequestCountChanged(); +#if defined(__CPU_ARM) && !defined(__EABI__) + inline virtual ~TDmaChannel() {} // kill really annoying warning +#endif +private: + static void Dfc(TAny*); + void DoDfc(); + inline void Wait(); + inline void Signal(); + inline TBool Flash(); + void ResetStateMachine(); +protected: + TDmac* iController; // DMAC this channel belongs to (NULL when closed) + TUint32 iPslId; // unique identifier provided by PSL + NFastMutex iLock; // for data accessed in both client & DFC context + SDmaDesHdr* iCurHdr; // fragment being transferred or NULL + SDmaDesHdr** iNullPtr; // Pointer to NULL pointer following last fragment + TDfc iDfc; // transfer completion/failure DFC + TInt iMaxDesCount; // maximum number of allocable descriptors + TInt iAvailDesCount; // available number of descriptors + volatile TUint32 iIsrDfc; // Interface between ISR and DFC: + enum { KErrorFlagMask = 0x80000000 }; // bit 31 - error flag + enum { KCancelFlagMask = 0x40000000 }; // bit 30 - cancel flag + enum { KDfcCountMask = 0x3FFFFFFF }; // bits 0-29 - number of queued DFCs + SDblQue iReqQ; // being/about to be transferred request queue + TInt iReqCount; // number of requests attached to this channel + TInt iQueuedRequests; // number of requests currently queued on this channel +private: + TDmaCancelInfo* iCancelInfo; + __DMA_DECLARE_INVARIANT + }; + + +////////////////////////////////////////////////////////////////////////////// +// PIL-PSL INTERFACE +////////////////////////////////////////////////////////////////////////////// + +/** +Generic DMA descriptor used if the DMAC does not have support for hardware +descriptor. +@see DDmaRequest::Fragment +@publishedPartner +@released +*/ + +struct SDmaPseudoDes + { + /** Source linear address or peripheral cookie */ + TUint32 iSrc; + /** Destination linear address or peripheral cookie */ + TUint32 iDest; + /** Number of bytes to transfer */ + TInt iCount; + /** @see TDmaRequestFlags */ + TUint iFlags; + /** PSL-specific information provided by client */ + TUint32 iPslInfo; + /** The same as TDmaChannel::SCreateInfo.iCookie */ + TUint32 iCookie; + }; + + +/** +Each hardware or pseudo descriptor is associated with a header. Headers are +needed because hardware descriptors can not easily be extended to store +additional information. +@publishedPartner +@released +*/ + +struct SDmaDesHdr + { + SDmaDesHdr* iNext; + }; + + +/** +Interface used by PIL to open and close DMA channels. + +Must be implemented by PSL. +@publishedPartner +@released +*/ + +class DmaChannelMgr + { +public: + /** Opens a channel using a client-provided identifier. + This function must be implemented by the PSL. + @param aOpenId Magic cookie passed by client + This may identify the channel (if a static channel + allocation scheme is used) or may indicate some + properties which the channel must possess (if a dynamic + channel allocation scheme is used). It may be set to + zero always if dynamic allocation is used and all + channels are equivalent. + @return Pointer to channel if available, NULL otherwise. + @pre The PIL calls this function with a global fast mutex held to + avoid race conditions. + @post If a non-NULL pointer is returned, the object pointed to has its + iController and iPslId members set to valid states. + iController should point to the controller handling that channel. + iPslId should contain a value uniquely identifying the channel - + it is used only for debug tracing by PIL. It can be given any + convenient value by PSL (channel index, I/O port address, ...). + */ + static TDmaChannel* Open(TUint32 aOpenId); + + /** Performs platform-specific operations when a channel is closed. + This function must be implemented by the PSL but the implementation can be + a no-op. + @param aChannel The channel to close + @pre The PIL calls this function with a global fast mutex held to + avoid race conditions. + */ + static void Close(TDmaChannel* aChannel); + + /** Function allowing PSL to extend DMA API with new channel-independent operations. + This function must be implemented by the PSL. + @param aCmd Command identifier. Negative values are reserved for Symbian use. + @param aArg PSL-specific + @return KErrNotSupported if aCmd is not supported. PSL-specific value otherwise. + */ + static TInt StaticExtension(TInt aCmd, TAny* aArg); + + static inline void Wait(); + static inline void Signal(); +private: + static NFastMutex Lock; + }; + + +////////////////////////////////////////////////////////////////////////////// + +/** + Abstract base class representing a DMA controller. + + The class has two purposes. + + First, it is a container for channels, descriptors and descriptor headers. + + Second, it exposes a set of virtual functions implemented by + the PSL (platform-specific layer). + These functions are the main interfaces between + the PIL (platform-independent layer) and PSL. + + Must be allocated in BSS because it relies on being zeroed at creation-time. + + @publishedPartner + @released + */ + +class TDmac + { + friend class DmaChannelMgr; +// protected: VC++ complains when building PSL if following decl is protected +public: + /** Data required for creating a new instance */ + struct SCreateInfo + { + /** Number of channels in controller */ + TInt iChannelCount; + /** Maximum number of descriptors (shared by all channels) */ + TInt iDesCount; + /** Bitmask. The only supported value is KCapsBitHwDes (hardware + descriptors used). */ + TUint32 iCaps; + /** Size of individual descriptors. Use sizeof(SDmaPseudoDes) for + single-buffer and double-buffer controllers. */ + TInt iDesSize; + /** Bitmask used when creating the hardware chunk storing the descriptor + pool. Used only for hardware descriptors. The access part must be + EMapAttrSupRw. If the chunk is cached and/or buffered, the PSL must + flush the data cache and/or drain the write buffer in InitHwDes() + and related functions. + @see TMappingAttributes + */ + TUint iDesChunkAttribs; + }; +public: + TInt Create(const SCreateInfo& aInfo); + virtual ~TDmac(); + TInt ReserveSetOfDes(TInt aCount); + void ReleaseSetOfDes(TInt aCount); + void InitDes(const SDmaDesHdr& aHdr, TUint32 aSrc, TUint32 aDest, TInt aCount, + TUint aFlags, TUint32 aPslInfo, TUint32 aCookie); + inline SDmaPseudoDes& HdrToDes(const SDmaDesHdr& aHdr) const; + inline TAny* HdrToHwDes(const SDmaDesHdr& aHdr) const; + inline TUint32 DesLinToPhys(TAny* aDes) const; + inline void Wait(); + inline void Signal(); +protected: + TDmac(const SCreateInfo& aInfo); + +public: + /** + Called by PIL when one fragment (single-buffer and double-buffer DMACs) or + list of fragments (scatter/gather DMAC) is to be transferred. + + Called when initiating a new transfer and also, for double-buffer DMACs, for + configuring the next fragment to transfer while the current one is + ongoing. Must always be implemented by PSL. + @param aChannel The channel to use + @param aHdr Header associated with fragment to transfer + */ + virtual void Transfer(const TDmaChannel& aChannel, const SDmaDesHdr& aHdr) = 0; + + /** + Called by PIL to suspend transfer on a given channel. + + The suspension must occur synchronously as the PSL assumes the channel + is suspended after calling this function. Must always be implemented by PSL. + @param aChannel The channel to suspend + */ + virtual void StopTransfer(const TDmaChannel& aChannel) = 0; + + /** + Called by PIL to check whether a DMA channel is idle. + @param aChannel The channel to test + @return ETrue if channel idle, EFalse if transferring. + */ + virtual TBool IsIdle(const TDmaChannel& aChannel) = 0; + + /** + Called by PIL to retrieve from the PSL the maximum transfer size based on the + parameters passed. + @param aChannel Channel to be used for the transfer + @param aFlags Bitmask characterising transfer + @param aPslInfo Cookie passed by client and used by PSL + @return 0 if invalid argument(s), -1 if transfer size not limited, the maximum + transfer size otherwise. + */ + virtual TInt MaxTransferSize(TDmaChannel& aChannel, TUint aFlags, TUint32 aPslInfo) = 0; + + /** + Called by PIL to retrieve from the PSL the memory alignment mask based on the + parameters passed. Some DMA controllers impose alignment constraints on the base + address of memory buffers. This mask is AND'ed against memory addresses computed + during fragmentation. + @param aChannel Channel to be used for the transfer + @param aFlags Bitmask characterising transfer + @param aPslInfo Cookie passed by client and used by PSL + @return A value representing the alignment mask (e.g. 3 if buffer must be 4-byte aligned) + */ + virtual TUint MemAlignMask(TDmaChannel& aChannel, TUint aFlags, TUint32 aPslInfo) = 0; + + /** + Called by PIL during fragmentation to initialise a hardware descriptor. + + The PSL must assume the descriptor is the last in the chain and so set the + interrupt bit and set the next descriptor field to an end of chain marker. + Must be implemented by PSL if and only if the DMAC supports hardware + descriptors. + @param aHdr Header associated with hardware descriptor to initialise + @param aSrc Transfer source + @param aDest Transfer destination + @param aCount Number of bytes to transfer (<= max. size supported by DMAC) + @param aFlags Bitmask characterising transfer + @param aPslInfo Cookie passed by client and used by PSL + @param aCookie the channel selection cookie + @see DDmaRequest::Fragment + */ + virtual void InitHwDes(const SDmaDesHdr& aHdr, TUint32 aSrc, TUint32 aDest, TInt aCount, + TUint aFlags, TUint32 aPslInfo, TUint32 aCookie); + + /** + Called by PIL, when fragmenting a request, to append a new hardware + descriptor to an existing descriptor chain. + + Must clear the interrupt bit of the descriptor associated with aHdr. + Must be implemented by PSL if and only if the DMAC supports hardware descriptors. + @param aHdr Header associated with last fragment in chain + @param aNextHdr Header associated with fragment to append + */ + virtual void ChainHwDes(const SDmaDesHdr& aHdr, const SDmaDesHdr& aNextHdr); + + /** + Called by PIL when queuing a new request while the channel is running. + + Must append the first hardware descriptor of the new request to the last + descriptor in the existing chain. Must be implemented by PSL if and only if + the DMAC supports hardware descriptors. + @param aChannel The channel where the transfer takes place + @param aLastHdr Header associated with last hardware descriptor in chain + @param aNewHdr Header associated with first hardware descriptor in new request + */ + virtual void AppendHwDes(const TDmaChannel& aChannel, const SDmaDesHdr& aLastHdr, + const SDmaDesHdr& aNewHdr); + + /** + Called by PIL when completing or cancelling a request to cause the PSL to unlink + the last item in the h/w descriptor chain from a subsequent chain that it was + possibly linked to. Must be implemented by the PSL if and only if the DMAC supports + hardware descriptors. + + @param aChannel The channel where the request (and thus the descriptor) was queued + @param aHdr Header associated with last h/w descriptor in completed/cancelled chain + */ + virtual void UnlinkHwDes(const TDmaChannel& aChannel, SDmaDesHdr& aHdr); + + /** + Called by test harness to force an error when the next fragment is + transferred. + + Must be implemented by the PSL only if possible. + @param aChannel The channel where the error is to occur. + @return KErrNone if implemented. The default PIL implementation returns + KErrNotSupported and the test harness knows how to deal with that. + */ + virtual TInt FailNext(const TDmaChannel& aChannel); + + /** + Called by test harness to force the DMA controller to miss one or + more interrupts. + + Must be implemented by the PSL only if possible. + @param aChannel The channel where the error is to occur + @param aInterruptCount The number of interrupt to miss. + @return KErrNone if implemented. The default PIL implementation returns + KErrNotSupported and the test harness knows how to deal with that. + */ + virtual TInt MissNextInterrupts(const TDmaChannel& aChannel, TInt aInterruptCount); + + /** Function allowing platform-specific layer to extend channel API with + new channel-specific operations. + @param aChannel Channel to operate on + @param aCmd Command identifier. Negative values are reserved for Symbian use. + @param aArg PSL-specific + @return KErrNotSupported if aCmd is not supported. PSL-specific value otherwise. + @see TDmaChannel::Extension + */ + virtual TInt Extension(TDmaChannel& aChannel, TInt aCmd, TAny* aArg); + +protected: + static void HandleIsr(TDmaChannel& aChannel, TBool aIsComplete); +private: + TInt AllocDesPool(TUint aAttribs); + void FreeDesPool(); +private: + NFastMutex iLock; // protect descriptor reservation and allocation + const TInt iMaxDesCount; // initial number of descriptors and headers + TInt iAvailDesCount; // current available number of descriptors and headers + SDmaDesHdr* iHdrPool; // descriptor header dynamic array +#ifndef __WINS__ + DPlatChunkHw* iHwDesChunk; // chunk for hardware descriptor pool +#endif + TAny* iDesPool; // hardware or pseudo descriptor dynamic array + const TInt iDesSize; // descriptor size in bytes +public: + const TUint iCaps; /*< what is supported by DMA controller */ + enum {KCapsBitHwDes = 1}; /*< hardware descriptors supported */ + SDmaDesHdr* iFreeHdr; /*< head of unallocated descriptors linked list */ +#ifdef _DEBUG + TBool IsValidHdr(const SDmaDesHdr* aHdr); +#endif + __DMA_DECLARE_INVARIANT + }; + + +////////////////////////////////////////////////////////////////////////////// + +/** +Single-buffer DMA channel. + +Can be instantiated or further derived by PSL. Not +intended to be instantiated by client device drivers. +@publishedPartner +@released +*/ + +class TDmaSbChannel : public TDmaChannel + { +private: + virtual void DoQueue(DDmaRequest& aReq); + virtual void DoCancelAll(); + virtual void DoDfc(DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); +private: + TBool iTransferring; + }; + + +/** +Double-buffer DMA channel. + +Can be instantiated or further derived by PSL. Not +intended to be instantiated by client device drivers. +@publishedPartner +@released +*/ + +class TDmaDbChannel : public TDmaChannel + { +private: + virtual void DoQueue(DDmaRequest& aReq); + virtual void DoCancelAll(); + virtual void DoDfc(DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); +private: + enum { EIdle = 0, ETransferring, ETransferringLast } iState; + }; + + +/** +Scatter-gather DMA channel. + +Can be instantiated or further derived by PSL. +Not intended to be instantiated by client device drivers. +@publishedPartner +@released +*/ + +class TDmaSgChannel : public TDmaChannel + { +private: + virtual void DoQueue(DDmaRequest& aReq); + virtual void DoCancelAll(); + virtual void DoUnlink(SDmaDesHdr& aHdr); + virtual void DoDfc(DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); +private: + TBool iTransferring; + }; + + +////////////////////////////////////////////////////////////////////////////// +// INTERFACE WITH TEST HARNESS +////////////////////////////////////////////////////////////////////////////// + +/** +Set of information used by test harness. +@publishedPartner +@released +*/ + +struct TDmaTestInfo + { + /** Maximum transfer size in bytes for all channels (ie. the minimum of all channels' maximum size)*/ + TInt iMaxTransferSize; + /** 3->Memory buffers must be 4-byte aligned, 7->8-byte aligned, ... */ + TUint iMemAlignMask; + /** Cookie to pass to DDmaRequest::Fragment for memory-memory transfer*/ + TUint32 iMemMemPslInfo; + /** Number of test single-buffer channels */ + TInt iMaxSbChannels; + /** Pointer to array containing single-buffer test channel ids */ + TUint32* iSbChannels; + /** Number of test double-buffer channels */ + TInt iMaxDbChannels; + /** Pointer to array containing double-buffer test channel ids */ + TUint32* iDbChannels; + /** Number of test scatter-gather channels */ + TInt iMaxSgChannels; + /** Pointer to array containing scatter-gather test channel ids */ + TUint32* iSgChannels; + }; + + +/** +Provides access to test information structure stored in the PSL. + +Must be implemented by the PSL. +@publishedPartner +@released +*/ + +IMPORT_C const TDmaTestInfo& DmaTestInfo(); + + +////////////////////////////////////////////////////////////////////////////// + +#include + +#endif diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/drivers/dma_v1.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/include/drivers/dma_v1.inl Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,147 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// include/drivers/dma_v1.inl +// DMA framework public inline functions +// This file should not be modified when porting the DMA framework to +// new hardware. +// TDmaChannel +// +// WARNING: This file contains some APIs which are internal and are subject +// to change without noticed. Such APIs should therefore not be used +// outside the Kernel and Hardware Services package. +// + +inline void TDmaChannel::Wait() + { + NKern::FMWait(&iLock); + } + +inline void TDmaChannel::Signal() + { + NKern::FMSignal(&iLock); + } + +inline TBool TDmaChannel::Flash() + { + return NKern::FMFlash(&iLock); + } + +inline TBool TDmaChannel::IsOpened() const + { + return iController != NULL; + } + +inline TBool TDmaChannel::IsQueueEmpty() const + { + return const_cast(this)->iReqQ.IsEmpty(); + } + +inline TUint32 TDmaChannel::PslId() const + { + return iPslId; + } + +inline TInt TDmaChannel::FailNext(TInt /*aFragmentCount*/) + { + return iController->FailNext(*this); + } + +inline TInt TDmaChannel::MissNextInterrupts(TInt aInterruptCount) + { + return iController->MissNextInterrupts(*this, aInterruptCount); + } + +/** Function allowing platform-specific layer to extend API with new + channel-specific operations. + @param aCmd Command identifier. Negative values are reserved for Symbian use. + @param aArg PSL-specific + @return KErrNotSupported if aCmd is not supported. PSL-specific value otherwise. + */ + +inline TInt TDmaChannel::Extension(TInt aCmd, TAny* aArg) + { + return iController->Extension(*this, aCmd, aArg); + } + +inline const TDmac* TDmaChannel::Controller() const + { + return iController; + } + +inline TInt TDmaChannel::MaxTransferSize(TUint aFlags, TUint32 aPslInfo) + { + return iController->MaxTransferSize(*this, aFlags, aPslInfo); + } + +inline TUint TDmaChannel::MemAlignMask(TUint aFlags, TUint32 aPslInfo) + { + return iController->MemAlignMask(*this, aFlags, aPslInfo); + } + +// DDmaRequest + +/** Called when request is removed from request queue in channel */ + +inline void DDmaRequest::OnDeque() + { + iQueued = EFalse; + iLastHdr->iNext = NULL; + iChannel.DoUnlink(*iLastHdr); + } + +// TDmac + +inline void TDmac::Wait() + { + NKern::FMWait(&iLock); + } + +inline void TDmac::Signal() + { + NKern::FMSignal(&iLock); + } + +inline SDmaPseudoDes& TDmac::HdrToDes(const SDmaDesHdr& aHdr) const + { + return static_cast(iDesPool)[&aHdr - iHdrPool]; + } + +inline TAny* TDmac::HdrToHwDes(const SDmaDesHdr& aHdr) const + { + return static_cast(iDesPool) + iDesSize*(&aHdr - iHdrPool); + } + +inline TUint32 TDmac::DesLinToPhys(TAny* aDes) const + { +#ifdef __WINS__ + (void)aDes; + return 0xDEADBEEF; +#else + return iHwDesChunk->iPhysAddr + ((TLinAddr)aDes - iHwDesChunk->iLinAddr); +#endif + } + +// DmaChannelMgr + +inline void DmaChannelMgr::Wait() + { + NKern::FMWait(&Lock); + } + +inline void DmaChannelMgr::Signal() + { + NKern::FMSignal(&Lock); + } + +//--- diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/drivers/dma_v2.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/include/drivers/dma_v2.h Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,1135 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// include/drivers/dma_v2.h +// DMA Framework - Client API v2 definition. +// +// NB: DMA clients should never include this file directly, but only ever the +// generic header file . +// + +#ifndef __DMA_H__ +#error "dma_v2.h must'n be included directly - use instead" +#endif // #ifndef __DMA_H__ + +#ifndef __DMA_V2_H__ +#define __DMA_V2_H__ + + +#include +#include + + +////////////////////////////////////////////////////////////////////////////// +// Debug Support - KDmaPanicCat is defined in each source file + +#define __DMA_ASSERTD(e) __ASSERT_DEBUG(e, Kern::Fault(KDmaPanicCat, __LINE__)) +#define __DMA_ASSERTA(e) __ASSERT_ALWAYS(e, Kern::Fault(KDmaPanicCat, __LINE__)) +#ifdef _DEBUG +#define __DMA_CANT_HAPPEN() Kern::Fault(KDmaPanicCat, __LINE__) +#define __DMA_DECLARE_INVARIANT public: void Invariant(); +#define __DMA_INVARIANT() Invariant() +#else +#define __DMA_CANT_HAPPEN() +#define __DMA_DECLARE_INVARIANT +#define __DMA_INVARIANT() +#endif + + +////////////////////////////////////////////////////////////////////////////// +// INTERFACE EXPOSED TO DEVICE-DRIVERS +////////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////////// + +/** Bitmasks used for configuring a DMA request. + + In general, specify KDmaMemSrc|KDmaIncSrc (resp. KDmaMemDest|KDmaIncDest) + if the source (resp. destination) is a memory buffer and clear + KDmaMemSrc|KDmaIncSrc (resp. KDmaMemDest|KDmaIncDest) if the source + (resp. destination) is a peripheral. + + If the location is given as a physical address (rather than a linear one) + then also specify KDmaPhysAddrSrc and/or KDmaPhysAddrDest. + + The EKA1 "Fill Mode" can be implemented by omitting KDmaIncSrc. + + Some peripherals may require a post-increment address mode. + + @see DDmaRequest::Fragment + @publishedPartner + @released +*/ +enum TDmaRequestFlags + { + // Note: This enum is only required for backwards compatibility with the + // old DMA framework, it can be removed once this is no longer needed. + + /** Source is address of memory buffer */ + KDmaMemSrc = 0x01, + /** Destination is address of memory buffer */ + KDmaMemDest = 0x02, + /** Source address must be post-incremented during transfer */ + KDmaIncSrc = 0x04, + /** Destination address must be post-incremented during transfer */ + KDmaIncDest = 0x08, + /** Source address is a physical address (as opposed to a linear one) */ + KDmaPhysAddrSrc = 0x10, + /** Destination address is a physical address (as opposed to a linear one) */ + KDmaPhysAddrDest = 0x20, + /** Request a different max transfer size (for instance for test purposes) */ + KDmaAltTransferLen = 0x40 + }; + + +/** Each hardware or pseudo descriptor is associated with a header. Headers + are needed because hardware descriptors can not easily be extended to store + additional information. + + @publishedPartner + @released +*/ +struct SDmaDesHdr + { + SDmaDesHdr* iNext; + }; + +/** Pointer to signature of the new extended callback function. + + TUint - bitmask of one or more TDmaCallbackType values + TDmaResult - just that + TAny* - was provided by client in DDmaRequest constructor + SDmaDesHdr* - points to header (and thus descriptor) which caused a + 'descriptor completed' or 'descriptor paused' event. + */ +typedef void (*TDmaCallback)(TUint, TDmaResult, TAny*, SDmaDesHdr*); + +class TDmaChannel; + +/** A DMA request is a list of fragments small enough to be transferred in one go + by the DMAC. + + In general, fragmentation is done in the framework by calling Fragment() but + clients with special needs can allocate a blank descriptor list with + ExpandDesList() and customise it to fit their needs. + + Clients should not set attributes directly, but should use the various functions + instead. + + This class has not been designed to be called from several concurrent threads. + Multithreaded clients must implement their own locking scheme (via DMutex). + + Mutexes are used internally to protect data structures accessed both by the + client thread and the DFC thread. Therefore no fast mutex can be held when + calling a request function. + + @publishedPartner + @released + */ +class DDmaRequest : public DBase + { + friend class TDmaChannel; + +public: + /** The outcome of the transfer + + @deprecated + @see TDmaResult + */ + enum TResult {EBadResult=0, EOk, EError}; + /** The signature of the completion/failure callback function + + @deprecated + @see TDmaCallback + */ + typedef void (*TCallback)(TResult, TAny*); + +public: + /** Constructor. + + Create a new transfer request. + + @param aChannel The channel this request is bound to. + @param aCb Callback function called on transfer completion or failure + (in channel DFC context). Can be NULL. + @param aCbArg Argument passed to callback function. + @param aMaxTransferSize Maximum fragment size. If not specified, defaults to the maximum size + supported by the DMA controller for the type of transfer that is later scheduled. + + @deprecated + */ + IMPORT_C DDmaRequest(TDmaChannel& aChannel, TCallback aCb=NULL, TAny* aCbArg=NULL, + TInt aMaxTransferSize=0); + + + /** Constructor. + + Create a new transfer request. + + @param aChannel The channel this request is bound to. + @param aDmaCb Callback function called on transfer completion or + failure (in channel DFC or ISR context). Can be NULL. + @param aCbArg Argument passed to callback function. + @param aMaxTransferSize Maximum fragment size. If not specified, + defaults to the maximum size supported by the DMA controller for the + type of transfer that is later scheduled. + */ + IMPORT_C DDmaRequest(TDmaChannel& aChannel, TDmaCallback aDmaCb, TAny* aCbArg=NULL, + TUint aMaxTransferSize=0); + + + /** Destructor. + + Assume the request is not being transferred or pending. + */ + IMPORT_C ~DDmaRequest(); + + + /** Split request into a list of fragments small enough to be fed to the + DMAC. + + The size of each fragment is smaller than or equal to the maximum + transfer size supported by the DMAC. If the source and/or destination + is memory, each fragment points to memory which is physically + contiguous. + + The kind of transfer to perform is specified via a set of flags used by + a PIL and a magic cookie passed to the PSL. If the source + (resp. destination) is a peripheral, aSrc (resp. aDest) is treated as a + magic cookie by the PIL and passed straight to the PSL. + + The request can be uninitialised or may have been fragmented + previously. The previous configuration if any is lost whether or not + the function succeeds. + + @param aSrc Source memory buffer linear address or peripheral magic + cookie. + @param aDest Destination memory buffer linear address or peripheral + magic cookie. + @param aCount Number of bytes to transfer. + @param aFlags Bitmask characterising the transfer. + @param aPslInfo Hardware-specific information passed to PSL. + + @return KErrNone if success. KErrArgument if aFlags and/or aPslInfo are + invalid when finding the maximum transfer size. May also fail if + running out of descriptors. + + @pre The request is not being transferred or pending. + @pre The various parameters must be valid. The PIL or PSL will fault the + kernel if not. + + @see TDmaRequestFlags + + @deprecated + */ + IMPORT_C TInt Fragment(TUint32 aSrc, TUint32 aDest, TInt aCount, TUint aFlags, TUint32 aPslInfo); + + + /** New version of the DMA request fragment function, to be used with the + TDmaTransferArgs structure. + */ + IMPORT_C TInt Fragment(const TDmaTransferArgs& aTransferArgs); + + + /** Transfer asynchronously this request. + + If this request's channel is idle, the request is transferred + immediately. Otherwise, it is queued and transferred later. + + The client is responsible for ensuring cache consistency before and/or + after the transfer if necessary. + + @return KErrNone if success, KErrGeneral otherwise. + */ + IMPORT_C TInt Queue(); + + + /** Append new descriptor(s) to existing list. + + Clients needing to build a custom descriptor list should call this + function to allocate the list and access the resulting list through + iFirstHdr and iLastHdr. + + Clients should not change the value of iFirstHdr, iLastHdr and the + iNext field of the descriptor headers to ensure descriptors can be + deallocated. Clients are free to change hardware descriptors, including + chaining, in whatever way suit them. + + Assume the request is not being transferred or pending. + + @param aCount Number of descriptors to append. + + @return KErrNone or standard error code. + */ + IMPORT_C TInt ExpandDesList(TInt aCount=1); + + + /** Append new descriptor(s) to existing list. This function variant + operates on the source port descriptor chain. + + Works like ExpandDesList except that it uses the iSrcFirstHdr and + iSrcLastHdr fields. + + @see ExpandDesList + + This function can only be used if SDmacCaps::iAsymHwDescriptors is + true, otherwise it will just return KErrGeneral. + + @param aCount Number of descriptors to append. + + @return KErrNone or standard error code. + */ + IMPORT_C TInt ExpandSrcDesList(TInt aCount=1); + + + /** Append new descriptor(s) to existing list. This function variant + operates on the destination port descriptor chain. + + Works like ExpandDesList except that it uses the iDstFirstHdr and + iDstLastHdr fields. + + @see ExpandDesList + + This function can only be used if SDmacCaps::iAsymHwDescriptors is + true, otherwise it will just return KErrGeneral. + + @param aCount Number of descriptors to append. + + @return KErrNone or standard error code. + */ + IMPORT_C TInt ExpandDstDesList(TInt aCount=1); + + + /** Free resources associated with this request. + + Assume the request is not being transferred or pending. + */ + IMPORT_C void FreeDesList(); + + + /** Free resources associated with this request. This function variant + operates on the source port descriptor chain. + + @see FreeDesList + + This function can only be used if SDmacCaps::iAsymHwDescriptors is + true, otherwise it will do nothing. + */ + IMPORT_C void FreeSrcDesList(); + + + /** Free resources associated with this request. This function variant + operates on the destination port descriptor chain. + + @see FreeDesList + + This function can only be used if SDmacCaps::iAsymHwDescriptors is + true, otherwise it will do nothing. + */ + IMPORT_C void FreeDstDesList(); + + + /** Enables the functionality for counting the transferred source + elements. + + This function can be called at any time, but the enabled/disabled + status is checked by the framework only at two points in time. + + The first one is after a request has been queued, and if it is enabled + then the counting will commence as soon as the transfer starts. + + The second point is when Resume() is called for a paused transfer, and + in this case the following applies. If counting was enabled when the + transfer was paused and it is now disabled then the counting is stopped + at that point and the count value frozen. If counting was disabled when + the transfer was paused and it is now enabled then the counting will + commence when the transfer resumes. (The starting value will depend on + the argument of the enable function.) Otherwise nothing will change, + i.e. counting will either continue normally (enabled/enabled) or + neither stop nor continue (disabled/disabled). + + Once a status has been set, it remains valid for the entire duration of + the transfer (and beyond, if it is not changed again). + + @param aResetElementCount If ETrue (the default) then the count + variable will be reset to zero, otherwise it will retain its current + value. + + @see Queue() + @see TotalNumSrcElementsTransferred() + */ + IMPORT_C void EnableSrcElementCounting(TBool aResetElementCount=ETrue); + + + /** Enables the functionality for counting the transferred destination + elements. + + This function can be called at any time, but the enabled/disabled + status is checked by the framework only at two points in time. + + The first one is after a request has been queued, and if it is enabled + then the counting will commence as soon as the transfer starts. + + The second point is when Resume() is called for a paused transfer, and + in this case the following applies. If counting was enabled when the + transfer was paused and it is now disabled then the counting is stopped + at that point and the count value frozen. If counting was disabled when + the transfer was paused and it is now enabled then the counting will + commence when the transfer resumes. (The starting value will depend on + the argument of the enable function.) Otherwise nothing will change, + i.e. counting will either continue normally (enabled/enabled) or + neither stop nor continue (disabled/disabled). + + Once a status has been set, it remains valid for the entire duration of + the transfer (and beyond, if it is not changed again). + + @param aResetElementCount If ETrue (the default) then the count + variable will be reset to zero, otherwise it will retain its current + value. + + @see Queue() + @see TotalNumDstElementsTransferred() + */ + IMPORT_C void EnableDstElementCounting(TBool aResetElementCount=ETrue); + + + /** Disables the functionality for counting the transferred source + elements. + + This function can be called at any time, but the enabled/disabled + status is checked by the framework only at two points in time. + + The first one is after a request has been queued, and if it is enabled + then the counting will commence as soon as the transfer starts. + + The second point is when Resume() is called for a paused transfer, and + in this case the following applies. If counting was enabled when the + transfer was paused and it is now disabled then the counting is stopped + at that point and the count value frozen. If counting was disabled when + the transfer was paused and it is now enabled then the counting will + commence when the transfer resumes. (The starting value will depend on + the argument of the enable function.) Otherwise nothing will change, + i.e. counting will either continue normally (enabled/enabled) or + neither stop nor continue (disabled/disabled). + + Once a status has been set, it remains valid for the entire duration of + the transfer (and beyond, if it is not changed again). + + @see Queue() + @see TotalNumSrcElementsTransferred() + */ + IMPORT_C void DisableSrcElementCounting(); + + + /** Disables the functionality for counting the transferred destination + elements. + + This function can be called at any time, but the enabled/disabled + status is checked by the framework only at two points in time. + + The first one is after a request has been queued, and if it is enabled + then the counting will commence as soon as the transfer starts. + + The second point is when Resume() is called for a paused transfer, and + in this case the following applies. If counting was enabled when the + transfer was paused and it is now disabled then the counting is stopped + at that point and the count value frozen. If counting was disabled when + the transfer was paused and it is now enabled then the counting will + commence when the transfer resumes. (The starting value will depend on + the argument of the enable function.) Otherwise nothing will change, + i.e. counting will either continue normally (enabled/enabled) or + neither stop nor continue (disabled/disabled). + + Once a status has been set, it remains valid for the entire duration of + the transfer (and beyond, if it is not changed again). + + @see Queue() + @see TotalNumDstElementsTransferred() + */ + IMPORT_C void DisableDstElementCounting(); + + + /** Returns the number of elements that have been transferred by this + transfer request at the source port. + + To use this method, the counting functionality has to be explicitly + enabled, either before the transfer request is queued or while it is + paused. + + @see EnableSrcElementCounting() + @see DisableSrcElementCounting() + + This function should only be called after the transfer has finished + (completed with or without error, or because it was cancelled) or while + it is paused. Otherwise it may just return 0. + + @return The number of elements that have been transferred by this + transfer request at the source port. + */ + IMPORT_C TUint32 TotalNumSrcElementsTransferred(); + + + /** Returns the number of elements that have been transferred by this + transfer request at the destination port. + + To use this method, the counting functionality has to be explicitly + enabled, either before the transfer request is queued or while it is + paused. + + @see EnableDstElementCounting() + @see DisableDstElementCounting() + + This function should only be called after the transfer has finished + (completed with or without error, or because it was cancelled) or while + it is paused. Otherwise it may just return 0. + + @return The number of elements that have been transferred by this + transfer request at the destination port. + */ + IMPORT_C TUint32 TotalNumDstElementsTransferred(); + + + /** Returns the number of fragments that this transfer request has been + split into. + + This number will only be different from 0 once Fragment() has been + called or after descriptors have been manually allocated by the client + using ExpandDesList(). + + If SDmacCaps::iAsymHwDescriptors is true then this function will always + return 0, and SrcFragmentCount() / DstFragmentCount() should be used + instead. + + @return The number of fragments (descriptors / pseudo descriptors) that + this transfer request has been split into. + */ + IMPORT_C TInt FragmentCount(); + + /** Returns the number of source port fragments that this transfer request + has been split into. + + This number will only be different from 0 once Fragment() has been + called or after descriptors have been manually allocated by the client + using ExpandSrcDesList(). + + This function can only be used if SDmacCaps::iAsymHwDescriptors is + true, otherwise it will always return 0. + + @return The number of source port fragments (descriptors) that this + transfer request has been split into. + */ + IMPORT_C TInt SrcFragmentCount(); + + + /** Returns the number of destination port fragments that this transfer + request has been split into. + + This number will only be different from 0 once Fragment() has been + called or after descriptors have been manually allocated by the client + using ExpandDstDesList(). + + This function can only be used if SDmacCaps::iAsymHwDescriptors is + true, otherwise it will always return 0. + + @return The number of destination port fragments (descriptors) that + this transfer request has been split into. + */ + IMPORT_C TInt DstFragmentCount(); + +private: + inline void OnDeque(); + TUint GetTransferCount(const TDmaTransferArgs& aTransferArgs); + TInt Frag(TDmaTransferArgs& aTransferArgs); + TInt FragSym(TDmaTransferArgs& aTransferArgs, TUint aCount, TUint aMaxTransferLen); + TInt FragAsym(TDmaTransferArgs& aTransferArgs, TUint aCount, TUint aMaxTransferLen); + TInt FragAsymSrc(TDmaTransferArgs& aTransferArgs, TUint aCount, TUint aMaxTransferLen); + TInt FragAsymDst(TDmaTransferArgs& aTransferArgs, TUint aCount, TUint aMaxTransferLen); + TInt ExpandDesList(TInt aCount, TInt& aDesCount, SDmaDesHdr*& aFirstHdr, + SDmaDesHdr*& aLastHdr); + void FreeDesList(TInt& aDesCount, SDmaDesHdr*& aFirstHdr, SDmaDesHdr*& aLastHdr); + TInt FragmentCount(const SDmaDesHdr* aHdr); + +public: + // WARNING: The following attributes are accessed both in client and DFC + // context and so accesses must be protected with the channel lock. + TDmaChannel& iChannel; /**< The channel this request is bound to */ + TCallback iCb; /**< Called on completion/failure (can be NULL) */ + TAny* iCbArg; /**< Callback argument */ + TDmaCallback iDmaCb; // the new-style callback function + TAny* iDmaCbArg; // the new-style callback arg + TBool iIsrCb; // client wants callback in ISR context + TInt iDesCount; /**< The number of fragments in list */ + SDmaDesHdr* iFirstHdr; /**< The first fragment in the list (or NULL) */ + SDmaDesHdr* iLastHdr; /**< The last fragment in the list (or NULL) */ + TInt iSrcDesCount; /**< The number of fragments in list */ + SDmaDesHdr* iSrcFirstHdr; /**< The first fragment in the list (or NULL) */ + SDmaDesHdr* iSrcLastHdr; /**< The last fragment in the list (or NULL) */ + TInt iDstDesCount; /**< The number of fragments in list */ + SDmaDesHdr* iDstFirstHdr; /**< The first fragment in the list (or NULL) */ + SDmaDesHdr* iDstLastHdr; /**< The last fragment in the list (or NULL) */ + SDblQueLink iLink; /**< The link on channel queue of pending requests */ + TBool iQueued; /**< Indicates whether request is pending or being transferred */ + TUint iMaxTransferSize; /**< Defaults to DMA controller max. transfer size */ + + TUint32 iTotalNumSrcElementsTransferred; + TUint32 iTotalNumDstElementsTransferred; + + __DMA_DECLARE_INVARIANT + }; + + +////////////////////////////////////////////////////////////////////////////// + +class TDmac; +class DmaChannelMgr; +class TDmaCancelInfo; + +/** DMA channel base class. + + Standard derived classes are provided for this channel (see + TDmaSbChannel, TDmaDbChannel, TDmaSgChannel, and TDmaAsymSgChannel). + The base-port implementor will only need to write their own derived + class if one of the standard classes is unsuitable. + + This class has not been designed to be called from several concurrent + client threads. Multithreaded clients must implement their own locking + scheme (via DMutex). + + Mutexes are used internally to protect data structures accessed both by the + client thread and the DFC one. Therefore no fast mutex can be held when + calling a channel function. + + @publishedPartner + @released + */ +class TDmaChannel + { + friend class DDmaRequest; + friend class TDmac; + friend class DmaChannelMgr; +public: + + /** Information passed by client when opening a channel */ + struct SCreateInfo + { + /** Default constructor. Initializes all fields with meaningful default + values. + + Must be inline (for now) because exporting it would break existing + custom DMA libs as their clients would need the export which would + be missing from the custom .def files. + */ + SCreateInfo() : iPriority(KDmaPriorityNone), iDynChannel(EFalse) {}; + + /** Identifier used by PSL to select channel to open */ + TUint32 iCookie; + /** Number of descriptors this channel can use. + + This number is not used in the upgraded version of the DMA + framework and is kept there only for source compatibility. If the + client is certain that it will only ever use that version, then the + value passed here doesn't matter - the framework will ignore it. + + @deprecated + */ + TInt iDesCount; + /** DFC queue used to service DMA interrupts. + + The DFC thread priority must be higher than any client thread + priority to avoid a situation where a transfer completes while + being cancelled and another transfer is started before the DFC + thread gets a chance to run. This would lead to a stray DFC. + */ + TDfcQue* iDfcQ; + /** DFC priority */ + TUint8 iDfcPriority; + /** Used by PSL to configure a channel priority (if possible). + + The default is KDmaPriorityNone (the don't care value). + + @see TDmaPriority + */ + TUint iPriority; + /** Request a dynamic DMA channel. + + If this is set to ETrue then the Open call is for a 'dynamic' as + opposed to a static and solely owned DMA channel. A number of + properties of the opened TDmaChannel object will be different in + that case. + + The default value is EFalse. + */ + TBool iDynChannel; + }; + +public: + /** Opens the DMA channel. + + Channel selection is done by the hardware-specific layer using a cookie + passed in via aInfo. + + The client should not delete the returned pointer as the framework owns + channel objects. However, the client should explicitly close the + channel when finished with it. + + @param aInfo Information passed by caller to select and configure + channel. + + @param aChannel Points to open channel on successful return. NULL + otherwise. + + @return KErrNone or standard error code. + */ + IMPORT_C static TInt Open(const SCreateInfo& aInfo, TDmaChannel*& aChannel); + + + /** Closes a previously opened DMA channel. + + Assumes the channel is idle and all requests have been deleted. + + The call will cause the resources associated with this channel to be + released, and the pointer/reference to it mustn't therefore be accessed + any longer after the function has returned. The channel pointer should + be set to NULL by the client. + */ + IMPORT_C void Close(); + + + /** Logically links this channel to the one specified as an argument, or, + if the argument is NULL, unlinks this channel. + + The effect of channel linking is that once a transfer on this channel + has finished, instead of causing the associated client callback to be + called, 'aChannel' will be enabled by hardware and a preconfigured + transfer on that channel will start. + + Note that conceptually 'linking' here always refers to the end of a + channel transfer, not the beginning, i.e. a channel can only be linked + once and always to a successor, never twice or to a predecessor. (This + does not preclude the possibility that two channels are linked in a + circular fashion.) + + This function can only be used if the DMAC supports logical channel + linking. + + @see SDmacCaps::iChannelLinking + + @param aChannel Points to the channel this one should be linked to, or + NULL if this channel is to be unlinked from any other one. + + @return KErrNone if the channel has been linked or unlinked + successfully, KErrCompletion if this channel was already linked to + aChannel or already unlinked, KErrNotSupported if the DMAC doesn't + support channel linking, KErrArgument if this channel was already + linked to a different channel, KErrGeneral if a general error occurred + preventing a successful outcome. + */ + IMPORT_C TInt LinkToChannel(TDmaChannel* aChannel); + + /** Pauses an active transfer on this channel. + + A paused channel transfer can be resumed by calling Resume() or it can + be stopped altogether by calling CancelAll(). + + @see TDmaChannel::Resume() + + Function can only be used if the DMAC supports this functionality. + + @see SDmacCaps::iChannelPauseAndResume + + @return KErrNone if a transfer has been paused successfully, + KErrCompletion if a transfer was already paused, KErrNotSupported if + the DMAC doesn't support channel transfer pausing/resuming, KErrGeneral + if a general error occurred preventing a successful outcome. + */ + IMPORT_C TInt Pause(); + + + /** Resumes a transfer on this channel that is paused. + + Resume() can be called to resume channel operation when the transfer is + paused as a result of a previous call to Pause() or because the DMAC + has encountered a Pause bit in a H/W descriptor. + + @see TDmaChannel::Pause() + @see TDmaCallbackType::EDmaCallbackLinkedListPaused + + Function can only be used if the DMAC supports this functionality. + + @see SDmacCaps::iChannelPauseAndResume + + @return KErrNone if a paused transfer has been resumed successfully, + KErrCompletion if there was no paused transfer, KErrNotSupported if the + DMAC doesn't support channel transfer pausing/resuming, KErrGeneral if + a general error occurred preventing a successful outcome. + */ + IMPORT_C TInt Resume(); + + + /** Cancels the current request and all the pending ones. + */ + IMPORT_C void CancelAll(); + + + /** Returns the channel's maximum transfer length based on the passed + arguments. + + @param aSrcFlags Bitmask characterising transfer source + @see TDmaTransferArgs::iSrcConfig::iFlags + + @param aDstFlags Bitmask characterising transfer destination + @see TDmaTransferArgs::iDstConfig::iFlags + + @param aPslInfo Cookie passed to the PSL + @see TDmaTransferArgs::iPslRequestInfo + + @return 0 if transfer length is not limited, the maximum transfer + length in bytes otherwise. + */ + IMPORT_C TUint MaxTransferLength(TUint aSrcFlags, TUint aDstFlags, TUint32 aPslInfo); + + + /** Retrieves from the PSL the address / memory alignment mask based on the + parameters passed. Some DMA controllers impose alignment constraints on + the base address of memory buffers. This mask is AND'ed against memory + addresses computed during fragmentation. + + This function needs to be called separately for source and destination. + + @param aTargetFlags Bitmask characterising transfer source or + destination + @see TDmaTransferArgs::iSrcConfig::iFlags + @see TDmaTransferArgs::iDstConfig::iFlags + + @param aElementSize Element size used for the transfer. Can be zero if + not known or 'don't care'. + + @param aPslInfo Cookie passed to the PSL + @see TDmaTransferArgs::iPslRequestInfo + + @return A value representing the alignment mask (e.g. 3 if buffer must + be 4-byte aligned) + */ + IMPORT_C TUint AddressAlignMask(TUint aTargetFlags, TUint aElementSize, + TUint32 aPslInfo); + + + /** Returns a reference to a structure containing the capabilities and + features of the DMA controller associated with this channel. + + @return A reference to a structure containing the capabilities and + features of the DMA controller associated with this channel. + */ + IMPORT_C const SDmacCaps& DmacCaps(); + + + /** Sets up once more the transfer request that has just completed, after + optionally having adjusted the transfer parameters as specified. + + This function is meant to be called exclusively from a client-supplied + callback that is executed in ISR context, and only in response to a + transfer completion notification. + + If this call returns to the caller with KErrNone then the framework's + ISR handler will subsequently not queue the channel DFC for this + completed request. + + The parameters specify which changes the framework should apply to the + descriptors of the transfer request before rescheduling it. Arguments + for which no change is required should be passed as their default + values. The parameters correspond to those in the TDmaTransferArgs + struct as follows. + + @param aSrcAddr @see TDmaTransferArgs::iSrcConfig::iAddr + @param aDstAddr @see TDmaTransferArgs::iDstConfig::iAddr + @param aTransferCount @see TDmaTransferArgs::iTransferCount + @param aPslRequestInfo @see TDmaTransferArgs::iPslRequestInfo + @param aIsrCb If set to ETrue (the default) then the callback of the + rescheduled request will again be called in ISR context + + Since Epoc::LinearToPhysical() cannot be called in ISR context the + addresses passed into this function must be physical ones, i.e. + TDmaTransferFlags::KDmaPhysAddr is implied. + + If an address refers to a memory target then + TDmaTransferFlags::KDmaMemIsContiguous is implied as well as no + fragmentation is possible at this point. + + @pre Must only be called from a 'transfer complete' client callback in + ISR context. + + @post Framework won't queue the channel DFC for the completed request + in success case. + + @see DDmaRequest::DDmaRequest(TDmaChannel&, TDmaCallback, TAny*, TUint) + @see TDmaCallbackType::EDmaCallbackRequestCompletion + @see TDmaPILFlags::KDmaRequestCallbackFromIsr + + @return KErrGeneral if there was an error, KErrNone otherwise. + */ + IMPORT_C TInt IsrRedoRequest(TUint32 aSrcAddr=KPhysAddrInvalid, + TUint32 aDstAddr=KPhysAddrInvalid, + TUint aTransferCount=0, + TUint32 aPslRequestInfo=0, + TBool aIsrCb=ETrue); + + + /** Tests whether the channel is currently opened. + + @return ETrue if channel is currently opened, EFalse otherwise. + + NB: This API should not be used any longer. + + After calling TDmaChannel::Open() successfully the channel is + guaranteed to be open. Therefore there seems no good reason for this + API to exist. + + @deprecated + */ + inline TBool IsOpened() const; + + + /** Tests whether the channel's request queue is currently empty. + + @return ETrue if request queue is currently empty, EFalse otherwise. + */ + inline TBool IsQueueEmpty() const; + + + /** Returns a PSL-specific value which uniquely identifies this channel - + it is used for debug tracing by the PIL. + + @return PSL-specific value which uniquely identifies this channel. + */ + inline TUint32 PslId() const; + + + /** Called by a test harness to force an error when the next fragment is + transferred. + + @param aFragmentCount The number of consecutive fragments to fail + */ + IMPORT_C TInt FailNext(TInt aFragmentCount); + + + /** Called by a test harness to force the DMA controller to miss one or + more interrupts. + + @param aInterruptCount The number of consecutive interrupts to miss + */ + IMPORT_C TInt MissNextInterrupts(TInt aInterruptCount); + + + /** Function allowing platform-specific layer to extend channel API with + new channel-specific operations. + + @param aCmd Command identifier. Negative values are reserved for use by + Nokia. + @param aArg PSL-specific argument + + @return KErrNotSupported if aCmd is not supported. PSL-specific value + otherwise. + */ + IMPORT_C TInt Extension(TInt aCmd, TAny* aArg); + + + /** This is a function that allows the Platform Specific Layer (PSL) to + extend the DMA API with new channel-independent operations. + + @param aCmd Command identifier. Negative values are reserved for + Symbian use. + @param aArg PSL-specific. + + @return KErrNotSupported if aCmd is not supported; a PSL specific value + otherwise. + */ + IMPORT_C TInt StaticExtension(TInt aCmd, TAny* aArg); + + + /** @deprecated + @see DmacCaps() + */ + inline const TDmac* Controller() const; + + /** @deprecated + @see MaxTransferLength() + */ + inline TInt MaxTransferSize(TUint aFlags, TUint32 aPslInfo); + + /** @deprecated + @see AddressAlignMask() + */ + inline TUint MemAlignMask(TUint aFlags, TUint32 aPslInfo); + +protected: + // Interface with state machines + TDmaChannel(); + + /** Called by the PIL when adding a new request to the channel's queue. + The implementation should update the channel's state as appropriate + and begin transfer of aReq if possible. + + @param aReq The request which has been added to the queue + */ + virtual void DoQueue(const DDmaRequest& aReq); + + /** Called by the PIL in response to a CancelAll call. It should update + the channel state appropriately. + */ + virtual void DoCancelAll() = 0; + + /** This is called by the PIL when a DDmaRequest is removed from the + channel's queue. In general the implementation simply needs to unlink + the hardware descriptor corresponding to aHdr from the next. + + Since the PIL links the hardware descriptor chains of adjacent queued + requests (for speed) it is necessary to break the chain when a request + is completed so that the request may be requeued by the client without + having called DDmaRequest::Fragment again. + + @param aHdr The header for a descriptor, which must be unlinked + from its next descriptor (if there is one) + */ + virtual void DoUnlink(SDmaDesHdr& aHdr); + + /** Called by the PIL whenever a transfer associated with aCurReq is + done. The implementation must advance the channel's state and + may transfer the next header if necessary (the provided + scatter-gather channel does not do this). It must also report + back which header was associated with the last transfer to + complete. + + @param aCurReq The current request. + @param aCompletedHdr Must be set by the implementation to the header + of the last transfer to complete. + */ + virtual void DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); + + /** Called by the PIL whenever a transfer associated with aCurReq is + done. The implementation must advance the channel's state and + may start the transfer for the next headers if necessary (the + provided scatter-gather channels do not do this). If one + header has a successor but the other is the last in the chain it + is an error. + + @note Must be implemented by PSL if channel uses asymmetric hardware + descriptors and is not derived from TDmaAsymSgChannel. + + @param aCurReq The current request. + + @param aSrcCompletedHdr Must be set by the implementation to + the header of the last source descriptor to complete. + + @param aDstCompletedHdr Must be set by the implementation to + the header of the last destination descriptor to complete. + */ + virtual void DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aSrcCompletedHdr, + SDmaDesHdr*& aDstCompletedHdr); + + virtual ~TDmaChannel(); + +private: + static void Dfc(TAny*); + void DoDfc(); + inline void Wait(); + inline void Signal(); + inline void Flash(); + void ResetStateMachine(); + +protected: + TDmac* iController; // DMAC this channel belongs to (NULL when closed) + const SDmacCaps* iDmacCaps; // what is supported by DMAC on this channel + TUint32 iPslId; // unique identifier provided by PSL + TBool iDynChannel; // this is a dynamically allocated channel + TUint iPriority; // hardware priority of this channel + DMutex* iMutex; // for data accessed in both client & DFC context + SDmaDesHdr* iCurHdr; // fragment being transferred or NULL + SDmaDesHdr** iNullPtr; // Pointer to NULL pointer following last fragment + TDfc iDfc; // transfer completion/failure DFC + TInt iMaxDesCount; // maximum number of allocable descriptors + TInt iAvailDesCount; // available number of descriptors + volatile TUint32 iIsrDfc; // Interface between ISR and DFC: + enum {KErrorFlagMask = 0x80000000}; // bit 31 - error flag + enum {KCancelFlagMask = 0x40000000}; // bit 30 - cancel flag + enum {KDfcCountMask = 0x3FFFFFFF}; // bits 0-29 - number of queued DFCs + SDblQue iReqQ; // being/about to be transferred request queue + TInt iReqCount; // number of requests attached to this channel +private: + TDmaCancelInfo* iCancelInfo; // ... + TBool iRedoRequest; // client ISR callback wants a redo of request + TBool iIsrCbRequest; // request on queue using ISR callback + + __DMA_DECLARE_INVARIANT + }; + + +////////////////////////////////////////////////////////////////////////////// +// INTERFACE WITH TEST HARNESS +////////////////////////////////////////////////////////////////////////////// + +/** Set of information used by test harness. + + @publishedPartner + @released +*/ +struct TDmaTestInfo + { + /** Maximum transfer size in bytes for all channels (ie. the minimum of all channels' maximum size)*/ + TUint iMaxTransferSize; + /** 3->Memory buffers must be 4-byte aligned, 7->8-byte aligned, ... */ + TUint iMemAlignMask; + /** Cookie to pass to DDmaRequest::Fragment for memory-memory transfer*/ + TUint32 iMemMemPslInfo; + /** Number of test single-buffer channels */ + TInt iMaxSbChannels; + /** Pointer to array containing single-buffer test channel ids */ + TUint32* iSbChannels; + /** Number of test double-buffer channels */ + TInt iMaxDbChannels; + /** Pointer to array containing double-buffer test channel ids */ + TUint32* iDbChannels; + /** Number of test scatter-gather channels */ + TInt iMaxSgChannels; + /** Pointer to array containing scatter-gather test channel ids */ + TUint32* iSgChannels; + }; + + +/** Provides access to test information structure stored in the PSL. + + Must be implemented by the PSL. + + @publishedPartner + @released +*/ +IMPORT_C const TDmaTestInfo& DmaTestInfo(); + +/** Provides access to test information structure stored in the PSL. + + Must be implemented by the PSL. + + @publishedPartner + @released +*/ +IMPORT_C const TDmaV2TestInfo& DmaTestInfoV2(); + + + +////////////////////////////////////////////////////////////////////////////// + + +#include +#include + + +#endif // #ifndef __DMA_V2_H__ diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/drivers/dma_v2.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/include/drivers/dma_v2.inl Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,62 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// include/drivers/dma_v2.inl +// DMA Framework - Client API v2 definition. +// +// +// WARNING: This file contains some APIs which are internal and are subject +// to change without noticed. Such APIs should therefore not be used +// outside the Kernel and Hardware Services package. + + +// +// TDmaChannel +// + +inline void TDmaChannel::Wait() + { + NKern::ThreadEnterCS(); + Kern::MutexWait(*iMutex); + } + +inline void TDmaChannel::Signal() + { + Kern::MutexSignal(*iMutex); + NKern::ThreadLeaveCS(); + } + +inline void TDmaChannel::Flash() + { + Kern::MutexSignal(*iMutex); + Kern::MutexWait(*iMutex); + } + +inline TBool TDmaChannel::IsOpened() const + { + __KTRACE_OPT(KDMA, Kern::Printf("Warning: TDmaChannel::IsOpened() is deprecated")); + return iController != NULL; + } + +inline TBool TDmaChannel::IsQueueEmpty() const + { + return const_cast(this)->iReqQ.IsEmpty(); + } + +inline TUint32 TDmaChannel::PslId() const + { + return iPslId; + } + + +// --- diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/drivers/dmadefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/include/drivers/dmadefs.h Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,739 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// include/drivers/dmadefs.h +// DMA Framework - General class, enum, constant and type definitions. +// +// + +#ifndef __DMADEFS_H__ +#define __DMADEFS_H__ + + +#include + + +/** The client request callback type */ +enum TDmaCallbackType + { + /** Transfer request completion callback */ + EDmaCallbackRequestCompletion = 0x01, + /** Transfer request completion callback - source side */ + EDmaCallbackRequestCompletion_Src = 0x02, + /** Transfer request completion callback - destination side */ + EDmaCallbackRequestCompletion_Dst = 0x04, + + /** Descriptor completion callback */ + EDmaCallbackDescriptorCompletion = 0x08, + /** Descriptor completion callback - source side */ + EDmaCallbackDescriptorCompletion_Src = 0x10, + /** Descriptor completion callback - destination side */ + EDmaCallbackDescriptorCompletion_Dst = 0x20, + + /** Frame completion callback */ + EDmaCallbackFrameCompletion = 0x40, + /** Frame completion callback - source side */ + EDmaCallbackFrameCompletion_Src = 0x80, + /** Frame completion callback - destination side */ + EDmaCallbackFrameCompletion_Dst = 0x100, + + /** H/W descriptor pause event callback */ + EDmaCallbackLinkedListPaused = 0x200, + /** H/W descriptor pause event callback - source side */ + EDmaCallbackLinkedListPaused_Src = 0x400, + /** H/W descriptor pause event callback - destination side */ + EDmaCallbackLinkedListPaused_Dst = 0x800 + }; + + +/** The outcome of the transfer request */ +enum TDmaResult + { + /** Completed without error */ + EDmaResultOK = 0, + /** There was an error */ + EDmaResultError + }; + + + +/** To be used with address mode field of the DMA transfer config struct. + + @see TDmaTransferConfig::iAddrMode +*/ +enum TDmaAddrMode + { + /** Constant addressing. The address remains the same for consecutive + accesses. + */ + KDmaAddrModeConstant, + /** Post-increment addressing. The address increases by the element size + after each access. + */ + KDmaAddrModePostIncrement, + /** Post-decrement addressing. The address decreases by the element size + after each access. + */ + KDmaAddrModePostDecrement, + /** 1D-index addressing. The address always increases by the element size + plus the element skip value after each access. + */ + KDmaAddrMode1DIndex, + /** 2D-index addressing. The address increases by the element size plus the + element skip value - but only within a frame. Once a full frame has been + transferred, the address increases by the element size plus the element + skip value plus the frame skip value. + */ + KDmaAddrMode2DIndex + }; + + +/** To be used with the burst size field of the DMA transfer config struct. + + @see SDmacCaps::iBurstTransactions + @see TDmaTransferConfig::iBurstSize +*/ +enum TDmaBurstSize + { + /** Don't use burst transactions */ + KDmaNoBursts = -1, + /** Don't care (the default) */ + KDmaBurstSizeAny = 0x00, + /** 4 bytes */ + KDmaBurstSize4 = 0x04, + /** 8 bytes */ + KDmaBurstSize8 = 0x08, + /** 16 bytes */ + KDmaBurstSize16 = 0x10, + /** 32 bytes */ + KDmaBurstSize32 = 0x20, + /** 64 bytes */ + KDmaBurstSize64 = 0x40, + /** 128 bytes */ + KDmaBurstSize128 = 0x80 + }; + + +/** To be used with the flags field of the DMA transfer config struct. + + @see TDmaTransferConfig::iFlags +*/ +enum TDmaTransferFlags + { + /** Location is address of a memory buffer (as opposed to a peripheral or a + register). + */ + KDmaMemAddr = 0x01, + /** Address is a physical address (as opposed to a linear one). + If it is a memory address then KDmaMemIsContiguous will need to be set + as well. + */ + KDmaPhysAddr = 0x02, + /** Target memory is known to be physically contiguous, hence there is + no need for the framework to check for memory fragmentation. + */ + KDmaMemIsContiguous = 0x04, + /** Don't use packed access (if possible) */ + KDmaDontUsePacked = 0x08, + /** Location is big endian (little endian if not set). + + To have any effect, this flag requires the DMAC to support endianness + conversion. + + @see SDmacCaps::iEndiannessConversion + */ + KDmaBigEndian = 0x10, + /** Don't do endianness conversion even if applicable. + + To have any effect, this flag requires the DMAC to support endianness + conversion. + + @see SDmacCaps::iEndiannessConversion + */ + KDmaLockEndian = 0x20, + /** Execute client request callback after each subtransfer (streaming / + loop case). + + This option is only taken into account if the respective + TDmaTransferConfig::iRepeatCount is non-zero. + + The callback will complete with a TDmaCallbackType of + EDmaCallbackRequestCompletion (even if the repeat counts for source and + destination are different), unless the flag + TDmaPILFlags::KDmaAsymCompletionCallback is set too, in which case what + is described there applies. + */ + KDmaCallbackAfterEveryTransfer = 0x40, + /** Execute client request callback after each completed hardware + descriptor. + + Requires the DMAC to support this feature. Unless the DMAC supports + asymmetric descriptor interrupts as well, this flag should not be set + on only one (source or destination) side. + + @see SDmacCaps::iDescriptorInterrupt + @see SDmacCaps::iAsymDescriptorInterrupt + */ + KDmaCallbackAfterEveryDescriptor = 0x80, + /** Execute client request callback after each completed frame. + + Requires the DMAC to support this feature. Unless the DMAC supports + asymmetric frame interrupts as well, this flag should not be set on + only one (source or destination) side. + + @see SDmacCaps::iFrameInterrupt + @see SDmacCaps::iAsymFrameInterrupt + */ + KDmaCallbackAfterEveryFrame = 0x100 + }; + + +/** To be used with the synchronization flags field of a DMA transfer + config struct. + + @see SDmacCaps::iSynchronizationTypes + @see TDmaTransferConfig::iSyncFlags +*/ +enum TDmaTransferSyncFlags + { + /** Leave the decision on whether the transfer is hardware synchronized at + this end (either source or destination) to the Framework. This is the + default. + */ + KDmaSyncAuto = 0x00, + /** Transfer is not hardware synchronized at this end (either source or + destination). + */ + KDmaSyncNone = 0x01, + /** Transfer is hardware synchronized at this end (either source or + destination). This option can also be used on its own, without any + of the following sync sizes. + */ + KDmaSyncHere = 0x02, + /** H/W synchronized at this end: transfer one ELEMENT (a number of + bytes, depending on the configured element size) per sync event. + */ + KDmaSyncSizeElement = 0x04, + /** H/W synchronized at this end: transfer one FRAME (a number of + elements, depending on the configured frame size) per sync event. + */ + KDmaSyncSizeFrame = 0x08, + /** H/W synchronized at this end: transfer one BLOCK (a number of + frames, depending on the configured transfer size) per sync + event. This is the most common use case. + */ + KDmaSyncSizeBlock = 0x10, + /** H/W synchronized at this end: transfer one PACKET (a number of + elements, depending on the configured packet size) per sync event. + In cases where the transfer block size is not a multiple of the + packet size the last packet will consist of the remaining elements. + */ + KDmaSyncSizePacket = 0x20 + }; + + +/** To be used with the Graphics operation field of a DMA transfer request. + + @see TDmaTransferArgs::iGraphicsOps +*/ +enum TDmaGraphicsOps + { + /** Don't use any graphics acceleration feature (the default) */ + KDmaGraphicsOpNone = 0x00, + /** Enable graphics acceleration feature 'Constant Fill' */ + KDmaGraphicsOpConstantFill = 0x01, + /** Enable graphics acceleration feature 'TransparentCopy' */ + KDmaGraphicsOpTransparentCopy = 0x02 + }; + + +/** To be used with the PIL flags field of a DMA transfer request. + + @see TDmaTransferArgs::iFlags +*/ +enum TDmaPILFlags + { + /** Request a different max transfer size (for instance for test + purposes). + */ + KDmaAltTransferLength = 0x01, + /** Execute client request callback in ISR context instead of from a + DFC. + */ + KDmaRequestCallbackFromIsr = 0x02, + /** Execute descriptor completion callback in ISR context instead of + from a DFC. This option is to be used in conjunction with the + TDmaTransferFlags::KDmaCallbackAfterEveryDescriptor flag. + */ + KDmaDescriptorCallbackFromIsr = 0x04, + /** Execute frame completion callback in ISR context instead of + from a DFC. This option is to be used in conjunction with the + TDmaTransferFlags::KDmaCallbackAfterEveryFrame flag. + */ + KDmaFrameCallbackFromIsr = 0x08, + /** Execute the client request callback separately for source and + destination subtransfers. + + This flag also determines the TDmaCallbackType value returned. If set, + the callback will complete with EDmaCallbackRequestCompletion_Src or + EDmaCallbackRequestCompletion_Dst, respectively, instead of with + EDmaCallbackRequestCompletion. + + Requires the DMAC to support this feature. + + @see SDmacCaps::iAsymCompletionInterrupt + */ + KDmaAsymCompletionCallback = 0x10, + /** Execute the descriptor completion callback separately for source + and destination subtransfers. + + This flag modifies the behaviour of the + TDmaTransferFlags::KDmaCallbackAfterEveryDescriptor flag and also + determines the TDmaCallbackType value returned. If set, the callback + will complete with EDmaCallbackDescriptorCompletion_Src or + EDmaCallbackDescriptorCompletion_Dst, respectively, instead of with + EDmaCallbackDescriptorCompletion. + + Requires the DMAC to support this feature. + + @see SDmacCaps::iAsymDescriptorInterrupt + */ + KDmaAsymDescriptorCallback = 0x20, + /** Execute the frame completion callback separately for source and + destination subtransfers. + + This flag modifies the behaviour of the + TDmaTransferFlags::KDmaCallbackAfterEveryFrame flag. If set, the + callback will complete with EDmaCallbackFrameCompletion_Src or + EDmaCallbackFrameCompletion_Dst, respectively, instead of with + EDmaCallbackFrameCompletion. + + Requires the DMAC to support this feature. + + @see SDmacCaps::iAsymFrameInterrupt + */ + KDmaAsymFrameCallback = 0x40, + /** This transfer (only) should use the channel priority indicated by + TDmaTransferArgs::iChannelPriority. + */ + KDmaRequestChannelPriority = 0x80 + }; + + +/** Values which can be used with the priority field when opening a channel + and/or when fragmenting a transfer request. + + @see TDmaChannel::SCreateInfo::iPriority + @see TDmaTransferArgs::iChannelPriority +*/ +enum TDmaPriority + { + /** No transfer priority preference (don't care value) */ + KDmaPriorityNone = 0x0, + /** Platform-independent transfer priority 1 (lowest) */ + KDmaPriority1 = 0x80000001, + /** Platform-independent transfer priority 2 */ + KDmaPriority2 = 0x80000002, + /** Platform-independent transfer priority 3 */ + KDmaPriority3 = 0x80000003, + /** Platform-independent transfer priority 4 */ + KDmaPriority4 = 0x80000004, + /** Platform-independent transfer priority 5 */ + KDmaPriority5 = 0x80000005, + /** Platform-independent transfer priority 6 */ + KDmaPriority6 = 0x80000006, + /** Platform-independent transfer priority 7 */ + KDmaPriority7 = 0x80000007, + /** Platform-independent transfer priority 8 (highest) */ + KDmaPriority8 = 0x80000008 + }; + + +/** Contains the configuration values for either the source or the + destination side of a DMA transfer. + + Note that some fields (notably iElementSize, iElementsPerFrame and + iFramesPerTransfer) may only differ between source and destination if + the underlying DMAC supports this. + + @see SDmacCaps::iSrcDstAsymmetry + @see TDmaTransferArgs::iSrcConfig + @see TDmaTransferArgs::iDstConfig +*/ +struct TDmaTransferConfig + { +friend struct TDmaTransferArgs; + + /** Default constructor. Initializes all fields with meaningful default + values. + */ +#ifdef DMA_APIV2 + KIMPORT_C +#endif + TDmaTransferConfig(); + + /** Intended for general use ie. not 2D or 1D transfers + */ +#ifdef DMA_APIV2 + KIMPORT_C +#endif + TDmaTransferConfig ( + TUint32 aAddr, + TUint aTransferFlags, + TDmaAddrMode aAddrMode = KDmaAddrModePostIncrement, + TUint aSyncFlags = KDmaSyncAuto, + TDmaBurstSize aBurstSize = KDmaBurstSizeAny, + TUint aElementSize = 0, + TUint aElementsPerPacket = 0, + TUint aPslTargetInfo = 0, + TInt aRepeatCount = 0 + ); + + /** Intended for 1D and 2D transfers + */ +#ifdef DMA_APIV2 + KIMPORT_C +#endif + TDmaTransferConfig ( + TUint32 aAddr, + TUint aElementSize, + TUint aElementsPerFrame, + TUint aFramesPerTransfer, + TInt aElementSkip, + TInt aFrameSkip, + TUint aTransferFlags, + TUint aSyncFlags = KDmaSyncAuto, + TDmaBurstSize aBurstSize = KDmaBurstSizeAny, + TUint aElementsPerPacket = 0, + TUint aPslTargetInfo = 0, + TInt aRepeatCount = 0 + ); + + /** Transfer start address */ + TUint32 iAddr; + /** Address mode */ + TDmaAddrMode iAddrMode; + /** Element size in bytes (1/2/4/8) */ + TUint iElementSize; + /** Number of elements per frame */ + TUint iElementsPerFrame; + /** Number of elements per packet */ + TUint iElementsPerPacket; + /** Number of frames to transfer (result is the transfer block) */ + TUint iFramesPerTransfer; + /** Element skip in bytes (for addr modes E1DIndex or E2DIndex) */ + TInt iElementSkip; + /** Frame skip in bytes (for addr mode E2DIndex) */ + TInt iFrameSkip; + /** Use burst transactions of the specified size (in bytes) + @see TDmaBurstSize + */ + TInt iBurstSize; + /** PIL src/dst config flags. + @see TDmaTransferFlags + */ + TUint32 iFlags; + /** Transfer synchronization flags. + @see TDmaTransferSyncFlags + */ + TUint32 iSyncFlags; + /** Information passed to the PSL */ + TUint iPslTargetInfo; + /** How often to repeat this (sub-)transfer: + 0 no repeat (the default) + 1..n once / n times + -1 endlessly. + */ + TInt iRepeatCount; + /** Structure contents delta vector (usage tbd) */ + TUint32 iDelta; + /** Reserved for future use */ + TUint32 iReserved; + +private: + /** Private constructor. Initializes fields with the values passed in by + the legacy version of the DDmaRequest::Fragment() call. + */ + TDmaTransferConfig(TUint32 aAddr, TUint aFlags, TBool aAddrInc); + }; + + +/** To be used by the client to pass DMA transfer request details to the + framework. + + Also used internally by the framework as a pseudo descriptor if the + controller doesn't support hardware descriptors (scatter/gather LLI). + + @see DDmaRequest::Fragment +*/ +struct TDmaTransferArgs + { + friend class DDmaRequest; + friend class TDmaChannel; + friend class TDmac; + friend class DmaChannelMgr; + + /** Default constructor. Initializes all fields with meaningful default + values. + */ +#ifdef DMA_APIV2 + KIMPORT_C +#endif + TDmaTransferArgs(); + + /** For transfers where src and dst TDmaTransferConfig structs share some + of the same options ie. iDmaTransferFlags, iAddrMode, iSyncFlags, + iBurstSize, and iElementSize. + + @param aSrcAddr + @param aDstAddr + @param aCount Number of bytes to transfer + @param aDmaTransferFlags Bitmask of TDmaTransferFlags for src and dst + @param aDmaSyncFlags Bitmask of TDmaTransferSyncFlags for src and dst + @param aMode Address mode for src and dst + @param aDmaPILFlags Bitmask of TDmaPILFlags + @param aElementSize In bytes (1/2/4/8) for src and dst + @param aChannelPriority + @param aBurstSize for src and dst + @param aPslRequestInfo Info word passed to the PSL + @param aGraphicOp Graphics operation to be executed + @param aColour Colour value for graphics operation + */ +#ifdef DMA_APIV2 + KIMPORT_C +#endif + TDmaTransferArgs ( + TUint aSrcAddr, TUint aDstAddr, TUint aCount, + TUint aDmaTransferFlags, TUint aDmaSyncFlags = KDmaSyncAuto, + TUint aDmaPILFlags = 0, + TDmaAddrMode aMode = KDmaAddrModePostIncrement, TUint aElementSize = 0, + TUint aChannelPriority = KDmaPriorityNone, + TDmaBurstSize aBurstSize = KDmaBurstSizeAny, TUint aPslRequestInfo = 0, + TDmaGraphicsOps aGraphicOp = KDmaGraphicsOpNone, TUint32 aColour = 0 + ); + + /** For transfers needing specific options for source and destination + TDmaTransferConfig structs. + + @param aSrc Configuration values for the source + @param aDst Configuration values for the destination + @param aFlags @see TDmaPILFlags + @param aChannelPriority Use for this request (only) the indicated + channel priority. Requires KDmaRequestChannelPriority to be set in + iFlags as well. @see TDmaPriority + + @param aPslRequestInfo Info word passed to the PSL + @param aGraphicOp Graphics operation to be executed + @param aColour Colour value for graphics operation + */ +#ifdef DMA_APIV2 + KIMPORT_C +#endif + TDmaTransferArgs ( + const TDmaTransferConfig& aSrc, + const TDmaTransferConfig& aDst, + TUint32 aFlags = 0, + TUint aChannelPriority = KDmaPriorityNone, + TUint aPslRequestInfo = 0, + TDmaGraphicsOps aGraphicOp = KDmaGraphicsOpNone, TUint32 aColour = 0 + ); + + /** Configuration values for the source */ + TDmaTransferConfig iSrcConfig; + /** Configuration values for the destination */ + TDmaTransferConfig iDstConfig; + + /** Number of bytes to transfer (optional). + + A non-zero value here must be consistent with iElementSize, + iElementsPerFrame and iFramesPerTransfer in iSrcConfig and iDstConfig + if the latter are specified as well (or instead, they may be left at + their default values of zero). + + If zero, the PIL will fill in a value calculated from multiplying + iElementSize, iElementsPerFrame and iFramesPerTransfer in iSrcConfig, + so that the PSL can rely on it being always non-zero and valid. + */ + TUint iTransferCount; + /** Graphics operation to be executed */ + TDmaGraphicsOps iGraphicsOps; + /** Colour value for graphics operations */ + TUint32 iColour; + /** PIL common flags + @see TDmaPILFlags + */ + TUint32 iFlags; + /** Use for this request (only) the indicated channel priority. + Requires KDmaRequestChannelPriority to be set in iFlags as well. + @see TDmaPriority + */ + TUint iChannelPriority; + /** Info word passed to the PSL */ + TUint iPslRequestInfo; + + /** Structure contents delta vector (usage tbd) */ + TUint32 iDelta; + /** Reserved for future use */ + TUint32 iReserved1; + +private: + /** Private constructor. Initializes fields with the values passed in by + the legacy version of the DDmaRequest::Fragment() call. + */ + TDmaTransferArgs(TUint32 aSrcAddr, TUint32 aDstAddr, TInt aCount, + TUint aFlags, TUint32 aPslInfo); + /** Stores the PSL cookie returned by TDmaChannel::PslId() at request + fragmentation time. + The value PslId() is often (but not necessarily) identical with the + client's TDmaChannel::SCreateInfo::iCookie, which gets passed by the + PIL into DmaChannelMgr::Open() as 'aOpenId'. + */ + TUint32 iChannelCookie; + /** Reserved for future use */ + TUint32 iReserved2; + }; + + +/** DMAC capabilities info structure. + + Instances are to be filled in by the PSL and then linked to via TDmaChannel + objects after they have been opened. + + The contents may vary even between channels on the same DMAC (but will + remain constant for a given channel for the duration that it is open), + depending on static or dynamic factors which only the PSL knows about. + + @see TDmaChannel::Open + @see TDmaChannel::DmacCaps +*/ +struct SDmacCaps + { + /** DMAC supports n + 1 different channel priorities. */ + TUint iChannelPriorities; + /** DMAC supports the pausing and resuming of channels. */ + TBool iChannelPauseAndResume; + /** DMA addresses must be aligned on an element size boundary. */ + TBool iAddrAlignedToElementSize; + /** DMAC supports 1D (element) index addressing in hardware. */ + TBool i1DIndexAddressing; + /** DMAC supports 2D (frame) index addressing in hardware. */ + TBool i2DIndexAddressing; + /** DMAC supports these transfer synchronization types (bitmap of values). + + @see TDmaTransferSyncFlags + */ + TUint iSynchronizationTypes; + /** DMAC supports burst transactions with these sizes (bitmap of values). + + @see TDmaBurstSize + */ + TUint iBurstTransactions; + /** DMAC supports a 'h/w descriptor complete' interrupt. */ + TBool iDescriptorInterrupt; + /** DMAC supports a 'frame transfer complete' interrupt. */ + TBool iFrameInterrupt; + /** DMAC supports a 'linked-list pause event' interrupt. */ + TBool iLinkedListPausedInterrupt; + /** DMAC supports endianness conversion. */ + TBool iEndiannessConversion; + /** DMAC supports these graphics operations (bitmap of values). + + @see TDmaGraphicsOps + */ + TUint iGraphicsOps; + /** DMAC supports repeated transfers (loops). */ + TBool iRepeatingTransfers; + /** DMAC supports logical channel linking (chaining). */ + TBool iChannelLinking; + /** DMAC supports scatter/gather mode (linked list items). */ + TBool iHwDescriptors; + /** DMAC supports asymmetric source and destination transfer + parameters (such as element size). + */ + TBool iSrcDstAsymmetry; + /** DMAC supports asymmetric h/w descriptor lists. + + ETrue here requires ETrue for iHwDescriptors and iSrcDstAsymmetry as + well. + */ + TBool iAsymHwDescriptors; + /** DMAC with asymmetric descriptor support has the limitation that the + number of bytes transferred in source and destination must be equal in + every link segment (i.e. in each src/dst descriptor pair). + + ETrue here requires ETrue for iAsymHwDescriptors as well. + */ + TBool iBalancedAsymSegments; + /** DMAC supports separate transfer completion notifications for source and + destination side subtransfers. + + This capability is required for the asymmetric transfer completion + callback API feature. + + @see TDmaPILFlags::KDmaAsymCompletionCallback + */ + TBool iAsymCompletionInterrupt; + /** DMAC supports separate descriptor completion notifications for source and + destination side. + + This capability is required for the asymmetric descriptor completion + callback API feature. + + ETrue here requires ETrue for both iDescriptorInterrupt and + iAsymHwDescriptors as well. + + @see TDmaPILFlags::KDmaAsymDescriptorCallback + */ + TBool iAsymDescriptorInterrupt; + /** DMAC supports separate frame completion notifications for source and + destination side. + + This capability is required for the asymmetric frame completion + callback API feature. + + ETrue here requires ETrue for iFrameInterrupt as well. + + @see TDmaPILFlags::KDmaAsymFrameCallback + */ + TBool iAsymFrameInterrupt; + + /** Reserved for future use */ + TUint32 iReserved[5]; + }; + + +struct TDmaV2TestInfo + { + enum {KMaxChannels=32}; + /** Maximum transfer size in bytes for all channels (ie. the minimum of all channels' maximum size)*/ + TUint iMaxTransferSize; + /** 3->Memory buffers must be 4-byte aligned, 7->8-byte aligned, ... */ + TUint iMemAlignMask; + /** Cookie to pass to DDmaRequest::Fragment for memory-memory transfer */ + TUint32 iMemMemPslInfo; + /** Number of test single-buffer channels */ + TInt iMaxSbChannels; + /** Pointer to array containing single-buffer test channel ids */ + TUint32 iSbChannels[KMaxChannels]; + /** Number of test double-buffer channels */ + TInt iMaxDbChannels; + /** Pointer to array containing double-buffer test channel ids */ + TUint32 iDbChannels[KMaxChannels]; + /** Number of test scatter-gather channels */ + TInt iMaxSgChannels; + /** Pointer to array containing scatter-gather test channel ids */ + TUint32 iSgChannels[KMaxChannels]; + }; + + +#endif // #ifndef __DMADEFS_H__ diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/e32ver.h --- a/kernel/eka/include/e32ver.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/include/e32ver.h Mon Jan 18 21:31:10 2010 +0200 @@ -28,7 +28,7 @@ const TInt KE32MajorVersionNumber=2; const TInt KE32MinorVersionNumber=0; -const TInt KE32BuildVersionNumber=2058; +const TInt KE32BuildVersionNumber=2063; const TInt KMachineConfigurationMajorVersionNumber=1; const TInt KMachineConfigurationMinorVersionNumber=0; diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/kernel/arm/bootcpu.inc --- a/kernel/eka/include/kernel/arm/bootcpu.inc Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/include/kernel/arm/bootcpu.inc Mon Jan 18 21:31:10 2010 +0200 @@ -363,10 +363,16 @@ CFG_ASID_Present SETL {TRUE} CFG_Cpu_Has_CLZ SETL {TRUE} CFG_TEX SETL {TRUE} + IF CFG_MMFlexible +; flexible memory model doesn't use Write Through memory for internal mappings. +CFG_WriteThroughDisabled SETL {TRUE} + ELSE +; multiple memory model uses Write Through memory for internal mappings unless erratum 399234 prevents us to do so IF (:LNOT: :DEF: CFG_CPU_ARM1136_ERRATUM_399234_FIXED) CFG_WriteThroughDisabled SETL {TRUE} ENDIF - + ENDIF + INIT_NUMERIC_CONSTANT InitialMMUCR, MMUCR_A+MMUCR_W+MMUCR_SBO+MMUCR_I+MMUCR_IT+MMUCR_DT INIT_NUMERIC_CONSTANT ExtraMMUCR, MMUCR_M+MMUCR_C+MMUCR_V+MMUCR_Z+MMUCR_XP+MMUCR_U diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/kernel/cache_maintenance.h --- a/kernel/eka/include/kernel/cache_maintenance.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/include/kernel/cache_maintenance.h Mon Jan 18 21:31:10 2010 +0200 @@ -301,12 +301,16 @@ static void CleanAndInvalidate_DCache_All(); /* - * Synchronises a single line of cache(s) for instruction execution. + * Synchronises the ICache and DCache for instruction execution. + * Also invalidates the branch predictor array, this is architecture dependant: + * ARM7: Invalidates aAddr and aAddr+2 (covering possible THUMB instructions) + * ARM6: Invalidates the whole Branch Predictor Array + * * On SMP, only the running core is maintained. * - * @arg aAddr Virtual address that belongs to the cache line. + * @arg aAddr 32bit aligned virtual address that belongs to the cache line. * - * NOTE: On SMP this is guaranted NOT to broadcast to other cores. + * NOTE: On SMP this is guaranteed NOT to broadcast to other cores. * NOTE: It assumes the same line size for ICache and DCache */ static void IMB_CacheLine(TLinAddr aAddr); diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/kernel/kernel.h --- a/kernel/eka/include/kernel/kernel.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/include/kernel/kernel.h Mon Jan 18 21:31:10 2010 +0200 @@ -229,6 +229,7 @@ const TUint8 KMutexOrdRamDrive = KMutexOrdGeneral7; /**< @internalComponent */ +const TUint8 KMutexOrdDmaChannel = 0x70; /**< @internalComponent */ const TUint8 KMutexOrdShPool = 0x68; /**< @internalComponent */ const TUint8 KMutexOrdCodeSegLock = 0x60; /**< @internalComponent */ const TUint8 KMutexOrdPubSub2 = 0x5e; /**< @internalComponent */ diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/nkern/nk_cpu.h --- a/kernel/eka/include/nkern/nk_cpu.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/include/nkern/nk_cpu.h Mon Jan 18 21:31:10 2010 +0200 @@ -130,7 +130,7 @@ #endif #endif - #if (defined(__CPU_ARM1136__) && defined(__CPU_ARM1136_ERRATUM_399234_FIXED)) || (defined(__CPU_ARM11MP__) && defined (__SMP__) ) + #if (defined(__CPU_ARM1136__) && defined(__CPU_ARM1136_ERRATUM_399234_FIXED) && !defined(__MEMMODEL_FLEXIBLE__)) || (defined(__CPU_ARM11MP__) && defined (__SMP__) ) // Page tables on these platforms are either uncached or write through cached. #else // Page/directory tables are fully cached (write-back) on these platforms. diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/nkern/nk_priv.h --- a/kernel/eka/include/nkern/nk_priv.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/include/nkern/nk_priv.h Mon Jan 18 21:31:10 2010 +0200 @@ -511,8 +511,18 @@ */ TBool InterruptsStatus(TBool aRequest); +//declarations for the checking of kernel preconditions -//declarations for the checking of kernel precoditions +/** +@internalComponent + +PRECOND_FUNCTION_CALLER is needed for __ASSERT_WITH_MESSAGE_ALWAYS(), +so is outside the #ifdef _DEBUG. +*/ +#ifndef PRECOND_FUNCTION_CALLER +#define PRECOND_FUNCTION_CALLER 0 +#endif + #ifdef _DEBUG /** @@ -548,7 +558,7 @@ /** @internalComponent */ -#define CHECK_PRECONDITIONS(mask,function) CheckPreconditions(mask,function,0) +#define CHECK_PRECONDITIONS(mask,function) CheckPreconditions(mask,function,PRECOND_FUNCTION_CALLER) #ifdef __KERNEL_APIS_CONTEXT_CHECKS_FAULT__ @@ -557,7 +567,7 @@ */ #define __ASSERT_WITH_MESSAGE_DEBUG(cond,message,function) \ __ASSERT_DEBUG( (cond), ( \ - DEBUGPRINT("Assertion failed: %s\nFunction: %s\n",message,function),\ + DEBUGPRINT("Assertion failed: %s\nFunction: %s; called from: %08x\n",message,function,PRECOND_FUNCTION_CALLER),\ NKFault(function, 0))) #else//!__KERNEL_APIS_CONTEXT_CHECKS_FAULT__ @@ -566,7 +576,7 @@ */ #define __ASSERT_WITH_MESSAGE_DEBUG(cond,message,function) \ __ASSERT_DEBUG( (cond), \ - DEBUGPRINT("Assertion failed: %s\nFunction: %s\n",message,function)) + DEBUGPRINT("Assertion failed: %s\nFunction: %s; called from: %08x\n",message,function,PRECOND_FUNCTION_CALLER)) #endif//__KERNEL_APIS_CONTEXT_CHECKS_FAULT__ @@ -588,7 +598,7 @@ */ #define __ASSERT_WITH_MESSAGE_ALWAYS(cond,message,function) \ __ASSERT_ALWAYS( (cond), ( \ - DEBUGPRINT("Assertion failed: %s\nFunction: %s\n",message,function),\ + DEBUGPRINT("Assertion failed: %s\nFunction: %s; called from: %08x\n",message,function,PRECOND_FUNCTION_CALLER),\ NKFault(function, 0))) #else /** @@ -596,7 +606,7 @@ */ #define __ASSERT_WITH_MESSAGE_ALWAYS(cond,message,function) \ __ASSERT_ALWAYS( (cond), \ - DEBUGPRINT("Assertion failed: %s\nFunction: %s\n",message,function)) + DEBUGPRINT("Assertion failed: %s\nFunction: %s; called from: %08x\n",message,function,PRECOND_FUNCTION_CALLER)) #endif//__KERNEL_APIS_CONTEXT_CHECKS_FAULT__ #endif//(!defined (__KERNEL_APIS_CONTEXT_CHECKS_WARNING__)&&!defined (__KERNEL_APIS_CONTEXT_CHECKS_FAULT__)) diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/include/nkernsmp/nk_priv.h --- a/kernel/eka/include/nkernsmp/nk_priv.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/include/nkernsmp/nk_priv.h Mon Jan 18 21:31:10 2010 +0200 @@ -781,6 +781,17 @@ //declarations for the checking of kernel preconditions + +/** +@internalComponent + +PRECOND_FUNCTION_CALLER is needed for __ASSERT_WITH_MESSAGE_ALWAYS(), +so is outside the #ifdef _DEBUG. +*/ +#ifndef PRECOND_FUNCTION_CALLER +#define PRECOND_FUNCTION_CALLER 0 +#endif + #ifdef _DEBUG /** @@ -816,7 +827,7 @@ /** @internalComponent */ -#define CHECK_PRECONDITIONS(mask,function) CheckPreconditions(mask,function,0) +#define CHECK_PRECONDITIONS(mask,function) CheckPreconditions(mask,function,PRECOND_FUNCTION_CALLER) #ifdef __KERNEL_APIS_CONTEXT_CHECKS_FAULT__ @@ -825,7 +836,7 @@ */ #define __ASSERT_WITH_MESSAGE_DEBUG(cond,message,function) \ __ASSERT_DEBUG( (cond), ( \ - DEBUGPRINT("Assertion failed: %s\nFunction: %s\n",message,function),\ + DEBUGPRINT("Assertion failed: %s\nFunction: %s; called from: %08x\n",message,function,PRECOND_FUNCTION_CALLER),\ NKFault(function, 0))) #else//!__KERNEL_APIS_CONTEXT_CHECKS_FAULT__ @@ -834,7 +845,7 @@ */ #define __ASSERT_WITH_MESSAGE_DEBUG(cond,message,function) \ __ASSERT_DEBUG( (cond), \ - DEBUGPRINT("Assertion failed: %s\nFunction: %s\n",message,function)) + DEBUGPRINT("Assertion failed: %s\nFunction: %s; called from: %08x\n",message,function,PRECOND_FUNCTION_CALLER)) #endif//__KERNEL_APIS_CONTEXT_CHECKS_FAULT__ @@ -856,7 +867,7 @@ */ #define __ASSERT_WITH_MESSAGE_ALWAYS(cond,message,function) \ __ASSERT_ALWAYS( (cond), ( \ - DEBUGPRINT("Assertion failed: %s\nFunction: %s\n",message,function),\ + DEBUGPRINT("Assertion failed: %s\nFunction: %s; called from: %08x\n",message,function,PRECOND_FUNCTION_CALLER),\ NKFault(function, 0))) #else /** @@ -864,7 +875,7 @@ */ #define __ASSERT_WITH_MESSAGE_ALWAYS(cond,message,function) \ __ASSERT_ALWAYS( (cond), \ - DEBUGPRINT("Assertion failed: %s\nFunction: %s\n",message,function)) + DEBUGPRINT("Assertion failed: %s\nFunction: %s; called from: %08x\n",message,function,PRECOND_FUNCTION_CALLER)) #endif//__KERNEL_APIS_CONTEXT_CHECKS_FAULT__ #endif//(!defined (__KERNEL_APIS_CONTEXT_CHECKS_WARNING__)&&!defined (__KERNEL_APIS_CONTEXT_CHECKS_FAULT__)) diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/kernel/arm/cache_external.cpp --- a/kernel/eka/kernel/arm/cache_external.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/kernel/arm/cache_external.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -308,8 +308,8 @@ void ExternalCache::AtomicSync() { - CHECK_PRECONDITIONS(MASK_INTERRUPTS_DISABLED,"ExternalCache::AtomicCleanAndInvalidate"); - __KTRACE_OPT(KMMU,Kern::Printf("ExternalCache::AtomicCleanAndInvalidate")); + CHECK_PRECONDITIONS(MASK_INTERRUPTS_DISABLED,"ExternalCache::AtomicSync"); + __KTRACE_OPT(KMMU,Kern::Printf("ExternalCache::AtomicSync")); #if defined(__ARM_PL310_CACHE__) // On Pl310, we hold the lock while maintaining cache. Therefore, we cannot diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/kernel/arm/cache_maintenancev7.cia --- a/kernel/eka/kernel/arm/cache_maintenancev7.cia Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/kernel/arm/cache_maintenancev7.cia Mon Jan 18 21:31:10 2010 +0200 @@ -81,19 +81,20 @@ __NAKED__ void InternalCache::IMB_CacheLine(TLinAddr /*aAddr*/) { - asm("mov r1, #0 "); //will need zero reg for coprocessor instructions -//--Round the address down to the start of line--// + //--Determine base address of cache line--// asm("ldr r2, __DCacheInfoPoU "); asm("ldrh r3, [r2, #%a0]" : : "i" _FOFF(SCacheInfo,iLineLength)); - asm("sub ip, r3, #1 "); // ip=mask for offset within line - asm("bic r0, r0, ip "); // r0 = cache line base + asm("sub ip, r3, #1"); // ip=mask for offset within line + asm("bic r2, r0, ip"); // r2 = cache line base - DCCMVAU(r0); // Clean DCache line to Point-of-Unification - ARM_DSBSY; - ICIMVAU(r0); - BPIMVA(r0); - ARM_DSBSH; - ARM_ISBSY; + DCCMVAU(r2); // Clean DCache line to Point-of-Unification + ARM_DSBSY; // Data Sync Barrier (system) + ICIMVAU(r2); // Invalidate Instruction cache line to Point-of-Unification + BPIMVA(r0); // Invalidate aAddr from Branch Predictor Array + asm("add r0, r0, #2"); + BPIMVA(r0); // Invalidate possible THUMB instuction at aAddr+2 from Branch Predictor Array + ARM_DSBSH; // Data Sync Barrier (system) + ARM_ISBSY; // Instruction Sync Barrier __JUMP(,lr); } diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/kernel/sipc.cpp --- a/kernel/eka/kernel/sipc.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/kernel/sipc.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -546,6 +546,8 @@ NKern::ThreadEnterCS(); NKern::UnlockSystem(); TInt r = KErrNone; + TBool anyPins = EFalse; + TPinArray pinArray = { { 0, 0, 0, 0 } }; // local, copy to heap later if used for (TInt i = 0; descFlags != 0; ++i, argPinFlags >>= 1, descFlags >>= TIpcArgs::KBitsPerType) { @@ -561,19 +563,11 @@ TUint pinLength = desInfo.IsWriteable() ? desInfo.MaxLength() : desInfo.Length(); if (pinLength) { - if (!iPinArray) - { - iPinArray = new TPinArray; - if (!iPinArray) - { - r = KErrNoMemory; - break; - } - } - // This will only create and pin if the descriptor data is paged. // An out-of-memory error here means we fail the whole operation. - r = Kern::CreateAndPinVirtualMemory(iPinArray->iPinPtrs[i], desInfo.DataPtr(), pinLength); + r = Kern::CreateAndPinVirtualMemory(pinArray.iPinPtrs[i], desInfo.DataPtr(), pinLength); + if (pinArray.iPinPtrs[i]) + anyPins = ETrue; if (r == KErrNoMemory) break; if (r != KErrNone) @@ -589,24 +583,27 @@ } } + if (anyPins && r != KErrNoMemory) + { + iPinArray = new TPinArray (pinArray); + if (!iPinArray) + r = KErrNoMemory; + } + if (r == KErrNoMemory) { // Failed to pin everything so clean up any pin objects created. // This will also unpin any pinned memory. - if (iPinArray) - { - UnpinMessageArguments(iPinArray); - delete iPinArray; - iPinArray = NULL; - } + UnpinMessageArguments(&pinArray); } NKern::LockSystem(); // Remove the access on the session. if (aSession->TotalAccessDec() == DObject::EObjectDeleted) - {// This was the last access on the session and it has been deleted so - // don't access any of its members. + { + // This was the last access on the session and it has been deleted + // so don't access any of its members. r = KErrDisconnected; } NKern::ThreadLeaveCS(); diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/kernel/skernel.cpp --- a/kernel/eka/kernel/skernel.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/kernel/skernel.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1666,8 +1666,8 @@ */ EXPORT_C TUint8* Kern::ChunkUserBase(DChunk* aChunk, DThread* aThread) { - CHECK_PRECONDITIONS(MASK_NO_FAST_MUTEX,"Kern::ChunkUserAddress"); - __KTRACE_OPT(KMMU,Kern::Printf("Kern::ChunkUserAddress aChunk=%08x, aThread=%08x", aChunk, aThread)); + CHECK_PRECONDITIONS(MASK_NO_FAST_MUTEX,"Kern::ChunkUserBase"); + __KTRACE_OPT(KMMU,Kern::Printf("Kern::ChunkUserBase aChunk=%08x, aThread=%08x", aChunk, aThread)); NKern::LockSystem(); TUint8* r = aChunk->Base(aThread->iOwningProcess); NKern::UnlockSystem(); diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/kernel/sshbuf.cpp --- a/kernel/eka/kernel/sshbuf.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/kernel/sshbuf.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -849,7 +849,7 @@ */ EXPORT_C TInt Kern::ShBufMakeHandleAndOpen(TShBuf* aBuf, DThread* aThread) { - CHECK_PRECONDITIONS(MASK_THREAD_CRITICAL, "Kern::ShPoolMakeHandleAndOpen"); + CHECK_PRECONDITIONS(MASK_THREAD_CRITICAL, "Kern::ShBufMakeHandleAndOpen"); if (!aThread) aThread = TheCurrentThread; diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/kernel/sthread.cpp --- a/kernel/eka/kernel/sthread.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/kernel/sthread.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1678,7 +1678,7 @@ */ EXPORT_C void Kern::SetRealtimeState(TThreadRealtimeState aNewState) { - CHECK_PRECONDITIONS(MASK_THREAD_STANDARD,"Kern::RequestComplete"); + CHECK_PRECONDITIONS(MASK_THREAD_STANDARD,"Kern::SetRealtimeState"); TheCurrentThread->SetRealtimeState(aNewState); } diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/kernel/sutils.cpp --- a/kernel/eka/kernel/sutils.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/kernel/sutils.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1924,8 +1924,8 @@ EXPORT_C DProcess* Kern::ProcessFromId(TUint aId) { DObjectCon& processes=*K::Containers[EProcess]; - CHECK_PRECONDITIONS(MASK_THREAD_CRITICAL,"Kern::ProcessFromId"); - __ASSERT_WITH_MESSAGE_MUTEX(processes.Lock(),"Process container mutex must be held","Kern::ThreadFromId"); + CHECK_PRECONDITIONS(MASK_THREAD_CRITICAL,"Kern::ProcessFromId"); + __ASSERT_WITH_MESSAGE_MUTEX(processes.Lock(),"Process container mutex must be held","Kern::ProcessFromId"); //end of preconditions check TInt c=processes.Count(); TInt i; @@ -3033,10 +3033,17 @@ } if (!m) return KErrNone; - if (aFunction) - Kern::Printf("In function %s :-", aFunction); - else - Kern::Printf("At address %08x :-", aAddr); + if (aFunction && aAddr) + { + Kern::Printf("In function %s called from %08x :-", aFunction, aAddr); + } + else + { + if (aFunction) + Kern::Printf("In function %s :-", aFunction); + else + Kern::Printf("At address %08x :-", aAddr); + } if (m & MASK_NO_FAST_MUTEX) Kern::Printf("Assertion failed: No fast mutex must be held"); if (m & MASK_NO_CRITICAL) @@ -4431,7 +4438,7 @@ */ EXPORT_C TInt Kern::CreatePhysicalPinObject(TPhysicalPinObject*& aPinObject) { - CHECK_PRECONDITIONS(MASK_THREAD_CRITICAL,"Kern::CreateVirtualPinObject"); + CHECK_PRECONDITIONS(MASK_THREAD_CRITICAL,"Kern::CreatePhysicalPinObject"); return M::CreatePhysicalPinObject(aPinObject); } diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/memmodel/epoc/flexible/arm/xsched.cia --- a/kernel/eka/memmodel/epoc/flexible/arm/xsched.cia Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/memmodel/epoc/flexible/arm/xsched.cia Mon Jan 18 21:31:10 2010 +0200 @@ -176,10 +176,15 @@ // restore alias... asm("got_alias:"); + // Disable interrupts so setting the alias pde is must complete before + // Mmu::RemoveAliasesForPageTable() can execute the alias IPI and vice + // versa. + __ASM_CLI(); // interrupts off asm("ldr r8, [r3, #%a0]" : : "i" (_FOFF(DMemModelThread, iAliasPdePtr)-_FOFF(DThread, iNThread)) ); asm("ldr r7, [r3, #%a0]" : : "i" (_FOFF(DMemModelThread, iAliasPde)-_FOFF(DThread, iNThread)) ); asm("orr r6, r6, r4"); // put ASID into address for TLB flush later... asm("str r7, [r8]"); // restore PDE for alias + __ASM_STI(); // interrupts back on CACHE_MAINTENANCE_PDE_PTE_UPDATED(r8); diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/memmodel/epoc/flexible/mmu/arm/xmmu.cpp --- a/kernel/eka/memmodel/epoc/flexible/mmu/arm/xmmu.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/memmodel/epoc/flexible/mmu/arm/xmmu.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -439,7 +439,7 @@ { // reuse existing functions rather than duplicating the logic TPde pde = BlankPde(aAttributes); - TPde pte = BlankPte(aAttributes, aPteType); + TPte pte = BlankPte(aAttributes, aPteType); return PageToSectionEntry(pte, pde); } @@ -882,11 +882,13 @@ // Now we have the os asid check access to kernel memory. if(aAddr >= KUserMemoryLimit && osAsid != (TUint)KKernelOsAsid) { + NKern::ThreadEnterCS(); + MmuLock::Unlock(); if (!iAliasLinAddr) {// Close the new reference as RemoveAlias won't do as iAliasLinAddr is not set. - aProcess->AsyncCloseOsAsid(); + aProcess->AsyncCloseOsAsid(); // Asynchronous close as this method should be quick. } - MmuLock::Unlock(); + NKern::ThreadLeaveCS(); return KErrBadDescriptor; // prevent access to supervisor only memory } @@ -896,13 +898,15 @@ // address is in global section, don't bother aliasing it... if (!iAliasLinAddr) {// Close the new reference as not required. - aProcess->AsyncCloseOsAsid(); + NKern::ThreadEnterCS(); + MmuLock::Unlock(); + aProcess->AsyncCloseOsAsid(); // Asynchronous close as this method should be quick. + NKern::ThreadLeaveCS(); } else {// Remove the existing alias as it is not required. - DoRemoveAlias(iAliasLinAddr); + DoRemoveAlias(iAliasLinAddr); // Releases mmulock. } - MmuLock::Unlock(); aAliasAddr = aAddr; TInt maxSize = KChunkSize-(aAddr&KChunkMask); aAliasSize = aSizeAsyncCloseOsAsid(); + + // Must close the os asid while in critical section to prevent it being + // leaked. However, we can't hold the mmu lock so we have to enter an + // explict crtical section. It is ok to release the mmu lock as the + // iAliasLinAddr and iAliasProcess members are only ever updated by the + // current thread. + NKern::ThreadEnterCS(); + MmuLock::Unlock(); + iAliasProcess->AsyncCloseOsAsid(); // Asynchronous close as this method should be quick. + NKern::ThreadLeaveCS(); } diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/memmodel/epoc/flexible/mmu/mmu.cpp --- a/kernel/eka/memmodel/epoc/flexible/mmu/mmu.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/memmodel/epoc/flexible/mmu/mmu.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -701,6 +701,7 @@ // which has a reference on it's process, which should own the address space! #ifdef __BROADCAST_CACHE_MAINTENANCE__ + TInt aliasAsid = -1; if (thread->iAliasLinAddr) { // If an alias is in effect, the the thread will be locked to the current CPU, @@ -713,6 +714,12 @@ __KTRACE_OPT2(KPAGING,KPANIC,Kern::Printf("Fault with thread locked to current CPU! addr=0x%08x (%O pc=%x)",aFaultAddress,thread,aPc)); Exc::Fault(aExceptionInfo); } + // Open a reference on the aliased process's os asid before removing the alias + // so that the address space can't be freed while we try to access its members. + aliasAsid = thread->iAliasProcess->TryOpenOsAsid(); + // This should never fail as until we remove the alias there will + // always be at least one reference on the os asid. + __NK_ASSERT_DEBUG(aliasAsid >= 0); thread->RemoveAlias(); } #endif @@ -783,6 +790,15 @@ DMemModelThread::RestoreAddressSpace(); } +#ifdef __BROADCAST_CACHE_MAINTENANCE__ + // Close any reference on the aliased process's os asid before we leave the + // critical section. + if (aliasAsid >= 0) + { + thread->iAliasProcess->CloseOsAsid(); + } +#endif + NKern::ThreadLeaveCS(); // thread will die now if CheckRealtimeThreadFault caused a panic // deal with XTRAP_PAGING... @@ -1284,6 +1300,56 @@ iCount = 0; } +#ifdef __SMP__ +/** +Dummy IPI to be invoked when a thread's alias pde members are updated remotely +by another thread. + +@internalComponent +*/ +class TAliasIPI : public TGenericIPI + { +public: + static void RefreshIsr(TGenericIPI*); + void RefreshAlias(); + }; + + +/** +Dummy isr method. +*/ +void TAliasIPI::RefreshIsr(TGenericIPI*) + { + TRACE2(("TAliasIPI")); + } + + +/** +Queue the dummy IPI on all other processors. This ensures that DoProcessSwitch will +have completed updating iAliasPdePtr once this method returns. +*/ +void TAliasIPI::RefreshAlias() + { + NKern::Lock(); + QueueAllOther(&RefreshIsr); + NKern::Unlock(); + WaitCompletion(); + } + + +/** +Perform a dummy ipi on all the other processors to ensure if any of them are +executing DoProcessSwitch they will see the new value of iAliasPde before they +update iAliasPdePtr or will finish updating iAliasPdePtr before we continue. +This works as DoProcessSwitch() has interrupts disabled while reading iAliasPde +and updating iAliasPdePtr. +*/ +void BroadcastAliasRefresh() + { + TAliasIPI ipi; + ipi.RefreshAlias(); + } +#endif //__SMP__ /** Remove any thread IPC aliases which use the specified page table. @@ -1311,11 +1377,12 @@ TRACE2(("Thread %O RemoveAliasesForPageTable", this)); thread->iAliasPde = KPdeUnallocatedEntry; #ifdef __SMP__ // we need to also unmap the page table in case thread is running on another core... - // need Data Memory Barrier (DMB) here to make sure iAliasPde change is - // seen before we set the PDE entry, otherwise 'thread' may read old value - // and put it back - __e32_memory_barrier(); + + // Ensure other processors see the update to iAliasPde. + BroadcastAliasRefresh(); + *thread->iAliasPdePtr = KPdeUnallocatedEntry; + SinglePdeUpdated(thread->iAliasPdePtr); __NK_ASSERT_DEBUG((thread->iAliasLinAddr&KPageMask)==0); // Invalidate the tlb for the page using os asid of the process that created the alias @@ -1325,9 +1392,6 @@ // note, race condition with 'thread' updating its iAliasLinAddr is // not a problem because 'thread' will not the be accessing the aliased // region and will take care of invalidating the TLB. - // FIXME: There is still a race here. If the thread owning the alias reads the - // PDE before we clear thread->iAliasPde and writes it after we clear - // *thread->iAliasPdePtr the alias still ends up restored when it shouldn't be. #endif } MmuLock::Flash(); diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/memmodel/epoc/flexible/mmu/x86/xmmu.cpp --- a/kernel/eka/memmodel/epoc/flexible/mmu/x86/xmmu.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/memmodel/epoc/flexible/mmu/x86/xmmu.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -572,11 +572,13 @@ // Now we have the os asid check access to kernel memory. if(aAddr >= KUserMemoryLimit && osAsid != (TUint)KKernelOsAsid) { + NKern::ThreadEnterCS(); + MmuLock::Unlock(); if (!iAliasLinAddr) {// Close the new reference as RemoveAlias won't do as iAliasLinAddr is not set. - aProcess->AsyncCloseOsAsid(); + aProcess->AsyncCloseOsAsid(); // Asynchronous close as this method should be quick. } - MmuLock::Unlock(); + NKern::ThreadLeaveCS(); return KErrBadDescriptor; // prevent access to supervisor only memory } @@ -586,13 +588,15 @@ // address is in global section, don't bother aliasing it... if (!iAliasLinAddr) {// Close the new reference as not required. - aProcess->AsyncCloseOsAsid(); + NKern::ThreadEnterCS(); + MmuLock::Unlock(); + aProcess->AsyncCloseOsAsid(); // Asynchronous close as this method should be quick. + NKern::ThreadLeaveCS(); } else {// Remove the existing alias as it is not required. - DoRemoveAlias(iAliasLinAddr); + DoRemoveAlias(iAliasLinAddr); // Releases mmulock. } - MmuLock::Unlock(); aAliasAddr = aAddr; TInt maxSize = KChunkSize-(aAddr&KChunkMask); aAliasSize = aSizeAsyncCloseOsAsid(); + + // Must close the os asid while in critical section to prevent it being + // leaked. However, we can't hold the mmu lock so we have to enter an + // explict crtical section. It is ok to release the mmu lock as the + // iAliasLinAddr and iAliasProcess members are only ever updated by the + // current thread. + NKern::ThreadEnterCS(); + MmuLock::Unlock(); + iAliasProcess->AsyncCloseOsAsid(); // Asynchronous close as this method should be quick. + NKern::ThreadLeaveCS(); } diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/memmodel/epoc/flexible/mprocess.cpp --- a/kernel/eka/memmodel/epoc/flexible/mprocess.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/memmodel/epoc/flexible/mprocess.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -56,6 +56,7 @@ DProcess::Destruct(); } + TInt DMemModelProcess::TryOpenOsAsid() { if (__e32_atomic_tas_ord32(&iOsAsidRefCount, 1, 1, 0)) @@ -65,6 +66,7 @@ return KErrDied; } + void DMemModelProcess::CloseOsAsid() { if (__e32_atomic_tas_ord32(&iOsAsidRefCount, 1, -1, 0) == 1) @@ -73,6 +75,7 @@ } } + void DMemModelProcess::AsyncCloseOsAsid() { if (__e32_atomic_tas_ord32(&iOsAsidRefCount, 1, -1, 0) == 1) @@ -81,6 +84,7 @@ } } + TInt DMemModelProcess::NewChunk(DChunk*& aChunk, SChunkCreateInfo& aInfo, TLinAddr& aRunAddr) { aChunk=NULL; diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/memmodel/epoc/flexible/mshbuf.cpp --- a/kernel/eka/memmodel/epoc/flexible/mshbuf.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/memmodel/epoc/flexible/mshbuf.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -766,7 +766,7 @@ ++i; } - __KTRACE_OPT(KMMU, Kern::Printf(">KPageShift; // entry number in page table TPte* pPte=PageTable(aId)+ptOffset; // address of PTE @@ -785,7 +785,7 @@ } else { - __KTRACE_OPT(KMMU,Kern::Printf("ArmMmu::RemapPages() called on a non-4K page!")); + __KTRACE_OPT(KMMU,Kern::Printf("ArmMmu::RemapPage() called on a non-4K page!")); Panic(ERemapPageFailed); } } diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/memmodel/epoc/moving/mchunk.cpp --- a/kernel/eka/memmodel/epoc/moving/mchunk.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/memmodel/epoc/moving/mchunk.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -728,7 +728,7 @@ } if (iSize==0 && (iAttributes&EFixedAddress)==0) { - __KTRACE_OPT(KMMU,Kern::Printf("DMemModelChunk::Adjust remove region")); + __KTRACE_OPT(KMMU,Kern::Printf("DMemModelChunk::DoDecommit remove region")); NKern::LockSystem(); if (TLinAddr(iBase)==iHomeBase) iBase=NULL; diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/nkern/arm/ncutils.cia --- a/kernel/eka/nkern/arm/ncutils.cia Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/nkern/arm/ncutils.cia Mon Jan 18 21:31:10 2010 +0200 @@ -364,8 +364,9 @@ // set r2 = context id asm("ldrb r4, [lr, #%a0]" : : "i" _FOFF(TScheduler,iInIDFC)); asm("mrs r2, cpsr"); - asm("and r2, r2, #3"); + asm("and r2, r2, #0x0f"); asm("cmp r2, #3"); + asm("movhi r2, #2"); // r2 = context ID => 1 for FIQ, 2 for IRQ/ABT/UND/SYS asm("cmpeq r4, #0"); asm("ldreq r2, [lr, #%a0]" : : "i" _FOFF(TScheduler,iCurrentThread)); @@ -399,8 +400,9 @@ // set r2 = context id asm("ldrb r4, [lr, #%a0]" : : "i" _FOFF(TScheduler,iInIDFC)); asm("mrs r2, cpsr"); - asm("and r2, r2, #3"); + asm("and r2, r2, #0x0f"); asm("cmp r2, #3"); + asm("movhi r2, #2"); // r2 = context ID => 1 for FIQ, 2 for IRQ/ABT/UND/SYS asm("cmpeq r4, #0"); asm("ldreq r2, [lr, #%a0]" : : "i" _FOFF(TScheduler,iCurrentThread)); @@ -423,8 +425,9 @@ asm("stmdb sp!, {lr}"); asm("ldrb lr, [r12, #%a0]" : : "i" _FOFF(TScheduler,iInIDFC)); asm("mrs r4, cpsr"); - asm("and r4, r4, #3"); + asm("and r4, r4, #0x0f"); asm("cmp r4, #3"); + asm("movhi r4, #2"); // r4 = context ID => 1 for FIQ, 2 for IRQ/ABT/UND/SYS asm("cmpeq lr, #0"); asm("ldreq r4, [r12, #%a0]" : : "i" _FOFF(TScheduler,iCurrentThread)); asm("stmdb sp!, {r4}"); @@ -469,8 +472,9 @@ asm("mrs r2, cpsr"); // r2 = cpsr asm("ldrb lr, [r12, #%a0]" : : "i" _FOFF(TScheduler,iInIDFC)); - asm("and r4, r2, #3"); + asm("and r4, r2, #0x0f"); asm("cmp r4, #3"); + asm("movhi r4, #2"); // r4 = context ID => 1 for FIQ, 2 for IRQ/ABT/UND/SYS asm("cmpeq lr, #0"); asm("ldreq lr, [r12, #%a0]" : : "i" _FOFF(TScheduler,iKernCSLocked)); asm("ldreq r4, [r12, #%a0]" : : "i" _FOFF(TScheduler,iCurrentThread)); @@ -525,7 +529,6 @@ __POPRET("r4-r6,"); } - __NAKED__ EXPORT_C TBool BTrace::OutFiltered(TUint32 a0, TUint32 a1, TUint32 a2, TUint32 a3) { // fall through to OutFilteredX... diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/nkern/nk_timer.cpp --- a/kernel/eka/nkern/nk_timer.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/nkern/nk_timer.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -460,7 +460,7 @@ // if first ordered queue entry expires in <32ms, queue the DFC to transfer NTimer* pC=(NTimer*)iOrderedQ.First(); #ifdef __EPOC32__ - __ASSERT_WITH_MESSAGE_DEBUG(iMsCount<=pC->iTriggerTime, "iMsCount has exceeded pC->iTriggerTime; function called later than expected ","NKTimer::Tick()"); + __ASSERT_WITH_MESSAGE_DEBUG(iMsCount<=pC->iTriggerTime, "iMsCount has exceeded pC->iTriggerTime; function called later than expected ","NTimerQ::Tick()"); #endif if (TInt(pC->iTriggerTime-iMsCount)NKIU: ID=%08x", aId)); - CHECK_PRECONDITIONS(MASK_THREAD_STANDARD,"NKern::InterruptBind"); + CHECK_PRECONDITIONS(MASK_THREAD_STANDARD,"NKern::InterruptUnbind"); NIrq* pI; NIrqHandler* pH; TInt r = NIrq::FromHandle(aId, pI, pH); diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/release.txt --- a/kernel/eka/release.txt Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/release.txt Mon Jan 18 21:31:10 2010 +0200 @@ -1,3 +1,111 @@ +Version 2.00.2063 +================= +(Made by vfebvre 16/12/2009) + +1. MichaelP + 1. DEFECT FIX: DEF143310: DMA Framework makes use of PRM difficult + Introduced new virtual DMA PIL function TDmaChannel::QueuedRequestCountChanged() + which can be overridden in a DMA PSL to implement channel/DMAC power management + functionality outside of any PIL mutexes. For details see the description in + /os/kernelhwsrv/kernel/eka/include/drivers/dma_v1.h. + + +Version 2.00.2062 +================= +(Made by vfebvre 15/12/2009) + +1. cnotton + 1. MINOR_CHANGE Added a few missing headers for when SYMBIAN_ENABLE_PUBLIC_PLATFORM_HEADER_SPLIT is enabled. + + +Version 2.00.2061 +================= +(Made by VincentF 14/12/2009) + +1. gcochran + 1. DEF142419: Kernel doesn't flush prefetch buffer properly + + +Version 2.00.2060 +================= +(Made by VincentF 10/12/2009) + +1. TomCosgrove + 1. MINOR_CHANGE: Fix function names given in various trace and precondition statements + 2. DEFECT FIX: DEF143168: Kernel precondition checks don't give any indication of the caller + Added compiler-specific macro PRECOND_FUNCTION_CALLER, defaulting to 0 if not present, and + use this in CHECK_PRECONDITIONS() and the various __ASSERT_WITH_MESSAGE_*() macros. Also + updated CheckPreconditions() to print this address even if the function name is given (as + it is when called from the C macros). + 3. DEFECT FIX: DEF143237: SBTraceData::CheckFilter2() causes issues when executed with undefined CPU mode + Don't just take the CPSR & 0x03 to get the context value, since undef (etc) mode gets + confused with thread (normal supervisor) mode. Instead, AND with 0x0f and set to 2 if + higher than 3. + +2. DjordjeK + 1. DEFECT FIX: DEF143166: Default caching of page tables on 1136 flexible memory model is wrong + Fixed the problem with caching attributes (of page tables, code & exception vector) on 1136 + running flexible memory model. Platforms other then 1136 are not affected. + +3. kingbozhang + 1. DEFECT FIX: DEF142623: TKEA-7WJC4S:[OTG] A malfunctioning peripheral cannot be reported to the UI + This defect is some USB devices do not comply with USB2.0 spec. Because they drive VBus of + their upstream port, however, such behaviour is forbidden in USB2.0. + +4. DaveGordon + 1. DEFECT FIX: DEF141546: T_CPUTIME fails on SMPPAGE/SMPDATAPAGE ROMs... + Improve test by making sure threads are bound to the right cores + 2. DEFECT FIX: DEF143303: Crash unpinning message descriptors + Pinning operation now uses an initialised local array to hold potential references to pin + objects, and then transfers them all into a heap-allocated object only if at least one + such reference was created, ensuring that the subsequent unpin sees only good values. + +5. stmansfi + 1. MINOR_CHANGE Update header comments in HCR PIL files + +6. vfebvre + 1. MINOR_CHANGE Rename Bld.inf to bld.inf (for DEF142518) + +7. kunmitta + 1. MINOR_CHANGE Added library names in compsupp explicitly for RVCT4.0 linkage + +8. cnotton + 1. MINOR_CHANGE Fixed T_SMPSOAKSPIN.CPP for e32svr.h. + 2. DEFECT FIX: DEF143216: btrace.iby does not load btracex.ldd as an extension + + +Version 2.00.2059 +================= +(Made by VincentF 03/12/2009) + +1. MichaelP + 1. MILESTONE: GT0515, MS3.15 + RM-RIM REQ417-52838:FEA417-62893 DMA Upgrade : Client Callback from ISR + Gaia Feature Release 428985 Package Release 428988 + 2. DEFECT FIX: DEF143285: t_dma and t_dma2 test failures + +2. MarkTa + 1. DEFECT FIX: DEF143220: Flexible memory model - Aliasing can cause the system to crash. + Fix various race conditions in the flexible memory model's handling of aliasing. + +3. RyanHarkin + 1. MINOR_CHANGE: Removed SYMBIAN_BASE_USE_GCE from header.iby files as this broke the build + 2. MINOR_CHANGE: Tidy up naviengine.h and naviengine_priv.h + 3. MINOR_CHANGE: Update NaviEngine release.txt because nobody else has + 4. MINOR_CHANGE: Remove commented out code from csi.mmp + 5. MINOR_CHANGE: updated NaviEngine User Guide + 6. MINOR_CHANGE: Bootloader OBY file bootbinary directive fixed + +4. RichardCo + 1. DEFECT FIX: DEF142738: T_SMPSAFE fails on SMP unicore + +5. erifung + 1. DEFECT FIX: DEF142542: Bridge: t_dobject fails on 8500.. + +6. cnotton + 1. DEFECT FIX: DEF143224: Move TFlowControl to a published header + + Version 2.00.2058 ================= (Made by vinojose 03/12/2009) @@ -9,31 +117,28 @@ 2. NeilClifford 1. DEFECT FIX: DEF143039: MedMMC should not use Cache for Physical Address Requests -3. RichardCo - 1. DEFECT FIX: DEF142738: T_SMPSAFE fails on SMP unicore - -4. MarkTa +3. MarkTa 1. DEFECT FIX: DEF143129: WDP - Allocating a demand paged page table can fault the system Implement on demand stealing of paged page tables when allocating paged page tables. -5. StephenSun +4. StephenSun 1. DEFECT FIX: DEF142844: initialize SRP timeout -6. OliverStuart +5. OliverStuart 1. DEFECT FIX: DEF142840: KERN-EXEC 3 panics in T_SHBUF_PERF Must use kumemget to read TPtr8 from user memory. -7. LaneRoberts +6. LaneRoberts 1. DEFECT FIX: DEF143152: NaviEngine ARM4 ROMs cannot be built -8. ChrisBeale +7. ChrisBeale 1. DEFECT FIX: DEF143114: FMM thrashing monitor timer runs even when device is idle -9. cnotton +8. cnotton 1. MINOR_CHANGE: Fix SMP Soak test for Header File Relocation 2. DEFECT FIX: DEF143183: CTS79_MCL_wk46: TB92_200945 symbian tests compilation errors -10. lanerobe +9. lanerobe 1. DEFECT FIX: DEFECT FIX: DEF141811: T_MSTIM on Unicore SMP (Naviengine) Image Version 2.00.2057 diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/rombuild/btrace.iby --- a/kernel/eka/rombuild/btrace.iby Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/rombuild/btrace.iby Mon Jan 18 21:31:10 2010 +0200 @@ -18,7 +18,7 @@ #ifndef BTRACE_INCLUDED #define BTRACE_INCLUDED -data=KERNEL_DIR\DEBUG_DIR\BTRACEX_LDD \sys\bin\btracex.ldd +ROM_IMAGE[0] extension[VARID]=KERNEL_DIR\DEBUG_DIR\BTRACEX_LDD \sys\bin\btracex.ldd file=ABI_DIR\DEBUG_DIR\btracec.dll \sys\bin\btracec.dll #endif \ No newline at end of file diff -r 36bfc973b146 -r 329ab0095843 kernel/eka/rombuild/ubootldr.oby --- a/kernel/eka/rombuild/ubootldr.oby Thu Jan 07 13:38:45 2010 +0200 +++ b/kernel/eka/rombuild/ubootldr.oby Mon Jan 18 21:31:10 2010 +0200 @@ -20,7 +20,7 @@ #include files= -bootbinary=\Epoc32\Release\##MAIN##\_##VARIANT##_bootloader_bootrom.bin +bootbinary=\Epoc32\Release\##KMAIN##\_##VARIANT##_bootloader_bootrom.bin #include #include "user.iby" diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/defrag/d_pagemove.cpp --- a/kerneltest/e32test/defrag/d_pagemove.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/defrag/d_pagemove.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -42,9 +42,6 @@ const TInt KMinorVersionNumber=1; const TInt KBuildVersionNumber=1; - -_LIT(KLddName,"PageMove"); - class DPageMove; class DPageMoveFactory : public DLogicalDevice @@ -104,7 +101,7 @@ // Install the LDD - overriding pure virtual // { - return SetName(&KLddName); + return SetName(&KPageMoveLddName); } void DPageMoveFactory::GetCaps(TDes8& aDes) const @@ -327,13 +324,18 @@ } +#ifndef __MSVC6__ // VC6 can't cope with variable arguments in macros. +#define KERN_PRINTF(x...) Kern::Printf(x) +#endif + //#define EXTRA_TRACE #ifdef EXTRA_TRACE -#define KERN_PRINTF(x...) Kern::Printf(x) +#define PRINTF(x) x #else -#define KERN_PRINTF(x...) +#define PRINTF(x) #endif + TInt DPageMove::KernelDataMovePerformance(void) { const TInt KHeapPagesToMove = 2000; @@ -364,7 +366,7 @@ heapArray[i] = i; } - KERN_PRINTF("Testing Performance of Moving Kernel Data Pages"); + PRINTF(KERN_PRINTF("Testing Performance of Moving Kernel Data Pages")); TInt moveMode = EKMoveStack; for (; moveMode < EKMoveModes; moveMode++) @@ -379,14 +381,14 @@ baseAddr = pageAddr; endAddr = _ALIGN_UP((TLinAddr)heapArray + heapArraySize, iPageSize); actualHeapPages = (endAddr - baseAddr) / iPageSize; - KERN_PRINTF("heap baseAddr %x endAddr %x", baseAddr, endAddr); + PRINTF(KERN_PRINTF("heap baseAddr %x endAddr %x", baseAddr, endAddr)); break; case EKMoveStack: pageAddr = _ALIGN_DOWN((TLinAddr)stackArray, iPageSize); baseAddr = pageAddr; endAddr = _ALIGN_UP((TLinAddr)stackArray + KStackSize, iPageSize); - KERN_PRINTF("stack baseAddr %x endAddr %x", baseAddr, endAddr); + PRINTF(KERN_PRINTF("stack baseAddr %x endAddr %x", baseAddr, endAddr)); break; } diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/defrag/d_pagemove.h --- a/kerneltest/e32test/defrag/d_pagemove.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/defrag/d_pagemove.h Mon Jan 18 21:31:10 2010 +0200 @@ -23,6 +23,8 @@ #endif +_LIT(KPageMoveLddName,"d_pagemove"); + class TCapsPageMoveV01 { public: @@ -66,7 +68,10 @@ #ifndef __KERNEL_MODE__ inline TInt RPageMove::Open() { - return DoCreate(_L("PageMove"),TVersion(0,1,1),KNullUnit,NULL,NULL); + TInt r=User::LoadLogicalDevice(KPageMoveLddName); + if(r==KErrNone || r==KErrAlreadyExists) + r=DoCreate(KPageMoveLddName,TVersion(0,1,1),KNullUnit,NULL,NULL); + return r; } inline TInt RPageMove::TryMovingKHeap() diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/dma/d_dma.cpp --- a/kerneltest/e32test/dma/d_dma.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/dma/d_dma.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -128,6 +128,9 @@ if (r != KErrNone) Epoc::FreePhysicalRam(phys, aSize); iBufs[aIdx].iSize = aSize; + + __KTRACE_OPT(KDMA, Kern::Printf("TBufferMgr::Alloc buffer %d linAddr=0x%08x, physAddr=0x%08x, size=%d", + aIdx, Addr(aIdx), PhysAddr(aIdx), Size(aIdx))); } NKern::ThreadLeaveCS(); return r; @@ -155,6 +158,8 @@ #endif + +#ifndef DMA_APIV2 static TInt FragmentCount(DDmaRequest* aRequest) { TInt count = 0; @@ -162,6 +167,8 @@ count++; return count; } +#endif + ////////////////////////////////////////////////////////////////////////////// @@ -321,8 +328,11 @@ while (p < end) if (*p++ != val) { - __KTRACE_OPT(KDMA, Kern::Printf("Check DMA buffer failed offset: %d value: %d", - p-iBufMgr.Addr(i)-1, *(p-1))); +#ifdef _DEBUG + const TUint8 prevValue = *(p-1); +#endif + __KTRACE_OPT(KDMA, Kern::Printf("Check DMA buffer number %d failed at offset: %d value: %d(%c)", + i, p-iBufMgr.Addr(i)-1, prevValue, prevValue)); return EFalse; } return ETrue; @@ -361,7 +371,11 @@ { TInt reqIdx = (TInt)a1; __ASSERT_DEBUG(0 <= reqIdx && reqIdx < KMaxRequests, Kern::PanicCurrentThread(KClientPanicCat, __LINE__)); +#ifdef DMA_APIV2 + return iRequests[reqIdx]->FragmentCount(); +#else return FragmentCount(iRequests[reqIdx]); +#endif } case RTestDma::EMissInterrupts: return iChannel->MissNextInterrupts((TInt)a1); @@ -376,6 +390,8 @@ { TBuf8<64> cmd; Kern::KUDesGet(cmd, aDes); + __KTRACE_OPT(KDMA, Kern::Printf("DDmaTestChannel::Execute cmd=%S", &cmd)); + const TText8* p = cmd.Ptr(); const TText8* pEnd = p + cmd.Length(); while (p + +/** +The various types of requirement on a +value that can be specified by a TDmaCapability +*/ +enum TCapsReqType + { + EEqual, EGTE /* >= */, ELTE /* <= */, EBitsSet, EBitsClear + }; + +/** +Enumerates all the various DMA channel capabilities +*/ +enum TCapsReq + { + ENone, + EChannelPriorities, + EChannelPauseAndResume, + EAddrAlignedToElementSize, + E1DAddressing, + E2DAddressing, + ESynchronizationTypes, + EBurstTransactions, + EDescriptorInterrupt, + EFrameInterrupt, + ELinkedListPausedInterrupt, + EEndiannessConversion, + EGraphicsOps, + ERepeatingTransfers, + EChannelLinking, + EHwDescriptors, + ESrcDstAsymmetry, + EAsymHwDescriptors, + EBalancedAsymSegments, + EAsymCompletionInterrupt, + EAsymDescriptorInterrupt, + EAsymFrameInterrupt, + EPilVersion, + }; + +enum TResult {ERun=0, ESkip=1, EFail=2}; //The ordering of these should not be changed + +struct SDmacCaps; +struct TDmacTestCaps; + +/** +Represents a requirement for some DMA capability +to be either present or not present, less than, equal to, or +greater than some value, or to have certain bits in a mask +set or unset. +*/ +struct TDmaCapability + { + TDmaCapability() + :iCapsReq(ENone), iCapsReqType(EEqual), iValue(ETrue), iFail(EFalse) + {} + + TDmaCapability(TCapsReq aReq, TCapsReqType aReqType, TUint aValue, TBool aFail) + :iCapsReq(aReq), iCapsReqType(aReqType), iValue(aValue), iFail(aFail) + {} + + static void SelfTest(); + + /** + Compares the requirements held in the struct + against those described in aChannelCaps and makes a decision + as to whether this test case should be run, skipped, or failed. + */ + TResult CompareToDmaCaps(const SDmacCaps& aChannelCaps) const; + TResult CompareToDmaCaps(const TDmacTestCaps& aChannelCaps) const; + +private: + TBool RequirementSatisfied(const SDmacCaps& aChannelCaps) const; + TBool RequirementSatisfied(const TDmacTestCaps& aChannelCaps) const; + + TBool TestValue(TUint aValue) const; + +public: + TCapsReq iCapsReq; + TCapsReqType iCapsReqType; + TUint iValue; + // if HW capability is not available:- + // ETrue - Fail the test + // EFalse - Skip the test + TBool iFail; + }; + +//A set of DMA capability requirements +const TDmaCapability none(ENone, EEqual, 0, ETrue); + +const TDmaCapability pauseRequired(EChannelPauseAndResume, EEqual, ETrue, ETrue); +const TDmaCapability pauseRequired_skip(EChannelPauseAndResume, EEqual, ETrue, EFalse); +const TDmaCapability pauseNotWanted(EChannelPauseAndResume, EEqual, EFalse, ETrue); + +const TDmaCapability hwDesNotWanted(EHwDescriptors, EEqual, EFalse, ETrue); +const TDmaCapability hwDesNotWanted_skip(EHwDescriptors, EEqual, EFalse, EFalse); +const TDmaCapability hwDesWanted(EHwDescriptors, EEqual, ETrue, ETrue); +const TDmaCapability hwDesWanted_skip(EHwDescriptors, EEqual, ETrue, EFalse); + +const TDmaCapability cap_2DRequired(E2DAddressing, EEqual, ETrue, EFalse); + +const TDmaCapability capEqualV1(EPilVersion, EEqual, 1, EFalse); +const TDmaCapability capEqualV2(EPilVersion, EEqual, 2, EFalse); +const TDmaCapability capEqualV2Fatal(EPilVersion, EEqual, 2, ETrue); + +const TDmaCapability capAboveV1(EPilVersion, EGTE, 2, EFalse); +const TDmaCapability capBelowV2(EPilVersion, ELTE, 1, EFalse); +#endif // #ifdef __CAP_REQS_H__ diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/dmav2/d_dma2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/dmav2/d_dma2.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,1351 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// Test driver for DMA V2 framework +// +// + +#include +#include +#include "d_dma2.h" + +_LIT(KClientPanicCat, "D_DMA2"); +_LIT(KDFCThreadName,"D_DMA_DFC_THREAD"); +_LIT(KIsrCbDfcThreadName,"D_DMA_IsrCb_thread"); +const TInt KDFCThreadPriority=26; + +class TStopwatch + { +public: + TStopwatch() + :iStart(0), iStop(0) + {} + + void Start() + {iStart = NKern::FastCounter();} + + void Stop() + { + iStop = NKern::FastCounter(); + + __KTRACE_OPT(KDMA, Kern::Printf(">TStopwatch::Stop FastCounter ticks: iStart=0x%lx iStop=0x%lx", iStart, iStop)); + } + + TUint64 ReadMicroSecs() const + { +#ifndef __SMP__ + TUint64 diff = 0; + if(iStart > iStop) + { + diff = (KMaxTUint64 - iStart) + iStop; + } + else + { + diff = iStop - iStart; + } + return FastCountToMicroSecs(diff); +#else + //TODO On SMP it is possible for the value returned from + //NKern::FastCounter to depend on the current CPU (ie. + //NaviEngine) + // + //One solution would be to tie DFC's and ISR's to the same + //core as the client, but this would reduce the usefulness of + //SMP testing. + return 0; +#endif + } +private: + + TUint64 FastCountToMicroSecs(TUint64 aCount) const + { + const TUint64 countsPerS = NKern::FastCounterFrequency(); + + TUint64 timeuS = (aCount*1000000)/countsPerS; + __KTRACE_OPT(KDMA, Kern::Printf(">TStopwatch::FastCountToMicroSecs FastCounter ticks: aCount=0x%lx countsPerS=0x%lx time=0x%lx", aCount, countsPerS, timeuS)); + return timeuS; + } + + TUint64 iStart; + TUint64 iStop; + }; + +////////////////////////////////////////////////////////////////////////////// + +class DClientDmaRequest; +/** +Driver channel. Only accessible by a single client thread +*/ +class DDmaTestSession : public DLogicalChannelBase + { +public: + DDmaTestSession(); + virtual ~DDmaTestSession(); +protected: + // from DLogicalChannelBase + virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer); + virtual TInt Request(TInt aFunction, TAny* a1, TAny* a2); + virtual TInt RequestUserHandle(DThread* aThread, TOwnerType aType); +private: + TInt DoGetInfo(TAny* aInfo); + + TInt OpenDmaChannel(TUint aPslCookie, TUint& aDriverCookie); + TInt CloseDmaChannelByCookie(TUint aDriverCookie); + TInt PauseDmaChannelByCookie(TUint aDriverCookie); + TInt ResumeDmaChannelByCookie(TUint aDriverCookie); + TInt GetChannelCapsByCookie(TUint aDriverCookie, SDmacCaps& aChannelCaps); + TInt GetChannelCapsByCookie(TUint aDriverCookie, TDmacTestCaps& aChannelCaps); + TInt CancelAllByCookie(TUint aDriverCookie); + TInt IsrRedoRequestByCookie(TUint aDriverCookie,TUint32 aSrcAddr,TUint32 aDstAddr,TInt aTransferCount,TUint32 aPslRequestInfo,TBool aIsrCb); + TInt IsQueueEmptyByCookie(TUint aDriverCookie, TBool& aQueueEmpty); + TInt ChannelIsOpenedByCookie(TUint aDriverCookie, TBool& aChannelOpen); + void CloseDmaChannelByIndex(TInt aIndex); + void CancelAllByIndex(TInt aIndex); + TInt PauseDmaChannelByIndex(TInt aIndex); + TInt ResumeDmaChannelByIndex(TInt aIndex); + TInt IsrRedoRequestByIndex(TInt aIndex,TUint32 aSrcAddr,TUint32 aDstAddr,TInt aTransferCount,TUint32 aPslRequestInfo,TBool aIsrCb); + TInt CreateSharedChunk(); + TUint OpenSharedChunkHandle(); + + /** + Creates a new kernel-side DMA request object, associated with a previously + opened channel + + @param aChannelCookie - A channel cookie as returned by OpenDmaChannel + @param aRequestCookie - On success will be a cookie by which the dma request can be referred to + @param aNewCallback - If true, then a new style DMA callback will be used + */ + TInt CreateDmaRequest(TUint aChannelCookie, TUint& aRequestCookie, TBool aNewCallback = EFalse, TInt aMaxFragmentSizeBytes=0); + + //TODO what happens if a client closes a channel that + //it still has dma requests associated with? + + /** + Destroys a previously created dma request object + */ + TInt DestroyDmaRequestByCookie(TUint aRequestCookie); + + void DestroyDmaRequestByIndex(TInt aIndex); + + + TInt CookieToChannelIndex(TUint aDriverCookie) const; + TInt CookieToRequestIndex(TUint aRequestCookie) const; + + void FixupTransferArgs(TDmaTransferArgs& aTransferArgs) const; + TInt FragmentRequest(TUint aRequestCookie, const TDmaTransferArgs& aTransferArgs, TBool aLegacy=ETrue); + + TInt QueueRequest(TUint aRequestCookie, TRequestStatus* aStatus, TCallbackRecord* aRecord, TUint64* aDurationMicroSecs); + DClientDmaRequest* RequestFromCookie(TUint aRequestCookie) const; + TInt RequestFragmentCount(TUint aRequestCookie); + + TDmaV2TestInfo ConvertTestInfo(const TDmaTestInfo& aOldInfo) const; +private: + DThread* iClient; + TDynamicDfcQue* iDfcQ; + TDynamicDfcQue* iIsrCallbackDfcQ; // Will be used by requests which complete with an ISR callback + static const TInt KMaxChunkSize = 8 * KMega; + TLinAddr iChunkBase; + DChunk* iChunk; + + RPointerArray iChannels; + RPointerArray iClientDmaReqs; + }; + + +/** +Allows a TClientRequest to be associated with a DDmaRequest +*/ +class DClientDmaRequest : public DDmaRequest + { +public: + static DClientDmaRequest* Construct(DThread* aClient, TDfcQue* const aDfcQ, TDmaChannel& aChannel, TBool aNewStyle=EFalse, TInt aMaxTransferSize=0); + ~DClientDmaRequest(); + + TInt Queue(TRequestStatus* aRequestStatus, TCallbackRecord* aRecord, TUint64* aDurationMicroSecs); + void AddRequeArgs(const TIsrRequeArgsSet& aRequeArgSet); + + TUint64 GetDuration() + {return iStopwatch.ReadMicroSecs();} + +protected: + TInt Create(); + /** Construct with old style callback */ + DClientDmaRequest(DThread* aClient, TDfcQue* const aDfcQ, TDmaChannel& aChannel, TInt aMaxTransferSize); + + /** Construct with new style callback */ + DClientDmaRequest(DThread* aClient, TDfcQue* const aDfcQ, TDmaChannel& aChannel, TBool aNewStyle, TInt aMaxTransferSize); + +private: + static void CallbackOldStyle(TResult aResult, TAny* aRequest); + static void Callback(TUint, TDmaResult, TAny*, SDmaDesHdr*); + static void CompleteCallback(TAny* aRequest); + + void DoCallback(TUint, TDmaResult); + TBool RedoRequest(); + + //!< Used to return a TCallbackRecord and transfer time + TClientDataRequest2* iClientDataRequest; + + DThread* const iClient; + TDfcQue* const iDfcQ; //!< Use the DDmaTestSession's dfc queue + TDfc iDfc; + + TStopwatch iStopwatch; + TIsrRequeArgsSet iIsrRequeArgSet; + }; + +DClientDmaRequest* DClientDmaRequest::Construct(DThread* aClient, TDfcQue* const aDfcQ, TDmaChannel& aChannel, TBool aNewStyle, TInt aMaxTransferSize) + { + DClientDmaRequest* dmaRequest = NULL; + if(aNewStyle) + { +#ifdef DMA_APIV2 + dmaRequest = new DClientDmaRequest(aClient, aDfcQ, aChannel, aNewStyle, aMaxTransferSize); +#else + TEST_FAULT; // if a new style dma request was requested it should have been caught earlier +#endif + } + else + { + dmaRequest = new DClientDmaRequest(aClient, aDfcQ, aChannel, aMaxTransferSize); + } + + if(dmaRequest == NULL) + { + return dmaRequest; + } + + const TInt r = dmaRequest->Create(); + if(r != KErrNone) + { + delete dmaRequest; + dmaRequest = NULL; + } + return dmaRequest; + } + +DClientDmaRequest::DClientDmaRequest(DThread* aClient, TDfcQue* const aDfcQ, TDmaChannel& aChannel, TInt aMaxFragmentSize) + :DDmaRequest(aChannel, &CallbackOldStyle, this, aMaxFragmentSize), + iClientDataRequest(NULL), + iClient(aClient), + iDfcQ(aDfcQ), + iDfc(CompleteCallback,NULL, iDfcQ, KMaxDfcPriority) + { + } +#ifdef DMA_APIV2 +DClientDmaRequest::DClientDmaRequest(DThread* aClient, TDfcQue* const aDfcQ, TDmaChannel& aChannel, TBool /*aNewStyle*/, TInt aMaxFragmentSize) + :DDmaRequest(aChannel, &Callback, this, aMaxFragmentSize), + iClientDataRequest(NULL), + iClient(aClient), + iDfcQ(aDfcQ), + iDfc(CompleteCallback,NULL, iDfcQ, KMaxDfcPriority) + { + } +#endif + +TInt DClientDmaRequest::Create() + { + return Kern::CreateClientDataRequest2(iClientDataRequest); + } + +DClientDmaRequest::~DClientDmaRequest() + { + __KTRACE_OPT(KDMA, Kern::Printf(">DClientDmaRequest::~DClientDmaRequest")); + if(iClientDataRequest) + { + Kern::DestroyClientRequest(iClientDataRequest); + } + } + +/** +Queue the DClientDmaRequest. + +@param aRequestStatus Pointer to the client's request status +@param aRecord Pointer to the user's TCallbackRecord, may be null +@return + -KErrInUse The client request is in use + -KErrNone success +*/ +TInt DClientDmaRequest::Queue(TRequestStatus* aRequestStatus, TCallbackRecord* aRecord, TUint64* aDurationMicroSecs) + { + __NK_ASSERT_ALWAYS(aRecord); + __NK_ASSERT_ALWAYS(aDurationMicroSecs); + + //erase results from last transfer + iClientDataRequest->Data1().Reset(); + iClientDataRequest->SetDestPtr1(aRecord); + + iClientDataRequest->SetDestPtr2(aDurationMicroSecs); + + + TInt r = iClientDataRequest->SetStatus(aRequestStatus); + if(r != KErrNone) + { + return r; + } + + iStopwatch.Start(); +#ifdef DMA_APIV2 + r = DDmaRequest::Queue(); +#else + // old version of queue did not return an error code + DDmaRequest::Queue(); + r = KErrNone; +#endif + + return r; + } + +void DClientDmaRequest::AddRequeArgs(const TIsrRequeArgsSet& aRequeArgSet) + { + iIsrRequeArgSet = aRequeArgSet; + } + +/** +If a transfer complete callback in ISR context s received this will be +called to redo the request with the first entry in the array + +@return ETrue If the redo was successful - indicates that another callback is comming +*/ +TBool DClientDmaRequest::RedoRequest() + { + TIsrRequeArgs args = iIsrRequeArgSet.GetArgs(); + const TInt r = args.Call(iChannel); + TCallbackRecord& record = iClientDataRequest->Data1(); + record.IsrRedoResult(r); + return (r == KErrNone); + } + + +/** +Calls TDmaChannel::IsrRedoRequest on aChannel +with this object's parameters +*/ +TInt TIsrRequeArgs::Call(TDmaChannel& aChannel) + { +#ifdef DMA_APIV2 + return aChannel.IsrRedoRequest(iSrcAddr, iDstAddr, iTransferCount, iPslRequestInfo, iIsrCb); +#else + TEST_FAULT; + return KErrNotSupported; +#endif + } + +/** +Check that both source and destination of ISR reque args will +lie within the range specified by aStart and aSize. + +@param aStart The linear base address of the region +@param aSize The size of the region +*/ +TBool TIsrRequeArgs::CheckRange(TLinAddr aStart, TUint aSize) const + { + TUint physStart = Epoc::LinearToPhysical(aStart); + TEST_ASSERT(physStart != KPhysAddrInvalid); + + TAddrRange chunk(physStart, aSize); + TBool sourceOk = (iSrcAddr == KPhysAddrInvalid) ? ETrue : chunk.Contains(SourceRange()); + + TBool destOk = (iDstAddr == KPhysAddrInvalid) ? ETrue : chunk.Contains(DestRange()); + + return sourceOk && destOk; + } + +TBool TIsrRequeArgsSet::CheckRange(TLinAddr aAddr, TUint aSize) const + { + for(TInt i=0; iDClientDmaRequest::CallBackOldStyle: TResult result=%d", aResult)); + TEST_ASSERT(aResult != EBadResult); + //translate result code + const TDmaResult result = (aResult == EOk) ? EDmaResultOK : EDmaResultError; + + //call the new-style callback + Callback(EDmaCallbackRequestCompletion, result, aArg, NULL); + } + + +/** +The new style callback called by the DMA framework +may be called in either thread or ISR context +*/ +void DClientDmaRequest::Callback(TUint aCallbackType, TDmaResult aResult, TAny* aArg, SDmaDesHdr* aHdr) + { + const TInt context = NKern::CurrentContext(); + __KTRACE_OPT(KDMA, Kern::Printf(">DClientDmaRequest::CallBack: TDmaResult result = %d, NKern::TContext context = %d", aResult, context)); + + DClientDmaRequest& self = *reinterpret_cast(aArg); + self.DoCallback(aCallbackType, aResult); + + // decide if callback is complete + const TBool transferComplete = aCallbackType & EDmaCallbackRequestCompletion; + if(!transferComplete) + { + return; + } + + // If there are reque args then redo this request + // another callback would then be expected. + // Requests can only be re-queued in ISR context, but we + // do not check that here as it is up to the client to get + // it right - also, we want to test that the PIL catches this + // error + if(!self.iIsrRequeArgSet.IsEmpty()) + { + // If redo call was succesful, return and wait for next call back + if(self.RedoRequest()) + return; + } + + switch(context) + { + case NKern::EThread: + { + CompleteCallback(aArg); + break; + } + case NKern::EInterrupt: + { + self.iDfc.iPtr = aArg; + self.iDfc.Add(); + break; + } + case NKern::EIDFC: //fall-through + case NKern::EEscaped: + default: + TEST_FAULT; + } + } + +/** +Log results of callback. May be called in either thread or ISR context +*/ +void DClientDmaRequest::DoCallback(TUint aCallbackType, TDmaResult aResult) + { + iStopwatch.Stop(); //sucessive calls will simply over write the stop time + + // This will always be done whether the client requested a + // callback record or not + TCallbackRecord& record = iClientDataRequest->Data1(); + record.ProcessCallback(aCallbackType, aResult); + } + +/** +This function may either be called directly or queued as a DFC +*/ +void DClientDmaRequest::CompleteCallback(TAny* aArg) + { + __KTRACE_OPT(KDMA, Kern::Printf(">DClientDmaRequest::CompleteCallBack thread %O", &Kern::CurrentThread())); + __ASSERT_NOT_ISR; + + DClientDmaRequest& self = *reinterpret_cast(aArg); + + self.iClientDataRequest->Data2() = self.iStopwatch.ReadMicroSecs(); + + //Assert that we called SetRequestStatus on this object before + //queueing + __NK_ASSERT_DEBUG(self.iClientDataRequest->IsReady()); + + // This is an inelegant, temporary, solution to the following problem: + // + // If a dma request completes with an ISR callback the test + // framework will queue this function as a DFC which + // will then signal the user-side client. As a consequence of + // this the user side client may then decide to destroy this + // request. However, untill the DMA framework's DFC has run + // and called OnDeque() on this request, it is still considered as + // queued. Since it is possible that this DFC could run + // before the DMA fw's DFC, this request could get destroyed while + // it is stil queued, triggering a PIL assertion. + // + // The real fix is likely be for the PIL to call the callback + // twice, but with different arguments, once to annonunce the + // ISR and again to announce the dequeue. + // + // Here we poll and wait for this request to be dequeued. Note, + // this DFC is currently run on a separate DFC queue, otherwise + // it could get deadlocked. An alternative to polling would be + // to use DCondVar, but that would require PIL modification + + if(NKern::CurrentThread() == self.iDfcQ->iThread) + { + // Only need to poll if we aren't on the channel's DFC queue + for(;;) + { + // once the request has been unqueued it + // can only be queued again by the client + const TBool queued = __e32_atomic_load_acq32(&self.iQueued); + if(!queued) + break; + __KTRACE_OPT(KDMA, Kern::Printf("Waiting for requeuest to be dequeued")); + NKern::Sleep(10); + } + } + else + { + // If we are on the channel's DFCQ we should be dequeued + // already + __NK_ASSERT_DEBUG(!__e32_atomic_load_acq32(&self.iQueued)); + } + + // We can always complete with KErrNone, the actual DMA result is + // logged in the TCallbackRecord + Kern::QueueRequestComplete(self.iClient, self.iClientDataRequest, KErrNone); + } + +const TInt DDmaTestSession::KMaxChunkSize; + +TInt DDmaTestSession::RequestUserHandle(DThread* aThread, TOwnerType aType) + { + if (aType!=EOwnerThread || aThread!=iClient) + return KErrAccessDenied; + return KErrNone; + } + +DDmaTestSession::DDmaTestSession() + : iClient(NULL), iDfcQ(NULL), iIsrCallbackDfcQ(NULL), iChunkBase(0), iChunk(NULL) + {} + +// called in thread critical section +TInt DDmaTestSession::DoCreate(TInt /*aUnit*/, const TDesC8* aInfo, const TVersion& /*aVer*/) + { + __NK_ASSERT_ALWAYS(iDfcQ == NULL); + __NK_ASSERT_ALWAYS(iIsrCallbackDfcQ == NULL); + + TInt r = Kern::DynamicDfcQCreate(iDfcQ, KDFCThreadPriority, KDFCThreadName); + if (r != KErrNone) + return r; + NKern::ThreadSetCpuAffinity((NThread*)(iDfcQ->iThread), KCpuAffinityAny); + + r = Kern::DynamicDfcQCreate(iIsrCallbackDfcQ, KDFCThreadPriority, KIsrCbDfcThreadName); + if (r != KErrNone) + return r; + NKern::ThreadSetCpuAffinity((NThread*)(iIsrCallbackDfcQ->iThread), KCpuAffinityAny); + + iClient = &Kern::CurrentThread(); + + r = CreateSharedChunk(); + return r; + } + +DDmaTestSession::~DDmaTestSession() + { + //Destroy requests before channels + //or we will trigger an assertion + while(iClientDmaReqs.Count()) + { + DestroyDmaRequestByIndex(0); + } + iClientDmaReqs.Close(); + + while(iChannels.Count()) + { + CloseDmaChannelByIndex(0); + } + iChannels.Close(); + + + if (iDfcQ) + { + iDfcQ->Destroy(); + } + + if (iIsrCallbackDfcQ) + { + iIsrCallbackDfcQ->Destroy(); + } + + if(iChunk) + { + Kern::ChunkClose(iChunk); + iChunk = NULL; + } + } + +TInt DDmaTestSession::Request(TInt aFunction, TAny* a1, TAny* a2) + { + __NK_ASSERT_DEBUG(&Kern::CurrentThread() == iClient); + + switch (aFunction) + { + case RDmaSession::EOpenChannel: + { + TUint pslCookie = (TUint)a1; + TUint driverCookie = 0; + TInt r = OpenDmaChannel(pslCookie, driverCookie); + umemput32(a2, &driverCookie, sizeof(TAny*)); + return r; + } + case RDmaSession::ECloseChannel: + { + TUint driverCookie = reinterpret_cast(a1); + TInt r = CloseDmaChannelByCookie(driverCookie); + return r; + } + case RDmaSession::EChannelCaps: + { + TUint driverCookie = reinterpret_cast(a1); + TPckgBuf capsBuf; + TInt r = GetChannelCapsByCookie(driverCookie, capsBuf()); + Kern::KUDesPut(*reinterpret_cast(a2), capsBuf); + return r; + } + case RDmaSession::EPauseChannel: + { + TUint driverCookie = reinterpret_cast(a1); + TInt r = PauseDmaChannelByCookie(driverCookie); + return r; + } + case RDmaSession::EResumeChannel: + { + TUint driverCookie = reinterpret_cast(a1); + TInt r = ResumeDmaChannelByCookie(driverCookie); + return r; + } + case RDmaSession::EFragmentCount: + { + TUint requestCookie = reinterpret_cast(a1); + TInt r = RequestFragmentCount(requestCookie); + return r; + } + case RDmaSession::ERequestOpen: + { + RDmaSession::TRequestCreateArgs createArgs(0, EFalse, 0); + TPckg package(createArgs); + Kern::KUDesGet(package, *reinterpret_cast(a1)); + + const TUint channelCookie = createArgs.iChannelCookie; + TUint requestCookie = 0; + + TInt r = CreateDmaRequest(channelCookie, requestCookie, createArgs.iNewStyle, createArgs.iMaxFragmentSize); + + umemput32(a2, &requestCookie, sizeof(TAny*)); + return r; + } + case RDmaSession::ERequestClose: + { + const TUint requestCookie = reinterpret_cast(a1); + return DestroyDmaRequestByCookie(requestCookie); + } + case RDmaSession::EFragmentLegacy: + case RDmaSession::EFragment: + { + TPckgBuf argsBuff; + Kern::KUDesGet(argsBuff, *reinterpret_cast(a1)); + const TUint requestCookie = argsBuff().iRequestCookie; + + //must remove constness as we actually need to + //convert the src and dst offsets to addresses + TDmaTransferArgs& transferArgs = const_cast(argsBuff().iTransferArgs); + + //convert address offsets in to kernel virtual addresses + FixupTransferArgs(transferArgs); + + TEST_ASSERT((TAddressParms(transferArgs).CheckRange(iChunkBase, iChunk->Size()))); + + TInt r = KErrGeneral; + + TStopwatch clock; + clock.Start(); + switch (aFunction) + { + case RDmaSession::EFragmentLegacy: + r = FragmentRequest(requestCookie, transferArgs, ETrue); break; + case RDmaSession::EFragment: + r = FragmentRequest(requestCookie, transferArgs, EFalse); break; + default: + TEST_FAULT; + } + clock.Stop(); + + const TUint64 time = clock.ReadMicroSecs(); + + TUint64* const timePtr = argsBuff().iDurationMicroSecs; + if(timePtr) + { + umemput(timePtr, &time, sizeof(time)); + } + return r; + } + case RDmaSession::EQueueRequest: + { + TPckgBuf argsBuff; + Kern::KUDesGet(argsBuff, *reinterpret_cast(a1)); + + //this is an Asynchronous request + const TUint requestCookie = argsBuff().iRequestCookie; + TRequestStatus* requestStatus = argsBuff().iStatus; + TCallbackRecord* callbackRec = argsBuff().iCallbackRecord; + TUint64* duration = argsBuff().iDurationMicroSecs; + + TInt r = QueueRequest(requestCookie, requestStatus, callbackRec, duration); + if(r != KErrNone) + { + Kern::RequestComplete(requestStatus, r); + } + return r; + } + case RDmaSession::EQueueRequestWithReque: + { + //TODO can common code with EQueueRequest be extracted? + TPckgBuf argsBuff; + Kern::KUDesGet(argsBuff, *reinterpret_cast(a1)); + + //this is an Asynchronous request + const TUint requestCookie = argsBuff().iRequestCookie; + TRequestStatus* requestStatus = argsBuff().iStatus; + TCallbackRecord* callbackRec = argsBuff().iCallbackRecord; + TUint64* duration = argsBuff().iDurationMicroSecs; + + TInt r = KErrNotFound; + + DClientDmaRequest* const request = RequestFromCookie(requestCookie); + if(request != NULL) + { + argsBuff().iRequeSet.Fixup(iChunkBase); + //TODO reque args must be substituted in order to + //check the range. The original transfer args are not + //available when queue is called, they could + //however be stored within DClientDmaRequest + //TEST_ASSERT((argsBuff().iRequeSet.CheckRange(iChunkBase, iChunk->Size()))); + request->AddRequeArgs(argsBuff().iRequeSet); + + r = QueueRequest(requestCookie, requestStatus, callbackRec, duration); + } + + if(r != KErrNone) + { + Kern::RequestComplete(requestStatus, r); + } + return r; + } + case RDmaSession::EIsrRedoRequest: + { + TPckgBuf argsBuff; + Kern::KUDesGet(argsBuff, *reinterpret_cast(a1)); + + const TUint driverCookie = argsBuff().iDriverCookie; + const TUint32 srcAddr = argsBuff().iSrcAddr; + const TUint32 dstAddr = argsBuff().iDstAddr; + const TInt transferCount = argsBuff().iTransferCount; + const TUint32 pslRequestInfo = argsBuff().iPslRequestInfo; + const TBool isrCb = argsBuff().iIsrCb; + + TInt r = IsrRedoRequestByCookie(driverCookie,srcAddr,dstAddr,transferCount,pslRequestInfo,isrCb); + return r; + } + case RDmaSession::EIsOpened: + { + TUint driverCookie = (TUint)a1; + TBool channelOpen = EFalse;; + TInt r = ChannelIsOpenedByCookie(driverCookie,channelOpen); + umemput32(a2, &channelOpen, sizeof(TAny*)); + return r; + } + case RDmaSession::EIsQueueEmpty: + { + TUint driverCookie = (TUint)a1; + TBool queueEmpty = EFalse;; + TInt r = IsQueueEmptyByCookie(driverCookie,queueEmpty); + umemput32(a2, &queueEmpty, sizeof(TAny*)); + return r; + } + case RDmaSession::ECancelAllChannel: + { + TUint driverCookie = reinterpret_cast(a1); + TInt r = CancelAllByCookie(driverCookie); + return r; + } + case RDmaSession::EOpenSharedChunk: + { + return OpenSharedChunkHandle(); + } + case RDmaSession::EGetTestInfo: + { +#ifdef DMA_APIV2 + TPckgC package(DmaTestInfoV2()); +#else + TPckgC package(ConvertTestInfo(DmaTestInfo())); +#endif + Kern::KUDesPut(*reinterpret_cast(a1), package); + return KErrNone; + } + default: + Kern::PanicCurrentThread(KClientPanicCat, __LINE__); + return KErrGeneral; + } + } + +TInt DDmaTestSession::OpenDmaChannel(TUint aPslCookie, TUint& aDriverCookie ) + { + TDmaChannel::SCreateInfo info; + info.iCookie = aPslCookie; + info.iDfcQ = iDfcQ; + info.iDfcPriority = 3; + info.iDesCount = 128; + + TDmaChannel* channel = NULL; + + //cs so thread can't be killed between + //opening channel and adding to array + NKern::ThreadEnterCS(); + TInt r = TDmaChannel::Open(info, channel); + if(KErrNone == r) + { + __NK_ASSERT_ALWAYS(channel); + + __KTRACE_OPT(KDMA, Kern::Printf("OpenDmaChannel: channel@ 0x%08x", channel)); + + + TInt err = iChannels.Append(channel); + if(KErrNone == err) + { + aDriverCookie = reinterpret_cast(channel); + } + else + { + channel->Close(); + r = KErrNoMemory; + } + } + NKern::ThreadLeaveCS(); + + return r; + } + +TInt DDmaTestSession::CookieToChannelIndex(TUint aDriverCookie) const + { + const TInt r = iChannels.Find(reinterpret_cast(aDriverCookie)); + + if(r < 0) + { + __KTRACE_OPT(KDMA, Kern::Printf("CookieToChannelIndex: cookie 0x%08x not found!", aDriverCookie)); + } + return r; + } + +TInt DDmaTestSession::CookieToRequestIndex(TUint aRequestCookie) const + { + const TInt r = iClientDmaReqs.Find(reinterpret_cast(aRequestCookie)); + + if(r < 0) + { + __KTRACE_OPT(KDMA, Kern::Printf("CookieToRequestIndex: cookie 0x%08x not found!", aRequestCookie)); + } + return r; + } + +void DDmaTestSession::CloseDmaChannelByIndex(TInt aIndex) + { + __KTRACE_OPT(KDMA, Kern::Printf("CloseDmaChannelByIndex: %d", aIndex)); + __NK_ASSERT_DEBUG(aIndex < iChannels.Count()); + // cs so client thread can't be killed between removing channel from + // array and closing it. + NKern::ThreadEnterCS(); + TDmaChannel* channel = iChannels[aIndex]; + iChannels.Remove(aIndex); + channel->Close(); + NKern::ThreadLeaveCS(); + } + +TInt DDmaTestSession::CloseDmaChannelByCookie(TUint aDriverCookie) + { + __KTRACE_OPT(KDMA, Kern::Printf("CloseDmaChannelByCookie: 0x%08x", aDriverCookie)); + const TInt index = CookieToChannelIndex(aDriverCookie); + + if(index >= 0) + { + CloseDmaChannelByIndex(index); + return KErrNone; + } + else + { + return KErrNotFound; + } + } + +TInt DDmaTestSession::CancelAllByCookie(TUint aDriverCookie) + { + __KTRACE_OPT(KDMA, Kern::Printf("CancelAllByCookie: 0x%08x", aDriverCookie)); + const TInt index = CookieToChannelIndex(aDriverCookie); + + if(index >= 0) + { + CancelAllByIndex(index); + return KErrNone; + } + else + { + return KErrNotFound; + } + } + +void DDmaTestSession::CancelAllByIndex(TInt aIndex) + { + __KTRACE_OPT(KDMA, Kern::Printf("CancelAllByIndex: %d", aIndex)); + __NK_ASSERT_DEBUG(aIndex < iChannels.Count()); + + TDmaChannel* channel = iChannels[aIndex]; + iChannels.Remove(aIndex); + channel->CancelAll(); + } + +TInt DDmaTestSession::PauseDmaChannelByIndex(TInt aIndex) + { + __KTRACE_OPT(KDMA, Kern::Printf("PauseDmaChannelByIndex: %d", aIndex)); + __NK_ASSERT_DEBUG(aIndex < iChannels.Count()); + +#ifdef DMA_APIV2 + TDmaChannel* channel = iChannels[aIndex]; + return channel->Pause(); +#else + return KErrNotSupported; +#endif + } + +TInt DDmaTestSession::PauseDmaChannelByCookie(TUint aDriverCookie) + { + __KTRACE_OPT(KDMA, Kern::Printf("PauseDmaChannelByCookie: 0x%08x", aDriverCookie)); + const TInt index = CookieToChannelIndex(aDriverCookie); + + if(index >= 0) + { + TInt r = PauseDmaChannelByIndex(index); + return r; + } + else + { + return KErrNotFound; + } + } + +TInt DDmaTestSession::ResumeDmaChannelByIndex(TInt aIndex) + { + __KTRACE_OPT(KDMA, Kern::Printf("ResumeDmaChannelByIndex: %d", aIndex)); + __NK_ASSERT_DEBUG(aIndex < iChannels.Count()); + +#ifdef DMA_APIV2 + TDmaChannel* channel = iChannels[aIndex]; + return channel->Resume(); +#else + return KErrNotSupported; +#endif + } + +TInt DDmaTestSession::ResumeDmaChannelByCookie(TUint aDriverCookie) + { + __KTRACE_OPT(KDMA, Kern::Printf("ResumeDmaChannelByCookie: 0x%08x", aDriverCookie)); + const TInt index = CookieToChannelIndex(aDriverCookie); + + if(index >= 0) + { + TInt r = ResumeDmaChannelByIndex(index); + return r; + } + else + { + return KErrNotFound; + } + } + +TInt DDmaTestSession::IsrRedoRequestByCookie(TUint aDriverCookie,TUint32 aSrcAddr,TUint32 aDstAddr,TInt aTransferCount,TUint32 aPslRequestInfo,TBool aIsrCb) +{ + __KTRACE_OPT(KDMA, Kern::Printf("IsrRedoRequestByCookie: 0x%08x", aDriverCookie)); + const TInt index = CookieToChannelIndex(aDriverCookie); + + if(index >= 0) + { + TInt r = IsrRedoRequestByIndex(index,aSrcAddr,aDstAddr,aTransferCount,aPslRequestInfo,aIsrCb); + return r; + } + else + { + return KErrNotFound; + } +} + +TInt DDmaTestSession::IsrRedoRequestByIndex(TInt aIndex,TUint32 aSrcAddr,TUint32 aDstAddr,TInt aTransferCount,TUint32 aPslRequestInfo,TBool aIsrCb) + { + __KTRACE_OPT(KDMA, Kern::Printf("IsrRedoRequestByIndex: %d", aIndex)); + __NK_ASSERT_DEBUG(aIndex < iChannels.Count()); + +#ifdef DMA_APIV2 + TDmaChannel* channel = iChannels[aIndex]; + return channel->IsrRedoRequest(aSrcAddr,aDstAddr,aTransferCount,aPslRequestInfo,aIsrCb); +#else + return KErrNotSupported; +#endif + } + +/** +aChannelCaps will be set to "NULL" values +*/ +TInt DDmaTestSession::GetChannelCapsByCookie(TUint aDriverCookie, TDmacTestCaps& aChannelCaps) + { + SDmacCaps caps = {0,}; //initialise with NULL values + TInt r = GetChannelCapsByCookie(aDriverCookie, caps); + + if(r == KErrNotSupported) + { + //If we can not query caps it means + //that we are using the v1 driver + //we construct a empty TDmacTestCaps + //but with an iPILVersion of 1 + const TDmacTestCaps nullCapsV1(caps, 1); + aChannelCaps = nullCapsV1; + r = KErrNone; + } + else if(r == KErrNone) + { + const TDmacTestCaps capsV2(caps, 2); + aChannelCaps = capsV2; + } + + return r; + } + +/** +Will return the capabilities of the DMA channel. +Querying SDmacCaps is not possible on V1 of the DMA framework. +In that case an error of KErrNotSupported will be returned +*/ +TInt DDmaTestSession::GetChannelCapsByCookie(TUint aDriverCookie, SDmacCaps& aChannelCaps) + { + __KTRACE_OPT(KDMA, Kern::Printf("GetChannelCapsByCookie: 0x%08x", aDriverCookie)); + const TInt index = CookieToChannelIndex(aDriverCookie); + if(index >= 0) + { +#ifdef DMA_APIV2 + aChannelCaps = iChannels[index]->DmacCaps(); + return KErrNone; +#else + return KErrNotSupported; +#endif + } + else + { + return KErrNotFound; + } + } + +TInt DDmaTestSession::IsQueueEmptyByCookie(TUint aDriverCookie, TBool& aQueueEmpty) + { + __KTRACE_OPT(KDMA, Kern::Printf("IsQueueEmptyByCookie: 0x%08x", aDriverCookie)); + const TInt index = CookieToChannelIndex(aDriverCookie); + + if(index >= 0) + { + aQueueEmpty=iChannels[index]->IsQueueEmpty(); + return KErrNone; + } + else + { + return KErrNotFound; + } + } + +TInt DDmaTestSession::ChannelIsOpenedByCookie(TUint aDriverCookie, TBool& aChannelOpen) + { + __KTRACE_OPT(KDMA, Kern::Printf("ChannelIsOpenedByCookie: 0x%08x", aDriverCookie)); + const TInt index = CookieToChannelIndex(aDriverCookie); + + if(index >= 0) + { + aChannelOpen=iChannels[index]->IsOpened(); + return KErrNone; + } + else + { + return KErrNotFound; + } + } + +TInt DDmaTestSession::CreateDmaRequest(TUint aChannelCookie, TUint& aRequestCookie, TBool aNewCallback, TInt aMaxFragmentSizeBytes) + { +#ifndef DMA_APIV2 + if(aNewCallback) + return KErrNotSupported; +#endif + + TInt channelIndex = CookieToChannelIndex(aChannelCookie); + if(channelIndex < 0) + return channelIndex; + + NKern::ThreadEnterCS(); + DClientDmaRequest* request = DClientDmaRequest::Construct(iClient, iIsrCallbackDfcQ, *iChannels[channelIndex], aNewCallback, aMaxFragmentSizeBytes); + if(request == NULL) + { + NKern::ThreadLeaveCS(); + return KErrNoMemory; + } + + TInt r = iClientDmaReqs.Append(request); + if(r == KErrNone) + { + aRequestCookie = reinterpret_cast(request); + } + else + { + delete request; + } + NKern::ThreadLeaveCS(); + + return r; + } + +TInt DDmaTestSession::DestroyDmaRequestByCookie(TUint aRequestCookie) + { + TInt requestIndex = CookieToRequestIndex(aRequestCookie); + if(requestIndex < 0) + return requestIndex; + + DestroyDmaRequestByIndex(requestIndex); + + return KErrNone; + } + +void DDmaTestSession::DestroyDmaRequestByIndex(TInt aIndex) + { + __KTRACE_OPT(KDMA, Kern::Printf("DestroyDmaRequestByIndex: %d", aIndex)); + __NK_ASSERT_DEBUG(aIndex < iClientDmaReqs.Count()); + NKern::ThreadEnterCS(); + + DClientDmaRequest* request = iClientDmaReqs[aIndex]; + iClientDmaReqs.Remove(aIndex); + delete request; + + NKern::ThreadLeaveCS(); + } + +TInt DDmaTestSession::CreateSharedChunk() + { + // Enter critical section so we can't die and leak the objects we are creating + // I.e. the TChunkCleanup and DChunk (Shared Chunk) + NKern::ThreadEnterCS(); + + // Create the chunk + TChunkCreateInfo info; + info.iType = TChunkCreateInfo::ESharedKernelSingle; + info.iMaxSize = KMaxChunkSize; + info.iMapAttr = EMapAttrFullyBlocking | EMapAttrUserRw; + info.iOwnsMemory = ETrue; + info.iDestroyedDfc = NULL; + + DChunk* chunk; + TUint32 mapAttr; + TInt r = Kern::ChunkCreate(info, chunk, iChunkBase, mapAttr); + if(r!=KErrNone) + { + NKern::ThreadLeaveCS(); + return r; + } + + // Map our device's memory into the chunk (at offset 0) + TUint32 physicalAddr; + r = Kern::ChunkCommitContiguous(chunk,0,KMaxChunkSize, physicalAddr); + if(r!=KErrNone) + { + // Commit failed so tidy-up... + Kern::ChunkClose(chunk); + } + else + { + iChunk = chunk; + } + + // Can leave critical section now that we have saved pointers to created objects + NKern::ThreadLeaveCS(); + + return r; + } + +TUint DDmaTestSession::OpenSharedChunkHandle() + { + NKern::ThreadEnterCS(); + const TInt r = Kern::MakeHandleAndOpen(NULL, iChunk); + NKern::ThreadLeaveCS(); + return r; + } + +void DDmaTestSession::FixupTransferArgs(TDmaTransferArgs& aTransferArgs) const + { + aTransferArgs.iSrcConfig.iAddr += iChunkBase; + aTransferArgs.iDstConfig.iAddr += iChunkBase; + } + +#ifndef DMA_APIV2 +static TInt FragmentCount(DDmaRequest* aRequest) + { + TInt count = 0; + for (SDmaDesHdr* pH = aRequest->iFirstHdr; pH != NULL; pH = pH->iNext) + count++; + return count; + } +#endif + +TInt DDmaTestSession::RequestFragmentCount(TUint aRequestCookie) + { + TInt requestIndex = CookieToRequestIndex(aRequestCookie); + if(requestIndex < 0) + return requestIndex; +#ifdef DMA_APIV2 + TInt r = iClientDmaReqs[requestIndex]->FragmentCount(); +#else + TInt r = FragmentCount(iClientDmaReqs[requestIndex]); +#endif + + return r; + } + +TInt DDmaTestSession::FragmentRequest(TUint aRequestCookie, const TDmaTransferArgs& aTransferArgs, TBool aLegacy) + { + __KTRACE_OPT(KDMA, Kern::Printf(">FragmentRequest: cookie=0x%08x, legacy=%d", aRequestCookie, aLegacy)); + TInt requestIndex = CookieToRequestIndex(aRequestCookie); + if(requestIndex < 0) + return requestIndex; + + TInt r = KErrNotSupported; + if(aLegacy) + { + // TODO we can extract the required info from the struct to + // set flags + TUint flags = KDmaMemSrc | KDmaIncSrc | KDmaMemDest | KDmaIncDest; + + const TUint src = aTransferArgs.iSrcConfig.iAddr; + const TUint dst = aTransferArgs.iDstConfig.iAddr; + r = iClientDmaReqs[requestIndex]->Fragment(src, dst, aTransferArgs.iTransferCount, flags, NULL); + } + else + { +#ifdef DMA_APIV2 + r = iClientDmaReqs[requestIndex]->Fragment(aTransferArgs); +#else + r = KErrNotSupported; +#endif + } + return r; + } + +/** +Queue the request refered to by aRequestCookie + +@param aRequestCookie Client identifier for the DDmaRequest +@param aStatus Pointer to the client's TRequestStatus +@param aRecord Pointer to the client's TCallbackRecord +@return + - KErrNotFound - aRequestCookie was invalid + - KErrNone - Success +*/ +TInt DDmaTestSession::QueueRequest(TUint aRequestCookie, TRequestStatus* aStatus, TCallbackRecord* aRecord, TUint64* aDurationMicroSecs) + { + __KTRACE_OPT(KDMA, Kern::Printf(">QueueRequest: 0x%08x", aRequestCookie)); + + DClientDmaRequest* request = RequestFromCookie(aRequestCookie); + if(request == NULL) + return KErrNotFound; + + return request->Queue(aStatus, aRecord, aDurationMicroSecs); + } + +DClientDmaRequest* DDmaTestSession::RequestFromCookie(TUint aRequestCookie) const + { + TInt requestIndex = CookieToRequestIndex(aRequestCookie); + if(requestIndex < 0) + return NULL; + + return (iClientDmaReqs[requestIndex]); + } + +TDmaV2TestInfo DDmaTestSession::ConvertTestInfo(const TDmaTestInfo& aOldInfo) const + { + TDmaV2TestInfo newInfo; + newInfo.iMaxTransferSize = aOldInfo.iMaxTransferSize; + newInfo.iMemAlignMask = aOldInfo.iMemAlignMask; + newInfo.iMemMemPslInfo = aOldInfo.iMemMemPslInfo; + + newInfo.iMaxSbChannels = aOldInfo.iMaxSbChannels; + for(TInt i=0; iDDmaTestFactory::~DDmaTestFactory")); + } + virtual TInt Install(); + virtual void GetCaps(TDes8& aDes) const; + virtual TInt Create(DLogicalChannelBase*& aChannel); + }; + + +DDmaTestFactory::DDmaTestFactory() + { + iVersion = TestDmaLddVersion(); + iParseMask = KDeviceAllowUnit; // no info, no PDD + // iUnitsMask = 0; // Only one thing + } + + +TInt DDmaTestFactory::Create(DLogicalChannelBase*& aChannel) + { + aChannel=new DDmaTestSession; + return aChannel ? KErrNone : KErrNoMemory; + } + + +TInt DDmaTestFactory::Install() + { + return SetName(&KTestDmaLddName); + } + + +void DDmaTestFactory::GetCaps(TDes8& /*aDes*/) const + { + } + +////////////////////////////////////////////////////////////////////////////// + +DECLARE_STANDARD_LDD() + { + return new DDmaTestFactory; + } diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/dmav2/d_dma2.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/dmav2/d_dma2.h Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,572 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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\dmav2\d_dma2.h +// User-side API for LDD used to test DMAv2 framework. +// +// + +#ifndef __D_DMA2_H__ +#define __D_DMA2_H__ + +#include +#include + + +#define ARRAY_LENGTH(ARRAY) sizeof(ARRAY)/sizeof(ARRAY[0]) + +#ifdef __KERNEL_MODE__ + #include + #include + #define TEST_FAULT FAULT(); + #define PRINT(N) Kern::Printf("%s = 0x%08x (%d)", #N, (N), (N)) +#else + #include + #include + #define TEST_FAULT RDebug::Printf("Assertion failure in %s, %d", __FILE__, __LINE__); User::Invariant() + #define PRINT(N) RDebug::Printf("%s = 0x%08x (%d)", #N, (N), (N)) +#endif + +#define TEST_ASSERT(C) if(!(C)) {TEST_FAULT;} + +const TUint KPhysAddrInvalidUser=0xFFFFFFFFu; // KPhysAddrInvalid is not defined on the user side +#ifdef __KERNEL_MODE__ +//if this fails then KPhysAddrInvalidUser must be updated to match +//KPhysAddrInvalid +__ASSERT_COMPILE(KPhysAddrInvalidUser == KPhysAddrInvalid); +#endif + + +_LIT(KTestDmaLddName, "TestDmaV2"); + +inline TVersion TestDmaLddVersion() { return TVersion(1, 0, 1); } + +TInt Log2(TInt aNum); + +/** +Indicates the number of each type of call back received +and their context + +TODO as yet, it does not indicate the context of each callback, only +the final one +*/ +const TInt KNumberOfCallbacks = 12; + +class TCallbackRecord + { +public: + enum TCbContext + { EInvalid, EThread, EIsr }; + + TCallbackRecord( + TCbContext aContext = EThread, + TInt aReq = 0, + TInt aReqSrc = 0, + TInt aReqDst = 0, + + TInt aDes = 0, + TInt aDesSrc = 0, + TInt aDesDst = 0, + + TInt aFrame = 0, + TInt aFrameSrc = 0, + TInt aFrameDst = 0, + + TInt aPause = 0, + TInt aPauseSrc = 0, + TInt aPauseDst = 0, + TDmaResult aResult = EDmaResultOK + ); + + static TCallbackRecord Empty(); + + void Reset(); + + /** + Allows 2 callback records to be compared + */ + TBool operator == (const TCallbackRecord aOther) const; + void Print() const; + + /** + Get the number of callbacks for callback aCbType + */ + TInt GetCount(TDmaCallbackType aCbType) const; + + void SetCount(TDmaCallbackType aCbType, TInt aCount); + + /** + Set the result (expected or actual) from + TDmaChannel::IsrRedoRequest + */ + inline TCallbackRecord& IsrRedoResult(TInt aResult) {iIsrRedoRequestResult = aResult; return *this;} + + /** + Reports the context in which the callback occurred. + */ + inline TCbContext GetContext() + {return iContext;} + + /** + Updates data based on callback mask aCallbackMask + @param aCallbackMask Bitmask of callback events @see TDmaCallbackType + @oaram aResult The result reported by the current callback + */ + void ProcessCallback(TUint aCallbackMask, TDmaResult aResultaContext); + + static void SelfTest(); + + // The below methods are setters, which may be chained together + // ie. The Named Parameter Idiom + // @see http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.18 + TCallbackRecord& Context(TCbContext aContext) {iContext = aContext; return *this;} + +private: + TInt BitToIndex(TDmaCallbackType aCbType) const; + + TCbContext CurrentContext() const; + + TInt iCallbackLog[KNumberOfCallbacks]; + + TDmaResult iResult; + TCbContext iContext; + /** Result of the most recent redo request call */ + TInt iIsrRedoRequestResult; + }; + +/** +Extends SDmacCaps to contain the DMA PIL +version being used +*/ +struct TDmacTestCaps : public SDmacCaps + { + TDmacTestCaps(); + TDmacTestCaps(const SDmacCaps& aDmacCaps, TInt aVersion = 2); + + TInt iPILVersion; + }; + + +class TDmaChannel; + +struct TAddrRange + { + TAddrRange(TUint aStart, TUint aLength); + inline TUint End() const {return (iStart + iLength -1);} + inline TUint Start() const {return iStart;} + + inline TBool Contains(TUint aValue) const {return Rng(iStart, aValue, End());} + TBool Contains(TAddrRange aRange) const; + + TBool Overlaps(const TAddrRange& aRange) const; + static void SelfTest(); + +private: + TUint iStart; + TUint iLength; + }; + + +struct TAddressParms + { + TAddressParms(TUint32 aSrcAddr=0, TUint32 aDstAddr=0, TUint aTransferCount=0) + :iSrcAddr(aSrcAddr), iDstAddr(aDstAddr), iTransferCount(aTransferCount) + {} + + TAddressParms(const TDmaTransferArgs& aArgs) + :iSrcAddr(aArgs.iSrcConfig.iAddr), + iDstAddr(aArgs.iDstConfig.iAddr), + iTransferCount(aArgs.iTransferCount) + {} + + /** + If any src, dst, or transfer count are zero, substitute the values from + aTransferArgs in their place + */ + void Substitute(const TDmaTransferArgs& aTransferArgs); + + /** + When recieved by the test driver, src and dst + addresses will be offsets from the dma test session's + chunk base. They must be converted to absolute, *physical* addresses + */ + void Fixup(TLinAddr aChunkBase); + + /** + Check that both the src and destination lie within the area + defined by aStart and aSize + */ + TBool CheckRange(TLinAddr aStart, TUint aSize); + + TAddrRange SourceRange() const; + TAddrRange DestRange() const; + + TBool Overlaps(const TAddrRange aRange) const; + TBool Overlaps(const TAddressParms aParm) const; + + TBool operator==(const TAddressParms& aOther) const; + + static void SelfTest(); + + TUint32 iSrcAddr; + TUint32 iDstAddr; + TUint iTransferCount; + }; + +// These functions can be used for accessing TDmaTransferArgs in +// terms of TAddressParms. (TAddressParms would be a natural base +// class for TDmaTransferArgs but changing the production code +// is undesirable) +TAddressParms GetAddrParms(const TDmaTransferArgs&); +void SetAddrParms(TDmaTransferArgs&, const TAddressParms&); + +/** +This struct holds the arguments which can be used with TDmaChannel::IsrRedoRequest +*/ +struct TIsrRequeArgs : public TAddressParms + { + TIsrRequeArgs(TUint32 aSrcAddr=KPhysAddrInvalidUser, TUint32 aDstAddr=KPhysAddrInvalidUser, + TUint aTransferCount=0, TUint32 aPslRequestInfo=0, + TBool aIsrCb=ETrue) + : TAddressParms(aSrcAddr, aDstAddr, aTransferCount), iPslRequestInfo(aPslRequestInfo), iIsrCb(aIsrCb) + {} + + + TInt Call(TDmaChannel& aChannel); + + TBool CheckRange(TLinAddr aStart, TUint aSize) const; + + TUint32 iPslRequestInfo; + TBool iIsrCb; + }; +class CISrRequeTest; +/** +A collection of TIsrRequeArgs +*/ +struct TIsrRequeArgsSet + { + + friend class CIsrRequeTest; //TODO see line 394 t_dma2.cpp + TIsrRequeArgsSet(TIsrRequeArgs* aRequeueArgs=NULL, TInt aCount =0) + :iCount(aCount), iIndex(0) + { + TEST_ASSERT(iCount <= MaxCount); + for(TInt i=0; i(aDriverCookie), &aQueueEmpty); + } + + TInt ChannelIsOpened(TUint aDriverCookie,TBool &aChannelOpen) + { + return DoControl(EIsOpened, reinterpret_cast(aDriverCookie), &aChannelOpen); + } + + TInt ChannelIsrRedoRequest(TUint aDriverCookie,TUint32 aSrcAddr,TUint32 aDstAddr,TInt aTransferCount,TUint32 aPslRequestInfo,TBool aIsrCb) + { + TIsrRedoReqArgs args(aDriverCookie,aSrcAddr,aDstAddr,aTransferCount,aPslRequestInfo,aIsrCb); + TPckgC package(args); + return DoControl(EIsrRedoRequest,&package); + } + + TInt ChannelCancelAll(TUint aDriverCookie) + { + return DoControl(ECancelAllChannel, reinterpret_cast(aDriverCookie)); + } + + TInt ChannelOpen(TUint aPslCookie, TUint& aDriverCookie) + { + return DoControl(EOpenChannel, reinterpret_cast(aPslCookie), &aDriverCookie); + } + + TInt ChannelClose(TUint aDriverCookie) + { + return DoControl(ECloseChannel, reinterpret_cast(aDriverCookie)); + } + + TInt ChannelPause(TUint aDriverCookie) + { + return DoControl(EPauseChannel, reinterpret_cast(aDriverCookie)); + } + + TInt ChannelResume(TUint aDriverCookie) + { + return DoControl(EResumeChannel, reinterpret_cast(aDriverCookie)); + } + + TInt ChannelCaps(TUint aDriverCookie, SDmacCaps& aChannelCaps) + { + TDmacTestCaps caps; + TInt r = ChannelCaps(aDriverCookie, caps); + aChannelCaps = caps; + return r; + } + + TInt ChannelCaps(TUint aDriverCookie, TDmacTestCaps& aChannelCaps) + { + TPckg package(aChannelCaps); + return DoControl(EChannelCaps, reinterpret_cast(aDriverCookie), &package); + } + + TInt Open() + {// TO DO: Add Info , this class is just to test the opening of channels + //TPckgBuf infoBuf; + //infoBuf().iWhat = TOpenInfo::EOpen; + //infoBuf().U.iOpen.iId = aId; + //infoBuf().U.iOpen.iDesCount = aDesCount; + //infoBuf().U.iOpen.iMaxTransferSize = aMaxTransferSize; + return DoCreate(KTestDmaLddName,TestDmaLddVersion(), 0, NULL, NULL, EOwnerThread); + } + + //TODO rename this (append "old") + TInt RequestCreate(TUint aChannelCookie, TUint& aRequestCookie, TUint aMaxTransferSize=0) + { + return DoRequestCreate(aChannelCookie, EFalse, aMaxTransferSize, aRequestCookie); + } + + //TODO rename this (get rid of "new" + TInt RequestCreateNew(TUint aChannelCookie, TUint& aRequestCookie, TUint aMaxTransferSize=0) + { + return DoRequestCreate(aChannelCookie, ETrue, aMaxTransferSize, aRequestCookie); + } + + TInt RequestDestroy(TUint aRequestCookie) + { + return DoControl(ERequestClose, reinterpret_cast(aRequestCookie)); + } + + TInt RequestFragmentCount(TUint aRequestCookie) + { + return DoControl(EFragmentCount, reinterpret_cast(aRequestCookie)); + } + + /** + Will fragment a DMA request using the legacy API + */ + TInt FragmentRequestOld(TUint aRequestCookie, const TDmaTransferArgs& aTransferArgs, TUint64* aDurationMicroSecs=NULL) + { + const TFragmentArgs args(aRequestCookie, aTransferArgs, aDurationMicroSecs); + TPckgC package(args); + return DoControl(EFragmentLegacy, &package); + } + + /** + Will fragment a DMA request using the new API + */ + TInt FragmentRequest(TUint aRequestCookie, const TDmaTransferArgs& aTransferArgs, TUint64* aDurationMicroSecs=NULL) + { + const TFragmentArgs args(aRequestCookie, aTransferArgs, aDurationMicroSecs); + TPckgC package(args); + return DoControl(EFragment, &package); + } + + TInt QueueRequest(TUint aRequestCookie, TRequestStatus& aStatus, TCallbackRecord* aRecord = NULL, TUint64* aDurationMicroSecs=NULL) + { + //These dummy values can accept the writeback from the driver + //if the client does not want them. + //(TClientDataRequest can not be programmed with a NULL to + //indicate that an argument is unwanted) + TCallbackRecord dummyRec; + TUint64 dummyTime=0; + + TQueueArgs args(aRequestCookie, &aStatus, aRecord ? aRecord : &dummyRec, aDurationMicroSecs ? aDurationMicroSecs : &dummyTime); + TPckgC package(args); + return DoControl(EQueueRequest, &package); + } + + /** + Synchronous version of QueueRequest + */ + TInt QueueRequest(TUint aRequestCookie, TCallbackRecord* aRecord = NULL, TUint64* aDurationMicroSecs=NULL) + { + TRequestStatus status; + TInt r = QueueRequest(aRequestCookie, status, aRecord, aDurationMicroSecs); + User::WaitForRequest(status); + return r; + } + + /** + Queue a previously fragmented request. + Additional request parameters are included in iRequeueArgs, these will be + transferred from ISR context callback using the TDmaChannel::IsrRedoRequest function + + @pre Isr callback for completion must have been requested at request fragmentation time + */ + TInt QueueRequestWithRequeue(TUint aRequestCookie, TIsrRequeArgs* aRequeueArgs, TInt aCount, TRequestStatus& aStatus, TCallbackRecord* aRecord = NULL, TUint64* aDurationMicroSecs=NULL) + { + //These dummy values can accept the writeback from the driver + //if the client does not want them. + //(TClientDataRequest can not be programmed with a NULL to + //indicate that an argument is unwanted) + TCallbackRecord dummyRec; + TUint64 dummyTime=0; + + TQueueArgsWithReque args(aRequeueArgs, aCount, aRequestCookie, &aStatus, aRecord ? aRecord : &dummyRec, aDurationMicroSecs ? aDurationMicroSecs : &dummyTime); + TPckgC package(args); + return DoControl(EQueueRequestWithReque, &package); + } + + /** + Synchronous version of QueueRequestWithRequeue + */ + TInt QueueRequestWithRequeue(TUint aRequestCookie, TIsrRequeArgs* aRequeueArgs, TInt aCount, TCallbackRecord* aRecord = NULL, TUint64* aDurationMicroSecs=NULL) + { + TRequestStatus status; + TInt r = QueueRequestWithRequeue(aRequestCookie, aRequeueArgs, aCount, status, aRecord, aDurationMicroSecs); + User::WaitForRequest(status); + return r; + } + + TInt OpenSharedChunk(RChunk& aChunk) + { + TUint chunkHandle = DoControl(EOpenSharedChunk); + return aChunk.SetReturnedHandle(chunkHandle); + } + + TInt GetTestInfo(TDmaV2TestInfo& aInfo) + { + TPckg package(aInfo); + return DoControl(EGetTestInfo, &package); + } + + static void SelfTest(); + + static void ApiTest(); +#endif // __KERNEL_MODE__ + +private: + + TInt DoRequestCreate(TUint aChannelCookie, TBool aNewStyle, TUint aMaxTransferSize, TUint& aRequestCookie) + { + TRequestCreateArgs args(aChannelCookie, aNewStyle, aMaxTransferSize); + TPckgC package(args); + return DoControl(ERequestOpen, &package, &aRequestCookie); + } + + + struct TRequestCreateArgs + { + TRequestCreateArgs(TUint aChannelCookie, TBool aNewStyle, TUint aMaxFragmentSize) + :iChannelCookie(aChannelCookie), iNewStyle(aNewStyle), iMaxFragmentSize(aMaxFragmentSize) + {} + + TUint iChannelCookie; + TBool iNewStyle; + TUint iMaxFragmentSize; + }; + + struct TFragmentArgs + { + TFragmentArgs() + :iRequestCookie(0), iTransferArgs(), iDurationMicroSecs(NULL) + {} + TFragmentArgs(TUint aRequestCookie, const TDmaTransferArgs& aTransferArgs, TUint64* aDurationMicroSecs = NULL) + :iRequestCookie(aRequestCookie), iTransferArgs(aTransferArgs), iDurationMicroSecs(aDurationMicroSecs) + {} + + const TUint iRequestCookie; + const TDmaTransferArgs iTransferArgs; + TUint64* const iDurationMicroSecs; + }; + + struct TQueueArgs + { + TQueueArgs(TUint aRequestCookie=0, TRequestStatus* aStatus=NULL, TCallbackRecord* aCallbackRecord=NULL, TUint64* aDurationMicroSecs=NULL) + :iRequestCookie(aRequestCookie), iStatus(aStatus), iCallbackRecord(aCallbackRecord), iDurationMicroSecs(aDurationMicroSecs) + {} + TUint iRequestCookie; + TRequestStatus* iStatus; + TCallbackRecord* iCallbackRecord; + TUint64* iDurationMicroSecs; + }; + + struct TIsrRedoReqArgs + { + TIsrRedoReqArgs(TUint aDriverCookie=0,TUint32 aSrcAddr=0, TUint32 aDstAddr=0, TInt aTransferCount=0, TUint32 aPslRequestInfo=0,TBool aIsrCb=ETrue) + :iDriverCookie(aDriverCookie),iSrcAddr(aSrcAddr),iDstAddr(aDstAddr),iTransferCount(aTransferCount),iPslRequestInfo(aPslRequestInfo),iIsrCb(aIsrCb) + {} + TUint iDriverCookie; + TUint32 iSrcAddr; + TUint32 iDstAddr; + TInt iTransferCount; + TUint32 iPslRequestInfo; + TBool iIsrCb; + }; + + /** + This struct is used for queing and including a set of transfers + to be setup from ISR context callback + */ + struct TQueueArgsWithReque : public TQueueArgs + { + TQueueArgsWithReque(TIsrRequeArgs* aRequeueArgs=NULL, TInt aCount=0, + TUint aRequestCookie=0, TRequestStatus* aStatus=NULL, TCallbackRecord* aCallbackRecord=NULL, TUint64* aDurationMicroSecs=NULL) + :TQueueArgs(aRequestCookie, aStatus, aCallbackRecord, aDurationMicroSecs), iRequeSet(aRequeueArgs, aCount) + { + } + + TIsrRequeArgsSet iRequeSet; + }; + + + enum TControl + { + EOpenChannel, + ECloseChannel, + EPauseChannel, + EResumeChannel, + EChannelCaps, + ERequestOpen, + ERequestClose, + EOpenSharedChunk, + EFragmentLegacy, + EFragment, + EFragmentCount, + EQueueRequest, + EGetTestInfo, + EIsQueueEmpty, + EIsOpened, + EIsrRedoRequest, + ECancelAllChannel, + EQueueRequestWithReque + }; + }; +#endif // __D_DMA2_H__ diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/dmav2/d_dma2_cmn.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/dmav2/d_dma2_cmn.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,328 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: Implmentation of DMAv2 test code, common +* to both user and kernel side +* +*/ +#ifdef __KERNEL_MODE__ +#include +#endif + +#include "d_dma2.h" + +TInt Log2(TInt aNum) + { + TInt res = -1; + while(aNum) + { + res++; + aNum >>= 1; + } + return res; + } + +TCallbackRecord::TCallbackRecord( + TCbContext aContext, + TInt aReq, + TInt aReqSrc, + TInt aReqDst, + TInt aDes, + TInt aDesSrc, + TInt aDesDst, + TInt aFrame, + TInt aFrameSrc, + TInt aFrameDst, + TInt aPause, + TInt aPauseSrc, + TInt aPauseDst, + TDmaResult aResult + ) + //Default iIsrRedoRequestResult is 1 as this is an invalid error code + :iResult(aResult), iContext(aContext), iIsrRedoRequestResult(1) + { + SetCount(EDmaCallbackRequestCompletion, aReq); + SetCount(EDmaCallbackRequestCompletion_Src, aReqSrc); + SetCount(EDmaCallbackRequestCompletion_Dst, aReqDst); + SetCount(EDmaCallbackDescriptorCompletion, aDes); + SetCount(EDmaCallbackDescriptorCompletion_Src, aDesSrc); + SetCount(EDmaCallbackDescriptorCompletion_Dst, aDesDst); + SetCount(EDmaCallbackFrameCompletion, aFrame); + SetCount(EDmaCallbackFrameCompletion_Src, aFrameSrc); + SetCount(EDmaCallbackFrameCompletion_Dst, aFrameDst); + SetCount(EDmaCallbackLinkedListPaused, aPause); + SetCount(EDmaCallbackLinkedListPaused_Src, aPauseSrc); + SetCount(EDmaCallbackLinkedListPaused_Dst, aPauseDst); + } + +TCallbackRecord TCallbackRecord::Empty() + { + return TCallbackRecord(EInvalid,0,0,0,0,0,0,0,0,0,0,0,0,EDmaResultError); + } + +void TCallbackRecord::Reset() + { + new (this) TCallbackRecord(); + } + +TBool TCallbackRecord::operator == (const TCallbackRecord aOther) const + { + return (memcompare((TUint8*)this, sizeof(*this), (TUint8*)&aOther, sizeof(aOther)) == 0); + } + +TInt TCallbackRecord::GetCount(TDmaCallbackType aCbType) const + { + const TInt index = BitToIndex(aCbType); + return iCallbackLog[index]; + } + +void TCallbackRecord::SetCount(TDmaCallbackType aCbType, TInt aCount) + { + const TInt index = BitToIndex(aCbType); + iCallbackLog[index] = aCount; + } + +TInt TCallbackRecord::BitToIndex(TDmaCallbackType aCbType) const + { + const TInt index = Log2(aCbType); + TEST_ASSERT(index >=0 && index < KNumberOfCallbacks); + + return index; + } + +void TCallbackRecord::ProcessCallback(TUint aCallbackMask, TDmaResult aResult) + { + // This function may be called several + // times and will accumulate the number of each callback + // received. However, it will only ever remember the last + // result and context value, + iResult = aResult; + iContext = CurrentContext(); + TEST_ASSERT(iContext != EInvalid); + + for(TInt i=0; i < KNumberOfCallbacks; i++) + { + if(aCallbackMask & 1) + { + iCallbackLog[i]++; + } + aCallbackMask >>= 1; + } + // Assert that we have handled all bits + // if not then maybe KNumberOfCallbacks is too small + // or there is a spurious bit in aCallbackMask + TEST_ASSERT(aCallbackMask == 0); + } + +TCallbackRecord::TCbContext TCallbackRecord::CurrentContext() const + { +#ifdef __KERNEL_MODE__ + switch(NKern::CurrentContext()) + { + case NKern::EThread: + return EThread; + case NKern::EInterrupt: + return EIsr; + case NKern::EIDFC: //fall-through + case NKern::EEscaped: + default: + return EInvalid; + } +#else + //for the benefit of user-mode testing + return EThread; +#endif + } + +void TCallbackRecord::Print() const + { + PRINT(GetCount(EDmaCallbackRequestCompletion)); + PRINT(GetCount(EDmaCallbackRequestCompletion_Src)); + PRINT(GetCount(EDmaCallbackRequestCompletion_Dst)); + PRINT(GetCount(EDmaCallbackDescriptorCompletion)); + PRINT(GetCount(EDmaCallbackDescriptorCompletion_Src)); + PRINT(GetCount(EDmaCallbackDescriptorCompletion_Dst)); + PRINT(GetCount(EDmaCallbackFrameCompletion)); + PRINT(GetCount(EDmaCallbackFrameCompletion_Src)); + PRINT(GetCount(EDmaCallbackFrameCompletion_Dst)); + PRINT(GetCount(EDmaCallbackLinkedListPaused)); + PRINT(GetCount(EDmaCallbackLinkedListPaused_Src)); + PRINT(GetCount(EDmaCallbackLinkedListPaused_Dst)); + PRINT(iResult); + PRINT(iContext); + PRINT(iIsrRedoRequestResult); + } + +TDmacTestCaps::TDmacTestCaps() + :iPILVersion(1) + { + } + +TDmacTestCaps::TDmacTestCaps(const SDmacCaps& aDmacCaps, TInt aVersion) + :SDmacCaps(aDmacCaps), iPILVersion(aVersion) + {} + +TAddrRange::TAddrRange(TUint aStart, TUint aLength) + :iStart(aStart), iLength(aLength) + { + TEST_ASSERT(iLength > 0); + } + +TBool TAddrRange::Contains(TAddrRange aRange) const + { + return Contains(aRange.Start()) && Contains(aRange.End()); + } + +TBool TAddrRange::Overlaps(const TAddrRange& aRange) const + { + return (aRange.Contains(iStart) || aRange.Contains(End()) || + Contains(aRange.Start()) || Contains(aRange.End())); + } +/** +If addresses have been left as KPhysAddrInvalid or the count as 0 +(ie. the default values used for IsrRedoRequest) +then substitute the values from aTransferArgs. +*/ +void TAddressParms::Substitute(const TDmaTransferArgs& aTransferArgs) + { + if(iSrcAddr == KPhysAddrInvalidUser) + iSrcAddr = aTransferArgs.iSrcConfig.iAddr; + + if(iDstAddr == KPhysAddrInvalidUser) + iDstAddr = aTransferArgs.iDstConfig.iAddr; + + if(iTransferCount == 0) + iTransferCount = aTransferArgs.iTransferCount; + } + +/** +Addresses are converted into absolute, +addresses (virtual in user mode, physical in kernel) +unless they are KPhysAddrInvalid +*/ +void TAddressParms::Fixup(TLinAddr aChunkBase) + { + if(iSrcAddr != KPhysAddrInvalidUser) + { + iSrcAddr += aChunkBase; + +#ifdef __KERNEL_MODE__ + iSrcAddr = Epoc::LinearToPhysical(iSrcAddr); + TEST_ASSERT(iSrcAddr != KPhysAddrInvalid); +#endif + } +#ifndef __KERNEL_MODE__ + else + { + // Substitute must be called before + // Fixup on user side + TEST_FAULT; + } +#endif + + if(iDstAddr != KPhysAddrInvalidUser) + { + iDstAddr += aChunkBase; + +#ifdef __KERNEL_MODE__ + iDstAddr = Epoc::LinearToPhysical(iDstAddr); + TEST_ASSERT(iDstAddr != KPhysAddrInvalid); +#endif + } +#ifndef __KERNEL_MODE__ + else + { + // Substitute must be called before + // Fixup on user side + TEST_FAULT; + } +#endif + } + +TBool TAddressParms::CheckRange(TLinAddr aStart, TUint aSize) + { + TAddrRange chunk(aStart, aSize); + return chunk.Contains(SourceRange()) && chunk.Contains(DestRange()); + } + +/** +@return ETrue if the source or destination range of this object +overlaps with aRange +*/ +TBool TAddressParms::Overlaps(const TAddrRange aRange) const + { + return SourceRange().Overlaps(aRange) || DestRange().Overlaps(aRange); + } + +/** +@return ETrue if either the source or dest range of this +overlap with either of those of aParm +*/ +TBool TAddressParms::Overlaps(const TAddressParms aParm) const + { + return Overlaps(aParm.SourceRange()) || Overlaps(aParm.DestRange()); + } + +TBool TAddressParms::operator==(const TAddressParms& aOther) const + { + return iSrcAddr == aOther.iSrcAddr && + iDstAddr == aOther.iDstAddr && + iTransferCount == aOther.iTransferCount; + } + +TAddressParms GetAddrParms(const TDmaTransferArgs& aArgs) + { + return TAddressParms(aArgs); + } + +TAddrRange TAddressParms::SourceRange() const + { + return TAddrRange(iSrcAddr, iTransferCount); + } + +TAddrRange TAddressParms::DestRange() const + { + return TAddrRange(iDstAddr, iTransferCount); + } + +void SetAddrParms(TDmaTransferArgs& aTransferArgs, const TAddressParms& aAddrParams) + { + aTransferArgs.iSrcConfig.iAddr = aAddrParams.iSrcAddr; + aTransferArgs.iDstConfig.iAddr = aAddrParams.iDstAddr; + aTransferArgs.iTransferCount = aAddrParams.iTransferCount; + } + +TIsrRequeArgs TIsrRequeArgsSet::GetArgs() + { + TEST_ASSERT(!IsEmpty()); + const TIsrRequeArgs args(iRequeArgs[iIndex]); + iIndex++; + iCount--; + return args; + } + + +void TIsrRequeArgsSet::Substitute(const TDmaTransferArgs& aTransferArgs) + { + for(TInt i=0; i +#include +#include + +static RTest test(_L("DMA Test Framework API")); +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2564 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc This test checks the correct behaviour of Open API in the new DMA framework +//! +//! @SYMTestActions +//! 1. Open a DMA channel +//! 2. Verify that channel is really open. +//! +//! @SYMTestExpectedResults +//! 1. DMA channel opens and KErrNone returned +//! 2. Call to ChannelIsOpened() return as ETrue. +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +void test_open_api() +{ + //TO DO : Expose TInt Open(const SCreateInfo& aInfo, TDmaChannel*& aChannel) + //TO DO : Implement more test cases + test.Start(_L("*** Testing Open() API ***")); + + test.Next(_L("Open session")); + RDmaSession session; + TInt r = session.Open(); + test_KErrNone(r); + + TUint channelCookie_open_api=0; + + test.Next(_L("Open DMA Channel")); + channelCookie_open_api=0; + r = session.ChannelOpen(16, channelCookie_open_api); + test.Printf(_L("cookie recieved = 0x%08x\n"), channelCookie_open_api); + test_KErrNone(r); + + //Check if channel is open + // test.Printf(_L("Verify that the specified DMA channel is opened\n")); + // TBool channelOpened; + // TBool channelNotOpened = EFalse; + // r = session.ChannelIsOpened(channelCookie_open_api, channelOpened); + // test_KErrNone(r); + // TEST_ASSERT(channelOpened != channelNotOpened) + + //close channel + test.Next(_L("Channel close")); + r = session.ChannelClose(channelCookie_open_api); + test_KErrNone(r); + + RTest::CloseHandleAndWaitForDestruction(session); + test.End(); +} + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2568 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc This test checks the correct behaviour of Close API in the new DMA framework +//! +//! @SYMTestActions +//! 1. Open a DMA channel +//! 2. Open DMA Channel again +//! 3 Close the DMA channel. +//! 4 Open DMA channel to verify that the DMA channel closed. +//! 5. Open DMA channel again. +//! 6. Queue a request on the channel. +//! 7. Close DMA channel while request is still queued on it. +//! +//! @SYMTestExpectedResults +//! 1. DMA channel opens and KErrNone returned. +//! 2. DMA Framework returns KErrInUse as channel is already open. +//! 3. DMA channel closes and KErrNone returned. +//! 4. DMA channel opens and KErrNone returned. +//! 5. DMA Framework returns KErrInUse as channel is already open. +//! 6. DMA request queued and KErrNone returned. +//! 7. DMA channel closes and DMA framework flags an error. +//! +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +void test_close_api() +{ + test.Start(_L("*** Testing Close() API ***")); + + test.Next(_L("Open session")); + RDmaSession session; + TInt r = session.Open(); + test_KErrNone(r); + + const TInt size = 64 * KKilo; + TUint reqCookieNewStyle_close_api=0; + TUint channelCookie_close_api=0; + + test.Next(_L("Open a single DMA channel")); + r = session.ChannelOpen(16, channelCookie_close_api); + test.Printf(_L("cookie recieved = 0x%08x\n"), channelCookie_close_api); + test_KErrNone(r); + + // test.Next(_L("Open DMA channel again")); + // TUint channelCookie_close_api_1=0; + // r = session.ChannelOpen(16, channelCookie_close_api_1); + // test.Printf(_L("Verify that DMA channel is already opened\n")); + // test_Equal(KErrInUse,r); + + test.Next(_L("Close the DMA channel")); + r = session.ChannelClose(channelCookie_close_api); + test_KErrNone(r); + + test.Next(_L("Open DMA channel again")); + r = session.ChannelOpen(16, channelCookie_close_api); + test.Printf(_L("Verify that DMA channel was closed\n")); + test_KErrNone(r); + + //Fails if a request is created and cancel + test.Next(_L("Queue a request on the channel")); + r = session.RequestCreateNew(channelCookie_close_api, reqCookieNewStyle_close_api); //Create Dma request (with new-style callback) + test.Printf(_L("cookie recieved for open channel = 0x%08x\n"), reqCookieNewStyle_close_api); + test_KErrNone(r); + + TDmaTransferArgs transferArgs_close_api; + transferArgs_close_api.iSrcConfig.iAddr = 0; + transferArgs_close_api.iDstConfig.iAddr = size; + transferArgs_close_api.iSrcConfig.iFlags = KDmaMemAddr; + transferArgs_close_api.iDstConfig.iFlags = KDmaMemAddr; + transferArgs_close_api.iTransferCount = size; + r = session.FragmentRequest(reqCookieNewStyle_close_api, transferArgs_close_api); + test_KErrNone(r); + + test.Next(_L("Queue DMA Request")); + TCallbackRecord record_close_api; + r = session.QueueRequest(reqCookieNewStyle_close_api, &record_close_api); + test_KErrNone(r); + + test.Next(_L("Destroy Dma request")); + r = session.RequestDestroy(reqCookieNewStyle_close_api); + test_KErrNone(r); + + test.Next(_L("Close the DMA channel")); + r = session.ChannelClose(channelCookie_close_api); + test_KErrNone(r); + + test.End(); + RTest::CloseHandleAndWaitForDestruction(session); +} + +void RDmaSession::ApiTest() + { + test_open_api(); // Verify that Open() opens a DMA channel + test_close_api(); // Verify that Close() closes a DMA channel + } + +void ApiTests() + { + test.Next(_L("Running framework API tests")); + RDmaSession::ApiTest(); + test.Close(); + } diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/dmav2/self_test.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/dmav2/self_test.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,665 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: +* This file contains unit tests for the test framework itself. +* They should be run if changes have been made to +* to the user side test framework code ie. anything in the dmav2 +* directory other than the d_* driver code, or test_cases.cpp +* +*/ + +#include "d_dma2.h" +#include "u32std.h" +#include "t_dma2.h" +#include "cap_reqs.h" + +#define __E32TEST_EXTENSION__ +#include +#include +#include + +static RTest test(_L("t_dma2 test framework tests")); + +void RDmaSession::SelfTest() + { + test.Start(_L("Simple transfer test")); + test.Next(_L("Open session")); + RDmaSession session; + TInt r = session.Open(); + test_KErrNone(r); + + test.Next(_L("Get test info")); + TDmaV2TestInfo testInfo; + r = session.GetTestInfo(testInfo); + test_KErrNone(r); + + if(gVerboseOutput) + { + Print(testInfo); + } + + test.Next(_L("Channel open")); + TUint channelCookie=0; + r = session.ChannelOpen(16, channelCookie); + test.Printf(_L("cookie recived = 0x%08x\n"), channelCookie); + test_KErrNone(r); + + test.Next(_L("Get Channel caps")); + SDmacCaps channelCaps; + r = session.ChannelCaps(channelCookie, channelCaps); + test_KErrNone(r); + if(gVerboseOutput) + { + PRINT(channelCaps.iChannelPriorities); + PRINT(channelCaps.iChannelPauseAndResume); + PRINT(channelCaps.iAddrAlignedToElementSize); + PRINT(channelCaps.i1DIndexAddressing); + PRINT(channelCaps.i2DIndexAddressing); + PRINT(channelCaps.iSynchronizationTypes); + PRINT(channelCaps.iBurstTransactions); + PRINT(channelCaps.iDescriptorInterrupt); + PRINT(channelCaps.iFrameInterrupt); + PRINT(channelCaps.iLinkedListPausedInterrupt); + PRINT(channelCaps.iEndiannessConversion); + PRINT(channelCaps.iGraphicsOps); + PRINT(channelCaps.iRepeatingTransfers); + PRINT(channelCaps.iChannelLinking); + PRINT(channelCaps.iHwDescriptors); + PRINT(channelCaps.iSrcDstAsymmetry); + PRINT(channelCaps.iAsymHwDescriptors); + PRINT(channelCaps.iBalancedAsymSegments); + PRINT(channelCaps.iAsymCompletionInterrupt); + PRINT(channelCaps.iAsymDescriptorInterrupt); + PRINT(channelCaps.iAsymFrameInterrupt); + PRINT(channelCaps.iReserved[0]); + PRINT(channelCaps.iReserved[1]); + PRINT(channelCaps.iReserved[2]); + PRINT(channelCaps.iReserved[3]); + PRINT(channelCaps.iReserved[4]); + } + + test.Next(_L("Get extended Channel caps (TDmacTestCaps)")); + TDmacTestCaps extChannelCaps; + r = session.ChannelCaps(channelCookie, extChannelCaps); + test_KErrNone(r); + test.Printf(_L("PIL version = %d\n"), extChannelCaps.iPILVersion); + + const TBool newPil = (extChannelCaps.iPILVersion > 1); + + test.Next(_L("Create Dma request - max fragment size 32K")); + TUint reqCookie=0; + r = session.RequestCreate(channelCookie, reqCookie, 32 * KKilo); + test.Printf(_L("cookie recived = 0x%08x\n"), reqCookie); + test_KErrNone(r); + + if(newPil) + { + test.Next(_L("Create Dma request (with new-style callback)")); + TUint reqCookieNewStyle=0; + r = session.RequestCreateNew(channelCookie, reqCookieNewStyle); + test.Printf(_L("cookie recived = 0x%08x\n"), reqCookieNewStyle ); + test_KErrNone(r); + + test.Next(_L("Fragment for ISR callback")); + const TInt size = 128 * KKilo; + TDmaTransferArgs transferArgs(0, size, size, KDmaMemAddr, KDmaSyncAuto, KDmaRequestCallbackFromIsr); + r = session.FragmentRequest(reqCookieNewStyle, transferArgs); + test_KErrNone(r); + + TIsrRequeArgs reque; + test.Next(_L("Queue ISR callback - with default re-queue")); + r = session.QueueRequestWithRequeue(reqCookieNewStyle, &reque, 1); + test_KErrNone(r); + + test.Next(_L("Destroy new-style Dma request")); + r = session.RequestDestroy(reqCookieNewStyle); + test_KErrNone(r); + + test.Next(_L("Attempt to destroy request again ")); + r = session.RequestDestroy(reqCookieNewStyle); + test_Equal(KErrNotFound, r); + } + + test.Next(_L("Open chunk handle")); + RChunk chunk; + r = session.OpenSharedChunk(chunk); + test_KErrNone(r); + if(gVerboseOutput) + { + test.Printf(_L("chunk base = 0x%08x\n"), chunk.Base()); + test.Printf(_L("chunk size = %d\n"), chunk.Size()); + } + test(chunk.IsWritable()); + test(chunk.IsReadable()); + + test.Next(_L("Fragment(old style)")); + const TInt size = 128 * KKilo; + TInt i; + for(i = 0; i<10; i++) + { + TUint64 time = 0; + TDmaTransferArgs transferArgs(0, size, size, KDmaMemAddr); + r = session.FragmentRequestOld(reqCookie, transferArgs, &time); + test_KErrNone(r); + if(gVerboseOutput) + { + test.Printf(_L("%lu us\n"), time); + } + } + + test.Next(_L("Queue")); + TRequestStatus status; + + for(i = 0; i<10; i++) + { + TUint64 time = 0; + r = session.QueueRequest(reqCookie, status, 0, &time); + User::WaitForRequest(status); + test_KErrNone(r); + if(gVerboseOutput) + { + test.Printf(_L("%lu us\n"), time); + } + } + + if(newPil) + { + test.Next(_L("Fragment(new style)")); + TDmaTransferArgs transferArgs; + transferArgs.iSrcConfig.iAddr = 0; + transferArgs.iDstConfig.iAddr = size; + transferArgs.iSrcConfig.iFlags = KDmaMemAddr; + transferArgs.iDstConfig.iFlags = KDmaMemAddr; + transferArgs.iTransferCount = size; + + for(i = 0; i<10; i++) + { + TUint64 time = 0; + r = session.FragmentRequest(reqCookie, transferArgs, &time); + test_KErrNone(r); + if(gVerboseOutput) + { + test.Printf(_L("%lu us\n"), time); + } + } + } + + test.Next(_L("Queue")); + TCallbackRecord record; + r = session.QueueRequest(reqCookie, &record); + test_KErrNone(r); + + test.Next(_L("check TCallbackRecord record")); + if(gVerboseOutput) + { + record.Print(); + } + const TCallbackRecord expected(TCallbackRecord::EThread, 1); + if(!(record == expected)) + { + test.Printf(_L("TCallbackRecords did not match")); + if(gVerboseOutput) + { + test.Printf(_L("expected:")); + expected.Print(); + } + TEST_FAULT; + } + + test.Next(_L("Destroy Dma request")); + r = session.RequestDestroy(reqCookie); + test_KErrNone(r); + + test.Next(_L("Close chunk handle")); + chunk.Close(); + + test.Next(_L("Channel close")); + r = session.ChannelClose(channelCookie); + test_KErrNone(r); + + test.Next(_L("Channel close (same again)")); + r = session.ChannelClose(channelCookie); + test_Equal(KErrNotFound, r); + + test.Next(_L("Close session")); + RTest::CloseHandleAndWaitForDestruction(session); + + test.End(); + + } + +const SDmacCaps KTestCapSet = + {6, // TInt iChannelPriorities; + EFalse, // TBool iChannelPauseAndResume; + ETrue, // TBool iAddrAlignedToElementSize; + EFalse, // TBool i1DIndexAddressing; + EFalse, // TBool i2DIndexAddressing; + KDmaSyncSizeElement | KDmaSyncSizeFrame | + KDmaSyncSizeBlock, // TUint iSynchronizationTypes; + KDmaBurstSize4 | KDmaBurstSize8, // TUint iBurstTransactions; + EFalse, // TBool iDescriptorInterrupt; + EFalse, // TBool iFrameInterrupt; + EFalse, // TBool iLinkedListPausedInterrupt; + EFalse, // TBool iEndiannessConversion; + 0, // TUint iGraphicsOps; + ETrue, // TBool iRepeatingTransfers; + EFalse, // TBool iChannelLinking; + ETrue, // TBool iHwDescriptors; + EFalse, // TBool iSrcDstAsymmetry; + EFalse, // TBool iAsymHwDescriptors; + EFalse, // TBool iBalancedAsymSegments; + EFalse, // TBool iAsymCompletionInterrupt; + EFalse, // TBool iAsymDescriptorInterrupt; + EFalse, // TBool iAsymFrameInterrupt; + {0, 0, 0, 0, 0} // TUint32 iReserved[5]; + }; + +const TDmacTestCaps KDmacTestCapsV1(KTestCapSet, 1); +const TDmacTestCaps KDmacTestCapsV2(KTestCapSet, 2); + +void TDmaCapability::SelfTest() + { + test.Start(_L("Unit test_Value of TDmaCapability::CompareToDmaCaps\n")); + + { + test.Next(_L("ENone\n")); + TResult t = none.CompareToDmaCaps(KTestCapSet); + test_Value(t, t == ERun); + } + + { + test.Next(_L("EChannelPauseAndResume - wanted\n")); + TResult t = pauseRequired.CompareToDmaCaps(KTestCapSet); + test_Value(t, t == EFail); + } + { + test.Next(_L("EChannelPauseAndResume - wanted - Allow skip\n")); + TResult t = pauseRequired_skip.CompareToDmaCaps(KTestCapSet); + test_Value(t, t == ESkip); + } + { + test.Next(_L("EChannelPauseAndResume - not wanted\n")); + TResult t = pauseNotWanted.CompareToDmaCaps(KTestCapSet); + test_Value(t, t == ERun); + } + + { + test.Next(_L("EHwDescriptors - not wanted\n")); + TResult t = hwDesNotWanted.CompareToDmaCaps(KTestCapSet); + test_Value(t, t == EFail); + } + + { + test.Next(_L("EHwDescriptors - not wanted - Allow skip\n")); + TResult t = hwDesNotWanted_skip.CompareToDmaCaps(KTestCapSet); + test_Value(t, t == ESkip); + } + + { + test.Next(_L("EHwDescriptors - wanted\n")); + TResult t = hwDesWanted.CompareToDmaCaps(KTestCapSet); + test_Value(t, t == ERun); + } + + +//TODO use this macro for the above tests + +// Note: The construction of the test description message +// is horribly confusing. The _L macro will make the +// *first* string token wide, but not the next two. +// Therefore these must be made wide or compilier +// will complain about concatination of narrow and wide string +// literals +#define CAP_TEST(CAP, CAPSET, EXPCT)\ + {\ + test.Next(_L(#CAP L" against " L ## #CAPSET));\ + TResult t = (CAP).CompareToDmaCaps(CAPSET);\ + test_Equal(EXPCT, t);\ + } + + + CAP_TEST(capEqualV1, KDmacTestCapsV1, ERun); + CAP_TEST(capEqualV2, KDmacTestCapsV2, ERun); + CAP_TEST(capEqualV1, KDmacTestCapsV2, ESkip); + CAP_TEST(capEqualV2, KDmacTestCapsV1, ESkip); + CAP_TEST(capEqualV2Fatal, KDmacTestCapsV1, EFail); + + CAP_TEST(capAboveV1, KDmacTestCapsV2, ERun); + CAP_TEST(capBelowV2, KDmacTestCapsV1, ERun); + CAP_TEST(capAboveV1, KDmacTestCapsV1, ESkip); + CAP_TEST(capBelowV2, KDmacTestCapsV2, ESkip); + + test.End(); + } + +void TTestCase::SelfTest() + { + //TODO should use macros for these tests + test.Start(_L("Unit test of TTestCase::TestCaseValid\n")); + + TTestCase testCase(NULL, EFalse, pauseRequired, hwDesNotWanted); + test.Next(_L("pauseRequired, hwDesNotWanted\n")); + TResult t = testCase.TestCaseValid(KTestCapSet); + test_Value(t, t == EFail); + + test.Next(_L("pauseRequired_skip, hwDesNotWanted\n")); + testCase.iChannelCaps[0] = pauseRequired_skip; + t = testCase.TestCaseValid(KTestCapSet); + test_Value(t, t == EFail); + + test.Next(_L("pauseRequired_skip, hwDesNotWanted_skip\n")); + testCase.iChannelCaps[1] = hwDesNotWanted_skip; + t = testCase.TestCaseValid(KTestCapSet); + test_Value(t, t == ESkip); + + test.Next(_L("pauseNotWanted, hwDesNotWanted_skip\n")); + testCase.iChannelCaps[0] = pauseNotWanted; + t = testCase.TestCaseValid(KTestCapSet); + test_Value(t, t == ESkip); + + test.Next(_L("pauseNotWanted, hwDesWanted\n")); + testCase.iChannelCaps[1] = hwDesWanted; + t = testCase.TestCaseValid(KTestCapSet); + test_Value(t, t == ERun); + + test.Next(_L("pauseNotWanted\n")); + testCase.iChannelCaps[1] = none; + t = testCase.TestCaseValid(KTestCapSet); + test_Value(t, t == ERun); + + test.Next(_L("pauseNotWanted + V1 PIL required\n")); + testCase.iChannelCaps[1] = capAboveV1; + test.Next(_L("Against KDmacTestCapsV1")); + t = testCase.TestCaseValid(KDmacTestCapsV1); + test_Equal(ESkip, t); + test.Next(_L("Against KDmacTestCapsV2")); + t = testCase.TestCaseValid(KDmacTestCapsV2); + test_Equal(ERun, t); + + test.Next(_L("pauseNotWanted + >V1 PIL required\n")); + testCase.iChannelCaps[1] = capBelowV2; + test.Next(_L("Against KDmacTestCapsV1")); + t = testCase.TestCaseValid(KDmacTestCapsV1); + test_Equal(ERun, t); + test.Next(_L("Against KDmacTestCapsV2")); + t = testCase.TestCaseValid(KDmacTestCapsV2); + test_Equal(ESkip, t); + + test.End(); + test.Close(); + } + + +void TTransferIter::SelfTest() + { + test.Start(_L("No skip")); + + const TUint8 src[9] = { + 1 ,2, 3, + 4, 5, 6, + 7, 8, 9 + }; + + const TUint32 addr = (TUint32)src; + const TUint elementSize = 1; + const TUint elementSkip = 0; + const TUint elementsPerFrame = 3; + const TUint frameSkip = 0; + const TUint framesPerTransfer = 3; + TDmaTransferConfig cfg(addr, elementSize, elementsPerFrame, framesPerTransfer, + elementSkip, frameSkip, KDmaMemAddr + ); + + TTransferIter iter(cfg, 0); + TTransferIter end; + TInt i; + for(i = 0; i<9; i++, ++iter) + { + test_Equal(src[i],*iter); + }; + + + test.Next(_L("90 degree rotation")); + // Now imagine that we wanted to perform a rotation + // as we write, so that we wrote out the following + + const TUint8 expected[9] = { + 7, 4, 1, + 8, 5, 2, + 9, 6, 3 + }; + + TUint8 dst[9] = {0}; + TDmaTransferConfig dst_cfg(cfg); + dst_cfg.iAddr = (TUint32)&dst[2]; + dst_cfg.iElementSkip = 2; + dst_cfg.iFrameSkip = -8; + + TTransferIter dst_iter(dst_cfg, 0); + for(i=0; dst_iter != end; i++, ++dst_iter) + { + TEST_ASSERT(i<9); + *dst_iter=src[i]; + }; + + for(i=0; i<9; i++) + { + test_Equal(expected[i],dst[i]); + } + } + +void TCallbackRecord::SelfTest() + { + test.Start(_L("SeltTest of TCallbackRecord")); + + test.Next(_L("create default TCallbackRecord record, record2")); + TCallbackRecord record; + const TCallbackRecord record2; + if(gVerboseOutput) + { + test.Next(_L("Print record")); + record.Print(); + } + + test.Next(_L("test (record == record2)")); + if(!(record == record2)) + { + if(gVerboseOutput) + { + record2.Print(); + } + TEST_FAULT; + } + + //A series of callback masks + //Note these combinations do not necessarily represent + //possible callback combinations + TUint callbacks[] = + { + EDmaCallbackDescriptorCompletion, + EDmaCallbackDescriptorCompletion, + EDmaCallbackDescriptorCompletion, + EDmaCallbackDescriptorCompletion, + EDmaCallbackFrameCompletion_Src, + EDmaCallbackFrameCompletion_Dst, + EDmaCallbackDescriptorCompletion_Src | EDmaCallbackDescriptorCompletion_Dst, + EDmaCallbackDescriptorCompletion_Src | EDmaCallbackFrameCompletion_Src | EDmaCallbackLinkedListPaused_Dst, + EDmaCallbackRequestCompletion | EDmaCallbackRequestCompletion_Src, + EDmaCallbackDescriptorCompletion_Dst + }; + test.Next(_L("Feed a series of callback masks in to record")); + const TInt length = ARRAY_LENGTH(callbacks); + for(TInt i = 0; i < length; i++) + { + record.ProcessCallback(callbacks[i], EDmaResultOK); + } + + if(gVerboseOutput) + { + test.Next(_L("Print record")); + record.Print(); + } + + test.Next(_L("test GetCount")); + test_Equal(1, record.GetCount(EDmaCallbackRequestCompletion)); + test_Equal(1, record.GetCount(EDmaCallbackRequestCompletion_Src)); + test_Equal(0, record.GetCount(EDmaCallbackRequestCompletion_Dst)); + test_Equal(4, record.GetCount(EDmaCallbackDescriptorCompletion)); + test_Equal(2, record.GetCount(EDmaCallbackDescriptorCompletion_Src)); + test_Equal(2, record.GetCount(EDmaCallbackDescriptorCompletion_Dst)); + test_Equal(0, record.GetCount(EDmaCallbackFrameCompletion)); + test_Equal(2, record.GetCount(EDmaCallbackFrameCompletion_Src)); + test_Equal(1, record.GetCount(EDmaCallbackFrameCompletion_Dst)); + test_Equal(0, record.GetCount(EDmaCallbackLinkedListPaused)); + test_Equal(0, record.GetCount(EDmaCallbackLinkedListPaused_Src)); + test_Equal(1, record.GetCount(EDmaCallbackLinkedListPaused_Dst)); + + test.Next(_L("test expected == record")); + const TCallbackRecord expected(TCallbackRecord::EThread, 1, 1, 0, 4, 2, 2, 0, 2, 1, 0, 0, 1); + if(!(expected == record)) + { + if(gVerboseOutput) + { + expected.Print(); + } + TEST_FAULT; + } + + test.Next(_L("modify record: test expected != record")); + record.SetCount(EDmaCallbackFrameCompletion, 10); + if(expected == record) + { + if(gVerboseOutput) + { + expected.Print(); + } + TEST_FAULT; + } + + test.Next(_L("test Reset()")); + record.Reset(); + test(record == record2); + + test.End(); + } + +void CDmaBenchmark::SelfTest() + { + test.Start(_L("SelfTest of CDmaBenchmark")); + test.Next(_L("MeanResult()")); + + TUint64 results[] = {8, 12, 1, 19, 3, 17, 10}; + const TInt count = ARRAY_LENGTH(results); + + CDmaBmFragmentation fragTest(_L("SelfTest"), count, TDmaTransferArgs(), 0); + + for(TInt i = 0; i < count; i++) + { + fragTest.iResultArray.Append(results[i]); + } + test_Equal(10, fragTest.MeanResult()); + + test.End(); + } + +void TAddrRange::SelfTest() + { + test.Start(_L("SelfTest of TAddrRange")); + TAddrRange a(0, 8); + TAddrRange b(8, 8); + + test_Equal(7, a.End()); + test_Equal(15, b.End()); + + test(!a.Overlaps(b)); + test(!b.Overlaps(a)); + test(a.Overlaps(a)); + test(b.Overlaps(b)); + + TAddrRange c(7, 2); + test_Equal(8, c.End()); + + test(a.Overlaps(c)); + test(c.Overlaps(a)); + test(b.Overlaps(c)); + test(c.Overlaps(b)); + + TAddrRange d(0, 24); + test(a.Overlaps(d)); + test(d.Overlaps(a)); + + test(b.Overlaps(d)); + test(d.Overlaps(b)); + + test(d.Contains(d)); + + test(d.Contains(a)); + test(!a.Contains(d)); + + test(d.Contains(b)); + test(!b.Contains(d)); + + test(!a.Contains(b)); + test(!b.Contains(a)); + test.End(); + } + +void TAddressParms::SelfTest() + { + test.Start(_L("SelfTest of TAddressParms")); + const TAddressParms pA(0, 32, 8); + test(pA == pA); + test(pA.Overlaps(pA)); + + const TAddrRange rA(4, 8); + const TAddrRange rB(16, 8); + const TAddrRange rC(28, 8); + const TAddrRange rD(4, 32); + + test(pA.Overlaps(rA)); + test(!pA.Overlaps(rB)); + test(pA.Overlaps(rC)); + test(pA.Overlaps(rD)); + + const TAddressParms pB(8, 16, 8); + test(!(pA == pB)); + test(!(pB == pA)); + test(!pA.Overlaps(pB)); + test(!pB.Overlaps(pA)); + + const TAddressParms pC(8, 28, 8); + test(pC.Overlaps(pA)); + test(pC.Overlaps(pB)); + + const TAddressParms pD(0, 128, 64); + test(pD.Overlaps(pA)); + test(pD.Overlaps(pB)); + test(pD.Overlaps(pC)); + test.End(); + } + +void SelfTests() + { + test.Next(_L("Running framework unit tests")); + RDmaSession::SelfTest(); + TDmaCapability::SelfTest(); + TTestCase::SelfTest(); + TTransferIter::SelfTest(); + TCallbackRecord::SelfTest(); + CDmaBmFragmentation::SelfTest(); + TAddrRange::SelfTest(); + TAddressParms::SelfTest(); + test.End(); + test.Close(); + } diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/dmav2/t_dma2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/dmav2/t_dma2.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,1546 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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\dma\t_dma.cpp + +#include "d_dma2.h" +#include "u32std.h" +#include "t_dma2.h" +#include "cap_reqs.h" + +#define __E32TEST_EXTENSION__ +#include +#include +#include +#include + +// DMA test framework command parameter options + +// SelfTest Option +_LIT(KArgSelfTest, "/SELFTEST"); +_LIT(KArgSelfTest2, "/S"); + +//Verbose Option +_LIT(KArgVerboseOutput, "/VERBOSE"); +_LIT(KArgVerboseOutput2, "/V"); + + +TBool gHelpRequested; // print usage +TBool gVerboseOutput; // enable verbose output +TBool gSelfTest; // run SelfTest + +/** +This function prints out the PSL test Information +*/ +void Print(const TDmaV2TestInfo& aInfo) + { + PRINT(aInfo.iMaxTransferSize); + PRINT(aInfo.iMemAlignMask); + PRINT(aInfo.iMemMemPslInfo); + PRINT(aInfo.iMaxSbChannels); + for(TInt i=0; i buf; + buf.AppendFormat(_L("DMA channel %d"), iChannelCookie); + RDebug::RawPrint(buf); + } + +////////////////////////////////////////////////////////////////////// +// CDmaTest +////////////////////////////////////////////////////////////////////// + +void CDmaTest::OpenDmaSession() + { + TInt r = iDmaSession.Open(); + TEST_ASSERT(r == KErrNone); + r = iDmaSession.OpenSharedChunk(iChunk); + TEST_ASSERT(r == KErrNone); + } + +void CDmaTest::CloseDmaSession() + { + iChunk.Close(); + iDmaSession.Close(); + } + +////////////////////////////////////////////////////////////////////// +// CSingleTransferTest +////////////////////////////////////////////////////////////////////// +void CSingleTransferTest::RunTest() + { + OpenDmaSession(); + PreTransferSetup(); + + OpenChannel(); + CreateDmaRequest(); + Fragment(); + Queue(); + FreeRequest(); + CloseChannel(); + PostTransferCheck(); + + CloseDmaSession(); + } + +void CSingleTransferTest::OpenChannel() + { + iActual.iChannelOpenResult = + iDmaSession.ChannelOpen(iChannelCookie, iChannelSessionCookie); + } + +void CSingleTransferTest::CreateDmaRequest() + { + if(iUseNewRequest) + { + if(gVerboseOutput) + { + RDebug::Printf("Calling New Request API\n"); + } + iActual.iRequestResult.iCreate = + iDmaSession.RequestCreateNew(iChannelSessionCookie, iRequestSessionCookie, iMaxFragmentSize); + } + else + { + if(gVerboseOutput) + { + RDebug::Printf("Calling Old Request API\n"); + } + iActual.iRequestResult.iCreate = + iDmaSession.RequestCreate(iChannelSessionCookie, iRequestSessionCookie, iMaxFragmentSize); + } + } + +void CSingleTransferTest::Fragment() + { + if(iActual.iRequestResult.iCreate != KErrNone) + return; + + if(iUseNewFragment) + { + if(gVerboseOutput) + { + RDebug::Printf("Calling New Fragment API\n"); + } + iActual.iRequestResult.iFragmentationResult = + iDmaSession.FragmentRequest(iRequestSessionCookie, iTransferArgs); + } + else + { + if(gVerboseOutput) + { + RDebug::Printf("Calling Old Fragment API\n"); + } + iActual.iRequestResult.iFragmentationResult = + iDmaSession.FragmentRequestOld(iRequestSessionCookie, iTransferArgs); + + } + + const TInt fragmentCount = iDmaSession.RequestFragmentCount(iRequestSessionCookie); + + // Record the fragment count if a non-zero value was expected, + // or if it was an error value + if(iExpected.iRequestResult.iFragmentCount != 0 || fragmentCount < 0) + iActual.iRequestResult.iFragmentCount = fragmentCount; + } + +void CSingleTransferTest::Queue() + { + if(iActual.iRequestResult.iFragmentationResult == KErrNone) + { + iActual.iRequestResult.iQueueResult = iDmaSession.QueueRequest(iRequestSessionCookie, &iActual.iCallbackRecord); + } + } + +void CSingleTransferTest::PostTransferCheck() + { + if(iPostTransferCheck) + iActual.iPostTransferCheck = DoPostTransferCheck(); + } + +TInt CSingleTransferTest::DoPostTransferCheck() + { + return iPostTransferCheck->Check(*this); + } + +void CSingleTransferTest::FreeRequest() + { + if(iActual.iRequestResult.iCreate == KErrNone) + { + TInt r = iDmaSession.RequestDestroy(iRequestSessionCookie); + TEST_ASSERT(r == KErrNone); + } + } + +void CSingleTransferTest::CloseChannel() + { + if(iActual.iChannelOpenResult == KErrNone) + { + TInt r = iDmaSession.ChannelClose(iChannelSessionCookie); + TEST_ASSERT(r == KErrNone); + } + } + +void CSingleTransferTest::PrintTestType() const + { + RDebug::RawPrint(_L("Single transfer")); + } + +void CSingleTransferTest::PreTransferSetup() + { + if(iPreTransfer) + iPreTransfer->Setup(*this); //initialize test + } + +TBool CSingleTransferTest::Result() + { + const TBool result = iExpected == iActual; + if(!result) + { + RDebug::Printf("TResultSets do not match"); + } + if(!result || gVerboseOutput) + { + RDebug::Printf("\nExpected error codes:"); + iExpected.Print(); + RDebug::Printf("Expected callback record:"); + iExpected.iCallbackRecord.Print(); + + RDebug::Printf("\nActual error codes:"); + iActual.Print(); + RDebug::Printf("Actual callback record:"); + iActual.iCallbackRecord.Print(); + } + return result; + } + + + +////////////////////////////////////////////////////////////////////// +// CDmaBenchmark +////////////////////////////////////////////////////////////////////// + +CDmaBenchmark::CDmaBenchmark(const TDesC& aName, TInt aIterations, const TResultSet& aExpectedResults, const TDmaTransferArgs& aTransferArgs, TUint aMaxFragmentSize) + :CSingleTransferTest(aName, aIterations, aTransferArgs, aExpectedResults, aMaxFragmentSize, NULL, NULL) + { + UseNewDmaApi(EFalse); + } + +CDmaBenchmark::~CDmaBenchmark() + { + iResultArray.Close(); + } + +TUint64 CDmaBenchmark::MeanResult() + { + if(gVerboseOutput) + RDebug::Printf("CDmaBenchmark::MeanResult\n"); + + const TInt count = iResultArray.Count(); + + TEST_ASSERT(count > 0); + TEST_ASSERT(count == iIterations); + + TUint64 sum = 0; + + for(TInt i = 0; i < count; i++) + { + const TUint64 value = iResultArray[i]; + if(gVerboseOutput) + RDebug::Printf("iResultArray[%d]: %lu", i, value); + + sum += value; + } + + return sum / count; + } + +TBool CDmaBenchmark::Result() + { + const TBool result = CSingleTransferTest::Result(); + if(result) + { + RDebug::Printf(" Mean time: %lu us", MeanResult()); + } + + //TODO this will be handled by the ctor later + iResultArray.Close(); + + return result; + } + + +////////////////////////////////////////////////////////////////////// +// CDmaBmFragmentation +////////////////////////////////////////////////////////////////////// + +CDmaBmFragmentation::CDmaBmFragmentation(const TDesC& aName, TInt aIterations, const TDmaTransferArgs& aTransferArgs, TUint aMaxFragmentSize) + :CDmaBenchmark(aName, aIterations, ExpectedResults, aTransferArgs, aMaxFragmentSize) + {} + +const TResultSet CDmaBmFragmentation::ExpectedResults(KErrNone, + TRequestResults(KErrNone, 0, KErrNone, KErrUnknown), + KErrUnknown, + TCallbackRecord::Empty() + ); + +void CDmaBmFragmentation::Fragment() + { + TUint64 time; + iActual.iRequestResult.iFragmentationResult = + iDmaSession.FragmentRequestOld(iRequestSessionCookie, iTransferArgs, &time); + iResultArray.Append(time); + } + +void CDmaBmFragmentation::PrintTestType() const + { + RDebug::RawPrint(_L("Fragmentation Benchmark")); + } + +void CDmaBmFragmentation::RunTest() + { + OpenDmaSession(); + + OpenChannel(); + CreateDmaRequest(); + Fragment(); + FreeRequest(); + CloseChannel(); + + CloseDmaSession(); + } + +////////////////////////////////////////////////////////////////////// +// CDmaBmTransfer +////////////////////////////////////////////////////////////////////// + +CDmaBmTransfer::CDmaBmTransfer(const TDesC& aName, TInt aIterations, const TDmaTransferArgs& aTransferArgs, TUint aMaxFragmentSize) + :CDmaBenchmark(aName, aIterations, + TResultSet(KErrNone, TRequestResults(), KErrUnknown, TCallbackRecord(TCallbackRecord::EThread,1)), + aTransferArgs, aMaxFragmentSize) + {} + + +void CDmaBmTransfer::PrintTestType() const + { + RDebug::RawPrint(_L("Transfer Benchmark")); + } + +void CDmaBmTransfer::RunTest() + { + OpenDmaSession(); + + OpenChannel(); + CreateDmaRequest(); + Fragment(); + Queue(); + FreeRequest(); + CloseChannel(); + + CloseDmaSession(); + } + +void CDmaBmTransfer::Queue() + { + if(iActual.iRequestResult.iFragmentationResult == KErrNone) + { + TUint64 time; + iActual.iRequestResult.iQueueResult = iDmaSession.QueueRequest(iRequestSessionCookie, &iActual.iCallbackRecord, &time); + iResultArray.Append(time); + } + } + + +////////////////////////////////////////////////////////////////////// +// CMultiTransferTest +////////////////////////////////////////////////////////////////////// + +//TODO +// Add pre and post transfer for CMultiTransferTest +CMultiTransferTest::CMultiTransferTest(const TDesC& aName, TInt aIterations, const TDmaTransferArgs* aTransferArgs, + const TResultSet* aResultSets, TInt aCount) + : CDmaTest(aName, aIterations, NULL, NULL), iTransferArgs(aTransferArgs), iTransferArgsCount(aCount), iNewDmaApi(ETrue), + iChannelSessionCookie(0), iExpectedArray(aResultSets), iPauseWhileQueuing(EFalse) + {} + +CMultiTransferTest::CMultiTransferTest(const CMultiTransferTest& aOther) + : CDmaTest(aOther), iTransferArgs(aOther.iTransferArgs), iTransferArgsCount(aOther.iTransferArgsCount), + iNewDmaApi(aOther.iNewDmaApi), + iExpectedArray(aOther.iExpectedArray), iPauseWhileQueuing(aOther.iPauseWhileQueuing) + //const cast is required because their isn't a ctor taking const + //array values + //TODO iRequestCookies(const_cast(&aOther.iRequestCookies[0]), aOther.iRequestCookies.Count()) + { + } + +CMultiTransferTest::~CMultiTransferTest() + { + iRequestCookies.Close(); + iActualResults.Close(); + } + +TBool CMultiTransferTest::Result() + { + if(gVerboseOutput) + { + RDebug::Printf("Results for %d transfers:", iTransferArgsCount); + } + + TBool result = EFalse; + for(TInt i=0; i requestStates; + + TEST_ASSERT(iActualResults.Count() == iTransferArgsCount); + for(i=0; iSetup(*this); //initialize test + } + +TInt CMultiTransferTest::DoPostTransferCheck() + { + if(iPostTransferCheck) + return iPostTransferCheck->Check(*this); + else + return KErrNone; + } +////////////////////////////////////////////////////////////////////// +// CIsrRequeTest +////////////////////////////////////////////////////////////////////// + + +CIsrRequeTest::CIsrRequeTest(const TDesC& aName, TInt aIterations, const TDmaTransferArgs& aArgs, + TIsrRequeArgs* aRequeueArgs, TInt aCount, + const TResultSet& aExpected,const MPreTransfer* aPreTfer,const MPostTransferCheck* aPostTferChk, TUint aMaxFragmentSize) + :CSingleTransferTest(aName, aIterations, aArgs, aExpected, aMaxFragmentSize, aPostTferChk, aPreTfer), iRequeArgSet(aRequeueArgs, aCount) + {} + +void CIsrRequeTest::Queue() + { + if(iActual.iRequestResult.iFragmentationResult == KErrNone) + { + iActual.iRequestResult.iQueueResult = iDmaSession.QueueRequestWithRequeue(iRequestSessionCookie, iRequeArgSet.iRequeArgs, iRequeArgSet.iCount, &iActual.iCallbackRecord); + } + } + +void CIsrRequeTest::PrintTestType() const + { + RDebug::RawPrint(_L("ISR Requeue")); + } + +/* +//TODO will need to support buffer checking of the trasnfers +TBool CIsrRequeTest::Result() + { + return CSingleTransferTest::Result(); + } +*/ + +void CIsrRequeTest::PreTransferSetup() + { + if(iPreTransfer) + iPreTransfer->Setup(*this); //initialize test + } + +TInt CIsrRequeTest::DoPostTransferCheck() + { + return iPostTransferCheck->Check(*this); + } + +////////////////////////////////////////////////////////////////////// +// TResultSet +////////////////////////////////////////////////////////////////////// + +void TResultSet::Print() const + { + PRINT(iChannelOpenResult); + PRINT(iRequestResult.iCreate); + PRINT(iRequestResult.iFragmentCount); + PRINT(iRequestResult.iFragmentationResult); + PRINT(iRequestResult.iQueueResult); + PRINT(iPostTransferCheck); + } + +TBool TResultSet::operator == (const TResultSet& aOther) const + { + return (memcompare((TUint8*)this, sizeof(*this), (TUint8*)&aOther, sizeof(aOther)) == 0); + } + +////////////////////////////////////////////////////////////////////// +// MPostTransferCheck classes +////////////////////////////////////////////////////////////////////// + +TInt TCompareSrcDst::Check(const CSingleTransferTest& aTest) const + { + if(gVerboseOutput) + { + RDebug::Printf("Comparing CSingleTransferTest buffers"); + } + return Check(aTest.TransferArgs(), aTest.Chunk().Base()); + } + +//TODO +//this check will not deal correctly transfers were subsequent +//requeues overlap +TInt TCompareSrcDst::Check(const CIsrRequeTest& aTest) const + { + if(gVerboseOutput) + { + RDebug::Printf("Comparing CIsrRequeTest buffers"); + } + TUint8* chunkBase = aTest.Chunk().Base(); + const TDmaTransferArgs& transferArgs = aTest.TransferArgs(); + // check first transfer + TInt r = Check(transferArgs, chunkBase); + + if(r != KErrNone) + return r; + + // check re-queued transfers + const TIsrRequeArgsSet& requeueArgs = aTest.GetRequeueArgs(); + return Check(requeueArgs, chunkBase, transferArgs); + } + +TInt TCompareSrcDst::Check(const TDmaTransferArgs& aTransferArgs, TUint8* aChunkBase) const + { + //TODO could make use of Fixup() method + const TUint32 srcOffset = aTransferArgs.iSrcConfig.iAddr; + const TUint32 dstOffset = aTransferArgs.iDstConfig.iAddr; + const TInt size = aTransferArgs.iTransferCount; + + const TUint8* src = srcOffset + aChunkBase; + const TUint8* dst = dstOffset + aChunkBase; + + if(gVerboseOutput) + { + RDebug::Printf("Comparing TDmaTransferArgs buffers src=0x%08x dst=0x%08x size=0x%08x", + src, dst, size); + } + + return memcompare(src, size, dst, size); + } + +TInt TCompareSrcDst::Check(const TIsrRequeArgsSet& aRequeueArgSet, TUint8* aChunkBase, const TDmaTransferArgs& aTferArgs) const + { + TIsrRequeArgsSet argSet(aRequeueArgSet); //copy since Fixup will mutate object + + argSet.Substitute(aTferArgs); // replace any default (0) values with the values in aTferArgs + + argSet.Fixup((TLinAddr)aChunkBase); //convert address offsets to virtual user mode addresses + + TInt r = KErrCorrupt; + while(!argSet.IsEmpty()) + { + r = Check(argSet.GetArgs()); + if(r != KErrNone) + break; + } + return r; + } + +TInt TCompareSrcDst::Check(const TIsrRequeArgs& aRequeueArgs) const + { + const TUint8* src = (TUint8*)aRequeueArgs.iSrcAddr; + const TUint8* dst = (TUint8*)aRequeueArgs.iDstAddr; + const TInt size = aRequeueArgs.iTransferCount; + + if(gVerboseOutput) + { + RDebug::Printf("Comparing TIsrRequeArgs: src=0x%08x dst=0x%08x size=0x%08x", + src, dst, size); + } + + return memcompare(src, size, dst, size); + } + +TInt TCompareSrcDst::Check(CMultiTransferTest& aTest) const + { + if(gVerboseOutput) + { + RDebug::Printf("Comparing CMultiTransferTest buffers"); + } + + const TInt transferCount = aTest.TransferCount(); + TUint8* const chunkBase = aTest.Chunk().Base(); + + // check buffers for each transfer + for(TInt i=0; i(aTest)); // prepare the CSingleTransferTest parts + + TIsrRequeArgsSet requeSet(aTest.GetRequeueArgs()); + + requeSet.Substitute(aTest.TransferArgs()); + + const TLinAddr chunkBase = (TLinAddr) aTest.Chunk().Base(); + requeSet.Fixup(chunkBase); + + while(!requeSet.IsEmpty()) + { + TIsrRequeArgs args = requeSet.GetArgs(); + Setup(args); // perform the setup operation for each TIsrRequeArgs + } + } + +void TPreTransferIncrBytes::Setup(const CMultiTransferTest& aTest) const + { + if(gVerboseOutput) + { + RDebug::Printf("TPreTransferIncrBytes(CMultiTransferTest)"); + } + //TODO check for overlap + + TUint8* const chunkBase = aTest.Chunk().Base(); + const TInt transferCount = aTest.TransferCount(); + + // initialise buffers for each transfer + for(TInt i=0; i array; + array.AppendL(TAddressParms(aTest.TransferArgs())); + + TIsrRequeArgsSet requeSet(aTest.GetRequeueArgs()); + requeSet.Substitute(aTest.TransferArgs()); + + const TLinAddr chunkBase = (TLinAddr) aTest.Chunk().Base(); + requeSet.Fixup(chunkBase); + while(!requeSet.IsEmpty()) + { + const TIsrRequeArgs requeArgs = requeSet.GetArgs(); + array.AppendL(requeArgs); + } + + const TBool result = CheckBuffers(array); + + array.Close(); + return result; + } + +/** +Check that the destination of each TAddressParms does not overlap with +any previous source or destination or that if it does the whole transfer +matches. +This is so that successive transfers do not overwrite the destinations or +sources of preceeding ones. +Exactly matching transfers are allowed to test the case that a repeat +transfer is required - though it can't then be determined just from +looking at the buffers that the repeat was successful +*/ +TBool TPreTransferIncrBytes::CheckBuffers(const RArray aTransferParams) const + { + const TInt count = aTransferParams.Count(); + + for(TInt i=1; iiElementsPerFrame-1)) + { + iPtr += iCfg->iElementSkip; + iElem++; + iBytes++; + } + else + { + TEST_ASSERT(iElem == iCfg->iElementsPerFrame-1); + if(iFrame < iCfg->iFramesPerTransfer-1) + { + iPtr += iCfg->iFrameSkip; + iFrame++; + iBytes++; + iElem = 0; + } + else + { + //we have reached the end + TEST_ASSERT(iFrame == iCfg->iFramesPerTransfer-1); + iPtr = NULL; + } + } + + Invariant(); + } + +void TTransferIter::Invariant() const + { + const TInt elemSize = iCfg->iElementSize; + RTest test(_L("TTransferIter invariant")); + const TInt bytesTransfered = ( + elemSize * (iFrame * iCfg->iElementsPerFrame + iElem) + + ((TUint)iPtr % (elemSize)) + ); + test_Equal(iBytes, bytesTransfered); + test.Close(); + } + +/////////////////////////////////////////////////////////// +// TTestCase +/////////////////////////////////////////////////////////// +TTestCase::TTestCase(CDmaTest* aTest, + TBool aConcurrent, + const TDmaCapability aCap1, + const TDmaCapability aCap2, + const TDmaCapability aCap3, + const TDmaCapability aCap4, + const TDmaCapability aCap5 + ) +: + iTest(aTest), iConcurrentTest(aConcurrent) + { + iChannelCaps[0] = aCap1; + iChannelCaps[1] = aCap2; + iChannelCaps[2] = aCap3; + iChannelCaps[3] = aCap4; + iChannelCaps[4] = aCap5; + } + +TResult TTestCase::TestCaseValid(const SDmacCaps& aChannelCaps) const + { + const TDmaCapability* cap = &iChannelCaps[0]; + + TResult ret = ERun; + //We assume that the array is empty at the first ENone found + //any caps after this wil be ignored + while(cap->iCapsReq != ENone) + { + TResult t = cap->CompareToDmaCaps(aChannelCaps); + if(t > ret) //this relies on the enum ordering + ret = t; + cap++; + } + return ret; + } + +TResult TTestCase::TestCaseValid(const TDmacTestCaps& aChannelCaps) const + { + const TDmaCapability* cap = &iChannelCaps[0]; + + TResult ret = ERun; + //We assume that the array is empty at the first ENone found + //any caps after this wil be ignored + while(cap->iCapsReq != ENone) + { + TResult t = cap->CompareToDmaCaps(aChannelCaps); + if(t > ret) //this relies on the enum ordering + ret = t; + cap++; + } + return ret; + } +/** +Will report whether a value held in aChannelCaps satisfies a +requirement specfied by this object +*/ +TBool TDmaCapability::RequirementSatisfied(const SDmacCaps& aChannelCaps) const + { + switch(iCapsReq) + { + case ENone: + return ETrue; + case EChannelPriorities: + TEST_FAULT; + case EChannelPauseAndResume: + return aChannelCaps.iChannelPauseAndResume == (TBool)iValue; + case EAddrAlignedToElementSize: + TEST_FAULT; + case E1DAddressing: + return aChannelCaps.i1DIndexAddressing == (TBool)iValue; + case E2DAddressing: + return aChannelCaps.i2DIndexAddressing == (TBool)iValue; + case ESynchronizationTypes: + case EBurstTransactions: + case EDescriptorInterrupt: + case EFrameInterrupt: + case ELinkedListPausedInterrupt: + case EEndiannessConversion: + case EGraphicsOps: + case ERepeatingTransfers: + case EChannelLinking: + TEST_FAULT; + case EHwDescriptors: + return aChannelCaps.iHwDescriptors == (TBool)iValue; + case ESrcDstAsymmetry: + case EAsymHwDescriptors: + TEST_FAULT; + case EBalancedAsymSegments: + return aChannelCaps.iBalancedAsymSegments == (TBool)iValue; + case EAsymCompletionInterrupt: + return aChannelCaps.iAsymCompletionInterrupt == (TBool)iValue; + case EAsymDescriptorInterrupt: + return aChannelCaps.iAsymDescriptorInterrupt == (TBool)iValue; + case EAsymFrameInterrupt: + return aChannelCaps.iAsymFrameInterrupt == (TBool)iValue; + default: + TEST_FAULT; + } + + return EFalse; + } + +/** +Will report whether a value held in aChannelCaps satisfies a +requirement specfied by this object +*/ +TBool TDmaCapability::RequirementSatisfied(const TDmacTestCaps& aChannelCaps) const + { + switch(iCapsReq) + { + case EPilVersion: + return TestValue(aChannelCaps.iPILVersion); + default: + return RequirementSatisfied(static_cast(aChannelCaps)); + } + } + +TResult TDmaCapability::CompareToDmaCaps(const SDmacCaps& aChannelCaps) const + { + const TBool reqSatisfied = RequirementSatisfied(aChannelCaps); + if(reqSatisfied) + { + return ERun; + } + else + { + return iFail ? EFail : ESkip; + } + } + +TResult TDmaCapability::CompareToDmaCaps(const TDmacTestCaps& aChannelCaps) const + { + const TBool reqSatisfied = RequirementSatisfied(aChannelCaps); + if(reqSatisfied) + { + return ERun; + } + else + { + return iFail ? EFail : ESkip; + } + } +/** +Test that aValue satisfies the comparrison (iCapsReqType) with the +reference value held in iValue +*/ +TBool TDmaCapability::TestValue(TUint aValue) const + { + switch(iCapsReqType) + { + case EEqual: + return aValue == iValue; + case EGTE: + return aValue >= iValue; + case ELTE: + return aValue <= iValue; + case EBitsSet: + case EBitsClear: + default: + TEST_FAULT; + } + return EFalse; + } + +static RTest test(_L("DMAv2 test")); + +////////////////////////////////////////////////////////////////////// +// TTestRunner +////////////////////////////////////////////////////////////////////// +TTestRunner::TTestRunner() + { + // Open RDmaSession handle + TInt r = iDmaSession.Open(); + TEST_ASSERT(r == KErrNone); + + // Get PSI Test info + r = iDmaSession.GetTestInfo(iPslTestInfo); + TEST_ASSERT(r == KErrNone); + + //Retrieve PSL cookies + GetPslCookie(); + + //Generate the DMA channel records + GenerateChannelRecord(); + } + +TTestRunner::~TTestRunner() + { + RTest::CloseHandleAndWaitForDestruction(iDmaSession); + iTestCases.Close(); //TestRunner does not own test cases + iChannelRecords.Close(); + iPslCookies.Close(); + } + +void TTestRunner::AddTestCases(RPointerArray& aTTestCases) + { + const TInt count = aTTestCases.Count(); + for(TInt i=0; i < count; i++) + { + iTestCases.AppendL(aTTestCases[i]); + } + } + +void TTestRunner::RunTests() + { + //Print PslTestInfo + if(gVerboseOutput) + { + Print(iPslTestInfo); + } + + //iterate through the test case array + const TInt testCaseCount = iTestCases.Count(); + for(TInt i=0; i < testCaseCount; i++) + { + const TTestCase& testCase = *iTestCases[i]; + + //Here, we must create a test thread for each channel + RPointerArray concurrentTests; + + if(testCase.iConcurrentTest) + RDebug::Printf("== Begin concurrent test run =="); + + const TInt chanRecCount = iChannelRecords.Count(); + for(TInt j=0; j < chanRecCount; j++) + { + const TChannelRecord& record = iChannelRecords[j]; + const TDmacTestCaps& caps = record.iChannelCaps; + + const TResult t = testCase.TestCaseValid(caps); + + switch(t) + { + case ERun: + { + CDmaTest* dmaTest = static_cast(testCase.iTest->Clone()); + TEST_ASSERT(dmaTest != NULL); + + dmaTest->SetChannelCookie(record.iCookie); + dmaTest->Announce(); + if(testCase.iConcurrentTest) + { + //Add test to array to be run concurrently + TInt r = concurrentTests.Append(dmaTest); + TEST_ASSERT(r == KErrNone); + } + else + { + //Run test in this thread + (*dmaTest)(); + //TTestThread( + TBool result = dmaTest->Result(); + TEST_ASSERT(result); + + delete dmaTest; + } + + break; + } + case ESkip: + if(gVerboseOutput) + { + RDebug::Printf("Skipping test-case %S, PSL channel %d", &testCase.iTest->Name(), record.iCookie); + } + break; + case EFail: + if(gVerboseOutput) + { + RDebug::Printf("Failling test-case %S, PSL channel %d", &testCase.iTest->Name(), record.iCookie); + } + TEST_FAULT; + default: + TEST_FAULT; + } + //Depending on the value of iConcurrentTest the test runner will either block until the thread has completed or + //alternatively run the current test case on the next channel: + + //if the test case has been run on all channels it will then wait for all threads to complete. + } + + const TInt count = concurrentTests.Count(); + if(count>0) + { + MultipleTestRun(concurrentTests); + for(TInt i=0; i(concurrentTests[i])->Result(); + TEST_ASSERT(result); + } + RDebug::Printf("== End concurrent test run =="); + } + + concurrentTests.ResetAndDestroy(); + } + } + +void TTestRunner::GetPslCookie() + { + //Get Sb Channel cookies + for(TInt sb_channelcount=0; sb_channelcountDes(); + User::CommandLine(cmdLinePtr); + TBool tokenParsed(EFalse); + + TLex args(*cmdLine); + args.SkipSpace(); // args are separated by spaces + + // first arg is the exe name, skip it + TPtrC cmdToken = args.NextToken(); + HBufC* tc = HBufC::NewLC(KParameterTextLenMax); + *tc = cmdToken; + while (tc->Length()) + { + tokenParsed = EFalse; + + // '/?' help wanted flag '?' or /? parameter + if ((0== tc->FindF(_L("?"))) || (0==tc->FindF(_L("/?")))) + { + gHelpRequested = ETrue; + tokenParsed = ETrue; + } + + // '/SELFTEST' + if ((0== tc->FindF(KArgSelfTest)) || (0==tc->FindF(KArgSelfTest2))) + { + // Run self test + test.Printf(_L("Command Line Options:Selftest option specified.\n")); + gSelfTest = ETrue; + tokenParsed = ETrue; + } + + // '/VERBOSE' option + if ((0== tc->FindF(KArgVerboseOutput)) || (0==tc->FindF(KArgVerboseOutput2))) + { + test.Printf(_L("Command Line Options:Verbose option specified.\n")); + gVerboseOutput = ETrue; + tokenParsed = ETrue; + } + + if (!tokenParsed) + { + // warn about unparsed parameter + test.Printf(_L("Warning: '%lS'??? not parsed\n"), tc); + gHelpRequested = ETrue; + } + + // next parameter + *tc = args.NextToken(); + } + CleanupStack::PopAndDestroy(tc); + CleanupStack::PopAndDestroy(cmdLine); +} + +void RunDMATests() + { + test.Start(_L("Creating test runner\n")); + TTestRunner testRunner; + + test.Next(_L("Add global test cases to test runner\n")); + testRunner.AddTestCases(TestArray); + + test.Next(_L("call TTestRunner::RunTests()\n")); + testRunner.RunTests(); + + test.End(); + } + +TInt E32Main() + { + __UHEAP_MARK; + //__KHEAP_MARK; + test.Title(); + + gHelpRequested = EFalse; + TInt r; + + // Create the new trap-cleanup mechanism + CTrapCleanup* cleanup = CTrapCleanup::New(); + + if (cleanup == NULL) + { + return KErrNoMemory; + } + + // Process the command line parameters for batch/etc + TRAPD(err, ProcessCommandLineL()); + if (err != KErrNone) + { + User::Panic(_L("DMA test run memory failure"), KErrNoMemory); + } + + if (gHelpRequested) + { + PrintUsage(); + User::Leave(-2); // nothing to do! + } + test.Start(_L("Loading test LDD")); + //load either the new test ldd, d_dma2.ldd, + //or d_dma2_compat.ldd - an ldd linked against + //the old DMA framework + _LIT(KDma, "D_DMA2.LDD"); + r = User::LoadLogicalDevice(KDma); + const TBool dma2Loaded = ((r == KErrNone) || (r == KErrAlreadyExists)); + + _LIT(KDma2Compat, "D_DMA2_COMPAT.LDD"); + r = User::LoadLogicalDevice(KDma2Compat); + const TBool dma2CompatLoaded = ((r == KErrNone) || (r == KErrAlreadyExists)); + + if (!(dma2Loaded || dma2CompatLoaded)) + { + //TODO how can we distinguish this case from a platform where + //dma is supposed to be supported but the dma test ldd is + //missing? + test.Printf(_L("DMA not supported - test skipped\n")); + return 0; + } + else if (dma2Loaded && !dma2CompatLoaded) + { + test.Printf(_L("Loaded %S\n"), &KDma); + } + else if (!dma2Loaded && dma2CompatLoaded) + { + test.Printf(_L("Loaded %S\n"), &KDma2Compat); + } + else + { + test.Printf(_L("The ROM contains %S and %S - only one should be present\n"), &KDma, &KDma2Compat); + TEST_FAULT; + } + // Turn off evil lazy dll unloading + RLoader l; + test(l.Connect()==KErrNone); + test(l.CancelLazyDllUnload()==KErrNone); + RTest::CloseHandleAndWaitForDestruction(l); + + __KHEAP_MARK; + + if (gSelfTest) //Run self tests if specified on command line + { + SelfTests(); + } + + ApiTests(); + + RunDMATests(); + + __KHEAP_MARKEND; + + r = User::FreeLogicalDevice(KTestDmaLddName); + test_KErrNone(r); + test.End(); + test.Close(); + + delete cleanup; + + //__KHEAP_MARKEND; + __UHEAP_MARKEND; + return 0; + } diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/dmav2/t_dma2.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/dmav2/t_dma2.h Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,719 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: +* +*/ +#ifndef __T_DMA2_H__ +#define __T_DMA2_H__ + +#include "cap_reqs.h" +#include "test_thread.h" +#include "d_dma2.h" +#include + + +class TTestCase; +// Global array of test cases +extern RPointerArray TestArray; + + +extern TBool gVerboseOutput; // Verbose output control + + +const TInt KParameterTextLenMax = 80; // command-line param length + +/** +This function prints out the PSL test Information +*/ +void Print(const TDmaV2TestInfo& aInfo); + +/** +Runs all framework self tests +*/ +void SelfTests(); + +void ApiTests(); + +class CSingleTransferTest; +class CIsrRequeTest; +class CMultiTransferTest; + + +/** +An interface to a classs that sets up the buffers before a test +*/ +//TODO both pre and post transfer checks should perhaps derive from an +//abstract visitor base +class MPreTransfer + { +public: + virtual ~MPreTransfer() + {} + virtual void Setup(const CSingleTransferTest& aTest) const = 0; + virtual void Setup(const CIsrRequeTest& aTest) const = 0; + virtual void Setup(const CMultiTransferTest& aTest) const = 0; + }; + +/** +An interface for a check which takes place at the end of a DMA +transfer test to verify the transfer was as expected. +*/ +class MPostTransferCheck + { +public: + virtual ~MPostTransferCheck() + {} + virtual TInt Check(const CSingleTransferTest& aTest) const = 0; + virtual TInt Check(const CIsrRequeTest& aTest) const = 0; + virtual TInt Check(CMultiTransferTest& aTest) const = 0; + }; + +class TCompare2D : public MPostTransferCheck + { +public: + TCompare2D() + {} + + virtual TInt Check(const CSingleTransferTest& aTest) const; + virtual TInt Check(const CIsrRequeTest& aTest) const; + virtual TInt Check(CMultiTransferTest& aTest) const; + + }; + +class TAlwaysFail : public MPostTransferCheck + { +public: + virtual TInt Check(const CSingleTransferTest& /*aTest*/) const + {return KErrUnknown;} + virtual TInt Check(const CIsrRequeTest&) const + {return KErrUnknown;} + virtual TInt Check(CMultiTransferTest&) const + {return KErrUnknown;} + }; + +class TAlwaysPass : public MPostTransferCheck + { +public: + virtual TInt Check(const CSingleTransferTest& /*aTest*/) const + {return KErrNone;} + virtual TInt Check(const CIsrRequeTest&) const + {return KErrNone;} + virtual TInt Check(CMultiTransferTest&) const + {return KErrNone;} + }; + +/** +Compare that all the various source buffers of a test match +its destination buffers +*/ +class TCompareSrcDst : public MPostTransferCheck + { +public: + TCompareSrcDst() + {} + + virtual TInt Check(const CSingleTransferTest& aTest) const; + virtual TInt Check(const CIsrRequeTest& aTest) const; + virtual TInt Check(CMultiTransferTest& aTest) const; + +protected: + TInt Check(const TIsrRequeArgsSet& aRequeueArgSet, TUint8* aChunkBase, const TDmaTransferArgs& aTferArgs) const; + TInt Check(const TIsrRequeArgs& aRequeueArgs) const; + TInt Check(const TDmaTransferArgs& aTransferArgs, TUint8* aChunkBase) const; + }; + +/** +Base class for all DMA tests +*/ +class CDmaTest : public CTest + { +public: + CDmaTest(const TDesC& aName, TInt aIterations, const MPreTransfer* aPreTransfer, const MPostTransferCheck* aPostTransfer) + : CTest(aName, aIterations), iPreTransfer(aPreTransfer), iPostTransferCheck(aPostTransfer) + {} + + void OpenDmaSession(); + void CloseDmaSession(); + + virtual void PrintTestInfo() const; + virtual TBool Result() = 0; + + const RChunk& Chunk() const + {return iChunk;} + + /** + Tells the test which DMA channel it should run on + */ + void SetChannelCookie(TUint32 aCookie) + {iChannelCookie = aCookie;} + + virtual void PreTransferSetup() =0; + virtual TInt DoPostTransferCheck() =0; +protected: + RDmaSession iDmaSession; + RChunk iChunk; + + /** + Identifies the channel to open (as understood by a DMA PSL) + */ + TUint iChannelCookie; + const MPreTransfer* iPreTransfer; + + const MPostTransferCheck* iPostTransferCheck; //!< Some check to be run after the transfer + }; + +/** +Holds return codes for the various functions which must be called +to create, fragment, and queue a DMA request +*/ +struct TRequestResults + { + TRequestResults + ( + TInt aCreate = KErrNone, + TInt aFragmentCount = 0, + TInt aFragmentationResult = KErrNone, + TInt aQueueResult = KErrNone + ) + :iCreate(aCreate), iFragmentCount(aFragmentCount), iFragmentationResult(aFragmentationResult), iQueueResult(aQueueResult) + {} + + /** + Constructs with error results + */ + TRequestResults(TFalse) + :iCreate(KErrUnknown), iFragmentCount(0), iFragmentationResult(KErrUnknown), iQueueResult(KErrUnknown) + {} + + inline TRequestResults& CreationResult(TInt aErrorCode) {iCreate = aErrorCode; return *this;} + inline TRequestResults& FragmentCount(TInt aCount) {iFragmentCount = aCount; return *this;} + inline TRequestResults& FragmentationResult(TInt aErrorCode) {iFragmentationResult = aErrorCode; return *this;} + inline TRequestResults& QueueResult(TInt aErrorCode) {iQueueResult = aErrorCode; return *this;} + + TInt iCreate; + TInt iFragmentCount; //!< 0 means any result permitted + TInt iFragmentationResult; + TInt iQueueResult; + }; + +/** +Holds all the results for a DMA CSingleTransferTest +*/ +struct TResultSet + { + /** + No errors expected + */ + TResultSet(TInt aChannelOpenResult = KErrNone, + const TRequestResults aRequestResults = TRequestResults(), + TInt aPostTransferCheck = KErrNone, + const TCallbackRecord aCallbackRecord = TCallbackRecord(TCallbackRecord::EThread,1) + ) + : + iChannelOpenResult(aChannelOpenResult), + iRequestResult(aRequestResults), + iPostTransferCheck(aPostTransferCheck), + iCallbackRecord(aCallbackRecord) + {} + + explicit TResultSet(const TCallbackRecord& aRecord) + :iChannelOpenResult(KErrNone), + iRequestResult(), + iPostTransferCheck(KErrNone), + iCallbackRecord(aRecord) + {} + + /** + Errors expected + */ + TResultSet(TFalse) + :iChannelOpenResult(KErrUnknown), + iRequestResult(EFalse), + iPostTransferCheck(KErrUnknown), + iCallbackRecord(TCallbackRecord::Empty()) + {} + + void Print() const; + TBool operator == (const TResultSet& aOther) const; + + /** Set channel opening result */ + TResultSet& ChannelOpenResult(TInt aResult) {iChannelOpenResult = aResult; return *this;} + TResultSet& PostTransferResult(TInt aResult) {iPostTransferCheck = aResult; return *this;} + /** Set request results */ + TResultSet& RequestResult(const TRequestResults& aResults) {iRequestResult = aResults; return *this;} + /** Set Callback record */ + TResultSet& CallbackRecord(const TCallbackRecord& aCallbackRecord) {iCallbackRecord = aCallbackRecord; return *this;} + + TInt iChannelOpenResult; + TRequestResults iRequestResult; + TInt iPostTransferCheck; + TCallbackRecord iCallbackRecord; + }; + +/** +Fills each source buffer with an increasing value and clears each destination +*/ +class TPreTransferIncrBytes : public MPreTransfer + { +public: + TPreTransferIncrBytes() + {} + + virtual void Setup(const CSingleTransferTest& aTest) const; + virtual void Setup(const CIsrRequeTest& aTest) const; + virtual void Setup(const CMultiTransferTest& aTest) const; +protected: + virtual void Setup(const TAddressParms& aParams) const; + TBool CheckBuffers(const CIsrRequeTest& aTest) const; + TBool CheckBuffers(const RArray aTransferParams) const; + }; + +const TPreTransferIncrBytes KPreTransferIncrBytes; +const TCompareSrcDst KCompareSrcDst; +const TCompare2D KCompare2D; + + +/** +Iterates over the bytes in buffer, in the order +the supllied DMA config would access them +*/ +class TTransferIter + { +public: + TTransferIter() + :iCfg(NULL), iPtr(NULL) + {} + + TTransferIter(const TDmaTransferConfig& aCfg, TUint8* aChunkBase=NULL) + :iElem(0), iFrame(0), iCfg(&aCfg), iChunkBase(aChunkBase), iPtr(Start()), iBytes(0) + {} + + void operator++ (); + TUint8& operator* () + { + Invariant(); + return *iPtr; + } + + TBool operator!= (const TTransferIter& aOther) + { + return (iPtr != aOther.iPtr); + } + + static void SelfTest(); +private: + TUint8* Start() const + { + return iChunkBase + iCfg->iAddr; + } + + void Invariant() const; + + TUint iElem; //!< The current element + TUint iFrame; //!< The current frame + + const TDmaTransferConfig* const iCfg; + TUint8* iChunkBase; + + TUint8* iPtr; // iResultArray; + + }; + +/** +Fragments requests (only) and records duration +TODO make sure we are using old style DDmaRequest +*/ +class CDmaBmFragmentation : public CDmaBenchmark + { +public: + CDmaBmFragmentation(const TDesC& aName, TInt aIterations, const TDmaTransferArgs& aTransferArgs, TUint aMaxFragmentSize); + virtual CTest* Clone() const {return new CDmaBmFragmentation(*this);} + virtual TInt DoPostTransferCheck() + {TEST_FAULT; return KErrNotSupported;} + + virtual void RunTest(); + virtual void PrintTestType() const; + +protected: + void Fragment(); + static const TResultSet ExpectedResults; + }; + +/** +Performs a transfer using an old style DDmaRequest and +records the duration +*/ +class CDmaBmTransfer : public CDmaBenchmark + { +public: + CDmaBmTransfer(const TDesC& aName, TInt aIterations, const TDmaTransferArgs& aTransferArgs, TUint aMaxFragmentSize); + virtual CTest* Clone() const {return new CDmaBmTransfer(*this);} + virtual TInt DoPostTransferCheck() + {TEST_FAULT; return KErrNotSupported;} + + virtual void RunTest(); + virtual void PrintTestType() const; + + inline CDmaBmTransfer& UseNewDmaApi(TBool aFlag) {CSingleTransferTest::UseNewDmaApi(aFlag); return *this;} + inline CDmaBmTransfer& ExpectedResults(const TResultSet& aArgs) {iExpected=aArgs; return *this;} +protected: + void Queue(); + }; + + + +/** +Will create and queue multiple requests + +Unlike CSingleTransferTest the class does not permit the use of TResultSet to +define expected results (for neagative testing) +*/ +class CMultiTransferTest : public CDmaTest + { +public: + CMultiTransferTest(const TDesC& aName, TInt aIterations, const TDmaTransferArgs* aTransferArgs, const TResultSet* aResultSets, TInt aCount); + CMultiTransferTest(const CMultiTransferTest& aOther); + virtual ~CMultiTransferTest(); + virtual CTest* Clone() const {return new CMultiTransferTest(*this);} + + virtual TBool Result(); + virtual void RunTest(); + virtual void PrintTestType() const; + + inline CMultiTransferTest& PauseWhileQueuing() {iPauseWhileQueuing = ETrue; return *this;} + inline CMultiTransferTest& SetPreTransferTest(const MPreTransfer* aPreTfer) {iPreTransfer = aPreTfer; return *this;} + inline CMultiTransferTest& SetPostTransferTest(const MPostTransferCheck* aPostTfer) {iPostTransferCheck = aPostTfer; return *this;} + + const TDmaTransferArgs& TransferArgs(TInt aIndex) const; + inline TInt TransferCount() const {return iTransferArgsCount;} + + void SetPostTransferResult(TInt aIndex, TInt aErrorCode); +protected: + void OpenChannel(); + TInt CloseChannel(); + void CreateDmaRequests(); + void Fragment(); + void QueueRequests(); + + virtual void PreTransferSetup(); + virtual TInt DoPostTransferCheck(); + + TBool Result(TInt aTransfer); + + const TDmaTransferArgs* const iTransferArgs; //pointer to an array of transfer args + const TInt iTransferArgsCount; + + + TBool iNewDmaApi; //!< If true then CMultiTransferTest will use new style API + + /** + A handle to kernel side TDmaChannel object received after a channel is opened. + */ + TUint iChannelSessionCookie; + RArray iRequestCookies; + + const TResultSet* const iExpectedArray; // array will be of length iTransferArgsCount + RArray iActualResults; + + /** + If set, the test will pause the channel before queuing requests, and + resume once they are all queued + */ + TBool iPauseWhileQueuing; + }; + +/** +Used for testing TDmaChannel::IsrRedoRequest + +Extends CSingle transfer by adding the capability to queue with +additonal transfer parameters (TIsrRequeArgs) which are passed +to IsrRedoRequest in ISR callback +*/ +class CIsrRequeTest : public CSingleTransferTest + { +public: + CIsrRequeTest(const TDesC& aName, TInt aIterations, const TDmaTransferArgs& aArgs, + TIsrRequeArgs* aRequeueArgs, TInt aCount, + const TResultSet& aExpected, const MPreTransfer* aPreTfer, + const MPostTransferCheck* aPostTferChk, TUint aMaxFragmentSize=0); + + virtual void PrintTestType() const; + + virtual void Queue(); + + /** + Compares the actual vs the exepected results and reports + of the test passed + @return ETrue for a pass, EFalse for a fail + */ + //virtual TBool Result(); + + + virtual CTest* Clone() const {return new CIsrRequeTest(*this);} + + const TIsrRequeArgsSet& GetRequeueArgs() const + {return iRequeArgSet;} + + +protected: + virtual TInt DoPostTransferCheck(); + virtual void PreTransferSetup(); + + TIsrRequeArgsSet iRequeArgSet; + }; + +/** +A channel record collects DMA channel capabilities and other PSL information +before running tests. +*/ +class TChannelRecord + { +public: + TChannelRecord(){} + ~TChannelRecord(){} + + /** + DMA Channel Cookie + */ + TUint iCookie; + + /** + DMA Channel Capabilities + */ + TDmacTestCaps iChannelCaps; + }; + +/** +A test case collects together a DMA test (CDmaTest), its hardware prerequisites, +and other information about how the test should be run. +*/ +class TTestCase + { +public: + //TODO it might be better to group sets of TDmaCapability + //into their own class eg. TDmaCapSet. + TTestCase(CDmaTest* aTest, + TBool aConcurrent = EFalse, + const TDmaCapability = TDmaCapability(), + const TDmaCapability = TDmaCapability(), + const TDmaCapability = TDmaCapability(), + const TDmaCapability = TDmaCapability(), + const TDmaCapability = TDmaCapability() + ); + + static void SelfTest(); + + /** + Compares the requirements held in the class + against those described in aChannelCaps and makes a decision + as to whether this test case should be run, skipped, or failed. + */ + TResult TestCaseValid(const SDmacCaps& aChannelCaps) const; + TResult TestCaseValid(const TDmacTestCaps& aChannelCaps) const; + + enum {KMaxChannelCaps=5}; + TDmaCapability iChannelCaps[KMaxChannelCaps]; + TUint iChannelType; + TInt iTimeout; + CDmaTest* iTest; + TBool iConcurrentTest; + TBool iDmaV2Only; //!< If true then this test cannot be run on DMA v1 framework + }; + +/** +A TestRunner manages the whole testing process.Before running any test cases it will open its own RDmaSession +handle, not associated with a DMA channel, so that it can recover the TDmaTestInfo object (as used by the +existing DMA framework) which says what channels are available to be tested.It will use TTestThread objects +to run tests in new threads.TTestThread contains a number of useful features such as waiting for thread exit +and accepting a TFunctor object to be run in a new thread. +*/ +class TTestRunner +{ +public: + TTestRunner(); + ~TTestRunner(); + + /** + This function will populate TTestRunner with an array of test cases which + would be a collection of DMA test,its hardware prerequisites,and other + information about how the test + + @aTTestCases on return, this contains an the DMA test cases + */ + void AddTestCases(RPointerArray& aTTestCases); + + /** + This will iterate over all test cases held by the test runner and + for each one will judge which DMA channels it can be run on, running + the test if possible. + */ + void RunTests(); + +private: + /** + This functions retrieves the PSL cookies from all the DMA channels + and stores them in a single array. It will use information from + the PslTestInfo. + */ + void GetPslCookie(); + + /** + This function will generate the DMA channel records.i.e channel cookies,Caps. + */ + void GenerateChannelRecord(); + + /** + Holds the PslTestInfo + */ + TDmaV2TestInfo iPslTestInfo; + + /** + A handle to RDmaSession + */ + RDmaSession iDmaSession; + + /** + Array of DMA test cases + */ + RPointerArray iTestCases; + + /** + Array of DMA channel records,channel capabilities and other PSL information + */ + RArray iChannelRecords; + + /** + Array of DMA channel cookies + */ + RArray iPslCookies; +}; + + +#endif // #ifndef __T_DMA2_H__ diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/dmav2/test_cases.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/dmav2/test_cases.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,1352 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: +* This file contains statically defined test cases, a pointer to each +* new test case should be entered in StaticTestArray +* +*/ + +#include "t_dma2.h" +#include "cap_reqs.h" + +const TCallbackRecord threadCallback(TCallbackRecord::EThread,1); +const TCallbackRecord isrCallback(TCallbackRecord::EIsr,1); + +const TInt size = 128 * KKilo; +//-------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2560 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc Simple DMA transfer test using CSingleTransferTest and New DMA APIs +//! +//! @SYMTestActions +//! 1. +//! 2. +//! +//! +//! @SYMTestExpectedResults +//! 1. +//! 2. +//! +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace Simple_1 + { + TDmaTransferArgs transferArgs(0, size, size, KDmaMemAddr); + + const TResultSet expectedResults(threadCallback); + + CSingleTransferTest simpleTest(_L("Simple Test - New DMA APIs"), 1, transferArgs, expectedResults); + + TTestCase testCase(&simpleTest, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&simpleTest, ETrue, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2561 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc Simple DMA transfer test using CSingleTransferTest and OLD DMA APIs +//! +//! @SYMTestActions +//! 1. +//! 2. +//! +//! +//! @SYMTestExpectedResults +//! 1. +//! 2. +//! +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace Simple_2 + { + TDmaTransferArgs transferArgs(0, size, size, KDmaMemAddr); + + const TResultSet expectedResults(threadCallback); + + CSingleTransferTest simpleTest = CSingleTransferTest(_L("Simple Test - Old DMA APIs"), 1, transferArgs, expectedResults, 0). + UseNewDmaApi(EFalse); + + TTestCase testCase(&simpleTest, EFalse); + TTestCase testCaseConcurrent(&simpleTest, ETrue); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2573 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc DMA ISR Callback test (Isr Callback - use old request Ctor) +//! +//! @SYMTestActions +//! 1. +//! 2. +//! +//! +//! @SYMTestExpectedResults +//! 1. +//! 2. +//! +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace Callback + { + TDmaTransferArgs transferArgs(0, size, size, KDmaMemAddr, KDmaSyncAuto, KDmaRequestCallbackFromIsr); + + const TResultSet expectedResults(isrCallback); + + CSingleTransferTest isrTest(_L("Isr Callback"), 1, transferArgs, expectedResults); + TTestCase testCase(&isrTest, EFalse, capAboveV1); + + + const TRequestResults fragmentFails = TRequestResults(). + FragmentationResult(KErrArgument). + QueueResult(KErrUnknown); + + const TResultSet expectedResultsFail = TResultSet(EFalse). + ChannelOpenResult(KErrNone). + RequestResult(fragmentFails). + PostTransferResult(1); // PostTransferResult of 1 means buffers don't match + + CSingleTransferTest isrTestOldRequest = CSingleTransferTest(_L("Isr Callback - use old request Ctor"), 1, transferArgs, expectedResultsFail) + .UseNewRequest(EFalse); + TTestCase testCaseOldRequest(&isrTestOldRequest, EFalse, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2574,KBASE-DMA-2575 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc DMA ISR Reque test +//! +//! @SYMTestActions +//! 1. +//! 2. +//! +//! +//! @SYMTestExpectedResults +//! 1. +//! 2. +//! +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace ISR_Reque + { + const TInt size = 4 * KKilo; + TDmaTransferArgs tferArgs(0, 2*size, size, KDmaMemAddr, KDmaSyncAuto, KDmaRequestCallbackFromIsr); + + const TRequestResults requestResult(KErrNone, 1); // request must be in a single fragment + + namespace endOnIsrCb + { + TIsrRequeArgs requeArgs[] = { + TIsrRequeArgs(), + TIsrRequeArgs(size,3*size,size,0, ETrue), + TIsrRequeArgs(size,4*size,size,0, ETrue), + TIsrRequeArgs(0,5*size,size,0, ETrue), + }; + const TInt count = ARRAY_LENGTH(requeArgs); + + // we expect a cb for each requeue + 1 for the original + // transfer + const TCallbackRecord callbackRecord = TCallbackRecord(TCallbackRecord::EIsr, count + 1).IsrRedoResult(KErrNone); + const TResultSet expected(KErrNone, requestResult, KErrNone, callbackRecord); + + TTestCase testCase(new (ELeave) CIsrRequeTest(_L("4 Requeues - end on isr cb"), 1, tferArgs, requeArgs, count, expected, &KPreTransferIncrBytes, &KCompareSrcDst), ETrue, capAboveV1); + } + + namespace endOnThreadCb + { + TIsrRequeArgs requeArgs[] = { + TIsrRequeArgs(), + TIsrRequeArgs(size,3*size,size,0, ETrue), + TIsrRequeArgs(size,4*size,size,0, ETrue), + TIsrRequeArgs(0,5*size,size,0, EFalse), + }; + const TInt count = ARRAY_LENGTH(requeArgs); + + const TCallbackRecord callbackRecord = TCallbackRecord(TCallbackRecord::EThread, count + 1).IsrRedoResult(KErrNone); + const TResultSet expected(KErrNone, requestResult, KErrNone, callbackRecord); + + TTestCase testCase(new (ELeave) CIsrRequeTest(_L("4 Requeues - end on thread cb"), 1, tferArgs, requeArgs, count, expected, &KPreTransferIncrBytes, &KCompareSrcDst), ETrue, capAboveV1); + } + + namespace changeSize + { + TIsrRequeArgs requeArgs[] = { + TIsrRequeArgs(3*size,5*size,2*size,0, EFalse), + }; + const TInt count = ARRAY_LENGTH(requeArgs); + + const TCallbackRecord callbackRecord = TCallbackRecord(TCallbackRecord::EThread, count + 1).IsrRedoResult(KErrNone); + const TResultSet expected(KErrNone, requestResult, KErrNone, callbackRecord); + + TTestCase testCase(new (ELeave) CIsrRequeTest(_L("1 Requeues - change transfer size"), 1, tferArgs, requeArgs, count, expected, &KPreTransferIncrBytes, &KCompareSrcDst), ETrue, capAboveV1); + } + + namespace endOnRedo + { + // TODO have made this bigger than 4k so that we don't miss the second interrupt when tracing enabled + // this indicates the PSL's interrupt handler misses an interrupt if it occurs during the interrupt. + const TInt size = 0x10000; + TDmaTransferArgs tferArgs(0, 2*size, size, KDmaMemAddr, KDmaSyncAuto, KDmaRequestCallbackFromIsr); + + TIsrRequeArgs requeArgs[] = { + TIsrRequeArgs(3*size,5*size,2*size,0, ETrue), + TIsrRequeArgs() //repeat the previous transfer + }; + const TInt count = ARRAY_LENGTH(requeArgs); + + const TCallbackRecord callbackRecord = TCallbackRecord(TCallbackRecord::EIsr, count + 1).IsrRedoResult(KErrNone); + const TResultSet expected(KErrNone, requestResult, KErrNone, callbackRecord); + + TTestCase testCase(new (ELeave) CIsrRequeTest(_L("2 Requeues - Isr redo request repeated"), 1, tferArgs, requeArgs, count, expected, &KPreTransferIncrBytes, &KCompareSrcDst), EFalse, capAboveV1); + } + + namespace invalidAddresses + { + TIsrRequeArgs requeArgs[] = { + TIsrRequeArgs(size, size) + }; + const TInt count = ARRAY_LENGTH(requeArgs); + + const TCallbackRecord callbackRecord = TCallbackRecord(TCallbackRecord::EIsr, 1).IsrRedoResult(KErrArgument); + const TResultSet expected(KErrNone, requestResult, KErrUnknown, callbackRecord); + + // pre and post test would fail because of bad requeue parameters + TTestCase testCase(new (ELeave) CIsrRequeTest(_L("Requeue with matching addresses"), 1, tferArgs, requeArgs, count, expected, NULL, NULL), ETrue, capAboveV1); + } + + namespace multipleFragments + { + TIsrRequeArgs requeArgs[] = { + TIsrRequeArgs() + }; + const TInt count = ARRAY_LENGTH(requeArgs); + + const TCallbackRecord callbackRecord = TCallbackRecord(TCallbackRecord::EThread, count + 1).IsrRedoResult(KErrNone); + + TRequestResults results2Fragments = TRequestResults(requestResult).FragmentCount(2); + const TResultSet expected(KErrNone, results2Fragments, KErrNone, callbackRecord); + + TTestCase testCase(new (ELeave) CIsrRequeTest(_L("Attempt to Requeue 2 fragment request"), 1, tferArgs, requeArgs, count, expected, &KPreTransferIncrBytes, &KCompareSrcDst, size/2), ETrue, capAboveV1); + + } + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID PBASE-DMA-FUNC-xxx +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc DMA Multiple transfer test +//! @SYMTestActions +//! 1. +//! 2. +//! +//! +//! @SYMTestExpectedResults +//! 1. +//! 2. +//! +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace Multipart + { + // need long transfer, to try and force adjacent + // requests to be concatinated + const TInt size = 2 * KMega; + const TDmaTransferArgs transferArgArray[] = { + TDmaTransferArgs(0, size, size, KDmaMemAddr), + TDmaTransferArgs(size, 2 * size, size, KDmaMemAddr) + }; + + const TResultSet expected[] = + { + TResultSet(), + TResultSet() + }; + const TResultSet expectedResults(isrCallback); + + CMultiTransferTest multipart = + CMultiTransferTest(_L("Sg request concatination"), 1, transferArgArray, expected, ARRAY_LENGTH(transferArgArray)) + .SetPreTransferTest(&KPreTransferIncrBytes) + .SetPostTransferTest(&KCompareSrcDst); + + TTestCase testCase(&multipart, EFalse, hwDesWanted_skip); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2580 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc These tests attempt to queue ISR cb requests while the queue is not +//! empty and queing normal requests when an ISR cb is pending +//! @SYMTestActions +//! 1. +//! 2. +//! +//! +//! @SYMTestExpectedResults +//! 1. +//! 2. +//! +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace IsrAndDfc + { + // need long transfer, so that 1st request is still queued + // when the second one is queued + // TODO pause is the better way to ensure this + //const TInt size = 2 * KMega; + //TODO have changed size to ensure that the first isr callback request in IsrBeforeDfc + //will only have one fragment + const TInt size = 0x40000; + TDmaTransferArgs dfcTransfer(0, size, size, KDmaMemAddr); + TDmaTransferArgs isrTransfer(size, 2 * size, size, KDmaMemAddr, KDmaSyncAuto, KDmaRequestCallbackFromIsr); + + const TResultSet success = TResultSet(); + TResultSet queueFailure = TResultSet(). + RequestResult(TRequestResults().QueueResult(KErrGeneral)). + CallbackRecord(TCallbackRecord::Empty()). + PostTransferResult(1); + + namespace DfcBeforeIsr + { + const TDmaTransferArgs transferArgArray[] = { + dfcTransfer, + isrTransfer + }; + + const TResultSet expected[] = + { + success, + queueFailure + }; + CMultiTransferTest dfcBeforeIsr = + CMultiTransferTest(_L("DFC cb req before ISR cb req "), 1, transferArgArray, expected, ARRAY_LENGTH(transferArgArray)) + .SetPreTransferTest(&KPreTransferIncrBytes) + .SetPostTransferTest(&KCompareSrcDst); + TTestCase testCase(&dfcBeforeIsr, EFalse, hwDesWanted_skip); + } + + namespace IsrBeforeDfc + { + const TDmaTransferArgs transferArgArray[] = { + isrTransfer, + dfcTransfer + }; + + TResultSet isrSuccess = TResultSet(success).CallbackRecord(isrCallback); + const TResultSet expected[] = + { + isrSuccess, + queueFailure + }; + CMultiTransferTest dfcBeforeIsr = + CMultiTransferTest(_L("ISR cb req before DFC cb req "), 1, transferArgArray, expected, ARRAY_LENGTH(transferArgArray)) + .SetPreTransferTest(&KPreTransferIncrBytes) + .SetPostTransferTest(&KCompareSrcDst); + TTestCase testCase(&dfcBeforeIsr, EFalse, hwDesWanted_skip); + } + + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID PBASE-DMA-FUNC-xxx +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc DMA 2D transfer test +//! +//! @SYMTestActions +//! 1. +//! 2. +//! +//! +//! @SYMTestExpectedResults +//! 1. +//! 2. +//! +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace _2D_Test + { + // Image @ 0x0 with 640x480 pixels and 24 bits/pixel. + + TDmaTransferConfig src( + 0, /*iAddr*/ + 3, /*iElementSize*/ + 6, /*iElementsPerFrame*/ + 4, /*iFramesPerTransfer*/ + 0, /*iElementSkip*/ + 0, /*iFrameSkip*/ + KDmaMemAddr /*iFlags*/ + ); + + TDmaTransferConfig dst( + 0x708000, /*iAddr*/ + 3, /*iElementSize*/ + 640, /*iElementsPerFrame*/ + 480, /*iFramesPerTransfer*/ + 1437, /*iElementSkip*/ + -920166, /*iFrameSkip*/ + KDmaMemAddr /*iFlags*/ + ); + + TDmaTransferArgs transferArgs2D(src, dst); + + TResultSet expectedResults; //all KErrNone + + //source buffer is currently filled with increasing values + //instead of an image, but the test is still valid + CSingleTransferTest transfer2d(_L("2D Transfer"), 1, transferArgs2D, expectedResults, 0, &KCompare2D); + + TTestCase testCase2d(&transfer2d, EFalse, cap_2DRequired, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2565 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc DMA Fragmentation count test +//! +//! @SYMTestActions +//! 1. +//! 2. +//! +//! +//! @SYMTestExpectedResults +//! 1. +//! 2. +//! +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace FragmentationCount + { + TDmaTransferArgs transferArgs(0, size, size, KDmaMemAddr); + + const TRequestResults requestResult(KErrNone, 128); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + CSingleTransferTest test1(_L("Fragmentation Count - 128 fragments"), 1, transferArgs, expectedResults, KKilo); + TTestCase testCase(&test1, EFalse); + + const TRequestResults requestResult2(KErrNone, 4); + const TResultSet expectedResults2(KErrNone, requestResult2, KErrNone, threadCallback); + CSingleTransferTest test2(_L("Fragmentation Count - 4 fragments"), 1, transferArgs, expectedResults2, 32*KKilo); + TTestCase testCase2(&test2, EFalse); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2584,KBASE-DMA-2585 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc DMA Benchmark tests +//! +//! @SYMTestActions +//! 1. +//! 2. +//! +//! +//! @SYMTestExpectedResults +//! 1. +//! 2. +//! +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//----------------------------------------------------------------------------------------------- +namespace Benchmark + { + const TInt bmIters = 10; + namespace Frag + { + const TInt size = 1 * KMega; + TDmaTransferArgs transferArgs(0, size, size, KDmaMemAddr); + + TTestCase testCase_256k(new (ELeave) CDmaBmFragmentation(_L("1 Mb transfer - 256k frag size"), bmIters, transferArgs, 256 * KKilo), EFalse); + TTestCase testCase_8k(new (ELeave) CDmaBmFragmentation(_L("1 Mb transfer - 8k frag size"), bmIters, transferArgs, 8 * KKilo), EFalse); + } + + namespace Transfer + { + namespace _4Bytes + { + const TInt size = 4; + TDmaTransferArgs transferArgs(0, size, size, KDmaMemAddr); + + CDmaBmTransfer bmTest(_L("4 bytes"), bmIters, transferArgs, 0); + TTestCase testCase(&bmTest, EFalse); + } + namespace _128K + { + const TInt size = 128 * KKilo; + TDmaTransferArgs transferArgs(0, size, size, KDmaMemAddr); + + TTestCase testCase_128(new (ELeave) CDmaBmTransfer(_L("128 K - 128K frag size"), bmIters, transferArgs, 128 * KKilo), EFalse); + TTestCase testCase_16(new (ELeave) CDmaBmTransfer(_L("128 K - 16k frag size"), bmIters, transferArgs, 16 * KKilo), EFalse); + TTestCase testCase_4(new (ELeave) CDmaBmTransfer(_L("128 K - 4k frag size"), bmIters, transferArgs, 4 * KKilo), EFalse); + TTestCase testCase_1(new (ELeave) CDmaBmTransfer(_L("128 K - 1k frag size"), bmIters, transferArgs, 1 * KKilo), EFalse); + } + namespace _4Mb + { + const TInt size = 4 * KMega; + TDmaTransferArgs transferArgs(0, size, size, KDmaMemAddr); + + CDmaBmTransfer bmTest(_L("4 Mb"), bmIters, transferArgs, 0); + TTestCase testCase(&bmTest, EFalse); + } + } + + /** + Compare time taken between queing and callback of 4 byte + request with both DFC and ISR callback + The new API calls are used + */ + namespace CompareIsrDfcCb + { + const TInt iterations = 50; + + namespace Dfc + { + TResultSet expected = TResultSet(threadCallback). + PostTransferResult(KErrUnknown); + + namespace _4Bytes + { + const TInt size = 4; + TDmaTransferArgs transferArgs(0, size, size, KDmaMemAddr); + CDmaBmTransfer bmTest = CDmaBmTransfer(_L("4 bytes DFC cb"), iterations, transferArgs, 0). + UseNewDmaApi(ETrue). + ExpectedResults(expected); + TTestCase testCase(&bmTest, EFalse); + } + namespace _4K + { + const TInt size = 4 * KKilo; + TDmaTransferArgs transferArgs(0, size, size, KDmaMemAddr); + CDmaBmTransfer bmTest = CDmaBmTransfer(_L("4K DFC cb"), iterations, transferArgs, 0). + UseNewDmaApi(ETrue). + ExpectedResults(expected); + TTestCase testCase(&bmTest, EFalse); + } + } + + namespace Isr + { + TResultSet expected = TResultSet(isrCallback). + PostTransferResult(KErrUnknown); + + namespace _4Bytes + { + const TInt size = 4; + TDmaTransferArgs transferArgs(0, size, size, KDmaMemAddr, KDmaSyncAuto, KDmaRequestCallbackFromIsr); + CDmaBmTransfer bmTest = CDmaBmTransfer(_L("4 bytes Isr cb"), iterations, transferArgs, 0). + UseNewDmaApi(ETrue). + ExpectedResults(expected); + TTestCase testCase(&bmTest, EFalse); + } + namespace _4K + { + const TInt size = 4 * KKilo; + TDmaTransferArgs transferArgs(0, size, size, KDmaMemAddr, KDmaSyncAuto, KDmaRequestCallbackFromIsr); + CDmaBmTransfer bmTest = CDmaBmTransfer(_L("4K Isr cb"), iterations, transferArgs, 0). + UseNewDmaApi(ETrue). + ExpectedResults(expected); + TTestCase testCase(&bmTest, EFalse); + } + } + } + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2560 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestNewStyleFragment using CSingleTransferTest +//! Test Scenario 1 - DstAddr > SrcAddr & TransferSize=32K & Location is +//! address of a memory buffer +//! @SYMTestActions +//! 1. Set up the arguments for aTransfeArgs using the settings below. +//! +//! SrcAddr = 4 * KKilo; +//! desAddr = 64 * KKilo; +//! transferSize = 32 * KKilo; +//! iFlags = KDmaMemAddr; +//! +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! @SYMTestExpectedResults +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. Fragment request completes and KErrNone returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace TestNewStyleFragment_1 + { + const TInt srcAddr = 4 * KKilo; + const TInt desAddr = 64 * KKilo; + + const TInt transferSize = 32 * KKilo; + + TDmaTransferArgs transferArgs( srcAddr, desAddr, transferSize, KDmaMemAddr); + + const TRequestResults requestResult(KErrNone, 32); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_1(_L("TestNewStyleFragment - Test Scenario 1"), 1, transferArgs, expectedResults,KKilo); + + TTestCase testCase(&testscenario_1, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_1, ETrue, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2560 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestNewStyleFragment using CSingleTransferTest +//! Test Scenario 2 - SrcAddr == DstAddr +//! +//! 1. Set up the arguments for aTransfeArgs using the settings below. +//! +//! SrcAddr = 4 * KKilo; +//! desAddr = 4 * KKilo; +//! transferSize = 32 * KKilo; +//! iFlags = KDmaMemAddr; +//! +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! @SYMTestExpectedResults +//! +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. Fragment passes and KErrNone returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace TestNewStyleFragment_2 + { + const TInt srcAddr = 4 * KKilo; + const TInt desAddr = 4 * KKilo; + const TInt transferSize = 32 * KKilo; + + TDmaTransferArgs transferArgs(srcAddr,desAddr, transferSize, KDmaMemAddr); + const TRequestResults requestResult(KErrNone, 32); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_2(_L("TestNewStyleFragment - Test Scenario 2"), 1, transferArgs, expectedResults,KKilo); + + TTestCase testCase(&testscenario_2, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_2, ETrue, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2560 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestNewStyleFragment using CSingleTransferTest +//! Test Scenario 3 - TransferSize=0 +//! +//! 1. Set up the arguments for aTransfeArgs using the settings below. +//! +//! SrcAddr = 32 * KKilo; +//! desAddr = 64 * KKilo; +//! transferSize = 0 +//! iFlags = KDmaMemAddr; +//! +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! +//! @SYMTestExpectedResults +//! +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. Fragment request fails and KErrArgument returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace TestNewStyleFragment_3 + { + const TInt srcAddr = 32 * KKilo; + const TInt desAddr = 64 * KKilo; + const TInt transferSize = 0; + + TDmaTransferArgs transferArgs( srcAddr, desAddr, transferSize,KDmaMemAddr); + const TRequestResults requestResult(KErrArgument, 0); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_3(_L("TestNewStyleFragment - Test Scenario 3"), 1, transferArgs, expectedResults); + + TTestCase testCase(&testscenario_3, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_3, ETrue, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2560 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestNewStyleFragment using CSingleTransferTest +//! Test Scenario 4 - TransferSize=1Byte +//! +//! 1. Set up the arguments for aTransfeArgs using the settings below. +//! +//! SrcAddr = 32K; +//! desAddr = 64K; +//! transferSize = 1 byte +//! iFlags = KDmaMemAddr; +//! +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! @SYMTestExpectedResults +//! +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. Fragment request completes and KErrNone returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace TestNewStyleFragment_4 + { + const TInt srcAddr = 32 * KKilo; + const TInt desAddr = 64 * KKilo; + const TInt transferSize = 1; + + TDmaTransferArgs transferArgs(srcAddr, desAddr, transferSize, KDmaMemAddr); + const TRequestResults requestResult(KErrNone, 1); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_4(_L("TestNewStyleFragment - Test Scenario 4"), 1, transferArgs, expectedResults); + + TTestCase testCase(&testscenario_4, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_4, ETrue, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2560 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestNewStyleFragment using CSingleTransferTest +//! Test Scenario 5 - TransferSize=128KB +//! +//! 1. Set up the arguments for aTransfeArgs using the settings below. +//! +//! SrcAddr = 16K; +//! desAddr = 2MB; +//! transferSize = 1MB; +//! iFlags = KDmaMemAddr; +//! +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! @SYMTestExpectedResults +//! +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. Fragment request completes and KErrNone returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace TestNewStyleFragment_5 + { + + const TInt srcAddr = 16 * KKilo; + const TInt desAddr = 2 * KMega; + const TInt transferSize = 1 * KMega; + + TDmaTransferArgs transferArgs(srcAddr, desAddr, transferSize, KDmaMemAddr); + const TRequestResults requestResult(KErrNone); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_5(_L("TestNewStyleFragment - Test Scenario 5"), 1, transferArgs, expectedResults); + + TTestCase testCase(&testscenario_5, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_5, ETrue, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2560 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestNewStyleFragment using CSingleTransferTest +//! Test Scenario 6 - TransferSize=3MB +//! +//! 1. Set up the arguments for aTransfeArgs using the settings below. +//! +//! SrcAddr = 16K; +//! desAddr = 4MB; +//! transferSize = 3MB +//! iFlags = KDmaMemAddr; +//! +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! @SYMTestExpectedResults +//! +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. Fragment request completes and KErrNone returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace TestNewStyleFragment_6 + { + const TInt srcAddr = 16 * KKilo; + const TInt desAddr = 4 * KMega; + const TInt transferSize = 3 * KMega; + + TDmaTransferArgs transferArgs(srcAddr, desAddr, transferSize, KDmaMemAddr); + const TRequestResults requestResult(KErrNone); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_6(_L("TestNewStyleFragment - Test Scenario 6"), 1, transferArgs, expectedResults); + + TTestCase testCase(&testscenario_6, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_6, ETrue, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2561 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestOldstyleFragment using CSingleTransferTest +//! Test Scenario 1 - DstAddr > SrcAddr & TransferSize=32K & Location is +//! address of a memory buffer +//! +//! 1. Set up the arguments for aTransfeArgs using the settings below. +//! +//! SrcAddr = 4 * KKilo; +//! desAddr = 64 * KKilo; +//! transferSize = 32 * KKilo; +//! iFlags = KDmaMemAddr; + +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! @SYMTestExpectedResults +//! +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. Fragment request completes and KErrNone returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace TestOldStyleFragment_1 + { + const TInt srcAddr = 4 * KKilo; + const TInt desAddr = 64 * KKilo; + const TInt transferSize = 32 * KKilo; + + TDmaTransferArgs transferArgs( srcAddr, desAddr, transferSize, KDmaMemAddr); + + const TRequestResults requestResult(KErrNone,32); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_1 = CSingleTransferTest(_L("TestOldStyleFragment - Test Scenario 1"), 1, transferArgs, expectedResults,KKilo). + UseNewDmaApi(EFalse); + + TTestCase testCase(&testscenario_1, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_1, ETrue, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2561 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestOldstyleFragment using CSingleTransferTest +//! Test Scenario 2 - DstAddr == SrcAddr +//! +//! 1. Set up the arguments for aTransfeArgs using the settings below. +//! +//! SrcAddr = 4 * KKilo; +//! desAddr = 4 * KKilo; +//! transferSize = 4 * KKilo +//! iFlags = KDmaMemAddr; +//! +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! @SYMTestExpectedResults +//! +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. Fragment passes and KErrNone returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace TestOldStyleFragment_2 + { + const TInt srcAddr = 4 * KKilo; + const TInt desAddr = 4 * KKilo; + const TInt transferSize = 4 * KKilo; + + TDmaTransferArgs transferArgs(srcAddr,desAddr, transferSize, KDmaMemAddr); + const TRequestResults requestResult(KErrNone, 4); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_2 = CSingleTransferTest(_L("TestOldStyleFragment - Test Scenario 2"), 1, transferArgs, expectedResults,KKilo) + .UseNewDmaApi(EFalse); + + TTestCase testCase(&testscenario_2, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_2, ETrue, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2561 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestOldstyleFragment using CSingleTransferTest +//! Test Scenario 3 - TransferSize=0 +//! +//! 1. Set up the arguments for aTransfeArgs using the settings below. +//! +//! SrcAddr = 32K +//! desAddr = 64K; +//! transferSize = 0 +//! iFlags = KDmaMemAddr; +//! +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! @SYMTestExpectedResults +//! +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. Fragment request Fails and KErrArgument returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace TestOldStyleFragment_3 + { + + const TInt srcAddr = 32 * KKilo; + const TInt desAddr = 64 * KKilo; + const TInt transferSize = 0; + + TDmaTransferArgs transferArgs(srcAddr, desAddr, transferSize,KDmaMemAddr); + const TRequestResults requestResult(KErrArgument, 0); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_3 = CSingleTransferTest(_L("TestOldStyleFragment - Test Scenario 3"), 1, transferArgs, expectedResults). + UseNewDmaApi(EFalse); + + TTestCase testCase(&testscenario_3, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_3, ETrue, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2561 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestOldstyleFragment using CSingleTransferTest +//! Test Scenario 4 - TransferSize=1Byte +//! +//! 1. Set up the arguments for aTransfeArgs using the settings below. +//! +//! +//! SrcAddr = 32K; +//! desAddr = 64K; +//! transferSize = 1 byte +//! iFlags = KDmaMemAddr; +//! +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! @SYMTestExpectedResults +//! +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. Fragment request completes and KErrNone returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//------------------------------------------------------------------------------------------------ +namespace TestOldStyleFragment_4 + { + const TInt srcAddr = 32 * KKilo; + const TInt desAddr = 64 * KKilo; + const TInt transferSize = 1; + + TDmaTransferArgs transferArgs( srcAddr, desAddr, transferSize, KDmaMemAddr); + const TRequestResults requestResult(KErrNone, 1); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_4 = CSingleTransferTest(_L("TestOldStyleFragment - Test Scenario 4"), 1, transferArgs, expectedResults). + UseNewDmaApi(EFalse); + + TTestCase testCase(&testscenario_4, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_4, ETrue, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2561 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestOldstyleFragment using CSingleTransferTest +//! Test Scenario 5 - TransferSize=1MB +//! +//! 1. Set up the arguments for aTransfeArgs using the settings below. +//! +//! SrcAddr = 16K; +//! desAddr = 2MB; +//! transferSize = 1MB +//! iFlags = KDmaMemAddr; +//! +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! @SYMTestExpectedResults +//! +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. Fragment request completes and KErrNone returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace TestOldStyleFragment_5 + { + const TInt srcAddr = 16 * KKilo; + const TInt desAddr = 2 * KMega; + const TInt transferSize = 1 * KMega; + + TDmaTransferArgs transferArgs(srcAddr, desAddr, transferSize, KDmaMemAddr); + + const TRequestResults requestResult(KErrNone); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_5 = CSingleTransferTest(_L("TestOldStyleFragment - Test Scenario 5"), 1, transferArgs, expectedResults). + UseNewDmaApi(EFalse); + + TTestCase testCase(&testscenario_5, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_5, ETrue, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2561 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestOldstyleFragment using CSingleTransferTest +//! Test Scenario 6 - TransferSize=3MB +//! +//! 1. Set up the arguments for aTransfeArgs using the settings below. +//! +//! SrcAddr = 16K +//! desAddr = 4MB; +//! transferSize = 3MB +//! iFlags = KDmaMemAddr; +//! +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! @SYMTestExpectedResults +//! +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. Fragment request completes and KErrNone returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace TestOldStyleFragment_6 + { + const TInt srcAddr = 16 * KKilo; + const TInt desAddr = 4 * KMega; + const TInt transferSize = 3 * KMega; + TDmaTransferArgs transferArgs(srcAddr, desAddr, transferSize, KDmaMemAddr); + + const TRequestResults requestResult(KErrNone); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_6 = CSingleTransferTest(_L("TestOldStyleFragment - Test Scenario 6"), 1, transferArgs, expectedResults). + UseNewDmaApi(EFalse); + + TTestCase testCase(&testscenario_6, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_6, ETrue, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2562 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestOldStyleDDmaRequest using CSingleTransferTest +//! Test Scenario 1 - aMaxTransferSize=0 +//! +//! 1. Set up the DDmaRequest using aMaxTransferSize set to 0. +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! @SYMTestExpectedResults +//! +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. DDmaRequest constructor behaves as expected and KErrArgument returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//------------------------------------------------------------------------------------------------ +namespace TestOldStyleDDmaRequest_1 + { + const TInt desAddr = 4 * KKilo; + const TInt transferSize = 4 * KKilo; + TDmaTransferArgs transferArgs(0, desAddr, transferSize, KDmaMemAddr); + + const TRequestResults requestResult(KErrNone, 0); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_1 = CSingleTransferTest(_L("TestOldStyleDDmaRequest - Test Scenario 1"), 1, transferArgs, expectedResults,0). + UseNewDmaApi(EFalse); + + TTestCase testCase(&testscenario_1, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_1, ETrue, capAboveV1); + } + +//!------------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2562 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestOldStyleDDmaRequest using CSingleTransferTest +//! Test Scenario 2 - aMaxTransferSize= 65535 +//! +//! 1. Set up the arguments for DDmaRequest using aMaxTransferSize set to 65535. +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! @SYMTestExpectedResults +//! +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. DDmaRequest constructor behaves as expected and KErrArgument returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//--------------------------------------------------------------------------------------------------- +namespace TestOldStyleDDmaRequest_2 + { + const TInt desAddr = 4 * KKilo; + const TInt transferSize = 4 * KKilo; + TDmaTransferArgs transferArgs(0, desAddr, transferSize, KDmaMemAddr); + + const TRequestResults requestResult(KErrNone, 1); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_2 = CSingleTransferTest(_L("TestOldStyleDDmaRequest - Test Scenario 2"), 1, transferArgs, expectedResults, 65535). + UseNewDmaApi(EFalse); + + TTestCase testCase(&testscenario_2, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_2, ETrue, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2563 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestNewStyleDDmaRequest using CSingleTransferTest +//! Test Scenario 1 - aMaxTransferSize=0 +//! +//! 1. Set up the DDmaRequest using aMaxTransferSize set to 0. +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! @SYMTestExpectedResults +//! +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. DDmaRequest constructor behaves as expected and KErrArgument returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace TestNewStyleDDmaRequest_1 + { + const TInt desAddr = 4 * KKilo; + const TInt transferSize = 4 * KKilo; + TDmaTransferArgs transferArgs(0, desAddr, transferSize, KDmaMemAddr); + + const TRequestResults requestResult(KErrNone, 0); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_1(_L("TestNewStyleDDmaRequest - Test Scenario 1"), 1, transferArgs, expectedResults,0); + + TTestCase testCase(&testscenario_1, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_1, ETrue, capAboveV1); + } + +//!------------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-DMA-2563 +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc TestNewStyleDDmaRequest using CSingleTransferTest +//! Test Scenario 2 - aMaxTransferSize= 65535 +//! +//! 1. Set up the arguments for DDmaRequest using aMaxTransferSize set to 65535. +//! 2. Setup expected result. +//! 3. Create single transfer test and run test +//! +//! @SYMTestExpectedResults +//! +//! 1. TransfeArgs set up in DMA framework +//! 2. Expected results set up in DMA framework +//! 3. DDmaRequest constructor behaves as expected and KErrArgument returned +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//--------------------------------------------------------------------------------------------------- +namespace TestNewStyleDDmaRequest_2 + { + const TInt desAddr = 4 * KKilo; + const TInt transferSize = 4 * KKilo; + TDmaTransferArgs transferArgs(0, desAddr, transferSize, KDmaMemAddr); + + const TRequestResults requestResult(KErrNone, 1); + const TResultSet expectedResults(KErrNone, requestResult, KErrNone, threadCallback); + + CSingleTransferTest testscenario_2(_L("TestNewStyleDDmaRequest - Test Scenario 2"), 1, transferArgs, expectedResults, 65535); + + TTestCase testCase(&testscenario_2, EFalse, capAboveV1); + TTestCase testCaseConcurrent(&testscenario_2, ETrue, capAboveV1); + } + +//---------------------------------------------------------------------------------------------- +//! @SYMTestCaseID PBASE-DMA-FUNC-xxx +//! @SYMTestType CIT +//! @SYMPREQ REQ +//! @SYMTestCaseDesc SmallFrags: This test provokes the failure seen in DEF140598 +//! The test checks that requests with small fragments +//! do not trigger a spurious missed interrupt clean up +//! +//! @SYMTestExpectedResults +//! +//! 1. +//! 2. +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//---------------------------------------------------------------------------------------------- +namespace SmallFrags + { + const TInt size = 32; + TDmaTransferArgs transferArgs(0, size, size, KDmaMemAddr); + + const TResultSet expectedResults(threadCallback); + + TTestCase testCase( + new (ELeave) CSingleTransferTest(_L("8 * 4byte frags"), 10, transferArgs, expectedResults, 4), + EFalse, capAboveV1); + } + + +//TODO TTestCase could automatically be added to aray by ctor +// +//Append new test cases here +static TTestCase* StaticTestArray[] = { + &Simple_1::testCase, + &Simple_1::testCaseConcurrent, + &Simple_2::testCase, + &Simple_2::testCaseConcurrent, + &Callback::testCase, + &Callback::testCaseOldRequest, + &ISR_Reque::endOnRedo::testCase, + &ISR_Reque::endOnIsrCb::testCase, + &ISR_Reque::endOnThreadCb::testCase, + &ISR_Reque::changeSize::testCase, +#ifdef _DEBUG + &ISR_Reque::invalidAddresses::testCase, // addresses only checked in UDEB +#endif + //&ISR_Reque::multipleFragments::testCase, // This error condition is currently caught by a FAULT instead of a return code + &Multipart::testCase, + &IsrAndDfc::DfcBeforeIsr::testCase, + &IsrAndDfc::IsrBeforeDfc::testCase, + &_2D_Test::testCase2d, + &FragmentationCount::testCase, + &FragmentationCount::testCase2, + &SmallFrags::testCase, +#ifndef _DEBUG + // Benchmarks are only really meaningful + // on UREL builds + &Benchmark::Frag::testCase_256k, + &Benchmark::Frag::testCase_8k, + &Benchmark::Transfer::_128K::testCase_128, + &Benchmark::Transfer::_128K::testCase_16, + &Benchmark::Transfer::_128K::testCase_4, + &Benchmark::Transfer::_128K::testCase_1, + &Benchmark::Transfer::_4Bytes::testCase, + &Benchmark::Transfer::_4Mb::testCase, + &Benchmark::CompareIsrDfcCb::Dfc::_4Bytes::testCase, + &Benchmark::CompareIsrDfcCb::Isr::_4Bytes::testCase, + &Benchmark::CompareIsrDfcCb::Dfc::_4K::testCase, + &Benchmark::CompareIsrDfcCb::Isr::_4K::testCase, +#endif + &TestNewStyleFragment_1::testCase, + &TestNewStyleFragment_1::testCaseConcurrent, + &TestNewStyleFragment_2::testCase, + &TestNewStyleFragment_2::testCaseConcurrent, + //&TestNewStyleFragment_3::testCase, + //&TestNewStyleFragment_3::testCaseConcurrent, + &TestNewStyleFragment_4::testCase, + &TestNewStyleFragment_4::testCaseConcurrent, + &TestNewStyleFragment_5::testCase, + &TestNewStyleFragment_5::testCaseConcurrent, + &TestNewStyleFragment_6::testCase, + &TestNewStyleFragment_6::testCaseConcurrent, + &TestOldStyleFragment_1::testCase, + &TestOldStyleFragment_1::testCaseConcurrent, + &TestOldStyleFragment_2::testCase, + &TestOldStyleFragment_2::testCaseConcurrent, + //&TestOldStyleFragment_3::testCase, + //&TestOldStyleFragment_3::testCaseConcurrent, + &TestOldStyleFragment_4::testCase, + &TestOldStyleFragment_4::testCaseConcurrent, + &TestOldStyleFragment_5::testCase, + &TestOldStyleFragment_5::testCaseConcurrent, + &TestOldStyleFragment_6::testCase, + &TestOldStyleFragment_6::testCaseConcurrent, + &TestOldStyleDDmaRequest_1::testCase, + &TestOldStyleDDmaRequest_1::testCaseConcurrent, + &TestOldStyleDDmaRequest_2::testCase, + &TestOldStyleDDmaRequest_2::testCaseConcurrent, + &TestNewStyleDDmaRequest_1::testCase, + &TestNewStyleDDmaRequest_1::testCaseConcurrent, + &TestNewStyleDDmaRequest_2::testCase, + &TestNewStyleDDmaRequest_2::testCaseConcurrent, +}; + +RPointerArray TestArray(StaticTestArray, ARRAY_LENGTH(StaticTestArray)); diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/dmav2/test_thread.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/dmav2/test_thread.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,216 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: +* Implementation of test_thread.h +* +*/ +#include "test_thread.h" + +TInt TTestRemote::iCount=0; + +TInt TTestRemote::RunFunctor(TAny* aFunctor) + { + TFunctor& functor = *(TFunctor*)aFunctor; + functor(); + return KErrNone; + } + +TTestThread::TTestThread(const TDesC& aName, TThreadFunction aFn, TAny* aData, TBool aAutoResume) + { + Init(aName, aFn, aData, aAutoResume); + } + +TTestThread::TTestThread(const TDesC& aName, TFunctor& aFunctor, TBool aAutoResume) + { + Init(aName, RunFunctor, &aFunctor, aAutoResume); + } + +TTestThread::~TTestThread() + { + //RTest::CloseHandleAndWaitForDestruction(iThread); + iThread.Close(); + } + +void TTestThread::Resume() + { + iThread.Resume(); + } + +TInt TTestThread::WaitForExitL() + { + User::WaitForRequest(iLogonStatus); + const TInt exitType = iThread.ExitType(); + const TInt exitReason = iThread.ExitReason(); + + __ASSERT_ALWAYS(exitType != EExitPending, User::Panic(_L("TTestThread"),0)); + + if(exitType != EExitKill) + User::Leave(exitReason); + + return exitReason; + } + +void TTestThread::Rendezvous(TRequestStatus& aStatus) + { + iThread.Rendezvous(aStatus); + } + +void TTestThread::Init(const TDesC& aName, TThreadFunction aFn, TAny* aData, TBool aAutoResume) + { + TKName name(aName); + name.AppendFormat(_L("-%d"), iCount++); + TInt r=iThread.Create(name, aFn, KDefaultStackSize, KHeapSize, KHeapSize, aData); + if(r!=KErrNone) + { + RDebug::Printf("RThread::Create failed, code=%d", r); + User::Panic(KPanicCat, EThreadCreateFailed); + } + + iThread.Logon(iLogonStatus); + __ASSERT_ALWAYS(iLogonStatus == KRequestPending, User::Panic(_L("TTestThread"),0)); + + if(aAutoResume) + iThread.Resume(); + } + + +CTest::~CTest() + { + iName.Close(); + } + +void CTest::operator()() + { + for(TInt i=0; i testArray; + RPointerArray threadArray; + + for(TInt i=0; iWaitForExitL()); + if(leaveCode != KErrNone) + { + test.Printf(_L("Thread %d: Panic code:%d\n"), j, leaveCode); + test_KErrNone(leaveCode); + } + + if(r!=KErrNone) + { + test.Printf(_L("Thread Number %d\n"), j); + test_KErrNone(r); + } + + threadArray.Remove(0); + delete thread; + } + threadArray.Close(); + + testArray.ResetAndDestroy(); + testArray.Close(); + } + +/** +Runs each CTest in aTests in its own thread +Returns once all threads have terminated +*/ +void MultipleTestRun(const RPointerArray& aTests) + { + RTest test(_L("CTest::MultipleTestRun")); + RPointerArray threads; + + const TInt count = aTests.Count(); + + TInt i; + for(i=0; iResume(); + } + + + for(i=0; iWaitForExitL(); + test_KErrNone(r); + } + + threads.ResetAndDestroy(); + test.Close(); + } diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/dmav2/test_thread.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/dmav2/test_thread.h Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,140 @@ +/* +* 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 "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: Some helper classes to assist with writing multi-threaded tests +* +*/ + + +#ifndef __TEST_THREAD_H__ +#define __TEST_THREAD_H__ + +#include +#include +#define __E32TEST_EXTENSION__ +#include +#include + +_LIT(KPanicCat, "test_thread.h"); + + +static const TInt KHeapSize=0x2000; + +enum TPanicCode + { + EThreadCreateFailed + }; + +/** +A utility class for running functions in other threads/processes +*/ +class TTestRemote + { +public: + virtual TInt WaitForExitL() = 0; + virtual ~TTestRemote() + {} + + virtual void Rendezvous(TRequestStatus& aStatus) = 0; + +protected: + TTestRemote() + {} + + static TInt RunFunctor(TAny* aFunctor); + + TRequestStatus iLogonStatus; + static TInt iCount; + }; + +class TTestThread : public TTestRemote + { +public: + TTestThread(const TDesC& aName, TThreadFunction aFn, TAny* aData, TBool aAutoResume=ETrue); + + /** + Run aFunctor in another thread + */ + TTestThread(const TDesC& aName, TFunctor& aFunctor, TBool aAutoResume=ETrue); + + ~TTestThread(); + + void Resume(); + + /** + If thread exited normally, return its return code + Otherwise, leave with exit reason + */ + virtual TInt WaitForExitL(); + + virtual void Rendezvous(TRequestStatus& aStatus); + +private: + void Init(const TDesC& aName, TThreadFunction aFn, TAny* aData, TBool aAutoResume); + + RThread iThread; + }; + +class CTest : public CBase, public TFunctor + { +public: + ~CTest(); + + virtual void operator()(); + virtual void RunTest() = 0; + virtual CTest* Clone() const = 0; + + /** + Prints a formatted description of the test + */ + void Announce() const; + + const TDesC& Name() const; + + /** + Should print the type of test, with no newlines. + eg. "Transfer", "Fragmentation" + TODO drop the function, just add a test type member + */ + virtual void PrintTestType() const = 0; + + /** + Display any information about test environment, with no newlines + eg. "DMA channel 16" + The base class version prints nothing. + */ + virtual void PrintTestInfo() const; + +protected: + CTest(const TDesC& aName, TInt aIterations); + CTest(const CTest& aOther); + + //It would be useful to have an RTest member, but this can't be + //initialised untill the new thread is running as it will refer to + //the creating thread + RBuf iName; + const TInt iIterations; + }; + +/** +Make aNumberOfThreads copies of aTest and run +each in its own thread + +@param test Reference to test object +@param aTest Referance +*/ +void MultipleTestRun(RTest& test, const CTest& aTest, TInt aNumberOfThreads); + +void MultipleTestRun(const RPointerArray& aTests); +#endif // #ifndef __TEST_THREAD_H__ + diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/group/bld.inf --- a/kerneltest/e32test/group/bld.inf Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/group/bld.inf Mon Jan 18 21:31:10 2010 +0200 @@ -152,6 +152,9 @@ #if defined(EPOC32) && !defined(X86) // Test LDD for real hardware DMA d_dma support +d_dma2 support +d_dma_compat support +d_dma2_compat support #endif #ifdef EPOC32 @@ -174,11 +177,11 @@ #if !defined(WINS) d_demandpaging support +d_pagemove support #endif #if !defined(WINS) && !defined(X86) d_ramdefrag support -d_pagemove support d_smpsoak support #endif @@ -629,6 +632,7 @@ t_mwait t_asid t_asid_dummy support +t_alias_remove #endif // /E32TEST/NKERN tests @@ -837,6 +841,7 @@ // /E32TEST/DMA tests t_dma // user-side test harness for real DMA framework +t_dma2 // user-side test harness for DMAv2 framework // Example RTOS personality ../personality/example/t_expers support diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/group/d_dma2.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/group/d_dma2.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,52 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// + +#include "kernel/kern_ext.mmh" + +#ifdef VariantDmaImportLib +target VariantTarget(d_dma2,ldd) +#else +target d_dma2.ldd +#endif + +targettype ldd + +sourcepath ../dmav2 +source d_dma2.cpp d_dma2_cmn.cpp + +#ifdef VariantDmaImportLib +library VariantDmaImportLib +#else +library dma2.lib +#endif + +OS_LAYER_SYSTEMINCLUDE_SYMBIAN + +epocallowdlldata + +capability all +VENDORID 0x70000001 + +// Don't put this in ROM here since it would stop ROMs building on platforms +// without DMA support. +romtarget + +#ifdef SMP +MACRO CPU_AFFINITY_ANY +#endif + +SMPSAFE + +MACRO DMA_APIV2 diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/group/d_dma2_compat.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/group/d_dma2_compat.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,53 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// + +#include "kernel/kern_ext.mmh" + +#ifdef VariantDmaImportLib +target VariantTarget(d_dma2_compat,ldd) +#else +target d_dma2_compat.ldd +#endif + +targettype ldd + +sourcepath ../dmav2 +source d_dma2.cpp d_dma2_cmn.cpp + +sourcepath ../../../../kernelhwsrv/kernel/eka/drivers/dma +source dma2_shared.cpp + +#ifdef VariantDmaImportLib +library VariantDmaImportLib +#else +library dma.lib +#endif + +OS_LAYER_SYSTEMINCLUDE_SYMBIAN + +epocallowdlldata + +capability all +VENDORID 0x70000001 + +// Don't put this in ROM here since it would stop ROMs building on platforms +// without DMA support. +romtarget + +#ifdef SMP +MACRO CPU_AFFINITY_ANY +#endif + +SMPSAFE diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/group/d_dma_compat.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/group/d_dma_compat.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,52 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// + +#include "kernel/kern_ext.mmh" + +#ifdef VariantDmaImportLib +target VariantTarget(d_dma_compat,ldd) +#else +target d_dma_compat.ldd +#endif + +targettype ldd + +sourcepath ../dma +source d_dma.cpp + +#ifdef VariantDmaImportLib +library VariantDmaImportLib +#else +library dma2.lib +#endif + +OS_LAYER_SYSTEMINCLUDE_SYMBIAN + +epocallowdlldata + +capability all +VENDORID 0x70000001 + +// Don't put this in ROM here since it would stop ROMs building on platforms +// without DMA support. +romtarget + +#ifdef SMP +MACRO CPU_AFFINITY_ANY +#endif + +SMPSAFE + +MACRO DMA_APIV2 diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/group/smpsafea.mmp --- a/kerneltest/e32test/group/smpsafea.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/group/smpsafea.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -28,6 +28,7 @@ macro MAKE_DLL macro PROVIDE_A +unpaged // must be unpaged for CheckAffinity() to be robust capability NONE VENDORID 0x70000001 diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/group/smpsafeb.mmp --- a/kerneltest/e32test/group/smpsafeb.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/group/smpsafeb.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -29,6 +29,7 @@ smpsafe macro MAKE_DLL macro PROVIDE_B +unpaged // must be unpaged for CheckAffinity() to be robust capability NONE VENDORID 0x70000001 diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/group/smpsafec.mmp --- a/kerneltest/e32test/group/smpsafec.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/group/smpsafec.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -29,6 +29,7 @@ smpsafe macro MAKE_DLL macro PROVIDE_C +unpaged // must be unpaged for CheckAffinity() to be robust capability NONE VENDORID 0x70000001 diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/group/smpsafed.mmp --- a/kerneltest/e32test/group/smpsafed.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/group/smpsafed.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -29,6 +29,7 @@ smpsafe macro MAKE_DLL macro PROVIDE_D +unpaged // must be unpaged for CheckAffinity() to be robust capability NONE VENDORID 0x70000001 diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/group/smpsafee.mmp --- a/kerneltest/e32test/group/smpsafee.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/group/smpsafee.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -28,6 +28,7 @@ macro MAKE_DLL macro PROVIDE_E +unpaged // must be unpaged for CheckAffinity() to be robust capability NONE VENDORID 0x70000001 diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/group/smpsafexa.mmp --- a/kerneltest/e32test/group/smpsafexa.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/group/smpsafexa.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -26,6 +26,7 @@ macro MAKE_DLL macro PROVIDE_A +unpaged // must be unpaged for CheckAffinity() to be robust capability NONE VENDORID 0x70000001 diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/group/t_alias_remove.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/group/t_alias_remove.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,33 @@ +// Copyright (c) 1996-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/group/t_alias_remove.mmp +// +// + +TARGET t_alias_remove.exe +TARGETTYPE EXE +SOURCEPATH ../mmu +SOURCE t_alias_remove.cpp +LIBRARY euser.lib +OS_LAYER_SYSTEMINCLUDE_SYMBIAN + + +capability all + +VENDORID 0x70000001 + +SMPSAFE + +unpaged // The test takes too long to execute when it's paged. + diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/group/t_dma2.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/group/t_dma2.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,30 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// + +TARGET t_dma2.exe +TARGETTYPE EXE +SOURCEPATH ../dmav2 +SOURCE t_dma2.cpp test_cases.cpp self_test.cpp dma_api_tests.cpp d_dma2_cmn.cpp +SOURCE test_thread.cpp +SOURCEPATH ../../../kernel/eka/drivers/dma +SOURCE dma2_shared.cpp +LIBRARY euser.lib +OS_LAYER_SYSTEMINCLUDE_SYMBIAN + +CAPABILITY NONE + +VENDORID 0x70000001 + +SMPSAFE diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/group/t_smpsafe.mmp --- a/kerneltest/e32test/group/t_smpsafe.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/group/t_smpsafe.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -27,5 +27,6 @@ smpsafe macro OMIT_MAIN +unpaged // must be unpaged for CheckAffinity() to be robust VENDORID 0x70000001 diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/group/t_smpsoakspin.mmp --- a/kerneltest/e32test/group/t_smpsoakspin.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/group/t_smpsoakspin.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -1,20 +1,7 @@ -/* -* Copyright (c) 2005 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\group\t_smpsoakspin.mmp +// +// Copyright (c) 2005 Symbian Ltd. All rights reserved. +// target t_smpsoakspin.exe targettype exe diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/misc/inflate.c --- a/kerneltest/e32test/misc/inflate.c Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/misc/inflate.c Mon Jan 18 21:31:10 2010 +0200 @@ -1,19 +1,3 @@ -/* -* Copyright (c) 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: -* -*/ /* inflate.c -- Not copyrighted 1992 by Mark Adler version c10p1, 10 January 1993 */ diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/misc/t_cputime.cpp --- a/kerneltest/e32test/misc/t_cputime.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/misc/t_cputime.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -35,7 +35,7 @@ const TInt KLongWait = 3000000; // 3 seconds const TInt KShortWait = 100000; // 0.1 seconds -const TInt KTolerance = 500; // 0.5 ms +const TInt KTolerance = 1000; // 1 ms const TInt numCpus = UserSvr::HalFunction(EHalGroupKernel, EKernelHalNumLogicalCpus, 0, 0); #define FailIfError(EXPR) \ @@ -215,7 +215,7 @@ TThreadParam threadParam; FailIfError((threadParam.iSem).CreateLocal(0)); - threadParam.iCpu = 1; + threadParam.iCpu = 0; // Later tests will exercise other CPUs RThread thread; RUndertaker u; @@ -243,7 +243,7 @@ (threadParam.iSem).Signal(); User::After(KShortWait); FailIfError(thread.GetCpuTime(time)); - test(time > (KShortWait - 2 * KTolerance)); + test(time > (KShortWait - KTolerance)); // Test not increased while suspended thread.Suspend(); @@ -420,7 +420,7 @@ { test.Title(); test.Start(_L("T_CPUTIME")); - + if (numCpus > 1) FailIfError(SetCpuAffinity(0)); diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/mmu/t_alias_remove.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/mmu/t_alias_remove.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,374 @@ +// Copyright (c) 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\mmu\t_alias_remove.cpp +// Overview: +// Test interactions when free memory being aliases. +// Details: +// Create 3 mappings to one chunk one that owns the chunk, one to map it again another process +// and another alias mapping. +// Then while the alias mapping is accessing the chunk close the second mapping. +// Platforms/Drives/Compatibility: +// All. +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#define __E32TEST_EXTENSION__ +#include +#include +#include +#include "..\defrag\d_pagemove.h" + +const TPtrC KAliasProcessName = _L("T_ALIAS_REMOVE"); +const TPtrC KAliasChunkName = _L("AliasChunk"); +const TPtrC KAliasServerName = _L("AliasServer"); +const TPtrC KMasterServerName = _L("MasterServer"); + +RBuf ChunkName; +RBuf MasterServerName; +RBuf AliasServerName; + +RTest test(KAliasProcessName); + +//#define ENABLE_PRINTFS +#ifndef __MSVC6__ // VC6 can't cope with variable arguments in macros. + +#define T_PRINTF(x...) test.Printf(x) +#define D_PRINTF(x...) RDebug::Printf(x) +#ifdef ENABLE_PRINTFS +#define PRINTF(x) x +#else +#define PRINTF(x) +#endif // ENABLE_PRINTFS + +#else +#define PRINTF(x) +#endif // __MSCV6__ + +enum TSlaveMsgType + { + ESlaveConnect = -1, + ESlaveDisconnect = -2, + ESlaveReadChunk = 0, + ESlaveClosedChunk = 1, + }; + + +struct SThreadData + { + TUint8 iFillValue; + TUint iChunkSize; + RThread* iMasterThread; + TUint iProcessId; + }; + + +class RAliasSession : public RSessionBase + { +public: + TInt CreateSession(const TDesC& aServerName, TInt aMsgSlots) + { + return RSessionBase::CreateSession(aServerName,User::Version(),aMsgSlots); + } + TInt PublicSendReceive(TInt aFunction, const TIpcArgs &aPtr) + { + return (SendReceive(aFunction, aPtr)); + } + TInt PublicSend(TInt aFunction, const TIpcArgs &aPtr) + { + return (Send(aFunction, aPtr)); + } + }; + + +TInt SlaveProcess(TUint aProcessId, TUint aFillValue) + { + // Connect to the master server to indicate that we're ready to receive ipc messages. + RAliasSession masterSession; + test_KErrNone(masterSession.CreateSession(MasterServerName, 1)); + + PRINTF(T_PRINTF(_L("Process ID %d Slave open chunk\n"), aProcessId)); + // Open the global chunk. + RChunk chunk; + TInt r = chunk.OpenGlobal(ChunkName, ETrue); + test_KErrNone(r); + + // Connect to alias server. + PRINTF(T_PRINTF(_L("Process ID %d Slave connect to alias server\n"), aProcessId)); + RAliasSession aliasSession; + test_KErrNone(aliasSession.CreateSession(AliasServerName, 1)); + + PRINTF(T_PRINTF(_L("Process ID %d Slave send data to alias server\n"), aProcessId)); + TPtr8 arg0(chunk.Base(), chunk.Size(), chunk.Size()); + r = aliasSession.PublicSend(ESlaveReadChunk, TIpcArgs(&arg0)); + test_KErrNone(r); + + // Close the chunk removing its mapping before the server has read it. + chunk.Close(); + PRINTF(T_PRINTF(_L("Process ID %d Slave closed chunk\n"), aProcessId)); + + r = masterSession.PublicSendReceive(ESlaveClosedChunk, TIpcArgs()); + test_KErrNone(r); + aliasSession.Close(); + masterSession.Close(); + return KErrNone; + } + + +TInt ChunkReadThread(TAny* aThreadData) + { + SThreadData* threadData = (SThreadData*)aThreadData; + RServer2 aliasServer; + TInt r = aliasServer.CreateGlobal(AliasServerName); + if (r != KErrNone) + { + RDebug::Printf("Process ID %d Error creating alias server r=%d", threadData->iProcessId, r); + return r; + } + // Connect to the master server to indicate that we're ready to receive ipc messages. + RAliasSession masterSession; + test_KErrNone(masterSession.CreateSession(MasterServerName, 1)); + + PRINTF(D_PRINTF("Process ID %d Alias wait for slave connection", threadData->iProcessId)); + RMessage2 aliasMessage; + // Read and complete the connect message from the slave. + aliasServer.Receive(aliasMessage); + test_Equal(ESlaveConnect, aliasMessage.Function()); + aliasMessage.Complete(KErrNone); + + // Read the data of the remote chunk. + PRINTF(D_PRINTF("Process ID %d Alias read chunk data", threadData->iProcessId)); + HBufC8* argTmp = HBufC8::New(threadData->iChunkSize); + test_NotNull(argTmp); + RBuf8 argBuf(argTmp); + aliasServer.Receive(aliasMessage); + test_Equal(ESlaveReadChunk, aliasMessage.Function()); + r = aliasMessage.Read(0, argBuf); + if (r == KErrNone) + {// Successfully read the chunk so verify it. + aliasMessage.Complete(KErrNone); + + PRINTF(D_PRINTF("Process ID %d Alias verify chunk data", threadData->iProcessId)); + const TUint8* bufPtr = argBuf.Ptr(); + const TUint8* bufEnd = bufPtr + threadData->iChunkSize; + for (; bufPtr < bufEnd; bufPtr++) + { + if (*bufPtr != threadData->iFillValue) + { + RDebug::Printf("Process ID %d Read incorrect data exp 0x%x got 0x%x", + threadData->iProcessId, threadData->iFillValue, *bufPtr); + r = *bufPtr; + break; + } + } + } + else + { + PRINTF(D_PRINTF("Process ID %d Error reading chunk remotely %d", threadData->iProcessId, r)); + } + argBuf.Close(); + masterSession.Close(); + return r; + } + + +TInt MasterProcess(TInt aProcessId) + { + TInt pageSize; + UserHal::PageSizeInBytes(pageSize); + // Need a large chunk so that alias that reads it is held for a long + // enough period for there to be conflicts with the chunk closure in + // the slave process. + const TUint KChunkSize = pageSize * 1024; + + PRINTF(T_PRINTF(_L("Process ID %d Create chunk\n"), aProcessId)); + RChunk chunk; + TInt r = chunk.CreateGlobal(ChunkName, KChunkSize, KChunkSize); + test_KErrNone(r); + + + for (TUint8 fillValue = 1; fillValue < 255; fillValue++) + { + // Output a character every 16 iterations so test machines + // don't time out. + if ((fillValue & 0xf) == 1) + test.Printf(_L(".")); + + PRINTF(T_PRINTF(_L("Process ID %d start slave fill value %d\n"), aProcessId, fillValue)); + RServer2 masterServer; + r = masterServer.CreateGlobal(MasterServerName); + test_KErrNone(r); + RMessage2 masterMessage; + + // Update the chunk to new fill value. + memset(chunk.Base(), fillValue, KChunkSize); + + PRINTF(T_PRINTF(_L("Process ID %d Start the slave process\n"), aProcessId)); + RProcess slaveProcess; + test_KErrNone(slaveProcess.Create(KAliasProcessName, KNullDesC)); + test_KErrNone(slaveProcess.SetParameter(1, aProcessId)); + test_KErrNone(slaveProcess.SetParameter(2, fillValue)); + TRequestStatus slaveStatus; + slaveProcess.Logon(slaveStatus); + test_Equal(KRequestPending, slaveStatus.Int()); + slaveProcess.Resume(); + + // Wait for the connect message from the slave process. + masterServer.Receive(masterMessage); + test_Equal(ESlaveConnect, masterMessage.Function()); + + SThreadData threadData; + threadData.iFillValue = fillValue; + threadData.iChunkSize = KChunkSize; + threadData.iProcessId = aProcessId; + RThread readThread; + r = readThread.Create(KNullDesC, ChunkReadThread, 10 * pageSize, KChunkSize, KChunkSize * 2, &threadData); + test_KErrNone(r); + TRequestStatus threadStatus; + readThread.Logon(threadStatus); + test_Equal(KRequestPending, threadStatus.Int()); + readThread.Resume(); + + PRINTF(T_PRINTF(_L("Process ID %d Wait for alias thread to start server\n"), aProcessId)); + RMessage2 aliasMessage; + masterServer.Receive(aliasMessage); + test_Equal(ESlaveConnect, aliasMessage.Function()); + aliasMessage.Complete(KErrNone); + + // Signal to the slave process to send chunk to alias thread. + PRINTF(T_PRINTF(_L("Process ID %d Signal to slave to send chunk to alias\n"), aProcessId)); + masterMessage.Complete(KErrNone); + + // Wait for slave to close the chunk and fill it with new value. + for (;;) + { + masterServer.Receive(masterMessage); + TInt func = masterMessage.Function(); + PRINTF(T_PRINTF(_L("Process ID %d rxd %d\n"), aProcessId, func)); + if (func == ESlaveClosedChunk) + {// Slave closed the chunk. + memset(chunk.Base(), ++fillValue, KChunkSize); + break; + } + else + {// Alias has read the chunk and completed. + test_Equal(ESlaveDisconnect, func); + } + } + + PRINTF(T_PRINTF(_L("Process ID %d Wait for alias to complete\n"), aProcessId)); + masterMessage.Complete(KErrNone); + User::WaitForRequest(threadStatus); + TInt statusInt = threadStatus.Int(); + test_Value( statusInt, + statusInt == KErrNone || + statusInt == KErrBadDescriptor || + statusInt == KErrDied); + test_Equal(EExitKill, readThread.ExitType()); + readThread.Close(); + + PRINTF(T_PRINTF(_L("Process ID %d Wait for slave to complete\n"), aProcessId)); + User::WaitForRequest(slaveStatus); + test_Equal(EExitKill, slaveProcess.ExitType()); + test_Equal(KErrNone, slaveProcess.ExitReason()); + slaveProcess.Close(); + masterServer.Close(); + } + + chunk.Close(); + + return 0; + } + + +GLDEF_C TInt E32Main() + { + TInt processId; + if(User::GetTIntParameter(1, processId)==KErrNone) + { + test_KErrNone(ChunkName.Create(KAliasChunkName.Length() + 3)); + ChunkName.Copy(KAliasChunkName); + ChunkName.AppendNum(processId); + + test_KErrNone(MasterServerName.Create(KMasterServerName.Length() + 3)); + MasterServerName.Copy(KMasterServerName); + MasterServerName.AppendNum(processId); + + test_KErrNone(AliasServerName.Create(KAliasServerName.Length() + 3)); + AliasServerName.Copy(KAliasServerName); + AliasServerName.AppendNum(processId); + + TInt fillValue; + if(User::GetTIntParameter(2, fillValue)==KErrNone) + { + return SlaveProcess(processId, fillValue); + } + return MasterProcess(processId); + } + + // Get the number of cpus and use it to determine how many processes to execute. + RPageMove pagemove; + test_KErrNone(pagemove.Open()); + TUint masterProcesses = pagemove.NumberOfCpus() + 1; + pagemove.Close(); + + TInt cmdLineLen = User::CommandLineLength(); + if(cmdLineLen) + { + RBuf cmdLine; + test_KErrNone(cmdLine.Create(cmdLineLen)); + User::CommandLine(cmdLine); + test_KErrNone(TLex(cmdLine).Val(masterProcesses)); + } + + test.Title(); + test.Start(_L("")); + test.Printf(_L("Create %d processes for accessing aliases being removed\n"), masterProcesses); + + TUint32 debugMask = UserSvr::DebugMask(); + User::SetDebugMask(0); + + // Start master processes to alias memory between each other. + RProcess* masters = new RProcess[masterProcesses]; + TRequestStatus* masterStatus = new TRequestStatus[masterProcesses]; + TUint i = 0; + for (; i < masterProcesses; i++) + { + test_KErrNone(masters[i].Create(KAliasProcessName, KNullDesC)); + test_KErrNone(masters[i].SetParameter(1, i)); + masters[i].Logon(masterStatus[i]); + test_Equal(KRequestPending, masterStatus[i].Int()); + } + test.Next(_L("Resume the processes")); + for (i = 0; i < masterProcesses; i++) + { + masters[i].Resume(); + } + + test.Next(_L("Wait for processes to exit")); + for (i = 0; i < masterProcesses; i++) + { + User::WaitForRequest(masterStatus[i]); + test_Equal(EExitKill, masters[i].ExitType()); + test_Equal(KErrNone, masters[i].ExitReason()); + } + User::SetDebugMask(debugMask); + delete masterStatus; + delete masters; + test.Printf(_L("\n")); + test.End(); + return KErrNone; + } diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/smpsoak/t_smpsoak.cpp --- a/kerneltest/e32test/smpsoak/t_smpsoak.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/smpsoak/t_smpsoak.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -14,6 +14,7 @@ // e32test\smpsoak\t_smpsoak.cpp // User Includes +#include #include "t_smpsoak.h" void ParseCommandLine (); diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/smpsoak/t_smpsoakspin.cpp --- a/kerneltest/e32test/smpsoak/t_smpsoakspin.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/smpsoak/t_smpsoakspin.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -15,6 +15,7 @@ // #define __E32TEST_EXTENSION__ +#include #include #include #include diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/system/t_dobject.cpp --- a/kerneltest/e32test/system/t_dobject.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/system/t_dobject.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -179,25 +179,29 @@ test.Next(_L("Test mutexes have been created")); TFullName name; - TFindMutex find; + for (TInt i = 0 ; i < KObjectCount ; ++i) { + TFindMutex find(MutexName(i)); test(find.Next(name) == KErrNone); test.Printf(_L(" %02d: found handle %08x\n"), i, find.Handle()); - test(name == MutexName(i)); } - test(find.Next(name) == KErrNotFound); } void TestMutexesDeleted() { test.Next(_L("Test mutexes deleted")); - TFindMutex find; TFullName name; - test(find.Next(name) == KErrNotFound); + + for (TInt i = 0 ; i < KObjectCount ; ++i) + { + TFindMutex find(MutexName(i)); + test(find.Next(name) == KErrNotFound); + } } + void TestFindSpecificMutex() { test.Next(_L("Test finding specific mutexes")); @@ -275,27 +279,23 @@ // Find and delete even mutexes TFullName name; - TFindMutex find2(KDoubleMatch); TInt i; for (i = 0 ; i < KObjectCount ; i += 2) { + TFindMutex find2(MutexName(i)); test(find2.Next(name) == KErrNone); test.Printf(_L(" %02d: found handle %08x\n"), i, find2.Handle()); - test(name == MutexName(i)); Mutexes[i].Close(); RMutex mutex; test(mutex.Open(find2) == KErrNotFound); } - test(find2.Next(name) == KErrNotFound); // Check odd mutexes remaining - TFindMutex find; for (i = 1 ; i < KObjectCount ; i += 2) { + TFindMutex find(MutexName(i)); test(find.Next(name) == KErrNone); - test(name == MutexName(i)); } - test(find2.Next(name) == KErrNotFound); } void TestFindAndDeleteMutex2() @@ -304,29 +304,26 @@ // Find even mutexes and delete odd TFullName name; - TFindMutex find2(KDoubleMatch); TInt i; for (i = 0 ; i < KObjectCount ; i += 2) { + TFindMutex find2(MutexName(i)); test(find2.Next(name) == KErrNone); test.Printf(_L(" %02d: found handle %08x\n"), i, find2.Handle()); - test(name == MutexName(i)); Mutexes[(i+KObjectCount-1)%KObjectCount].Close(); // -1%n = -1 or n-1, unspecified RMutex mutex; test(mutex.Open(find2) == KErrNone); test(mutex.Name() == MutexName(i)); mutex.Close(); } - test(find2.Next(name) == KErrNotFound); // Check even mutexes remaining - TFindMutex find; for (i = 0 ; i < KObjectCount ; i += 2) { + TFindMutex find(MutexName(i)); test(find.Next(name) == KErrNone); - test(name == MutexName(i)); } - test(find2.Next(name) == KErrNotFound); + } void TestFindWithCreation() @@ -334,20 +331,18 @@ test.Next(_L("Test finding mutexes interleaved with creation")); TFullName name; - TFindMutex find; for (TInt i = 0 ; i < KObjectCount ; ++i) { test(Mutexes[i].CreateGlobal(MutexName(i)) == KErrNone); + TFindMutex find(MutexName(i)); test(find.Next(name) == KErrNone); test.Printf(_L(" %02d: found handle %08x\n"), i, find.Handle()); - test(name == MutexName(i)); RMutex mutex; test(mutex.Open(find) == KErrNone); test(mutex.Name() == MutexName(i)); mutex.Close(); } - test(find.Next(name) == KErrNotFound); } void TestFindWithCreation2() @@ -355,20 +350,20 @@ test.Next(_L("Test finding mutexes interleaved with creation and deletion")); TFullName name; - TFindMutex find; for (TInt i = 0 ; i < KObjectCount ; ++i) { RMutex mutex; test(mutex.CreateGlobal(MutexName(0)) == KErrNone); + TFindMutex find(MutexName(0)); test(find.Next(name) == KErrNone); + test(name == MutexName(0)); test.Printf(_L(" %02d: found handle %08x\n"), i, find.Handle()); - test(name == MutexName(0)); mutex.Close(); - RMutex mutex2; - test(mutex2.Open(find) == KErrNotFound); + + TFindMutex find2(MutexName(0)); + test(find2.Next(name) == KErrNotFound); } - test(find.Next(name) == KErrNotFound); } void TestFindHandleOutOfRange() @@ -376,12 +371,12 @@ test.Next(_L("Test finding mutexes when find handle index is off the end of container's array")); TFullName name; - TFindMutex find; + for (TInt i = 0 ; i < KObjectCount ; ++i) { + TFindMutex find(MutexName(i)); test(find.Next(name) == KErrNone); test.Printf(_L(" %02d: found handle %08x\n"), i, find.Handle()); - test(name == MutexName(i)); RMutex mutex; test(mutex.Open(find) == KErrNone); test(mutex.Name() == MutexName(i)); @@ -394,7 +389,6 @@ Mutexes[j].Close(); } } - test(find.Next(name) == KErrNotFound); } void TestFindHandles() diff -r 36bfc973b146 -r 329ab0095843 kerneltest/e32test/thread/smpsafe.cpp --- a/kerneltest/e32test/thread/smpsafe.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/e32test/thread/smpsafe.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -86,6 +86,7 @@ t.SetPriority(EPriorityLess); t.Resume(); + TInt a = 1; for (TInt i = KLoopTries; i>0; --i) { Affinity = 1; // assume we are locked to a single cpu @@ -95,7 +96,8 @@ { // spin, waiting to see if the other thread actually *does* run } - if (Affinity == 0) + a = Affinity; + if (a == 0) break; Stop.Wait(); // We didn't see it this time, but try again in case of scheduling fluke } @@ -104,7 +106,7 @@ User::WaitForRequest(s); t.Close(); - return Affinity; + return a; } #ifndef OMIT_MAIN diff -r 36bfc973b146 -r 329ab0095843 kerneltest/f32test/bench/t_notify_perf_impl.cpp --- a/kerneltest/f32test/bench/t_notify_perf_impl.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/f32test/bench/t_notify_perf_impl.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1331,9 +1331,29 @@ TBool CNotifyWatcher::CompareEntry(const TEntry& aEntry1, const TEntry& aEntry2) { // we don't compare name, because names are compared by CompareEntryName() already - if ((aEntry1.iAtt == aEntry2.iAtt) && (aEntry1.iModified == aEntry2.iModified) - && (aEntry1.iSize == aEntry2.iSize) && (aEntry1.iType == aEntry2.iType)) - return ETrue; + // we don't check attributes when creating files, because dir scan sometimes returns file + // entries before attributes being flushed, and we don't care about it in this test case. + // we also don't check the modified time for all the test cases expect replacing test, + // because dir scan sometimes returns file entries before time being flushed, + // and we don't care about it as well. + // For replacing test, we check modification time, because it's the way we distinguish the old and new files. + if (iCurrentOp == EOpCreate) + { + if ((aEntry1.iSize == aEntry2.iSize) && (aEntry1.iType == aEntry2.iType)) + return ETrue; + } + else if (iCurrentOp == EOpReplace || iCurrentOp == EOpManyFiles || iCurrentOp == EOpManyChanges || iCurrentOp == EOpMixed) + { + if ((aEntry1.iAtt == aEntry2.iAtt) && (aEntry1.iModified == aEntry2.iModified) + && (aEntry1.iSize == aEntry2.iSize) && (aEntry1.iType == aEntry2.iType)) + return ETrue; + } + else + { + if ((aEntry1.iAtt == aEntry2.iAtt) && (aEntry1.iSize == aEntry2.iSize) + && (aEntry1.iType == aEntry2.iType)) + return ETrue; + } return EFalse; } diff -r 36bfc973b146 -r 329ab0095843 kerneltest/f32test/demandpaging/t_clamp.cpp --- a/kerneltest/f32test/demandpaging/t_clamp.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/f32test/demandpaging/t_clamp.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -47,6 +47,7 @@ #include #include +#include RFs TheFs; _LIT(KFATName,"FAT"); diff -r 36bfc973b146 -r 329ab0095843 kerneltest/f32test/demandpaging/t_denyclamp.cpp --- a/kerneltest/f32test/demandpaging/t_denyclamp.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/f32test/demandpaging/t_denyclamp.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -40,6 +40,7 @@ #include #include +#include RFs TheFs; _LIT(KFATName,"FAT"); diff -r 36bfc973b146 -r 329ab0095843 kerneltest/f32test/filesystem/automounter/t_automounter.cpp --- a/kerneltest/f32test/filesystem/automounter/t_automounter.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/f32test/filesystem/automounter/t_automounter.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -29,7 +29,6 @@ #include #include "filesystem_fat.h" -#include "filesystem_exfat.h" #include "filesystem_automounter.h" @@ -70,11 +69,26 @@ _LIT(KFsy1, "elocal.fsy"); #endif -//-- exFAT is used as a child filesystem #1 -//_LIT(KFSName2, "exfat"); ///< filesystem #2 name + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//-- exFAT is used as a child filesystem #1. The problem here: some poor guys might not have the exFAT at all including the header file +//-- "filesystem_exfat.h" that defines exFAT volume formatting structure. Fortunately for them the exFAT formatting parameters like "sectors per cluster" and +//-- "number of FATs" have the same layout in the data container as FAT ones. So FAT formatting structure can be used for formatting exFAT. +//-- The macro defines if exFAT might not be available. +#define EXFAT_MIGHT_NOT_BE_PRESENT /** filesystem #2 name */ -#define KFSName2 KFileSystemName_exFAT +#ifdef EXFAT_MIGHT_NOT_BE_PRESENT + _LIT(KFSName2, "exFAT"); +#else + #define KFSName2 KFileSystemName_exFAT + #include "filesystem_exfat.h" + using namespace FileSystem_EXFAT; +#endif + + + + _LIT(KFsy2, "exfat.fsy"); ///< filesystem #2 *.fsy module name TBool automounter_Loaded = EFalse; ///< ETrue if automounter.fsy is loaded; used for correct cleanup @@ -1508,7 +1522,7 @@ void TestFormatting_FsName_Parameters_exFAT() { - using namespace FileSystem_EXFAT; + test.Next(_L("Testing TVolFormatParam_exFAT formatting API\n")); @@ -1531,8 +1545,15 @@ //================================================================================ //-- 1.0 simple unit test for TVolFormatParam_FAT - TVolFormatParam_exFATBuf fmtParamBuf_exFAT; - TVolFormatParam_exFAT& fmtParam = fmtParamBuf_exFAT(); +#ifndef EXFAT_MIGHT_NOT_BE_PRESENT + TVolFormatParam_exFATBuf fmtParamBuf; + TVolFormatParam_exFAT& fmtParam = fmtParamBuf(); +#else + //-- see the comments to "EXFAT_MIGHT_NOT_BE_PRESENT" macro definition + TVolFormatParam_FATBuf fmtParamBuf; + TVolFormatParam_FAT& fmtParam= fmtParamBuf(); +#endif + fmtParam.SetSectPerCluster(64); test(fmtParam.SectPerCluster()==64); @@ -1555,7 +1576,12 @@ test.Printf(_L("fmt: using TVolFormatParam_exFAT, no parameters.\n")); fmtParam.Init(); - nRes = format.Open(TheFs, drivePath, fmtMode, fmtCnt, fmtParamBuf_exFAT); +#ifdef EXFAT_MIGHT_NOT_BE_PRESENT + //-- need to forcedly set exFAT FS name, because fmtParam.Init(); set it to "FAT" + ((TVolFormatParam&)fmtParam).SetFileSystemName(KFSName2); +#endif + + nRes = format.Open(TheFs, drivePath, fmtMode, fmtCnt, fmtParamBuf); test(nRes==KErrNone); nRes = DoFormatSteps(format, fmtCnt); @@ -1571,7 +1597,7 @@ fmtParam.SetSectPerCluster(1); fmtParam.SetNumFATs(2); - nRes = format.Open(TheFs, drivePath, fmtMode, fmtCnt, fmtParamBuf_exFAT); + nRes = format.Open(TheFs, drivePath, fmtMode, fmtCnt, fmtParamBuf); test(nRes==KErrNone); nRes = DoFormatSteps(format, fmtCnt); diff -r 36bfc973b146 -r 329ab0095843 kerneltest/f32test/plugins/version_2/inc/modifier_plugin.h --- a/kerneltest/f32test/plugins/version_2/inc/modifier_plugin.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/f32test/plugins/version_2/inc/modifier_plugin.h Mon Jan 18 21:31:10 2010 +0200 @@ -71,7 +71,8 @@ void FsRenameL(TFsPluginRequest& aRequest); void FsEntryL(TFsPluginRequest& aRequest); void FsSetEntryL(TFsPluginRequest& aRequest); - + void FsVolumeL(TFsPluginRequest& aRequest); + void FsPluginDoRequestL(TFsPluginRequest& aRequest); TInt FsPluginDoControlL(TFsPluginRequest& aRequest); diff -r 36bfc973b146 -r 329ab0095843 kerneltest/f32test/plugins/version_2/inc/plugincommon.h --- a/kerneltest/f32test/plugins/version_2/inc/plugincommon.h Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/f32test/plugins/version_2/inc/plugincommon.h Mon Jan 18 21:31:10 2010 +0200 @@ -16,11 +16,11 @@ #include #include -const TInt KPluginSetDrive = -112233; -const TInt KPluginGetError = -112234; -const TInt KPluginSetRemovable = -112235; -const TInt KPluginToggleIntercepts = -112236; -const TInt KPluginSetDirFullName = -112237; +const TInt KPluginSetDrive = -112233; +const TInt KPluginGetError = -112234; +const TInt KPluginSetRemovable = -112235; +const TInt KPluginToggleIntercepts = -112236; +const TInt KPluginSetDirFullName = -112237; //This is some stupid thing for making strings wide. //We're using this for printing out the filename. diff -r 36bfc973b146 -r 329ab0095843 kerneltest/f32test/plugins/version_2/src/modifier_plugin.cpp --- a/kerneltest/f32test/plugins/version_2/src/modifier_plugin.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/f32test/plugins/version_2/src/modifier_plugin.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -94,6 +94,7 @@ User::LeaveIfError(RegisterIntercept(EFsFileSeek, EPreIntercept)); User::LeaveIfError(RegisterIntercept(EFsPluginDoControl, EPreIntercept)); User::LeaveIfError(RegisterIntercept(EFsPluginDoRequest, EPreIntercept)); + User::LeaveIfError(RegisterIntercept(EFsVolume, EPreIntercept)); _LOG(_L("Modifier Plugin: Enabled intercepts.")); @@ -131,6 +132,7 @@ User::LeaveIfError(UnregisterIntercept(EFsEntry, EPreIntercept)); User::LeaveIfError(UnregisterIntercept(EFsSetEntry, EPreIntercept)); User::LeaveIfError(UnregisterIntercept(EFsFileSeek, EPreIntercept)); + User::LeaveIfError(UnregisterIntercept(EFsVolume, EPreIntercept)); _LOG(_L("Modifier Plugin: Disabled intercepts.")); @@ -152,13 +154,13 @@ if(aRequest.IsPostOperation()) { - _LOG2(_L("Modifier Plugin::DoRequestL for Function %d in Post-Interception"),function); + _LOG2(_L("CModifierPlugin::DoRequestL for Function %d in Post-Interception"),function); } else { - _LOG2(_L("Modifier Plugin::DoRequestL for Function %d in Pre-Interception"),function); + _LOG2(_L("CModifierPlugin::DoRequestL for Function %d in Pre-Interception"),function); } - + switch(function) { case EFsFileRead: @@ -249,6 +251,10 @@ TRAP(err, FsSetEntryL(aRequest)); break; + case EFsVolume: + TRAP(err, FsVolumeL(aRequest)); + break; + default: break; } @@ -423,7 +429,7 @@ User::Leave(err); //trapped in DoRequestL fileplugin.Close(); - + User::Leave(KErrCompletion); } } @@ -525,7 +531,7 @@ _LOG(_L("CModifierPlugin::FsFileSizeL, pre intercept")); if(extension.CompareF(_L(".size")) == 0) { - _LOG(_L("ModifierPlugin::FsFileSizeL")); + _LOG(_L("CModifierPlugin::FsFileSizeL")); RFilePlugin fileplugin(aRequest); TInt err = fileplugin.AdoptFromClient(); @@ -703,7 +709,7 @@ User::Leave(err); //trapped in DoRequestL err = fsplugin.ReadFileSection(filename, pos, tempBufPtr, length); - _LOG2(_L("CModifierPlugin::FsReadFileSectionL, FileRead returned %d"), err); + _LOG2(_L("CModifierPlugin::FileRead, FileRead returned %d"), err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -711,7 +717,7 @@ err = aRequest.Write(TFsPluginRequest::EData, tempBufPtr); - _LOG2(_L("CModifierPlugin::FsReadFileSectionL, ClientWrite returned %d"), err); + _LOG2(_L("CModifierPlugin::FileRead, ClientWrite returned %d"), err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -841,7 +847,7 @@ //open a second file err = fileplugin2.Open(testfilename1, EFileWrite); - _LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err); + _LOG3(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -895,7 +901,7 @@ iLineNumber = __LINE__; if(err!=KErrNone) User::Leave(err); //trapped in DoRequestL - _LOG2(_L("RFilePlugin::Create returned %d"), err); + _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Create returned %d"), err); //write to the newly created file err = fileplugin.Write(pos, tempBufPtr2); @@ -1071,7 +1077,7 @@ TInt err = fileplugin.Create(filename, mode); - _LOG2(_L("RFilePlugin::Create returned %d"), err); + _LOG2(_L("CModifierPlugin::FsFileCreateL, RFilePlugin::Create returned %d"), err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1178,7 +1184,7 @@ RFilePlugin fileplugin(aRequest); err = fileplugin.Open(filename, mode); - _LOG3(_L("RFilePlugin::Open for %S returned %d"), &filename, err); + _LOG3(_L("CModifierPlugin::FsFileOpenL, RFilePlugin::Open for %S returned %d"), &filename, err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1259,14 +1265,14 @@ TFileName fn; RFilePlugin fileplugin(aRequest); err = fileplugin.Temp(testfilename1, fn, mode); - _LOG2(_L("RFilePlugin::Temp returned %d"), err); + _LOG2(_L("CModifierPlugin::FsFileTempL, RFilePlugin::Temp returned %d"), err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) User::Leave(err); //trapped in DoRequestL err = aRequest.Write(TFsPluginRequest::ENewName, fn); - _LOG2(_L("CModifierPlugin::FsFileReadL, ClientWrite returned %d"), err); + _LOG2(_L("CModifierPlugin::FsFileTempL, ClientWrite returned %d"), err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1352,7 +1358,7 @@ RFilePlugin fileplugin(aRequest); TInt err = fileplugin.Replace(filename, mode); - _LOG2(_L("RFilePlugin::Replace returned %d"), err); + _LOG2(_L("CModifierPlugin::FsFileReplaceL, RFilePlugin::Replace returned %d"), err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1452,16 +1458,16 @@ if(err!=KErrNone) User::Leave(err); //trapped in DoRequestL fsplugin.Close(); - + TBuf<26> temp_wide; temp_wide.Copy(temp); - + iLogging = ETrue; _LOG2(_L("CModifierPlugin::FsReadFileSectionL - wanted to read length = %d\n"),length); _LOG2(_L("CModifierPlugin::FsReadFileSectionL - data read length = %d\n"),temp.Length()); _LOG2(_L("CModifierPlugin::FsReadFileSectionL - data read = %S\n"),&temp_wide); iLogging = EFalse; - + err = aRequest.Write(TFsPluginRequest::EData, temp); _LOG3(_L("CModifierPlugin::FsReadFileSectionL - RFilePlugin::Write for %S returned %d"), &testfilename1, err); @@ -1498,7 +1504,7 @@ RFilePlugin fileplugin2(aRequest); //open a second file err = fileplugin2.Open(testfilename1, EFileWrite); - _LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err); + _LOG3(_L("CModifierPlugin::FsDeleteL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1513,7 +1519,7 @@ //close the second file fileplugin2.Close(); - _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); + _LOG2(_L("CModifierPlugin::FsDeleteL, RFilePlugin::Close to the second file returned %d"), err); } else { @@ -1523,7 +1529,7 @@ RFilePlugin fileplugin2(aRequest); //open a second file err = fileplugin2.Open(testfilename1, EFileWrite); - _LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err); + _LOG3(_L("CModifierPlugin::FsDeleteL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1538,7 +1544,7 @@ //close the second file fileplugin2.Close(); - _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); + _LOG2(_L("CModifierPlugin::FsDeleteL, RFilePlugin::Close to the second file returned %d"), err); RFsPlugin fsplugin(aRequest); err = fsplugin.Connect(); @@ -1605,7 +1611,7 @@ RFilePlugin fileplugin2(aRequest); //open a second file err = fileplugin2.Open(testfilename1, EFileWrite); - _LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err); + _LOG3(_L("CModifierPlugin::FsReplaceL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1620,7 +1626,7 @@ //close the second file fileplugin2.Close(); - _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); + _LOG2(_L("CModifierPlugin::FsReplaceL, RFilePlugin::Close to the second file returned %d"), err); } else { @@ -1628,7 +1634,7 @@ RFilePlugin fileplugin2(aRequest); //open a second file err = fileplugin2.Open(testfilename1, EFileWrite); - _LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err); + _LOG3(_L("CModifierPlugin::FsReplaceL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1643,7 +1649,7 @@ //close the second file fileplugin2.Close(); - _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); + _LOG2(_L("CModifierPlugin::FsReplaceL, FilePlugin::Close to the second file returned %d"), err); _LOG(_L("CModifierPlugin::FsReplaceL, calling RFsPlugin::Replace")); RFsPlugin fsplugin(aRequest); @@ -1704,7 +1710,7 @@ //close the second file fileplugin2.Close(); - _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); + _LOG2(_L("CModifierPlugin::FsRenameL, RFilePlugin::Close to the second file returned %d"), err); } else { @@ -1712,7 +1718,7 @@ RFilePlugin fileplugin2(aRequest); //open a second file fileplugin2.Open(testfilename1, EFileWrite); - _LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err); + _LOG3(_L("CModifierPlugin::FsRenameL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1727,7 +1733,7 @@ //close the second file fileplugin2.Close(); - _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); + _LOG2(_L("CModifierPlugin::FsRenameL, RFilePlugin::Close to the second file returned %d"), err); _LOG(_L("CModifierPlugin::FsRenameL, calling RFsPlugin::Rename")); RFsPlugin fsplugin(aRequest); @@ -1771,7 +1777,7 @@ RFilePlugin fileplugin2(aRequest); //open a second file err = fileplugin2.Open(testfilename1, EFileWrite); - _LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err); + _LOG3(_L("CModifierPlugin::FsEntryL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1786,7 +1792,7 @@ //close the second file fileplugin2.Close(); - _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); + _LOG2(_L("CModifierPlugin::FsEntryL, RFilePlugin::Close to the second file returned %d"), err); } else { @@ -1794,7 +1800,7 @@ RFilePlugin fileplugin2(aRequest); //open a second file err = fileplugin2.Open(testfilename1, EFileWrite); - _LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err); + _LOG3(_L("CModifierPlugin::FsEntryL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1809,7 +1815,7 @@ //close the second file fileplugin2.Close(); - _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); + _LOG2(_L("CModifierPlugin::FsEntryL, RFilePlugin::Close to the second file returned %d"), err); _LOG(_L("CModifierPlugin::FsEntryL, calling RFsPlugin::Entry")); RFsPlugin fsplugin(aRequest); @@ -1842,7 +1848,6 @@ } - void CModifierPlugin::FsSetEntryL(TFsPluginRequest& aRequest) { TInt err = KErrNone; @@ -1856,11 +1861,11 @@ if (aRequest.IsPostOperation()) { - _LOG(_L("CModifierPlugin::FsRenameL, post intercept")); + _LOG(_L("CModifierPlugin::FsSetEntryL, post intercept")); RFilePlugin fileplugin2(aRequest); //open a second file err = fileplugin2.Open(testfilename1, EFileWrite); - _LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err); + _LOG3(_L("CModifierPlugin::FsSetEntryL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1875,7 +1880,7 @@ //close the second file fileplugin2.Close(); - _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); + _LOG2(_L("CModifierPlugin::FsSetEntryL, RFilePlugin::Close to the second file returned %d"), err); } else { @@ -1883,7 +1888,7 @@ RFilePlugin fileplugin2(aRequest); //open a second file err = fileplugin2.Open(testfilename1, EFileWrite); - _LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err); + _LOG3(_L("CModifierPlugin::FsSetEntryL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1898,9 +1903,7 @@ //close the second file fileplugin2.Close(); - _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); - - _LOG(_L("CModifierPlugin::FsSetEntryL, calling RFsPlugin::SetEntry")); + _LOG2(_L("CModifierPlugin::FsSetEntryL, FilePlugin::Close to the second file returned %d"), err); TTime time; TPtr8 t((TUint8*)&time,sizeof(TTime)); @@ -1945,6 +1948,67 @@ } } +/** +@see TestVolume() +*/ +void CModifierPlugin::FsVolumeL(TFsPluginRequest& aRequest) + { + if (aRequest.IsPostOperation()) + { + _LOG(_L("CModifierPlugin::FsVolumeL, post intercept")); + } + else + { + _LOG(_L("CModifierPlugin::FsVolumeL, pre intercept")); + RFsPlugin fsplugin(aRequest); + CleanupClosePushL(fsplugin); + + TInt err = fsplugin.Connect(); + iLastError = err; + iLineNumber = __LINE__; + if(err!=KErrNone) + User::Leave(err); // Trapped in DoRequestL + + TVolumeInfo volInfo; + TInt drive = (TInt)(iDriveToTest - (TChar)'A'); + err = fsplugin.Volume(volInfo,drive); + _LOG3(_L("CModifierPlugin::FsVolumeL, RFsPlugin::Volume(drive %d) returned %d"), drive, err); + iLastError = err; + iLineNumber = __LINE__; + if(err!=KErrNone) + User::Leave(err); // Trapped in DoRequestL + + // Check that the volume label is the same as what was set in t_plugin_v2 + _LIT(KVolumeLabel,"1Volume"); + err = volInfo.iName.Compare(KVolumeLabel); + _LOG2(_L("CModifierPlugin::FsVolumeL, Compare volume label returned %d"), err); + iLastError = err; + iLineNumber = __LINE__; + if(err!=KErrNone) + User::Leave(err); // Trapped in DoRequestL + + // Modify volume name + _LOG2(_L("CModifierPlugin::FsVolumeL, Old volume name = %S"), &volInfo.iName); + TBuf<7> newVolumeName = volInfo.iName; + newVolumeName[0] = '2'; + volInfo.iName = newVolumeName; + _LOG2(_L("CModifierPlugin::FsVolumeL, New volume name = %S"), &volInfo.iName); + + // Send back volume info + TPckgC volInfoPckg(volInfo); + err = aRequest.Write(TFsPluginRequest::EVolumeInfo, volInfoPckg); + iLastError = err; + iLineNumber = __LINE__; + if(err!=KErrNone) + User::Leave(err); // Trapped in DoRequestL + + CleanupStack::PopAndDestroy(); + + // Request processed by plug-in + User::Leave(KErrCompletion); + } + } + /** @internalComponent @@ -1975,7 +2039,7 @@ iLineNumber = __LINE__; if(err!=KErrNone) User::Leave(err); //trapped in DoRequestL - + //setting up test files testfilename1.Append(iDriveToTest); testfilename1.Append(_L(":\\Data2\\")); @@ -2186,7 +2250,7 @@ } case KPluginSetDirFullName: { - //This is necessary as at present we have nwo way of getting the name of + //This is necessary as at present we have no way of getting the name of //a directory! TRAP(err,aRequest.ReadParam1L(dirnamePckg)); break; diff -r 36bfc973b146 -r 329ab0095843 kerneltest/f32test/plugins/version_2/src/premodifier_plugin.cpp --- a/kerneltest/f32test/plugins/version_2/src/premodifier_plugin.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/f32test/plugins/version_2/src/premodifier_plugin.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -962,7 +962,7 @@ //close the second file fileplugin2.Close(); - _LOG2(_L("CPreModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); + _LOG2(_L("CPreModifierPlugin::FsDeleteL, RFilePlugin::Close to the second file returned %d"), err); } else { @@ -1012,7 +1012,7 @@ RFilePlugin fileplugin2(aRequest); //open a second file err = fileplugin2.Open(testfilename1, EFileWrite); - _LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err); + _LOG3(_L("CPreModifierPlugin::FsReplaceL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1027,7 +1027,7 @@ //close the second file fileplugin2.Close(); - _LOG2(_L("CPreModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); + _LOG2(_L("CPreModifierPlugin::FsReplaceL, RFilePlugin::Close to the second file returned %d"), err); } else { @@ -1057,7 +1057,7 @@ RFilePlugin fileplugin2(aRequest); //open a second file err = fileplugin2.Open(testfilename1, EFileWrite); - _LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err); + _LOG3(_L("CPreModifierPlugin::FsRenameL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1072,7 +1072,7 @@ //close the second file fileplugin2.Close(); - _LOG2(_L("CPreModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); + _LOG2(_L("CPreModifierPlugin::FsRenameL, RFilePlugin::Close to the second file returned %d"), err); } else { @@ -1099,7 +1099,7 @@ RFilePlugin fileplugin2(aRequest); //open a second file err = fileplugin2.Open(testfilename1, EFileWrite); - _LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err); + _LOG3(_L("CPreModifierPlugin::FsEntryL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1114,7 +1114,7 @@ //close the second file fileplugin2.Close(); - _LOG2(_L("CPreModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); + _LOG2(_L("CPreModifierPlugin::FsEntryL, RFilePlugin::Close to the second file returned %d"), err); } else { @@ -1136,11 +1136,11 @@ if (aRequest.IsPostOperation()) { - _LOG(_L("CPreModifierPlugin::FsRenameL, post intercept")); + _LOG(_L("CPreModifierPlugin::FsSetEntryL, post intercept")); RFilePlugin fileplugin2(aRequest); //open a second file err = fileplugin2.Open(testfilename1, EFileWrite); - _LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err); + _LOG3(_L("CPreModifierPlugin::FsSetEntryL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) @@ -1155,7 +1155,7 @@ //close the second file fileplugin2.Close(); - _LOG2(_L("CPreModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); + _LOG2(_L("CPreModifierPlugin::FsSetEntryL, RFilePlugin::Close to the second file returned %d"), err); } else { @@ -1206,7 +1206,7 @@ if (aRequest.IsPostOperation()) { - _LOG(_L("CPreModifierPlugin::FsDirReadL, post intercept")); + _LOG(_L("CPreModifierPlugin::FsDirReadOneL, post intercept")); } else { diff -r 36bfc973b146 -r 329ab0095843 kerneltest/f32test/plugins/version_2/src/t_plugin_v2.cpp --- a/kerneltest/f32test/plugins/version_2/src/t_plugin_v2.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/kerneltest/f32test/plugins/version_2/src/t_plugin_v2.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -264,7 +264,7 @@ r = TheFs.MountPlugin(KModifierPluginName,20); if(r==KErrInUse) r = KErrNone; - safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.exe")); + safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); //Use RPlugin to communicate to the plugins which drive they should be @@ -311,11 +311,11 @@ r = rplugin.Open(TheFs,KModifierPos); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); - TRequestStatus aStatus; + TRequestStatus aStatus; rplugin.DoRequest(1,aStatus,drivePckg); User::WaitForRequest(aStatus); rplugin.Close(); - + } //------------------------------------------------------------------------------------------------- //! @SYMTestCaseID KBASE-t_plugin_v2-1336 @@ -349,14 +349,14 @@ { //As the plugin is installed at this point, rather than removing it - //or not mounting it until after, lets disable intercepts - //and enabled them at the end of this function. + //or not mounting it until after, let's disable intercepts + //and enable them at the end of this function. MyRPlugin rplugin; TInt r = rplugin.Open(TheFs,KModifierPos); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); TBool interceptsStatus; TPckg interceptsStatusDes(interceptsStatus); - test.Next(_L("RPlugin: togle itnercepts (Modifier)")); + test.Next(_L("RPlugin: toggle intercepts (Modifier)")); r = rplugin.DoControl(KPluginToggleIntercepts,interceptsStatusDes); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); test.Next(_L("Ensure that intercepts are now disabled")); @@ -368,7 +368,7 @@ r = rplugin.Open(TheFs,KObserverPos); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); - test.Next(_L("RPlugin: togle itnercepts (Observer)")); + test.Next(_L("RPlugin: toggle intercepts (Observer)")); r = rplugin.DoControl(KPluginToggleIntercepts,interceptsStatusDes); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); test.Next(_L("Ensure that intercepts are now disabled")); @@ -412,7 +412,7 @@ r = rplugin.Open(TheFs,KModifierPos); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); - test.Next(_L("RPlugin: togle itnercepts (Observer)")); + test.Next(_L("RPlugin: toggle intercepts (Observer)")); r = rplugin.DoControl(KPluginToggleIntercepts,interceptsStatusDes); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); test.Next(_L("Ensure that intercepts are now enabled")); @@ -424,7 +424,7 @@ r = rplugin.Open(TheFs,KObserverPos); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); - test.Next(_L("RPlugin: togle itnercepts (Observer)")); + test.Next(_L("RPlugin: toggle intercepts (Observer)")); r = rplugin.DoControl(KPluginToggleIntercepts,interceptsStatusDes); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); test.Next(_L("Ensure that intercepts are now enabled")); @@ -557,7 +557,7 @@ safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); TBool interceptsStatus; TPckg interceptsStatusDes(interceptsStatus); - test.Next(_L("RPlugin: togle itnercepts (Modifier)")); + test.Next(_L("RPlugin: toggle intercepts (Modifier)")); r = rplugin.DoControl(KPluginToggleIntercepts,interceptsStatusDes); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); test.Next(_L("Ensure that intercepts are now disabled")); @@ -570,7 +570,7 @@ r = rplugin.Open(TheFs,KObserverPos); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); - test.Next(_L("RPlugin: togle itnercepts (Observer)")); + test.Next(_L("RPlugin: toggle intercepts (Observer)")); r = rplugin.DoControl(KPluginToggleIntercepts,interceptsStatusDes); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); test.Next(_L("Ensure that intercepts are now disabled")); @@ -627,7 +627,7 @@ r = rplugin.Open(TheFs,KModifierPos); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); - test.Next(_L("RPlugin: togle itnercepts (Observer)")); + test.Next(_L("RPlugin: toggle intercepts (Modifier)")); r = rplugin.DoControl(KPluginToggleIntercepts,interceptsStatusDes); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); test.Next(_L("Ensure that intercepts are now enabled")); @@ -639,7 +639,7 @@ r = rplugin.Open(TheFs,KObserverPos); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); - test.Next(_L("RPlugin: togle itnercepts (Observer)")); + test.Next(_L("RPlugin: toggle intercepts (Observer)")); r = rplugin.DoControl(KPluginToggleIntercepts,interceptsStatusDes); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); test.Next(_L("Ensure that intercepts are now enabled")); @@ -1977,7 +1977,7 @@ //if this fails, did you forget to do a \f32test\group\wintest ? plugin_test(test,KDriveZPos,__LINE__,(TText*)Expand("drivez_plugin.cpp")); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); //if this fails, did you forget to do a \f32test\group\wintest ? - file.Close(); + file.Close(); r = file.Replace(TheFs,_L("c:\\drivecplugin.txt"),EFileWrite); plugin_test(test,KDriveCPos,__LINE__,(TText*)Expand("drivec_plugin.cpp")); @@ -2007,7 +2007,7 @@ } //------------------------------------------------------------------------------------------------- -//! @SYMTestCaseID KBASE-t_plugin_v2-1357 +//! @SYMTestCaseID KBASE-t_plugin_v2-1358 //! @SYMTestType CT //! @SYMTestCaseDesc Testing unremovable plugins //! @SYMPREQ REQ8794 @@ -2483,8 +2483,6 @@ safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); - - //Setting up test data TBuf8<20> wbuffer; wbuffer.FillZ(20); @@ -2543,6 +2541,62 @@ safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); } +//------------------------------------------------------------------------------------------------- +//! @SYMTestCaseID KBASE-t_plugin_v2-1359 +//! @SYMTestType CT +//! @SYMTestCaseDesc Test calling RFsPlugin::Volume() +//! +//! @SYMDEF DEF142711: RFsPlugin needs to expose a Volume() API +//! @SYMTestPriority High +//! @SYMTestActions TestVolume() sets the volume label and gets the volume +//! information via the modifier plugin, which will verify +//! that the volume has the correct label and then change it. +//! +//! 1. Set volume label to "MyVolume". +//! 2. Get volume information via modifier plugin. +//! 3. Verify correct volume label after changes by modifier plugin. +//! 4. Reset volume label. +//! +//! @SYMTestExpectedResults 1. Volume label set without any panic. +//! 2. Volume information request completes without any panic. +//! 3. Correct volume label after modification. +//! 4. Volume label reset without any panic. +//! +//! @SYMTestPriority High +//! @SYMTestStatus Implemented +//------------------------------------------------------------------------------------------------- +void TestVolume() + { + test.Next(_L("TestVolume()")); + + TInt theDrive; + TInt r = TheFs.CharToDrive(gDriveToTest,theDrive); + safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); + + // Set volume label to MyVolume so we can test it in the modifier plugin + _LIT(KVolumeLabel1,"1Volume"); + r = TheFs.SetVolumeLabel(KVolumeLabel1,theDrive); + safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); + test.Printf(_L("TestVolume, RFs::SetVolumeLabel returned %d\n"), r); + + test.Printf(_L("TestVolume, Get volume information for drive %d via modifier plugin\n"), theDrive); + TVolumeInfo volInfo; + r = TheFs.Volume(volInfo,theDrive); + test.Printf(_L("TestVolume, RFs::Volume returned %d\n"), r); + plugin_test(test,KModifierPos,__LINE__,(TText*)Expand("modifier_plugin.cpp")); + safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); + + // Check volume name after modification by modifier plugin + _LIT(KVolumeLabel2,"2Volume"); + r = volInfo.iName.Compare(KVolumeLabel2); + test.Printf(_L("TestVolume, Compare volume label returned %d\n"), r); + safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); + + test.Printf(_L("TestVolume, Reset volume label to nothing\n")); + r = TheFs.SetVolumeLabel(_L(""),theDrive); + safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); + } + GLDEF_C void CallTestsL() { @@ -2554,19 +2608,19 @@ TVolumeInfo volInfo; r = TheFs.Volume(volInfo, theDrive); test (r == KErrNone); - + TDriveInfo drvInfo; r = TheFs.Drive(drvInfo,theDrive); test (r == KErrNone); if(drvInfo.iType == EMediaRam || drvInfo.iType == EMediaRom || drvInfo.iMediaAtt == KMediaAttWriteProtected || drvInfo.iMediaAtt == KMediaAttLocked) { + test.Printf(_L("T_PLUGIN_V2 SKIPPED:\n")); test.Printf(_L("Local Buffers are not supported on RAM or ROM drives\n")); if(drvInfo.iMediaAtt == KMediaAttLocked) { test.Printf(_L("This media is locked. Drive %d\n"),theDrive); } - test.Printf(_L("Skipping Test\n")); return; } @@ -2724,7 +2778,10 @@ r = TheFs.Subst(path,drive); safe_test(r,__LINE__,(TText*)Expand("t_plugin_v2.cpp")); - +#ifndef __WINS__ + // RFs::SetVolumeLabel - Does not run on WINS + TestVolume(); +#endif TestReadFileDirect(); TestReadFileViaPlugin(); TestWriteFileDirect(); diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/automounter/automounter.mmp --- a/userlibandfileserver/fileserver/automounter/automounter.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/automounter/automounter.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -32,14 +32,15 @@ SOURCEPATH . DOCUMENT ../group/release.txt USERINCLUDE ../inc +USERINCLUDE ../fs_utils OS_LAYER_SYSTEMINCLUDE_SYMBIAN LIBRARY efile.lib efsrv.lib euser.lib -UID 0 0x100000d6 -VENDORID 0x70000001 +UID 0 0x100000d6 +VENDORID 0x70000001 unpaged diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/bmarm/efileu.def --- a/userlibandfileserver/fileserver/bmarm/efileu.def Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/bmarm/efileu.def Mon Jan 18 21:31:10 2010 +0200 @@ -239,4 +239,5 @@ InitL__8CMountCBR6TDriveP11CFileSystem @ 238 NONAME R3UNUSED ; CMountCB::InitL(TDrive &, CFileSystem *) DriveInfo__C11CFileSystemR10TDriveInfoi @ 239 NONAME R3UNUSED ; CFileSystem::DriveInfo(TDriveInfo &, int) const GetDriveInfo__FR10TDriveInfoi @ 240 NONAME R3UNUSED ; GetDriveInfo(TDriveInfo &, int) + Volume__C9RFsPluginR11TVolumeInfoi @ 241 NONAME R3UNUSED ; RFsPlugin::Volume(TVolumeInfo &, int) const diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/bwins/efileu.def --- a/userlibandfileserver/fileserver/bwins/efileu.def Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/bwins/efileu.def Mon Jan 18 21:31:10 2010 +0200 @@ -240,4 +240,4 @@ ?InitL@CMountCB@@QAEXAAVTDrive@@PAVCFileSystem@@@Z @ 239 NONAME ; public: void __thiscall CMountCB::InitL(class TDrive &,class CFileSystem *) ?DriveInfo@CFileSystem@@UBEXAAVTDriveInfo@@H@Z @ 240 NONAME ; void CFileSystem::DriveInfo(class TDriveInfo &, int) const ?GetDriveInfo@@YAXAAVTDriveInfo@@H@Z @ 241 NONAME ; void GetDriveInfo(class TDriveInfo &, int) - + ?Volume@RFsPlugin@@QBEHAAVTVolumeInfo@@H@Z @ 242 NONAME ; int RFsPlugin::Volume(class TVolumeInfo &, int) const diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/bx86/efileu.def --- a/userlibandfileserver/fileserver/bx86/efileu.def Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/bx86/efileu.def Mon Jan 18 21:31:10 2010 +0200 @@ -240,4 +240,4 @@ ?InitL@CMountCB@@QAEXAAVTDrive@@PAVCFileSystem@@@Z @ 239 NONAME ; public: void __thiscall CMountCB::InitL(class TDrive &,class CFileSystem *) ?DriveInfo@CFileSystem@@UBEXAAVTDriveInfo@@H@Z @ 240 NONAME ; public: virtual void __thiscall CFileSystem::DriveInfo(class TDriveInfo &,int)const ?GetDriveInfo@@YAXAAVTDriveInfo@@H@Z @ 241 NONAME ; void __cdecl GetDriveInfo(class TDriveInfo &,int) - + ?Volume@RFsPlugin@@QBEHAAVTVolumeInfo@@H@Z @ 242 NONAME ; public: int __thiscall RFsPlugin::Volume(class TVolumeInfo &,int)const diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/eabi/efileu.def --- a/userlibandfileserver/fileserver/eabi/efileu.def Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/eabi/efileu.def Mon Jan 18 21:31:10 2010 +0200 @@ -312,4 +312,4 @@ _ZN8CMountCB5InitLER6TDriveP11CFileSystem @ 311 NONAME _Z12GetDriveInfoR10TDriveInfoi @ 312 NONAME _ZNK11CFileSystem9DriveInfoER10TDriveInfoi @ 313 NONAME - + _ZNK9RFsPlugin6VolumeER11TVolumeInfoi @ 314 NONAME diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/fs_utils/bit_vector.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/fs_utils/bit_vector.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,883 @@ +// Copyright (c) 1995-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: +// +// Collection of common constants, utility functions, etc. for the file server and file systems. +// Definitions here must be filesystem-agnostic, i.e. generic enougs to be used by every file system +// +// This is the internal file and must not be exported. + +/** + @file + @internalTechnology +*/ + +#include "bit_vector.h" + + +//####################################################################################################################################### +//# RBitVector class implementation +//####################################################################################################################################### + +const TUint32 K_FFFF = 0xFFFFFFFF; //-- all one bits, beware rigth shifts of signed integers! + +RBitVector::RBitVector() + :iNumBits(0), ipData(NULL), iNumWords(0) + { + } + + +RBitVector::~RBitVector() + { + Close(); + } + +/** + Panics. + @param aPanicCode a panic code +*/ +void RBitVector::Panic(TPanicCode aPanicCode) const + { + _LIT(KPanicCat,"RBitVector"); + User::Panic(KPanicCat, aPanicCode); + } + +/** explicitly closes the object and deallocates memory */ +void RBitVector::Close() + { + iNumBits = 0; + iNumWords =0; + User::Free(ipData); + ipData = NULL; + } + +//----------------------------------------------------------------------------- + +/** + Comparison perator. + @param aRhs a vector to compate with. + @panic ESizeMismatch in the case of different vector sizes +*/ +TBool RBitVector::operator==(const RBitVector& aRhs) const + { + __ASSERT_ALWAYS(ipData, Panic(ENotInitialised)); + __ASSERT_ALWAYS(iNumBits == aRhs.iNumBits, Panic(ESizeMismatch)); + + + if(!iNumBits) + return ETrue; //-- comparing 0-lenght arrays + + if(this == &aRhs) + {//-- comparing with itself, potential source of errors + ASSERT(0); + return ETrue; + } + + if(iNumWords >= 1) + { + const TUint32 cntBytes = (iNumBits >> 5) << 2; //-- bytes to compare + if(memcompare((const TUint8*)ipData, cntBytes, (const TUint8*)aRhs.ipData, cntBytes)) + return EFalse; + } + + const TUint32 bitsRest = iNumBits & 0x1F; + if(bitsRest) + { + const TUint32 mask = K_FFFF >> (32-bitsRest); + return ( (ipData[iNumWords-1] & mask) == (aRhs.ipData[iNumWords-1] & mask) ); + } + + return ETrue; + } + +TBool RBitVector::operator!=(const RBitVector& aRhs) const + { + return ! ((*this) == aRhs); + } + +//----------------------------------------------------------------------------- + +/** The same as Create(), but leaves on error */ +void RBitVector::CreateL(TUint32 aNumBits) + { + User::LeaveIfError(Create(aNumBits)); + } + + +/** + Create the vector with the size of aNumBits bits. + @return system-wide error codes: + KErrNoMemory unable to allocate sufficient amount of memory for the array + KErrInUse an attempt to call Create() for non-empty vector. Close it first. + KErrArgument invalid aNumBits value == 0 +*/ +TInt RBitVector::Create(TUint32 aNumBits) + { + + if(ipData) + return KErrInUse; //-- array is already in use. Close it first. + + if(!aNumBits) + return KErrArgument; + + //-- memory is allocated by word (32 bit) quiantities + const TUint32 numWords = (aNumBits >> 5) + ((aNumBits & 0x1F) > 0 ? 1:0); + ipData = (TUint32*)User::AllocZ(numWords << 2); + + if(!ipData) + return KErrNoMemory; + + iNumBits = aNumBits; + iNumWords = numWords; + + return KErrNone; + } + + +/** + Fill a bit vector with a given bit value + @param aVal a bit value +*/ +void RBitVector::Fill(TBool aVal) + { + __ASSERT_ALWAYS(ipData, Panic(ENotInitialised)); + memset(ipData, (aVal ? 0xFF : 0x00), iNumWords << 2); + } + +/** Invert all bits in a bit vector */ +void RBitVector::Invert() +{ + __ASSERT_ALWAYS(ipData, Panic(ENotInitialised)); + for(TUint32 i=0; i aIndexTo) + { + const TUint32 tmp = aIndexFrom; + aIndexFrom = aIndexTo; + aIndexTo = tmp; + } + + __ASSERT_ALWAYS((aIndexFrom < iNumBits) && (aIndexTo < iNumBits), Panic(EIndexOutOfRange)); + + const TUint32 wordStart = WordNum(aIndexFrom); + const TUint32 wordTo = WordNum(aIndexTo); + + if(aVal) + {//-- filling a range with '1' + + TUint32 shift = BitInWord(aIndexFrom); + const TUint32 mask1 = (K_FFFF >> shift) << shift; + + TUint32 mask2 = K_FFFF; + shift = 1+BitInWord(aIndexTo); + if(shift < 32) + { + mask2 = ~((mask2 >> shift) << shift); + } + + if(wordTo == wordStart) + {//-- a special case, filling is in the same word + ipData[wordStart] |= (mask1 & mask2); + } + else + { + ipData[wordStart] |= mask1; + ipData[wordTo] |= mask2; + + const TUint32 wholeWordsBetween = wordTo - wordStart - 1; //-- whole words that can be bulk filled + + if(wholeWordsBetween) + memset(ipData+wordStart+1, 0xFF, wholeWordsBetween << 2); + + } + } + else + {//-- filling a range with '0' + + TUint32 shift = BitInWord(aIndexFrom); + const TUint32 mask1 = ~((K_FFFF >> shift) << shift); + + TUint32 mask2 = 0; + shift = 1+BitInWord(aIndexTo); + if(shift < 32) + { + mask2 = ((K_FFFF >> shift) << shift); + } + + if(wordTo == wordStart) + {//-- a special case, filling is in the same word + ipData[wordStart] &= (mask1 | mask2); + } + else + { + ipData[wordStart] &= mask1; + ipData[wordTo] &= mask2; + + const TUint32 wholeWordsBetween = wordTo - wordStart - 1; //-- whole words that can be bulk filled + + if(wholeWordsBetween) + memset(ipData+wordStart+1, 0x00, wholeWordsBetween << 2); + + } + } + + } + +//----------------------------------------------------------------------------- + +/** + Search for a specified bit value ('0' or '1') in the vector from the given position. + @param aStartPos zero-based index; from this position the search will start. This position isn't included to the search. + On return may contain a new position if the specified bit is found in specified direction. + @param aBitVal zero or non-zero bit to search. + @param aDir Specifies the search direction + + @return ETrue if the specified bit value is found; aStartPos gets updated. + EFalse otherwise. + +*/ +TBool RBitVector::Find(TUint32& aStartPos, TBool aBitVal, TFindDirection aDir) const + { + __ASSERT_ALWAYS(aStartPos < iNumBits, Panic(EIndexOutOfRange)); + ASSERT(iNumWords && ipData); + + switch(aDir) + { + case ERight: //-- Search from the given position to the right + return FindToRight(aStartPos, aBitVal); + + case ELeft: //-- Search from the given position to the left (towards lower index) + return FindToLeft(aStartPos, aBitVal); + + case ENearestL: //-- Search for the nearest value in both directions starting from left + return FindNearest(aStartPos, aBitVal, ETrue); + + case ENearestR: //-- Search for the nearest value in both directions starting from right + return FindNearest(aStartPos, aBitVal, EFalse); + + default: + Panic(EWrondFindDirection); + return EFalse; + + }; + + } + +//----------------------------------------------------------------------------- +/** + Internal method to look for a given bit value in the right direction. + see TBool RBitVector::Find(...) +*/ +TBool RBitVector::FindToRight(TUint32& aStartPos, TBool aBitVal) const + { + if(aStartPos >= iNumBits-1) + return EFalse; //-- no way to the right + + const TUint32 startPos = aStartPos+1; + const TUint32 fInvert = aBitVal ? 0 : K_FFFF; //-- invert everything if we are looking for '0' bit + + TUint32 wordNum = WordNum(startPos); + TUint32 val = ipData[wordNum] ^ fInvert; + + if(wordNum == iNumWords-1) + {//-- process the last word in the array, some higher bits might not belong to the bit vector + val = MaskLastWord(val); + } + + const TUint32 shift = BitInWord(startPos); + val = (val >> shift) << shift; //-- mask unused low bits + + if(val) + {//-- there are '1' bits in the current word + goto found; + } + else + {//-- search in higher words + wordNum++; + + while(iNumWords-wordNum > 1) + { + val = ipData[wordNum] ^ fInvert; + if(val) + goto found; + + wordNum++; + } + + if(wordNum == iNumWords-1) + {//-- process the last word in the array, some higher bith might not belong to the bit vector + val = ipData[wordNum] ^ fInvert; + val = MaskLastWord(val); + + if(val) + goto found; + } + } + + return EFalse; //-- haven't found anything + + found: + + val &= (~val+1); //-- select rightmost bit + aStartPos = (wordNum << 5)+Log2(val); + return ETrue; + } + + +//----------------------------------------------------------------------------- + +/** + Internal method to look for a given bit value in the left direction. + see TBool RBitVector::Find(...) +*/ +TBool RBitVector::FindToLeft(TUint32& aStartPos, TBool aBitVal) const +{ + if(!aStartPos) + return EFalse; //-- no way to the left + + const TUint32 startPos=aStartPos-1; + const TUint32 fInvert = aBitVal ? 0 : K_FFFF; //-- invert everything if we are looking for '0' bit + + TUint32 wordNum = WordNum(startPos); + TUint32 val = ipData[wordNum] ^ fInvert; + + const TUint32 shift = 31-(BitInWord(startPos)); + val = (val << shift) >> shift; //-- mask unused high bits + + if(val) + {//-- there are '1' bits in the current word + goto found; + } + else + {//-- search in the lower words + while(wordNum) + { + wordNum--; + val=ipData[wordNum] ^ fInvert; + if(val) + goto found; + } + } + + return EFalse; //-- nothing found + + found: + aStartPos = (wordNum << 5)+Log2(val); + return ETrue; +} + +//----------------------------------------------------------------------------- + +/** + Internal method to look for a given bit value in the both directions. + see TBool RBitVector::Find(...) +*/ +TBool RBitVector::FindNearest(TUint32& aStartPos, TBool aBitVal, TBool aToLeft) const +{ + if(iNumBits < 2) + return EFalse; + + if(aStartPos == 0) + return FindToRight(aStartPos, aBitVal); + + if(aStartPos == iNumBits-1) + return FindToLeft(aStartPos, aBitVal); + + + const TUint32 fInvert = aBitVal ? 0 : K_FFFF; //-- invert everything if we are looking for '0' bit + + TUint32 wordNum = WordNum(aStartPos); + TUint32 l_Idx; //-- index of the word to the left + TUint32 r_Idx; //-- index of the word to the right + + l_Idx = r_Idx = wordNum; + + TBool noWayLeft = (wordNum == 0); //-- if we are in the first word + TBool noWayRight = (wordNum == iNumWords-1); //-- if we are in the last word + + //-- look in the current word first + TUint32 val = ipData[wordNum] ^ fInvert; + + if(noWayRight) + { //-- this is the last word in the array, mask unused high bits in the last word + val = MaskLastWord(val); + } + + const TUint32 bitPos = aStartPos & 0x1F; + val &= ~(1<> shift1; //-- towards lower bits + + const TUint32 shift2 = bitPos+1; + const TUint32 partHi = (val >> shift2) << shift2; //-- towards higher bits + + + if(partLo && !partHi) //-- only lower part has '1' bits + { + aStartPos = (wordNum << 5)+Log2(partLo); + return ETrue; + } + else if(!partLo && partHi) //-- only higher part has '1' bits + { + aStartPos = (wordNum << 5)+Log2( (partHi & (~partHi+1)) ); + return ETrue; + } + else if(partLo && partHi) //-- both parts contain '1' bits, select the nearest one + { + const TUint32 posL = (wordNum << 5)+Log2(partLo); + const TUint32 posR = (wordNum << 5)+Log2( (partHi & (~partHi+1)) ); + + ASSERT(aStartPos > posL); + ASSERT(posR > aStartPos); + const TUint32 distL = aStartPos-posL; + const TUint32 distR = posR-aStartPos; + + if(distL < distR) + { + aStartPos = posL; + return ETrue; + } + else if(distL > distR) + { + aStartPos = posR; + return ETrue; + } + else + {//-- distL == distR, take into account search priority + aStartPos = aToLeft ? posL : posR; + return ETrue; + } + } + else //-- (!partLo && !partHi), nothing in the current word + { + ASSERT(0); + } + + }// if(bitPos > 0 && bitPos < 31) + + //-- now we are processing separate words from both sides of the search position + for(;;) + { + TUint32 wL = ipData[l_Idx] ^ fInvert; + TUint32 wR = ipData[r_Idx] ^ fInvert; + if(r_Idx == iNumWords-1) + { //-- this is the last word in the array, mask unused high bits in the last word + wR = MaskLastWord(wR); + } + + if(wL && !wR) + { + aStartPos = (l_Idx << 5)+Log2(wL); + return ETrue; + } + else if(!wL && wR) + { + aStartPos = (r_Idx << 5)+Log2( (wR & (~wR+1)) ); + return ETrue; + } + else if(wL && wR) + { + const TUint32 posL = (l_Idx << 5)+Log2(wL); + const TUint32 posR = (r_Idx << 5)+Log2( (wR & (~wR+1)) ); + + ASSERT(aStartPos > posL); + ASSERT(posR > aStartPos); + const TUint32 distL = aStartPos-posL; + const TUint32 distR = posR-aStartPos; + + if(distL < distR) + { + aStartPos = posL; + return ETrue; + } + else if(distL > distR) + { + aStartPos = posR; + return ETrue; + } + else + {//-- distL == distR, take into account search priority + aStartPos = aToLeft ? posL : posR; + return ETrue; + } + + }//else if(wL && wR) + + + if(noWayLeft) + { + aStartPos = r_Idx << 5; + return FindToRight(aStartPos, aBitVal); + } + else + { + noWayLeft = ItrLeft(l_Idx); + } + + if(noWayRight) + { + aStartPos = l_Idx << 5; + return FindToLeft(aStartPos, aBitVal); + } + else + { + noWayRight = ItrRight(r_Idx); + } + + }//for(;;) + + //return EFalse; +} + +//----------------------------------------------------------------------------- +/** + Find out if two vectors are different. + + @param aRhs vector to compare with + @param aDiffIndex if there is a differene, here will be the number of the first different bit + @return ETrue if vectors differ, EFalse, if they are identical. +*/ +TBool RBitVector::Diff(const RBitVector& aRhs, TUint32& aDiffIndex) const +{ + __ASSERT_ALWAYS(ipData, Panic(ENotInitialised)); + __ASSERT_ALWAYS(iNumBits == aRhs.iNumBits, Panic(ESizeMismatch)); + ASSERT(iNumWords > 0); + + TUint32 diffWord=0; + TUint32 wordNum=0; + + //-- compare all but the last word in the array + for(wordNum=0; wordNum < iNumWords-1; ++wordNum) + { + diffWord = ipData[wordNum] ^ aRhs.ipData[wordNum]; + if(diffWord) + break; //-- found difference + } + + //-- process the last word in the array + if(!diffWord) + { + diffWord = MaskLastWord(ipData[wordNum]) ^ MaskLastWord(aRhs.ipData[wordNum]); + } + + if(!diffWord) + return EFalse; //-- vectors are the same + + //-- calculate the position of the bit that different. + diffWord &= (~diffWord+1); //-- select rightmost bit + aDiffIndex = (wordNum << 5)+Log2(diffWord); + + return ETrue; +} + +//----------------------------------------------------------------------------- + +/** + Iterate to the left (towards lower index) in the array of words ipData + + @param aIdx index within ipData array to be decremented; if it's possible to move left, it will be decreased + @return ETrue if there is no way left i.e. aIdx is 0. EFalse otherwise and aIdx decreased. +*/ +TBool RBitVector::ItrLeft(TUint32& aIdx) const +{ + if(aIdx == 0) + return ETrue; + else + { + aIdx--; + return EFalse; + } +} + +//----------------------------------------------------------------------------- + +/** + Iterate to the right (towards higher index) in the array of words ipData + + @param aIdx index within ipData array to be incremented; if it's possible to move right, it will be increased + @return ETrue if there is no way right i.e. aIdx corresponds to the last word. EFalse otherwise and aIdx increased. +*/ +TBool RBitVector::ItrRight(TUint32& aIdx) const +{ + if(aIdx < iNumWords-1) + { + aIdx++; + return EFalse; + } + else + return ETrue; +} + +//----------------------------------------------------------------------------- + +/** + Import data to the internal bit vector representation. + Just replaces number of bytes from apData to the ipData. + + @param aStartBit starting bit number. Must have 8-bit alignment. + @param aNumBits number of bits to import; granularity: 1 bit, i.e. it can be 177, for example. + @param apData pointer to the data (bitstream) to import. + +*/ +void RBitVector::DoImportData(TUint32 aStartBit, TUint32 aNumBits, const TAny* apData) +{ + ASSERT(aNumBits); + __ASSERT_ALWAYS(ipData, Panic(ENotInitialised)); + + //-- check parameters granularity. aStartBit must have 8-bit alignment + __ASSERT_ALWAYS(!(aStartBit & 0x07), Panic(EDataAlignment)); + + + __ASSERT_ALWAYS(iNumWords && (aStartBit+aNumBits <= iNumBits), Panic(EIndexOutOfRange)); + + const TUint bitsTail = aNumBits & 0x07; + const TUint32 nBytes = aNumBits >> 3; + + if(nBytes) + {//-- copy full array of bytes + const TUint32 startByte = aStartBit >> 3; + Mem::Copy(((TUint8*)ipData) + startByte, apData, nBytes); + } + + if(bitsTail) + {//-- we need to copy trailing bits from the input data to the corresponding byte of the internal array + const TUint8 mask = (TUint8)(0xFF >> (8-bitsTail)); + const TUint8 orMask = (TUint8)( *((const TUint8*)apData + nBytes) & mask); + const TUint8 andMask= (TUint8)~mask; + + TUint8* pbData = (TUint8*)ipData + nBytes; + *pbData &= andMask; + *pbData |= orMask; + } + +} + +//----------------------------------------------------------------------------- + +/** + Export data from the internal bit vector buffer to the external one. + + @param aStartBit starting bit number. Must have 8-bit alignment. + @param aNumBits number of bits to export, must comprise the whole byte, i.e. be multiple of 8. + The client is responsible for masking extra bits it doesn't need. + Another implication: e.g. if the bitvector consists of 3 bits, this value must be 8. + The value of bits 3-7 in the aData[0] will be undefined. + + @param aData destination data descriptor +*/ +void RBitVector::DoExportData(TUint32 aStartBit, TUint32 aNumBits, TDes8& aData) const +{ + ASSERT(aNumBits); + __ASSERT_ALWAYS(ipData, Panic(ENotInitialised)); + + //-- check parameters granularity. + __ASSERT_ALWAYS(!(aStartBit & 0x07), Panic(EDataAlignment)); //-- aStartBit must have 8-bit alignment + __ASSERT_ALWAYS(!(aNumBits & 0x07), Panic(EDataAlignment)); //-- number of bits shall comprise a byte + + __ASSERT_ALWAYS(iNumWords && (aStartBit+aNumBits <= (iNumWords << (KBitsInByteLog2+sizeof(TUint32))) ), Panic(EIndexOutOfRange)); + + const TUint32 nBytes = aNumBits >> 3; + const TUint32 startByte = aStartBit >> 3; + + aData.SetLength(nBytes); + aData.Copy(((const TUint8*)ipData) + startByte, nBytes); +} + +//----------------------------------------------------------------------------- + +/** + @return number of bits set to '1' in the vector +*/ +TUint32 RBitVector::Num1Bits() const +{ + __ASSERT_ALWAYS(ipData, Panic(ENotInitialised)); + if(!iNumBits) + return 0; + + TUint32 cntBits = 0; + + TUint32 wordNum; + for(wordNum=0; wordNum < iNumWords-1; ++wordNum) + { + cntBits += Count1Bits(ipData[wordNum]); + } + + //-- process the last word, it shall be masked + cntBits += Count1Bits(MaskLastWord(ipData[wordNum])); + + return cntBits; +} + +//----------------------------------------------------------------------------- +/** + @return number of bits set to '0' in the vector +*/ +TUint32 RBitVector::Num0Bits() const +{ + return iNumBits - Num1Bits(); +} + + +//----------------------------------------------------------------------------- +/** + Calculate number of '1' bits in the range from aIndexFrom to aIndexTo inclusively + + @param aIndexFrom starting index; bit[aIndexFrom] is included to the search + @param aIndexTo ending index; bit[aIndexTo] is included to the search + @return number of bits set to '1' in the slice +*/ +TUint32 RBitVector::Num1Bits(TUint32 aIndexFrom, TUint32 aIndexTo) const +{ + __ASSERT_ALWAYS(ipData, Panic(ENotInitialised)); + __ASSERT_ALWAYS(aIndexTo < iNumBits && aIndexFrom <= aIndexTo, Panic(EIndexOutOfRange)); + + const TUint32 wordFrom = WordNum(aIndexFrom); //?const + const TUint32 wordTo = WordNum(aIndexTo); + + if(wordFrom == wordTo) + {//-- the same word + TUint32 word = ipData[wordFrom]; + + const TUint32 shMaskR = BitInWord(aIndexFrom); + word >>= shMaskR; word <<= shMaskR; //-- zero low bits + + const TUint32 shMaskL = 31-BitInWord(aIndexTo); + word <<= shMaskL; //-- zero high bits + + return Count1Bits(word); + } + + TUint32 bitsCnt = 0; + TUint32 wordsBetween = wordTo - wordFrom - 1; + + //-- count '1' bits in the termial words + TUint32 word = ipData[wordFrom]; + const TUint32 shMaskR = BitInWord(aIndexFrom); + word >>= shMaskR; //-- zero low bits + bitsCnt += Count1Bits(word); + + word = ipData[wordTo]; + const TUint32 shMaskL = 31-BitInWord(aIndexTo); + word <<= shMaskL; //-- zero high bits + bitsCnt += Count1Bits(word); + + //-- count '1' bits in the words between terminal ones + TUint32 wordIdx = wordFrom+1; + while(wordsBetween--) + { + bitsCnt += Count1Bits(ipData[wordIdx]); + } + + + return bitsCnt; +} + + + + + + + + + + + + + + + + + + + + + + diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/fs_utils/bit_vector.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/fs_utils/bit_vector.h Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,251 @@ +// Copyright (c) 1995-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: +// +// Collection of common constants, utility functions, etc. for the file server and file systems. +// Definitions here must be filesystem-agnostic, i.e. generic enougs to be used by every file system +// +// This is the internal file and must not be exported. + +/** + @file + @internalTechnology +*/ + +#if !defined(__FILESYSTEM_UTILS_BIT_VECTOR__) +#define __FILESYSTEM_UTILS_BIT_VECTOR__ + +#if !defined(__FILESYSTEM_UTILS_H__) +#include "filesystem_utils.h" +#endif + + +//####################################################################################################################################### + +/** + This class represents a bit vector i.e. an array of bits. Vector size can be from 1 to 2^32 bits. + This class can be created on a stack (but needs to be placed into cleanup stack) or in a heap with the help of its factory methods Create/CreateL +*/ +class RBitVector + { + public: + + RBitVector(); //-- Creates an empty vector. see Create() methods for memory allocation + ~RBitVector(); + + void Close(); + + TInt Create(TUint32 aNumBits); + void CreateL(TUint32 aNumBits); + + inline TUint32 Size() const; + + //-- single bit manipulation methods + inline TBool operator[](TUint32 aIndex) const; + inline void SetBit(TUint32 aIndex); + inline void ResetBit(TUint32 aIndex); + inline void InvertBit(TUint32 aIndex); + inline void SetBitVal(TUint32 aIndex, TBool aVal); + + void Fill(TBool aVal); + void Fill(TUint32 aIndexFrom, TUint32 aIndexTo, TBool aVal); + + void Invert(); + + TBool operator==(const RBitVector& aRhs) const; + TBool operator!=(const RBitVector& aRhs) const; + + //-- logical operations between 2 vectors. + void And(const RBitVector& aRhs); + void Or (const RBitVector& aRhs); + void Xor(const RBitVector& aRhs); + + TBool Diff(const RBitVector& aRhs, TUint32& aDiffIndex) const; + + TUint32 Num1Bits() const; + TUint32 Num1Bits(TUint32 aIndexFrom, TUint32 aIndexTo) const; + + TUint32 Num0Bits() const; + + + /** Bit search specifiers */ + enum TFindDirection + { + ELeft, ///< Search from the given position to the left (towards lower index) + ERight, ///< Search from the given position to the right (towards higher index) + ENearestL, ///< Search in both directions starting from the given position; in the case of the equal distances return the position to the left + ENearestR ///< Search in both directions starting from the given position; in the case of the equal distances return the position to the right + + //-- N.B the current position the search starts with isn't included to the search. + }; + + TBool Find(TUint32& aStartPos, TBool aBitVal, TFindDirection aDir) const; + + /** panic codes */ + enum TPanicCode + { + EIndexOutOfRange, ///< index out of range + EWrondFindDirection, ///< a value doesn't belong to TFindDirection + ESizeMismatch, ///< Size mismatch for binary operators + ENotInitialised, ///< No memory allocated for the array + ENotImplemented, ///< functionality isn't implemented + + EDataAlignment, ///< wrong data alignment when importing / exporting raw data + }; + + protected: + + //-- these are outlawed. Can't use them because memory allocator can leave and we don't have conthrol on it in these methods. + RBitVector(const RBitVector& aRhs); + RBitVector& operator=(const RBitVector& aRhs); + + void* operator new(TUint); //-- disable creating objects on heap. + void* operator new(TUint, void*); + //------------------------------------- + + + void Panic(TPanicCode aPanicCode) const; + + inline TUint32 WordNum(TUint32 aBitPos) const; + inline TUint32 BitInWord(TUint32 aBitPos) const; + + protected: + //-- special interface to acecess raw internal data. It's protected. Derive appropriate class from this one if you wan to use it + void DoImportData(TUint32 aStartBit, TUint32 aNumBits, const TAny* apData); + void DoExportData(TUint32 aStartBit, TUint32 aNumBits, TDes8& aData) const; + + + private: + TBool FindToRight(TUint32& aStartPos, TBool aBitVal) const; + TBool FindToLeft (TUint32& aStartPos, TBool aBitVal) const; + TBool FindNearest(TUint32& aStartPos, TBool aBitVal, TBool aToLeft) const; + + inline TUint32 MaskLastWord(TUint32 aVal) const; + inline TBool ItrLeft(TUint32& aIdx) const; + inline TBool ItrRight(TUint32& aIdx) const; + + + protected: + + TUint32 iNumBits; ///< number of bits in the vector + TUint32* ipData; ///< pointer to the data + TUint32 iNumWords;///< number of 32-bit words that store bits + }; + + +//####################################################################################################################################### +//# inline functions area +//####################################################################################################################################### + + +//--------------------------------------------------------------------------------------------------------------------------------- +//-- class RBitVector + +/** @return size of the vector (number of bits) */ +inline TUint32 RBitVector::Size() const + { + return iNumBits; + } + +/** + Get a bit by index + + @param aIndex index in a bit vector + @return 0 if the bit at pos aIndex is 0, not zero otherwise + @panic EIndexOutOfRange if aIndex is out of range +*/ +inline TBool RBitVector::operator[](TUint32 aIndex) const + { + __ASSERT_ALWAYS(aIndex < iNumBits, Panic(EIndexOutOfRange)); + return (ipData[WordNum(aIndex)] & (1<> shift; //-- mask unused high bits + } + +inline TUint32 RBitVector::WordNum(TUint32 aBitPos) const + { + return aBitPos >> 5; + } + +inline TUint32 RBitVector::BitInWord(TUint32 aBitPos) const + { + return aBitPos & 0x1F; + } + + + +#endif //__FILESYSTEM_UTILS_BIT_VECTOR__ + + + + + + + + + + + + + diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/fs_utils/filesystem_utils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/fs_utils/filesystem_utils.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,91 @@ +// Copyright (c) 1995-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: +// +// Collection of common constants, utility functions, etc. for the file server and file systems. +// Definitions here must be filesystem-agnostic, i.e. generic enougs to be used by every file system +// +// This is the internal file and must not be exported. + +/** + @file + @internalTechnology +*/ + +#include "filesystem_utils.h" + +//----------------------------------------------------------------------------- + +/** + Calculates the log2 of a number + + @param aNum Number to calulate the log two of + @return The log two of the number passed in +*/ +TUint32 Log2(TUint32 aVal) + { + return Log2_inline(aVal); + } + +//----------------------------------------------------------------------------- +/** + Calculates number of '1' bits in the aVal + + @param aVal some value + @return number of '1' bits in the aVal +*/ +TUint32 Count1Bits(TUint32 aVal) + { + return Count1Bits_inline(aVal); + } + +//----------------------------------------------------------------------------- +/** + Removes trailing dots from aName. + @return new string descriptor that may have its length adjusted +*/ +TPtrC RemoveTrailingDots(const TDesC& aName) + { + TInt len = aName.Length(); + + while(len > 0) + { + if(aName[len-1] == '.') + len--; + else + break; + } + + TPtrC ptrNoDots(aName.Ptr(), len); + return ptrNoDots; + } + + + + + + + + + + + + + + + + + + + + diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/fs_utils/filesystem_utils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/fs_utils/filesystem_utils.h Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,118 @@ +// Copyright (c) 1995-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: +// +// Collection of common constants, utility functions, etc. for the file server and file systems. +// Definitions here must be filesystem-agnostic, i.e. generic enougs to be used by every file system +// +// This is the internal file and must not be exported. + +/** + @file + @internalTechnology +*/ + +#if !defined(__FILESYSTEM_UTILS_H__) +#define __FILESYSTEM_UTILS_H__ + +#if !defined(__E32BASE_H__) +#include +#endif + +//####################################################################################################################################### +//# constants definitions +//####################################################################################################################################### + +const TUint KBitsInByteLog2 = 3; +const TUint KBitsInByte = 1< "Name" + + +//####################################################################################################################################### +/** + A class representing a simple abstraction of the 32 bit flags +*/ +class T32Bits +{ + public: + T32Bits() : iData(0) {} + + inline void Clear(); + inline TBool HasBitsSet() const; + inline void SetBit(TUint32 aIndex); + inline TBool operator[](TUint32 aIndex) const; + + private: + TUint32 iData; ///< 32 bits data +}; + + + + + + +#include "filesystem_utils.inl" + + +#endif //__FILESYSTEM_UTILS_H__ + + + + + + + + + + + + diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/fs_utils/filesystem_utils.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/fs_utils/filesystem_utils.inl Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,239 @@ +// Copyright (c) 1995-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: +// + +/** + @file + @internalTechnology +*/ + +#if !defined(__FILESYSTEM_UTILS_INL__) +#define __FILESYSTEM_UTILS_INL__ + + +//----------------------------------------------------------------------------- +/** @return 2^aVal */ +inline TUint32 Pow2(TUint32 aVal) + { + ASSERT(aVal<32); + return 1 << aVal; + } + +//----------------------------------------------------------------------------- +/** @return TUint32 value equals 2^aVal */ +inline TUint32 Pow2_32(TUint32 aVal) + { + ASSERT(aVal < 32); + return 1 << aVal; + } + +//----------------------------------------------------------------------------- +/** @return TUint64 value equals 2^aVal */ +inline TUint64 Pow2_64(TUint32 aVal) + { + ASSERT(aVal < 64); + return ((TUint64)1) << aVal; + } + +//----------------------------------------------------------------------------- +/** + Indicates if a number passed in is a power of two + @return ETrue if aVal is a power of 2 +*/ +inline TBool IsPowerOf2(TUint32 aVal) + { + if (aVal==0) + return EFalse; + + return !(aVal & (aVal-1)); + } + +//----------------------------------------------------------------------------- +/** + Indicates if a number passed in is a power of two + @return ETrue if aVal is a power of 2 +*/ +inline TBool IsPowerOf2_64(TUint64 aVal) + { + if (aVal==0) + return EFalse; + + return !(aVal & (aVal-1)); + + } + +//----------------------------------------------------------------------------- + +/** + rounds down the given value to 2^aGranularityLog2 + @param aVal input value to round down + @param aGranularityLog2 Log2(granularity) + @return rounded - down value +*/ +inline TUint32 RoundDown(TUint32 aVal, TUint32 aGranularityLog2) +{ + ASSERT(aGranularityLog2 < 32); + return (aVal >> aGranularityLog2) << aGranularityLog2; +} + +//----------------------------------------------------------------------------- +/** + Rounds up aVal to the 2^aGranularityLog2 + For example: RoundUp(0x08, 2) == 0x08; RoundUp(0x08, 3) == 0x08; RoundUp(0x08, 4) == 0x10; RoundUp(0x19, 4) == 0x20 + + @return rounded-up value +*/ +inline TUint32 RoundUp(TUint32 aVal, TUint32 aGranularityLog2) + { + ASSERT(aGranularityLog2 < 32); + + if( (aVal & ((1<>= aGranularityLog2; + aVal++; + aVal <<= aGranularityLog2; + + return aVal; + } + +//----------------------------------------------------------------------------- + +/** + @return Boolean exclusive OR between a1 and a2 + This function should be used on C-style TBool, which is, actually TInt type; Its '0' value means "False" and _any_ non-zero means "True" + E.g: BoolXor(0x17, 0x4a) == EFalse; +*/ +TBool BoolXOR(TBool a1, TBool a2) + { + if(!a1 && !a2) + return EFalse; + else if(a1 && a2) + return EFalse; + else + return ETrue; + } + +//----------------------------------------------------------------------------- + +/** + Calculates the log2 of a number + This is the explicitly inlined version. Extensive using it may result in a code bloat. + + @param aNum Number to calulate the log two of + @return The log two of the number passed in +*/ +inline TUint32 Log2_inline(TUint32 aVal) + { + __ASSERT_COMPILE(sizeof(TUint32) == 4); + ASSERT(aVal); + + TUint32 bitPos=31; + + if(!(aVal >> 16)) {bitPos-=16; aVal<<=16;} + if(!(aVal >> 24)) {bitPos-=8; aVal<<=8 ;} + if(!(aVal >> 28)) {bitPos-=4; aVal<<=4 ;} + if(!(aVal >> 30)) {bitPos-=2; aVal<<=2 ;} + if(!(aVal >> 31)) {bitPos-=1;} + + return bitPos; + } + + +//----------------------------------------------------------------------------- +/** + Calculates number of '1' bits in the aVal + This is the explicitly inlined version. Extensive using it may result in a code bloat. + + @param aVal some value + @return number of '1' bits in the aVal +*/ +inline TUint32 Count1Bits_inline(TUint32 aVal) + { + if(!aVal) + return 0; + + if(aVal == 0xFFFFFFFF) + return 32; + + aVal = aVal - ((aVal >> 1) & 0x55555555); + aVal = (aVal & 0x33333333) + ((aVal >> 2) & 0x33333333); + aVal = (aVal + (aVal >> 4)) & 0x0f0f0f0f; + aVal = aVal + (aVal >> 8); + aVal = aVal + (aVal >> 16); + + return aVal & 0x3f; + } + + + + +//----------------------------------------------------------------------------- + +/** clear all bits */ +void T32Bits::Clear() + { + iData = 0; + } + +/** @return non-0 if at least one of 32 bits is set to '1' */ +TBool T32Bits::HasBitsSet() const + { + return iData; + } + +/** sets bit number "aIndex" to '1' */ +void T32Bits::SetBit(TUint32 aIndex) + { + ASSERT(aIndex < 32); + iData |= (1<= EMaxClientOperations/4. + N.B. - the iRegisteredIntercepts array uses only 2 bits per function, so the + array size only needs to be >= EMaxClientOperations/4. */ enum {KIntcArrSize = 132}; TInt iUniquePos; // 4 bytes @@ -527,6 +528,11 @@ }; /** +A class for making file server request internally from within a +file server plugin. + +See also RFilePlugin and RDirPlugin. + @publishedPartner @released */ @@ -545,6 +551,7 @@ IMPORT_C TInt Entry(const TDesC& aName,TEntry& anEntry) const; IMPORT_C TInt SetEntry(const TDesC& aName,const TTime& aTime,TUint aSetAttMask,TUint aClearAttMask); IMPORT_C TInt ReadFileSection(const TDesC& aName,TInt64 aPos,TDes8& aDes,TInt aLength) const; + IMPORT_C TInt Volume(TVolumeInfo &aVol,TInt aDrive=KDefaultDrive) const; protected: TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const; @@ -579,13 +586,13 @@ IMPORT_C TInt Create(const TDesC& aName,TUint aFileMode); IMPORT_C TInt Replace(const TDesC& aName,TUint aFileMode); IMPORT_C TInt Temp(const TDesC& aPath,TFileName& aName,TUint aFileMode); - + // re-open SAME file as client's request IMPORT_C TInt AdoptFromClient(); // Transfer the plugin's open file to the client IMPORT_C TInt TransferToClient(); - + IMPORT_C void Close(); // RFile overloads @@ -690,7 +697,7 @@ public: TInt InitControl(CFsRequest* aRequest); TInt InitRequest(CFsRequest* aRequest); -private: +private: TDblQueLink iLink; CFsPluginConn& iPluginConn; TInt iFunction; diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/inc/f32file.h --- a/userlibandfileserver/fileserver/inc/f32file.h Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/inc/f32file.h Mon Jan 18 21:31:10 2010 +0200 @@ -26,11 +26,21 @@ #include #endif +#ifndef SYMBIAN_ENABLE_PUBLIC_PLATFORM_HEADER_SPLIT +// Old implementation including platform e32svr.h (which includes the several other platform headers)... #if !defined(__E32SVR_H__) #include #endif - +#include +#else +// New implementation including only the public headers needed for f32file.h... #include +// And the public headers previously included via e32svr.h but otherwise not needed for f32file.h... +#include +#include +#include +#include +#endif /** diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/inc/f32notification.h --- a/userlibandfileserver/fileserver/inc/f32notification.h Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/inc/f32notification.h Mon Jan 18 21:31:10 2010 +0200 @@ -139,6 +139,11 @@ class CFsNotifyBody; //incomplete decl /* + * CFsNotify is a class which allows changes to file and directories to be monitored + * + * The notification framework supported by CFsNotify is able to keep track of multiple notifications, + * whilst ensuring that notifications cannot be missed (unlike RFs::NotifyChange which can miss changes). + * * CFsNotify encapsulates the client-side sub-session associated with * the file server notification framework. * @@ -172,8 +177,22 @@ /* * Factory function. Creates a new CFsNotify and returns a pointer to it. * + * CFsNotify stores notifications in a buffer. + * Clients of CFsNotify must specify how large this buffer should be. + * + * As a guideline: Notification objects in the buffer typically have a 8byte header, + * followed by a word aligned string containing the fullname of the file that has changed. + * In the case of a rename notification both the original and the new fullnames are stored. + * + * However, clients must not assume to know the exact size of notifications when determining the size of their buffer, + * as it is not possible to know how often a client will be able to read the notifications from the buffer. + * In addition, if further notification types are added, then the header size or maximum data could increase. + * + * Thus, clients must ensure that their notification handling code appropriately deals with an overflow notification, whereby the + * buffer was not large enough to store all of the notifications. + * * If aBufferSize is greater than (KMaxTInt/2) then it will return KErrArgument. - * If it is less than KMinNotificationBufferSize (approximately 1KB) then aBufferSize will be + * If aBufferSize is less than KMinNotificationBufferSize (which is an internal constant but is approximately equal to 1KB) then aBufferSize will be * set to KMinNotificationBufferSize. * * @param aFs - RFs session. Must be connected. diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/inc/f32ver.h --- a/userlibandfileserver/fileserver/inc/f32ver.h Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/inc/f32ver.h Mon Jan 18 21:31:10 2010 +0200 @@ -58,6 +58,6 @@ @see TVersion */ -const TInt KF32BuildVersionNumber=2020; +const TInt KF32BuildVersionNumber=2025; // #endif diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/inc/filesystem_utils.h --- a/userlibandfileserver/fileserver/inc/filesystem_utils.h Thu Jan 07 13:38:45 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +0,0 @@ -// Copyright (c) 1995-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: -// -// Collection of common constants, utility functions, etc. for the file server and file systems. -// Definitions here must be filesystem-agnostic, i.e. generic enougs to be used by every file system -// -// This is the internal file and must not be exported. - -/** - @file - @internalTechnology -*/ - -#if !defined(__FILESYSTEM_UTILS_H__) -#define __FILESYSTEM_UTILS_H__ - -#if !defined(__E32BASE_H__) -#include -#endif - -//####################################################################################################################################### -//# constants definitions -//####################################################################################################################################### - -const TUint KBitsInByteLog2 = 3; -const TUint KBitsInByte = 1<> aGranularityLog2) << aGranularityLog2; -} - -//----------------------------------------------------------------------------- -/** - Rounds up aVal to the 2^aGranularityLog2 - For example: RoundUp(0x08, 2) == 0x08; RoundUp(0x08, 3) == 0x08; RoundUp(0x08, 4) == 0x10; RoundUp(0x19, 4) == 0x20 - - @return rounded-up value -*/ -inline TUint32 RoundUp(TUint32 aVal, TUint32 aGranularityLog2) - { - ASSERT(aGranularityLog2 < 32); - - if( (aVal & ((1<>= aGranularityLog2; - aVal++; - aVal <<= aGranularityLog2; - - return aVal; - } - -//----------------------------------------------------------------------------- - -/** - @return Boolean exclusive OR between a1 and a2 - This function should be used on C-style TBool, which is, actually TInt type; Its '0' value means "False" and _any_ non-zero means "True" - E.g: BoolXor(0x17, 0x4a) == EFalse; -*/ -TBool BoolXOR(TBool a1, TBool a2) - { - if(!a1 && !a2) - return EFalse; - else if(a1 && a2) - return EFalse; - else - return ETrue; - } - -//----------------------------------------------------------------------------- - -/** - Calculates the log2 of a number - This is the explicitly inlined version. Extensive using it may result in a code bloat. - - @param aNum Number to calulate the log two of - @return The log two of the number passed in -*/ -inline TUint32 Log2_inline(TUint32 aVal) - { - __ASSERT_COMPILE(sizeof(TUint32) == 4); - ASSERT(aVal); - - TUint32 bitPos=31; - - if(!(aVal >> 16)) {bitPos-=16; aVal<<=16;} - if(!(aVal >> 24)) {bitPos-=8; aVal<<=8 ;} - if(!(aVal >> 28)) {bitPos-=4; aVal<<=4 ;} - if(!(aVal >> 30)) {bitPos-=2; aVal<<=2 ;} - if(!(aVal >> 31)) {bitPos-=1;} - - return bitPos; - } - - -//----------------------------------------------------------------------------- -/** - Calculates number of '1' bits in the aVal - This is the explicitly inlined version. Extensive using it may result in a code bloat. - - @param aVal some value - @return number of '1' bits in the aVal -*/ -inline TUint32 Count1Bits_inline(TUint32 aVal) - { - if(!aVal) - return 0; - - if(aVal == 0xFFFFFFFF) - return 32; - - aVal = aVal - ((aVal >> 1) & 0x55555555); - aVal = (aVal & 0x33333333) + ((aVal >> 2) & 0x33333333); - aVal = (aVal + (aVal >> 4)) & 0x0f0f0f0f; - aVal = aVal + (aVal >> 8); - aVal = aVal + (aVal >> 16); - - return aVal & 0x3f; - } - - - - - - -#endif //__FILESYSTEM_UTILS_INL__ - - - - - - - - - - - - - - - - - diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfat32/common_constants.h --- a/userlibandfileserver/fileserver/sfat32/common_constants.h Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfat32/common_constants.h Mon Jan 18 21:31:10 2010 +0200 @@ -87,6 +87,9 @@ //-- define this macro in order to enable the DEMAND PAGING DIRECTORY CACHE. #define USE_DP_DIR_CACHE +//-- define this macro in order to use "Rummage Dirictory Cache" feature: searching for the entry in the cache first +#define USE_DIR_CACHE_RUMMAGE + //----------------------------------------------------------------------------- typedef TUint32 TLinAddr; @@ -142,30 +145,26 @@ EFatBadStdFormatName, // 5 EFatBadDosFormatName, // 6 EFatCorrupt, // 7 - EFatChkDskIllegalClusterNumber, // 8 - EFatChkDskClusterAlreadyInUse, // 9 - EFatChkDskBadCluster, // 10 - EFatChkDskInvalidEntrySize, // 11 - EFatFilePosBeyondEnd, // 12 - EFatFileSeekIndexTooSmall, // 13 - EFatFileSeekIndexTooSmall2, // 14 - ELruCacheBadGranularity, // 15 - EFatRawReadTooBig, // 16 - EFatReadUidFailed, // 17 - ELruCacheFlushNotSupported, // 18 - EReadFileSectionFailed, // 19 - EBadReplacementForUnconvertibleUnicodeCharacters, // 20 + EFatFilePosBeyondEnd, // 8 + EFatFileSeekIndexTooSmall, // 9 + EFatFileSeekIndexTooSmall2, // 10 + ELruCacheBadGranularity, // 11 + EFatRawReadTooBig, // 12 + EFatReadUidFailed, // 13 + ELruCacheFlushNotSupported, // 14 + EReadFileSectionFailed, // 15 + EBadReplacementForUnconvertibleUnicodeCharacters, // 16 - EFatRAMDriveSizeInvalid, // 21 - EFatRAMDriveFreeInvalid, // 22 - ECheckFatIndexZero, // 23 + EFatRAMDriveSizeInvalid, // 17 + EFatRAMDriveFreeInvalid, // 18 + ECheckFatIndexZero, // 19 - EFatCache_BadGranularity, // 24 - EFatCache_DiscardingDirtyData, // 25 - EFatCache_NotImplemented, // 26 - EFatCache_BadFatType, // 27 + EFatCache_BadGranularity, // 20 + EFatCache_DiscardingDirtyData, // 21 + EFatCache_NotImplemented, // 22 + EFatCache_BadFatType, // 23 - EFatTable_InvalidIndex, // 28 + EFatTable_InvalidIndex, // 24 }; diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfat32/efat32.mmp --- a/userlibandfileserver/fileserver/sfat32/efat32.mmp Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfat32/efat32.mmp Mon Jan 18 21:31:10 2010 +0200 @@ -21,6 +21,8 @@ USERINCLUDE ../sfile USERINCLUDE ../inc +USERINCLUDE ../fs_utils + USERINCLUDE ../sfat32 USERINCLUDE ../sfat32/inc @@ -36,6 +38,9 @@ SOURCE sl_scan32.cpp sl_mnt32.cpp SOURCE sl_fatcache32.cpp +SOURCEPATH ../fs_utils +SOURCE filesystem_utils.cpp bit_vector.cpp + SOURCEPATH . DOCUMENT ../group/release.txt diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfat32/fat_table32.cpp --- a/userlibandfileserver/fileserver/sfat32/fat_table32.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfat32/fat_table32.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -1761,7 +1761,7 @@ */ void CFatTable::WriteFatEntryEofL(TUint32 aFatIndex) { - __PRINT1(_L("CAtaFatTable::WriteFatEntryEofL(%d)"), aFatIndex); + __PRINT1(_L("CFatTable::WriteFatEntryEofL(%d)"), aFatIndex); //-- use EOF_32Bit (0x0fffffff) for all types of FAT, FAT cache will mask it appropriately WriteL(aFatIndex, EOF_32Bit); diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfat32/filesystem_fat.h --- a/userlibandfileserver/fileserver/sfat32/filesystem_fat.h Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfat32/filesystem_fat.h Mon Jan 18 21:31:10 2010 +0200 @@ -117,8 +117,8 @@ { KOffsetSubType =0, //-- 0 KOffsetReservedSec, //-- 1 - KOffsetSpc, //-- 2 - KOffsetNumFATs, //-- 3 + KOffsetSpc, //-- 2 !! do not change this offset. + KOffsetNumFATs, //-- 3 !! do not change this offset. }; @@ -141,6 +141,9 @@ TVolFormatParam_FAT::TVolFormatParam_FAT() : TVolFormatParam() { __ASSERT_COMPILE(sizeof(TVolFormatParam_FAT) == sizeof(TVolFormatParam)); + __ASSERT_COMPILE(KOffsetSpc == 2); + __ASSERT_COMPILE(KOffsetNumFATs == 3); + Init(); } diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfat32/inc/fat_table32.h --- a/userlibandfileserver/fileserver/sfat32/inc/fat_table32.h Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfat32/inc/fat_table32.h Mon Jan 18 21:31:10 2010 +0200 @@ -161,6 +161,7 @@ void FreeClusterListL(TUint32 aCluster); TUint32 AllocateSingleClusterL(TUint32 aNearestCluster); void ExtendClusterListL(TUint32 aNumber,TInt& aCluster); + TUint32 AllocateClusterListL(TUint32 aNumber,TUint32 aNearestCluster); private: CRamFatTable(CFatMountCB& aOwner); diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfat32/inc/sl_scandrv.h --- a/userlibandfileserver/fileserver/sfat32/inc/sl_scandrv.h Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfat32/inc/sl_scandrv.h Mon Jan 18 21:31:10 2010 +0200 @@ -27,12 +27,10 @@ //--------------------------------------------------------------------------------------------------------------------------------- -const TInt KMaxMatchingEntries = 2; ///< Maximum number of matching directory entries scan drive can fix. Any more indicates a fault in the file system -const TInt KMaxArrayDepth = 6; ///< Maximum array depth for cluster storage when KMaxScanDepth is reached +const TUint KMaxMatchingEntries = 2; ///< Maximum number of matching directory entries scan drive can fix. Any more indicates a fault in the file system +const TUint KMaxArrayDepth = 6; ///< Maximum array depth for cluster storage when KMaxScanDepth is reached -/** -Data structure used to store the location of a partial VFat entry -*/ +/** Data structure used to store the location of a partial VFat entry */ struct TPartVFatEntry { TEntryPos iEntryPos; ///< The position of the partial VFat entry @@ -40,29 +38,33 @@ }; -/** -Data structure used to store the locations of entries with matching -start cluster numbers. -*/ +/** Data structure used to store the locations of entries with matching start cluster numbers. */ struct TMatchingStartCluster { TEntryPos iEntries[KMaxMatchingEntries]; ///< The positions of the matching entries - TInt iCount; ///< Count of matching entries - TInt iStartCluster; ///< The matching cluster number found in more than one entry + TUint iCount; ///< Count of matching entries + TUint iStartCluster; ///< The matching cluster number found in more than one entry }; + +//--------------------------------------------------------------------------------------------------------------------------------- /** -Scan drive class performs scan drive functionality on all types -of fat volume. + This class is used for checking volume for FS errors and fixing a limited set of FS artefacts introduced by Rugged FAT on write failures. + It can operate in 2 modes: + + 1. "ScanDrive" mode, scan whole volume for possible Rugged FAT artefacts and fix them if possible. + 1.1 If there was no problem at all, then StartL() finishes normally and ProblemsDiscovered() returns ENoErrors. + 1.2 If there was Rugged FAT artefact and it had been successfully fixed, StartL() finishes normally and ProblemsDiscovered() returns EScanDriveDirError. + In this case the client may perform volum remounting, because FAT is very likely to have been changed. + 1.3 If there was a fatal error, like media failure or unfixable FS problem, StartL() will leave with some generic error code. + + 2. "CheckDisk" mode. check file system for known artefacts and return an error if _any_ problem discovered. + In this case StartL() _may_ leave with something like KErrCorrupt if there was a media failure or scan has stumbled across unknown FS error, + ProblemsDiscovered() _may_ return some code describing the problem. If StartL() did not leave, but ProblemsDiscovered() returns a code different + from ENoErrors, this means that there is FS corruption. */ class CScanDrive : public CBase { -public: - /** - Error type found by scan drive, only a single error should occur in - any scan of the volume - */ - enum TDirError{EScanMatchingEntry=1,EScanPartEntry, ETruncation}; public: @@ -70,40 +72,63 @@ static CScanDrive* NewL(CFatMountCB* aMount); void ConstructL(CFatMountCB* aMount); - TInt StartL(); - TBool ProblemsDiscovered() const; +public: + + /** description of known problems that this scanned can deal with. Mostly used in "CheckDisk " mode */ + enum TGenericError + { + ENoErrors = 0, ///< 0 no errors discovered + EBadClusterNumber, ///< 1 cluster number that doesn't correspond to the max. amount of clusters on the volume + EClusterAlreadyInUse, ///< 2 cross-linked cluster chain + EBadClusterValue, ///< 3 also means "lost cluster" + EInvalidEntrySize, ///< 4 size of file/directory does not correspond to the cluster chain length + + EUnknownError = 95, ///< unknown error + EScanDriveDirError=100 ///< 100 ScanDrive error + }; + + TGenericError ProblemsDiscovered() const; + + /** CScanDrive mode of operation */ + enum TScanDriveMode + { + EScanAndFix, ///< "ScanDrive" mode, scan whole volume for possible Rugged FAT artefacts and fix them + ECheckDisk, ///< "CheckDisk" mode. check file system for known artefacts and return an error if _any_ problem discovered + }; + + void StartL(TScanDriveMode aMode); private: -#if defined(DEBUG_SCANDRIVE) void PrintErrors(); - void CompareFatsL() const; -#endif - void FixupDirErrorL(); + void CompareFatsL(TBool aStopOnFirstErrorFound) ; + void CompareAndFixFatsL(); + + void FixupDirErrorL(); void ReadMediaFatL(); void DoParseFatL(); void DoParseFat32L(); void DoParseFat32Buf(const TPtrC8& aBuf, TUint32& aCurrFatEntry); - TBool AlreadyUsedL(TUint aCluster) const; - void SetUsedL(TUint aCluster); + TBool IsClusterUsedL(TUint aCluster); + void MarkClusterUsedL(TUint aCluster); - TUint32 ReadFatL(TInt aClusterNum) const; + TUint32 ReadFatL(TUint aClusterNum) ; void FindSameStartClusterL(); TInt FindStartClusterL(TInt aDirCluster); void CheckDirStructureL(); - void CheckDirL(TInt aCluster); + void CheckDirL(TUint32 aCluster); void ProcessEntryL(const TFatDirEntry& aEntry); TInt CheckEntryClusterL(const TFatDirEntry& aEntry, const TEntryPos& aEntryPos); - void WriteClusterChainL(TInt aCluster,TUint aSizeInBytes); + void RecordClusterChainL(TInt aCluster,TUint aSizeInBytes); TBool MoveToVFatEndL(TEntryPos& aPos,TFatDirEntry& aEntry,TInt& aDirLength); TBool IsValidVFatEntry(const TFatDirEntry& aEntry,TInt prevNum)const; TBool IsDosEntry(const TFatDirEntry& aEntry)const; void AddPartialVFatL(const TEntryPos& aStartPos, const TFatDirEntry& aEntry); TBool AddMatchingEntryL(const TEntryPos& aEntryPos); TInt GetReservedidL(const TEntryPos aVFatPos); - void WriteNewFatsL(); + void FixPartEntryL(); void FixMatchingEntryL(); void MovePastEntriesL(TEntryPos& aEntryPos,TFatDirEntry& aEntry,TInt aToMove,TInt& aDirEntries); @@ -115,23 +140,44 @@ void MoveToNextEntryL(TEntryPos& aPos); void ReadDirEntryL(const TEntryPos& aPos,TFatDirEntry& aDirEntry); - void IndicateErrorsFound(); + inline void IndicateErrorsFound(TGenericError aError); + inline TUint32 MaxClusters() const; + inline TBool CheckDiskMode() const; + +protected: + + /** + Internal ScanDrive mode specific errors. In Rugged FAT mode (current implementatio) any type of error of this kind can occur only once and it will be fixed. + Othersise the FS is considered to be corrupted + */ + enum TDirError + { + ENoDirError= 0, ///< no errors found + EScanMatchingEntry=1, ///< Two entries pointing to the same cluster chain; Rugged FAT rename/replace artefact + EScanPartEntry, ///< Deleted DOS entry and orphaned VFAT ones from the same entryset; Rugged FAT 'file/dir delete' artefact + }; + private: CFatMountCB* iMount; ///< The owning Fat mount - TPartVFatEntry iPartEntry; ///< Storage for a partial VFat entry set error - TMatchingStartCluster iMatching; ///< Storage for Matching start cluster error - TDirError iDirError; ///< Indicates the error tpye found also used to indicate if an error has occured - TInt iDirsChecked; ///< Count of the number of directories checked + + TPartVFatEntry iPartEntry; ///< Storage for a partial VFat entry set error, see EScanPartEntry + TMatchingStartCluster iMatching; ///< Storage for Matching start cluster error, see EScanMatchingEntry + + TDirError iDirError; ///< Indicates the error tpye found also used to indicate if an error has occured + TInt iDirsChecked; ///< Count of the number of directories checked TInt iRecursiveDepth; ///< Depth of recursion the scan has reached RArray* iClusterListArray[KMaxArrayDepth]; ///< Size in bytes of the bit packed Fat Cluster list array used when maximum depth has been reached so that directory may be re-visited. Avoid stack overflow - TInt iListArrayIndex; ///< Current position into cluster list array - TInt iTruncationCluster; ///< Cluster at which cluster chain truncation should take place, used for truncation errors - TBool iFoundProblems; ///< if ETrue after finish, it means that there where some problems FS structure and they were probably fixed; - RBitVector iMediaFatBits; ///< Storage for bit packed Fat read from media - RBitVector iScanFatBits; ///< Storage for bit packed Fat built up by the scan + TUint iListArrayIndex; ///< Current position into cluster list array + TUint32 iTruncationCluster; ///< Cluster at which cluster chain truncation should take place, used for truncation errors + TUint32 iMaxClusters; ///< Max. amount of clusters on the volume + RBitVector iMediaFatBits; ///< Storage for bit packed Fat read from media + RBitVector iScanFatBits; ///< Storage for bit packed Fat built up by the scan + + TGenericError iGenericError; ///< FS error that is discovered by scanning in any mode + TScanDriveMode iScanDriveMode; ///< mode of operation }; diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfat32/inc/sl_std.h --- a/userlibandfileserver/fileserver/sfat32/inc/sl_std.h Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfat32/inc/sl_std.h Mon Jan 18 21:31:10 2010 +0200 @@ -31,14 +31,17 @@ #include #include #include + #include "filesystem_fat.h" +using namespace FileSystem_FAT; #include "common_constants.h" #include "sl_bpb.h" #include "fat_config.h" #include "fat_dir_entry.h" +#include "bit_vector.h" -using namespace FileSystem_FAT; + #ifdef _DEBUG _LIT(KThisFsyName,"EFAT32.FSY"); ///< This FSY name @@ -719,11 +722,6 @@ private: - TBool ValidClusterNumber(TUint32 aCluster) const; - void CheckUnvisitedClustersL(const RBitVector& aFatBitVec) const; - TInt WalkClusterListL(RBitVector& aFatBitVec, TInt aCluster); - void ChkEntryL(RBitVector& aFatBitVec, const TFatDirEntry& anEntry); - void ChkDirL(RBitVector& aFatBitVec, TInt aDirCluster); CFatMountCB(); @@ -1001,17 +999,6 @@ }; // -TPtrC RemoveTrailingDots(const TDesC& aName); - -/** -Calculates the log2 of a number - -@param aNum Number to calulate the log two of -@return The log two of the number passed in -*/ -TUint32 Log2(TUint32 aVal); - - /** Converts Dos time (from a directory entry) to TTime format @@ -1072,103 +1059,6 @@ TUint32 EocCodeByFatType(TFatType aFatType); - -//----------------------------------------------------------------------------- - -/** - This class represents a bit vector i.e. an array of bits. Vector size can be 1..2^32 bits. -*/ -class RBitVector - { - public: - - RBitVector(); //-- Creates an empty vector. see Create() methods for memory allocation - ~RBitVector(); - - void Close(); - - TInt Create(TUint32 aNumBits); - void CreateL(TUint32 aNumBits); - - inline TUint32 Size() const; - - //-- single bit manipulation methods - inline TBool operator[](TUint32 aIndex) const; - inline void SetBit(TUint32 aIndex); - inline void ResetBit(TUint32 aIndex); - inline void InvertBit(TUint32 aIndex); - inline void SetBitVal(TUint32 aIndex, TBool aVal); - - void Fill(TBool aVal); - void Fill(TUint32 aIndexFrom, TUint32 aIndexTo, TBool aVal); - - void Invert(); - - TBool operator==(const RBitVector& aRhs) const; - TBool operator!=(const RBitVector& aRhs) const; - - //-- logical operations between 2 vectors. - void And(const RBitVector& aRhs); - void Or (const RBitVector& aRhs); - void Xor(const RBitVector& aRhs); - - TBool Diff(const RBitVector& aRhs, TUint32& aDiffIndex) const; - - /** Bit search specifiers */ - enum TFindDirection - { - ELeft, ///< Search from the given position to the left (towards lower index) - ERight, ///< Search from the given position to the right (towards higher index) - ENearestL, ///< Search in both directions starting from the given position; in the case of the equal distances return the position to the left - ENearestR ///< Search in both directions starting from the given position; in the case of the equal distances return the position to the right - - //-- N.B the current position the search starts with isn't included to the search. - }; - - TBool Find(TUint32& aStartPos, TBool aBitVal, TFindDirection aDir) const; - - /** panic codes */ - enum TPanicCode - { - EIndexOutOfRange, ///< index out of range - EWrondFindDirection, ///< a value doesn't belong to TFindDirection - ESizeMismatch, ///< Size mismatch for binary operators - ENotInitialised, ///< No memory allocated for the array - ENotImplemented, ///< functionality isn't implemented - }; - - protected: - - //-- these are outlawed. Can't use them because memory allocator can leave and we don't have conthrol on it in these methods. - RBitVector(const RBitVector& aRhs); - RBitVector& operator=(const RBitVector& aRhs); - - void Panic(TPanicCode aPanicCode) const; - - inline TUint32 WordNum(TUint32 aBitPos) const; - inline TUint32 BitInWord(TUint32 aBitPos) const; - - private: - TBool FindToRight(TUint32& aStartPos, TBool aBitVal) const; - TBool FindToLeft (TUint32& aStartPos, TBool aBitVal) const; - TBool FindNearest(TUint32& aStartPos, TBool aBitVal, TBool aToLeft) const; - - inline TUint32 MaskLastWord(TUint32 aVal) const; - inline TBool ItrLeft(TUint32& aIdx) const; - inline TBool ItrRight(TUint32& aIdx) const; - - - protected: - - TUint32 iNumBits; ///< number of bits in the vector - TUint32* ipData; ///< pointer to the data - TUint32 iNumWords;///< number of 32-bit words that store bits - }; - - -//----------------------------------------------------------------------------- - - #include "sl_std.inl" #include "sl_bpb.inl" #include "fat_dir_entry.inl" diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfat32/inc/sl_std.inl --- a/userlibandfileserver/fileserver/sfat32/inc/sl_std.inl Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfat32/inc/sl_std.inl Mon Jan 18 21:31:10 2010 +0200 @@ -535,91 +535,6 @@ } //--------------------------------------------------------------------------------------------------------------------------------- -//-- class RBitVector - -/** @return size of the vector (number of bits) */ -inline TUint32 RBitVector::Size() const - { - return iNumBits; - } - -/** - Get a bit by index - - @param aIndex index in a bit vector - @return 0 if the bit at pos aIndex is 0, not zero otherwise - @panic EIndexOutOfRange if aIndex is out of range -*/ -inline TBool RBitVector::operator[](TUint32 aIndex) const - { - __ASSERT_ALWAYS(aIndex < iNumBits, Panic(EIndexOutOfRange)); - return (ipData[WordNum(aIndex)] & (1<> shift; //-- mask unused high bits - } - - - -inline TUint32 RBitVector::WordNum(TUint32 aBitPos) const - { - return aBitPos >> 5; - } - -inline TUint32 RBitVector::BitInWord(TUint32 aBitPos) const - { - return aBitPos & 0x1F; - } /** Calculate offset of the page starting position in the cluster diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfat32/ram_fat_table32.cpp --- a/userlibandfileserver/fileserver/sfat32/ram_fat_table32.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfat32/ram_fat_table32.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -363,6 +363,47 @@ return(aCluster<ClusterSizeLog2()); } +//----------------------------------------------------------------------------- + +/** + Allocate and link a cluster chain, leaves if there are not enough free clusters. + Chain starts as close as possible to aNearestCluster, last cluster will be marked as EOF. + + @param aNumber Number of clusters to allocate + @param aNearestCluster Cluster the new chain should be nearest to + @leave System wide error codes + @return The first cluster number allocated +*/ +TUint32 CRamFatTable::AllocateClusterListL(TUint32 aNumber, TUint32 aNearestCluster) + { + __PRINT2(_L("CRamFatTable::AllocateClusterList() N:%d,NearestCL:%d"),aNumber,aNearestCluster); + __ASSERT_DEBUG(aNumber>0, Fault(EFatBadParameter)); + + if(!RequestFreeClusters(aNumber)) + { + __PRINT(_L("CRamFatTable::AllocateClusterListL - leaving KErrDirFull")); + User::Leave(KErrDiskFull); + } + + //-- if this leaves for some reason, there will be no lost clusters + TInt firstCluster = aNearestCluster = AllocateSingleClusterL(aNearestCluster); + + + if (aNumber>1) + {//-- if this part leaves (e.g. fail to expand the RAM drive), we will need to handle the first allocated EOC + TRAPD(nRes, ExtendClusterListL(aNumber-1, (TInt&)aNearestCluster)); + if(nRes != KErrNone) + { + __PRINT1(_L("CRamFatTable::AllocateClusterListL:ExtendClusterListL() failed with %d") ,nRes); + FreeClusterListL(firstCluster); //-- clean up EOC in firstCluster + User::Leave(nRes); + } + } + + + return firstCluster; + } + /** Allocate and mark as EOF a single cluster as close as possible to aNearestCluster, calls base class implementation but must Enlarge the RAM drive first. Allocated cluster RAM area will be zero-filled. @@ -392,7 +433,7 @@ */ void CRamFatTable::ExtendClusterListL(TUint32 aNumber, TInt& aCluster) { - __PRINT(_L("CRamFatTable::ExtendClusterListL")); + __PRINT2(_L("CRamFatTable::ExtendClusterListL(%d, %d)"), aNumber, aCluster); __ASSERT_DEBUG(aNumber>0,Fault(EFatBadParameter)); iOwner->EnlargeL(aNumber<ClusterSizeLog2()); diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfat32/sl_fatcache.h --- a/userlibandfileserver/fileserver/sfat32/sl_fatcache.h Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfat32/sl_fatcache.h Mon Jan 18 21:31:10 2010 +0200 @@ -28,25 +28,6 @@ //----------------------------------------------------------------------------- -/** - A simple abstraction of the 32 bit flags -*/ -class T32Bits -{ - public: - T32Bits() : iData(0) {} - - inline void Clear(); - inline TBool HasBitsSet() const; - inline void SetBit(TUint32 aIndex); - inline TBool operator[](TUint32 aIndex) const; - - private: - TUint32 iData; ///< 32 bits data -}; - -//----------------------------------------------------------------------------- - class CFatBitCache; /** diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfat32/sl_fatcache.inl --- a/userlibandfileserver/fileserver/sfat32/sl_fatcache.inl Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfat32/sl_fatcache.inl Mon Jan 18 21:31:10 2010 +0200 @@ -23,36 +23,6 @@ #define SL_FAT_CACHE_INL -//----------------------------------------------------------------------------- - -/** clear all bits */ -void T32Bits::Clear() - { - iData = 0; - } - -/** @return non-0 if at least one of 32 bits is set to '1' */ -TBool T32Bits::HasBitsSet() const - { - return iData; - } - -/** sets bit number "aIndex" to '1' */ -void T32Bits::SetBit(TUint32 aIndex) - { - ASSERT(aIndex < 32); - iData |= (1<DirCacheInterface() && trgNameFullySpecified && !IsRootDir(aDosEntryPos) && !aFileCreationHelper) {//-- aName is fully specified, i.e doesn't contain wildcards @@ -4122,10 +4120,12 @@ TRAPD(err,GetDosEntryFromNameL(aName,dosEntryPos,dosEntry)); if(err!=KErrNone) return err; + TInt startCluster=StartCluster(dosEntry); // Empty files will return a cluster of zero if(startCluster==0) return KErrEof; + aUniqueId=MAKE_TINT64(0,startCluster); return KErrNone; } @@ -4149,154 +4149,10 @@ //----------------------------------------------------------------------------------------- -//-- maximal level of recursion for the CheckDisk. i.e. the max. number of folded directories to check. -const TInt KCheckDskMaxRecursionLevel = 50; - -// -// Walks a directory cluster list then checks all the entries. -// -void CFatMountCB::ChkDirL(RBitVector& aFatBitVec, TInt aDirCluster) - { - //__PRINT1(_L("### CFatMountCB::ChkDirL() level:%d"),iChkDiscRecLevel); - - //-- check if we have reached the recursion limit. on hardware the stack is very limited - //-- and its overflow will lead to crash. - if(iChkDiscRecLevel++ >= KCheckDskMaxRecursionLevel) - { - __PRINT1(_L("CFatMountCB::ChkDirL() max recursion level(%d) reached. Leaving!"),iChkDiscRecLevel); - User::Leave(KErrTooBig); - } - - if(/*Is32BitFat() &&*/aDirCluster != 0 && (aDirCluster == RootIndicator()))//the bit in comments maybe required - WalkClusterListL(aFatBitVec, RootIndicator()); - - TEntryPos entryPos(aDirCluster,0); - FOREVER - { - TFatDirEntry entry; - ReadDirEntryL(entryPos,entry); - MoveToDosEntryL(entryPos,entry); - if (entry.IsEndOfDirectory()) - break; - if (IsRootDir(entryPos)&&(StartOfRootDirInBytes()+entryPos.iPos==(RootDirEnd()-KSizeOfFatDirEntry))) - { - if(!entry.IsErased()) - ChkEntryL(aFatBitVec, entry); - break; // Allows maximum number of entries in root directory - } - MoveToNextEntryL(entryPos); - if (entry.IsParentDirectory() || entry.IsCurrentDirectory() || entry.IsErased()) - continue; - ChkEntryL(aFatBitVec, entry); - } - - iChkDiscRecLevel--; - } - -//----------------------------------------------------------------------------------------- - -// -// Check FAT is valid for anEntry -// -void CFatMountCB::ChkEntryL(RBitVector& aFatBitVec, const TFatDirEntry& anEntry) - { - TInt listLength=0; - - if ((anEntry.Attributes()&(KEntryAttDir)) || anEntry.Size()) - listLength=WalkClusterListL(aFatBitVec, StartCluster(anEntry)); - else if (anEntry.StartCluster() != 0) // zero length file - User::Leave(EFatChkDskInvalidEntrySize); // shouldn't have clusters - - if (anEntry.Attributes()&KEntryAttDir) - ChkDirL(aFatBitVec, StartCluster(anEntry)); - - // Check that the correct number of clusters have been allocated for the size of the file. - - else if ((anEntry.Attributes()&KEntryAttVolume)==0) - { - TInt clustersForFileSize; - TInt clusterSize=1<> ClusterSizeLog2() ); - - if (listLength!=clustersForFileSize) - User::Leave(EFatChkDskInvalidEntrySize); - } - } - -//----------------------------------------------------------------------------------------- - -// -// Walks cluster list from aCluster to EOF -// Reports an error if an invalid cluster is found before EOF or -// a cluster has been visited before. -// -TInt CFatMountCB::WalkClusterListL(RBitVector& aFatBitVec, TInt aCluster) - { - - TInt i=0; - do { - i++; - if (!ValidClusterNumber(aCluster)) - { - __PRINT1(_L("Bad Cluster number %d"),aCluster); - User::Leave(EFatChkDskIllegalClusterNumber); - } - - if (IsClusterVisited(aFatBitVec, aCluster)) - { - __PRINT1(_L("Cluster already in use %d"),aCluster); - User::Leave(EFatChkDskClusterAlreadyInUse); - } - - MarkClusterVisited(aFatBitVec, aCluster); - - } while (FAT().GetNextClusterL(aCluster)); - - return(i); - } - -//----------------------------------------------------------------------------------------- - -// -// Checks that all unvisited clusters are marked as free in the FAT -// -void CFatMountCB::CheckUnvisitedClustersL(const RBitVector& aFatBitVec) const - { - - TInt cluster=2; - TInt maxCluster=cluster + UsableClusters(); - while (cluster= maxCluster) - break; - - TInt clusterVal=FAT().ReadL(cluster); - if (clusterVal!=0 && IsEndOfClusterCh(clusterVal)==EFalse && !IsBadCluster(clusterVal)) - { - __PRINT1(_L("\n*****Bad cluster Num = %d"),cluster); - User::Leave(EFatChkDskBadCluster); - } - } - } - -//----------------------------------------------------------------------------------------- - -/** -@param aCluster cluster number to check for validity -@returns ETrue if aCluster is a valid cluster number +/** + Check file system for errors. + @return KErrNone if no errors found, otherwise a error code hopefully describing the problem found. */ -TBool CFatMountCB::ValidClusterNumber(TUint32 aCluster) const - { - return (aCluster>=KFatFirstSearchCluster && aCluster<=MaxClusterNumber()); - } - -//----------------------------------------------------------------------------------------- - -// -// Walk the FAT, returns error if find an unterminated list or -// lists that merge. -// TInt CFatMountCB::CheckDisk() { @@ -4307,10 +4163,6 @@ //-- create a bit representation of the FAT const TUint32 MaxClusters = UsableClusters()+KFatFirstSearchCluster; //-- UsableClusters() doesn't count first 2 unused clusers - - - // cluster count may be zero if boot sector failed to be read (e.g. if the media is locked) - // or if TDrive::MountMedia(ETrue) has been called (in which case the boot sector may if (MaxClusters == 0) return KErrCorrupt; @@ -4319,115 +4171,42 @@ TTime timeEnd; timeStart.UniversalTime(); //-- take start time - - RBitVector bitVec; //-- each bit in this vector represents a FAT cluster - - TInt nRes = bitVec.Create(MaxClusters); + TInt nRes; + + CScanDrive* pScnDrv = NULL; + TRAP(nRes, pScnDrv=CScanDrive::NewL(this)); if(nRes != KErrNone) - { - ASSERT(nRes == KErrNoMemory); //-- the only one possible reason. - return KErrNoMemory; - } - - iChkDiscRecLevel = 0; //-- reset CheckDisk recursion counter - TRAPD(r,ChkDirL(bitVec, RootIndicator())); // Check from root directory - if (r==KErrNone) - { - TRAP(r,CheckUnvisitedClustersL(bitVec)); - } - - - bitVec.Close(); - + return nRes; + + //-- start ScanDrive in "checkdisk" mode + TRAPD(nScnDrvRes, pScnDrv->StartL(CScanDrive::ECheckDisk)); + timeEnd.UniversalTime(); //-- take end time const TInt msScanTime = (TInt)( (timeEnd.MicroSecondsFrom(timeStart)).Int64() / K1mSec); (void)msScanTime; - __PRINT1(_L("#@@@ CheckDisk() time taken:%d ms"), msScanTime); - - - switch(r) + + CScanDrive::TGenericError chkDskRes = pScnDrv->ProblemsDiscovered(); + const TBool bProblemsFound = (nScnDrvRes!=KErrNone) || pScnDrv->ProblemsDiscovered(); + + if(bProblemsFound && chkDskRes == CScanDrive::ENoErrors) + {//-- ScanDrive in this mode can leave unexpectedly without setting an error code that is returned by ProblemsDiscovered(); + //-- leave itself means a problem + chkDskRes = CScanDrive::EUnknownError; + } + + delete pScnDrv; + + if(chkDskRes != KErrNone) { - - case KErrNone: - return KErrNone; - - case EFatChkDskIllegalClusterNumber: - return(1); - - case EFatChkDskClusterAlreadyInUse: - return(2); - - case EFatChkDskBadCluster: - return(3); - - case EFatChkDskInvalidEntrySize: - return(4); - - default: - break; + __PRINT2(_L("CFatMountCB::CheckDisk() drv:%d, result:%d"), DriveNumber(), chkDskRes); } - - return(r); + + return chkDskRes; + } -//----------------------------------------------------------------------------------------- -// Helper functions for Check Disk functionality -//----------------------------------------------------------------------------------------- - -/** - Find the next unvisited cluster number in the bit array. - - @param aBitList bit array, where '0' bits represent unvisited clusters. - @param aCluster cluster number to start search with. - - @return positive integer indicating next unvisited cluster number - KErrNotFound (-1) if there are no unvisited clusters - -*/ -static TInt NextUnvisitedCluster(const RBitVector& aFatBitVec, TUint32 aCluster) -{ - __ASSERT_DEBUG(aCluster >= KFatFirstSearchCluster, Fault(EFatChkDskIllegalClusterNumber)); //-- 1st 2 FAT entries are reserved - - TUint32 searchPos = aCluster; //-- bit number to start search with - - //-- look for the unvisited cluster (bit '0') in the bit array from the searchPos to the right - if(aFatBitVec.Find(searchPos, 0, RBitVector::ERight)) - return searchPos; - - return KErrNotFound; -} - - -/** - Check if we have visited cluster aCluster - - @param aFatBitVec bit array, where '0' bits represent unvisited clusters. - @param aCluster cluster number to check - @return ETrue if aCluster has been visited. -*/ -static TBool IsClusterVisited(const RBitVector& aFatBitVec, TUint32 aCluster) -{ - __ASSERT_DEBUG(aCluster >= KFatFirstSearchCluster, Fault(EFatChkDskIllegalClusterNumber)); //-- 1st 2 FAT entries are reserved - - return aFatBitVec[aCluster]; -} - -/** - Mark aCluster as visited - @param aFatBitVec bit array, where '0' bits represent unvisited clusters. - @param aCluster cluster number to mark -*/ -static void MarkClusterVisited(RBitVector& aFatBitVec, TUint32 aCluster) -{ - __ASSERT_DEBUG(aCluster >= KFatFirstSearchCluster, Fault(EFatChkDskIllegalClusterNumber)); //-- 1st 2 FAT entries are reserved - - aFatBitVec.SetBit(aCluster); //-- '1' bit in a bit array means that the corresponding cluster is visited -} - - - //------------------------------------------------------------------------------------------------------------------- /** @@ -4442,7 +4221,7 @@ if(nRes != KErrNone) return nRes; - TRAPD(nScnDrvRes, pScnDrv->StartL()); + TRAPD(nScnDrvRes, pScnDrv->StartL(CScanDrive::EScanAndFix)); const TBool bNeedFatRemount = (nScnDrvRes!=KErrNone) || pScnDrv->ProblemsDiscovered(); delete pScnDrv; @@ -4459,7 +4238,7 @@ return nScnDrvRes; - //-- if ScanDrive hasn't found anything wrong or has fixed recoverable erros, mark the volume clean + //-- if ScanDrive hasn't found anything wrong or has fixed recoverable errors, mark the volume clean if(VolCleanFlagSupported()) { //-- if there is a background FAT scanning thread, we need to wait until it finishes its work. diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfat32/sl_scan32.cpp --- a/userlibandfileserver/fileserver/sfat32/sl_scan32.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfat32/sl_scan32.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -21,37 +21,38 @@ @internalTechnology */ -//#define DEBUG_SCANDRIVE - #include "sl_std.h" #include "sl_scandrv.h" +const TInt KMaxScanDepth = 20; ///< Maximum scan depth of to avoid stack over flow +const TInt KClusterListGranularity = 8; ///< Granularity of cluster list used for storage of clusters when KMaxScanDepth is reached + -const TInt KEndOfDirectory = 0xFFFF; ///< End of directory marker -const TInt KMaxScanDepth = 20; ///< Maximum scan depth of to avoid stack over flow -const TInt KClusterListGranularity = 8; ///< Granularity of cluster list used for storage of clusters when KMaxScanDepth is reached - +/** + CScanDrive factory method + @param aMount the owning mount +*/ +CScanDrive* CScanDrive::NewL(CFatMountCB* aMount) + { + if(!aMount) + { + ASSERT(0); + User::Leave(KErrArgument); + } -/** -Creates a CScanDrive -@param aMount The owning mount -*/ - CScanDrive* CScanDrive::NewL(CFatMountCB* aMount) - { - if(aMount==NULL) - User::Leave(KErrArgument); CScanDrive* self=new (ELeave) CScanDrive(); CleanupStack::PushL(self); self->ConstructL(aMount); CleanupStack::Pop(); - return self; + + return self; } CScanDrive::~CScanDrive() { - for(TInt i=0;iClose(); delete iClusterListArray[i]; @@ -63,24 +64,28 @@ } /** -Allocates the Cluster array, the bit packed Fats and if run in a seperate -thread the extra CFatTable and cluster buffer - -@param aMount The owning mount + Creates the structure of this class. + @param aMount The owning mount */ void CScanDrive::ConstructL(CFatMountCB* aMount) { - iMount=aMount; + ASSERT(aMount); + + //--- setting up + iMount=aMount; + iGenericError = ENoErrors; + iDirError = ENoDirError; + iMaxClusters = iMount->UsableClusters()+KFatFirstSearchCluster; //-- UsableClusters() doesn't count first 2 unused clusers + //------------------------------ - //-- create bit vectors that will represent FAT on media and reconstructed by ScanDrive - //-- each bit in the vector represents 1 FAT cluster. - const TUint32 KClustersNum = iMount->UsableClusters()+KFatFirstSearchCluster; //-- UsableClusters() doesn't count first 2 unused clusers - + //-- create bit vectors that will represent FAT on media and reconstructed by ScanDrive. Each bit in the vector represents 1 FAT cluster. + const TUint32 KClustersNum = MaxClusters(); + CleanupClosePushL(iMediaFatBits); CleanupClosePushL(iScanFatBits); iMediaFatBits.CreateL(KClustersNum); - iScanFatBits.CreateL(KClustersNum);; + iScanFatBits.CreateL(KClustersNum); CleanupStack::Pop(&iScanFatBits); CleanupStack::Pop(&iMediaFatBits); @@ -88,18 +93,18 @@ //---------------------------------------------------------------------------------------------------- /** - FAT type-agnnostic parser. Reads whole FAT and sets up a bit vector. + FAT type-agnostic parser. Reads whole FAT and sets up a bit vector. for FAT12/16 it's OK, because the FAT12/16 is fully cached. */ void CScanDrive::DoParseFatL() { - const TInt MaxClusters = iMount->UsableClusters()+KFatFirstSearchCluster; - - + const TInt KMaxClusters = MaxClusters(); iMediaFatBits.Fill(0); - for(TInt i=KFatFirstSearchCluster; iFatType() == EFat32); + const TInt KNumClusters = MaxClusters(); + + __PRINT1(_L("CScanDrive::DoParseFat32L(), clusters:%d"), KNumClusters); - const TUint32 KNumClusters = iMount->UsableClusters()+KFatFirstSearchCluster; + ASSERT(iMount->FatType() == EFat32); + const TUint32 KFat1StartPos = iMount->StartOfFatInBytes(); const TUint32 KFatSize = KNumClusters * sizeof(TFat32Entry); //-- usable size of one FAT. @@ -183,6 +191,8 @@ CleanupStack::PopAndDestroy(&buf); } + + //---------------------------------------------------------------------------------------------------- /** Sets up a bit list representation of the media fat @@ -192,63 +202,23 @@ { ASSERT(iMount->ConsistentState()); + TInt nRes; + if(iMount->FatType() == EFat32) {//-- for FAT32 try to use specialised method of parsing - TInt nRes; TRAP(nRes, DoParseFat32L()) if(nRes == KErrNone) return; } - + + //-- use old FAT-agnostic parsing DoParseFatL(); } -/** -Set a cluster as visited in the bit packed scan Fat - -@param aCluster Cluster number -*/ -void CScanDrive::SetUsedL(TUint aCluster) - { - __ASSERT_ALWAYS(aCluster >= KFatFirstSearchCluster && aCluster < (KFatFirstSearchCluster+iMount->UsableClusters()),User::Leave(KErrCorrupt)); - iScanFatBits.SetBit(aCluster); - } - /** -Query whether a cluster is already set as used - -@param aCluster Cluster to query -*/ -TBool CScanDrive::AlreadyUsedL(TUint aCluster) const - { - __ASSERT_ALWAYS(aCluster >= KFatFirstSearchCluster && aCluster < (KFatFirstSearchCluster+iMount->UsableClusters()),User::Leave(KErrCorrupt)); - - return iScanFatBits[aCluster]; - } - -/** -@param aPos Position in a directory cluster -@return ETrue if aPos is the last entry in the root directory -*/ -TBool CScanDrive::IsEndOfRootDir(const TEntryPos& aPos)const - { - return(iMount->IsRootDir(aPos)&&(iMount->StartOfRootDirInBytes()+aPos.iPos==(iMount->RootDirEnd()-KSizeOfFatDirEntry))); - } - -/** -@param aVal Value of the cluster to be tested -@return ETrue if aVal is the end of cluster marker -*/ -TBool CScanDrive::IsEofF(TInt aVal) const - { - return iMount->IsEndOfClusterCh(aVal); - } - - -/** -@return True if a directory error has been found + @return True if a directory error has been found */ TBool CScanDrive::IsDirError() const { @@ -256,77 +226,103 @@ } /** - After StartL() and finishing allows us to know if there were any problems at all. + After StartL() and finishing allows us to know if there were any problems discovered at all. The client may wish to remount the filesystem if there were errors. - @return EFalse if there were no problems in FS. + @return The code describing the problem. */ -TBool CScanDrive::ProblemsDiscovered() const +CScanDrive::TGenericError CScanDrive::ProblemsDiscovered() const { - return IsDirError() || iFoundProblems; + + if(IsDirError()) + return EScanDriveDirError; + else + return iGenericError; } /** Sets the flag indicating than there are errors in filesystem structure See ProblemsDiscovered() + + @param aError a code describing the error */ -void CScanDrive::IndicateErrorsFound() +void CScanDrive::IndicateErrorsFound(TGenericError aError) { - iFoundProblems = ETrue; + ASSERT(aError != ENoErrors); + iGenericError = aError; } - +//---------------------------------------------------------------------------------------------------- /** -Start point for scan drive also fixes up errors - -@return The result of the scan -@leave + Start the scanner. The this calss description about what it actually does. + @param aMode specifies the operational mode. */ -TInt CScanDrive::StartL() +void CScanDrive::StartL(TScanDriveMode aMode) { - __PRINT1(_L("CScanDrive::StartL(), drive:%d"), iMount->DriveNumber()); + __PRINT2(_L("CScanDrive::StartL(%d), drive:%d"), aMode, iMount->DriveNumber()); + iScanDriveMode = aMode; //-- used for measuring time TTime timeStart; TTime timeEnd; + timeStart.UniversalTime(); //-- take start time - ReadMediaFatL(); + //timeEnd.UniversalTime(); //-- take end time + //elapsedTime = (TInt)( (timeEnd.MicroSecondsFrom(timeStart)).Int64() / K1mSec); + //__PRINT1(_L("#@@@ CScanDrive #1:%d ms "), elapsedTime); + CheckDirStructureL(); -#if defined(DEBUG_SCANDRIVE) - CompareFatsL(); -#endif - if(IsDirError()) - FixupDirErrorL(); + + //-- uncomments a line below if you need to compare real and restored FAT tables and print out all differences + //CompareFatsL(EFalse); + + //timeEnd.UniversalTime(); //-- take end time + //elapsedTime = (TInt)( (timeEnd.MicroSecondsFrom(timeStart)).Int64() / K1mSec); + //__PRINT1(_L("#@@@ CScanDrive #2:%d ms "), elapsedTime); - WriteNewFatsL(); -#if defined(DEBUG_SCANDRIVE) + if(CheckDiskMode()) + {//-- in check disk mode it is nesessarily just to detech FS errors + CompareFatsL(ETrue); //-- will stop on the first error found + } + else + {//-- In ScanDrive mode we need to find and fix Rugged FAT artefacts. + + if(IsDirError()) + FixupDirErrorL(); + + CompareAndFixFatsL(); + } + PrintErrors(); -#endif - timeEnd.UniversalTime(); //-- take end time - const TInt msScanTime = (TInt)( (timeEnd.MicroSecondsFrom(timeStart)).Int64() / K1mSec); - (void)msScanTime; - + const TInt elapsedTime = (TInt)( (timeEnd.MicroSecondsFrom(timeStart)).Int64() / K1mSec); + (void)elapsedTime; + __PRINT1(_L("CScanDrive: Directories visisted = %d\n"),iDirsChecked); - __PRINT1(_L("#@@@ CScanDrive time taken:%d ms "), msScanTime); + __PRINT1(_L("#@@@ CScanDrive time taken:%d ms "), elapsedTime); + + - return KErrNone; + return; } +//---------------------------------------------------------------------------------------------------- /** -Fix errors detected by the drive scan + Fix errors detected by the drive scan -@leave System wide error code + @leave System wide error code */ void CScanDrive::FixupDirErrorL() { - if(!IsDirError()) + ASSERT(!CheckDiskMode()); + + if(!IsDirError()) return; if(iDirError==EScanMatchingEntry) @@ -339,21 +335,23 @@ FixPartEntryL(); } - IndicateErrorsFound(); //-- indicate that we have found errors + IndicateErrorsFound(EScanDriveDirError); //-- indicate that we have found errors } +//---------------------------------------------------------------------------------------------------- /** -Find positions of entries with same start cluster for error correction, searches -the whole volume. Starts at the root directory. + Find positions of entries with same start cluster for error correction, searches + the whole volume. Starts at the root directory. -@leave System wide error code + @leave System wide error code */ void CScanDrive::FindSameStartClusterL() { TInt err=FindStartClusterL(iMount->RootIndicator()); if(err==KErrNone) return; - for(TInt i=0;i* clusterList=iClusterListArray[i]; for(TInt j=0;jCount();++j) @@ -364,15 +362,17 @@ return; } } + __ASSERT_ALWAYS(err==KErrNone,User::Leave(KErrNotFound)); } +//---------------------------------------------------------------------------------------------------- /** -Scan through directory structure looking for start cluster found in iMatching + Scan through directory structure looking for start cluster found in iMatching -@param aDirCluster Start cluster for scan to start -@return System wide error value -@leave + @param aDirCluster Start cluster for scan to start + @return System wide error value + @leave */ TInt CScanDrive::FindStartClusterL(TInt aDirCluster) { @@ -402,32 +402,36 @@ TEntryPos vfatPos=entryPos; isComplete=MoveToVFatEndL(entryPos,entry,dirEntries); __ASSERT_ALWAYS(isComplete,User::Leave(KErrBadName)); + TInt err=CheckEntryClusterL(entry,vfatPos); if(err==KErrNone) { --iRecursiveDepth; return(err); } + if(IsEndOfRootDir(entryPos)) break; + MoveToNextEntryL(entryPos); } --iRecursiveDepth; return(KErrNotFound); } +//---------------------------------------------------------------------------------------------------- /** -Procces aEntry to find matching start cluster + Procces aEntry to find matching start cluster -@param aEntry Directory entry to check -@param aEntryPos Position of directory to check -@return System wide error value -@leave + @param aEntry Directory entry to check + @param aEntryPos Position of directory to check + @return System wide error value + @leave */ TInt CScanDrive::CheckEntryClusterL(const TFatDirEntry& aEntry, const TEntryPos& aEntryPos) { __PRINT(_L("CScanDrive::CheckEntryClusterL")); - if(iMount->StartCluster(aEntry)==iMatching.iStartCluster) + if((TUint)iMount->StartCluster(aEntry)==iMatching.iStartCluster) { TBool complete=AddMatchingEntryL(aEntryPos); if(complete) @@ -435,14 +439,16 @@ } else if(aEntry.Attributes()&KEntryAttDir) return(FindStartClusterL(iMount->StartCluster(aEntry))); + return(KErrNotFound); } +//---------------------------------------------------------------------------------------------------- /** -Checks directory strucutre for errors, can be considered the start point of the scan. -Handles recursion depth to avoid stack overflow. + Checks directory structure for errors, can be considered the start point of the scan. + Handles recursion depth to avoid stack overflow. -@leave System wide error code + @leave System wide error code */ void CScanDrive::CheckDirStructureL() { @@ -450,7 +456,8 @@ // Due to recursive nature of CheckDirL when a depth of // KMaxScanDepth is reached clusters are stored in a list // and passed into CheckDirL afresh - for(TInt i=0;i* clusterList=iClusterListArray[i]; ++iListArrayIndex; @@ -463,17 +470,18 @@ } +//---------------------------------------------------------------------------------------------------- /** -Function is called recursively with Process entry untill the whole volume has been scanned. -Each directory entry is scanned for errors, these are recorded for later fixing. + This function is called recursively with Process entry untill the whole volume has been scanned. + Each directory entry is scanned for errors, these are recorded for later fixing. -@param aCluster Directory cluster to start checking -@leave System wide error codes + @param aCluster Directory cluster to start checking + @leave System wide error codes */ -void CScanDrive::CheckDirL(TInt aCluster) +void CScanDrive::CheckDirL(TUint32 aCluster) { __PRINT1(_L("CScanDrive::CheckDirL aCluster=%d"),aCluster); - __ASSERT_ALWAYS(aCluster>=0,User::Leave(KErrCorrupt)); + // check depth of recursion if(++iRecursiveDepth==KMaxScanDepth) { @@ -481,9 +489,9 @@ --iRecursiveDepth; return; } -#if defined(DEBUG_SCANDRIVE) + ++iDirsChecked; -#endif + TEntryPos entryPos(aCluster,0); TInt dirEntries=0; FOREVER @@ -492,31 +500,46 @@ ReadDirEntryL(entryPos,entry); if(!iMount->IsEndOfClusterCh(entryPos.iCluster)) ++dirEntries; - if(entry.IsParentDirectory()||entry.IsCurrentDirectory()||entry.IsErased()) + + if(entry.IsParentDirectory() || entry.IsCurrentDirectory() || entry.IsErased()) { if(IsEndOfRootDir(entryPos)) break; + MoveToNextEntryL(entryPos); continue; } + if(entry.IsEndOfDirectory()) { if(aCluster) - WriteClusterChainL(aCluster,dirEntries< directories. - if (!isComplete && origEntry.IsVFatEntry()) + + //-- this code seems to deal with one of the Rugged FAT artefacts: partially deleted VFAT entryset, when DOS entry is deleted first + //-- and delettion of VFAT ones had failed + if(!isComplete && origEntry.IsVFatEntry()) { AddPartialVFatL(origPos,origEntry); - if(entryPos.iCluster!=KEndOfDirectory) + if(!IsEofF(entryPos.iCluster)) { TInt toMove=origEntry.NumFollowing()-(dirEntries-origDirEntries); if(toMove) @@ -530,22 +553,26 @@ } } else - ProcessEntryL(entry); + { + ProcessEntryL(entry); + } + if(IsEndOfRootDir(entryPos)) break; + MoveToNextEntryL(entryPos); } --iRecursiveDepth; } - +//---------------------------------------------------------------------------------------------------- /** -Process non trivial entries, such as files, if they are correct by filling out their -cluster allocation in the bit packed Fat table. If it comes accross a directory -CheckDirL will be called. + Process non trivial entries, such as files, if they are correct by filling out their + cluster allocation in the bit packed Fat table. If it comes accross a directory + CheckDirL will be called. -@param aEntry Directory entry to check -@leave System wide error code + @param aEntry Directory entry to check + @leave System wide error code */ void CScanDrive::ProcessEntryL(const TFatDirEntry& aEntry) { @@ -553,82 +580,116 @@ TInt entryAtt=aEntry.Attributes(); __ASSERT_ALWAYS(!(entryAtt&~KEntryAttMaskSupported)&&!aEntry.IsErased(),User::Leave(KErrCorrupt)); - if(!(entryAtt&(KEntryAttDir|KEntryAttVolume)) && iMount->StartCluster(aEntry)>0) - WriteClusterChainL(iMount->StartCluster(aEntry),(TUint) aEntry.Size()); + + if(!(entryAtt&(KEntryAttDir|KEntryAttVolume)) && iMount->StartCluster(aEntry)>0) + {//-- this is a file with length >0. Check that its cluster chain corresponds to its size + RecordClusterChainL(iMount->StartCluster(aEntry),(TUint) aEntry.Size()); + } else if(entryAtt&KEntryAttDir) - CheckDirL(iMount->StartCluster(aEntry)); + {//-- this is the directory, walk into it + CheckDirL(iMount->StartCluster(aEntry)); + } } +//---------------------------------------------------------------------------------------------------- /** -Writes out the cluster chain for a correct file or directory, checks that the cluster -has not already been used and that the correct number of clusters are allocated for the -size of file. Registers cluster as used if correct + Walks the cluster chain for a correct file or directory, checks that the cluster + has not already been used and that the correct number of clusters are allocated for the + size of file. Registers cluster as used, if correct. -@param aCluster Cluster chain start point -@param aSizeInBytes Size of the file or directory in bytes -@leave System wide error values + @param aCluster Cluster chain start point + @param aSizeInBytes Size of the file or directory in bytes + @leave System wide error values */ -void CScanDrive::WriteClusterChainL(TInt aCluster,TUint aSizeInBytes) -// -// Mark off in the new fat the clusters used by entry with start cluster of aCluster -// +void CScanDrive::RecordClusterChainL(TInt aCluster, TUint aSizeInBytes) { - __PRINT1(_L("CScanDrive::WriteClusterChainL starting at %d"),aCluster); - __ASSERT_ALWAYS(aCluster>0,User::Leave(KErrCorrupt)); - TInt clusterCount; - if(aSizeInBytes==0) + __PRINT2(_L("CScanDrive::RecordClusterChainL() cl:%d, sz:%d") ,aCluster, aSizeInBytes); + __ASSERT_ALWAYS(aCluster>0, User::Leave(KErrCorrupt)); + + TUint clusterCount; + + if(aSizeInBytes==0) clusterCount=1; else - clusterCount = (TInt) (( TInt64(aSizeInBytes) + TInt64((1<ClusterSizeLog2())-1) ) >> iMount->ClusterSizeLog2()); + { + const TUint64 tmp = aSizeInBytes + Pow2_64(iMount->ClusterSizeLog2()) - 1; + clusterCount = (TUint) (tmp >> iMount->ClusterSizeLog2()); + } + TInt startCluster=aCluster; while(clusterCount) { - if(AlreadyUsedL(aCluster)) - { - __ASSERT_ALWAYS(!IsDirError()&&iMatching.iStartCluster==0&&aCluster==startCluster,User::Leave(KErrCorrupt)); + if(IsClusterUsedL(aCluster)) + {//-- this cluster already seems to belong to some other object; crosslinked cluster chain. Can't fix it. + if(CheckDiskMode()) + {//-- in check disk mode this is a FS error; Indicate error and abort furter scanning + __PRINT1(_L("CScanDrive::RecordClusterChainL #1 %d"),aCluster); + IndicateErrorsFound(EClusterAlreadyInUse); + User::Leave(KErrCorrupt); + } + + __ASSERT_ALWAYS(!IsDirError() && iMatching.iStartCluster==0 && aCluster==startCluster,User::Leave(KErrCorrupt)); iMatching.iStartCluster=aCluster; iDirError=EScanMatchingEntry; //ERROR POINT - IndicateErrorsFound(); //-- indicate that we have found errors + IndicateErrorsFound(EScanDriveDirError); //-- indicate that we have found errors return; } - if(clusterCount==1) + + + if(clusterCount==1) { if(!iMount->IsEndOfClusterCh(ReadFatL(aCluster))) - { - //This is a genuine truncation + {//-- seems to be a rugged FAT artefact; File truncation had failed before and now file length is less than + //-- the corresponding cluster chain shall be. It will be truncated. iTruncationCluster = aCluster; + + if(CheckDiskMode()) + {//-- in check disk mode this is a FS error; Indicate error and abort furter scanning + __PRINT1(_L("CScanDrive::RecordClusterChainL #2 %d"),aCluster); + IndicateErrorsFound(EInvalidEntrySize); + User::Leave(KErrCorrupt); + } } - SetUsedL(aCluster); + + //__PRINT1(_L("#--: %d -> EOC"), aCluster); + MarkClusterUsedL(aCluster); return; } else { - TInt clusterVal=ReadFatL(aCluster); - __ASSERT_ALWAYS(!IsEofF(clusterVal) && clusterVal!=0,User::Leave(KErrCorrupt)); - SetUsedL(aCluster); + const TUint clusterVal=ReadFatL(aCluster); + + //__PRINT2(_L("#--: %d -> %d"), aCluster, clusterVal); + + __ASSERT_ALWAYS(!IsEofF(clusterVal) && clusterVal !=KSpareCluster, User::Leave(KErrCorrupt)); + MarkClusterUsedL(aCluster); aCluster=clusterVal; --clusterCount; } - } + + }//while(clusterCount) } +//---------------------------------------------------------------------------------------------------- /** -Move to dos entry, checking all vfat entry ID numbers are in sequence. -Assumes aEntry is not erased + Move to dos entry, checking all vfat entry ID numbers are in sequence. + Assumes aEntry is not erased -@param aPos Position of the entry to move from, returns with new position -@param aEntry The Dos entry after the Vfat entries on return -@param aDirLength Running total of the length of the directory in entries -@leave System wide error codes -@return EFalse if not valid vfat entries or dos entry, else returns ETrue + @param aPos Position of the entry to move from, returns with new position + @param aEntry The Dos entry after the Vfat entries on return + @param aDirLength Running total of the length of the directory in entries + @leave System wide error codes + @return EFalse if not valid vfat entries or dos entry, else returns ETrue */ TBool CScanDrive::MoveToVFatEndL(TEntryPos& aPos,TFatDirEntry& aEntry,TInt& aDirLength) { __PRINT2(_L("CScanDrive::MoveToVFatEndL cluster=%d,pos=%d"),aPos.iCluster,aPos.iPos); if(!aEntry.IsVFatEntry()) return IsDosEntry(aEntry); + TInt toFollow=aEntry.NumFollowing(); - __ASSERT_ALWAYS(toFollow>0&&!aEntry.IsErased(),User::Leave(KErrCorrupt)); + __ASSERT_ALWAYS(toFollow>0 && !aEntry.IsErased(), User::Leave(KErrCorrupt)); + FOREVER { MoveToNextEntryL(aPos); @@ -637,31 +698,36 @@ --toFollow; if(!toFollow) break; - if(!IsValidVFatEntry(aEntry,toFollow)) + + if(!IsValidVFatEntry(aEntry,toFollow)) return(EFalse); } - return(IsDosEntry(aEntry)); + + return(IsDosEntry(aEntry)); } +//---------------------------------------------------------------------------------------------------- /** -Check if an entry is valid VFat + Check if an entry is valid VFat -@param aEntry Entry to check -@param aPrevNum Number into VFat entries for a dos entry to ensure in correct position -@return ETrue if aEntry is a valid vfat entry + @param aEntry Entry to check + @param aPrevNum Number into VFat entries for a dos entry to ensure in correct position + @return ETrue if aEntry is a valid vfat entry */ TBool CScanDrive::IsValidVFatEntry(const TFatDirEntry& aEntry,TInt aPrevNum)const { if(aEntry.IsErased()||!aEntry.IsVFatEntry()) - return(EFalse); + return EFalse; + return(aEntry.NumFollowing()==aPrevNum); } +//---------------------------------------------------------------------------------------------------- /** -Check if an entry is a Dos entry + Check if an entry is a Dos entry -@param aEntry Entry to check -@return ETrue if aEntry is a dos entry + @param aEntry Entry to check + @return ETrue if aEntry is a dos entry */ TBool CScanDrive::IsDosEntry(const TFatDirEntry& aEntry)const { @@ -669,13 +735,13 @@ return res; } +//---------------------------------------------------------------------------------------------------- /** -Add partial entry to iPartEntry under the error condition of not all Vfat entries -being present + Add partial entry to iPartEntry under the error condition of not all Vfat entries being present -@param aStartPos Position of the Dos entry associated with the VFat entries -@param aEntry Directory Entry of the Dos entry associated with the VFat entries -@leave KErrCorrupt Occurs if the entry is not valid + @param aStartPos Position of the Dos entry associated with the VFat entries + @param aEntry Directory Entry of the Dos entry associated with the VFat entries + @leave KErrCorrupt Occurs if the entry is not valid */ void CScanDrive::AddPartialVFatL(const TEntryPos& aStartPos, const TFatDirEntry& aEntry) { @@ -686,12 +752,13 @@ iDirError=EScanPartEntry; } +//---------------------------------------------------------------------------------------------------- /** -Add entry position to iMatching + Add entry position to iMatching -@param aEntryPos Position of the entry with the matching entry -@leave KErrCorrupt if the start cluster is 0 or more that two matching entries occurs -@return + @param aEntryPos Position of the entry with the matching entry + @leave KErrCorrupt if the start cluster is 0 or more that two matching entries occurs + @return */ TBool CScanDrive::AddMatchingEntryL(const TEntryPos& aEntryPos) { @@ -702,15 +769,18 @@ } +//---------------------------------------------------------------------------------------------------- /** -Scan for differnces in the new and old FAT table writing them to media if discovered + Scan for differnces in the new and old FAT table writing them to media if discovered + It is supposed to be called in 'ScanDrive' mode only -@leave System wide error codes + @leave System wide error codes */ -void CScanDrive::WriteNewFatsL() +void CScanDrive::CompareAndFixFatsL() { - - __PRINT1(_L("CScanDrive::WriteNewFatsL() drv:%d"),iMount->DriveNumber()); + __PRINT1(_L("CScanDrive::CompareAndFixFatsL() drv:%d"),iMount->DriveNumber()); + + ASSERT(!CheckDiskMode()); TUint32 nClustersFixed = 0; //-- fixed clusters count TUint32 nBadClusters = 0; //-- bad cluster count @@ -732,7 +802,7 @@ {//-- difference in the cluster "i" between a real FAT and what ScanDrive restored. //-- indicate that there are some problems in FAT. and we probably wrote something there. - IndicateErrorsFound(); + IndicateErrorsFound(EScanDriveDirError); //-- skip BAD cluster, can't mark it as unused. if(iMount->IsBadCluster(ReadFatL(i))) @@ -790,7 +860,7 @@ iMount->FAT().FlushL(); //-- indicate that there are some problems in FAT. and we probably wrote something there. - IndicateErrorsFound(); //-- indicate that we have found errors + IndicateErrorsFound(EScanDriveDirError); //-- indicate that we have found errors ++nClustersFixed; } @@ -798,14 +868,15 @@ __PRINT2(_L("CScanDrive::WriteNewFatsL() fixed:%d, bad:%d"), nClustersFixed, nBadClusters); } +//---------------------------------------------------------------------------------------------------- /** -Read the ID stored in reserved2 in the Dos entry or associated with the Dos entry of the -Entry at the position passed in. This is used to find which version of two matching entries -should be kept. + Read the "Rugged FAT" ID, stored in reserved2 in the Dos entry or associated with the Dos entry of the + Entry at the position passed in. This is used to find which version of two matching entries should be kept. + -@param aVFatPos Position of an entry to read ID from -@leave System wide error codes -@return The ID found in reserved2 field of dos entry + @param aVFatPos Position of an entry to read ID from + @leave System wide error codes + @return The ID found in reserved2 field of dos entry */ TInt CScanDrive::GetReservedidL(TEntryPos aVFatPos) { @@ -822,47 +893,54 @@ return(entry.RuggedFatEntryId()); } +//---------------------------------------------------------------------------------------------------- /** -Erase part entry found in iPartEntry - -@leave System wide error code + Erase part entry found in iPartEntry + @leave System wide error code */ void CScanDrive::FixPartEntryL() { __PRINT2(_L("CScanDrive::FixPartEntryL cluster=%d,pos=%d"),iPartEntry.iEntryPos.iCluster,iPartEntry.iEntryPos.iPos); - iMount->EraseDirEntryL(iPartEntry.iEntryPos,iPartEntry.iEntry); - IndicateErrorsFound(); //-- indicate that we have found errors + ASSERT(!CheckDiskMode()); + iMount->EraseDirEntryL(iPartEntry.iEntryPos,iPartEntry.iEntry); + IndicateErrorsFound(EScanDriveDirError); //-- indicate that we have found errors } +//---------------------------------------------------------------------------------------------------- /** -Delete entry with largest value in the reserved2 section(bytes 20 and 21) of dos entry + Delete entry with largest value in the reserved2 section(bytes 20 and 21) of dos entry -@leave System wide error code + @leave System wide error code */ void CScanDrive::FixMatchingEntryL() { - __PRINT1(_L("CScanDrive::FixMatchingEntryL() start cluster=%d"),iMatching.iStartCluster); + + __PRINT1(_L("CScanDrive::FixMatchingEntryL() start cluster=%d"),iMatching.iStartCluster); __ASSERT_ALWAYS(iMatching.iCount==KMaxMatchingEntries,User::Leave(KErrCorrupt)); - TInt idOne=GetReservedidL(iMatching.iEntries[0]); + ASSERT(!CheckDiskMode()); + + TInt idOne=GetReservedidL(iMatching.iEntries[0]); TInt idTwo=GetReservedidL(iMatching.iEntries[1]); TFatDirEntry entry; TInt num=idOne>idTwo?0:1; ReadDirEntryL(iMatching.iEntries[num],entry); iMount->EraseDirEntryL(iMatching.iEntries[num],entry); - IndicateErrorsFound(); //-- indicate that we have found errors + IndicateErrorsFound(EScanDriveDirError); //-- indicate that we have found errors } -/** -Move past specified number of entries -@param aEntryPos Start position to move from, updated as move takes place -@param aEntry Directory entry moved to -@param aToMove Number of entries to move through -@param aDirEntries Number of entries moved, updated as move takes place -@leave System wide error code +//---------------------------------------------------------------------------------------------------- +/** + Move past specified number of entries + + @param aEntryPos Start position to move from, updated as move takes place + @param aEntry Directory entry moved to + @param aToMove Number of entries to move through + @param aDirEntries Number of entries moved, updated as move takes place + @leave System wide error code */ void CScanDrive::MovePastEntriesL(TEntryPos& aEntryPos,TFatDirEntry& aEntry,TInt aToMove,TInt& aDirEntries) { - while(aToMove-- && aEntryPos.iCluster!=KEndOfDirectory) + while(aToMove-- && !IsEofF(aEntryPos.iCluster)) { MoveToNextEntryL(aEntryPos); ++aDirEntries; @@ -870,33 +948,38 @@ ReadDirEntryL(aEntryPos,aEntry); } +//---------------------------------------------------------------------------------------------------- /** -Adds aCluster to cluster list array so that it may be revisited later, avoids stack -over flow + Adds aCluster to cluster list array so that it may be revisited later, avoids stack + over flow -@param aCluster Directory cluster number to add to the list -@leave KErrNoMemory If allocation fails + @param aCluster Directory cluster number to add to the list + @leave KErrNoMemory If allocation fails */ void CScanDrive::AddToClusterListL(TInt aCluster) { + if(iListArrayIndex>=KMaxArrayDepth) return; + if(iClusterListArray[iListArrayIndex]==NULL) iClusterListArray[iListArrayIndex]=new(ELeave) RArray(KClusterListGranularity); iClusterListArray[iListArrayIndex]->Append(aCluster); } -#if defined(DEBUG_SCANDRIVE) +//---------------------------------------------------------------------------------------------------- /** -Used for debug purposes only, compares new Fat and first Fat table, displays any differences -and there meaning - -@leave System wide error codes + Used in "CheckDisk" mode mostly. Compares first FAT table on the media with the FAT bitmap restored by walking the directory structure. + Displays any differences and records an error if found. + + @param aStopOnFirstErrorFound if ETrue will stop after discovering first error (FATs discrepancy) + + @leave System wide error codes */ -void CScanDrive::CompareFatsL() const +void CScanDrive::CompareFatsL(TBool aStopOnFirstErrorFound) { - __PRINT(_L("CScanDrive::CompareFatsL()")); + __PRINT1(_L("CScanDrive::CompareFatsL(%d)"), aStopOnFirstErrorFound); TUint32 diffPos; @@ -904,34 +987,51 @@ return; //-- FATs are identical //-- there is a difference between the real FAT and reconstructed one. Find the mismaching bit and fix FAT. - const TInt clusters = iMount->UsableClusters(); + const TUint clusters = iMount->UsableClusters(); ASSERT(diffPos < (TUint32)clusters); - TInt scanusedcnt=0; - TInt mediausedcnt=0; + TUint scanusedcnt=0; + TUint mediausedcnt=0; - for(TInt i=diffPos; iIsBadCluster(ReadFatL(i))) + continue; //-- this is a BAD cluster it can't be occupied by the FS object, OK. + + __PRINT2(_L("FAT[%d] = %d\n"), i, ReadFatL(i)); + __PRINT1(_L("iTruncationCluster = %d\n"), iTruncationCluster); + + //-- this is a lost cluster + if(!IsEofF(ReadFatL(i)) && (i==iTruncationCluster)) + {//-- seems to be a Rugged FAT ertefact + __PRINT1(_L("Hanging cluster = %d\n"),i); + } + else + { + __PRINT1(_L("Lost cluster=%d\n"),i); + } + + + IndicateErrorsFound(EBadClusterValue); } - else if((bRealFatEntry && !IsEofF(ReadFatL(i))) && (i==iTruncationCluster)) - { - __PRINT1(_L("Hanging cluster = %d\n"),i); + else + {//-- FAT[i] on the media is marked as free, but retored FAT bitmap shows that it is occupied by some object + IndicateErrorsFound(EClusterAlreadyInUse); + __PRINT1(_L("Unflushed cluster = %d\n"),i); } - else if(!bRealFatEntry && bNewFatEntry) - { - __PRINT1(_L("Unflushed cluster = %d\n"),i); - } - else - User::Leave(KErrCorrupt); - } + + if(aStopOnFirstErrorFound) + break; //-- not asked to check for errors further + + } if(bRealFatEntry) mediausedcnt++; @@ -943,11 +1043,13 @@ __PRINT2(_L("Scan Fat Used=%d, Media Fat Used=%d \n"),scanusedcnt,mediausedcnt); } +//---------------------------------------------------------------------------------------------------- /** -For debug purposes, print errors found as debug output + For debug purposes, print errors found as debug output */ void CScanDrive::PrintErrors() { +#if defined(_DEBUG) __PRINT1(_L("Directories visisted = %d\n"),iDirsChecked); if(iDirError==EScanPartEntry) @@ -960,8 +1062,10 @@ __PRINT2(_L("\tcluster 1 - dir cluster=%d,dir pos=%d\n"),iMatching.iEntries[0].iCluster,iMatching.iEntries[0].iPos); __PRINT2(_L("\tcluster 2 - dir cluster=%d,dir pos=%d\n"),iMatching.iEntries[1].iCluster,iMatching.iEntries[1].iPos); } +#endif } -#endif + + /** Read a FAT directory entry from disk, either reads directly from the main cache or @@ -973,7 +1077,7 @@ */ void CScanDrive::ReadDirEntryL(const TEntryPos& aPos,TFatDirEntry& aDirEntry) { - __PRINT(_L("CScanDrive::ReadDirEntryL")); + //__PRINT(_L("CScanDrive::ReadDirEntryL")); if (iMount->IsEndOfClusterCh(aPos.iCluster)) { Mem::FillZ(&aDirEntry,sizeof(TFatDirEntry)); @@ -985,12 +1089,10 @@ /** -Move to next directory entry, if anEntry is at the end of the cluster, and we are not -the root dir, move it to the next cluster in the chain. + Move to next directory entry, if anEntry is at the end of the cluster, and we are not + the root dir, move it to the next cluster in the chain. -@param aPos Current directory position up dated to position of next entry. -@leave System wide error codes - + @param aPos Current directory position up dated to position of next entry. */ void CScanDrive::MoveToNextEntryL(TEntryPos& aPos) { @@ -999,16 +1101,86 @@ } /** -Read a cluster from the Media Fat if scan run in a seperate thread read from scan fat table -otherwise read from mount owned Fat table + Read a cluster from the Media Fat if scan run in a seperate thread read from scan fat table + otherwise read from mount owned Fat table + + @param aClusterNum Cluster to read + @return Value of cluster read from Fat +*/ +TUint32 CScanDrive::ReadFatL(TUint aClusterNum) + { + if(aClusterNum < KFatFirstSearchCluster || aClusterNum >= MaxClusters()) + { + IndicateErrorsFound(EBadClusterNumber); + User::Leave(KErrCorrupt); + } + + //-- actually, ReadL() can leave with some error code, that won't be reflected in IndicateErrorsFound(). + //-- it's possible to improve but is it worth it? + return iMount->FAT().ReadL(aClusterNum); + } + + +/** + Set a cluster as visited in the bit packed scan Fat + @param aCluster Cluster number +*/ +void CScanDrive::MarkClusterUsedL(TUint aClusterNum) + { + if(aClusterNum < KFatFirstSearchCluster || aClusterNum >= MaxClusters()) + { + IndicateErrorsFound(EBadClusterNumber); + User::Leave(KErrCorrupt); + } + + iScanFatBits.SetBit(aClusterNum); + } + -@param aClusterNum Cluster to read -@leave System wide error code -@return Value of cluster read from Fat +/** + Query whether a cluster is already set as used + @param aCluster Cluster to query +*/ +TBool CScanDrive::IsClusterUsedL(TUint aClusterNum) + { + if(aClusterNum < KFatFirstSearchCluster || aClusterNum >= MaxClusters()) + { + IndicateErrorsFound(EBadClusterNumber); + User::Leave(KErrCorrupt); + } + + return iScanFatBits[aClusterNum]; + } + +/** + @param aPos Position in a directory cluster + @return ETrue if aPos is the last entry in the root directory */ -TUint32 CScanDrive::ReadFatL(TInt aClusterNum) const +TBool CScanDrive::IsEndOfRootDir(const TEntryPos& aPos)const + { + return(iMount->IsRootDir(aPos)&&(iMount->StartOfRootDirInBytes()+aPos.iPos==(iMount->RootDirEnd()-KSizeOfFatDirEntry))); + } + +/** + @param aVal Value of the cluster to be tested + @return ETrue if aVal is the end of cluster marker +*/ +TBool CScanDrive::IsEofF(TInt aVal) const { - return iMount->FAT().ReadL(aClusterNum); + return iMount->IsEndOfClusterCh(aVal); + } + +/** @return max. number of clusters on the volume being scanned */ +TUint32 CScanDrive::MaxClusters() const + { + ASSERT(iMaxClusters); + return iMaxClusters; + } + +/** @return ETrue in we are operating in "CheckDisk" mode*/ +TBool CScanDrive::CheckDiskMode() const + { + return iScanDriveMode == ECheckDisk; } @@ -1019,5 +1191,3 @@ - - diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfat32/sl_utl.cpp --- a/userlibandfileserver/fileserver/sfat32/sl_utl.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfat32/sl_utl.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -16,32 +16,6 @@ #include "sl_std.h" //----------------------------------------------------------------------------- -/** - Removes trailing dots from aName. - @return new string descriptor that may have its length adjusted -*/ -TPtrC RemoveTrailingDots(const TDesC& aName) -{ - TInt len = aName.Length(); - - while(len > 0) - { - if(aName[len-1] == '.') - len--; - else - break; - } - - TPtrC ptrNoDots(aName.Ptr(), len); - return ptrNoDots; -} - - -TUint32 Log2(TUint32 aVal) -{ - return Log2_inline(aVal); -} - TTime DosTimeToTTime(TInt aDosTime,TInt aDosDate) // @@ -195,681 +169,8 @@ return (TUint8)chkSum; } -//----------------------------------------------------------------------------- - -const TUint32 K_FFFF = 0xFFFFFFFF; //-- all one bits, beware rigth shifts of signed integers! - - -RBitVector::RBitVector() - :iNumBits(0), ipData(NULL), iNumWords(0) - { - } - - -RBitVector::~RBitVector() - { - Close(); - } - -/** - Panics. - @param aPanicCode a panic code -*/ -void RBitVector::Panic(TPanicCode aPanicCode) const - { - _LIT(KPanicCat,"RBitVector"); - User::Panic(KPanicCat, aPanicCode); - } - -/** explicitly closes the object and deallocates memory */ -void RBitVector::Close() - { - iNumBits = 0; - iNumWords =0; - User::Free(ipData); - ipData = NULL; - } - -//----------------------------------------------------------------------------- - -/** - Comparison perator. - @param aRhs a vector to compate with. - @panic ESizeMismatch in the case of different vector sizes -*/ -TBool RBitVector::operator==(const RBitVector& aRhs) const - { - __ASSERT_ALWAYS(ipData, Panic(ENotInitialised)); - __ASSERT_ALWAYS(iNumBits == aRhs.iNumBits, Panic(ESizeMismatch)); - - - if(!iNumBits) - return ETrue; //-- comparing 0-lenght arrays - - if(this == &aRhs) - return ETrue; //-- comparing with itself - - if(iNumWords >= 1) - { - const TUint32 cntBytes = (iNumBits >> 5) << 2; //-- bytes to compare - if(memcompare((const TUint8*)ipData, cntBytes, (const TUint8*)aRhs.ipData, cntBytes)) - return EFalse; - } - - const TUint32 bitsRest = iNumBits & 0x1F; - if(bitsRest) - { - const TUint32 mask = K_FFFF >> (32-bitsRest); - return ( (ipData[iNumWords-1] & mask) == (aRhs.ipData[iNumWords-1] & mask) ); - } - - return ETrue; - } - -TBool RBitVector::operator!=(const RBitVector& aRhs) const - { - return ! ((*this) == aRhs); - } - -//----------------------------------------------------------------------------- - -/** The same as Create(), but leaves on error */ -void RBitVector::CreateL(TUint32 aNumBits) - { - User::LeaveIfError(Create(aNumBits)); - } - - -/** - Create the vector with the size of aNumBits bits. - @return system-wide error codes: - KErrNoMemory unable to allocate sufficient amount of memory for the array - KErrInUse an attempt to call Create() for non-empty vector. Close it first. - KErrArgument invalid aNumBits value == 0 -*/ -TInt RBitVector::Create(TUint32 aNumBits) - { - - if(ipData) - return KErrInUse; //-- array is already in use. Close it first. - - if(!aNumBits) - return KErrArgument; - - //-- memory is allocated by word (32 bit) quiantities - const TUint32 numWords = (aNumBits >> 5) + ((aNumBits & 0x1F) > 0 ? 1:0); - ipData = (TUint32*)User::AllocZ(numWords << 2); - - if(!ipData) - return KErrNoMemory; - - iNumBits = aNumBits; - iNumWords = numWords; - - return KErrNone; - } - - -/** - Fill a bit vector with a given bit value - @param aVal a bit value -*/ -void RBitVector::Fill(TBool aVal) - { - __ASSERT_ALWAYS(ipData, Panic(ENotInitialised)); - memset(ipData, (aVal ? 0xFF : 0x00), iNumWords << 2); - } - -/** Invert all bits in a bit vector */ -void RBitVector::Invert() -{ - __ASSERT_ALWAYS(ipData, Panic(ENotInitialised)); - for(TUint32 i=0; i aIndexTo) - { - const TUint32 tmp = aIndexFrom; - aIndexFrom = aIndexTo; - aIndexTo = tmp; - } - - __ASSERT_ALWAYS((aIndexFrom < iNumBits) && (aIndexTo < iNumBits), Panic(EIndexOutOfRange)); - - const TUint32 wordStart = WordNum(aIndexFrom); - const TUint32 wordTo = WordNum(aIndexTo); - - if(aVal) - {//-- filling a range with '1' - - TUint32 shift = BitInWord(aIndexFrom); - const TUint32 mask1 = (K_FFFF >> shift) << shift; - - TUint32 mask2 = K_FFFF; - shift = 1+BitInWord(aIndexTo); - if(shift < 32) - { - mask2 = ~((mask2 >> shift) << shift); - } - - if(wordTo == wordStart) - {//-- a special case, filling is in the same word - ipData[wordStart] |= (mask1 & mask2); - } - else - { - ipData[wordStart] |= mask1; - ipData[wordTo] |= mask2; - - const TUint32 wholeWordsBetween = wordTo - wordStart - 1; //-- whole words that can be bulk filled - - if(wholeWordsBetween) - memset(ipData+wordStart+1, 0xFF, wholeWordsBetween << 2); - - } - } - else - {//-- filling a range with '0' - - //-- if you need this functionality, remove the panic and uncomment the code below. - - Panic(ENotImplemented); - - /* - TUint32 shift = BitInWord(aIndexFrom); - const TUint32 mask1 = ~((K_FFFF >> shift) << shift); - - TUint32 mask2 = 0; - shift = 1+BitInWord(aIndexTo); - if(shift < 32) - { - mask2 = ((K_FFFF >> shift) << shift); - } - - if(wordTo == wordStart) - {//-- a special case, filling is in the same word - ipData[wordStart] &= (mask1 | mask2); - } - else - { - ipData[wordStart] &= mask1; - ipData[wordTo] &= mask2; - - const TUint32 wholeWordsBetween = wordTo - wordStart - 1; //-- whole words that can be bulk filled - - if(wholeWordsBetween) - memset(ipData+wordStart+1, 0x00, wholeWordsBetween << 2); - - } - */ - } - - } - -//----------------------------------------------------------------------------- - -/** - Search for a specified bit value ('0' or '1') in the vector from the given position. - @param aStartPos zero-based index; from this position the search will start. This position isn't included to the search. - On return may contain a new position if the specified bit is found in specified direction. - @param aBitVal zero or non-zero bit to search. - @param aDir Specifies the search direction - - @return ETrue if the specified bit value is found; aStartPos gets updated. - EFalse otherwise. - -*/ -TBool RBitVector::Find(TUint32& aStartPos, TBool aBitVal, TFindDirection aDir) const - { - __ASSERT_ALWAYS(aStartPos < iNumBits, Panic(EIndexOutOfRange)); - ASSERT(iNumWords && ipData); - - switch(aDir) - { - case ERight: //-- Search from the given position to the right - return FindToRight(aStartPos, aBitVal); - - case ELeft: //-- Search from the given position to the left (towards lower index) - return FindToLeft(aStartPos, aBitVal); - - case ENearestL: //-- Search for the nearest value in both directions starting from left - return FindNearest(aStartPos, aBitVal, ETrue); - - case ENearestR: //-- Search for the nearest value in both directions starting from right - return FindNearest(aStartPos, aBitVal, EFalse); - - default: - Panic(EWrondFindDirection); - return EFalse; - - }; - - } - -//----------------------------------------------------------------------------- -/** - Internal method to look for a given bit value in the right direction. - see TBool RBitVector::Find(...) -*/ -TBool RBitVector::FindToRight(TUint32& aStartPos, TBool aBitVal) const - { - if(aStartPos >= iNumBits-1) - return EFalse; //-- no way to the right - - const TUint32 startPos = aStartPos+1; - const TUint32 fInvert = aBitVal ? 0 : K_FFFF; //-- invert everything if we are looking for '0' bit - - TUint32 wordNum = WordNum(startPos); - TUint32 val = ipData[wordNum] ^ fInvert; - - if(wordNum == iNumWords-1) - {//-- process the last word in the array, some higher bits might not belong to the bit vector - val = MaskLastWord(val); - } - - const TUint32 shift = BitInWord(startPos); - val = (val >> shift) << shift; //-- mask unused low bits - - if(val) - {//-- there are '1' bits in the current word - goto found; - } - else - {//-- search in higher words - wordNum++; - - while(iNumWords-wordNum > 1) - { - val = ipData[wordNum] ^ fInvert; - if(val) - goto found; - - wordNum++; - } - - if(wordNum == iNumWords-1) - {//-- process the last word in the array, some higher bith might not belong to the bit vector - val = ipData[wordNum] ^ fInvert; - val = MaskLastWord(val); - - if(val) - goto found; - } - } - - return EFalse; //-- haven't found anything - - found: - - val &= (~val+1); //-- select rightmost bit - aStartPos = (wordNum << 5)+Log2(val); - return ETrue; - } - - -//----------------------------------------------------------------------------- - -/** - Internal method to look for a given bit value in the left direction. - see TBool RBitVector::Find(...) -*/ -TBool RBitVector::FindToLeft(TUint32& aStartPos, TBool aBitVal) const -{ - if(!aStartPos) - return EFalse; //-- no way to the left - - const TUint32 startPos=aStartPos-1; - const TUint32 fInvert = aBitVal ? 0 : K_FFFF; //-- invert everything if we are looking for '0' bit - - TUint32 wordNum = WordNum(startPos); - TUint32 val = ipData[wordNum] ^ fInvert; - - const TUint32 shift = 31-(BitInWord(startPos)); - val = (val << shift) >> shift; //-- mask unused high bits - - if(val) - {//-- there are '1' bits in the current word - goto found; - } - else - {//-- search in the lower words - while(wordNum) - { - wordNum--; - val=ipData[wordNum] ^ fInvert; - if(val) - goto found; - } - } - - return EFalse; //-- nothing found - - found: - aStartPos = (wordNum << 5)+Log2(val); - return ETrue; -} - -//----------------------------------------------------------------------------- - -/** - Internal method to look for a given bit value in the both directions. - see TBool RBitVector::Find(...) -*/ -TBool RBitVector::FindNearest(TUint32& aStartPos, TBool aBitVal, TBool aToLeft) const -{ - if(iNumBits < 2) - return EFalse; - - if(aStartPos == 0) - return FindToRight(aStartPos, aBitVal); - - if(aStartPos == iNumBits-1) - return FindToLeft(aStartPos, aBitVal); - - - const TUint32 fInvert = aBitVal ? 0 : K_FFFF; //-- invert everything if we are looking for '0' bit - - TUint32 wordNum = WordNum(aStartPos); - TUint32 l_Idx; //-- index of the word to the left - TUint32 r_Idx; //-- index of the word to the right - - l_Idx = r_Idx = wordNum; - - TBool noWayLeft = (wordNum == 0); //-- if we are in the first word - TBool noWayRight = (wordNum == iNumWords-1); //-- if we are in the last word - - //-- look in the current word first - TUint32 val = ipData[wordNum] ^ fInvert; - - if(noWayRight) - { //-- this is the last word in the array, mask unused high bits in the last word - val = MaskLastWord(val); - } - - const TUint32 bitPos = aStartPos & 0x1F; - val &= ~(1<> shift1; //-- towards lower bits - - const TUint32 shift2 = bitPos+1; - const TUint32 partHi = (val >> shift2) << shift2; //-- towards higher bits - - - if(partLo && !partHi) //-- only lower part has '1' bits - { - aStartPos = (wordNum << 5)+Log2(partLo); - return ETrue; - } - else if(!partLo && partHi) //-- only higher part has '1' bits - { - aStartPos = (wordNum << 5)+Log2( (partHi & (~partHi+1)) ); - return ETrue; - } - else if(partLo && partHi) //-- both parts contain '1' bits, select the nearest one - { - const TUint32 posL = (wordNum << 5)+Log2(partLo); - const TUint32 posR = (wordNum << 5)+Log2( (partHi & (~partHi+1)) ); - - ASSERT(aStartPos > posL); - ASSERT(posR > aStartPos); - const TUint32 distL = aStartPos-posL; - const TUint32 distR = posR-aStartPos; - - if(distL < distR) - { - aStartPos = posL; - return ETrue; - } - else if(distL > distR) - { - aStartPos = posR; - return ETrue; - } - else - {//-- distL == distR, take into account search priority - aStartPos = aToLeft ? posL : posR; - return ETrue; - } - } - else //-- (!partLo && !partHi), nothing in the current word - { - ASSERT(0); - } - - }// if(bitPos > 0 && bitPos < 31) - - //-- now we are processing separate words from both sides of the search position - for(;;) - { - TUint32 wL = ipData[l_Idx] ^ fInvert; - TUint32 wR = ipData[r_Idx] ^ fInvert; - if(r_Idx == iNumWords-1) - { //-- this is the last word in the array, mask unused high bits in the last word - wR = MaskLastWord(wR); - } - - if(wL && !wR) - { - aStartPos = (l_Idx << 5)+Log2(wL); - return ETrue; - } - else if(!wL && wR) - { - aStartPos = (r_Idx << 5)+Log2( (wR & (~wR+1)) ); - return ETrue; - } - else if(wL && wR) - { - const TUint32 posL = (l_Idx << 5)+Log2(wL); - const TUint32 posR = (r_Idx << 5)+Log2( (wR & (~wR+1)) ); - - ASSERT(aStartPos > posL); - ASSERT(posR > aStartPos); - const TUint32 distL = aStartPos-posL; - const TUint32 distR = posR-aStartPos; - - if(distL < distR) - { - aStartPos = posL; - return ETrue; - } - else if(distL > distR) - { - aStartPos = posR; - return ETrue; - } - else - {//-- distL == distR, take into account search priority - aStartPos = aToLeft ? posL : posR; - return ETrue; - } - - }//else if(wL && wR) - - - if(noWayLeft) - { - aStartPos = r_Idx << 5; - return FindToRight(aStartPos, aBitVal); - } - else - { - noWayLeft = ItrLeft(l_Idx); - } - - if(noWayRight) - { - aStartPos = l_Idx << 5; - return FindToLeft(aStartPos, aBitVal); - } - else - { - noWayRight = ItrRight(r_Idx); - } - - }//for(;;) - - //return EFalse; -} - -//----------------------------------------------------------------------------- -/** - Find out if two vectors are different. - - @param aRhs vector to compare with - @param aDiffIndex if there is a differene, here will be the number of the first different bit - @return ETrue if vectors differ, EFalse, if they are identical. -*/ -TBool RBitVector::Diff(const RBitVector& aRhs, TUint32& aDiffIndex) const -{ - __ASSERT_ALWAYS(ipData, Panic(ENotInitialised)); - __ASSERT_ALWAYS(iNumBits == aRhs.iNumBits, Panic(ESizeMismatch)); - ASSERT(iNumWords > 0); - - TUint32 diffWord=0; - TUint32 wordNum=0; - - //-- compare all but the last word in the array - for(wordNum=0; wordNum < iNumWords-1; ++wordNum) - { - diffWord = ipData[wordNum] ^ aRhs.ipData[wordNum]; - if(diffWord) - break; //-- found difference - } - - //-- process the last word in the array - if(!diffWord) - { - diffWord = MaskLastWord(ipData[wordNum]) ^ MaskLastWord(aRhs.ipData[wordNum]); - } - - if(!diffWord) - return EFalse; //-- vectors are the same - - //-- calculate the position of the bit that different. - diffWord &= (~diffWord+1); //-- select rightmost bit - aDiffIndex = (wordNum << 5)+Log2(diffWord); - - return ETrue; -} -//----------------------------------------------------------------------------- - -/** - Iterate to the left (towards lower index) in the array of words ipData - - @param aIdx index within ipData array to be decremented; if it's possible to move left, it will be decreased - @return ETrue if there is no way left i.e. aIdx is 0. EFalse otherwise and aIdx decreased. -*/ -TBool RBitVector::ItrLeft(TUint32& aIdx) const -{ - if(aIdx == 0) - return ETrue; - else - { - aIdx--; - return EFalse; - } -} - - -/** - Iterate to the right (towards higher index) in the array of words ipData - - @param aIdx index within ipData array to be incremented; if it's possible to move right, it will be increased - @return ETrue if there is no way right i.e. aIdx corresponds to the last word. EFalse otherwise and aIdx increased. -*/ -TBool RBitVector::ItrRight(TUint32& aIdx) const -{ - if(aIdx < iNumWords-1) - { - aIdx++; - return EFalse; - } - else - return ETrue; -} - - - diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfile/sf_drv.cpp --- a/userlibandfileserver/fileserver/sfile/sf_drv.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfile/sf_drv.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -59,7 +59,6 @@ // Validate a drive number and set iTheDrive. // { - __CHECK_MAINTHREAD(); if (aDriveNumber==KDefaultDrive) aDriveNumber=aRequest->Session()->CurrentDrive(); if (!RFs::IsValidDrive(aDriveNumber)) @@ -1002,33 +1001,30 @@ return(r); } +/* + Delete files allowing wild cards. +*/ TInt TDrive::Delete(const TDesC& aName) -// -// Delete files allowing wild cards. -// { TInt r=CheckMountAndEntryName(aName); - if (r!=KErrNone) - return(r); - CFileCB* pF=LocateFile(aName); - if (pF!=NULL) - return(KErrInUse); + if(r!=KErrNone) + return r; + + if(LocateFile(aName)) + return KErrInUse; //-- the file is already opened by someone // remove from closed queue - NB this isn't strictly necessary if file is read-only or write-protected... LocateClosedFile(aName, EFalse); - TEntry entry; - r=Entry(aName,entry); - if (r!=KErrNone) - return(r); - if (entry.IsDir() || IsWriteProtected() || entry.IsReadOnly()) + if (IsWriteProtected()) return(KErrAccessDenied); + //-- filesystems' CMountCB::DeleteL() implementations shall check the entry attributes themeselves. TRACEMULT2(UTF::EBorder, UTraceModuleFileSys::ECMountCBDeleteL, EF32TraceUidFileSys, DriveNumber(), aName); TRAP(r,CurrentMount().DeleteL(aName)) TRACERET1(UTF::EBorder, UTraceModuleFileSys::ECMountCBDeleteLRet, EF32TraceUidFileSys, r); - return(r); + return r; } TInt TDrive::CheckMountAndEntryNames(const TDesC& anOldName,const TDesC& aNewName) @@ -1686,22 +1682,20 @@ return(r); } + +/** + Query whether the file is open or not. +*/ TInt TDrive::IsFileOpen(const TDesC& aFileName,CFileCB*& aFileCB) -// -// Query whether the file is open or not. -// { __CHECK_DRIVETHREAD(iDriveNumber); aFileCB = NULL; - TEntry dumEntry; - TInt r=Entry(aFileName,dumEntry); + TInt r=CheckMountAndEntryName(aFileName); if (r!=KErrNone) return(r); - if(dumEntry.iAtt&KEntryAttDir) - return KErrArgument; - + Files->Lock(); TInt count=Files->Count(); diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfile/sf_memory_client.cpp --- a/userlibandfileserver/fileserver/sfile/sf_memory_client.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfile/sf_memory_client.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -34,7 +34,11 @@ { const TUint32 segCnt = iTouchedRegionFlag <= iReservedRegionMarkInSegs ? iReservedRegionMarkInSegs : iTouchedRegionFlag; - DecommitSegments(iBase, segCnt); + TInt r = DecommitSegments(iBase, segCnt); + if (r != KErrNone) // this 'if() {}' is to remove build warnings + { + ASSERT(0); + } iReusablePagePool.Close(); delete iName; } diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfile/sf_memory_man.h --- a/userlibandfileserver/fileserver/sfile/sf_memory_man.h Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfile/sf_memory_man.h Mon Jan 18 21:31:10 2010 +0200 @@ -98,8 +98,8 @@ static TInt32 iLowMemoryThreshold; }; -/** Default cache memory size in KBytes (32768 KBytes)*/ -const TInt KDefaultGlobalCacheMemorySize = (32 << 10); +/** Default cache memory size in KBytes (8192 KBytes)*/ +const TInt KDefaultGlobalCacheMemorySize = (8 << 10); /** Low memory threshold as a percentage of total RAM (10 %) If the amount of RAM drops below this value, attempts to allocate memory will fail diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfile/sf_ops.h --- a/userlibandfileserver/fileserver/sfile/sf_ops.h Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfile/sf_ops.h Mon Jan 18 21:31:10 2010 +0200 @@ -33,7 +33,7 @@ { EFsNotifyChangeCancel, ESync, &TFsNotifyChangeCancel::Initialise, NULL, &TFsNotifyChangeCancel::DoRequestL }, { EFsDriveList, ESync, &TFsDriveList::Initialise, NULL, &TFsDriveList::DoRequestL }, { EFsDrive, ESync, &TFsDrive::Initialise, NULL, &TFsDrive::DoRequestL }, - { EFsVolume, 0, &TFsVolume::Initialise, NULL, &TFsVolume::DoRequestL }, + { EFsVolume, 0, &TFsVolume::Initialise, NULL, &TFsVolume::DoRequestL , MSG0(EVolumeInfo)}, { EFsSetVolume, 0, &TFsSetVolume::Initialise, NULL, &TFsSetVolume::DoRequestL }, { EFsSubst, ESync, &TFsSubst::Initialise, NULL, &TFsSubst::DoRequestL }, { EFsSetSubst, ESync | EParseSrc, &TFsSetSubst::Initialise, NULL, &TFsSetSubst::DoRequestL }, diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfile/sf_plugin_shim.cpp --- a/userlibandfileserver/fileserver/sfile/sf_plugin_shim.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfile/sf_plugin_shim.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -119,6 +119,16 @@ #endif } +EXPORT_C TInt RFsPlugin::Volume(TVolumeInfo &aVol, TInt aDrive) const +/** +Gets volume information for a formatted device. + +@see RFs::Volume +*/ + { + return (RFs::Volume(aVol, aDrive)); + } + TInt RFsPlugin::SendReceive(TInt aFunction,const TIpcArgs& aArgs) const { return iSessionHelper.SendReceive(aFunction, aArgs); @@ -128,7 +138,7 @@ { if(Handle()) return RSessionBase::SendReceive(aFunction, aArgs); - + return ((RFsPlugin*) this)->SendReceive(aFunction, aArgs); } @@ -236,7 +246,7 @@ return err; } - + EXPORT_C TInt RFilePlugin::TransferToClient() /** Closes the file. @@ -306,7 +316,7 @@ EXPORT_C TInt RFilePlugin::Read(TInt64 aPos,TDes8& aDes,TInt aLen) const /** -Reads the specified number of bytes of binary data from the file at a specified +Reads the specified number of bytes of binary data from the file at a specified offset within the file. @see RFile::Read @@ -399,7 +409,7 @@ EXPORT_C TInt RFilePlugin::Flush() /** -Commits data to the storage device and flushes internal buffers without closing +Commits data to the storage device and flushes internal buffers without closing the file. @see RFile::Flush @@ -523,7 +533,7 @@ void RFile::CloseSubSession(TInt aFunction) { - if((Session().Handle() ^ CObjectIx::ENoClose) != KErrBadHandle) + if((Session().Handle() ^ CObjectIx::ENoClose) != KErrBadHandle) RSubSessionBase::CloseSubSession(aFunction); else ((RFilePlugin*) this)->CloseSubSession(aFunction); @@ -531,9 +541,9 @@ TInt RFile::SendReceive(TInt aFunction,const TIpcArgs& aArgs) const { - if((Session().Handle() ^ CObjectIx::ENoClose) != KErrBadHandle) + if((Session().Handle() ^ CObjectIx::ENoClose) != KErrBadHandle) return RSubSessionBase::SendReceive(aFunction, aArgs); - + return ((RFilePlugin*) this)->SendReceive(aFunction, aArgs); } @@ -584,7 +594,7 @@ TPckgC pckgUid(uidType); return(CreateSubSession(fs,EFsDirOpen,TIpcArgs(&aMatchName,anAttMask,&pckgUid))); } - + EXPORT_C void RDirPlugin::Close() /** Closes the the directory. @@ -653,7 +663,7 @@ TInt RDir::SendReceive(TInt aFunction,const TIpcArgs& aArgs) const { - if((Session().Handle() ^ CObjectIx::ENoClose) != KErrBadHandle) + if((Session().Handle() ^ CObjectIx::ENoClose) != KErrBadHandle) return RSubSessionBase::SendReceive(aFunction, aArgs); return ((RDirPlugin*) this)->SendReceive(aFunction, aArgs); @@ -730,7 +740,7 @@ newRequest->Dispatch(); - // NOTE : newRequest will be free'd by the File Server before completing the + // NOTE : newRequest will be free'd by the File Server before completing the // request so it's not safe to touch the request from now on... return(iPlugin->WaitForRequest()); diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfsrv/cl_clamp.cpp --- a/userlibandfileserver/fileserver/sfsrv/cl_clamp.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfsrv/cl_clamp.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -16,6 +16,7 @@ // #include +#include EXPORT_C TInt RFileClamp::Clamp(RFile& aFile) diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfsrv/cl_cli.cpp --- a/userlibandfileserver/fileserver/sfsrv/cl_cli.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfsrv/cl_cli.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -2631,8 +2631,6 @@ - -EFSRV_EXPORT_C TInt RFs::CheckDisk(const TDesC& aDrive) const /** Checks the integrity of the disk on the specified drive. On FAT, this checks if a cluster number is invalid, if a cluster is allocated to @@ -2652,11 +2650,11 @@ KErrNotReady, if the specified drive is empty; KErrNotSupported, if the drive cannot handle this request; KErrPermissionDenied, if the caller doesn't have DiskAdmin capability; - KErrTooBig, if the drives folder depth exceeds maximum allowed. For the current FAT file system implementation this limit is 50. Other system wide error codes may also be returned. @capability DiskAdmin */ +EFSRV_EXPORT_C TInt RFs::CheckDisk(const TDesC& aDrive) const { TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsCheckDisk, MODULEUID, Handle(), aDrive); TInt r = SendReceive(EFsCheckDisk,TIpcArgs(&aDrive)); diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/sfsrv/cl_plugin.cpp --- a/userlibandfileserver/fileserver/sfsrv/cl_plugin.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/sfsrv/cl_plugin.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -414,7 +414,7 @@ Client requests a synchronous operation @param aFunction: The operation to be handled -@param a1: returned buffer from plugin on comletion of the request +@param a1: returned buffer from plugin on completion of the request */ { TRACE4(UTF::EBorder, UTraceModuleEfsrv::EPluginDoControl2, MODULEUID, Session().Handle(), SubSessionHandle(), aFunction, &a1); @@ -432,8 +432,8 @@ Client requests a synchronous operation @param aFunction: The operation to be handled -@param a1: returned buffer from plugin on comletion of the request -@param a2: 2nd returned buffer from plugin on comletion of the request +@param a1: returned buffer from plugin on completion of the request +@param a2: 2nd returned buffer from plugin on completion of the request */ { TRACE5(UTF::EBorder, UTraceModuleEfsrv::EPluginDoControl3, MODULEUID, Session().Handle(), SubSessionHandle(), aFunction, &a1, &a2); diff -r 36bfc973b146 -r 329ab0095843 userlibandfileserver/fileserver/swins/elocal.cpp --- a/userlibandfileserver/fileserver/swins/elocal.cpp Thu Jan 07 13:38:45 2010 +0200 +++ b/userlibandfileserver/fileserver/swins/elocal.cpp Mon Jan 18 21:31:10 2010 +0200 @@ -374,7 +374,14 @@ if (IsRomDrive()) User::Leave(KErrAccessDenied); - TFileName n; + + //-- check entry attributes + TEntry entry; + EntryL(aName, entry); + if (entry.IsDir() || entry.IsReadOnly()) + User::Leave(KErrAccessDenied); + + TFileName n; MapFileNameL(n,Drive().DriveNumber(),aName); BOOL b=Emulator::DeleteFile(StrPtrZL(n)); @@ -947,8 +954,8 @@ if (h==INVALID_HANDLE_VALUE) User::Leave(Emulator::LastError()); FindClose(h); - if (d.cAlternateFileName[0]) // we have a dos name too - aShortName=(TText*)(&d.cAlternateFileName[0]); + if (d.cAlternateFileName[0]) // we have a dos name too + aShortName=(TText*)(&d.cAlternateFileName[0]); else aShortName=(TText*)(&d.cFileName[0]); } @@ -1411,7 +1418,7 @@ CheckPosL(aPos); TInt pos=0; TInt len=aLength; - TBuf8<0x1000> buf; + TBuf8<65536> buf; if (aMessage.Handle() == KLocalMessageHandle) ((TPtr8* )aDes)->SetLength(0); @@ -1471,7 +1478,7 @@ CheckPosL(aPos); TInt pos=0; TInt len=aLength; - TBuf8<0x1000> buf; + TBuf8<65536> buf; while (len) {