# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1277129534 -10800 # Node ID 2bb754abd467ff2708778425f2a694c2d6e223d4 # Parent bbf8bed59bcb1a95ee0601f37e6fb13c52c03470 Revision: 201025 Kit: 2010125 diff -r bbf8bed59bcb -r 2bb754abd467 halservices/hal/src/hal_gcc_shim.cia --- a/halservices/hal/src/hal_gcc_shim.cia Wed Jun 09 11:10:19 2010 +0300 +++ b/halservices/hal/src/hal_gcc_shim.cia Mon Jun 21 17:12:14 2010 +0300 @@ -1,4 +1,18 @@ +// Copyright (c) 2010 Nokia 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: +// hal/src/hal_gcc_shim.cia +// // HAL_GCC_SHIM.CIA - generated by GENSHIMSRC.BAT // diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/bmarm/ekernsmp.def --- a/kernel/eka/bmarm/ekernsmp.def Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/bmarm/ekernsmp.def Mon Jun 21 17:12:14 2010 +0300 @@ -1055,4 +1055,5 @@ SetIdleHandler__3ArmPFPvUlPVv_vPv @ 1054 NONAME R3UNUSED ABSENT ; Arm::SetIdleHandler(void (*)(void *, unsigned long, void volatile *), void *) FreeRamZone__4EpocUi @ 1055 NONAME R3UNUSED ABSENT ; Epoc::FreeRamZone(unsigned int) SelectiveAlloc__16TBitMapAllocatorii @ 1056 NONAME R3UNUSED ; TBitMapAllocator::SelectiveAlloc(int, int) + SetKeyOffset__10RArrayBasei @ 1057 NONAME R3UNUSED ; RArrayBase::SetKeyOffset(int) diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/bmarm/ekernu.def --- a/kernel/eka/bmarm/ekernu.def Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/bmarm/ekernu.def Mon Jun 21 17:12:14 2010 +0300 @@ -1052,4 +1052,4 @@ SetIdleHandler__3ArmPFPvUl_vPv @ 1051 NONAME R3UNUSED ABSENT ; Arm::SetIdleHandler(void (*)(void *, unsigned long), void *) FreeRamZone__4EpocUi @ 1052 NONAME R3UNUSED ABSENT ; Epoc::FreeRamZone(unsigned int) SelectiveAlloc__16TBitMapAllocatorii @ 1053 NONAME R3UNUSED ; TBitMapAllocator::SelectiveAlloc(int, int) - + SetKeyOffset__10RArrayBasei @ 1054 NONAME R3UNUSED ; RArrayBase::SetKeyOffset(int) diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/bmarm/euseru.def --- a/kernel/eka/bmarm/euseru.def Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/bmarm/euseru.def Mon Jun 21 17:12:14 2010 +0300 @@ -2234,5 +2234,38 @@ RandomL__4MathR5TDes8 @ 2233 NONAME R3UNUSED ; Math::RandomL(TDes8 &) RandomL__4Math @ 2234 NONAME R3UNUSED ; Math::RandomL(void) Random__4MathR5TDes8 @ 2235 NONAME R3UNUSED ; Math::Random(TDes8 &) - - + Append2__6TDes16G5TChar @ 2236 NONAME R3UNUSED ABSENT ; TDes16::Append2(TChar) + AppendFill2__6TDes16G5TChari @ 2237 NONAME R3UNUSED ABSENT ; TDes16::AppendFill2(TChar, int) + AppendJustify2__6TDes16PCUsi6TAlignG5TChar @ 2238 NONAME ABSENT ; TDes16::AppendJustify2(unsigned short const *, int, TAlign, TChar) + AppendJustify2__6TDes16PCUsii6TAlignG5TChar @ 2239 NONAME ABSENT ; TDes16::AppendJustify2(unsigned short const *, int, int, TAlign, TChar) + AppendJustify2__6TDes16RC7TDesC16i6TAlignG5TChar @ 2240 NONAME ABSENT ; TDes16::AppendJustify2(TDesC16 const &, int, TAlign, TChar) + AppendJustify2__6TDes16RC7TDesC16ii6TAlignG5TChar @ 2241 NONAME ABSENT ; TDes16::AppendJustify2(TDesC16 const &, int, int, TAlign, TChar) + Capitalize2__6TDes16 @ 2242 NONAME R3UNUSED ABSENT ; TDes16::Capitalize2(void) + Collate2__6TDes16 @ 2243 NONAME R3UNUSED ABSENT ; TDes16::Collate2(void) + CopyC2__6TDes16RC7TDesC16 @ 2244 NONAME R3UNUSED ABSENT ; TDes16::CopyC2(TDesC16 const &) + CopyCP2__6TDes16RC7TDesC16 @ 2245 NONAME R3UNUSED ABSENT ; TDes16::CopyCP2(TDesC16 const &) + CopyF2__6TDes16RC7TDesC16 @ 2246 NONAME R3UNUSED ABSENT ; TDes16::CopyF2(TDesC16 const &) + CopyLC2__6TDes16RC7TDesC16 @ 2247 NONAME R3UNUSED ABSENT ; TDes16::CopyLC2(TDesC16 const &) + CopyUC2__6TDes16RC7TDesC16 @ 2248 NONAME R3UNUSED ABSENT ; TDes16::CopyUC2(TDesC16 const &) + Fill2__6TDes16G5TChar @ 2249 NONAME R3UNUSED ABSENT ; TDes16::Fill2(TChar) + Fill2__6TDes16G5TChari @ 2250 NONAME R3UNUSED ABSENT ; TDes16::Fill2(TChar, int) + FindCorruptSurrogate__C7TDesC16 @ 2251 NONAME R3UNUSED ABSENT ; TDesC16::FindCorruptSurrogate(void) const + Fold2__6TDes16 @ 2252 NONAME R3UNUSED ABSENT ; TDes16::Fold2(void) + Justify2__6TDes16RC7TDesC16i6TAlignG5TChar @ 2253 NONAME ABSENT ; TDes16::Justify2(TDesC16 const &, int, TAlign, TChar) + Locate2__C7TDesC16G5TChar @ 2254 NONAME R3UNUSED ABSENT ; TDesC16::Locate2(TChar) const + LocateF2__C7TDesC16G5TChar @ 2255 NONAME R3UNUSED ABSENT ; TDesC16::LocateF2(TChar) const + LocateReverse2__C7TDesC16G5TChar @ 2256 NONAME R3UNUSED ABSENT ; TDesC16::LocateReverse2(TChar) const + LocateReverseF2__C7TDesC16G5TChar @ 2257 NONAME R3UNUSED ABSENT ; TDesC16::LocateReverseF2(TChar) const + LowerCase2__6TDes16 @ 2258 NONAME R3UNUSED ABSENT ; TDes16::LowerCase2(void) + Match2__C7TDesC16RC7TDesC16 @ 2259 NONAME R3UNUSED ABSENT ; TDesC16::Match2(TDesC16 const &) const + UpperCase2__6TDes16 @ 2260 NONAME R3UNUSED ABSENT ; TDes16::UpperCase2(void) + AgainHighRes__6RTimerR14TRequestStatusG27TTimeIntervalMicroSeconds32 @ 2261 NONAME R3UNUSED ABSENT ; RTimer::AgainHighRes(TRequestStatus &, TTimeIntervalMicroSeconds32) + Align__C10RAllocatorPv @ 2262 NONAME R3UNUSED ABSENT ; RAllocator::Align(void *) const + Align__C10RAllocatori @ 2263 NONAME R3UNUSED ABSENT ; RAllocator::Align(int) const + Base__C10RAllocator @ 2264 NONAME R3UNUSED ABSENT ; RAllocator::Base(void) const + MaxLength__C10RAllocator @ 2265 NONAME R3UNUSED ABSENT ; RAllocator::MaxLength(void) const + Size__C10RAllocator @ 2266 NONAME R3UNUSED ABSENT ; RAllocator::Size(void) const + __DbgGetAllocFail__10RAllocator @ 2267 NONAME R3UNUSED ABSENT ; RAllocator::__DbgGetAllocFail(void) + __DbgGetAllocFail__4Useri @ 2268 NONAME R3UNUSED ABSENT ; User::__DbgGetAllocFail(int) + SetKeyOffset__10RArrayBasei @ 2269 NONAME R3UNUSED ; RArrayBase::SetKeyOffset(int) + diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/bwins/ekernu.def --- a/kernel/eka/bwins/ekernu.def Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/bwins/ekernu.def Mon Jun 21 17:12:14 2010 +0300 @@ -935,4 +935,5 @@ ?Retire@KernCoreStats@@SAHHH@Z @ 934 NONAME ABSENT ; public: static int KernCoreStats::Retire(int, int) ?Stats@KernCoreStats@@SAHPAX@Z @ 935 NONAME ABSENT ; public: static int KernCoreStats::Stats(void *) ?SelectiveAlloc@TBitMapAllocator@@QAEIHH@Z @ 936 NONAME ; public: unsigned int __thiscall TBitMapAllocator::SelectiveAlloc(int,int) + ?SetKeyOffset@RArrayBase@@IAEXH@Z @ 937 NONAME ; void RArrayBase::SetKeyOffset(int) diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/bwins/euseru.def --- a/kernel/eka/bwins/euseru.def Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/bwins/euseru.def Mon Jun 21 17:12:14 2010 +0300 @@ -2181,6 +2181,39 @@ ?SetReadOnly@TChunkCreateInfo@@QAEXXZ @ 2180 NONAME ; public: void __thiscall TChunkCreateInfo::SetReadOnly(void) ?RandomL@Math@@SAXAAVTDes8@@@Z @ 2181 NONAME ; void Math::RandomL(class TDes8 &) ?Random@Math@@SAXAAVTDes8@@@Z @ 2182 NONAME ; void Math::Random(class TDes8 &) - ?RandomL@Math@@SAKXZ @ 2183 NONAME ; unsigned long Math::RandomL(void) + ?RandomL@Math@@SAKXZ @ 2183 NONAME ; unsigned long Math::RandomL(void) + ?Append2@TDes16@@QAEXVTChar@@@Z @ 2184 NONAME ABSENT ; void TDes16::Append2(class TChar) + ?CopyC2@TDes16@@QAEXABVTDesC16@@@Z @ 2185 NONAME ABSENT ; void TDes16::CopyC2(class TDesC16 const &) + ?Collate2@TDes16@@QAEXXZ @ 2186 NONAME ABSENT ; void TDes16::Collate2(void) + ?CopyF2@TDes16@@QAEXABVTDesC16@@@Z @ 2187 NONAME ABSENT ; void TDes16::CopyF2(class TDesC16 const &) + ?Fill2@TDes16@@QAEXVTChar@@@Z @ 2188 NONAME ABSENT ; void TDes16::Fill2(class TChar) + ?Locate2@TDesC16@@QBEHVTChar@@@Z @ 2189 NONAME ABSENT ; int TDesC16::Locate2(class TChar) const + ?AppendFill2@TDes16@@QAEXVTChar@@H@Z @ 2190 NONAME ABSENT ; void TDes16::AppendFill2(class TChar, int) + ?AppendJustify2@TDes16@@QAEXABVTDesC16@@HHW4TAlign@@VTChar@@@Z @ 2191 NONAME ABSENT ; void TDes16::AppendJustify2(class TDesC16 const &, int, int, enum TAlign, class TChar) + ?AppendJustify2@TDes16@@QAEXPBGHW4TAlign@@VTChar@@@Z @ 2192 NONAME ABSENT ; void TDes16::AppendJustify2(unsigned short const *, int, enum TAlign, class TChar) + ?Fold2@TDes16@@QAEXXZ @ 2193 NONAME ABSENT ; void TDes16::Fold2(void) + ?AppendJustify2@TDes16@@QAEXABVTDesC16@@HW4TAlign@@VTChar@@@Z @ 2194 NONAME ABSENT ; void TDes16::AppendJustify2(class TDesC16 const &, int, enum TAlign, class TChar) + ?LowerCase2@TDes16@@QAEXXZ @ 2195 NONAME ABSENT ; void TDes16::LowerCase2(void) + ?CopyUC2@TDes16@@QAEXABVTDesC16@@@Z @ 2196 NONAME ABSENT ; void TDes16::CopyUC2(class TDesC16 const &) + ?FindCorruptSurrogate@TDesC16@@QBEHXZ @ 2197 NONAME ABSENT ; int TDesC16::FindCorruptSurrogate(void) const + ?Justify2@TDes16@@QAEXABVTDesC16@@HW4TAlign@@VTChar@@@Z @ 2198 NONAME ABSENT ; void TDes16::Justify2(class TDesC16 const &, int, enum TAlign, class TChar) + ?UpperCase2@TDes16@@QAEXXZ @ 2199 NONAME ABSENT ; void TDes16::UpperCase2(void) + ?Capitalize2@TDes16@@QAEXXZ @ 2200 NONAME ABSENT ; void TDes16::Capitalize2(void) + ?AppendJustify2@TDes16@@QAEXPBGHHW4TAlign@@VTChar@@@Z @ 2201 NONAME ABSENT ; void TDes16::AppendJustify2(unsigned short const *, int, int, enum TAlign, class TChar) + ?CopyLC2@TDes16@@QAEXABVTDesC16@@@Z @ 2202 NONAME ABSENT ; void TDes16::CopyLC2(class TDesC16 const &) + ?Fill2@TDes16@@QAEXVTChar@@H@Z @ 2203 NONAME ABSENT ; void TDes16::Fill2(class TChar, int) + ?LocateF2@TDesC16@@QBEHVTChar@@@Z @ 2204 NONAME ABSENT ; int TDesC16::LocateF2(class TChar) const + ?Match2@TDesC16@@QBEHABV1@@Z @ 2205 NONAME ABSENT ; int TDesC16::Match2(class TDesC16 const &) const + ?LocateReverse2@TDesC16@@QBEHVTChar@@@Z @ 2206 NONAME ABSENT ; int TDesC16::LocateReverse2(class TChar) const + ?LocateReverseF2@TDesC16@@QBEHVTChar@@@Z @ 2207 NONAME ABSENT ; int TDesC16::LocateReverseF2(class TChar) const + ?CopyCP2@TDes16@@QAEXABVTDesC16@@@Z @ 2208 NONAME ABSENT ; void TDes16::CopyCP2(class TDesC16 const &) + ?AgainHighRes@RTimer@@QAEXAAVTRequestStatus@@VTTimeIntervalMicroSeconds32@@@Z @ 2209 NONAME ABSENT ; public: void __thiscall RTimer::AgainHighRes(class TRequestStatus &,class TTimeIntervalMicroSeconds32) + ?Align@RAllocator@@QBEPAXPAX@Z @ 2210 NONAME ABSENT ; void * RAllocator::Align(void *) const + ?Align@RAllocator@@QBEHH@Z @ 2211 NONAME ABSENT ; int RAllocator::Align(int) const + ?Size@RAllocator@@QBEHXZ @ 2212 NONAME ABSENT ; int RAllocator::Size(void) const + ?Base@RAllocator@@QBEPAEXZ @ 2213 NONAME ABSENT ; void * RAllocator::Base(void) const + ?MaxLength@RAllocator@@QBEHXZ @ 2214 NONAME ABSENT ; int RAllocator::MaxLength(void) const + ?__DbgGetAllocFail@RAllocator@@QAE?AW4TAllocFail@1@XZ @ 2215 NONAME ABSENT ; enum RAllocator::TAllocFail RAllocator::__DbgGetAllocFail(void) + ?__DbgGetAllocFail@User@@SA?AW4TAllocFail@RAllocator@@H@Z @ 2216 NONAME ABSENT ; enum RAllocator::TAllocFail User::__DbgGetAllocFail(int) + ?SetKeyOffset@RArrayBase@@IAEXH@Z @ 2217 NONAME ; void RArrayBase::SetKeyOffset(int) - diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/bx86/ekernsmp.def --- a/kernel/eka/bx86/ekernsmp.def Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/bx86/ekernsmp.def Mon Jun 21 17:12:14 2010 +0300 @@ -1012,4 +1012,5 @@ ?SetNumberOfActiveCpus@NKern@@SAXH@Z @ 1011 NONAME ABSENT ; public: static void __cdecl NKern::SetNumberOfActiveCpus(int) ?FreeRamZone@Epoc@@SAHI@Z @ 1012 NONAME ABSENT ; public: static int Epoc::FreeRamZone(unsigned int) ?SelectiveAlloc@TBitMapAllocator@@QAEIHH@Z @ 1013 NONAME ; public: unsigned int __thiscall TBitMapAllocator::SelectiveAlloc(int,int) + ?SetKeyOffset@RArrayBase@@IAEXH@Z @ 1014 NONAME ; void RArrayBase::SetKeyOffset(int) diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/bx86/ekernu.def --- a/kernel/eka/bx86/ekernu.def Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/bx86/ekernu.def Mon Jun 21 17:12:14 2010 +0300 @@ -957,4 +957,5 @@ ?Stats@KernCoreStats@@SAHPAX@Z @ 956 NONAME ABSENT ; public: static int KernCoreStats::Stats(void *) ?FreeRamZone@Epoc@@SAHI@Z @ 957 NONAME ABSENT ; public: static int Epoc::FreeRamZone(unsigned int) ?SelectiveAlloc@TBitMapAllocator@@QAEIHH@Z @ 958 NONAME ; public: unsigned int __thiscall TBitMapAllocator::SelectiveAlloc(int,int) + ?SetKeyOffset@RArrayBase@@IAEXH@Z @ 959 NONAME ; void RArrayBase::SetKeyOffset(int) diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/bx86/euseru.def --- a/kernel/eka/bx86/euseru.def Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/bx86/euseru.def Mon Jun 21 17:12:14 2010 +0300 @@ -2182,5 +2182,38 @@ ?RandomL@Math@@SAXAAVTDes8@@@Z @ 2181 NONAME ; void Math::RandomL(class TDes8 &) ?Random@Math@@SAXAAVTDes8@@@Z @ 2182 NONAME ; void Math::Random(class TDes8 &) ?RandomL@Math@@SAKXZ @ 2183 NONAME ; unsigned long Math::RandomL(void) - - + ?Append2@TDes16@@QAEXVTChar@@@Z @ 2184 NONAME ABSENT ; void TDes16::Append2(class TChar) + ?CopyC2@TDes16@@QAEXABVTDesC16@@@Z @ 2185 NONAME ABSENT ; void TDes16::CopyC2(class TDesC16 const &) + ?Collate2@TDes16@@QAEXXZ @ 2186 NONAME ABSENT ; void TDes16::Collate2(void) + ?CopyF2@TDes16@@QAEXABVTDesC16@@@Z @ 2187 NONAME ABSENT ; void TDes16::CopyF2(class TDesC16 const &) + ?Fill2@TDes16@@QAEXVTChar@@@Z @ 2188 NONAME ABSENT ; void TDes16::Fill2(class TChar) + ?Locate2@TDesC16@@QBEHVTChar@@@Z @ 2189 NONAME ABSENT ; int TDesC16::Locate2(class TChar) const + ?AppendFill2@TDes16@@QAEXVTChar@@H@Z @ 2190 NONAME ABSENT ; void TDes16::AppendFill2(class TChar, int) + ?AppendJustify2@TDes16@@QAEXABVTDesC16@@HHW4TAlign@@VTChar@@@Z @ 2191 NONAME ABSENT ; void TDes16::AppendJustify2(class TDesC16 const &, int, int, enum TAlign, class TChar) + ?AppendJustify2@TDes16@@QAEXPBGHW4TAlign@@VTChar@@@Z @ 2192 NONAME ABSENT ; void TDes16::AppendJustify2(unsigned short const *, int, enum TAlign, class TChar) + ?Fold2@TDes16@@QAEXXZ @ 2193 NONAME ABSENT ; void TDes16::Fold2(void) + ?AppendJustify2@TDes16@@QAEXABVTDesC16@@HW4TAlign@@VTChar@@@Z @ 2194 NONAME ABSENT ; void TDes16::AppendJustify2(class TDesC16 const &, int, enum TAlign, class TChar) + ?LowerCase2@TDes16@@QAEXXZ @ 2195 NONAME ABSENT ; void TDes16::LowerCase2(void) + ?CopyUC2@TDes16@@QAEXABVTDesC16@@@Z @ 2196 NONAME ABSENT ; void TDes16::CopyUC2(class TDesC16 const &) + ?FindCorruptSurrogate@TDesC16@@QBEHXZ @ 2197 NONAME ABSENT ; int TDesC16::FindCorruptSurrogate(void) const + ?Justify2@TDes16@@QAEXABVTDesC16@@HW4TAlign@@VTChar@@@Z @ 2198 NONAME ABSENT ; void TDes16::Justify2(class TDesC16 const &, int, enum TAlign, class TChar) + ?UpperCase2@TDes16@@QAEXXZ @ 2199 NONAME ABSENT ; void TDes16::UpperCase2(void) + ?Capitalize2@TDes16@@QAEXXZ @ 2200 NONAME ABSENT ; void TDes16::Capitalize2(void) + ?AppendJustify2@TDes16@@QAEXPBGHHW4TAlign@@VTChar@@@Z @ 2201 NONAME ABSENT ; void TDes16::AppendJustify2(unsigned short const *, int, int, enum TAlign, class TChar) + ?CopyLC2@TDes16@@QAEXABVTDesC16@@@Z @ 2202 NONAME ABSENT ; void TDes16::CopyLC2(class TDesC16 const &) + ?Fill2@TDes16@@QAEXVTChar@@H@Z @ 2203 NONAME ABSENT ; void TDes16::Fill2(class TChar, int) + ?LocateF2@TDesC16@@QBEHVTChar@@@Z @ 2204 NONAME ABSENT ; int TDesC16::LocateF2(class TChar) const + ?Match2@TDesC16@@QBEHABV1@@Z @ 2205 NONAME ABSENT ; int TDesC16::Match2(class TDesC16 const &) const + ?LocateReverse2@TDesC16@@QBEHVTChar@@@Z @ 2206 NONAME ABSENT ; int TDesC16::LocateReverse2(class TChar) const + ?LocateReverseF2@TDesC16@@QBEHVTChar@@@Z @ 2207 NONAME ABSENT ; int TDesC16::LocateReverseF2(class TChar) const + ?CopyCP2@TDes16@@QAEXABVTDesC16@@@Z @ 2208 NONAME ABSENT ; void TDes16::CopyCP2(class TDesC16 const &) + ?AgainHighRes@RTimer@@QAEXAAVTRequestStatus@@VTTimeIntervalMicroSeconds32@@@Z @ 2209 NONAME ABSENT ; public: void __thiscall RTimer::AgainHighRes(class TRequestStatus &,class TTimeIntervalMicroSeconds32) + ?Align@RAllocator@@QBEHH@Z @ 2210 NONAME ABSENT ; public: int __thiscall RAllocator::Align(int)const + ?Align@RAllocator@@QBEPAXPAX@Z @ 2211 NONAME ABSENT ; public: void * __thiscall RAllocator::Align(void *)const + ?Base@RAllocator@@QBEPAEXZ @ 2212 NONAME ABSENT ; public: void * __thiscall RAllocator::Base(void)const + ?MaxLength@RAllocator@@QBEHXZ @ 2213 NONAME ABSENT ; public: int __thiscall RAllocator::MaxLength(void)const + ?Size@RAllocator@@QBEHXZ @ 2214 NONAME ABSENT ; public: int __thiscall RAllocator::Size(void)const + ?__DbgGetAllocFail@RAllocator@@QAE?AW4TAllocFail@1@XZ @ 2215 NONAME ABSENT ; enum RAllocator::TAllocFail RAllocator::__DbgGetAllocFail(void) + ?__DbgGetAllocFail@User@@SA?AW4TAllocFail@RAllocator@@H@Z @ 2216 NONAME ABSENT ; enum RAllocator::TAllocFail User::__DbgGetAllocFail(int) + ?SetKeyOffset@RArrayBase@@IAEXH@Z @ 2217 NONAME ; void RArrayBase::SetKeyOffset(int) + diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/bx86gcc/ekernsmp.def --- a/kernel/eka/bx86gcc/ekernsmp.def Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/bx86gcc/ekernsmp.def Mon Jun 21 17:12:14 2010 +0300 @@ -1100,4 +1100,5 @@ _ZN5NKern21SetNumberOfActiveCpusEi @ 1099 NONAME ABSENT _ZN4Epoc11FreeRamZoneEj @ 1100 NONAME ABSENT _ZN16TBitMapAllocator14SelectiveAllocEii @ 1101 NONAME + _ZN10RArrayBase12SetKeyOffsetEi @ 1102 NONAME diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/bx86gcc/ekernu.def --- a/kernel/eka/bx86gcc/ekernu.def Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/bx86gcc/ekernu.def Mon Jun 21 17:12:14 2010 +0300 @@ -1040,4 +1040,5 @@ _ZN13KernCoreStats9LeaveIdleEj @ 1039 NONAME ABSENT _ZN4Epoc11FreeRamZoneEj @ 1040 NONAME ABSENT _ZN16TBitMapAllocator14SelectiveAllocEii @ 1041 NONAME + _ZN10RArrayBase12SetKeyOffsetEi @ 1042 NONAME diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/bx86gcc/euseru.def --- a/kernel/eka/bx86gcc/euseru.def Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/bx86gcc/euseru.def Mon Jun 21 17:12:14 2010 +0300 @@ -2461,3 +2461,38 @@ _ZN4Math7RandomLER5TDes8 @ 2460 NONAME _ZN4Math6RandomER5TDes8 @ 2461 NONAME _ZN4Math7RandomLEv @ 2462 NONAME + _ZN6TDes1610LowerCase2Ev @ 2463 NONAME ABSENT + _ZN6TDes1610UpperCase2Ev @ 2464 NONAME ABSENT + _ZN6TDes1611AppendFill2E5TChari @ 2465 NONAME ABSENT + _ZN6TDes1611Capitalize2Ev @ 2466 NONAME ABSENT + _ZN6TDes1614AppendJustify2EPKti6TAlign5TChar @ 2467 NONAME ABSENT + _ZN6TDes1614AppendJustify2EPKtii6TAlign5TChar @ 2468 NONAME ABSENT + _ZN6TDes1614AppendJustify2ERK7TDesC16i6TAlign5TChar @ 2469 NONAME ABSENT + _ZN6TDes1614AppendJustify2ERK7TDesC16ii6TAlign5TChar @ 2470 NONAME ABSENT + _ZN6TDes165Fill2E5TChar @ 2471 NONAME ABSENT + _ZN6TDes165Fill2E5TChari @ 2472 NONAME ABSENT + _ZN6TDes165Fold2Ev @ 2473 NONAME ABSENT + _ZN6TDes166CopyC2ERK7TDesC16 @ 2474 NONAME ABSENT + _ZN6TDes166CopyF2ERK7TDesC16 @ 2475 NONAME ABSENT + _ZN6TDes167Append2E5TChar @ 2476 NONAME ABSENT + _ZN6TDes167CopyCP2ERK7TDesC16 @ 2477 NONAME ABSENT + _ZN6TDes167CopyLC2ERK7TDesC16 @ 2478 NONAME ABSENT + _ZN6TDes167CopyUC2ERK7TDesC16 @ 2479 NONAME ABSENT + _ZN6TDes168Collate2Ev @ 2480 NONAME ABSENT + _ZN6TDes168Justify2ERK7TDesC16i6TAlign5TChar @ 2481 NONAME ABSENT + _ZNK7TDesC1614LocateReverse2E5TChar @ 2482 NONAME ABSENT + _ZNK7TDesC1615LocateReverseF2E5TChar @ 2483 NONAME ABSENT + _ZNK7TDesC1620FindCorruptSurrogateEv @ 2484 NONAME ABSENT + _ZNK7TDesC166Match2ERKS_ @ 2485 NONAME ABSENT + _ZNK7TDesC167Locate2E5TChar @ 2486 NONAME ABSENT + _ZNK7TDesC168LocateF2E5TChar @ 2487 NONAME ABSENT + _ZN6RTimer12AgainHighResER14TRequestStatus27TTimeIntervalMicroSeconds32 @ 2488 NONAME ABSENT + _ZNK10RAllocator4BaseEv @ 2489 NONAME ABSENT + _ZNK10RAllocator4SizeEv @ 2490 NONAME ABSENT + _ZNK10RAllocator5AlignEPv @ 2491 NONAME ABSENT + _ZNK10RAllocator5AlignEi @ 2492 NONAME ABSENT + _ZNK10RAllocator9MaxLengthEv @ 2493 NONAME ABSENT + _ZN10RAllocator17__DbgGetAllocFailEv @ 2494 NONAME ABSENT + _ZN4User17__DbgGetAllocFailEi @ 2495 NONAME ABSENT + _ZN10RArrayBase12SetKeyOffsetEi @ 2496 NONAME + diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/common/array.cpp --- a/kernel/eka/common/array.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/common/array.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -663,6 +663,12 @@ return iCount; } +EXPORT_C void RArrayBase::SetKeyOffset(TInt aKeyOffset) + { + __ASSERT_ALWAYS(TUint(aKeyOffset)OptionalHeader + ntHead->FileHeader.SizeOfOptionalHeader); + const IMAGE_SECTION_HEADER* end = imgHead + ntHead->FileHeader.NumberOfSections; + + for (; imgHead < end; ++imgHead) + { + TBool SectionUsed = EFalse; + + // Go through each of the sections that we need to examine and see if the current section is in the list + for (TInt index = 0; index < (sizeof(sectionNames) / sizeof(BYTE*)); ++index) + { + if (memcmp(imgHead->Name, sectionNames[index], IMAGE_SIZEOF_SHORT_NAME)==0) + SectionUsed = ETrue; + } + + // If the current section is one we are interested in, calculate its offset in the raw file and add its size; + // this gives us the minimum amount of the file to be mapped in order to examine this section and all those + // preceding it + if (SectionUsed) + { + if ((imgHead->PointerToRawData + imgHead->SizeOfRawData) > maxOffset) + { + maxOffset = (imgHead->PointerToRawData + imgHead->SizeOfRawData); + } + } + } + + return(maxOffset); + } + template struct Buf8 { @@ -810,7 +855,32 @@ if (!iMapping) return LastError(); - iBase = MapViewOfFile(iMapping, FILE_MAP_READ, 0, 0, 0); + // First we need to read in the PE file's image headers, which consist of a 4 byte signature, the file header + // containing general information and up to 96 section headers. Map this amount of the file into memory so + // that we can examine it and calculate the minimum size of the sections themselves that need to be mapped into + // memory in order to examine the actual sections + SIZE_T headersSize = (sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + (96 * sizeof(IMAGE_OPTIONAL_HEADER))); + iBase = MapViewOfFile(iMapping, FILE_MAP_READ, 0, 0, headersSize); + + if (iBase) + { + // Scan through the section headers and determine the minimum amount of the file to be mapped into memory + // in order for us to safely examine the sections, and map the file into memory. We do this rather than + // map the entire PE file into memory because with full debug information, DLLs can be anything up to 100 MB!!! + TInt sectionsSize = GetSectionsSize(NtHeader()); + + // Before remapping the file with its new size, unmap it. While one would think that it is safe to + // increase the size of the file's mapping it is not, and doing so triggers behaviour in Windows that + // results in quickly using up all available virtual memory address space! + if (UnmapViewOfFile(iBase)) + { + iBase = MapViewOfFile(iMapping, FILE_MAP_READ, 0, 0, sectionsSize); + } + else + { + iBase = NULL; + } + } if (!iBase) { diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/euser/v7_0/euser-7_0.cia --- a/kernel/eka/euser/v7_0/euser-7_0.cia Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/euser/v7_0/euser-7_0.cia Mon Jun 21 17:12:14 2010 +0300 @@ -1,4 +1,18 @@ -// +// Copyright (c) 2010 Nokia 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/euser/v7_0/euser-7_0.cia +// // EUSER-7_0.CIA - generated by GENSHIMSRC.BAT // diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/include/e32cmn.h --- a/kernel/eka/include/e32cmn.h Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/include/e32cmn.h Mon Jun 21 17:12:14 2010 +0300 @@ -5430,6 +5430,7 @@ IMPORT_C RArrayBase(TInt anEntrySize, TInt aMinGrowBy, TInt aKeyOffset, TInt aFactor); IMPORT_C RArrayBase(TInt aEntrySize,TAny* aEntries, TInt aCount); IMPORT_C void Close(); + IMPORT_C void SetKeyOffset(TInt aKeyOffset); IMPORT_C TInt Count() const; IMPORT_C TAny* At(TInt anIndex) const; IMPORT_C TInt Append(const TAny* anEntry); @@ -5528,6 +5529,7 @@ inline RArray(TInt aMinGrowBy, TInt aKeyOffset, TInt aFactor); inline RArray(TInt aEntrySize,T* aEntries, TInt aCount); inline void Close(); + inline void SetKeyOffset(TInt aKeyOffset); inline TInt Count() const; inline const T& operator[](TInt anIndex) const; inline T& operator[](TInt anIndex); diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/include/e32cmn.inl --- a/kernel/eka/include/e32cmn.inl Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/include/e32cmn.inl Mon Jun 21 17:12:14 2010 +0300 @@ -4980,6 +4980,21 @@ template +inline void RArray::SetKeyOffset(TInt aOffset) +/** +Sets the offset of the ordering key within each array entry. + +@param aKeyOffset The key offset. + +@panic USER 128, if aKeyOffset is not positive, or is not less than the + size of class T, or is not a multiple of 4. +*/ + {RArrayBase::SetKeyOffset(aOffset);} + + + + +template inline TInt RArray::Count() const /** Gets the number of objects in the array. diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/include/e32ver.h --- a/kernel/eka/include/e32ver.h Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/include/e32ver.h Mon Jun 21 17:12:14 2010 +0300 @@ -28,7 +28,7 @@ const TInt KE32MajorVersionNumber=2; const TInt KE32MinorVersionNumber=0; -const TInt KE32BuildVersionNumber=2127; +const TInt KE32BuildVersionNumber=2137; const TInt KMachineConfigurationMajorVersionNumber=1; const TInt KMachineConfigurationMinorVersionNumber=0; diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/include/emulator.h --- a/kernel/eka/include/emulator.h Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/include/emulator.h Mon Jun 21 17:12:14 2010 +0300 @@ -33,6 +33,10 @@ class TUidType; class TProcessCreateInfo; +// Names of sections that we are interested in looking at. These are used by the GetSectionsSize() +// routine to determine the minimum number of bytes of a DLL to map into memory in order to examine +// its sections. If a new section is added here then it must also be added to the list of sections +// held in the sectionNames array in GetSectionsSize() static const BYTE KWin32SectionName_Symbian[IMAGE_SIZEOF_SHORT_NAME] = {'.','S','Y','M','B','I','A','N'}; static const BYTE KWin32SectionName_Import[IMAGE_SIZEOF_SHORT_NAME] = {'.','i','d','a','t','a','\0','\0'}; static const BYTE KWin32SectionName_EpocData[IMAGE_SIZEOF_SHORT_NAME] = {'.','d','a','t','a','\0','\0','\0'}; diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/include/kernel/sproperty.h --- a/kernel/eka/include/kernel/sproperty.h Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/include/kernel/sproperty.h Mon Jun 21 17:12:14 2010 +0300 @@ -95,7 +95,19 @@ private: friend class TProperty; - DProcess* iProcess; + + /** + Defines the context of iProcess. + @internalComponent + */ + enum {KScheduledForCompletion = 1, KProcessPtrMask = 0xfffffffe}; + + /** + The process that has required notification. + LSB is set if the request is scheduled for completition. + */ + DProcess* iProcess; + }; diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/kernel/sinit.cpp --- a/kernel/eka/kernel/sinit.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/kernel/sinit.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -372,6 +372,7 @@ pN->iFlags |= KThreadFlagSystemPermanent; // supervisor thread can't exit for any reason + K::SvThread=pN; K::TheKernelThread=pN; K::SvMsgQ->iThread=&pN->iNThread; K::SvBarrierQ.SetDfcQ(K::SvMsgQ); diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/kernel/sipc.cpp --- a/kernel/eka/kernel/sipc.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/kernel/sipc.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -1144,7 +1144,7 @@ if(m->IsDelivered() || m->IsAccepted()) { - if (!IsClosing()) + if (!IsClosing() && t->iMState != DThread::EDead) { m->SetCompleting(); Kern::QueueRequestComplete(t, m, aReason); @@ -1750,7 +1750,7 @@ s->iConnectMsgPtr = NULL; __KTRACE_OPT(KIPC,Kern::Printf("MsgCo: M:%d r:%d %O->%O", m.iFunction, aReason, TheCurrentThread, m.iClient)); - if (!s->IsClosing()) + if (!s->IsClosing() && m.iClient->iMState != DThread::EDead) { m.SetCompleting(); Kern::QueueRequestComplete(m.iClient, &m, aReason); diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/kernel/sproperty.cpp --- a/kernel/eka/kernel/sproperty.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/kernel/sproperty.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -29,6 +29,14 @@ return TheCurrentThread->iOwningProcess; } +// Used by a thread to schedule cancelation of Subscribe request in Supervisor thread. +class TCancelQ: public SDblQueLink +{ +public: + TPropertySubsRequest* iPropSubRequest;//The request to be cancelled, can be NULL + NFastSemaphore iFSemaphore;//Semafore to be signalled by Supervisor thread after the request is cancelled. +}; + class TProperty { public: @@ -112,7 +120,10 @@ static void CompleteRequest(TPropertySubsRequest*, TInt aReason); static void CompleteQue(SDblQue* aQue, TInt aReason); static void CompleteDfc(TAny* aQue); - + static void CompleteDfcByKErrPermissionDenied(TAny* aQue); + static void CompleteDfcByKErrNotFound(TAny* aQue); + static void CompleteCancellationQDfc(TAny* aQue); + static TUint Hash(TUint aCategory, TUint aKey); static TProperty** Lookup(TUint aCategory, TUint aKey); static TInt LookupOrCreate(TUint aCategory, TUint aKey, TProperty**); @@ -186,10 +197,17 @@ #endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ - enum { KCompletionDfcPriority = 2 }; + enum { KCancellationDfcPriority = 1, KCompletionDfcPriority = 2 }; static TDfc CompletionDfc; - // subscriptions to be completed by the DFC - static SDblQue CompletionQue; // protected by the system lock + static TDfc CompletionDfcPermissionDenied; + static TDfc CompletionDfcNotFound; + static TDfc CancellationDfc; + + // subscriptions to be completed by the DFCs, protected by system lock + static SDblQue CompletionQue; // to be completed by KerrNone + static SDblQue CompletionQuePermissionDenied; + static SDblQue CompletionQueNotFound; + static SDblQue CancellationQue; static DMutex* FeatureLock; ///< Order KMutexOrdPubSub @@ -266,8 +284,20 @@ }; +// Completion/Cancelation DFCs and their corresponding queues. +// All subscribe requests are completed in Supervisor thread. TDfc TProperty::CompletionDfc(TProperty::CompleteDfc, &TProperty::CompletionQue, KCompletionDfcPriority); SDblQue TProperty::CompletionQue; + +TDfc TProperty::CompletionDfcPermissionDenied(TProperty::CompleteDfcByKErrPermissionDenied, &TProperty::CompletionQuePermissionDenied, KCompletionDfcPriority); +SDblQue TProperty::CompletionQuePermissionDenied; + +TDfc TProperty::CompletionDfcNotFound(TProperty::CompleteDfcByKErrNotFound, &TProperty::CompletionQueNotFound, KCompletionDfcPriority); +SDblQue TProperty::CompletionQueNotFound; + +TDfc TProperty::CancellationDfc(TProperty::CompleteCancellationQDfc, &TProperty::CancellationQue, KCancellationDfcPriority); +SDblQue TProperty::CancellationQue; + DMutex* TProperty::FeatureLock; TProperty* TProperty::Table[KHashTableLimit]; @@ -288,6 +318,9 @@ if (r != KErrNone) return r; CompletionDfc.SetDfcQ(K::SvMsgQ); + CompletionDfcPermissionDenied.SetDfcQ(K::SvMsgQ); + CompletionDfcNotFound.SetDfcQ(K::SvMsgQ); + CancellationDfc.SetDfcQ(K::SvMsgQ); #ifdef __DEMAND_PAGING__ r = Kern::MutexCreate(PagingLockMutex, KPubSubMutexName2, KMutexOrdPubSub2); @@ -512,8 +545,9 @@ // iteration; we get (move) always the first 'iPendingQue' entry until the // queue becomes empty. // - SDblQue localPendingQue; // protected by the system lock - SDblQue localCompletionQue; // protected by the system lock + + SDblQue localPendingQue; // Will hold requests with sufficient capabilities. + TInt accessDeniedCounter = 0;// Will count requests with no sufficient capabilities. NKern::LockSystem(); while (!iPendingQue.IsEmpty()) { @@ -522,7 +556,8 @@ subs->iProcess = NULL; if (process && !CheckGetRights(process, __PLATSEC_DIAGNOSTIC_STRING("Checked whilst trying to Subscribe to a Publish and Subscribe Property"))) { // Check fails - will complete the subscription with an error - localCompletionQue.Add(subs); + CompletionQuePermissionDenied.Add(subs); + accessDeniedCounter++; } else { // Check OK - will leave in the pending queue @@ -536,8 +571,10 @@ // Now the property can be accessed by other threads. Use(); Unlock(); - // Now we can complete requests. - CompleteQue(&localCompletionQue, KErrPermissionDenied); + + // Schedule DFC to complete requests of those with insufficient capabilities. + if (accessDeniedCounter) + CompletionDfcPermissionDenied.Enque(); return KErrNone; } @@ -604,9 +641,10 @@ SetNotDefined(); // Down from here nobody can access the property value - // We don't want to complete requests holding the feature lock. - SDblQue localQue; - localQue.MoveFrom(&iPendingQue); + // Move all pending requests to completion queue (to be completed by KErrNotFound). + TBool pendingQueEmpty = iPendingQue.IsEmpty(); + if(!pendingQueEmpty) + CompletionQueNotFound.MoveFrom(&iPendingQue); NKern::UnlockSystem(); @@ -616,8 +654,10 @@ Release(); // '*this' may do not exist any more Unlock(); - // Now we can complete. - CompleteQue(&localQue, KErrNotFound); + + // Schedule Svc Dfc to complete all requests from CompletionQueNotFound. + if (!pendingQueEmpty) + CompletionDfcNotFound.Enque(); return KErrNone; } @@ -661,9 +701,8 @@ aSubs->iProcess = NULL; if (aProcess && !CheckGetRights(aProcess,__PLATSEC_DIAGNOSTIC_STRING("Checked whilst trying to Subscribe to a Publish and Subscribe Property"))) { - NKern::ThreadEnterCS(); - CompleteRequest(aSubs, KErrPermissionDenied); - NKern::ThreadLeaveCS(); + CompletionQuePermissionDenied.Add(aSubs); + CompletionDfcPermissionDenied.Enque(SYSTEM_LOCK); return KErrNone; } } @@ -681,36 +720,70 @@ void TProperty::Cancel(TPropertySubsRequest* aSubs) { __ASSERT_SYSTEM_LOCK; - if (!aSubs->iNext) - { // not pending - silently return - NKern::UnlockSystem(); + + // This is set if the request is about to be completed (in SVC thread). In that case, a 'dummy' CancelationDFC + // will be scheduled here. This will just ensure that we don't return from Cancel before ongoing completion has finished. + TBool scheduledForCompletition = (TInt)(aSubs->iProcess) & TPropertySubsRequest::KScheduledForCompletion; + + if (!aSubs->iNext && !scheduledForCompletition) + { // Neither in any queue nor scheduled for completion. + // The request is not active - silently return. + NKern::UnlockSystem(); return; } - aSubs->Deque(); - aSubs->iNext = NULL; - aSubs->iProcess = NULL; - NKern::ThreadEnterCS(); - CompleteRequest(aSubs, KErrCancel); - NKern::ThreadLeaveCS(); + + if (aSubs->iNext) + { + // Take it out from the current queue. It is usually pending queue of a property but could + // also be one of the completion queues. + aSubs->Deque(); + aSubs->iNext = NULL; + } + + // Set process to NULL (leave KScheduledForCompletion bit as it is) + aSubs->iProcess = (DProcess*)((TInt)aSubs->iProcess & ~TPropertySubsRequest::KProcessPtrMask); + + if (&Kern::CurrentThread() == K::SvThread) + { // Complete the request immediatelly if already running in supervisor thread... + if (!scheduledForCompletition) + CompleteRequest(aSubs, KErrCancel); //This will also release system lock. + else + NKern::UnlockSystem(); // Nothing to be done here. Just release system lock. + } + else + { //... or schedule DFC in supervisor thread to complete the request. + TCancelQ linkQ; + if (!scheduledForCompletition) + linkQ.iPropSubRequest = aSubs; // CancelationDFC will complete this request with KErrCancel. + else + linkQ.iPropSubRequest = NULL; // Schedule 'dummy' CancelationDFC (no request will be completed). + linkQ.iFSemaphore.iOwningThread = NKern::CurrentThread(); + CancellationQue.Add(&linkQ); + CancellationDfc.Enque(SYSTEM_LOCK); // This will also release system lock. + + NKern::FSWait(&linkQ.iFSemaphore); // Wait for CancellationDfc to finish. + } } // Enter system locked. // Return system unlocked. -// Called in CS or a DFC context +// Executed in supervisor thread. void TProperty::CompleteRequest(TPropertySubsRequest* aSubs, TInt aResult) { // static __ASSERT_SYSTEM_LOCK; - __ASSERT_CRITICAL; + __PS_ASSERT(&Kern::CurrentThread() == K::SvThread); TPropertyCompleteFn fn = aSubs->iCompleteFn; TAny* ptr = aSubs->iPtr; + // Mark that this request is about to be completed. + aSubs->iProcess = (DProcess*)((TInt)aSubs->iProcess | TPropertySubsRequest::KScheduledForCompletion); NKern::UnlockSystem(); (*fn)(ptr, aResult); } -// Called in CS or a DFC context +// Executed in supervisor thread. void TProperty::CompleteQue(SDblQue* aQue, TInt aReason) { // static - __ASSERT_CRITICAL; + __PS_ASSERT(&Kern::CurrentThread() == K::SvThread); NKern::LockSystem(); while (!aQue->IsEmpty()) { @@ -723,12 +796,53 @@ NKern::UnlockSystem(); } -// Executed in DFC context +// Executed in supervisor thread. Completes requests with KErrNone. void TProperty::CompleteDfc(TAny* aQue) { // static CompleteQue((SDblQue*) aQue, KErrNone); } +// Executed in supervisor thread. +void TProperty::CompleteDfcByKErrPermissionDenied(TAny* aQue) + { // static + CompleteQue((SDblQue*) aQue, KErrPermissionDenied); + } + +// Executed in supervisor thread. +void TProperty::CompleteDfcByKErrNotFound(TAny* aQue) + { // static + CompleteQue((SDblQue*) aQue, KErrNotFound); + } + +// Executed in supervisor thread. +void TProperty::CompleteCancellationQDfc(TAny* aAny) + { // static + SDblQue* aQue = (SDblQue*)aAny; + NKern::LockSystem(); + while (!aQue->IsEmpty() ) + { + TCancelQ* first = static_cast(aQue->First()); + first->Deque(); + first->iNext = NULL; + + if( first->iPropSubRequest) + { + CompleteRequest(first->iPropSubRequest, KErrCancel); // This will also release system lock. + NKern::LockSystem(); + } + else + { + // Do not complete the request. + // It was already just about to be completed when Cancel request was issued. + // As all complitions (this method included) run is Svc thread, we can here be sure that + // the request is now completed. + NKern::FlashSystem(); // Preemption point + } + NKern::FSSignal( &first->iFSemaphore ); // Issue the signal that the request is now completed. + } + NKern::UnlockSystem(); + } + // Enter system locked. // Return system unlocked. void TProperty::CompleteByDfc() @@ -900,7 +1014,7 @@ return KErrArgument; } iValue = aValue; - CompleteByDfc(); + CompleteByDfc(); //This will also release system lock. return KErrNone; } diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/kernel/sthread.cpp --- a/kernel/eka/kernel/sthread.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/kernel/sthread.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -114,8 +114,23 @@ iTls.Close(); if (iSyncMsgPtr) { - __KTRACE_OPT(KSERVER,Kern::Printf("DThread::Destruct(%08X) freeing sync message at %08X", this, iSyncMsgPtr)); - iSyncMsgPtr->ReleaseMessagePool(RMessageK::ESync, 1); + // The sync message might still be outstanding; in particular it may be + // on the kernel server's list of messages to be cleaned up on behalf of + // dead clients. So we only release it here if it's free; otherwise, we + // mutate the type, so that cleanup will return it to the Global pool. + NKern::LockSystem(); + if (iSyncMsgPtr->IsFree()) + { + NKern::UnlockSystem(); + __KTRACE_OPT(KSERVER,Kern::Printf("DThread::Destruct(%08X) releasing sync message at %08X", this, iSyncMsgPtr)); + iSyncMsgPtr->ReleaseMessagePool(RMessageK::ESync, 1); + } + else + { + __KTRACE_OPT(KSERVER,Kern::Printf("DThread::Destruct(%08X) mutating sync message at %08X", this, iSyncMsgPtr)); + iSyncMsgPtr->iMsgType = RMessageK::EGlobal; + NKern::UnlockSystem(); + } iSyncMsgPtr = NULL; } FreeSupervisorStack(); diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/memmodel/epoc/flexible/mmu/mpager.cpp --- a/kernel/eka/memmodel/epoc/flexible/mmu/mpager.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/memmodel/epoc/flexible/mmu/mpager.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -458,8 +458,7 @@ case SPageInfo::EPagedOld: case SPageInfo::EPagedOldestClean: case SPageInfo::EPagedOldestDirty: - {// Update the list links point to the new page. - __NK_ASSERT_DEBUG(iYoungCount); + {// Update the list links to point to the new page. SDblQueLink* prevLink = aOldPageInfo.iLink.iPrev; #ifdef _DEBUG SDblQueLink* nextLink = aOldPageInfo.iLink.iNext; @@ -635,7 +634,10 @@ template class TSequentialColourSelector { public: - static const TUint KMaxSearchLength = _ALIGN_UP(maxObjects, KPageColourCount); + enum + { + KMaxSearchLength = _ALIGN_UP(maxObjects, KPageColourCount) + }; FORCE_INLINE TSequentialColourSelector(TUint aTargetLength) { @@ -1109,6 +1111,41 @@ } +TUint DPager::AllowAddFreePages(SPageInfo*& aPageInfo, TUint aNumPages) + { + if (iMinimumPageCount + iNumberOfFreePages == iMaximumPageCount) + {// The paging cache is already at the maximum size so steal a page + // so it can be returned to the system if required. + aPageInfo = StealOrAllocPage(EFalse, (Mmu::TRamAllocFlags)0); + __NK_ASSERT_DEBUG(aPageInfo->PagedState() == SPageInfo::EUnpaged); + return 1; + } + // The paging cache is not at its maximum so determine how many can be added to + // the paging cache without it growing past its maximum. + aPageInfo = NULL; + __NK_ASSERT_DEBUG(iMinimumPageCount + iNumberOfFreePages < iMaximumPageCount); + if (iMinimumPageCount + iNumberOfFreePages + aNumPages > iMaximumPageCount) + { + return iMaximumPageCount - (iMinimumPageCount + iNumberOfFreePages); + } + else + return aNumPages; + } + + +void DPager::AllowAddFreePage(SPageInfo*& aPageInfo) + { + if (iMinimumPageCount + iNumberOfFreePages == iMaximumPageCount) + {// The paging cache is already at the maximum size so steal a page + // so it can be returned to the system if required. + aPageInfo = StealOrAllocPage(EFalse, (Mmu::TRamAllocFlags)0); + __NK_ASSERT_DEBUG(aPageInfo->PagedState() == SPageInfo::EUnpaged); + return; + } + aPageInfo = NULL; + } + + void DPager::ReturnPageToSystem(SPageInfo& aPageInfo) { __NK_ASSERT_DEBUG(RamAllocLock::IsHeld()); @@ -1186,9 +1223,18 @@ TPhysAddr* end = aPages+aCount; while(aPagesaMaximumPageCount) + if(aMinimumPageCount > aMaximumPageCount) return KErrArgument; NKern::ThreadEnterCS(); @@ -2072,12 +2151,12 @@ // Make sure aMinimumPageCount is not less than absolute minimum we can cope with... iMinimumPageLimit = iMinYoungPages * (1 + iYoungOldRatio) / iYoungOldRatio + DPageReadRequest::ReservedPagesRequired(); - if(iMinimumPageLimit iMaximumPageCount) @@ -2091,7 +2170,7 @@ } // Increase iMinimumPageCount? - TInt r=KErrNone; + TInt r = KErrNone; while(aMinimumPageCount > iMinimumPageCount) { TUint newMin = MinU(aMinimumPageCount, iMinimumPageCount + iNumberOfFreePages); @@ -2101,7 +2180,7 @@ // have to add pages before we can increase minimum page count if(!TryGrowLiveList()) { - r=KErrNoMemory; + r = KErrNoMemory; break; } } diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/memmodel/epoc/flexible/mmu/mpager.h --- a/kernel/eka/memmodel/epoc/flexible/mmu/mpager.h Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/memmodel/epoc/flexible/mmu/mpager.h Mon Jun 21 17:12:14 2010 +0300 @@ -442,7 +442,8 @@ If the oldest page is on any other list (i.e. is an old or young page) this will steal it, aquiring the page cleaning mutex first if it is dirty. - Called from #PageInAllocPage and #TryReturnOldestPageToSystem. + Called from #PageInAllocPage, #TryReturnOldestPageToSystem, #AllowAddFreePage and + #AllowAddFreePages. @param aAllowAlloc Indicates whether the method should try to allocate a page from the system @@ -503,6 +504,29 @@ TBool TryReturnOldestPageToSystem(); /** + Ensure adding a page to the paging cache will be within the maximum size. + + @param aPageInfo On return this is set to the SPageInfo of a page that must be returned + to the system before a page can be added to the paging cache, or + NULL if no page must be returned to the system. + */ + void AllowAddFreePage(SPageInfo*& aPageInfo); + + /** + Ensure adding aNumPages pages to the paging cache will be within the maximum size. + + @param aPageInfo On return this is set to the SPageInfo of a page that must be returned + to the system before any more pages can be added to the paging cache, or + NULL if no page must be returned to the system. + @param aNumPages The number of pages the caller wishes to add to the paging cache. + + @return If aPageInfo == NULL on return, this is the number of pages it is possible to + add to the paging cache or 1 if aPageInfo != NULL, i.e. a page will need + to be returned to the system. + */ + TUint AllowAddFreePages(SPageInfo*& aPageInfo, TUint aNumPages); + + /** Put a specific page back on the system's free pool. @pre RamAllocLock held. diff -r bbf8bed59bcb -r 2bb754abd467 kernel/eka/release.txt --- a/kernel/eka/release.txt Wed Jun 09 11:10:19 2010 +0300 +++ b/kernel/eka/release.txt Mon Jun 21 17:12:14 2010 +0300 @@ -1,3 +1,91 @@ +Version 2.00.2137 +================= +(Made by vfebvre 09/06/2010) + +1. shubmurt + 1. ou1cimx1#387232 CodeAbort exception in CompleteQue method, kernel/sproperty.cpp + Changes in Publish & Subscribe + +2. coliward + 1. ou1cimx1#424882 SDK specific: Unable to Install Midlet in the Emulator. + + +Version 2.00.2136 +================= +(Made by vfebvre 07/06/2010) + +1. lanerobe + 1. ou1cimx1#393868 Use built-in uint32 sort function + +2. martai + 1. ou1cimx1#414410 E32TEST T_RAMALL occasionally times out + + +Version 2.00.2135 +================= +(Made by vfebvre 04/06/2010) + +1. kingzhan + 1. ou1cimx1#415058 92 Mutex ordering violation in USB driver + +2. cnotton + 1. ou1cimx1#414553 Attempt to export missing file bootstrap_smrif.h + + +Version 2.00.2134 +================= +(Made by vfebvre 03/06/2010) + +1. martai + 1. ou1cimx1#414435 WDP: The paging cache can increase beyond its maximum size temporarily + + +Version 2.00.2133 +================= +(Made by vfebvre 03/06/2010) + +1. jimhofe + 1. MINOR_CHANGE Documentation formatting tweaks + +2. gcochran + 1. ou1cimx1#400068 E32TEST RMessagePtr2::Kill is not exercised by t_message + + +Version 2.00.2132 +================= +(Made by vfebvre 02/06/2010) + +1. davegord + 1. ou1cimx1#410777 Kernel Message Pool corrupted by delayed DeadClientCleanup + + +Version 2.00.2130 +================= +(Made by vfebvre 28/05/2010) + +1. lanerobe + 1. ou1cimx1#399811 BM_SUITE does not run on NaviEngine + + +Version 2.00.2129 +================= +(Made by vfebvre 27/05/2010) + +1. vfebvre + 1. ou1cimx1#400807 Warnings reported by the Symbian Foundation license checker + +2. lanerobe + 1. ou1cimx1#399627 Build HCR test roms in its own folder + + +Version 2.00.2128 +================= +(Made by vfebvre 26/05/2010) + +1. elzou + 1. ou1cimx1#393925 Phone reset if connect/disconnect USB mouse few times fast + + Version 2.00.2127 ================= (Made by vfebvre 24/05/2010) diff -r bbf8bed59bcb -r 2bb754abd467 kernelhwsrv_info/doc_pub/base_how_to_armv7_cache_and_access_remapping_-_design.doc Binary file kernelhwsrv_info/doc_pub/base_how_to_armv7_cache_and_access_remapping_-_design.doc has changed diff -r bbf8bed59bcb -r 2bb754abd467 kernelhwsrv_info/doc_pub/base_how_to_crash_logging.doc Binary file kernelhwsrv_info/doc_pub/base_how_to_crash_logging.doc has changed diff -r bbf8bed59bcb -r 2bb754abd467 kernelhwsrv_info/doc_pub/base_how_to_publish_and_subscribe.doc Binary file kernelhwsrv_info/doc_pub/base_how_to_publish_and_subscribe.doc has changed diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/active/t_messge.cpp --- a/kerneltest/e32test/active/t_messge.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/active/t_messge.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -78,7 +78,8 @@ class CTestSession : public CSession2 { public: - enum {EStop,ETestInt,ETestPtr,ETestClient,ETestComplete,ETestPtrComplete,ETestCompletePanic,ETestOtherSession,ETestCompleteAfter,ETestMessageConstruction, ETestRMessagePtr2LeavingInterface}; + enum {EStop,ETestInt,ETestPtr,ETestClient,ETestComplete,ETestPtrComplete,ETestCompletePanic,ETestOtherSession,ETestCompleteAfter,ETestMessageConstruction, + ETestRMessagePtr2LeavingInterface, ETestKillCompletePanic}; //Override pure virtual IMPORT_C virtual void ServiceL(const RMessage2& aMessage); private: @@ -323,6 +324,10 @@ case ETestRMessagePtr2LeavingInterface: r=TestRMessagePtr2LeavingInterface(aMessage); break; + case ETestKillCompletePanic: + aMessage.Complete(KErrNone); + aMessage.Panic(_L("Testing Panic"),0xFF); //This will panic the server! + break; default: r=KErrNotSupported; @@ -480,7 +485,7 @@ test.Next(_L("Start ActiveScheduler and signal to client")); - test.Printf(_L(" There might be something going on beneath this window")); + test.Printf(_L(" There might be something going on beneath this window\n")); sem.Signal(); CActiveScheduler::Start(); test.Next(_L("Destroy ActiveScheduler")); @@ -522,6 +527,23 @@ session.PublicSendReceive(CTestSession::EStop, TIpcArgs());//panic should occur before this is serviced return(KErrNone); } + +TInt KillCompletePanicClientThread (TAny*) +// +// A client thread entry - signals to server to kill client after completing the message +// + { + sem.Wait(); + + TInt r=session.PublicCreateSession(_L("CTestServer"),1); + test(r==KErrNone); + + r=session.PublicSendReceive(CTestSession::ETestKillCompletePanic, TIpcArgs()); + test(r==KErrNone); + + session.PublicSendReceive(CTestSession::EStop, TIpcArgs());//panic should occur before this is serviced + return(KErrNone); + } void SimpleRMessage() // @@ -575,7 +597,86 @@ test.End(); } + +void TestServerCompleteTwicePanic(void) + { + TRequestStatus clientStat,serverStat; + + TBool justInTime=User::JustInTime(); + + test.Next(_L("Check server panics if you try to complete a message twice")); + test.Start(_L("Create client and server threads")); + clientThread.Create(_L("Client Thread1"),CompletePanicClientThread,KDefaultStackSize,KHeapMinSize,KHeapMaxSize,NULL); + serverThread.Create(_L("Server Thread"),ServerThread,KDefaultStackSize,KHeapMinSize,KHeapMaxSize,NULL); + + test.Next(_L("Logon to the threads")); + clientThread.Logon(clientStat); + serverThread.Logon(serverStat); + test.Next(_L("Start the threads")); + sem.CreateLocal(0); + User::SetJustInTime(EFalse); + clientThread.Resume(); + serverThread.Resume(); + + test.Next(_L("Wait for the threads to stop")); + User::WaitForRequest(clientStat); // + User::WaitForRequest(serverStat); + User::SetJustInTime(justInTime); + test.Next(_L("Check the exit categories")); + test(clientThread.ExitType()==EExitKill); + test(clientThread.ExitCategory().Compare(_L("Kill"))==0); + test(clientThread.ExitReason()==KErrNone); + + test(serverThread.ExitType()==EExitPanic); + test(serverThread.ExitCategory().Compare(_L("USER"))==0); + test(serverThread.ExitReason()==ETMesCompletion); + + test.Next(_L("Close the threads")); + CLOSE_AND_WAIT(serverThread); + CLOSE_AND_WAIT(clientThread); + test.End(); + } + +void TestServerKillCompletePanic(void) + { + TRequestStatus clientStat,serverStat; + + TBool justInTime=User::JustInTime(); + + test.Next(_L("Check Server panics if you try to panic a client using a completed message")); + test.Start(_L("Create client and server threads")); + clientThread.Create(_L("Client Thread2"),KillCompletePanicClientThread,KDefaultStackSize,KHeapMinSize,KHeapMaxSize,NULL); + serverThread.Create(_L("Server Thread"),ServerThread,KDefaultStackSize,KHeapMinSize,KHeapMaxSize,NULL); + + test.Next(_L("Logon to the threads")); + clientThread.Logon(clientStat); + serverThread.Logon(serverStat); + + test.Next(_L("Start the threads")); + sem.CreateLocal(0); + User::SetJustInTime(EFalse); + clientThread.Resume(); + serverThread.Resume(); + + test.Next(_L("Wait for the threads to stop")); + User::WaitForRequest(clientStat); + User::WaitForRequest(serverStat); + User::SetJustInTime(justInTime); + test.Next(_L("Check the exit categories")); + test(clientThread.ExitType()==EExitKill); + test(clientThread.ExitCategory().Compare(_L("Kill"))==0); + test(clientThread.ExitReason()==KErrNone); + + test(serverThread.ExitType()==EExitPanic); + test(serverThread.ExitCategory().Compare(_L("KERN-EXEC"))==0); + test(serverThread.ExitReason()==EBadMessageHandle); + + test.Next(_L("Close the threads")); + CLOSE_AND_WAIT(serverThread); + CLOSE_AND_WAIT(clientThread); + test.End(); + } GLDEF_C TInt E32Main() { @@ -643,41 +744,10 @@ CLOSE_AND_WAIT(serverThread); CLOSE_AND_WAIT(clientThread); test.End(); - - TBool justInTime=User::JustInTime(); - - test.Next(_L("Check it Panics if you try to Complete a message twice")); - test.Start(_L("Create client and server threads")); - clientThread.Create(_L("Client Thread1"),CompletePanicClientThread,KDefaultStackSize,KHeapMinSize,KHeapMaxSize,NULL); - serverThread.Create(_L("Server Thread"),ServerThread,KDefaultStackSize,KHeapMinSize,KHeapMaxSize,NULL); - - test.Next(_L("Logon to the threads")); - clientThread.Logon(clientStat); - serverThread.Logon(serverStat); - - test.Next(_L("Start the threads")); - sem.CreateLocal(0); - User::SetJustInTime(EFalse); - clientThread.Resume(); - serverThread.Resume(); - test.Next(_L("Wait for the threads to stop")); - User::WaitForRequest(clientStat); // - User::WaitForRequest(serverStat); - User::SetJustInTime(justInTime); - test.Next(_L("Check the exit categories")); - test(clientThread.ExitType()==EExitKill); - test(clientThread.ExitCategory().Compare(_L("Kill"))==0); - test(clientThread.ExitReason()==KErrNone); - - test(serverThread.ExitType()==EExitPanic); - test(serverThread.ExitCategory().Compare(_L("USER"))==0); - test(serverThread.ExitReason()==ETMesCompletion); - - test.Next(_L("Close the threads")); - CLOSE_AND_WAIT(serverThread); - CLOSE_AND_WAIT(clientThread); - test.End(); + TestServerCompleteTwicePanic(); + + TestServerKillCompletePanic(); test.End(); diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/benchmark/bm_ldd.cpp --- a/kerneltest/e32test/benchmark/bm_ldd.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/benchmark/bm_ldd.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -70,7 +70,7 @@ TInt StartTimerStampOverhead(); TInt RequestTimerStampOverhead(); // iRequestInterrupt() implementation - TInt SetAbsPrioirty(TInt aThreadHandle, TInt aNewPrio, TInt* aOldPrio); + TInt SetAbsPriority(TInt aThreadHandle, TInt aNewPrio, TInt* aOldPrio); DMutex* iLock; // Shall be acquired by anyone who access the object's writable state. @@ -533,9 +533,9 @@ // // -// The implmentation of RBMDriver::SetAbsPrioirty() call. +// The implementation of RBMDriver::SetAbsPriority() call. // -TInt DBMLChannel::SetAbsPrioirty(TInt aThreadHandle, TInt aNewPrio, TInt* aOldPrio) +TInt DBMLChannel::SetAbsPriority(TInt aThreadHandle, TInt aNewPrio, TInt* aOldPrio) { NKern::LockSystem(); // @@ -690,7 +690,7 @@ TInt newPrio; TInt oldPrio; umemget(&newPrio, a2, sizeof(newPrio)); - r = SetAbsPrioirty((TInt) a1, newPrio, &oldPrio); + r = SetAbsPriority((TInt) a1, newPrio, &oldPrio); umemput(a2, &oldPrio, sizeof(oldPrio)); break; } diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/benchmark/bm_main.cpp --- a/kerneltest/e32test/benchmark/bm_main.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/benchmark/bm_main.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -78,8 +78,6 @@ #include #include -RTest test(_L("Benchmark Suite")); - // // The default value of the time allocated for one benchmark program. // @@ -300,7 +298,7 @@ User::WaitForRequest(iExitStatus); CLOSE_AND_WAIT(iChild); // - // Lower the parent thread prioirty and then restore the current one + // Lower the parent thread priority and then restore the current one // to make sure that the kernel-side thread destruction DFC had a chance to complete. // TInt prio = BMProgram::SetAbsPriority(RThread(), iProg->iOrigAbsPriority); @@ -362,7 +360,7 @@ User::WaitForRequest(iExitStatus); CLOSE_AND_WAIT(iChild); // - // Lower the parent thread prioirty and then restore the current one + // Lower the parent thread priority and then restore the current one // to make sure that the kernel-side thread destruction DFC had a chance to complete. // TInt prio = BMProgram::SetAbsPriority(RThread(), iProg->iOrigAbsPriority); @@ -418,15 +416,9 @@ // GLDEF_C TInt E32Main() { + RTest test(_L("Benchmark Suite")); test.Title(); - TInt r = UserSvr::HalFunction(EHalGroupKernel, EKernelHalNumLogicalCpus, 0, 0); - if (r != 1) - { - test.Printf(_L("%d CPUs detected ... test not run\n"), r); - return r; - } - AddProperty(); AddThread(); AddIpc(); @@ -434,7 +426,7 @@ AddOverhead(); AddrtLatency(); - r = User::LoadPhysicalDevice(KBMPddFileName); + TInt r = User::LoadPhysicalDevice(KBMPddFileName); BM_ERROR(r, (r == KErrNone) || (r == KErrAlreadyExists)); r = User::LoadLogicalDevice(KBMLddFileName); @@ -545,7 +537,7 @@ // TBMResult* results = prog->Run(iter, &count); - // Restore the original prioirty + // Restore the original priority BMProgram::SetAbsPriority(RThread(), prog->iOrigAbsPriority); // @@ -617,6 +609,9 @@ void bm_assert_failed(char* aCond, char* aFile, TInt aLine) { + RTest test(_L("Benchmark Suite Assert Failed")); + test.Title(); + TPtrC8 fd((TUint8*)aFile); TPtrC8 cd((TUint8*)aCond); @@ -634,6 +629,9 @@ void bm_error_detected(TInt aError, char* aCond, char* aFile, TInt aLine) { + RTest test(_L("Benchmark Suite Error Detected")); + test.Title(); + TPtrC8 fd((TUint8*)aFile); TPtrC8 cd((TUint8*)aCond); diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/benchmark/bm_suite.h --- a/kerneltest/e32test/benchmark/bm_suite.h Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/benchmark/bm_suite.h Mon Jun 21 17:12:14 2010 +0300 @@ -226,7 +226,7 @@ KBMPriorityHigh = 60, // 60 is above all DFC 26 is below timer DFC /** * Absolute priority to be used for middle-priority threads. - * This is also the default prioirty - performance benchmarks are started at this prioirty. + * This is also the default priority - performance benchmarks are started at this prioirty. */ KBMPriorityMid = KBMPriorityHigh - 1, /** @@ -274,7 +274,7 @@ */ TThreadFunction iChildFunc; /** - * The child thread absolute prioirty. + * The child thread absolute priority. * Intialized by constructor. */ TInt iChildPrio; @@ -293,7 +293,7 @@ * Construct a new TBMSpawnArgs object. * * @param aChildFunc the child entry point - * @param aChildPrio the child thread absolute prioirty + * @param aChildPrio the child thread absolute priority * @param aRemote if ETrue the child thread must be created in a separate process; * otherwise, the child thread must be created within the parent's process. */ @@ -343,7 +343,7 @@ * * @param aThread a handle ro the target thread. * @param aNewPrio a new absolute priority for the target thread - * @return the old absolute prioirty of the target thread + * @return the old absolute priority of the target thread */ static TInt SetAbsPriority(RThread aThread, TInt aNewPrio); diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/benchmark/d32bm.h --- a/kerneltest/e32test/benchmark/d32bm.h Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/benchmark/d32bm.h Mon Jun 21 17:12:14 2010 +0300 @@ -227,7 +227,7 @@ * The operations are implmented as KBMLdName logical device by KBMLddFileName * logical device driver DLL. * - * The API enables to change the absolute prioirty of a thread. + * The API enables to change the absolute priority of a thread. */ class RBMDriver : public RBusLogicalChannel { @@ -243,7 +243,7 @@ return DoCreate(KBMLdName, TVersion(1,0,1), KNullUnit, &KBMPdName, NULL); } /** - * Change the absolute prioirty of a thread. + * Change the absolute priority of a thread. * * @param aThread a handle to the target thread * @param aNewPrio a new absolute priority for the target thread diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/benchmark/ipc.cpp --- a/kerneltest/e32test/benchmark/ipc.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/benchmark/ipc.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -212,11 +212,11 @@ BMProgram( aRemote ? ((aPriority == KBMPriorityHigh) - ? _L("Client-server Framework[Remote High Prioirty Server]") - : _L("Client-server Framework[Remote Low Prioirty Server]")) + ? _L("Client-server Framework[Remote High Priority Server]") + : _L("Client-server Framework[Remote Low Priority Server]")) : ((aPriority == KBMPriorityHigh) - ? _L("Client-server Framework[Local High Prioirty Server]") - : _L("Client-server Framework[Local Low Prioirty Server]"))) + ? _L("Client-server Framework[Local High Priority Server]") + : _L("Client-server Framework[Local Low Priority Server]"))) { iPriority = aPriority; iRemote = aRemote; diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/benchmark/property.cpp --- a/kerneltest/e32test/benchmark/property.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/benchmark/property.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -205,25 +205,36 @@ void Property::NotificationLatencyParent(TBMResult* aResult, TBMUInt64 aIter, struct Measurement* aM) { + TRequestStatus st1, st2; + RProperty time; TInt r = time.Define(KPropBenchmarkCategory, 0, RProperty::EByteArray, KPassPolicy, KPassPolicy); BM_ERROR(r, r == KErrNone); r = time.Attach(KPropBenchmarkCategory, 0); BM_ERROR(r, r == KErrNone); + time.Subscribe(st2); RProperty prop; r = prop.Define(KPropBenchmarkCategory, 1, aM->iType, KPassPolicy, KPassPolicy); BM_ERROR(r, r == KErrNone); r = prop.Attach(KPropBenchmarkCategory, 1); BM_ERROR(r, r == KErrNone); + prop.Subscribe(st1); + + RSemaphore sync; + r = sync.CreateGlobal(_L("sync"), 0); + BM_ERROR(r, r == KErrNone); NotificationLatencyArgs sl(aM->iType, aM->iSize, aM->iRemote, aIter, aM->iSetGetType); MBMChild* child = property.SpawnChild(&sl); + for (TBMUInt64 i = 0; i < aIter; ++i) { - TRequestStatus st; - prop.Subscribe(st); - User::WaitForRequest(st); + sync.Signal(); + User::WaitForRequest(st1); + BM_ERROR(st1.Int(), st1.Int() == KErrNone); + prop.Subscribe(st1); + switch(aM->iSetGetType) { case EOneArg: @@ -258,12 +269,11 @@ TBMTicks now; ::bmTimer.Stamp(&now); - BM_ERROR(st.Int(), st.Int() == KErrNone); - // subscribe for the time just before Set() - time.Subscribe(st); - User::WaitForRequest(st); - BM_ERROR(st.Int(), st.Int() == KErrNone); + User::WaitForRequest(st2); + BM_ERROR(st2.Int(), st2.Int() == KErrNone); + time.Subscribe(st2); + // get the time just before Set() TBMTicks propSetTime; TPtr8 ptr((TUint8*) &propSetTime, sizeof(propSetTime), sizeof(propSetTime)); @@ -272,9 +282,19 @@ aResult->Cumulate(TBMTicksDelta(propSetTime, now)); } + + prop.Cancel(); + User::WaitForRequest(st1); + BM_ERROR(st1.Int(), st1.Int() == KErrCancel); + time.Cancel(); + User::WaitForRequest(st2); + BM_ERROR(st2.Int(), st2.Int() == KErrCancel); + prop.Close(); time.Close(); + sync.Close(); child->WaitChildExit(); + r = prop.Delete(KPropBenchmarkCategory, 1); BM_ERROR(r, r == KErrNone); r = time.Delete(KPropBenchmarkCategory, 0); @@ -290,14 +310,25 @@ { iOutBuf[j] = (TUint8)(j + 1); } + RProperty time; + TInt r = time.Attach(KPropBenchmarkCategory, 0); + BM_ERROR(r, r == KErrNone); + RProperty prop; - TInt r = prop.Attach(KPropBenchmarkCategory, 1); + r = prop.Attach(KPropBenchmarkCategory, 1); + BM_ERROR(r, r == KErrNone); + + RSemaphore sync; + r = sync.OpenGlobal(_L("sync")); BM_ERROR(r, r == KErrNone); + for (TBMUInt64 i = 0; i < sl->iIterationCount; ++i) { + sync.Wait(); TBMTicks propSetTime; ::bmTimer.Stamp(&propSetTime); + switch(sl->iSetGetType) { case EOneArg: @@ -336,13 +367,16 @@ } break; } + // publish the time just before Set() TPtr8 ptr((TUint8*) &propSetTime, sizeof(propSetTime), sizeof(propSetTime)); - r = time.Set(KPropBenchmarkCategory, 0, ptr); + r = time.Set(ptr); BM_ERROR(r, r == KErrNone); } + prop.Close(); time.Close(); + sync.Close(); BMProgram::SetAbsPriority(RThread(), prio); return KErrNone; diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/benchmark/sync.cpp --- a/kerneltest/e32test/benchmark/sync.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/benchmark/sync.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -272,10 +272,15 @@ void Sync::SemaphoreLatencyParent(TBMResult* aResult, TBMUInt64 aIter, TBool aRemote) { + RSemaphore slSync; + TInt r = slSync.CreateGlobal(_L("slSync"), 0); + BM_ERROR(r, r == KErrNone); + SemaphoreLatencyArgs sl(aRemote, aIter); MBMChild* child = sync.SpawnChild(&sl); for (TBMUInt64 i = 0; i < aIter; ++i) { + slSync.Signal(); sl.iSem.Wait(); TBMTicks now; ::bmTimer.Stamp(&now); @@ -283,20 +288,27 @@ } child->WaitChildExit(); sl.Close(); + slSync.Close(); } TInt Sync::SemaphoreLatencyChild(TAny* ptr) { + RSemaphore slSync; + TInt r = slSync.OpenGlobal(_L("slSync")); + BM_ERROR(r, r == KErrNone); + SemaphoreLatencyArgs* sl = (SemaphoreLatencyArgs*) ptr; sl->ChildOpen(); for (TBMUInt64 i = 0; i < sl->iIterationCount; ++i) { + slSync.Wait(); TBMTicks sigTime; ::bmTimer.Stamp(&sigTime); sl->iSem.Signal(); sl->ChildSignalTime(sigTime); } sl->ChildClose(); + slSync.Close(); return KErrNone; } @@ -368,11 +380,16 @@ void Sync::ThreadSemaphoreLatencyParent(TBMResult* aResult, TBMUInt64 aIter, TBool aRemote) { + RSemaphore tslSync; + TInt r = tslSync.CreateGlobal(_L("tslSync"), 0); + BM_ERROR(r, r == KErrNone); + ThreadSemaphoreLatencyArgs sl(aRemote, aIter); MBMChild* child = sync.SpawnChild(&sl); for (TBMUInt64 i = 0; i < aIter; ++i) { sl.iStatus = KRequestPending; + tslSync.Signal(); User::WaitForRequest(sl.iStatus); BM_ASSERT(sl.iStatus == KErrNone); TBMTicks now; @@ -381,14 +398,20 @@ } child->WaitChildExit(); sl.Close(); + tslSync.Close(); } TInt Sync::ThreadSemaphoreLatencyChild(TAny* ptr) { + RSemaphore tslSync; + TInt r = tslSync.OpenGlobal(_L("tslSync")); + BM_ERROR(r, r == KErrNone); + ThreadSemaphoreLatencyArgs* sl = (ThreadSemaphoreLatencyArgs*) ptr; sl->ChildOpen(); for (TBMUInt64 i = 0; i < sl->iIterationCount; ++i) { + tslSync.Wait(); TRequestStatus* sptr = sl->iStatusPtr; TBMTicks sigTime; ::bmTimer.Stamp(&sigTime); @@ -396,6 +419,7 @@ sl->ChildSignalTime(sigTime); } sl->ChildClose(); + tslSync.Close(); return KErrNone; } diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/benchmark/thread.cpp --- a/kerneltest/e32test/benchmark/thread.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/benchmark/thread.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -164,8 +164,10 @@ TInt r = child.Create(KNullDesC, Thread::KillingChild, 0x2000, NULL, NULL); BM_ERROR(r, r == KErrNone); child.Logon(st); + BMProgram::SetAbsPriority(RThread(), KBMPriorityLow); + child.Resume(); + User::After(1000); // Give the child thread a chance to run - killing it too earlier can leave the heap locked BMProgram::SetAbsPriority(RThread(), KBMPriorityHigh); - child.Resume(); TBMTicks t1; ::bmTimer.Stamp(&t1); child.Kill(KErrCancel); diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/group/t_cachechunk.mmp --- a/kerneltest/e32test/group/t_cachechunk.mmp Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/group/t_cachechunk.mmp Mon Jun 21 17:12:14 2010 +0300 @@ -18,7 +18,7 @@ TARGET t_cachechunk.exe TARGETTYPE EXE SOURCEPATH ../mmu -SOURCE t_cachechunk.cpp +SOURCE t_cachechunk.cpp ..\demandpaging\t_dpcmn.cpp LIBRARY euser.lib hal.lib dptest.lib OS_LAYER_SYSTEMINCLUDE_SYMBIAN diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/group/t_smpsoakspin.mmp --- a/kerneltest/e32test/group/t_smpsoakspin.mmp Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/group/t_smpsoakspin.mmp Mon Jun 21 17:12:14 2010 +0300 @@ -1,6 +1,17 @@ -// e32test\group\t_smpsoakspin.mmp +// Copyright (c) 2010 Nokia 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". // -// Copyright (c) 2005 Symbian Ltd. All rights reserved. +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test/group/t_smpsoakspin.mmp // target t_smpsoakspin.exe diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/hcr/hcr.inf --- a/kerneltest/e32test/hcr/hcr.inf Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/hcr/hcr.inf Mon Jun 21 17:12:14 2010 +0300 @@ -29,8 +29,6 @@ PRJ_TESTEXPORTS hcr_tests.iby /epoc32/rom/include/hcr_tests.iby -tshell_hcrtest.oby ../../../kernel/eka/rombuild/tshell_hcrtest.oby -nandloader_hcrtest.oby ../../../kernel/eka/rombuild/nandloader_hcrtest.oby hcrtest.auto.bat /epoc32/rom/include/hcrtest.auto.bat hcr_autoexec.bat /epoc32/rom/include/hcr_autoexec.bat diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/hcr/hcrtest_h4roms.mbc --- a/kerneltest/e32test/hcr/hcrtest_h4roms.mbc Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/hcr/hcrtest_h4roms.mbc Mon Jun 21 17:12:14 2010 +0300 @@ -17,57 +17,57 @@ #ifndef BUILD_NO_UREL // Multiple Memory Model // - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v h4hrp -b urel -i armv5 --zip --symbol --name=H4_TBARMV5D-TSHELL.IMG --type=tshell_hcrtest - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v h4hrp -b urel -i armv5 --zip --symbol --name=H4_TBARMV5D-BOOTLDR.IMG --type=ubootldr - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v h4hrp -b urel -i armv5 --zip --symbol --name=H4_TBARMV5D-BOOTLDR-FAT32.IMG --type=ubootldr -D WITH_FAT32 + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v h4hrp -b urel -i armv5 --zip --symbol --name=H4_TBARMV5D-TSHELL.IMG --type=tshell_hcrtest + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v h4hrp -b urel -i armv5 --zip --symbol --name=H4_TBARMV5D-BOOTLDR.IMG --type=ubootldr + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v h4hrp -b urel -i armv5 --zip --symbol --name=H4_TBARMV5D-BOOTLDR-FAT32.IMG --type=ubootldr -D WITH_FAT32 // Small block NAND support - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v h4hrp -b urel -i armv5 --zip --symbol --name=H4_TBARMV5D-NAND2LDR.IMG --type=nandloader -D _NAND2 - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v h4hrp -b urel -i armv5 --zip --symbol --name=H4_TBARMV5D-TSHELL_NAND2.IMG --type=tshell_hcrtest -D _NAND2 + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v h4hrp -b urel -i armv5 --zip --symbol --name=H4_TBARMV5D-NAND2LDR.IMG --type=nandloader -D _NAND2 + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v h4hrp -b urel -i armv5 --zip --symbol --name=H4_TBARMV5D-TSHELL_NAND2.IMG --type=tshell_hcrtest -D _NAND2 // OneNAND support - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v h4hrp -b urel -i armv5 --zip --symbol --name=H4_TBARMV5D-NANDLDR.IMG --type=nandloader -D _ONENAND - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v h4hrp -b urel -i armv5 --zip --symbol --name=H4_TBARMV5D-TSHELL_NAND.IMG --type=tshell_hcrtest -D _ONENAND + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v h4hrp -b urel -i armv5 --zip --symbol --name=H4_TBARMV5D-NANDLDR.IMG --type=nandloader -D _ONENAND + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v h4hrp -b urel -i armv5 --zip --symbol --name=H4_TBARMV5D-TSHELL_NAND.IMG --type=tshell_hcrtest -D _ONENAND // Direct/Single Memory model - not supported I think // - // oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v sh4hrp -b urel -i armv5 --zip --symbol --name=SH4_TBARMV5D-TSHELL.IMG --type=tshell_hcrtest + // oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v sh4hrp -b urel -i armv5 --zip --symbol --name=SH4_TBARMV5D-TSHELL.IMG --type=tshell_hcrtest // Flexible Memory model // - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fh4hrp -b urel -i armv5 --zip --symbol --name=FH4_TBARMV5D-TSHELL.IMG --type=tshell_hcrtest + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fh4hrp -b urel -i armv5 --zip --symbol --name=FH4_TBARMV5D-TSHELL.IMG --type=tshell_hcrtest #endif // Direct/Single Memory model - not supported I think // -// oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v sh4hrp -b udeb -i armv5 --zip --symbol --name=SH4_TBARMV5D-TSHELL-D.IMG --type=tshell_hcrtest +// oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v sh4hrp -b udeb -i armv5 --zip --symbol --name=SH4_TBARMV5D-TSHELL-D.IMG --type=tshell_hcrtest // Multiple Memory Model // -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-TSHELL-D.IMG --type=tshell_hcrtest -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-BOOTLDR-D.IMG --type=ubootldr -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-BOOTLDR-FAT32-D.IMG --type=ubootldr -D WITH_FAT32 +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-TSHELL-D.IMG --type=tshell_hcrtest +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-BOOTLDR-D.IMG --type=ubootldr +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-BOOTLDR-FAT32-D.IMG --type=ubootldr -D WITH_FAT32 // Small block NAND support -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-NAND2LDR-D.IMG --type=nandloader -D _NAND2 -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-TSHELL_NAND2-D.IMG --type=tshell_hcrtest -D _NAND2 -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-TSHELL_PAGED_NAND2B-D.IMG --type=tshell_hcrtest -D USE_SDIO_SD_MMC,WITH_FAT32,_NAND2,PAGED_ROM,PAGED_CODE +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-NAND2LDR-D.IMG --type=nandloader -D _NAND2 +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-TSHELL_NAND2-D.IMG --type=tshell_hcrtest -D _NAND2 +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-TSHELL_PAGED_NAND2B-D.IMG --type=tshell_hcrtest -D USE_SDIO_SD_MMC,WITH_FAT32,_NAND2,PAGED_ROM,PAGED_CODE // OneNAND support -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-NANDLDR-D.IMG --type=nandloader -D _ONENAND -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-TSHELL_NAND-D.IMG --type=tshell_hcrtest -D _ONENAND +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-NANDLDR-D.IMG --type=nandloader -D _ONENAND +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v h4hrp -b udeb -i armv5 --zip --symbol --name=H4_TBARMV5D-TSHELL_NAND-D.IMG --type=tshell_hcrtest -D _ONENAND // Flexible Memory model // -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fh4hrp -b udeb -i armv5 --zip --symbol --name=FH4_TBARMV5D-TSHELL-D.IMG --type=tshell_hcrtest +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fh4hrp -b udeb -i armv5 --zip --symbol --name=FH4_TBARMV5D-TSHELL-D.IMG --type=tshell_hcrtest // Small block NAND support -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fh4hrp -b udeb -i armv5 --zip --symbol --name=FH4_TBARMV5D-NAND2LDR-D.IMG --type=nandloader -D _NAND2 -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fh4hrp -b udeb -i armv5 --zip --symbol --name=FH4_TBARMV5D-TSHELL_NAND2-D.IMG --type=tshell_hcrtest -D _NAND2 -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fh4hrp -b udeb -i armv5 --zip --symbol --name=FH4_TBARMV5D-TSHELL_PAGED_NAND2B-D.IMG --type=tshell_hcrtest -D USE_SDIO_SD_MMC,WITH_FAT32,_NAND2,PAGED_ROM,PAGED_CODE +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fh4hrp -b udeb -i armv5 --zip --symbol --name=FH4_TBARMV5D-NAND2LDR-D.IMG --type=nandloader -D _NAND2 +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fh4hrp -b udeb -i armv5 --zip --symbol --name=FH4_TBARMV5D-TSHELL_NAND2-D.IMG --type=tshell_hcrtest -D _NAND2 +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fh4hrp -b udeb -i armv5 --zip --symbol --name=FH4_TBARMV5D-TSHELL_PAGED_NAND2B-D.IMG --type=tshell_hcrtest -D USE_SDIO_SD_MMC,WITH_FAT32,_NAND2,PAGED_ROM,PAGED_CODE // OneNAND support -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fh4hrp -b udeb -i armv5 --zip --symbol --name=FH4_TBARMV5D-NANDLDR-D.IMG --type=nandloader -D _ONENAND -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fh4hrp -b udeb -i armv5 --zip --symbol --name=FH4_TBARMV5D-TSHELL_NAND-D.IMG --type=tshell_hcrtest -D _ONENAND +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fh4hrp -b udeb -i armv5 --zip --symbol --name=FH4_TBARMV5D-NANDLDR-D.IMG --type=nandloader -D _ONENAND +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fh4hrp -b udeb -i armv5 --zip --symbol --name=FH4_TBARMV5D-TSHELL_NAND-D.IMG --type=tshell_hcrtest -D _ONENAND diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/hcr/hcrtest_ne1roms.mbc --- a/kerneltest/e32test/hcr/hcrtest_ne1roms.mbc Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/hcr/hcrtest_ne1roms.mbc Mon Jun 21 17:12:14 2010 +0300 @@ -29,64 +29,64 @@ #ifndef BUILD_NO_UREL // Direct/Single Memory model - unicore - udeb // - // oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v sne1_tb -b urel -i armv5 --zip --symbol --name=SNE1_TBARMV5D-TSHELL.IMG --type=tshell_hcrtest + // oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v sne1_tb -b urel -i armv5 --zip --symbol --name=SNE1_TBARMV5D-TSHELL.IMG --type=tshell_hcrtest // Multiple Memory Model - unicore - udeb // - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v ne1_tb -b urel -i armv5 --zip --symbol --name=NE1_TBARMV5D-TSHELL.IMG --type=tshell_hcrtest -D HCR_INCLUDE_VARIANT_TEST_DRIVERS - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v ne1_tb -b urel -i armv5 --zip --symbol --name=NE1_TBARMV5D-BOOTLDR.IMG --type=ubootldr - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v ne1_tb -b urel -i armv5 --zip --symbol --name=NE1_TBARMV5D-BOOTLDR-FAT32.IMG --type=ubootldr -D WITH_FAT32 + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v ne1_tb -b urel -i armv5 --zip --symbol --name=NE1_TBARMV5D-TSHELL.IMG --type=tshell_hcrtest -D HCR_INCLUDE_VARIANT_TEST_DRIVERS + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v ne1_tb -b urel -i armv5 --zip --symbol --name=NE1_TBARMV5D-BOOTLDR.IMG --type=ubootldr + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v ne1_tb -b urel -i armv5 --zip --symbol --name=NE1_TBARMV5D-BOOTLDR-FAT32.IMG --type=ubootldr -D WITH_FAT32 // Large block NAND support - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v ne1_tb -b urel -i armv5 --zip --symbol --name=NE1_TBARMV5D-NAND2LDR.IMG --type=nandloader_hcrtest -D _NAND2 - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v ne1_tb -b urel -i armv5 --zip --symbol --name=NE1_TBARMV5D-TSHELL_NAND2.IMG --type=tshell_hcrtest -D _NAND2,HCR_INCLUDE_VARIANT_TEST_DRIVERS + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v ne1_tb -b urel -i armv5 --zip --symbol --name=NE1_TBARMV5D-NAND2LDR.IMG --type=nandloader_hcrtest -D _NAND2 + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v ne1_tb -b urel -i armv5 --zip --symbol --name=NE1_TBARMV5D-TSHELL_NAND2.IMG --type=tshell_hcrtest -D _NAND2,HCR_INCLUDE_VARIANT_TEST_DRIVERS // OneNAND support -- -D _ONENANDE not supported on NE1 // Flexible Memory model - unicore & SMP - udeb // - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fne1_tb -b urel -i armv5 --zip --symbol --name=FNE1_TBARMV5D-TSHELL.IMG --type=tshell_hcrtest -D HCR_INCLUDE_VARIANT_TEST_DRIVERS - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fne1_tb -b urel -i armv5 -x armv5smp --zip --symbol --name=FNE1_TBARMV5SMPD-TSHELL.IMG --type=tshell_hcrtest -D HCR_INCLUDE_VARIANT_TEST_DRIVERS + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fne1_tb -b urel -i armv5 --zip --symbol --name=FNE1_TBARMV5D-TSHELL.IMG --type=tshell_hcrtest -D HCR_INCLUDE_VARIANT_TEST_DRIVERS + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fne1_tb -b urel -i armv5 -x armv5smp --zip --symbol --name=FNE1_TBARMV5SMPD-TSHELL.IMG --type=tshell_hcrtest -D HCR_INCLUDE_VARIANT_TEST_DRIVERS // Large block NAND support - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fne1_tb -b urel -i armv5 --zip --symbol --name=FNE1_TBARMV5D-NAND2LDR.IMG --type=nandloader_hcrtest -D _NAND2 - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fne1_tb -b urel -i armv5 --zip --symbol --name=FNE1_TBARMV5D-TSHELL_NAND2.IMG --type=tshell_hcrtest -D _NAND2,HCR_INCLUDE_VARIANT_TEST_DRIVERS - oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fne1_tb -b urel -i armv5 -x armv5smp --zip --symbol --name=FNE1_TBARMV5SMPD-TSHELL_NAND2.IMG --type=tshell_hcrtest -D _NAND2,HCR_INCLUDE_VARIANT_TEST_DRIVERS + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fne1_tb -b urel -i armv5 --zip --symbol --name=FNE1_TBARMV5D-NAND2LDR.IMG --type=nandloader_hcrtest -D _NAND2 + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fne1_tb -b urel -i armv5 --zip --symbol --name=FNE1_TBARMV5D-TSHELL_NAND2.IMG --type=tshell_hcrtest -D _NAND2,HCR_INCLUDE_VARIANT_TEST_DRIVERS + oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fne1_tb -b urel -i armv5 -x armv5smp --zip --symbol --name=FNE1_TBARMV5SMPD-TSHELL_NAND2.IMG --type=tshell_hcrtest -D _NAND2,HCR_INCLUDE_VARIANT_TEST_DRIVERS // OneNAND support -- -D _ONENANDE not supported on NE1 #endif // Direct/Single Memory model - unicore - udeb // -// oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v sne1_tb -b udeb -i armv5 --zip --symbol --name=SNE1_TBARMV5D-TSHELL-D.IMG --type=tshell_hcrtest +// oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v sne1_tb -b udeb -i armv5 --zip --symbol --name=SNE1_TBARMV5D-TSHELL-D.IMG --type=tshell_hcrtest // Multiple Memory Model - unicore - udeb // -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v ne1_tb -b udeb -i armv5 --zip --symbol --name=NE1_TBARMV5D-TSHELL-D.IMG --type=tshell_hcrtest -D HCR_INCLUDE_VARIANT_TEST_DRIVERS -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v ne1_tb -b udeb -i armv5 --zip --symbol --name=NE1_TBARMV5D-BOOTLDR-D.IMG --type=ubootldr -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v ne1_tb -b udeb -i armv5 --zip --symbol --name=NE1_TBARMV5D-BOOTLDR-FAT32-D.IMG --type=ubootldr -D WITH_FAT32 +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v ne1_tb -b udeb -i armv5 --zip --symbol --name=NE1_TBARMV5D-TSHELL-D.IMG --type=tshell_hcrtest -D HCR_INCLUDE_VARIANT_TEST_DRIVERS +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v ne1_tb -b udeb -i armv5 --zip --symbol --name=NE1_TBARMV5D-BOOTLDR-D.IMG --type=ubootldr +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v ne1_tb -b udeb -i armv5 --zip --symbol --name=NE1_TBARMV5D-BOOTLDR-FAT32-D.IMG --type=ubootldr -D WITH_FAT32 // Large block NAND support -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v ne1_tb -b udeb -i armv5 --zip --symbol --name=NE1_TBARMV5D-NAND2LDR-D.IMG --type=nandloader_hcrtest -D _NAND2 -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v ne1_tb -b udeb -i armv5 --zip --symbol --name=NE1_TBARMV5D-TSHELL_NAND2-D.IMG --type=tshell_hcrtest -D _NAND2,HCR_INCLUDE_VARIANT_TEST_DRIVERS +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v ne1_tb -b udeb -i armv5 --zip --symbol --name=NE1_TBARMV5D-NAND2LDR-D.IMG --type=nandloader_hcrtest -D _NAND2 +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v ne1_tb -b udeb -i armv5 --zip --symbol --name=NE1_TBARMV5D-TSHELL_NAND2-D.IMG --type=tshell_hcrtest -D _NAND2,HCR_INCLUDE_VARIANT_TEST_DRIVERS // OneNAND support -- -D _ONENANDE not supported on NE1 // Flexible Memory model - unicore & SMP - udeb // -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fne1_tb -b udeb -i armv5 --zip --symbol --name=FNE1_TBARMV5D-TSHELL-D.IMG --type=tshell_hcrtest -D HCR_INCLUDE_VARIANT_TEST_DRIVERS -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fne1_tb -b udeb -i armv5 -x armv5smp --zip --symbol --name=FNE1_TBARMV5SMPD-TSHELL-D.IMG --type=tshell_hcrtest -D HCR_INCLUDE_VARIANT_TEST_DRIVERS +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fne1_tb -b udeb -i armv5 --zip --symbol --name=FNE1_TBARMV5D-TSHELL-D.IMG --type=tshell_hcrtest -D HCR_INCLUDE_VARIANT_TEST_DRIVERS +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fne1_tb -b udeb -i armv5 -x armv5smp --zip --symbol --name=FNE1_TBARMV5SMPD-TSHELL-D.IMG --type=tshell_hcrtest -D HCR_INCLUDE_VARIANT_TEST_DRIVERS // Large block NAND support -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fne1_tb -b udeb -i armv5 --zip --symbol --name=FNE1_TBARMV5D-NAND2LDR-D.IMG --type=nandloader_hcrtest -D _NAND2 -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fne1_tb -b udeb -i armv5 --zip --symbol --name=FNE1_TBARMV5D-TSHELL_NAND2-D.IMG --type=tshell_hcrtest -D _NAND2,HCR_INCLUDE_VARIANT_TEST_DRIVERS -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fne1_tb -b udeb -i armv5 -x armv5smp --zip --symbol --name=FNE1_TBARMV5SMPD-TSHELL_NAND2-D.IMG --type=tshell_hcrtest -D _NAND2,HCR_INCLUDE_VARIANT_TEST_DRIVERS +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fne1_tb -b udeb -i armv5 --zip --symbol --name=FNE1_TBARMV5D-NAND2LDR-D.IMG --type=nandloader_hcrtest -D _NAND2 +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fne1_tb -b udeb -i armv5 --zip --symbol --name=FNE1_TBARMV5D-TSHELL_NAND2-D.IMG --type=tshell_hcrtest -D _NAND2,HCR_INCLUDE_VARIANT_TEST_DRIVERS +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fne1_tb -b udeb -i armv5 -x armv5smp --zip --symbol --name=FNE1_TBARMV5SMPD-TSHELL_NAND2-D.IMG --type=tshell_hcrtest -D _NAND2,HCR_INCLUDE_VARIANT_TEST_DRIVERS // OneNAND support -- -D _ONENANDE not supported on NE1 // Large block NAND support + WDP -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fne1_tb -b udeb -i armv5 --zip --symbol --name=FNE1_TBARMV5D-TSHELL_NAND2-WDP-D.IMG --type=tshell_hcrtest -D _NAND2,PAGED_ROM,PAGED_CODE,PAGED_DATA,DATAPAGINGWARNINGS,WITH_FAT32,FULL_NAND_TEST,HCR_INCLUDE_VARIANT_TEST_DRIVERS -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fne1_tb -b udeb -i armv5 --zip --symbol --name=FNE1_TBARMV5D-NAND2LDR-WDP-D.IMG --type=nandloader_hcrtest -D _NAND2,_CREATE_NE1_TB_NAND_SWAP -oneoff \os\kernelhwsrv\kernel\eka\rombuild rom -v fne1_tb -b udeb -i armv5 -x armv5smp --zip --symbol --name=FNE1_TBARMV5SMPD-TSHELL_NAND2-WDP-D.IMG --type=tshell_hcrtest -D _NAND2,PAGED_ROM,PAGED_CODE,PAGED_DATA,DATAPAGINGWARNINGS,WITH_FAT32,FULL_NAND_TEST,HCR_INCLUDE_VARIANT_TEST_DRIVERS +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fne1_tb -b udeb -i armv5 --zip --symbol --name=FNE1_TBARMV5D-TSHELL_NAND2-WDP-D.IMG --type=tshell_hcrtest -D _NAND2,PAGED_ROM,PAGED_CODE,PAGED_DATA,DATAPAGINGWARNINGS,WITH_FAT32,FULL_NAND_TEST,HCR_INCLUDE_VARIANT_TEST_DRIVERS +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fne1_tb -b udeb -i armv5 --zip --symbol --name=FNE1_TBARMV5D-NAND2LDR-WDP-D.IMG --type=nandloader_hcrtest -D _NAND2,_CREATE_NE1_TB_NAND_SWAP +oneoff . \os\kernelhwsrv\kernel\eka\rombuild\rom -v fne1_tb -b udeb -i armv5 -x armv5smp --zip --symbol --name=FNE1_TBARMV5SMPD-TSHELL_NAND2-WDP-D.IMG --type=tshell_hcrtest -D _NAND2,PAGED_ROM,PAGED_CODE,PAGED_DATA,DATAPAGINGWARNINGS,WITH_FAT32,FULL_NAND_TEST,HCR_INCLUDE_VARIANT_TEST_DRIVERS diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/mmu/t_cachechunk.cpp --- a/kerneltest/e32test/mmu/t_cachechunk.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/mmu/t_cachechunk.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -87,8 +87,9 @@ #include "d_gobble.h" #include #include "freeram.h" +#include "..\demandpaging\t_dpcmn.h" -LOCAL_D RTest test(_L("T_CACHECHUNK")); +RTest test(_L("T_CACHECHUNK")); RMemoryTestLdd MemoryTest; @@ -504,6 +505,175 @@ } +TBool StopCacheThreads; + +TInt CacheThreadFunc(TAny* aMax) + { + RThread::Rendezvous(KErrNone); + while (!StopCacheThreads) + { + TInt maxSize = (TInt)aMax; + TInt minSize; + TInt r = KErrNone; + for (minSize = PageSize << 4; r == KErrNone && !StopCacheThreads; minSize += PageSize) + { + r = UserSvr::HalFunction(EHalGroupVM,EVMHalSetCacheSize,(TAny*)minSize,(TAny*)maxSize); + User::After(minSize/PageSize); + } + for (minSize -= PageSize; + minSize > PageSize << 4 && r == KErrNone && !StopCacheThreads; + minSize -= PageSize) + { + r = UserSvr::HalFunction(EHalGroupVM,EVMHalSetCacheSize,(TAny*)minSize,(TAny*)maxSize); + User::After(minSize/PageSize); + } + } + return KErrNone; + } + + +TInt DonateThreadFunc(TAny*) + { + TChunkCreateInfo createInfo; + createInfo.SetCache(100 * PageSize); + RChunk chunk; + TInt r = chunk.Create(createInfo); + if (r != KErrNone) + { + RDebug::Printf("DonateThreadFunc: Failed to create cache chunk %d", r); + return r; + } + TUint chunkEnd = 0; + while (chunk.Commit(chunkEnd, PageSize) == KErrNone) + chunkEnd += PageSize; + + RThread::Rendezvous(KErrNone); + while (!StopCacheThreads) + { + for (TUint i = PageSize; i <= chunkEnd && !StopCacheThreads; i += PageSize) + { + chunk.Unlock(0, i); + if (chunk.Lock(0, i) != KErrNone) + {// Recommit as many pages as possible. + while (chunk.Commit(0, chunkEnd) != KErrNone && !StopCacheThreads) + chunkEnd -= PageSize; + i = 0; + } + User::After(i/PageSize); + } + } + CLOSE_AND_WAIT(chunk); + return KErrNone; + } + + +TInt DirtyThreadFunc(TAny*) + { + RThread::Rendezvous(KErrNone); + + RChunk chunk; + TChunkCreateInfo createInfo; + createInfo.SetNormal(PageSize * 100, PageSize *100); + createInfo.SetPaging(TChunkCreateInfo::EPaged); + TInt r = chunk.Create(createInfo); + if (r != KErrNone) + { + RDebug::Printf("Failed to create a cache chunk %d", r); + return r; + } + TUint8* base = chunk.Base(); + // Dirty each page in the chunk so that there are dirty pages in the live + // list while it is being resized and pages are being unlocked. + while (!StopCacheThreads) + { + TUint8* p = base; + TUint8* pEnd = base + chunk.Size(); + for (; p < pEnd && !StopCacheThreads; p += PageSize) + { + *p = (TUint8)(pEnd - p); + User::After((TUint8)(pEnd - p)); + } + } + CLOSE_AND_WAIT(chunk); + return KErrNone; + } + + +void TestResizeExcess() + { + test.Printf(_L("Commit all of memory again leaving 100 free pages\n")); + CommitEnd = 0; + TInt r; + while(KErrNone==(r=TestChunk.Commit(CommitEnd,PageSize))) + { + CommitEnd += PageSize; + } + test(r==KErrNoMemory); + test_KErrNone(TestChunk.Unlock(0, 100 * PageSize)); + + SVMCacheInfo info; + test_KErrNone(UserSvr::HalFunction(EHalGroupVM, EVMHalGetCacheSize, &info, 0)); + + StopCacheThreads = EFalse; + RThread cacheThread; + r = cacheThread.Create( KNullDesC, CacheThreadFunc, KDefaultStackSize, PageSize, + PageSize, (TAny*)info.iMaxSize); + test_KErrNone(r); + TRequestStatus threadStarted; + cacheThread.Rendezvous(threadStarted); + TRequestStatus cacheStatus; + cacheThread.Logon(cacheStatus); + cacheThread.Resume(); + User::WaitForRequest(threadStarted); + test_KErrNone(threadStarted.Int()); + + // Create the dirty thread before the donate thread as the donate thread may + // consume all the free ram periodically. + RThread dirtyThread; + r = dirtyThread.Create(KNullDesC, DirtyThreadFunc, KDefaultStackSize, PageSize, PageSize, NULL); + test_KErrNone(r); + dirtyThread.Rendezvous(threadStarted); + TRequestStatus dirtyStatus; + dirtyThread.Logon(dirtyStatus); + dirtyThread.Resume(); + User::WaitForRequest(threadStarted); + test_KErrNone(threadStarted.Int()); + + RThread donateThread; + r = donateThread.Create(KNullDesC, DonateThreadFunc, KDefaultStackSize, PageSize, PageSize, NULL); + test_KErrNone(r); + donateThread.Rendezvous(threadStarted); + TRequestStatus donateStatus; + donateThread.Logon(donateStatus); + donateThread.Resume(); + User::WaitForRequest(threadStarted); + test_KErrNone(threadStarted.Int()); + + // Run test for 10 secs. + User::After(10000000); + + // End the test. + StopCacheThreads = ETrue; + User::WaitForRequest(donateStatus); + test_Equal(EExitKill, donateThread.ExitType()); + test_KErrNone(donateThread.ExitReason()); + User::WaitForRequest(dirtyStatus); + test_Equal(EExitKill, dirtyThread.ExitType()); + test_KErrNone(dirtyThread.ExitReason()); + User::WaitForRequest(cacheStatus); + test_Equal(EExitKill, cacheThread.ExitType()); + test_KErrNone(cacheThread.ExitReason()); + + CLOSE_AND_WAIT(donateThread); + CLOSE_AND_WAIT(cacheThread); + CLOSE_AND_WAIT(dirtyThread); + + test_KErrNone(UserSvr::HalFunction( EHalGroupVM, + EVMHalSetCacheSize, + (TAny*)info.iMinSize, + (TAny*)info.iMaxSize)); + } + TInt E32Main() { @@ -636,6 +806,16 @@ if (resizeCache) test_KErrNone(DPTest::SetCacheSize(originalMin, originalMax)); + test_KErrNone(GetGlobalPolicies()); + if (gDataPagingSupported) + { + test.Next(_L("Test interactions of chunk unlocking and page cache resizing")); + // Do this after the live list limit is restored. + test_KErrNone(TestChunk.Create(createInfo)); + TestResizeExcess(); + TestChunk.Close(); + } + // end... test.End(); MemoryTest.Close(); diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/mmu/t_ramall.cpp --- a/kerneltest/e32test/mmu/t_ramall.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/mmu/t_ramall.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -25,6 +25,7 @@ #include "d_shadow.h" #include "mmudetect.h" #include "freeram.h" +#include "d_gobble.h" LOCAL_D RTest test(_L("T_RAMALL")); @@ -47,6 +48,30 @@ TUint OrigMinCacheSize; TUint OrigMaxCacheSize; +// +// Random number generation +// + +TUint32 RandomSeed; + +TUint32 Random() + { + RandomSeed = RandomSeed*69069+1; + return RandomSeed; + } + +TUint32 Random(TUint32 aRange) + { + return (TUint32)((TUint64(Random())*TUint64(aRange))>>32); + } + +void RandomInit(TUint32 aSeed) + { + RandomSeed = aSeed+(aSeed<<8)+(aSeed<<16)+(aSeed<<24); + Random(); + Random(); + } + TInt AllocPhysicalRam(TUint32& aAddr, TInt aSize, TInt aAlign) { return Shadow.AllocPhysicalRam(aAddr,aSize,aAlign); @@ -144,7 +169,7 @@ TInt FillPhysicalRam(TAny* aArgs) { - SPhysAllocData& allocData = *((SPhysAllocData*)aArgs); + SPhysAllocData allocData = *((SPhysAllocData*)aArgs); TUint maxAllocs = FreeRam() / allocData.iSize; TUint32* physAddrs = new TUint32[maxAllocs + 1]; if (!physAddrs) @@ -224,14 +249,16 @@ {// Need enough heap to store addr of every possible allocation + 1. TUint requiredHeapMax = Max(PageSize, ((TotalRam / aSize) * sizeof(TUint32)) + sizeof(TUint32)); TInt r = threads[i].Create(KNullDesC, FillPhysicalRam, KDefaultStackSize, PageSize, requiredHeapMax, (TAny*)&allocData); - test_KErrNone(r); + if (r != KErrNone) + break; threads[i].Logon(status[i]); } - for (i = 0; i < aNumThreads; i++) + TUint totalThreads = i; + for (i = 0; i < totalThreads; i++) { threads[i].Resume(); } - for (i = 0; i < aNumThreads; i++) + for (i = 0; i < totalThreads; i++) { User::WaitForRequest(status[i]); test_Equal(EExitKill, threads[i].ExitType()); @@ -253,25 +280,32 @@ TInt TouchMemory(TAny*) { RThread::Rendezvous(KErrNone); // Signal that this thread has started running. + RandomInit(TouchData.iSize); while (!TouchDataStop) { TUint8* p = Chunk.Base(); TUint8* pEnd = p + ChunkCommitEnd; TUint8* fragPEnd = p + TouchData.iFrequency; - for (TUint8* fragP = p + TouchData.iSize; fragPEnd < pEnd;) + for (TUint8* fragP = p + TouchData.iSize; fragPEnd < pEnd && !TouchDataStop;) { TUint8* data = fragP; - for (; data < fragPEnd; data += PageSize) + for (; data < fragPEnd && !TouchDataStop; data += PageSize) { *data = (TUint8)(data - fragP); + TUint random = Random(); + if (random & 0x8484) + User::After(random & 0xFFFF); } - for (data = fragP; data < fragPEnd; data += PageSize) + for (data = fragP; data < fragPEnd && !TouchDataStop; data += PageSize) { if (*data != (TUint8)(data - fragP)) { RDebug::Printf("Error unexpected data 0x%x read from 0x%08x", *data, data); return KErrGeneral; } + TUint random = Random(); + if (random & 0x8484) + User::After(random & 0xFFFF); } fragP = fragPEnd + TouchData.iSize; fragPEnd += TouchData.iFrequency; @@ -311,10 +345,9 @@ { TUint minCacheSize = FreeRam(); TUint maxCacheSize = minCacheSize; - TUint currentCacheSize; - test_KErrNone(DPTest::CacheSize(OrigMinCacheSize, OrigMaxCacheSize, currentCacheSize)); - test_KErrNone(DPTest::SetCacheSize(minCacheSize, maxCacheSize)); - test_KErrNone(DPTest::SetCacheSize(OrigMinCacheSize, maxCacheSize)); + DPTest::SetCacheSize(minCacheSize, maxCacheSize); + if (OrigMinCacheSize <= maxCacheSize) + DPTest::SetCacheSize(OrigMinCacheSize, maxCacheSize); } } @@ -322,7 +355,7 @@ void UnfragmentMemoryFunc() { if (FragData.iDiscard && CacheSizeAdjustable) - test_KErrNone(DPTest::SetCacheSize(OrigMinCacheSize, OrigMaxCacheSize)); + DPTest::SetCacheSize(OrigMinCacheSize, OrigMaxCacheSize); Chunk.Decommit(0, Chunk.MaxSize()); } @@ -351,11 +384,12 @@ TChunkCreateInfo chunkInfo; chunkInfo.SetDisconnected(0, 0, TotalRam); chunkInfo.SetPaging(TChunkCreateInfo::EUnpaged); + chunkInfo.SetClearByte(0x19); test_KErrNone(Chunk.Create(chunkInfo)); if (aFragThread) { - TInt r = FragThread.Create(KNullDesC, FragmentMemoryThreadFunc, KDefaultStackSize, PageSize, PageSize, NULL); + TInt r = FragThread.Create(_L("FragThread"), FragmentMemoryThreadFunc, KDefaultStackSize, PageSize, PageSize, NULL); test_KErrNone(r); FragThread.Logon(FragStatus); FragThreadStop = EFalse; @@ -373,7 +407,7 @@ { TouchData.iSize = aSize; TouchData.iFrequency = aFrequency; - TInt r = TouchThread.Create(KNullDesC, TouchMemory, KDefaultStackSize, PageSize, PageSize, NULL); + TInt r = TouchThread.Create(_L("TouchThread"), TouchMemory, KDefaultStackSize, PageSize, PageSize, NULL); test_KErrNone(r); TouchThread.Logon(TouchStatus); TouchDataStop = EFalse; @@ -407,6 +441,8 @@ } else UnfragmentMemoryFunc(); + if (CacheSizeAdjustable) + test_KErrNone(DPTest::SetCacheSize(OrigMinCacheSize, OrigMaxCacheSize)); CLOSE_AND_WAIT(Chunk); } @@ -418,7 +454,7 @@ FragmentMemory(aFragSize, aFragFreq, aDiscard, aTouchMemory, EFalse); SPhysAllocData allocData; // Only check free all ram could be allocated in manual tests as fixed pages may be fragmented. - allocData.iCheckMaxAllocs = (ManualTest && !aTouchMemory && !aAllocAlign)? ETrue : EFalse; + allocData.iCheckMaxAllocs = (ManualTest && !aTouchMemory && !aAllocAlign); allocData.iCheckFreeRam = ETrue; allocData.iSize = aAllocSize; allocData.iAlign = aAllocAlign; @@ -528,6 +564,18 @@ if (memodel >= EMemModelTypeFlexible) { + // To stop these tests taking too long leave only 8MB of RAM free. + const TUint KFreePages = 2048; + test.Next(_L("Load gobbler LDD")); + TInt r = User::LoadLogicalDevice(KGobblerLddFileName); + test_Value(r, r == KErrNone || r == KErrAlreadyExists); + RGobbler gobbler; + r = gobbler.Open(); + test_KErrNone(r); + TUint32 taken = gobbler.GobbleRAM(KFreePages * PageSize); + test.Printf(_L("Gobbled: %dK\n"), taken/1024); + test.Printf(_L("Free RAM 0x%08X bytes\n"),FreeRam()); + test.Next(_L("TestFragmentedAllocation")); TestFragmentedAllocation(); @@ -554,6 +602,8 @@ TestMultipleContiguousAllocations(10, PageSize * 1024, PageShift + 10); UnfragmentMemory(ETrue, ETrue, EFalse); + // Temporarily disable these tests until errors they cause are fixed. +#if 0 test.Next(_L("TestMultipleContiguousAllocations with repeated movable and discardable allocations")); FragmentMemory(PageSize, PageSize * 2, EFalse, EFalse, ETrue); TestMultipleContiguousAllocations(20, PageSize * 2, PageShift); @@ -570,9 +620,15 @@ FragmentMemory(PageSize * 32, PageSize * 64, ETrue, EFalse, ETrue); TestMultipleContiguousAllocations(20, PageSize * 1024, PageShift + 10); UnfragmentMemory(ETrue, EFalse, ETrue); +#endif + gobbler.Close(); + r = User::FreeLogicalDevice(KGobblerLddFileName); + test_KErrNone(r); } Shadow.Close(); + r = User::FreeLogicalDevice(KLddFileName); + test_KErrNone(r); test.Printf(_L("Free RAM=%08x at end of test\n"),FreeRam()); test.End(); return(KErrNone); diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/prime/t_timer.cpp --- a/kerneltest/e32test/prime/t_timer.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/prime/t_timer.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -290,16 +290,17 @@ t2.HomeTime(); } while (t2==t1); -#if defined(_DEBUG) - TDateTime dt=t2.DateTime(); - test.Printf(_L("%d:%d\r\n"),dt.Second(),dt.MicroSecond()); -#endif - test(t2>t1); + + if (t2 <= t1 && t1.MicroSecondsFrom(t2) > TTimeIntervalMicroSeconds(1000)) // HomeTime() only operates at ms precision + { + test.Printf(_L("Time comparison failed\r\n")); + test.Printf(_L("Before: 0x%lx\r\n"), t1.Int64()); + test.Printf(_L("After: 0x%lx\r\n"), t2.Int64()); + test(t2>t1); + } + t1=t2; } -#if defined(_DEBUG) - test.Printf(_L("\r\n")); -#endif } TInt AtTwice(TAny*) diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/usb/t_usb_win/scripts/massstorage/bmwritelargefile.pl --- a/kerneltest/e32test/usb/t_usb_win/scripts/massstorage/bmwritelargefile.pl Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/usb/t_usb_win/scripts/massstorage/bmwritelargefile.pl Mon Jun 21 17:12:14 2010 +0300 @@ -287,8 +287,4 @@ free space for the file that is going to be created. The default size is 400 MB. -=head1 COPYRIGHT - -Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. - =cut diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/usb/t_usb_win/scripts/massstorage/bmwritemanyfiles.pl --- a/kerneltest/e32test/usb/t_usb_win/scripts/massstorage/bmwritemanyfiles.pl Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/usb/t_usb_win/scripts/massstorage/bmwritemanyfiles.pl Mon Jun 21 17:12:14 2010 +0300 @@ -300,8 +300,4 @@ free space for the file that is going to be created. The default size is 400 MB. -=head1 COPYRIGHT - -Copyright (c) 2006-2008 Symbian Software Ltd. All rights reserved. All rights reserved. - =cut diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/usb/t_usb_win/scripts/massstorage/createfilesanddirs.pl --- a/kerneltest/e32test/usb/t_usb_win/scripts/massstorage/createfilesanddirs.pl Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/usb/t_usb_win/scripts/massstorage/createfilesanddirs.pl Mon Jun 21 17:12:14 2010 +0300 @@ -397,8 +397,4 @@ TestExpectedResults: Read data from files should match with written. -=head1 COPYRIGHT - -Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. - =cut diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/usb/t_usb_win/scripts/massstorage/createlargefile.pl --- a/kerneltest/e32test/usb/t_usb_win/scripts/massstorage/createlargefile.pl Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/usb/t_usb_win/scripts/massstorage/createlargefile.pl Mon Jun 21 17:12:14 2010 +0300 @@ -248,8 +248,4 @@ with written. Sum of file size and free space should be close to drive size. -=head1 COPYRIGHT - -Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. - =cut diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32utils/group/base_e32utils.mrp --- a/kerneltest/e32utils/group/base_e32utils.mrp Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32utils/group/base_e32utils.mrp Mon Jun 21 17:12:14 2010 +0300 @@ -17,7 +17,6 @@ source \sf\os\kernelhwsrv\kerneltest\e32utils\trace source \sf\os\kernelhwsrv\kerneltest\e32utils\usbmsapp source \sf\os\kernelhwsrv\kerneltest\e32utils\sdpartition -source \sf\os\kernelhwsrv\kerneltest\e32utils\nandboot\coreldr\bootstrap_smrif.h #MattD: Reltools 2.67 don't understand 'cwtools' are the CW equivelent of 'tools' and try to do '-what cwtools udeb' instead of '-what cwtools deb'. #binary \sf\os\kernelhwsrv\kerneltest\e32utils\group cwtools diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32utils/group/bld.inf --- a/kerneltest/e32utils/group/bld.inf Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32utils/group/bld.inf Mon Jun 21 17:12:14 2010 +0300 @@ -30,8 +30,6 @@ PRJ_EXPORTS -../nandboot/coreldr/bootstrap_smrif.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(bootstrap_smrif.h) - ../profiler/profiler.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(profiler.h) ../analyse/profiler.rtf /epoc32/engdoc/profiler/profiler.rtf diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/f32test/locl/CodepageUtils/src/t_cputils_cp932.cpp --- a/kerneltest/f32test/locl/CodepageUtils/src/t_cputils_cp932.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/f32test/locl/CodepageUtils/src/t_cputils_cp932.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -1,3 +1,16 @@ +// Copyright (c) 2010 Nokia 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: // // Auto-generated by the FatConversiontable tool - Do not edit!!! // diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/f32test/smassstorage/scripts/usbinterop1.pl --- a/kerneltest/f32test/smassstorage/scripts/usbinterop1.pl Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/f32test/smassstorage/scripts/usbinterop1.pl Mon Jun 21 17:12:14 2010 +0300 @@ -279,8 +279,4 @@ TestExpectedResults: Read data from files should match with written. -=head1 COPYRIGHT - -Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. - =cut diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/f32test/smassstorage/scripts/usbinterop2.pl --- a/kerneltest/f32test/smassstorage/scripts/usbinterop2.pl Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/f32test/smassstorage/scripts/usbinterop2.pl Mon Jun 21 17:12:14 2010 +0300 @@ -163,8 +163,4 @@ with written. Sum of file size and free space should be close to drive size. -=head1 COPYRIGHT - -Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. - =cut diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/f32test/smassstorage/scripts/usbperformance.pl --- a/kerneltest/f32test/smassstorage/scripts/usbperformance.pl Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/f32test/smassstorage/scripts/usbperformance.pl Mon Jun 21 17:12:14 2010 +0300 @@ -174,8 +174,4 @@ free space for the file that is going to be created. The default size is 400 MB. -=head1 COPYRIGHT - - Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. - =cut diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/f32test/smassstorage/scripts/usbperformance_multifile.pl --- a/kerneltest/f32test/smassstorage/scripts/usbperformance_multifile.pl Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/f32test/smassstorage/scripts/usbperformance_multifile.pl Mon Jun 21 17:12:14 2010 +0300 @@ -186,8 +186,4 @@ free space for the file that is going to be created. The default size is 400 MB. -=head1 COPYRIGHT - -Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. - =cut diff -r bbf8bed59bcb -r 2bb754abd467 package_definition.xml --- a/package_definition.xml Wed Jun 09 11:10:19 2010 +0300 +++ b/package_definition.xml Mon Jun 21 17:12:14 2010 +0300 @@ -141,7 +141,7 @@ - + diff -r bbf8bed59bcb -r 2bb754abd467 userlibandfileserver/fileserver/group/release.txt --- a/userlibandfileserver/fileserver/group/release.txt Wed Jun 09 11:10:19 2010 +0300 +++ b/userlibandfileserver/fileserver/group/release.txt Mon Jun 21 17:12:14 2010 +0300 @@ -1,3 +1,22 @@ +Version 2.00.2062 +================= +(Made by vfebvre 07/06/2010) + +1. davegord + 1. ou1cimx1#414834 TB92 Occasional Loader crashes observed during T_WSD_TST_* tests + Crash caused by interrupt occurring during handling of SWI called from + SVC mode -- which is not supported. Fix is for Loader not to call RDebug + methods while executing in supervisor mode. + + +Version 2.00.2061 +================= +(Made by vfebvre 27/05/2010) + +1. vfebvre + 1. ou1cimx1#400807 Warnings reported by the Symbian Foundation license checker + + Version 2.00.2060 ================= (Made by vfebvre 25/05/2010) diff -r bbf8bed59bcb -r 2bb754abd467 userlibandfileserver/fileserver/inc/f32ver.h --- a/userlibandfileserver/fileserver/inc/f32ver.h Wed Jun 09 11:10:19 2010 +0300 +++ b/userlibandfileserver/fileserver/inc/f32ver.h Mon Jun 21 17:12:14 2010 +0300 @@ -58,6 +58,6 @@ @see TVersion */ -const TInt KF32BuildVersionNumber=2060; +const TInt KF32BuildVersionNumber=2062; // #endif diff -r bbf8bed59bcb -r 2bb754abd467 userlibandfileserver/fileserver/sfile/sf_lepoc.cpp --- a/userlibandfileserver/fileserver/sfile/sf_lepoc.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/userlibandfileserver/fileserver/sfile/sf_lepoc.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -287,9 +287,22 @@ } } -// A version that will work in user or supervisor mode -void MyPrintf(const char* aFmt, ...) +/** +It would be nice to be able to print debug information from the various functions +supervisor-mode functions below. Unfortunately, we can't call RDebug::Printf() or +any of its relatives in supervisor mode, and of course we can't call the equivalent +kernel functions even when we're already in supervisor mode, because the entry +points aren't visible. + +So this function just wraps and guards the call to RDebug, so we won't call it +in SVC mode. The outcome is that trace messages are only generated if using the +flexible memory model, where the code doesn't actually run in SVC mode anyway. +*/ +void svPrintf(const char* aFmt, ...) { + if (gExecutesInSupervisorMode) + return; + VA_LIST list; VA_START(list, aFmt); TPtrC8 fmt((const TText8*)aFmt); @@ -379,15 +392,15 @@ E32Image& exporter = *(E32Image*)aPtr; // Dump everything potentially useful that we know about the exporter ... - __LDRTRACE(MyPrintf("RelocateExports: paged? %d, iRomImageHeader@%08x, iHeader@%08x", + __LDRTRACE(svPrintf("RelocateExports: paged? %d, iRomImageHeader@%08x, iHeader@%08x", exporter.iUseCodePaging, exporter.iRomImageHeader, exporter.iHeader)); - __LDRTRACE(MyPrintf(" iCodeLoadAddress %08x, iCodeRunAddress %08x, iCodeSize %x iTextSize %x", + __LDRTRACE(svPrintf(" iCodeLoadAddress %08x, iCodeRunAddress %08x, iCodeSize %x iTextSize %x", exporter.iCodeLoadAddress, exporter.iCodeRunAddress, exporter.iCodeSize, exporter.iTextSize)) - __LDRTRACE(MyPrintf(" iDataLoadAddress %08x, iDataRunAddress %08x, iDataSize %x iBssSize %x iTotalDataSize %x", + __LDRTRACE(svPrintf(" iDataLoadAddress %08x, iDataRunAddress %08x, iDataSize %x iBssSize %x iTotalDataSize %x", exporter.iDataLoadAddress, exporter.iDataRunAddress, exporter.iDataSize, exporter.iBssSize, exporter.iTotalDataSize)); - __LDRTRACE(MyPrintf(" iCodeDelta, %x iDataDelta %x, iExportDirEntryDelta %x", + __LDRTRACE(svPrintf(" iCodeDelta, %x iDataDelta %x, iExportDirEntryDelta %x", exporter.iCodeDelta, exporter.iDataDelta, exporter.iExportDirEntryDelta)); // It turns out that very little of the exporter info is useful! For @@ -429,7 +442,7 @@ newValue = relocAddr; // unknown - just leave it alone *destExport++ = newValue; - __LDRTRACE(MyPrintf("RelocateExports: export %d %08x => %08x %c", + __LDRTRACE(svPrintf("RelocateExports: export %d %08x => %08x %c", exporter.iExportDirCount-i, relocAddr, newValue, (relocAddr >= codeStart && relocAddr < codeFinish) ? 'C' : (relocAddr >= dataStart && relocAddr < dataFinish) ? 'D' : 'X')); @@ -471,39 +484,39 @@ E32Image& exporter = *info.iExporter; #ifdef _DEBUG - __LDRTRACE(MyPrintf(">svFixupImportAddresses %d imports, code@%08x, fixup@%08x exporter@%08x", + __LDRTRACE(svPrintf(">svFixupImportAddresses %d imports, code@%08x, fixup@%08x exporter@%08x", info.iNumImports, info.iCodeLoadAddress, info.iFixup64, info.iExporter)); // Dump everything potentially useful that we know about the exporter ... - __LDRTRACE(MyPrintf("%S: paged? %d, iRomImageHeader@%08x, iHeader@%08x", + __LDRTRACE(svPrintf("%S: paged? %d, iRomImageHeader@%08x, iHeader@%08x", &exporter.iFileName, exporter.iUseCodePaging, exporter.iRomImageHeader, exporter.iHeader)); - __LDRTRACE(MyPrintf("iCodeLoadAddress %08x, iCodeRunAddress %08x, iCodeSize %x iTextSize %x", + __LDRTRACE(svPrintf("iCodeLoadAddress %08x, iCodeRunAddress %08x, iCodeSize %x iTextSize %x", exporter.iCodeLoadAddress, exporter.iCodeRunAddress, exporter.iCodeSize, exporter.iTextSize)) - __LDRTRACE(MyPrintf("iDataLoadAddress %08x, iDataRunAddress %08x, iDataSize %x iBssSize %x iTotalDataSize %x", + __LDRTRACE(svPrintf("iDataLoadAddress %08x, iDataRunAddress %08x, iDataSize %x iBssSize %x iTotalDataSize %x", exporter.iDataLoadAddress, exporter.iDataRunAddress, exporter.iDataSize, exporter.iBssSize, exporter.iTotalDataSize)); - __LDRTRACE(MyPrintf("iCodeDelta, %x iDataDelta %x, iExportDirEntryDelta %x", + __LDRTRACE(svPrintf("iCodeDelta, %x iDataDelta %x, iExportDirEntryDelta %x", exporter.iCodeDelta, exporter.iDataDelta, exporter.iExportDirEntryDelta)); if (exporter.iRomImageHeader) { const TRomImageHeader& rh = *exporter.iRomImageHeader; - __LDRTRACE(MyPrintf("ROM: iCodeAddress %08x, iCodeSize %x, iTextSize %x", + __LDRTRACE(svPrintf("ROM: iCodeAddress %08x, iCodeSize %x, iTextSize %x", rh.iCodeAddress, rh.iCodeSize, rh.iTextSize)); - __LDRTRACE(MyPrintf("ROM: iDataAddress %08x, iDataSize %x, iBssSize %x", + __LDRTRACE(svPrintf("ROM: iDataAddress %08x, iDataSize %x, iBssSize %x", rh.iDataAddress, rh.iDataSize, rh.iBssSize)); - __LDRTRACE(MyPrintf("ROM: iDataBssLinearBase %08x, iTotalDataSize %x", + __LDRTRACE(svPrintf("ROM: iDataBssLinearBase %08x, iTotalDataSize %x", rh.iDataBssLinearBase, rh.iTotalDataSize)); } if (exporter.iHeader) { const E32ImageHeader& ih = *exporter.iHeader; - __LDRTRACE(MyPrintf("HEAD: iCodeBase %08x, iCodeSize %x, iTextSize %x", + __LDRTRACE(svPrintf("HEAD: iCodeBase %08x, iCodeSize %x, iTextSize %x", ih.iCodeBase, ih.iCodeSize, ih.iTextSize)); - __LDRTRACE(MyPrintf("HEAD: iDataBase %08x, iDataSize %x, iBssSize %x", + __LDRTRACE(svPrintf("HEAD: iDataBase %08x, iDataSize %x, iBssSize %x", ih.iDataBase, ih.iDataSize, ih.iBssSize)); } #endif // _DEBUG @@ -538,7 +551,7 @@ newValue = expAddr; } - __LDRTRACE(MyPrintf("svFixupImportAddresses: import[%d]@%08x is export[%d] == %08x", + __LDRTRACE(svPrintf("svFixupImportAddresses: import[%d]@%08x is export[%d] == %08x", iat - info.iIat, iat, ordinal, newValue)); // In non-paged code, we can simply replace the ordinals in the IAT with the @@ -573,39 +586,39 @@ E32Image& exporter = *info.iExporter; #ifdef _DEBUG - __LDRTRACE(MyPrintf(">svElfDerivedFixupImportAddresses %d imports, code@%08x, fixup@%08x exporter@%08x", + __LDRTRACE(svPrintf(">svElfDerivedFixupImportAddresses %d imports, code@%08x, fixup@%08x exporter@%08x", info.iNumImports, info.iCodeLoadAddress, info.iFixup64, info.iExporter)); // Dump everything potentially useful that we know about the exporter ... - __LDRTRACE(MyPrintf("%S: paged? %d, iRomImageHeader@%08x, iHeader@%08x", + __LDRTRACE(svPrintf("%S: paged? %d, iRomImageHeader@%08x, iHeader@%08x", &exporter.iFileName, exporter.iUseCodePaging, exporter.iRomImageHeader, exporter.iHeader)); - __LDRTRACE(MyPrintf("iCodeLoadAddress %08x, iCodeRunAddress %08x, iCodeSize %x iTextSize %x", + __LDRTRACE(svPrintf("iCodeLoadAddress %08x, iCodeRunAddress %08x, iCodeSize %x iTextSize %x", exporter.iCodeLoadAddress, exporter.iCodeRunAddress, exporter.iCodeSize, exporter.iTextSize)) - __LDRTRACE(MyPrintf("iDataLoadAddress %08x, iDataRunAddress %08x, iDataSize %x iBssSize %x iTotalDataSize %x", + __LDRTRACE(svPrintf("iDataLoadAddress %08x, iDataRunAddress %08x, iDataSize %x iBssSize %x iTotalDataSize %x", exporter.iDataLoadAddress, exporter.iDataRunAddress, exporter.iDataSize, exporter.iBssSize, exporter.iTotalDataSize)); - __LDRTRACE(MyPrintf("iCodeDelta, %x iDataDelta %x, iExportDirEntryDelta %x", + __LDRTRACE(svPrintf("iCodeDelta, %x iDataDelta %x, iExportDirEntryDelta %x", exporter.iCodeDelta, exporter.iDataDelta, exporter.iExportDirEntryDelta)); if (exporter.iRomImageHeader) { const TRomImageHeader& rh = *exporter.iRomImageHeader; - __LDRTRACE(MyPrintf("ROM: iCodeAddress %08x, iCodeSize %x, iTextSize %x", + __LDRTRACE(svPrintf("ROM: iCodeAddress %08x, iCodeSize %x, iTextSize %x", rh.iCodeAddress, rh.iCodeSize, rh.iTextSize)); - __LDRTRACE(MyPrintf("ROM: iDataAddress %08x, iDataSize %x, iBssSize %x", + __LDRTRACE(svPrintf("ROM: iDataAddress %08x, iDataSize %x, iBssSize %x", rh.iDataAddress, rh.iDataSize, rh.iBssSize)); - __LDRTRACE(MyPrintf("ROM: iDataBssLinearBase %08x, iTotalDataSize %x", + __LDRTRACE(svPrintf("ROM: iDataBssLinearBase %08x, iTotalDataSize %x", rh.iDataBssLinearBase, rh.iTotalDataSize)); } if (exporter.iHeader) { const E32ImageHeader& ih = *exporter.iHeader; - __LDRTRACE(MyPrintf("HEAD: iCodeBase %08x, iCodeSize %x, iTextSize %x", + __LDRTRACE(svPrintf("HEAD: iCodeBase %08x, iCodeSize %x, iTextSize %x", ih.iCodeBase, ih.iCodeSize, ih.iTextSize)); - __LDRTRACE(MyPrintf("HEAD: iDataBase %08x, iDataSize %x, iBssSize %x", + __LDRTRACE(svPrintf("HEAD: iDataBase %08x, iDataSize %x, iBssSize %x", ih.iDataBase, ih.iDataSize, ih.iBssSize)); } #endif // _DEBUG @@ -700,7 +713,7 @@ newValue = expAddr + sectionDelta + adjustment; } - __LDRTRACE(MyPrintf("svElfDerivedFixupImportAddresses: import[%d] (%08x:%08x) is export[%d] %08x+%08x => %08x", + __LDRTRACE(svPrintf("svElfDerivedFixupImportAddresses: import[%d] (%08x:%08x) is export[%d] %08x+%08x => %08x", iol - info.iImportOffsetList, codePtr, importInfo, ordinal, expAddr, adjustment, newValue)); // In non-paged code, we can simply replace the ordinals in the IAT with the @@ -3248,30 +3261,6 @@ } -/** -This function is defined because RArray does not natively support -sorting 64-bit integers. - -It is used by FixupDlls to order the import fixup locations in the image -so they can be organized by page. - -@param aLeft 64-bit unsigned integer to compare against aRight. -@param aRight 64-bit unsigned integer to compare against aLeft. -@return -1 if aLeft < aRight; 0 if aLeft == aRight; and - +1 if aLeft > aRight. This conforms to the behavior - which is expected from a function used by TLinearOrder. -*/ -static TInt Uint64LinearOrderFunc(const TUint64& aLeft, const TUint64& aRight) - { - if (aLeft < aRight) - return -1; - else if (aLeft > aRight) - return 1; - else - return 0; - } - - TUint64* E32Image::ExpandFixups(TInt aNumFixups) { __IF_DEBUG(Printf("ExpandFixups,%d+%d", iFixupCount,aNumFixups)); @@ -3315,8 +3304,10 @@ // sort the array in address order, to organize by page RArray fixup64ToSort(sizeof(TUint64), iFixups, iFixupCount); - // SortUnsigned doesn't work on TUint64 - fixup64ToSort.Sort(TLinearOrder(Uint64LinearOrderFunc)); + + // address is in high word of entry, offset 4 + fixup64ToSort.SetKeyOffset(4); + fixup64ToSort.SortUnsigned(); // now have
pairs, organize into pages. // Each page is stored as fXXX YYYY ZZZZ where YYYY ZZZZ is written