author | Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> |
Tue, 26 Jan 2010 13:13:38 +0200 | |
changeset 39 | 5d2844f35677 |
parent 36 | 538db54a451d |
child 42 | bef462d20cc3 |
child 52 | 2d65c2f76d7b |
--- a/bsptemplate/asspandvariant/template_variant/camerasc/logoyuv2.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/bsptemplate/asspandvariant/template_variant/camerasc/logoyuv2.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -1,9 +1,9 @@ // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available -// under the terms of the License "Symbian Foundation License v1.0" +// under the terms of the License "Eclipse Public License v1.0" // which accompanies this distribution, and is available -// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// at the URL "http://www.eclipse.org/legal/epl-v10.html". // // Initial Contributors: // Nokia Corporation - initial contribution.
--- a/kernel/eka/bmarm/ekernsmp.def Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/bmarm/ekernsmp.def Tue Jan 26 13:13:38 2010 +0200 @@ -1037,4 +1037,8 @@ Repeats__C9TRawEvent @ 1036 NONAME R3UNUSED ; TRawEvent::Repeats(void) const SetRepeat__9TRawEventQ29TRawEvent5TTypeii @ 1037 NONAME ; TRawEvent::SetRepeat(TRawEvent::TType, int, int) MakeHandleAndOpen__4KernP7DThreadP7DObject10TOwnerType @ 1038 NONAME R3UNUSED ; Kern::MakeHandleAndOpen(DThread *, DObject *, TOwnerType) + CreateKernelMapObject__4KernRP16TKernelMapObjectUi @ 1039 NONAME R3UNUSED ; Kern::CreateKernelMapObject(TKernelMapObject *&, unsigned int) + DestroyKernelMapObject__4KernRP16TKernelMapObject @ 1040 NONAME R3UNUSED ; Kern::DestroyKernelMapObject(TKernelMapObject *&) + MapAndPinMemory__4KernP16TKernelMapObjectP7DThreadUlUiUiRUlPUl @ 1041 NONAME ; Kern::MapAndPinMemory(TKernelMapObject *, DThread *, unsigned long, unsigned int, unsigned int, unsigned long &, unsigned long *) + UnmapAndUnpinMemory__4KernP16TKernelMapObject @ 1042 NONAME R3UNUSED ; Kern::UnmapAndUnpinMemory(TKernelMapObject *)
--- a/kernel/eka/bmarm/ekernu.def Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/bmarm/ekernu.def Tue Jan 26 13:13:38 2010 +0200 @@ -1033,4 +1033,8 @@ Repeats__C9TRawEvent @ 1032 NONAME R3UNUSED ; TRawEvent::Repeats(void) const SetRepeat__9TRawEventQ29TRawEvent5TTypeii @ 1033 NONAME ; TRawEvent::SetRepeat(TRawEvent::TType, int, int) MakeHandleAndOpen__4KernP7DThreadP7DObject10TOwnerType @ 1034 NONAME R3UNUSED ; Kern::MakeHandleAndOpen(DThread *, DObject *, TOwnerType) + CreateKernelMapObject__4KernRP16TKernelMapObjectUi @ 1035 NONAME R3UNUSED ; Kern::CreateKernelMapObject(TKernelMapObject *&, unsigned int) + DestroyKernelMapObject__4KernRP16TKernelMapObject @ 1036 NONAME R3UNUSED ; Kern::DestroyKernelMapObject(TKernelMapObject *&) + MapAndPinMemory__4KernP16TKernelMapObjectP7DThreadUlUiUiRUlPUl @ 1037 NONAME ; Kern::MapAndPinMemory(TKernelMapObject *, DThread *, unsigned long, unsigned int, unsigned int, unsigned long &, unsigned long *) + UnmapAndUnpinMemory__4KernP16TKernelMapObject @ 1038 NONAME R3UNUSED ; Kern::UnmapAndUnpinMemory(TKernelMapObject *)
--- a/kernel/eka/bwins/ekernu.def Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/bwins/ekernu.def Tue Jan 26 13:13:38 2010 +0200 @@ -921,4 +921,8 @@ ?Repeats@TRawEvent@@QBEHXZ @ 920 NONAME ; int TRawEvent::Repeats(void) const ?SetRepeat@TRawEvent@@QAEXW4TType@1@HH@Z @ 921 NONAME ; void TRawEvent::SetRepeat(enum TRawEvent::TType, int, int) ?MakeHandleAndOpen@Kern@@SAHPAVDThread@@PAVDObject@@W4TOwnerType@@@Z @ 922 NONAME ; public: static int __cdecl Kern::MakeHandleAndOpen(class DThread *,class DObject *,enum TOwnerType) + ?UnmapAndUnpinMemory@Kern@@SAXPAVTKernelMapObject@@@Z @ 923 NONAME ; void Kern::UnmapAndUnpinMemory(class TKernelMapObject *) + ?MapAndPinMemory@Kern@@SAHPAVTKernelMapObject@@PAVDThread@@KIIAAKPAK@Z @ 924 NONAME ; int Kern::MapAndPinMemory(class TKernelMapObject *, class DThread *, unsigned long, unsigned int, unsigned int, unsigned long &, unsigned long *) + ?CreateKernelMapObject@Kern@@SAHAAPAVTKernelMapObject@@I@Z @ 925 NONAME ; int Kern::CreateKernelMapObject(class TKernelMapObject * &, unsigned int) + ?DestroyKernelMapObject@Kern@@SAXAAPAVTKernelMapObject@@@Z @ 926 NONAME ; void Kern::DestroyKernelMapObject(class TKernelMapObject * &)
--- a/kernel/eka/bx86/ekernsmp.def Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/bx86/ekernsmp.def Tue Jan 26 13:13:38 2010 +0200 @@ -995,4 +995,8 @@ ?Repeats@TRawEvent@@QBEHXZ @ 994 NONAME ; int TRawEvent::Repeats(void) const ?SetRepeat@TRawEvent@@QAEXW4TType@1@HH@Z @ 995 NONAME ; void TRawEvent::SetRepeat(enum TRawEvent::TType, int, int) ?MakeHandleAndOpen@Kern@@SAHPAVDThread@@PAVDObject@@W4TOwnerType@@@Z @ 996 NONAME ; public: static int __cdecl Kern::MakeHandleAndOpen(class DThread *,class DObject *,enum TOwnerType) + ?CreateKernelMapObject@Kern@@SAHAAPAVTKernelMapObject@@I@Z @ 997 NONAME ; public: static int __cdecl Kern::CreateKernelMapObject(class TKernelMapObject * &,unsigned int) + ?DestroyKernelMapObject@Kern@@SAXAAPAVTKernelMapObject@@@Z @ 998 NONAME ; public: static void __cdecl Kern::DestroyKernelMapObject(class TKernelMapObject * &) + ?MapAndPinMemory@Kern@@SAHPAVTKernelMapObject@@PAVDThread@@KIIAAKPAK@Z @ 999 NONAME ; public: static int __cdecl Kern::MapAndPinMemory(class TKernelMapObject *,class DThread *,unsigned long,unsigned int,unsigned int,unsigned long &,unsigned long *) + ?UnmapAndUnpinMemory@Kern@@SAXPAVTKernelMapObject@@@Z @ 1000 NONAME ; public: static void __cdecl Kern::UnmapAndUnpinMemory(class TKernelMapObject *)
--- a/kernel/eka/bx86/ekernu.def Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/bx86/ekernu.def Tue Jan 26 13:13:38 2010 +0200 @@ -939,4 +939,8 @@ ?Repeats@TRawEvent@@QBEHXZ @ 938 NONAME ; int TRawEvent::Repeats(void) const ?SetRepeat@TRawEvent@@QAEXW4TType@1@HH@Z @ 939 NONAME ; void TRawEvent::SetRepeat(enum TRawEvent::TType, int, int) ?MakeHandleAndOpen@Kern@@SAHPAVDThread@@PAVDObject@@W4TOwnerType@@@Z @ 940 NONAME ; public: static int __cdecl Kern::MakeHandleAndOpen(class DThread *,class DObject *,enum TOwnerType) + ?CreateKernelMapObject@Kern@@SAHAAPAVTKernelMapObject@@I@Z @ 941 NONAME ; public: static int __cdecl Kern::CreateKernelMapObject(class TKernelMapObject * &,unsigned int) + ?DestroyKernelMapObject@Kern@@SAXAAPAVTKernelMapObject@@@Z @ 942 NONAME ; public: static void __cdecl Kern::DestroyKernelMapObject(class TKernelMapObject * &) + ?MapAndPinMemory@Kern@@SAHPAVTKernelMapObject@@PAVDThread@@KIIAAKPAK@Z @ 943 NONAME ; public: static int __cdecl Kern::MapAndPinMemory(class TKernelMapObject *,class DThread *,unsigned long,unsigned int,unsigned int,unsigned long &,unsigned long *) + ?UnmapAndUnpinMemory@Kern@@SAXPAVTKernelMapObject@@@Z @ 944 NONAME ; public: static void __cdecl Kern::UnmapAndUnpinMemory(class TKernelMapObject *)
--- a/kernel/eka/bx86gcc/ekernsmp.def Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/bx86gcc/ekernsmp.def Tue Jan 26 13:13:38 2010 +0200 @@ -1083,4 +1083,8 @@ _ZN9TRawEvent9SetRepeatENS_5TTypeEii @ 1082 NONAME _ZNK9TRawEvent7RepeatsEv @ 1083 NONAME _ZN4Kern17MakeHandleAndOpenEP7DThreadP7DObject10TOwnerType @ 1084 NONAME + _ZN4Kern15MapAndPinMemoryEP16TKernelMapObjectP7DThreadmjjRmPm @ 1085 NONAME + _ZN4Kern19UnmapAndUnpinMemoryEP16TKernelMapObject @ 1086 NONAME + _ZN4Kern21CreateKernelMapObjectERP16TKernelMapObjectj @ 1087 NONAME + _ZN4Kern22DestroyKernelMapObjectERP16TKernelMapObject @ 1088 NONAME
--- a/kernel/eka/bx86gcc/ekernu.def Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/bx86gcc/ekernu.def Tue Jan 26 13:13:38 2010 +0200 @@ -1022,4 +1022,8 @@ _ZN9TRawEvent9SetRepeatENS_5TTypeEii @ 1021 NONAME _ZNK9TRawEvent7RepeatsEv @ 1022 NONAME _ZN4Kern17MakeHandleAndOpenEP7DThreadP7DObject10TOwnerType @ 1023 NONAME + _ZN4Kern15MapAndPinMemoryEP16TKernelMapObjectP7DThreadmjjRmPm @ 1024 NONAME + _ZN4Kern19UnmapAndUnpinMemoryEP16TKernelMapObject @ 1025 NONAME + _ZN4Kern21CreateKernelMapObjectERP16TKernelMapObjectj @ 1026 NONAME + _ZN4Kern22DestroyKernelMapObjectERP16TKernelMapObject @ 1027 NONAME
--- a/kernel/eka/drivers/hcr/hcr_api.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/hcr/hcr_api.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -46,6 +46,8 @@ if (HCRNotReady) HCR_TRACE_RETURN(KErrNotReady); + __NK_ASSERT_DEBUG((aType & KMaskWordTypes) != 0); + TSettingRef sref(0,0); TInt err = 0; err = HCRSingleton->FindSetting(aId, aType, sref); @@ -53,8 +55,7 @@ HCR_TRACE_RETURN(err); err = sref.iRep->GetValue(sref, aValue); - if (err != KErrNone) - HCR_TRACE_RETURN(err); + __NK_ASSERT_DEBUG(err == KErrNone); return KErrNone; } @@ -76,8 +77,7 @@ HCR_TRACE_RETURN(err); err = sref.iRep->GetLargeValue(sref, aValue); - if (err != KErrNone) - HCR_TRACE_RETURN(err); + __NK_ASSERT_DEBUG(err == KErrNone); return KErrNone; } @@ -101,8 +101,7 @@ UValueLarge value; err = sref.iRep->GetLargeValue(sref, value); - if (err != KErrNone) - HCR_TRACE_RETURN(err); + __NK_ASSERT_DEBUG(err == KErrNone); TInt len = sref.iRep->GetLength(sref); if (len > aValue.MaxSize()) @@ -134,9 +133,8 @@ UValueLarge value; err = sref.iRep->GetLargeValue(sref, value); - if (err != KErrNone) - HCR_TRACE_RETURN(err); - + __NK_ASSERT_DEBUG(err == KErrNone); + aLen = sref.iRep->GetLength(sref); if (aLen > aMaxLen) HCR_TRACE_RETURN(KErrTooBig); @@ -492,8 +490,7 @@ //All de-allocations are done, leave a critical section NKern::ThreadLeaveCS(); - if(err < KErrNone) - HCR_TRACE_RETURN(err); + __NK_ASSERT_DEBUG(err >= KErrNone); return err; @@ -516,18 +513,15 @@ TSettingRef sref(0,0); TInt err = HCRSingleton->FindSettingWithType(aId, aType, sref); - if(err == KErrNone) - { - aLen = sref.iRep->GetLength(sref); - } - else if(err == KErrNotFound) + __NK_ASSERT_DEBUG(err == KErrNone || err == KErrNotFound); + + if(err == KErrNotFound) { aLen = 0; HCR_TRACE_RETURN(KErrNotFound); } - else - HCR_TRACE_RETURN(err); + aLen = sref.iRep->GetLength(sref); return KErrNone; #else @@ -559,7 +553,6 @@ #endif // MAKE_DEF_FILE } - EXPORT_C TInt HCR::FindSettings(TCategoryUid aCat, TInt aMaxNum, TElementId aElIds[], TSettingType aTypes[], TUint16 aLens[]) {
--- a/kernel/eka/drivers/hcr/hcr_debug.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/hcr/hcr_debug.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -11,7 +11,7 @@ // Contributors: // // Description: -// Helper functions for debug +// Helper functions for HCR debug #include <e32err.h> #include <e32const.h> @@ -23,16 +23,19 @@ #include "hcr_debug.h" +#ifdef HCR_TRACE /** -Make a classic hexadecimal dump of the content of an memory region. +Make a classic hexadecimal dump of the content of an memory region. Do not +call directly but used the macros: HCR_HEX_DUMP_ABS(), HCR_HEX_DUMP_REL() @param aStartAddress Pointer of the first byte of the region - aLength Size of the region - aAbsolute If it is TRUE then it displays absolute address where the aStartAddress points - If it is FALSE then it displays reltive address from aStartAddress + aLength Size of the region + aAbsolute If it is TRUE then it displays absolute address where the aStartAddress points + If it is FALSE then it displays reltive address from aStartAddress @pre Call from thread context (neither NULL, DFC0, DFC1 threads) */ + void HexDump(TUint8* aStartAddress, TUint32 aLength, TBool aAbsolute) { TUint32 nIndex; @@ -96,3 +99,4 @@ Kern::Printf("%S\n", &printBuf); } +#endif // HCR_TRACE
--- a/kernel/eka/drivers/hcr/hcr_debug.h Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/hcr/hcr_debug.h Tue Jan 26 13:13:38 2010 +0200 @@ -26,7 +26,7 @@ #include <kernel/kernel.h> // -// MACROs for log statements in code. +// MACROs for log statements in code // #ifdef _DEBUG @@ -43,7 +43,7 @@ // -// MACROs for trace statements in code. +// MACROs for trace statements in code // #ifdef HCR_TRACE @@ -62,26 +62,6 @@ #define HCR_HEX_DUMP_ABS(_address, _length) HexDump((_address), (_length)); //Hex dump with absolute address #define HCR_HEX_DUMP_REL(_address, _length) HexDump((_address), (_length), EFalse); //Hex dump with relative (from) address - -#else - -#define HCR_TRACE0(_text) __KTRACE_OPT(KHCR, Kern::Printf((_text))) -#define HCR_TRACE1(_text, _a1) __KTRACE_OPT(KHCR, Kern::Printf((_text), (_a1))) -#define HCR_TRACE2(_text, _a1, _a2) __KTRACE_OPT(KHCR, Kern::Printf((_text), (_a1), (_a2))) -#define HCR_TRACE3(_text, _a1, _a2, _a3) __KTRACE_OPT(KHCR, Kern::Printf((_text), (_a1), (_a2), (_a3))) -#define HCR_TRACE4(_text, _a1, _a2, _a3, _a4) __KTRACE_OPT(KHCR, Kern::Printf((_text), (_a1), (_a2), (_a3), (_a4))) -#define HCR_TRACE5(_text, _a1, _a2, _a3, _a4, _a5) __KTRACE_OPT(KHCR, Kern::Printf((_text), (_a1), (_a2), (_a3), (_a4), (_a5))) -#define HCR_TRACE6(_text, _a1, _a2, _a3, _a4, _a5, _a6) __KTRACE_OPT(KHCR, Kern::Printf((_text), (_a1), (_a2), (_a3), (_a4), (_a5), (_a6))) -#define HCR_TRACE_RETURN(_r1) { __KTRACE_OPT(KHCR, Kern::Printf("!-- Function exit return(%d) (%s:%d)", (_r1), __FILE__, __LINE__)); return (_r1);} -#define HCR_TRACEMSG_RETURN(_s1, _r1) { __KTRACE_OPT(KHCR, Kern::Printf("!-- "_s1" (%d)", (_r1))); return (_r1);} -#define HCR_FUNC(_text) - -#define HCR_HEX_DUMP_ABS(_address, _length) -#define HCR_HEX_DUMP_REL(_address, _length) - -#endif - - class TEntryExit { public: @@ -107,5 +87,24 @@ void HexDump(TUint8* aStartAddress, TUint32 aLength, TBool aAbsolute = ETrue); +#else + +#define HCR_TRACE0(_text) __KTRACE_OPT(KHCR, Kern::Printf((_text))) +#define HCR_TRACE1(_text, _a1) __KTRACE_OPT(KHCR, Kern::Printf((_text), (_a1))) +#define HCR_TRACE2(_text, _a1, _a2) __KTRACE_OPT(KHCR, Kern::Printf((_text), (_a1), (_a2))) +#define HCR_TRACE3(_text, _a1, _a2, _a3) __KTRACE_OPT(KHCR, Kern::Printf((_text), (_a1), (_a2), (_a3))) +#define HCR_TRACE4(_text, _a1, _a2, _a3, _a4) __KTRACE_OPT(KHCR, Kern::Printf((_text), (_a1), (_a2), (_a3), (_a4))) +#define HCR_TRACE5(_text, _a1, _a2, _a3, _a4, _a5) __KTRACE_OPT(KHCR, Kern::Printf((_text), (_a1), (_a2), (_a3), (_a4), (_a5))) +#define HCR_TRACE6(_text, _a1, _a2, _a3, _a4, _a5, _a6) __KTRACE_OPT(KHCR, Kern::Printf((_text), (_a1), (_a2), (_a3), (_a4), (_a5), (_a6))) +#define HCR_TRACE_RETURN(_r1) { __KTRACE_OPT(KHCR, Kern::Printf("!-- Function exit return(%d) (%s:%d)", (_r1), __FILE__, __LINE__)); return (_r1);} +#define HCR_TRACEMSG_RETURN(_s1, _r1) { __KTRACE_OPT(KHCR, Kern::Printf("!-- "_s1" (%d)", (_r1))); return (_r1);} +#define HCR_FUNC(_text) + +#define HCR_HEX_DUMP_ABS(_address, _length) +#define HCR_HEX_DUMP_REL(_address, _length) + +#endif + + #endif // HCR_DEBUG_H
--- a/kernel/eka/drivers/hcr/hcr_pil.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/hcr/hcr_pil.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -208,6 +208,27 @@ HCR::HCRInternal::~HCRInternal() { HCR_FUNC("~HCRInternal"); + + if (iVariant) + { + delete iVariant; + iVariant =0; + } + if (iVariantStore) + { + delete iVariantStore; + iVariantStore =0; + } + if (iCoreImgStore) + { + delete iCoreImgStore; + iCoreImgStore =0; + } + if (iOverrideStore) + { + delete iOverrideStore; + iOverrideStore =0; + } } TUint32 HCR::HCRInternal::GetStatus() @@ -396,7 +417,7 @@ TSettingRef& aSetting) { HCR_FUNC("HCRInternal::FindSetting"); - TInt err = 0; + TInt err = KErrNone; TBool found = EFalse; HCR_TRACE3("--- Repository state: %x, %x, %x", iOverrideStore, iCoreImgStore, iVariantStore); @@ -404,29 +425,28 @@ if (iOverrideStore && ((err = iOverrideStore->FindSetting(aId, aSetting)) == KErrNone)) found = ETrue; - if ((err != KErrNone) && (err != KErrNotFound)) - HCR_TRACE_RETURN(err); + __NK_ASSERT_DEBUG(err == KErrNotFound || err == KErrNone); if (!found && iCoreImgStore && ((err = iCoreImgStore->FindSetting(aId, aSetting)) == KErrNone)) found = ETrue; - if ((err != KErrNone) && (err != KErrNotFound)) - HCR_TRACE_RETURN(err); + __NK_ASSERT_DEBUG(err == KErrNotFound || err == KErrNone); if (!found && iVariantStore && ((err = iVariantStore->FindSetting(aId, aSetting)) == KErrNone)) found = ETrue; - - if ((err != KErrNone) && (err != KErrNotFound)) - HCR_TRACE_RETURN(err); + __NK_ASSERT_DEBUG(err == KErrNotFound || err == KErrNone); HCR_TRACE3("--- Search results: %d, %d, %x", found, err, aSetting.iSet); - if (!found || (aSetting.iSet == 0)) + if (!found) HCR_TRACE_RETURN(KErrNotFound); + // aSetting should now point to the found setting + __NK_ASSERT_DEBUG(aSetting.iSet != 0); + // Setting found at this point in the function // @@ -436,7 +456,7 @@ HCR_TRACE3("--- Setting found! ID: (%d,%d) Type: %d", aId.iCat, aId.iKey, type); - return KErrNone; + return err; } @@ -444,7 +464,7 @@ TSettingRef& aSetting) { HCR_FUNC("HCRInternal::FindSettingWithType"); - TInt err = 0; + TInt err = KErrNone; TBool found = EFalse; HCR_TRACE3("--- Repository state: %x, %x, %x", iOverrideStore, iCoreImgStore, iVariantStore); @@ -452,32 +472,31 @@ if (iOverrideStore && ((err = iOverrideStore->FindSetting(aId, aSetting)) == KErrNone)) found = ETrue; - if ((err != KErrNone) && (err != KErrNotFound)) - HCR_TRACE_RETURN(err); - + __NK_ASSERT_DEBUG(err == KErrNotFound || err == KErrNone); + if (!found && iCoreImgStore && ((err = iCoreImgStore->FindSetting(aId, aSetting)) == KErrNone)) found = ETrue; - if ((err != KErrNone) && (err != KErrNotFound)) - HCR_TRACE_RETURN(err); + __NK_ASSERT_DEBUG(err == KErrNotFound || err == KErrNone); if (!found && iVariantStore && ((err = iVariantStore->FindSetting(aId, aSetting)) == KErrNone)) found = ETrue; - - if ((err != KErrNone) && (err != KErrNotFound)) - HCR_TRACE_RETURN(err); + __NK_ASSERT_DEBUG(err == KErrNotFound || err == KErrNone); HCR_TRACE3("--- Search results: %d, %d, %x", found, err, aSetting.iSet); - if (!found || (aSetting.iSet == 0)) + if (!found) { aType = ETypeUndefined; HCR_TRACE_RETURN(KErrNotFound); } + // aSetting should now point to the found setting + __NK_ASSERT_DEBUG(aSetting.iSet != 0); + // Setting found at this point in the function // @@ -485,7 +504,7 @@ HCR_TRACE3("--- Setting found! ID: (%d,%d) Type: %d", aId.iCat, aId.iKey, aType); - return KErrNone; + return err; } @@ -926,17 +945,19 @@ //tion of this element in lowIndex, to narrow next search procedure lowIndex = elementPos; } - else if(err == KErrNotFound) + else //err == KErrNotFound { //if element is not found then it means it's not redefined in the //Override store and this element must be counted in the total number //of elemnts in all stores cCount ++; + + //FindSetting can only return KErrNotFound, let's assert + //we've only got KErrNotFound + __NK_ASSERT_DEBUG(err == KErrNotFound); + } - else - { - return err; - } + } } else @@ -944,13 +965,6 @@ cCount = cLength; } - - - //Check if the Variant store is present if it's not then just return the - //result - if(!iVariantStore) - return (oCount + cCount); - } //First and last element index within giving category in the Variant store @@ -974,10 +988,6 @@ //Calculate the number of elements within category, in CoreImg store vLength = vHighIndex - vLowIndex + 1; - if(oCount == 0 && cCount == 0) - { - return vLength; - } if(oCount > 0 || cCount >0) { @@ -1022,15 +1032,16 @@ lowIndex = elementPos; isRedefined = ETrue; } - else if(err == KErrNotFound) + else //err == KErrNotFound { //the element is not presented in the Override store //nothing to do here + + //FindSetting can only return KErrNotFound, let's assert + //we've only got KErrNotFound + __NK_ASSERT_DEBUG(err == KErrNotFound); } - else - { - return err; - } + } @@ -1049,15 +1060,16 @@ lowIndex2 = elementPos2; isRedefined = ETrue; } - else if(err == KErrNotFound) + else //err == KErrNotFound { //the element is not presented in the Override store - //nothing to do here + //nothing to do here + + //FindSetting can only return KErrNotFound, let's assert + //we've only got KErrNotFound + __NK_ASSERT_DEBUG(err == KErrNotFound); } - else - { - return err; - } + } @@ -1093,9 +1105,7 @@ //Error container TInt err = KErrNone; - - //Total number of found elements - TInt numFound = 0; + //Number of found elements in the Override store TInt oNumFound = 0; @@ -1163,17 +1173,18 @@ aLens ? aLens[index]:tmpLen); } - return oNumFound; + return aMaxNum; } } - else if(err == KErrNotFound) + else // err == KErrNotFound { //Nothing to do here, oNumFound is set to zero already + + //FindNumSettingsInCategory can only return KErrNotFound, let's + //assert we've only got KErrNotFound + __NK_ASSERT_DEBUG(err == KErrNotFound); } - else - { - return err; - } + } @@ -1226,15 +1237,16 @@ lowIndex = elementPos + 1; isRedefined = ETrue; } - else if (err == KErrNotFound) + else //err == KErrNotFound { //Nothing to do hear, isRedefined flag is EFalse //all analysis is done later in the code + + //FindSetting can only return KErrNotFound, let's assert + //we've only got KErrNotFound + __NK_ASSERT_DEBUG(err == KErrNotFound); } - else - { - return err; - } + } //Examine the redefined status flag @@ -1256,13 +1268,6 @@ } else { - //All required elements were found! - //As vNumFound was used an index so it's value it runs - //from 0 to X-1, where X - number of found elements. To - //get number of elements found we need increase the last - //counter value by 1. - if(cNumFound != 0) - cNumFound ++; //It reaches the goal, all required elements are found //stop here and return the result break; @@ -1273,15 +1278,16 @@ isRedefined = EFalse; } } - else if (err == KErrNotFound) + else //err == KErrNotFound { //cNumFound is already set to zero during the initialization //Nothing to do here + + //FindNumSettingsInCategory can only return KErrNotFound, let's + //assert we've only got KErrNotFound + __NK_ASSERT_DEBUG(err == KErrNotFound); } - else //any other errors - { - return err; - } + } @@ -1332,14 +1338,15 @@ lowIndex = elementPos + 1; isRedefined = ETrue; } - else if (err == KErrNotFound) + else //err == KErrNotFound { //Element is not found, nothing to proceed here + + //FindSetting can only return KErrNotFound, let's assert + //we've only got KErrNotFound + __NK_ASSERT_DEBUG(err == KErrNotFound); } - else - { - return err; - } + } if(cNumFound > 0 && !isRedefined) @@ -1353,14 +1360,15 @@ lowIndex2 = elementPos2 + 1; isRedefined = ETrue; } - else if (err == KErrNotFound) + else //err == KErrNotFound { //Element is not found, nothing to proceed here + + //FindSetting can only return KErrNotFound, let's assert + //we've only got KErrNotFound + __NK_ASSERT_DEBUG(err == KErrNotFound); } - else - { - return err; - } + } if(!isRedefined) @@ -1378,13 +1386,6 @@ } else { - //All required elements were found! - //As vNumFound was used an index so it's value it runs - //from 0 to X-1, where X - number of found elements. To - //get number of elements found we need increase the last - //counter value by 1. - if(vNumFound != 0) - vNumFound ++; //It reaches the goal, all required elements are found //stop here and return the result break; @@ -1396,23 +1397,20 @@ } } } - else if (err == KErrNotFound) + else //err == KErrNotFound { //oNumFound is already set to zero during the initialization //Nothing to do here + + //FindNumSettingsInCategory can only return KErrNotFound, let's + //assert we've only got KErrNotFound + __NK_ASSERT_DEBUG(err == KErrNotFound); } - else - { - return err; - } - + } //Let's prepare the final data - numFound = oNumFound + cNumFound + vNumFound; - - //Return result to the user - return numFound; + return (oNumFound + cNumFound + vNumFound); } @@ -1435,14 +1433,10 @@ //Find the number of elements within the category r = FindNumSettingsInCategory(aCat); - //Analyse the returned error - //if r < 0 - this is an error return to the user - //if r > 0 - number of found settings - if(r < 0) - { - HCR_TRACE_RETURN(r); - } - else if (r == 0) + //We don't expect any errors here + __NK_ASSERT_DEBUG(r >= 0); + + if (r == 0) //No any elements found for this category return 0; else @@ -1463,15 +1457,11 @@ r = FindSettings(aCat, allInCatFound, pIds(), pTypes(), pLens()); - //Exit if we've got negative result just report error - if(r < 0) - HCR_TRACE_RETURN(r); + //We don't expect any errors here + __NK_ASSERT_DEBUG(r >= 0); - //Somehow we'got less elements than it must be!!! + //Check either we've got less elements than it must be __NK_ASSERT_DEBUG(r == allInCatFound); - if(r < allInCatFound) - HCR_TRACE_RETURN(KErrGeneral); - //Choose the elements which satisfy this condition //((elementID & aElementMask) == (aPattern & aElementMask)). The total num- @@ -1524,13 +1514,6 @@ return ((aRef.iSet->iType & KMaskLargeTypes) != 0); } -void HCR::TRepository::GetId(const TSettingRef& aRef, TCategoryUid& aCat, TElementId& aKey) - { - HCR_FUNC("TRepository::GetId1"); - aCat = aRef.iSet->iId.iCat; - aKey = aRef.iSet->iId.iKey; - } - void HCR::TRepository::GetId(const TSettingRef& aRef, SSettingId& aId) { HCR_FUNC("TRepository::GetId2"); @@ -1669,10 +1652,8 @@ __NK_ASSERT_DEBUG(iRepos != 0); __NK_ASSERT_DEBUG(iRepos->iHdr != 0); - - if ((iRepos->iHdr->iNumSettings == 0) || - (iRepos->iOrderedSettingList == 0)) - HCR_TRACE_RETURN(KErrNotFound); + __NK_ASSERT_DEBUG(iRepos->iOrderedSettingList != 0); + __NK_ASSERT_DEBUG(iRepos->iHdr->iNumSettings != 0); SSettingC* arr = iRepos->iOrderedSettingList; TInt32 low = aLow; @@ -1713,6 +1694,10 @@ __NK_ASSERT_DEBUG(iRepos != 0); __NK_ASSERT_DEBUG(iRepos->iHdr != 0); + __NK_ASSERT_DEBUG(aIds != NULL); + __NK_ASSERT_DEBUG(aValues != NULL); + __NK_ASSERT_DEBUG(aTypes != NULL); + __NK_ASSERT_DEBUG(aErrors != NULL); if ((iRepos->iHdr->iNumSettings == 0) || (iRepos->iOrderedSettingList == 0)) @@ -1744,45 +1729,40 @@ //This time the scope of search is whole repository. err = this->FindSetting(*aIds[uIndex],settingRef, rMinIndex, 0, iRepos->iHdr->iNumSettings); + + __NK_ASSERT_DEBUG(err == KErrNotFound || err == KErrNone); + if(err == KErrNotFound) { *aErrors[uIndex] = err; *aValues[uIndex] = 0; - //Copy type only if user provided aTypes array - if(aTypes) - *aTypes[uIndex] = ETypeUndefined; + *aTypes[uIndex] = ETypeUndefined; //As FindSetting did not find the element, let's challenge with //the next one from aIds[] array uIndex ++; continue; } - //fatal error here, nothing to do, just exit and return the error code - else if(err == KErrNotReady || err != KErrNone) - { - return err; - } else // err == KErrNone { //Get the value and type pSetting = (SSettingC*) settingRef.iSet; - //again copy the type value into the user array if it's provided - if(aTypes) - *aTypes[uIndex] = static_cast<TSettingType>(settingRef.iSet->iType); - - //Check for the found type is this word size? If it's not then - //indicate error for this setting - if(*aTypes[uIndex] > ETypeLinAddr) - { - *aErrors[uIndex] = KErrArgument; - *aValues[uIndex] = 0; - } - else - { - *aErrors[uIndex] = KErrNone; - *aValues[uIndex] = pSetting->iValue.iLit.iInt32; - } + *aTypes[uIndex] = static_cast<TSettingType>(settingRef.iSet->iType); + + //Check for the found type is this word size? If it's not then + //indicate error for this setting + if(*aTypes[uIndex] > ETypeLinAddr) + { + *aErrors[uIndex] = KErrArgument; + *aValues[uIndex] = 0; + } + else + { + *aErrors[uIndex] = KErrNone; + *aValues[uIndex] = pSetting->iValue.iLit.iInt32; + } + //Break the loop by setting the redefined status isRedefined = ETrue; } @@ -1811,42 +1791,38 @@ //rMinIndex. This time the scope of search is whole repository. err = this->FindSetting(*aIds[uIndex],settingRef, rMaxIndex, rMinIndex, iRepos->iHdr->iNumSettings); + + __NK_ASSERT_DEBUG(err == KErrNotFound || err == KErrNone); + if(err == KErrNotFound) { *aErrors[uIndex] = err; *aValues[uIndex] = 0; - if(aTypes) - *aTypes[uIndex] = ETypeUndefined; + *aTypes[uIndex] = ETypeUndefined; //As FindSetting did not find the element, let's challenge with //previous one, as we are moving in reverse direction uIndex --; continue; } - //fatal error here, nothing to do, just exit and return the error code - else if(err == KErrNotReady || err != KErrNone) - { - return err; - } else //err == KErrNone { pSetting = (SSettingC*) settingRef.iSet; - if(aTypes) - *aTypes[uIndex] = static_cast<TSettingType>(settingRef.iSet->iType); + *aTypes[uIndex] = static_cast<TSettingType>(settingRef.iSet->iType); - //Check for the found type is this word size? If it's not then indicate - //error for this setting - if(*aTypes[uIndex] > ETypeLinAddr) - { - *aErrors[uIndex] = KErrArgument; - *aValues[uIndex] = 0; - } - else - { - *aErrors[uIndex] = KErrNone; - *aValues[uIndex] = pSetting->iValue.iLit.iInt32; - } - + //Check for the found type is this word size? If it's not then indicate + //error for this setting + if(*aTypes[uIndex] > ETypeLinAddr) + { + *aErrors[uIndex] = KErrArgument; + *aValues[uIndex] = 0; + } + else + { + *aErrors[uIndex] = KErrNone; + *aValues[uIndex] = pSetting->iValue.iLit.iInt32; + } + isRedefined = ETrue; } } @@ -1869,41 +1845,38 @@ { err = this->FindSetting(*aIds[uIndex],settingRef, rIndex, rMinIndex, rMaxIndex); + + __NK_ASSERT_DEBUG(err == KErrNotFound || err == KErrNone); + if(err == KErrNotFound) { *aErrors[uIndex] = err; *aValues[uIndex] = 0; - if(aTypes) - *aTypes[uIndex] = ETypeUndefined; + *aTypes[uIndex] = ETypeUndefined; //As FindSetting did not find the element, let's challenge with //another one continue; } - else if(err == KErrNotReady || err != KErrNone) - { - return err; - } else //err == KErrNone { pSetting = (SSettingC*) settingRef.iSet; - if(aTypes) - *aTypes[uIndex] = static_cast<TSettingType>(settingRef.iSet->iType); - - //Check for the found type is this word size? If it's not then indicate - //error for this setting - if(*aTypes[uIndex] > ETypeLinAddr) - { - *aErrors[uIndex] = KErrArgument; - *aValues[uIndex] = 0; - } - else - { - *aErrors[uIndex] = KErrNone; - *aValues[uIndex] = pSetting->iValue.iLit.iInt32; - } - + *aTypes[uIndex] = static_cast<TSettingType>(settingRef.iSet->iType); + + //Check for the found type is this word size? If it's not then indicate + //error for this setting + if(*aTypes[uIndex] > ETypeLinAddr) + { + *aErrors[uIndex] = KErrArgument; + *aValues[uIndex] = 0; + } + else + { + *aErrors[uIndex] = KErrNone; + *aValues[uIndex] = pSetting->iValue.iLit.iInt32; + } + rMinIndex = rIndex + 1; } @@ -1924,9 +1897,14 @@ __NK_ASSERT_DEBUG(iRepos != 0); __NK_ASSERT_DEBUG(iRepos->iHdr != 0); - - if ((iRepos->iHdr->iNumSettings == 0) || (iRepos->iOrderedSettingList == 0)) + __NK_ASSERT_DEBUG(iRepos->iOrderedSettingList != 0); + + if(iRepos->iHdr->iNumSettings == 0) + { + aFirst = 0; + aLast = 0; HCR_TRACE_RETURN(KErrNotFound); + } SSettingC* arr = iRepos->iOrderedSettingList; int low = 0; @@ -1961,17 +1939,21 @@ //Search the first element within the category low = mid; - while(low > 0 && arr[low].iName.iId.iCat == aCatUid) + while(low >= 0 && arr[low].iName.iId.iCat == aCatUid) { - low --; + if(low > 0) + low --; + else + break; } //Check the boundary conditions, there are two cases when we exit the loop //either we found an element which category is not one we are looking for or //we reach the beggining of the repository. If we reach the beggining of the //repository we don't really know is it because this is last elment or it //has required aCatUid, so we check these two conditions below - if(low == 0 && arr[low].iName.iId.iCat == aCatUid) + if(arr[low].iName.iId.iCat == aCatUid) aFirst = low; + //We finish the loop either reaching the setting which category id is not //what we need or this is first setting in the repository again with another //category, so in both case we throw this element from the account. @@ -1980,13 +1962,16 @@ //Search the last element within the category high = mid; - while(high < iRepos->iHdr->iNumSettings && arr[high].iName.iId.iCat == aCatUid) + while(high <= iRepos->iHdr->iNumSettings - 1 && arr[high].iName.iId.iCat == aCatUid) { - high ++; + if(high < iRepos->iHdr->iNumSettings - 1) + high ++; + else + break; } - + //Same situation as above, boundary conditions - if(high == (iRepos->iHdr->iNumSettings -1) && arr[high].iName.iId.iCat == aCatUid) + if(arr[high].iName.iId.iCat == aCatUid) aLast = high; else aLast = high -1; @@ -2002,13 +1987,9 @@ { __NK_ASSERT_DEBUG(iRepos != 0); __NK_ASSERT_DEBUG(iRepos->iHdr != 0); + __NK_ASSERT_DEBUG(iRepos->iHdr->iNumSettings != 0 && iRepos->iOrderedSettingList != 0); __NK_ASSERT_DEBUG(aIndex >=0 && aIndex < iRepos->iHdr->iNumSettings); - if ((iRepos->iHdr->iNumSettings == 0) || (iRepos->iOrderedSettingList == 0)) - { - aRef.iRep = NULL; - aRef.iSet = NULL; - } //Get the pointer to the repository data SSettingC* arr = iRepos->iOrderedSettingList; @@ -2153,9 +2134,7 @@ __NK_ASSERT_DEBUG(iRepos != 0); - - if (iRepos->iHdr.iNumSettings == 0) - HCR_TRACE_RETURN(KErrNotFound); + __NK_ASSERT_DEBUG(iRepos->iHdr.iNumSettings != 0); SSettingF* arr = (SSettingF*) (iRepos+1); TInt32 low = aLow; @@ -2197,6 +2176,10 @@ __NK_ASSERT_DEBUG(iRepos != 0); + __NK_ASSERT_DEBUG(aIds != NULL); + __NK_ASSERT_DEBUG(aValues != NULL); + __NK_ASSERT_DEBUG(aTypes != NULL); + __NK_ASSERT_DEBUG(aErrors != NULL); if (iRepos->iHdr.iNumSettings == 0) return KErrNotFound; @@ -2226,45 +2209,40 @@ //This time the scope of search is whole repository. err = this->FindSetting(*aIds[uIndex],settingRef, rMinIndex, 0, iRepos->iHdr.iNumSettings); + + __NK_ASSERT_DEBUG(err == KErrNotFound || err == KErrNone); + if(err == KErrNotFound) { *aErrors[uIndex] = err; *aValues[uIndex] = 0; - //Copy type only if user provided aTypes array - if(aTypes) - *aTypes[uIndex] = ETypeUndefined; + *aTypes[uIndex] = ETypeUndefined; //As FindSetting did not find the element, let's challenge with //the next one from aIds[] array uIndex ++; continue; } - //fatal error here, nothing to do, just exit and return the error code - else if(err == KErrNotReady || err != KErrNone) - { - return err; - } else // err == KErrNone { //Get the value and type pSetting = (SSettingF*) settingRef.iSet; //again copy the type value into the user array if it's provided - if(aTypes) - *aTypes[uIndex] = static_cast<TSettingType>(settingRef.iSet->iType); + *aTypes[uIndex] = static_cast<TSettingType>(settingRef.iSet->iType); - //Check for the found type is this word size? If it's not then - //indicate error for this setting - if(*aTypes[uIndex] > ETypeLinAddr) - { - *aErrors[uIndex] = KErrArgument; - *aValues[uIndex] = 0; - } - else - { - *aErrors[uIndex] = KErrNone; - *aValues[uIndex] = pSetting->iValue.iLit.iInt32; - } - + //Check for the found type is this word size? If it's not then + //indicate error for this setting + if(*aTypes[uIndex] > ETypeLinAddr) + { + *aErrors[uIndex] = KErrArgument; + *aValues[uIndex] = 0; + } + else + { + *aErrors[uIndex] = KErrNone; + *aValues[uIndex] = pSetting->iValue.iLit.iInt32; + } + //Break the loop by setting the redefined status isRedefined = ETrue; } @@ -2295,42 +2273,38 @@ //rMinIndex. This time the scope of search is whole repository. err = this->FindSetting(*aIds[uIndex],settingRef, rMaxIndex, rMinIndex, iRepos->iHdr.iNumSettings); + + __NK_ASSERT_DEBUG(err == KErrNotFound || err == KErrNone); + if(err == KErrNotFound) { *aErrors[uIndex] = err; *aValues[uIndex] = 0; - if(aTypes) - *aTypes[uIndex] = ETypeUndefined; + *aTypes[uIndex] = ETypeUndefined; //As FindSetting did not find the element, let's challenge with //previous one uIndex --; continue; } - //fatal error here, nothing to do, just exit and return the error code - else if(err == KErrNotReady || err != KErrNone) - { - return err; - } else //err == KErrNone { pSetting = (SSettingF*) settingRef.iSet; - if(aTypes) - *aTypes[uIndex] = static_cast<TSettingType>(settingRef.iSet->iType); - - //Check for the found type is this word size? If it's not then indicate - //error for this setting - if(*aTypes[uIndex] > ETypeLinAddr) - { - *aErrors[uIndex] = KErrArgument; - *aValues[uIndex] = 0; - } - else - { - *aErrors[uIndex] = KErrNone; - *aValues[uIndex] = pSetting->iValue.iLit.iInt32; - } - + *aTypes[uIndex] = static_cast<TSettingType>(settingRef.iSet->iType); + + //Check for the found type is this word size? If it's not then indicate + //error for this setting + if(*aTypes[uIndex] > ETypeLinAddr) + { + *aErrors[uIndex] = KErrArgument; + *aValues[uIndex] = 0; + } + else + { + *aErrors[uIndex] = KErrNone; + *aValues[uIndex] = pSetting->iValue.iLit.iInt32; + } + isRedefined = ETrue; } } @@ -2353,29 +2327,26 @@ { err = this->FindSetting(*aIds[uIndex],settingRef, rIndex, rMinIndex, rMaxIndex); + + __NK_ASSERT_DEBUG(err == KErrNotFound || err == KErrNone); + if(err == KErrNotFound) { *aErrors[uIndex] = err; *aValues[uIndex] = 0; - if(aTypes) - *aTypes[uIndex] = ETypeUndefined; + *aTypes[uIndex] = ETypeUndefined; //As FindSetting did not find the element, let's challenge with //another one continue; } - else if(err == KErrNotReady || err != KErrNone) - { - return err; - } else //err == KErrNone { pSetting = (SSettingF*) settingRef.iSet; TSettingType type = static_cast<TSettingType>(settingRef.iSet->iType); - if(aTypes != NULL) - *aTypes[uIndex] = type; + *aTypes[uIndex] = type; //Check for the found type is this word size? If it's not then indicate //error for this setting @@ -2404,14 +2375,9 @@ HCR::TSettingRef& aSetRef) { __NK_ASSERT_DEBUG(iRepos != 0); + __NK_ASSERT_DEBUG(iRepos->iHdr.iNumSettings != 0); __NK_ASSERT_DEBUG(aIndex >= 0 && aIndex < iRepos->iHdr.iNumSettings); - if (iRepos->iHdr.iNumSettings == 0) - { - aSetRef.iRep = NULL; - aSetRef.iSet = NULL; - } - SSettingF* arr = (SSettingF*)(iRepos + 1); aSetRef.iRep = this; @@ -2427,10 +2393,14 @@ HCR_FUNC("TRepositoryFile::FindNumSettingsInCategory"); __NK_ASSERT_DEBUG(iRepos != 0); - - if (iRepos->iHdr.iNumSettings == 0) + + if(iRepos->iHdr.iNumSettings == 0) + { + aFirst = 0; + aLast = 0; HCR_TRACE_RETURN(KErrNotFound); - + } + SSettingF* arr = (SSettingF*) (iRepos+1); TInt32 low = 0; TInt32 high = iRepos->iHdr.iNumSettings-1; @@ -2465,17 +2435,22 @@ //Search the first element within the category low = mid; - while(low > 0 && arr[low].iName.iId.iCat == aCatUid) + while(low >= 0 && arr[low].iName.iId.iCat == aCatUid) { - low --; + if(low > 0) + low --; + else + break; } + //Check the boundary conditions, there are two cases when we exit the loop //either we found an element which category is not one we are looking for or //we reach the beggining of the repository. If we reach the beggining of the //repository we don't really know is it because this is last elment or it //has required aCatUid, so we check these two conditions below - if(low == 0 && arr[low].iName.iId.iCat == aCatUid) + if(arr[low].iName.iId.iCat == aCatUid) aFirst = low; + //We finish the loop either reaching the setting which category id is not //what we need or this is first setting in the repository again with another //category, so in both case we throw this element from the account. @@ -2485,15 +2460,19 @@ //Search the last element within the category high = mid; - while(high < iRepos->iHdr.iNumSettings && arr[high].iName.iId.iCat == aCatUid) + while(high <= iRepos->iHdr.iNumSettings - 1 && arr[high].iName.iId.iCat == aCatUid) { - high ++; + if(high < iRepos->iHdr.iNumSettings - 1) + high ++; + else + break; } + //Same situation as above, boundary conditions - if(high == (iRepos->iHdr.iNumSettings - 1) && arr[high].iName.iId.iCat == aCatUid) - aLast = high; - else - aLast = high -1; + if(arr[high].iName.iId.iCat == aCatUid) + aLast = high; + else + aLast = high - 1; return KErrNone; }
--- a/kernel/eka/drivers/hcr/hcr_pil.h Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/hcr/hcr_pil.h Tue Jan 26 13:13:38 2010 +0200 @@ -121,18 +121,7 @@ */ inline TSa() :iSa(NULL){} - /** - * Costructor with a pointer initialization with - * already allocated pointer. - * The member variable pointer iSa is initialized with the - * pointer provided by function parameter. Ownership is moved to - * safe pointer object and source pointer is reset to NULL. - * - * @param aP Pointer to a heap allocated array of element - * with type T. - */ - inline TSa(T* aP) {iSa = aP;} - + /** * operator()() returns an address to the array * maintained by this SafeArray object. @@ -166,16 +155,7 @@ */ inline T& operator[](TInt aIndex){return *(iSa + aIndex);} - /** - * operator[]() - constant version. Returns the constant - * reference to the element of the array. - * @param aIndex Position of the element within SafeArray - * @return Constant reference to the element from - * array - */ - inline const T& operator[](TInt aIndex) const {return *(iSa + aIndex);} - - + /** * Destructor */ @@ -187,7 +167,7 @@ * Copy constructor must not be called explicitly by the * code */ - inline TSa(TSa& aSa){} + inline TSa(TSa& aSa); protected: /**< Pointer to the allocated heap array*/ @@ -544,7 +524,6 @@ // Setting accessor methods virtual TBool IsWordValue(const TSettingRef& aRef); virtual TBool IsLargeValue(const TSettingRef& aRef); - virtual void GetId(const TSettingRef& aRef, TCategoryUid& aCat, TElementId& aKey); virtual void GetId(const TSettingRef& aRef, SSettingId& aId); virtual TInt32 GetType(const TSettingRef& aRef); virtual TUint16 GetLength(const TSettingRef& aRef);
--- a/kernel/eka/drivers/locmedia/dmasupport.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/locmedia/dmasupport.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -21,6 +21,15 @@ #include "dmasupport.h" #include "dmasupport.inl" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "locmedia_ost.h" +#ifdef __VC32__ +#pragma warning(disable: 4127) // disabling warning "conditional expression is constant" +#endif +#include "dmasupportTraces.h" +#endif + #define PHYSADDR_FAULT() Kern::Fault("TLOCDRV-PHYS-ADDR",__LINE__) //#define __DEBUG_DMASUP__ @@ -70,14 +79,17 @@ DDmaHelper::DDmaHelper() { + OstTraceFunctionEntry0( DDMAHELPER_DDMAHELPER_ENTRY ); iPageSize = Kern::RoundToPageSize(1); __ASSERT_ALWAYS(IsPowerOfTwo(iPageSize), PHYSADDR_FAULT()); iPageSizeLog2 = Log2(iPageSize); iPageSizeMsk = iPageSize-1; + OstTraceFunctionExit0( DDMAHELPER_DDMAHELPER_EXIT ); } DDmaHelper::~DDmaHelper() { + OstTraceFunctionEntry0( DESTRUCTOR_DDMAHELPER_ENTRY ); delete [] iPageArray; delete [] iPageList; if (iPhysicalPinObject) @@ -86,6 +98,7 @@ Kern::DestroyPhysicalPinObject(iPhysicalPinObject); NKern::ThreadLeaveCS(); } + OstTraceFunctionExit0( DESTRUCTOR_DDMAHELPER_EXIT ); } /** @@ -101,6 +114,7 @@ */ TInt DDmaHelper::Construct(TInt aLength, TInt aMediaBlockSize, TInt aDmaAlignment) { + OstTraceFunctionEntry1( DDMAHELPER_CONSTRUCT_ENTRY, this ); __ASSERT_ALWAYS(aMediaBlockSize > 0, PHYSADDR_FAULT()); __ASSERT_ALWAYS(IsPowerOfTwo(aMediaBlockSize), PHYSADDR_FAULT()); __ASSERT_ALWAYS(aLength > 0, PHYSADDR_FAULT()); @@ -114,8 +128,11 @@ TUint cacheLineSize = Cache::DmaBufferAlignment(); __ASSERT_ALWAYS(IsPowerOfTwo(cacheLineSize), PHYSADDR_FAULT()); if (cacheLineSize > (TUint) aMediaBlockSize) + { + OstTraceFunctionExitExt( DDMAHELPER_CONSTRUCT_EXIT1, this, KErrNotSupported ); return KErrNotSupported; - + } + //Check whether Kernel supports physical memory pinning: TInt mm = Kern::HalFunction(EHalGroupKernel, EKernelHalMemModelInfo, 0, 0) & EMemModelTypeMask; if (mm >= EMemModelTypeFlexible) @@ -132,9 +149,10 @@ // - Cache::SyncPhysicalMemoryBeforeDmaRead // - Cache::SyncPhysicalMemoryAfterDmaRead iPhysPinningAvailable = ETrue; - __KTRACE_DMA(Kern::Printf("Memory model (%d) supports physical pining\n",mm)); + __KTRACE_DMA(Kern::Printf("Memory model (%d) supports physical pinning\n",mm)); NKern::ThreadEnterCS(); TInt r=Kern::CreatePhysicalPinObject(iPhysicalPinObject); + OstTraceExt2(TRACE_DMASUPPORT, DDMAHELPER_CONSTRUCT1, "Memory model=%d supports physical pinning; created Physical Pin Object with return value=%d",mm, r); NKern::ThreadLeaveCS(); if (r) return r; } @@ -156,7 +174,8 @@ // As they all require linear address as input, these methods also rely on File System buffers // to be in valid state during sync calls. iPhysPinningAvailable = EFalse; - __KTRACE_DMA(Kern::Printf("Memory model (%d) doesn't support physical pining\n",mm)); + __KTRACE_DMA(Kern::Printf("Memory model (%d) doesn't support physical pining",mm)); + OstTrace1(TRACE_DMASUPPORT, DDMAHELPER_CONSTRUCT2, "Memory model=%d doesn't support physical pinning",mm); iPhysicalPinObject = NULL; } @@ -174,12 +193,14 @@ iDmaAlignment = aDmaAlignment; __KTRACE_DMA(Kern::Printf("-PHYSADDR: Construct iMaxPages(%d), MediaBlocks(%d), DMAalign(%d)",iMaxPages,iMediaBlockSize,iDmaAlignment)); + OstTraceExt3(TRACE_FLOW, DDMAHELPER_CONSTRUCT_EXIT2, "< KErrNone PHYSADDR: Construct iMaxPages %d MediaBlocks %d DMAalign %d", iMaxPages,iMediaBlockSize,iDmaAlignment ); return KErrNone; } delete [] iPageArray; iPageArray = NULL; } iMaxPages = 0; + OstTraceFunctionExitExt( DDMAHELPER_CONSTRUCT_EXIT3, this, KErrNoMemory ); return KErrNoMemory; } @@ -193,15 +214,22 @@ */ TInt DDmaHelper::SendReceive(TLocDrvRequest& aReq, TLinAddr aLinAddress) { + OstTraceFunctionEntry0( DDMAHELPER_SENDRECEIVE_ENTRY ); DPrimaryMediaBase& primaryMedia = *aReq.Drive()->iPrimaryMedia; - + TInt reqId = aReq.Id(); if (reqId != DLocalDrive::ERead && reqId != DLocalDrive::EWrite) + { + OstTrace0(TRACE_FLOW, DDMAHELPER_SENDRECEIVE_EXIT1, "< Request is not ERead or EWrite, cannot perform Direct Memory Access"); return aReq.SendReceive(&primaryMedia.iMsgQ); - + } + if ((I64HIGH(aReq.Length()) > 0) || (aReq.Length() < iMediaBlockSize)) + { + OstTrace0(TRACE_FLOW, DDMAHELPER_SENDRECEIVE_EXIT2, "< Invalid request length, cannot perform Direct Memory Access"); return aReq.SendReceive(&primaryMedia.iMsgQ); - + } + // If more than one user thread tries to access the drive, then bail out as there is // only one DDmaHelper object per TLocDrv. Normally this shouldn't ever happen unless // a client app accesses the drive directly using TBusLOcalDrive or the file system is @@ -211,6 +239,7 @@ { __KTRACE_DMA(Kern::Printf("-PHYSADDR: BUSY")); __e32_atomic_add_ord32(&iLockCount, TUint32(-1)); + OstTrace0(TRACE_FLOW, DDMAHELPER_SENDRECEIVE_EXIT3, "< DMA Busy"); return aReq.SendReceive(&primaryMedia.iMsgQ); } @@ -250,6 +279,7 @@ do { __KTRACE_DMA(Kern::Printf(">PHYSADDR:SendReceive() iReqLen %d; iLenConsumed %d; fragments %d",iReqLen, iLenConsumed, fragments)); + OstTraceExt2( TRACE_DMASUPPORT, DDMAHELPER_SENDRECEIVE1, "PHYSADDR:SendReceive() iLenConsumed=%d; fragments=%d", iLenConsumed, fragments); r = RequestStart(); if (r != KErrNone) { @@ -261,6 +291,7 @@ NKern::ThreadLeaveCS(); } __KTRACE_DMA(Kern::Printf("<PHYSADDR:SendReceive()- r:%d",r)); + OstTrace1( TRACE_FLOW, DDMAHELPER_SENDRECEIVE_EXIT4, "< PHYSADDR:SendReceive() Return code %d",r); iMemoryType = EUnknown; __e32_atomic_add_ord32(&iLockCount, TUint32(-1)); return fragments ? r : iReq->SendReceive(&primaryMedia.iMsgQ); @@ -272,14 +303,17 @@ __KTRACE_DMA(Kern::Printf("-PHYSADDR:SendReceive() rThread %08X pos %08lX, len %d addr %08X off %08X", iRemoteThread, iReq->Pos(), I64LOW(iReq->Length()), iLinAddressUser, iReqRemoteDesOffset)); + OstTraceExt4(TRACE_DMASUPPORT, DDMAHELPER_SENDRECEIVE2, "PHYSADDR:SendReceive() position=%Ld; length=%d; address=0x%x; offset=0x%x", iReq->Pos(), (TInt) I64LOW(iReq->Length()), (TUint) iLinAddressUser, (TUint) iReqRemoteDesOffset ); __ASSERT_DEBUG(iReq->Length() == FragLength(), PHYSADDR_FAULT()); __ASSERT_DEBUG(iReq->Length() != 0, PHYSADDR_FAULT()); // reinstate iValue in case overwritten by DMediaPagingDevice::CompleteRequest() iReq->iValue = iReqId; - + + OstTrace1(TRACE_DMASUPPORT, DDMAHELPER_SENDRECEIVE3, "Dma SendReceive Start iReq=%d", iReq); r = iReq->SendReceive(&primaryMedia.iMsgQ); + OstTrace1(TRACE_DMASUPPORT, DDMAHELPER_SENDRECEIVE4, "Dma SendReceive Return iReq=%d", iReq); // The media driver could potentially choose to deal with the request // without accessing physical memory (e.g. if the data is already cached). @@ -311,6 +345,7 @@ iMemoryType = EUnknown; __e32_atomic_add_ord32(&iLockCount, TUint32(-1)); + OstTraceFunctionExit0( DDMAHELPER_SENDRECEIVE_EXIT5 ); return r; } @@ -336,7 +371,9 @@ **/ TInt DDmaHelper::RequestStart() { + OstTraceFunctionEntry1( DDMAHELPER_REQUESTSTART_ENTRY, this ); __KTRACE_DMA(Kern::Printf(">PHYSADDR:RequestStart()")); + iIndex = 0; TLinAddr startAddr = LinAddress(); @@ -366,6 +403,7 @@ if (!IsDmaAligned(startAddr)) { __KTRACE_DMA(Kern::Printf("<PHYSADDR:RequestStart() - not DMA Aligned pos 0x%x addr 0x%x)",I64LOW(startPos), startAddr)); + OstTraceExt2( TRACE_FLOW, DDMAHELPER_REQUESTSTART_EXIT1, "< KErrNotSupported Not DMA Aligned startPos %x startAddr %x", I64LOW(startPos), startAddr ); return KErrNotSupported; } } @@ -374,6 +412,7 @@ if (!IsDmaAligned(startAddr)) { __KTRACE_DMA(Kern::Printf("<PHYSADDR:RequestStart() - not DMA Aligned (0x%x)",startAddr)); + OstTrace1(TRACE_FLOW, DDMAHELPER_REQUESTSTART_EXIT2, "< KErrNotSupported Not DMA Aligned startAddr %x", startAddr); return KErrNotSupported; } } @@ -385,6 +424,7 @@ if (mediaBlockOffset != addrBlockOffset) { __KTRACE_DMA(Kern::Printf("<PHYSADDR:RequestStart() - Frag / not block aligned: pos 0x%x addr 0x%x", I64LOW(startPos), startAddr)); + OstTraceExt2(TRACE_FLOW, DDMAHELPER_REQUESTSTART_EXIT3, "< KErrNotSupported Frag / not block aligned: startPos 0x%x startAddr 0x%x", I64LOW(startPos), startAddr ); return KErrNotSupported; } @@ -413,11 +453,15 @@ NKern::ThreadLeaveCS(); } if (r != KErrNone) + { + OstTraceFunctionExitExt( DDMAHELPER_REQUESTSTART_EXIT4, this, r ); return r; + } iMemoryType = EFileServerChunk; __KTRACE_DMA(Kern::Printf("-PHYSADDR:RequestStart() - EFileServerChunk")); + OstTrace0( TRACE_DMASUPPORT, DDMAHELPER_REQUESTSTART1, "EFileServerChunk"); } //**************************** // Is it shared chunk ? @@ -429,16 +473,21 @@ TInt r = Kern::ChunkPhysicalAddress(iChunk, offset, length, iLinAddressKernel, iMapAttr, iPhysAddr, iPageArray); - if (r < KErrNone) + if (r < KErrNone) + { + OstTraceFunctionExitExt( DDMAHELPER_REQUESTSTART_EXIT5, this, r ); return r; // 0 = Contiguous Memory, 1 = Fragmented/Dis-Contiguous Memory - + } + iMemoryType = ESharedChunk; __KTRACE_DMA(Kern::Printf("-PHYSADDR:RequestStart() - ESharedChunk")); + OstTrace0( TRACE_DMASUPPORT, DDMAHELPER_REQUESTSTART2, "ESharedChunk"); } else { __KTRACE_DMA(Kern::Printf("<PHYSADDR:RequestStart() - EUnknown")); + OstTraceFunctionExitExt( DDMAHELPER_REQUESTSTART_EXIT6, this, KErrNotFound ); return KErrNotFound; } @@ -463,6 +512,7 @@ // Sync memory //************************************************ __KTRACE_DMA(Kern::Printf(">SYNC-PHYSADDR:addr 0x%x len %d", startAddr, length)); + OstTraceExt2(TRACE_DMASUPPORT, DDMAHELPER_REQUESTSTART3, "startAddr=0x%x length=%d", (TUint) startAddr, length ); // Only sync whole blocks: it is assumed that the media driver will transfer // partial start and end blocks without DMA @@ -498,6 +548,8 @@ } __KTRACE_DMA(Kern::Printf("<PHYSADDR:RequestStart()")); + + OstTraceFunctionExitExt( DDMAHELPER_REQUESTSTART_EXIT7, this, KErrNone ); return KErrNone; } @@ -506,8 +558,10 @@ */ void DDmaHelper::RequestEnd() { + OstTraceFunctionEntry0( DDMAHELPER_REQUESTEND_ENTRY ); __KTRACE_DMA(Kern::Printf(">PHYSADDR:RequestEnd()")); + __ASSERT_DEBUG(iReqId == DLocalDrive::ERead || iReqId == DLocalDrive::EWrite, PHYSADDR_FAULT()); __ASSERT_DEBUG(iMemoryType == ESharedChunk || iMemoryType == EFileServerChunk, PHYSADDR_FAULT()); @@ -537,6 +591,7 @@ } ReleasePages(PageAlign(startAddr)); + OstTraceFunctionExit0( DDMAHELPER_REQUESTEND_EXIT ); } /** @@ -546,9 +601,11 @@ */ void DDmaHelper::ReleasePages(TLinAddr aAddr) { + OstTraceFunctionEntry1( DDMAHELPER_RELEASEPAGES_ENTRY, this ); if (iMemoryType == EFileServerChunk) { __KTRACE_DMA(Kern::Printf(">PHYSADDR():ReleasePages thread (0x%x) aAddr(0x%08x) size(%d) iPageArray(0x%x)",iCurrentThread, aAddr, (iPageArrayCount << iPageSizeLog2), iPageArray)); + OstTraceExt3( TRACE_DMASUPPORT, DDMAHELPER_RELEASEPAGES, "ReleasePages aAddr=0x%x; size=%d; iPageArray-0x%x", (TUint) aAddr, (iPageArrayCount << iPageSizeLog2), (TUint) iPageArray); TInt r; if (iPhysPinningAvailable) @@ -563,6 +620,7 @@ } __ASSERT_ALWAYS(r == KErrNone, PHYSADDR_FAULT()); } + OstTraceFunctionExit1( DDMAHELPER_RELEASEPAGES_EXIT, this ); } /** @@ -571,11 +629,13 @@ */ void DDmaHelper::BuildPageList() { + OstTraceFunctionEntry1( DDMAHELPER_BUILDPAGELIST_ENTRY, this ); iPageListCount = 0; if (iPhysAddr != KPhysMemFragmented) { __KTRACE_DMA(Kern::Printf(">PHYSADDR:BuildPageList() - Contiguous Memory")); + OstTrace0( TRACE_DMASUPPORT, DDMAHELPER_BUILDPAGELIST1, "Contiguous Memory"); // Only one entry required. iPageList[0].iAddress = iPhysAddr; iPageList[0].iLength = FragLength(); @@ -584,6 +644,7 @@ else { __KTRACE_DMA(Kern::Printf(">PHYSADDR:BuildPageList() - Dis-Contiguous Memory")); + OstTrace0( TRACE_DMASUPPORT, DDMAHELPER_BUILDPAGELIST2, "Dis-Contiguous Memory"); TInt offset; offset = PageOffset(iChunkOffset + iReqRemoteDesOffset+ iLenConsumed); @@ -625,6 +686,7 @@ // for (TInt m=0; m<iPageListCount; m++) // __KTRACE_DMA(Kern::Printf("-PHYSADDR:BuildPageList() [%d]: %08X l:%d", m, iPageList[m].iAddress, iPageList[m].iLength)); //#endif + OstTraceFunctionExit1( DDMAHELPER_BUILDPAGELIST_EXIT, this ); } @@ -639,11 +701,14 @@ */ TInt DDmaHelper::GetPhysicalAddress(TPhysAddr& aAddr, TInt& aLen) { + OstTraceFunctionEntry1( DUP1_DDMAHELPER_GETPHYSICALADDRESS_ENTRY, this ); if (iIndex >= iPageListCount) { __KTRACE_DMA(Kern::Printf(">PHYSADDR:GetPhysD() [%d], PageListCount:%d", iIndex, iPageListCount)); + OstTraceExt2(TRACE_DMASUPPORT, DDMAHELPER_GETPHYSICALADDRESS1, "GetPhysD() [%d]; iPageCountList=%d", iIndex, iPageListCount ); aAddr = 0; aLen = 0; + OstTraceFunctionExitExt( DUP1_DDMAHELPER_GETPHYSICALADDRESS_EXIT1, this, KErrGeneral ); return KErrGeneral; } @@ -653,10 +718,12 @@ iFragLenRemaining-= aLen; __KTRACE_DMA(Kern::Printf(">PHYSADDR:GetPhysD() [%d] addr:0x%08X, l:%d; Used:%d, Left:%d", iIndex, aAddr, aLen, iLenConsumed, iFragLenRemaining)); + OstTraceExt5(TRACE_DMASUPPORT, DDMAHELPER_GETPHYSICALADDRESS2, "GetPhysD() [%d]; address=0x%x; length=%d; iLenConsumed=%d; iFragLenRemaining=%d", iIndex, (TUint) aAddr, aLen, iLenConsumed, iFragLenRemaining); __ASSERT_DEBUG(aLen >= 0, PHYSADDR_FAULT()); iIndex++; //Move index to next page + OstTraceFunctionExitExt( DDMAHELPER_GETPHYSICALADDRESS_EXIT2, this, KErrNone ); return KErrNone; } @@ -674,6 +741,7 @@ */ TInt DDmaHelper::GetPhysicalAddress(TLocDrvRequest& aReq, TPhysAddr& aAddr, TInt& aLen) { + OstTraceFunctionEntry0( DDMAHELPER_GETPHYSICALADDRESS_ENTRY ); __ASSERT_DEBUG( (aReq.Flags() & TLocDrvRequest::ETClientBuffer) == 0, PHYSADDR_FAULT()); TLinAddr linAddr = (TLinAddr) aReq.RemoteDes(); TInt& offset = aReq.RemoteDesOffset(); @@ -711,7 +779,8 @@ __KTRACE_DMA(Kern::Printf(">PHYSADDR:DP:GetPhysS(), linAddr %08X, physAddr %08X, len %x reqLen %x", linAddr + offset, aAddr, aLen, reqLen)); - + OstTraceExt4(TRACE_DEMANDPAGING, DDMAHELPER_GETPHYSICALADDRESS_DP, "linAddr=0x%x; physAddr=0x%x; length=0x%x; reqLen=0x%x", linAddr + offset, aAddr, aLen, reqLen); + OstTraceFunctionExit0( DDMAHELPER_GETPHYSICALADDRESS_EXIT ); return KErrNone; } #endif // (__DEMAND_PAGING__) @@ -729,6 +798,7 @@ TInt DDmaHelper::UpdateRemoteDescriptorLength(TInt aLength) { + OstTraceFunctionEntryExt( DDMAHELPER_UPDATEREMOTEDESCRIPTORLENGTH_ENTRY, this ); __KTRACE_DMA(Kern::Printf(">PHYSADDR:UpDesLen(%d)",aLength)); // Restore request Id (overwritten by KErrNone return code) to stop ASSERT in WriteRemote @@ -744,6 +814,7 @@ // restore return code iReq->iValue = KErrNone; + OstTraceFunctionExitExt( DDMAHELPER_UPDATEREMOTEDESCRIPTORLENGTH_EXIT, this, r ); return r; }
--- a/kernel/eka/drivers/locmedia/elocd.mmp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/locmedia/elocd.mmp Tue Jan 26 13:13:38 2010 +0200 @@ -23,6 +23,7 @@ #include "../../kernel/kern_ext.mmh" USERINCLUDE ../../include/drivers +USERINCLUDE traces target elocd.ldd targettype ldd
--- a/kernel/eka/drivers/locmedia/locmedia.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/locmedia/locmedia.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -20,6 +20,16 @@ #include "dmasupport.h" #include <kernel/cache.h> +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "locmedia_ost.h" +#ifdef __VC32__ +#pragma warning(disable: 4127) // disabling warning "conditional expression is constant" +#endif +#include "locmediaTraces.h" +#endif + + #if defined(_DEBUG) && defined(__DEMAND_PAGING__) //#define __DEBUG_DEMAND_PAGING__ #endif @@ -140,6 +150,7 @@ DPinObjectAllocator::~DPinObjectAllocator() { + OstTraceFunctionEntry1( DPINOBJECTALLOCATOR_DPINOBJECTALLOCATOR_ENTRY, this ); if (iPreAllocatedDataLock) { iPreAllocatedDataLock->Cleanup(); @@ -154,27 +165,39 @@ } delete [] iVirtualPinContainers; + OstTraceFunctionExit1( DPINOBJECTALLOCATOR_DPINOBJECTALLOCATOR_EXIT, this ); } TInt DPinObjectAllocator::Construct(TInt aObjectCount, TUint aNumPages) { + OstTraceFunctionEntryExt( DPINOBJECTALLOCATOR_CONSTRUCT_ENTRY, this ); TInt pageSize = Kern::RoundToPageSize(1); iFragmentGranularity = pageSize * aNumPages; __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("Fragmentation granularity set to 0x%x", iFragmentGranularity)); - + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPINOBJECTALLOCATOR_CONSTRUCT, "Fragmentation granularity=0x%x", iFragmentGranularity); + // construct the paging lock containing pre-allocated buffers iPreAllocatedDataLock = new DFragmentationPagingLock(); if(!iPreAllocatedDataLock) + { + OstTraceFunctionExitExt( DPINOBJECTALLOCATOR_CONSTRUCT_EXIT1, this, KErrNoMemory ); return KErrNoMemory; + } TInt r = iPreAllocatedDataLock->Construct(aNumPages); if (r != KErrNone) + { + OstTraceFunctionExitExt( DPINOBJECTALLOCATOR_CONSTRUCT_EXIT2, this, r ); return r; + } SVirtualPinContainer* iVirtualPinContainers = new SVirtualPinContainer[aObjectCount]; if (iVirtualPinContainers == NULL) + { + OstTraceFunctionExitExt( DPINOBJECTALLOCATOR_CONSTRUCT_EXIT3, this, KErrNoMemory ); return KErrNoMemory; + } memclr(iVirtualPinContainers, sizeof(SVirtualPinContainer) * aObjectCount); iObjectCount = aObjectCount; @@ -185,11 +208,15 @@ TInt r = Kern::CreateVirtualPinObject(pinContainer.iObject); if (r != KErrNone) + { + OstTraceFunctionExitExt( DPINOBJECTALLOCATOR_CONSTRUCT_EXIT4, this, KErrNoMemory ); return KErrNoMemory; - + } iFreeQ.Add(&pinContainer.iLink); } + + OstTraceFunctionExitExt( DPINOBJECTALLOCATOR_CONSTRUCT_EXIT5, this, KErrNone ); return KErrNone; } @@ -198,6 +225,7 @@ */ DPinObjectAllocator::SVirtualPinContainer* DPinObjectAllocator::AcquirePinObject() { + OstTraceFunctionEntry1( DPINOBJECTALLOCATOR_ACQUIREPINOBJECT_ENTRY, this ); SVirtualPinContainer* pinContainer = NULL; NKern::FMWait(&iLock); @@ -211,6 +239,7 @@ NKern::FMSignal(&iLock); + OstTraceFunctionExit1( DPINOBJECTALLOCATOR_ACQUIREPINOBJECT_EXIT, this ); return pinContainer; } @@ -219,11 +248,13 @@ */ void DPinObjectAllocator::ReleasePinObject(SVirtualPinContainer* aPinContainer) { + OstTraceFunctionEntry1( DPINOBJECTALLOCATOR_RELEASEPINOBJECT_ENTRY, this ); NKern::FMWait(&iLock); iFreeQ.Add(&aPinContainer->iLink); NKern::FMSignal(&iLock); + OstTraceFunctionExit1( DPINOBJECTALLOCATOR_RELEASEPINOBJECT_EXIT, this ); } #endif // __DEMAND_PAGING__ @@ -242,9 +273,11 @@ // Constructor // { + OstTraceFunctionEntry1( DLOCALDRIVEFACTORY_DLOCALDRIVEFACTORY_ENTRY, this ); iParseMask=KDeviceAllowUnit|KDeviceAllowInfo; iUnitsMask=~(0xffffffff<<KMaxLocalDrives); iVersion=TVersion(KLocalDriveMajorVersion,KLocalDriveMinorVersion,KLocalDriveBuildVersion); + OstTraceFunctionExit1( DLOCALDRIVEFACTORY_DLOCALDRIVEFACTORY_EXIT, this ); } TInt DLocalDriveFactory::Install() @@ -271,6 +304,7 @@ // Create a channel on the device. // { + OstTraceFunctionEntry1( DLOCALDRIVEFACTORY_CREATE_ENTRY, this ); aChannel=new DLocalDrive; return aChannel?KErrNone:KErrNoMemory; } @@ -285,6 +319,7 @@ DLocalDrive::~DLocalDrive() { + OstTraceFunctionEntry1( DLOCALDRIVE_DLOCALDRIVE_ENTRY, this ); if (iDrive) { __KTRACE_OPT(KLOCDRV,Kern::Printf(">DLocalDrive::DoClose D:%d, M:%08x",iDrive->iDriveNumber,iDrive->iMedia)); @@ -308,21 +343,33 @@ } if (iNotifyChangeRequest) Kern::DestroyClientRequest(iNotifyChangeRequest); + OstTraceFunctionExit1( DLOCALDRIVE_DLOCALDRIVE_EXIT, this ); } TInt DLocalDrive::DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer) { + OstTraceFunctionEntry1( DLOCALDRIVE_DOCREATE_ENTRY, this ); + if(!Kern::CurrentThreadHasCapability(ECapabilityTCB,__PLATSEC_DIAGNOSTIC_STRING("Checked by ELOCD.LDD (Local Media Driver)"))) + { + OstTraceFunctionExitExt( DLOCALDRIVE_DOCREATE_EXIT1, this, KErrPermissionDenied ); return KErrPermissionDenied; + } if (!Kern::QueryVersionSupported(TVersion(KLocalDriveMajorVersion,KLocalDriveMinorVersion,KLocalDriveBuildVersion),aVer)) + { + OstTraceFunctionExitExt( DLOCALDRIVE_DOCREATE_EXIT2, this, KErrNotSupported ); return KErrNotSupported; + } NKern::ThreadEnterCS(); TInt r = Kern::CreateClientDataRequest(iNotifyChangeRequest); NKern::ThreadLeaveCS(); if (r != KErrNone) + { + OstTraceFunctionExitExt( DLOCALDRIVE_DOCREATE_EXIT3, this, r ); return r; - + } + DThread& t=Kern::CurrentThread(); NKern::LockSystem(); t.AddCleanup(&iCleanup); @@ -332,12 +379,18 @@ iDrive=TheDrives[aUnit]; if (!iDrive) + { + OstTraceFunctionExitExt( DLOCALDRIVE_DOCREATE_EXIT4, this, KErrNotSupported ); return KErrNotSupported; + } __KTRACE_OPT(KLOCDRV,Kern::Printf("DLocalDrive Create - connect to drive %d, M:%08x",iDrive->iDriveNumber,iDrive->iMedia)); r=iDrive->Connect(this); __KTRACE_OPT(KLOCDRV,Kern::Printf("<DLocalDrive Create D:%d, M:%08x r:%d",iDrive->iDriveNumber,iDrive->iMedia,r)); + if (r!=KErrNone) iDrive=NULL; // didn't connect so don't disconnect + + OstTraceFunctionExitExt( DLOCALDRIVE_DOCREATE_EXIT5, this, r ); return r; } @@ -385,9 +438,12 @@ TInt DLocalDrive::Request(TInt aFunction, TAny* a1, TAny* a2) { + OstTraceFunctionEntry1( DLOCALDRIVE_REQUEST_ENTRY, this ); __TRACE_TIMING(0); __KTRACE_OPT(KLOCDRV,Kern::Printf(">DLocalDrive::DoControl D:%d M:%08x F:%d A1:%08x A2:%08x", iDrive->iDriveNumber, iDrive->iMedia, aFunction, a1, a2)); + OstTraceDefExt3( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST, "iMedia=0x%08x; iDriveNumber=%d; Request Id=%d", (TUint) iDrive->iMedia, (TInt) iDrive->iDriveNumber, (TInt) aFunction ); + TInt r=KErrNotSupported; TLocDrvRequest& m=TLocDrvRequest::Get(); m.Flags()=0; @@ -402,8 +458,10 @@ if (r==KErrNone) { __TRACE_TIMING(2); + OstTraceDefExt4( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_READ, "ERead iDriveNumber=%d; length=0x%x; position=0x%x; TLocDrvRequest Object=0x%x", (TInt) iDrive->iDriveNumber, (TUint) m.Length(), (TUint) m.Pos(), (TUint) &m); r=iDrive->Request(m); __TRACE_TIMING(3); + OstTraceDefExt4( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_READ_RETURN, "ERead Return iDriveNumber=%d; length=0x%x; position=0x%x; TLocDrvRequest Object=0x%x", (TInt) iDrive->iDriveNumber, (TUint) m.Length(), (TUint) m.Pos(), (TUint) &m ); } m.CloseRemoteThread(); break; @@ -413,7 +471,11 @@ m.Id()=EWrite; r=m.ProcessMessageData(a1); if (r==KErrNone) + { + OstTraceDefExt4( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_WRITE, "EWrite iDriveNumber=%d; length=0x%x; position=0x%x; TLocDrvRequest Object=0x%x", (TInt) iDrive->iDriveNumber, (TUint) m.Length(), (TUint) m.Pos(), (TUint) &m ); r=iDrive->Request(m); + OstTraceDefExt4( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_WRITE_RETURN, "EWrite Return iDriveNumber=%d; length=0x%x; position=0x%x; TLocDrvRequest Object=0x%x", (TInt) iDrive->iDriveNumber, (TUint) m.Length(), (TUint) m.Pos(), (TUint) &m ); + } m.CloseRemoteThread(); break; } @@ -464,6 +526,13 @@ } } +#if defined(OST_TRACE_COMPILER_IN_USE) && defined(_DEBUG) + const TLocalDriveCapsV5& caps=*(const TLocalDriveCapsV5*)capsBuf.Ptr(); +#endif + + OstTraceExt5( TRACE_INTERNALS, DLOCALDRIVE_REQUEST_CAPS1, "Device caps: iDriveNumber=%d; iSize=0x%x; iType=%d; iDriveAtt=%d; TLocDrvRequest Object=0x%x", (TInt)iDrive->iDriveNumber, (TUint) caps.iSize, (TInt) caps.iType, (TInt) caps.iDriveAtt, (TUint) &m); + OstTraceExt5( TRACE_INTERNALS, DLOCALDRIVE_REQUEST_CAPS2, "Device caps: iBaseAddress=0x%x; iFileSystemId=%d; iPartitionType=%d; iHiddenSectors=0x%x; iEraseBlockSize=0x%x", (TUint) caps.iBaseAddress, (TInt) caps.iFileSystemId, (TUint) caps.iPartitionType, (TUint) caps.iHiddenSectors, (TUint) caps.iEraseBlockSize); + #if defined(_DEBUG) __KTRACE_OPT(KLOCDRV,DebugDumpDriveCaps(iDrive,capsBuf.Ptr())); #endif @@ -475,7 +544,11 @@ m.Id()=EFormat; r=m.ProcessMessageData(a1); if (r==KErrNone) + { + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_FORMAT, "EFormat; TLocDrvRequest Object=0x%x", (TUint) &m); r=iDrive->Request(m); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_FORMAT_RETURN, "EFormat Return; TLocDrvRequest Object=0x%x", (TUint) &m); + } break; } case RLocalDrive::EControlEnlarge: @@ -486,7 +559,9 @@ } m.Length()=(TInt)a1; m.Id()=EEnlarge; + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_ENLARGE, "EEnlarge; TLocDrvRequest Object=0x%x", (TUint) &m); r=iDrive->Request(m); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_ENLARGE_RETURN, "EEnlarge Return; TLocDrvRequest Object=0x%x", (TUint) &m); break; case RLocalDrive::EControlReduce: { @@ -498,19 +573,25 @@ m.Pos()=(TInt)a1; m.Length()=(TInt)a2; m.Id()=EReduce; + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_REDUCE, "EReduce; TLocDrvRequest Object=0x%x", (TUint) &m); r=iDrive->Request(m); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_REDUCE_RETURN, "EReduce Return; TLocDrvRequest Object=0x%x", (TUint) &m); break; } case RLocalDrive::EControlForceMediaChange: m.Pos()=(TInt)a1; m.Id()=EForceMediaChange; + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_FORCEMEDIACHANGE, "EForceMediaChange; TLocDrvRequest Object=0x%x", (TUint) &m); r = iDrive->Request(m); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_FORCEMEDIACHANGE_RETURN, "EForceMediaChange Return; TLocDrvRequest Object=0x%x", (TUint) &m); break; case RLocalDrive::EControlMediaDevice: + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_CONTROLMEDIADEVICE, "EControlMediaDevice; TLocDrvRequest Object=0x%x", (TUint) &m); r=iDrive->iPrimaryMedia->iDevice; break; case RLocalDrive::EControlIsRemovable: { + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_CONTROLISREMOVABLE, "EControlIsRemovable; TLocDrvRequest Object=0x%x", (TUint) &m); TInt sockNum; r=iDrive->iPrimaryMedia->IsRemovableDevice(sockNum); if (r) @@ -544,12 +625,15 @@ //let's not have the dispatcher function attempt //to adjust for partition size. m.Flags() |= TLocDrvRequest::EAdjusted; - + + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_CONTROLCONTROLIO, "EControlControlIO; TLocDrvRequest Object=0x%x", (TUint) &m); r=iDrive->Request(m); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_CONTROLCONTROLIO_RETURN, "EControlControlIO Return; TLocDrvRequest Object=0x%x", (TUint) &m); break; } case RLocalDrive::EControlSetMountInfo: { + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_CONTROLSETMOUNTINFO, "EControlSetMountInfo; TLocDrvRequest Object=0x%x", (TUint) &m); m.Id()=ERead; r=m.ProcessMessageData(a1); DPrimaryMediaBase* pM=iDrive->iPrimaryMedia; @@ -623,7 +707,11 @@ r = ReadPasswordData(m, pswData, oldPasswd, newPasswd); if (r == KErrNone) + { + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_PASSWORDLOCK, "EPasswordLock; TLocDrvRequest Object=0x%x", (TUint) &m); r = iDrive->Request(m); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_PASSWORDLOCK_RETURN, "EPasswordLock Return; TLocDrvRequest Object=0x%x", (TUint) &m); + } break; } case RLocalDrive::EControlPasswordUnlock: @@ -637,7 +725,11 @@ r = ReadPasswordData(m, pswData, oldPasswd, newPasswd); if(r == KErrNone) + { + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_PASSWORDUNLOCK, "EPasswordUnLock; TLocDrvRequest Object=0x%x", (TUint) &m); r=iDrive->Request(m); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_PASSWORDUNLOCK_RETURN, "EPasswordUnLock Return; TLocDrvRequest Object=0x%x", (TUint) &m); + } if (r == KErrNone) iDrive->iPrimaryMedia->iTotalPartitionsOpened = 0; break; @@ -653,13 +745,19 @@ r = ReadPasswordData(m, pswData, oldPasswd, newPasswd); if (r == KErrNone) + { + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_PASSWORDCLEAR, "EPasswordClear; TLocDrvRequest Object=0x%x", (TUint) &m); r = iDrive->Request(m); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_PASSWORDCLEAR_RETURN, "EPasswordClear Return; TLocDrvRequest Object=0x%x", (TUint) &m); + } break; } case RLocalDrive::EControlPasswordErase: { m.Id()=EPasswordErase; + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_PASSWORDERASE, "EPasswordErase; TLocDrvRequest Object=0x%x", (TUint) &m); r=iDrive->Request(m); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_PASSWORDERASE_RETURN, "EPasswordErase Return; TLocDrvRequest Object=0x%x", (TUint) &m); if(r == KErrNone) iDrive->iPrimaryMedia->iTotalPartitionsOpened = 0; break; @@ -670,11 +768,13 @@ r=KErrNone; if (!iNotifyChangeRequest->StatusPtr()) r = iNotifyChangeRequest->SetStatus((TRequestStatus*) a1); + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_CONTROLNOTIFYCHANGE, "EControlNotifyChange; TLocDrvRequest Object=0x%x", (TUint) &m); break; case RLocalDrive::EControlNotifyChangeCancel: if (iCleanup.iThread != &Kern::CurrentThread()) Kern::PanicCurrentThread(KLitLocMedia,KErrAccessDenied); Kern::QueueRequestComplete(iCleanup.iThread,iNotifyChangeRequest,KErrCancel); + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_CONTROLNOTIFYCHANGECANCEL, "EControlNotifyChangeCancel; TLocDrvRequest Object=0x%x", (TUint) &m); break; case RLocalDrive::EControlReadPasswordStore: { @@ -682,7 +782,9 @@ m.RemoteDes() = (TAny*) passData; m.Length() = sizeof(passData); m.Id()=EReadPasswordStore; + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_READPASSWORDSTORE, "EReadPasswordStore; TLocDrvRequest Object=0x%x", (TUint) &m); r=iDrive->Request(m); + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_READPASSWORDSTORE_RETURN, "EReadPasswordStore Return; TLocDrvRequest Object=0x%x", (TUint) &m); if (r==KErrNone) { TPtr8 pData(passData, (TInt) m.Length(), TPasswordStore::EMaxPasswordLength); @@ -715,7 +817,9 @@ m.RemoteDes() = (TAny*) pData.Ptr(); m.Length() = pData.Length(); m.Id()=EWritePasswordStore; + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_WRITEPASSWORDSTORE, "EWritePasswordStore; TLocDrvRequest Object=0x%x", (TUint) &m); r=iDrive->Request(m); + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_WRITEPASSWORDSTORE_RETURN, "EReadPasswordStore Return; TLocDrvRequest Object=0x%x", (TUint) &m); if(r == KErrNone) iDrive->iPrimaryMedia->iTotalPartitionsOpened = 0; break; @@ -725,7 +829,9 @@ m.Id()=EPasswordStoreLengthInBytes; TInt length; m.RemoteDes() = (TAny*) &length; + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_PASSWORDSTORELENGTH, "EPasswordStoreLengthInBytes; TLocDrvRequest Object=0x%x", (TUint) &m); r=iDrive->Request(m); + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_PASSWORDSTORELENGTH_RETURN, "EPasswordStoreLengthInBytes Return; TLocDrvRequest Object=0x%x", (TUint) &m); if (r == KErrNone) { @@ -744,7 +850,9 @@ errorInfoBuf.FillZ(); m.RemoteDes()=(TAny*) errorInfoBuf.Ptr(); // overload this m.Length() = errorInfoBuf.MaxLength(); + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_GETLASTERRORINFO, "EGetLastErrorInfo; TLocDrvRequest Object=0x%x", (TUint) &m); r=iDrive->Request(m); + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_CONTROLGETLASTERRORINFO_RETURN, "EControlGetLastErrorInfo Return; TLocDrvRequest Object=0x%x", (TUint) &m); Kern::InfoCopy(*(TDes8*)a1, errorInfoBuf); break; } @@ -753,7 +861,11 @@ m.Id()=EDeleteNotify; r=m.ProcessMessageData(a1); if (r==KErrNone) + { + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_DELETENOTIFY, "EDeleteNotify; TLocDrvRequest Object=0x%x", (TUint) &m); r=iDrive->Request(m); + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_DELETENOTIFY_RETURN, "EDeleteNotify Return; TLocDrvRequest Object=0x%x", (TUint) &m); + } break; } @@ -762,13 +874,14 @@ TBuf8<KMaxQueryDeviceLength> queryBuf; queryBuf.SetMax(); queryBuf.FillZ(); - + m.Id() = EQueryDevice; m.iArg[0] = a1; // RLocalDrive::TQueryDevice m.RemoteDes() = (TAny*)queryBuf.Ptr(); // overload this m.Length() = KMaxLocalDriveCapsLength; // for pinning + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_QUERYDEVICE, "EQueryDevice; TLocDrvRequest Object=0x%x", (TUint) &m); r=iDrive->Request(m); - + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_QUERYDEVICE_RETURN, "EQueryDevice Return; TLocDrvRequest Object=0x%x", (TUint) &m); Kern::InfoCopy(*(TDes8*)a2, queryBuf); break; } @@ -776,6 +889,7 @@ } __KTRACE_OPT(KLOCDRV,Kern::Printf("<DLocalDrive::DoControl D:%d M:%08x ret %d",iDrive->iDriveNumber, iDrive->iMedia, r)); __TRACE_TIMING(4); + OstTraceFunctionExitExt( DLOCALDRIVE_REQUEST_EXIT, this, r ); return r; } @@ -808,9 +922,13 @@ #ifdef __DEMAND_PAGING__ TInt DLocalDrive::LockMountInfo(DPrimaryMediaBase& aPrimaryMedia, TLocDrvRequest& aReq) { + OstTraceExt2(TRACE_FLOW, DLOCALDRIVE_LOCKMOUNTINFO_ENTRY, "> aPrimaryMedia=%x;aReq=%x", (TUint) &aPrimaryMedia, (TUint) &aReq ); DMediaPagingDevice* pagingDevice = aPrimaryMedia.iBody->iPagingDevice; if (pagingDevice == NULL) + { + OstTraceFunctionExitExt( DLOCALDRIVE_LOCKMOUNTINFO_EXIT1, this, KErrNone ); return KErrNone; + } __ASSERT_DEBUG(pagingDevice->iMountInfoDataLock == NULL, LOCM_FAULT()); __ASSERT_DEBUG(pagingDevice->iMountInfoDescHdrLock == NULL, LOCM_FAULT()); @@ -825,20 +943,32 @@ TUint8* desAddress = NULL; TInt r = Kern::ThreadGetDesInfo(pT,aReq.RemoteDes(),length,maxLength,desAddress,EFalse); // get descriptor length, maxlength and desAddress if (r != KErrNone) + { + OstTraceFunctionExitExt( DLOCALDRIVE_LOCKMOUNTINFO_EXIT2, this, r ); return r; + } if (length == 0) + { + OstTraceFunctionExitExt( DLOCALDRIVE_LOCKMOUNTINFO_EXIT3, this, KErrNone ); return KErrNone; + } static const TUint8 LengthLookup[16]={4,8,12,8,12,0,0,0,0,0,0,0,0,0,0,0}; TUint32 desHdr; r = Kern::ThreadRawRead(pT, aReq.RemoteDes(), &desHdr, sizeof(desHdr)); if(r!=KErrNone) + { + OstTraceFunctionExitExt( DLOCALDRIVE_LOCKMOUNTINFO_EXIT4, this, r ); return r; + } TInt desType = desHdr >>KShiftDesType8; TInt desHdrLen = LengthLookup[desType]; if(!desHdrLen) + { + OstTraceFunctionExitExt( DLOCALDRIVE_LOCKMOUNTINFO_EXIT5, this, KErrBadDescriptor ); return KErrBadDescriptor; + } pagingDevice->iMountInfoDataLock = ThePinObjectAllocator->AcquirePinObject(); @@ -850,6 +980,7 @@ pagingDevice->iMountInfoDescLenLock == NULL) { UnlockMountInfo(aPrimaryMedia); // tidy up + OstTraceFunctionExitExt( DLOCALDRIVE_LOCKMOUNTINFO_EXIT6, this, KErrNoMemory ); return KErrNoMemory; } @@ -861,6 +992,7 @@ if (r != KErrNone) { UnlockMountInfo(aPrimaryMedia); // tidy up + OstTraceFunctionExitExt( DLOCALDRIVE_LOCKMOUNTINFO_EXIT7, this, KErrNoMemory ); return KErrNoMemory; } @@ -875,6 +1007,7 @@ if (r != KErrNone) { UnlockMountInfo(aPrimaryMedia); // tidy up + OstTraceFunctionExitExt( DLOCALDRIVE_LOCKMOUNTINFO_EXIT8, this, KErrNoMemory ); return KErrNoMemory; } } @@ -886,19 +1019,25 @@ if (r != KErrNone) { UnlockMountInfo(aPrimaryMedia); // tidy up + OstTraceFunctionExitExt( DLOCALDRIVE_LOCKMOUNTINFO_EXIT9, this, KErrNoMemory ); return KErrNoMemory; } - + OstTraceFunctionExitExt( DLOCALDRIVE_LOCKMOUNTINFO_EXIT10, this, KErrNone ); return KErrNone; } void DLocalDrive::UnlockMountInfo(DPrimaryMediaBase& aPrimaryMedia) { + OstTrace1(TRACE_FLOW, DLOCALDRIVE_UNLOCKMOUNTINFO_ENTRY, "> DLocalDrive::UnlockMountInfo;aPrimaryMedia=%x", (TUint) &aPrimaryMedia); + DMediaPagingDevice* pagingDevice = aPrimaryMedia.iBody->iPagingDevice; if (pagingDevice == NULL || pagingDevice->iMountInfoDataLock == NULL) + { + OstTraceFunctionExit1( DLOCALDRIVE_UNLOCKMOUNTINFO_EXIT1, this ); return; + } if (pagingDevice->iMountInfoDataLock) @@ -922,11 +1061,13 @@ pagingDevice->iMountInfoDescLenLock = NULL; } + OstTraceFunctionExit1( DLOCALDRIVE_UNLOCKMOUNTINFO_EXIT2, this ); } #endif // __DEMAND_PAGING__ void DLocalDrive::NotifyChange(DPrimaryMediaBase& aPrimaryMedia, TBool aMediaChange) { + OstTraceExt2( TRACE_FLOW, DLOCALDRIVE_NOTIFYCHANGE_ENTRY, "> DLocalDrive::NotifyChange;aPrimaryMedia=%x;aMediaChange=%d", (TUint) &aPrimaryMedia, aMediaChange ); #ifndef __DEMAND_PAGING__ aPrimaryMedia; #endif @@ -965,6 +1106,7 @@ pC->AsyncClose(); } } + OstTraceFunctionExit1( DLOCALDRIVE_NOTIFYCHANGE_EXIT, this ); } TLocalDriveCleanup::TLocalDriveCleanup() @@ -1011,18 +1153,25 @@ */ EXPORT_C TInt TLocDrvRequest::ReadRemote(TDes8* aDes, TInt anOffset) { + OstTraceFunctionEntry1( TLOCDRVREQUEST_READREMOTE_ENTRY, this ); + TInt r; DThread* pT=RemoteThread(); if (!pT) pT=Client(); #ifdef __DEMAND_PAGING__ // only if driver has its own thread, we don't support paging in MD which run in the context of their clients if (Flags() & ETClientBuffer) - return Kern::ThreadBufRead(pT, (TClientBuffer*) RemoteDes(),*aDes,anOffset+RemoteDesOffset(),KChunkShiftBy0); - + { + r = Kern::ThreadBufRead(pT, (TClientBuffer*) RemoteDes(),*aDes,anOffset+RemoteDesOffset(),KChunkShiftBy0); + OstTraceFunctionExitExt( TLOCDRVREQUEST_READREMOTE_EXIT1, this, r ); + return r; + } + __ASSERT_ALWAYS((Flags() & ETClientBuffer) == 0, LOCM_FAULT()); #endif - - return Kern::ThreadDesRead(pT,RemoteDes(),*aDes,anOffset+RemoteDesOffset(),KChunkShiftBy0); + r = Kern::ThreadDesRead(pT,RemoteDes(),*aDes,anOffset+RemoteDesOffset(),KChunkShiftBy0); + OstTraceFunctionExitExt( TLOCDRVREQUEST_READREMOTE_EXIT2, this, r ); + return r; } @@ -1052,12 +1201,14 @@ */ EXPORT_C TInt TLocDrvRequest::ReadRemote(const TAny* aSrc, TDes8* aDes) { + OstTraceFunctionEntry1( TLOCDRVREQUEST_READ_REMOTE_ENTRY, this ); if (Flags() & TLocDrvRequest::EKernelBuffer) { aDes->Copy(* (TDesC8*) aSrc); return KErrNone; } + TInt r; DThread* pT=RemoteThread(); if (!pT) pT=Client(); @@ -1066,10 +1217,15 @@ __ASSERT_DEBUG(!DataPagingDfcQ(Drive()->iPrimaryMedia), LOCM_FAULT()); if (DataPagingDfcQ(Drive()->iPrimaryMedia)) + { + OstTraceFunctionExitExt( TLOCDRVREQUEST_READ_REMOTE_EXIT1, this, KErrNotSupported ); return KErrNotSupported; + } #endif - - return Kern::ThreadDesRead(pT,aSrc,*aDes,0,KChunkShiftBy0); + + r = Kern::ThreadDesRead(pT,aSrc,*aDes,0,KChunkShiftBy0); + OstTraceFunctionExitExt( TLOCDRVREQUEST_READ_REMOTE_EXIT2, this, r ); + return r; } @@ -1092,12 +1248,14 @@ */ EXPORT_C TInt TLocDrvRequest::ReadRemoteRaw(TAny* aDest, TInt aSize) { + OstTraceFunctionEntry1( TLOCDRVREQUEST_READREMOTERAW_ENTRY, this ); if (Flags() & TLocDrvRequest::EKernelBuffer) { (void)memcpy(aDest, (TAny*) RemoteDes(), aSize); return KErrNone; } + TInt r; DThread* pT=RemoteThread(); if (!pT) pT=Client(); @@ -1105,8 +1263,10 @@ #ifdef __DEMAND_PAGING__ __ASSERT_ALWAYS((Flags() & ETClientBuffer) == 0, LOCM_FAULT()); #endif - - return Kern::ThreadRawRead(pT,RemoteDes(),aDest,aSize); + + r = Kern::ThreadRawRead(pT,RemoteDes(),aDest,aSize); + OstTraceFunctionExitExt( TLOCDRVREQUEST_READREMOTERAW_EXIT, this, r ); + return r; } @@ -1132,6 +1292,8 @@ */ EXPORT_C TInt TLocDrvRequest::WriteRemote(const TDesC8* aDes, TInt anOffset) { + OstTraceFunctionEntry1( TLOCDRVREQUEST_WRITEREMOTE_ENTRY, this ); + TInt r; DThread* pC=Client(); DThread* pT=RemoteThread(); if (!pT) @@ -1139,10 +1301,15 @@ #ifdef __DEMAND_PAGING__ if (Flags() & ETClientBuffer) - return Kern::ThreadBufWrite(pT, (TClientBuffer*) RemoteDes(),*aDes,anOffset+RemoteDesOffset(),KChunkShiftBy0,pC); + { + r = Kern::ThreadBufWrite(pT, (TClientBuffer*) RemoteDes(),*aDes,anOffset+RemoteDesOffset(),KChunkShiftBy0,pC); + OstTraceFunctionExitExt( TLOCDRVREQUEST_WRITEREMOTE_EXIT1, this, r ); + return r; + } #endif - - return Kern::ThreadDesWrite(pT,RemoteDes(),*aDes,anOffset+RemoteDesOffset(),KChunkShiftBy0,pC); + r = Kern::ThreadDesWrite(pT,RemoteDes(),*aDes,anOffset+RemoteDesOffset(),KChunkShiftBy0,pC); + OstTraceFunctionExitExt( TLOCDRVREQUEST_WRITEREMOTE_EXIT2, this, r ); + return r; } @@ -1164,6 +1331,8 @@ */ EXPORT_C TInt TLocDrvRequest::WriteRemoteRaw(const TAny* aSrc, TInt aSize) { + OstTraceFunctionEntry1( TLOCDRVREQUEST_WRITEREMOTERAW_ENTRY, this ); + TInt r; DThread* pC=Client(); DThread* pT=RemoteThread(); if (!pT) @@ -1172,8 +1341,9 @@ #ifdef __DEMAND_PAGING__ __ASSERT_ALWAYS((Flags() & ETClientBuffer) == 0, LOCM_FAULT()); #endif - - return Kern::ThreadRawWrite(pT,RemoteDes(),aSrc,aSize,pC); + r = Kern::ThreadRawWrite(pT,RemoteDes(),aSrc,aSize,pC); + OstTraceFunctionExitExt( TLOCDRVREQUEST_WRITEREMOTERAW_EXIT, this, r ); + return r; } @@ -1182,10 +1352,12 @@ // Get read/write parameters from client and open remote thread // { + OstTraceFunctionEntry1( TLOCDRVREQUEST_PROCESSMESSAGEDATA_ENTRY, this ); RemoteThread()=NULL; DThread& t=Kern::CurrentThread(); TLocalDriveMessageData d; kumemget32(&d,aPtr,sizeof(d)); + OstTrace1( TRACE_INTERNALS, TLOCDRVREQUEST_PROCESSMESSAGEDATA, "Message handle=%d", d.iHandle ); if (d.iHandle!=KLocalMessageHandle && Id()!=DLocalDrive::EFormat) { NKern::LockSystem(); @@ -1193,6 +1365,7 @@ if (!pT || pT->Open()!=KErrNone) { NKern::UnlockSystem(); + OstTraceFunctionExitExt( TLOCDRVREQUEST_PROCESSMESSAGEDATA_EXIT1, this, KErrBadHandle ); return KErrBadHandle; } t.iExtTempObj=pT; @@ -1205,26 +1378,39 @@ RemoteDesOffset()=d.iOffset; DriverFlags()=d.iFlags; if (Pos()<0 || Length()<0) + { + OstTraceFunctionExitExt( TLOCDRVREQUEST_PROCESSMESSAGEDATA_EXIT2, this, KErrArgument ); return KErrArgument; + } + OstTraceFunctionExitExt( TLOCDRVREQUEST_PROCESSMESSAGEDATA_EXIT3, this, KErrNone ); return KErrNone; } void TLocDrvRequest::CloseRemoteThread() { + OstTraceFunctionEntry1( TLOCDRVREQUEST_CLOSEREMOTETHREAD_ENTRY, this ); + if (!RemoteThread()) + { + OstTraceFunctionExit1( TLOCDRVREQUEST_CLOSEREMOTETHREAD_EXIT1, this ); return; + } NKern::ThreadEnterCS(); DThread& t=Kern::CurrentThread(); RemoteThread()=NULL; Kern::SafeClose((DObject*&)t.iExtTempObj,NULL); NKern::ThreadLeaveCS(); + OstTraceFunctionExit1( TLOCDRVREQUEST_CLOSEREMOTETHREAD_EXIT2, this ); } EXPORT_C TInt TLocDrvRequest::CheckAndAdjustForPartition() { + OstTraceFunctionEntry1( TLOCDRVREQUEST_CHECKANDADJUSTFORPARTITION_ENTRY, this ); TLocDrv& d=*Drive(); __KTRACE_OPT(KLOCDRV,Kern::Printf("CheckAndAdjustForPartition drive %d partition len %lx",d.iDriveNumber,d.iPartitionLen)); + OstTraceExt2( TRACE_INTERNALS, TLOCDRVREQUEST_CHECKANDADJUSTFORPARTITION1, "iDriveNumber=%d; partition length=0x%lx", d.iDriveNumber, (TInt) d.iPartitionLen ); Flags() |= EAdjusted; + TInt r; switch (Id()) { case DLocalDrive::ECaps: @@ -1237,34 +1423,49 @@ case DLocalDrive::EWritePasswordStore: case DLocalDrive::EPasswordStoreLengthInBytes: case DLocalDrive::EQueryDevice: - return KErrNone; + { + r = KErrNone; + break; + } case DLocalDrive::EEnlarge: __KTRACE_OPT(KLOCDRV,Kern::Printf("Enlarge request %lx",Length())); + OstTrace1( TRACE_INTERNALS, TLOCDRVREQUEST_CHECKANDADJUSTFORPARTITION2, "Enlarge request=0x%lx", Length() ); if (Length()>KMaxTInt) - return KErrArgument; - return KErrNone; + r = KErrArgument; + else + r = KErrNone; + break; case DLocalDrive::EReduce: __KTRACE_OPT(KLOCDRV,Kern::Printf("Reduce request %lx@%lx",Length(),Pos())); + OstTraceExt2( TRACE_INTERNALS, TLOCDRVREQUEST_CHECKANDADJUSTFORPARTITION3, "Reduce request length=0x%lx; position=0x%lx", (TUint) Length(), (TUint) Pos() ); if (Pos()+Length()>d.iPartitionLen) - return KErrArgument; - return KErrNone; + r = KErrArgument; + else + r = KErrNone; + break; case DLocalDrive::EFormat: __KTRACE_OPT(KLOCDRV,Kern::Printf("Format request %lx@%lx",Length(),Pos())); + OstTraceExt2( TRACE_INTERNALS, TLOCDRVREQUEST_CHECKANDADJUSTFORPARTITION4, "Format request length=0x%lx; position=0x%lx", (TUint) Length(), (TUint) Pos() ); if (!(DriverFlags() & RLocalDrive::ELocDrvWholeMedia)) { if (Pos()>d.iPartitionLen) { Length()=0; - return KErrEof; + r = KErrEof; + break; } Int64 left=d.iPartitionLen-Pos(); if (left<Length()) Length()=left; Pos()+=d.iPartitionBaseAddr; if (Length()==0) - return KErrEof; + { + r = KErrEof; + break; + } } - return KErrNone; + r = KErrNone; + break; #ifdef __DEMAND_PAGING__ case DMediaPagingDevice::ERomPageInRequest: @@ -1272,28 +1473,41 @@ // Otherwise the media driver adjust it internally case DMediaPagingDevice::ECodePageInRequest: __KTRACE_OPT(KLOCDPAGING,Kern::Printf("Adjusted Paging read request %lx@%lx",Length(),Pos())); + OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, TLOCDRVREQUESTCHECKANDADJUSTFORPARTITION5, "Adjusted Paging read request length=0x%lx; position=0x%lx", (TUint) Length(), (TUint) Pos()); if (Pos()+Length()>d.iPartitionLen) - return KErrArgument; + { + r = KErrArgument; + break; + } Pos()+=d.iPartitionBaseAddr; - return KErrNone; + r = KErrNone; + break; #endif default: // read or write or fragment __KTRACE_OPT(KLOCDRV,Kern::Printf("R/W request %lx@%lx",Length(),Pos())); - + OstTraceExt2( TRACE_INTERNALS, TLOCDRVREQUEST_CHECKANDADJUSTFORPARTITION6, "Read/Write request length=0x%x; position=0x%x", (TUint) Length(), (TUint) Pos() ); if (DriverFlags() & RLocalDrive::ELocDrvWholeMedia) { if (d.iMedia && d.iMedia->iDriver && Pos()+Length() > d.iMedia->iDriver->iTotalSizeInBytes) - return KErrArgument; + { + r = KErrArgument; + break; + } } else { if (Pos()+Length() > d.iPartitionLen) - return KErrArgument; + { + r = KErrArgument; + break; + } Pos()+=d.iPartitionBaseAddr; } - return KErrNone; + r = KErrNone; } + OstTraceFunctionExitExt( TLOCDRVREQUEST_CHECKANDADJUSTFORPARTITION_EXIT, this, r ); + return r; } /******************************************** @@ -1301,9 +1515,11 @@ ********************************************/ TLocDrv::TLocDrv(TInt aDriveNumber) { + OstTraceFunctionEntryExt( TLOCDRV_TLOCDRV_ENTRY, this ); memclr(this, sizeof(TLocDrv)); iDriveNumber=aDriveNumber; iPartitionNumber=-1; + OstTraceFunctionExit1( TLOCDRV_TLOCDRV_EXIT, this ); } /** @@ -1321,9 +1537,12 @@ */ EXPORT_C TInt DMedia::Create(TMediaDevice aDevice, TInt aMediaId, TInt) { + OstTraceFunctionEntry1( DMEDIA_CREATE_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DMedia::Create media %d device %d",aMediaId,aDevice)); + OstTraceExt2(TRACE_INTERNALS, DMEDIA_CREATE, "media=%d; device=%d", aMediaId, (TUint) aDevice); iMediaId=aMediaId; iDevice=aDevice; + OstTraceFunctionExitExt( DMEDIA_CREATE_EXIT, this, KErrNone ); return KErrNone; } @@ -1332,15 +1551,18 @@ ********************************************/ void asyncDfc(TAny* aPtr) { + OstTraceFunctionEntry0( _ASYNCDFC_ENTRY ); DPrimaryMediaBase* pM=(DPrimaryMediaBase*)aPtr; if (pM->iState==DMedia::EOpening) pM->DoOpenMediaDriverComplete(pM->iAsyncErrorCode); else if (pM->iState==DMedia::EReadPartitionInfo) pM->DoPartitionInfoComplete(pM->iAsyncErrorCode); + OstTraceFunctionExit0( _ASYNCDFC_EXIT ); } void handleMsg(TAny* aPtr) { + OstTraceFunctionEntry0( _HANDLEMSG_ENTRY ); DPrimaryMediaBase* primaryMedia=(DPrimaryMediaBase*)aPtr; for(TLocDrvRequest* m = (TLocDrvRequest*) primaryMedia->iMsgQ.iMessage; @@ -1363,6 +1585,7 @@ primaryMedia->iMsgQ.Receive(); // allow reception of more messages + OstTraceFunctionExit0( _HANDLEMSG_EXIT ); } EXPORT_C DPrimaryMediaBase::DPrimaryMediaBase() @@ -1375,6 +1598,7 @@ Initialises the media state as closed. */ { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_DPRIMARYMEDIABASE_ENTRY, this ); iState = EClosed; } @@ -1394,13 +1618,24 @@ */ { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_CREATE_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase::Create media %d-%d device %d",aMediaId,aLastMediaId,aDevice)); + OstTraceExt3( TRACE_INTERNALS, DPRIMARYMEDIABASE_CREATE, "aMediaId=%d; aLastMediaId=%d; aDevice=%d ", aMediaId, aLastMediaId, (TUint) aDevice ); TInt r=DMedia::Create(aDevice,aMediaId,0); + if (r != KErrNone) + { + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_CREATE_EXIT1, this, r ); return r; + } iBody = new DBody; if (iBody == NULL) + { + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_CREATE_EXIT2, this, KErrNoMemory ); return KErrNoMemory; + } + + #ifdef __DEMAND_PAGING__ TInt pageSize = Kern::RoundToPageSize(1); @@ -1415,6 +1650,7 @@ iWaitMedChg.SetDfcQ(iDfcQ); iAsyncDfc.SetDfcQ(iDfcQ); } + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_CREATE_EXIT3, this, KErrNone ); return KErrNone; } @@ -1439,19 +1675,26 @@ @see DLocalDrive */ { + OstTraceFunctionEntryExt( DPRIMARYMEDIABASE_CONNECT_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase(%d)::Connect %O",iMediaId,aLocalDrive)); + OstTraceExt2( TRACE_MEDIACHANGE, DPRIMARYMEDIABASE_CONNECT, "iMediaId=%d; iDriveNumber=%d", iMediaId, aLocalDrive->iDrive->iDriveNumber ); + + TInt r=KErrNone; + if (iDfcQ) { TThreadMessage& m=Kern::Message(); m.iValue=EConnect; m.iArg[0]=aLocalDrive; - return m.SendReceive(&iMsgQ); + r=m.SendReceive(&iMsgQ); + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_CONNECT_EXIT1, this, r ); + return r; } // If no DFC queue, must be a fixed media device // If this is the first connection, open media driver now // Assume no non-primary media exist on this device - TInt r=KErrNone; + NKern::LockSystem(); TBool first=iConnectionQ.IsEmpty(); iConnectionQ.Add(&aLocalDrive->iLink); @@ -1466,8 +1709,10 @@ NKern::UnlockSystem(); } } + if (r==KErrNone) aLocalDrive->iDrive->iMedia=this; + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_CONNECT_EXIT2, this, r ); return r; } @@ -1488,13 +1733,17 @@ */ { + OstTraceFunctionEntryExt( DPRIMARYMEDIABASE_DISCONNECT_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase(%d)::Disconnect %O",iMediaId,aLocalDrive)); + OstTraceExt2( TRACE_MEDIACHANGE, DPRIMARYMEDIABASE_DISCONNECT, "iMediaId=%d; iDriveNumber=%d", iMediaId, aLocalDrive->iDrive->iDriveNumber ); + if (iDfcQ) { TThreadMessage& m=Kern::Message(); m.iValue=EDisconnect; m.iArg[0]=aLocalDrive; m.SendReceive(&iMsgQ); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_DISCONNECT_EXIT1, this ); return; } @@ -1513,6 +1762,7 @@ NKern::UnlockSystem(); if (pD) pD->Close(); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_DISCONNECT_EXIT2, this ); } EXPORT_C TInt DPrimaryMediaBase::Request(TLocDrvRequest& aReq) @@ -1535,10 +1785,13 @@ @see TLocDrvRequest */ { +OstTraceFunctionEntry1( DPRIMARYMEDIABASE_REQUEST_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase(%d)::Request(%08x)",iMediaId,&aReq)); __KTRACE_OPT(KLOCDRV,Kern::Printf("this=%x, ReqId=%d, Pos=%lx, Len=%lx, remote thread %O",this,aReq.Id(),aReq.Pos(),aReq.Length(),aReq.RemoteThread())); + OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DPRIMARYMEDIABASE_REQUEST, "reqId=%d; length=0x%lx; position=0x%lx; remote thread=0x%x", (TInt) aReq.Id(), (TUint) aReq.Length(), (TUint) aReq.Pos(), (TUint) aReq.RemoteThread()); + TInt reqId = aReq.Id(); if (reqId == DLocalDrive::ECaps) @@ -1550,6 +1803,7 @@ aReq.Id()!=DLocalDrive::EWritePasswordStore && // do not require the media aReq.Id()!=DLocalDrive::EPasswordStoreLengthInBytes) // to be ready.) { + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_REQUEST_EXIT, this, r ); return r; } @@ -1576,6 +1830,7 @@ TPtrC8 ptr(NULL, 0); r = Kern::ThreadDesWrite(pT, aReq.RemoteDes(), ptr, aReq.RemoteDesOffset(), KChunkShiftBy0,pC); } + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_REQUEST_EXIT2, this, r ); return r; } @@ -1585,7 +1840,10 @@ TInt maxLength = 0; TInt r = Kern::ThreadGetDesInfo(pT,aReq.RemoteDes(),length,maxLength,linAddress,EFalse); // get descriptor length, maxlength and linAddress if (r != KErrNone) + { + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_REQUEST_EXIT3, this, r ); return r; + } linAddress+= aReq.RemoteDesOffset(); #ifdef __DEMAND_PAGING__ @@ -1608,10 +1866,11 @@ // If this is a ROM/Code paging media, pin writes // If there is a Data paging media registered, pin all requests with descriptors if ( (DataPagingDeviceRegistered) || (reqId == DLocalDrive::EWrite && RomPagingDfcQ(this)) ) + { r = PinSendReceive(aReq, (TLinAddr) linAddress); + } else #endif // __DEMAND_PAGING__ - r = SendReceive(aReq, (TLinAddr) linAddress); } else @@ -1622,7 +1881,7 @@ // Just pass request straight through to media driver r = aReq.CheckAndAdjustForPartition(); if (r == KErrNone) - r = iDriver->Request(aReq); + r = iDriver->Request(aReq); } #ifdef __DEMAND_PAGING__ @@ -1633,7 +1892,7 @@ r = clientBuffer.UpdateDescriptorLength(pT); } #endif - + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_REQUEST_EXIT4, this, r ); return r; } @@ -1641,11 +1900,13 @@ #ifdef __DEMAND_PAGING__ TInt DPrimaryMediaBase::PinSendReceive(TLocDrvRequest& aReq, TLinAddr aLinAddress) { + OstTraceExt2(TRACE_FLOW, DPRIMARYMEDIABASE_PINSENDRECEIVE_ENTRY, "> DPrimaryMediaBase::PinSendReceive;aReq=%x;aLinAddress=%x;", (TUint) &aReq, (TUint) &aLinAddress ); + __ASSERT_DEBUG(ThePinObjectAllocator, LOCM_FAULT()); TInt msgId = aReq.Id(); - + TInt r; switch(msgId) { @@ -1660,26 +1921,37 @@ if (aReq.Int1() || aReq.Int2()) { __KTRACE_OPT(KDATAPAGEWARN, Kern::Printf("Data paging: Naked EControlIO not supported on paging device: fn=%x", aReq.Int0())); - return KErrNotSupported; + r = KErrNotSupported; + break; } // fall into... case 0: - return SendReceive(aReq); + r = SendReceive(aReq); + break; default: // if Int3() is > 0, Int1() is a data pointer, and Int3() is a length if (controlIoType > (TInt) ThePinObjectAllocator->iFragmentGranularity) - return KErrTooBig; + { + r = KErrTooBig; + break; + } if (controlIoType < 0) - return KErrArgument; - return PinFragmentSendReceive(aReq, (TLinAddr) aReq.Ptr1(), controlIoType); + { + r = KErrArgument; + break; + } + r = PinFragmentSendReceive(aReq, (TLinAddr) aReq.Ptr1(), controlIoType); + break; } + break; } case DLocalDrive::ERead: case DLocalDrive::EWrite: { - return PinFragmentSendReceive(aReq, aLinAddress, aReq.Length()); + r = PinFragmentSendReceive(aReq, aLinAddress, aReq.Length()); + break; } // For all these requests, aReq.RemoteDes() points to a buffer on the stack in DLocalDrive::Request() @@ -1696,12 +1968,16 @@ case DLocalDrive::EPasswordErase: default: - return SendReceive(aReq); + r = SendReceive(aReq); } + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_PINSENDRECEIVE_EXIT, this, r ); + return r; } TInt DPrimaryMediaBase::PinFragmentSendReceive(TLocDrvRequest& aReq, TLinAddr aLinAddress, TInt aLength) { + OstTraceExt3(TRACE_FLOW, DPRIMARYMEDIABASE_PINFRAGMENTSENDRECEIVE_ENTRY, "> DPrimaryMediaBase::PinFragmentSendReceive;aReq=%x;aLinAddress=%x;aLength=%d;", (TUint) &aReq, (TUint) &aLinAddress, aLength ); + TLocDrvRequest fragment = aReq; // create a request on the stack for use during fragmentation, pre-fill with the original req args, leave original Kernel message as repository (thread will block, message contents won't change) TInt r = KErrNone; @@ -1713,7 +1989,9 @@ __KTRACE_OPT2(KLOCDPAGING,KLOCDRV,Kern::Printf("Fragmenting Read/Write Request(0x%08x) on drive(%d), remote des(0x%x), offset into des(0x%x), original req Length(0x%x)",&aReq,aReq.Drive()->iDriveNumber,(TInt)(aReq.RemoteDes()),aReq.RemoteDesOffset(),aLength)); __KTRACE_OPT(KLOCDPAGING,Kern::Printf("Remote thread(0x%08x), current thread(0x%08x), start of data to write(0x%08x)",aReq.RemoteThread(),&Kern::CurrentThread(),(TInt)aLinAddress)); - + OstTraceDefExt5(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_PINFRAGMENTSENDRECEIVE1, "Fragmenting Read/Write Request=0x%08x; drive=%d; remote des=0x%x; offset into des=0x%x; original length=0x%x", (TUint) &aReq, (TUint) aReq.Drive()->iDriveNumber, (TInt) (aReq.RemoteDes()), (TInt) aReq.RemoteDesOffset(), (TInt) aLength ); + OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_PINFRAGMENTSENDRECEIVE2, "Remote Thread=0x%08x; current Thread=0x%x; start of data to write=0x%08x", (TUint) aReq.RemoteThread(), (TUint) &Kern::CurrentThread(),(TUint)aLinAddress ); + // don't want this thread to be terminated until last fragment is sent to MD and mem can be free'd up NKern::ThreadEnterCS(); @@ -1786,8 +2064,8 @@ ThePinObjectAllocator->PreAllocatedDataLock().UnlockFragmentation(); #ifdef __DEBUG_DEMAND_PAGING__ - if (dataLockResult < 0) - Kern::Printf("DFragmentationPagingLock::Lock() %d", dataLockResult); + if (dataLockResult < 0) + Kern::Printf("DFragmentationPagingLock::Lock() %d", dataLockResult); #endif if (dataLockResult < 0) // if lock returned an error then give up @@ -1805,7 +2083,8 @@ fragment.Flags() = aReq.Flags(); __KTRACE_OPT2(KLOCDPAGING,KLOCDRV,Kern::Printf("Send fragment (0x%08x) type(%d), length(0x%x), offset within original req(0x%x), pos in media(0x%lx)",&fragment,fragment.Id(), pinnedLen, pos, fragment.Pos())); - + OstTraceDefExt5(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_PINFRAGMENTSENDRECEIVE3, "Send fragment 0x%08x; type=%d; length=0x%x; offset within original req=0x%x; position in media=0x%lx", (TUint) &fragment, (TInt) fragment.Id(), (TUint) pinnedLen, (TUint) pos, (TUint) fragment.Pos()); + #ifdef BTRACE_PAGING_MEDIA TInt buf[4]; buf[0] = pinnedLen; // fragment length @@ -1814,9 +2093,8 @@ buf[3] = (TInt)&pT->iNThread; // thread that issued the original write req BTraceContextN(BTrace::EPagingMedia,BTrace::EPagingMediaLocMedFragmentBegin,&fragment,fragment.Id(),buf,sizeof(buf)); #endif - r = SendReceive(fragment, aLinAddress); // only come back here when message (fragment) has been completed - + // unpin memory if (pinDataObject) { @@ -1842,6 +2120,7 @@ // Kern::Printf("<PFSR %02X aReq %08X aLinAddress %08X aLen %08X offset %08X", aReq.Id(), &aReq, aLinAddress, aLength, aReq.RemoteDesOffset()); + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_PINFRAGMENTSENDRECEIVE_EXIT, this, r ); return r; } @@ -1860,6 +2139,8 @@ * @see DDmaHelper::SendReceive() */ { + OstTraceExt2( TRACE_FLOW, DPRIMARYMEDIABASE_SENDRECEIVE_ENTRY, "> DPrimaryMediaBase::SendReceive;aReq=%x;aLinAddress=%x", (TUint) &aReq, (TUint) &aLinAddress ); + DDmaHelper* dmaHelper = aReq.Drive()->iDmaHelper; #ifdef __DEMAND_PAGING__ @@ -1871,12 +2152,14 @@ if (dmaHelper) r = dmaHelper->SendReceive(aReq, aLinAddress); else + { r = aReq.SendReceive(&iMsgQ); - + } #ifdef __DEMAND_PAGING__ RequestCountDec(); #endif + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_SENDRECEIVE_EXIT, this, r ); return r; } @@ -1960,6 +2243,8 @@ @see TLocDrvRequest */ { + OstTrace1( TRACE_FLOW, DPRIMARYMEDIABASE_HANDLEMSG_ENTRY, "> DPrimaryMediaBase::HandleMsg;m=%x;", (TUint) &m); + switch (m.iValue) { case EConnect: @@ -1967,6 +2252,7 @@ DLocalDrive* pD=(DLocalDrive*)m.Ptr0(); iConnectionQ.Add(&pD->iLink); m.Complete(KErrNone, EFalse); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT1, this ); return; } case EDisconnect: @@ -1981,6 +2267,7 @@ pD->Deque(); m.Complete(KErrNone, EFalse); } + OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT2, this ); return; } case DLocalDrive::EForceMediaChange: @@ -1996,6 +2283,7 @@ if (!IsRemovableDevice(sock)) { CompleteRequest(m, KErrNotSupported); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT3, this ); return; } // wait for power up and then call DPrimaryMediaBase::DoRequest() @@ -2014,6 +2302,7 @@ r=KErrNone; CompleteRequest(m, r); } + OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT4, this ); return; } case DLocalDrive::ECaps: @@ -2023,6 +2312,7 @@ // - Issue the ECaps request without powering the media back up. DoRequest(m); __TRACE_TIMING(0x101); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT5, this ); return; } break; @@ -2051,6 +2341,7 @@ TLocDrv* pL=pD->iDrive; *((TErrorInfo*) m.RemoteDes()) = pL->iLastErrorInfo; CompleteRequest(m, KErrNone); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT6, this ); return; } case DLocalDrive::EReadPasswordStore: @@ -2059,6 +2350,7 @@ TInt r = ThePasswordStore->ReadPasswordData(pswData); m.Length() = pswData.Length(); CompleteRequest(m, r); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT7, this ); return; } case DLocalDrive::EWritePasswordStore: @@ -2069,6 +2361,7 @@ if(r != KErrNone) { CompleteRequest(m, r); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT8, this ); return; } @@ -2078,6 +2371,7 @@ // Don't try to power up the device if it's not ready. // - Note that this isn't an error that needs to be returned to the client. CompleteRequest(m, KErrNone); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT9, this ); return; } @@ -2088,22 +2382,27 @@ TInt length = ThePasswordStore->PasswordStoreLengthInBytes(); *(TInt*) m.RemoteDes() = length; CompleteRequest(m, KErrNone); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT10, this ); return; } default: CHECK_RET(KErrNotSupported); CompleteRequest(m, KErrNotSupported); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT11, this ); return; } __KTRACE_OPT(KFAIL,Kern::Printf("mdrq %d",m.Id())); __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase(%d)::HandleMsg state %d req %d",iMediaId,iState,m.Id())); + OstTraceDefExt3( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DPRIMARYMEDIABASE_HANDLEMSG2, "iMediaId=%d; iState=%d; req Id=%d", iMediaId, iState, m.Id()); + // if media driver already open, pass request through if (iState==EReady) { DoRequest(m); __TRACE_TIMING(0x101); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT12, this ); return; } @@ -2118,11 +2417,13 @@ __ASSERT_ALWAYS( ((m.Flags() & TLocDrvRequest::ECodePaging) == 0) || (m.Drive()->iPagingDrv), LOCM_FAULT()); __KTRACE_OPT2(KLOCDPAGING,KLOCDRV,Kern::Printf("Deferring PageIn request 0x%08x because opening or closing",&m)); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_HANDLEMSG3, "Deferring PageIn request 0x%08x because opening or closing", &m); iBody->iPagingDevice->SendToDeferredQ(&m); } else #endif m.Forward(&iDeferred,EFalse); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT13, this ); return; } @@ -2144,6 +2445,7 @@ __ASSERT_DEBUG(iPagingMedia,LOCM_FAULT()); __ASSERT_DEBUG(iBody->iPagingDevice,LOCM_FAULT()); __KTRACE_OPT(KLOCDPAGING,Kern::Printf("Page request 0x%08x received -> opening MD",&m)); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_HANDLEMSG4, "Page request 0x%08x received; opening MD", &m); } #endif // _DEBUG @@ -2163,11 +2465,13 @@ if (r==KErrNone || r==KErrServerBusy) { // wait for completion of power up request + OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT14, this ); return; } if (r==KErrCompletion) r=KErrNone; // device already powered up PowerUpComplete(r); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT15, this ); } EXPORT_C TInt DPrimaryMediaBase::DoRequest(TLocDrvRequest& m) @@ -2188,11 +2492,14 @@ */ { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_DOREQUEST_ENTRY, this ); __KTRACE_OPT2(KLOCDRV,KLOCDPAGING,Kern::Printf("DPrimaryMediaBase::DoRequest %d",m.Id())); TLocDrv* pL=m.Drive(); DMedia* media=pL->iMedia; TInt r=KErrNone; - + + OstTraceDefExt3( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DPRIMARYMEDIABASE_DOREQUEST, "req Id=%d; length=0x%x; position=0x%x", (TInt) m.Id(), (TInt) m.Length(), (TInt) m.Pos()); + // re-open this drive's media driver ? if (m.iValue == DLocalDrive::EForceMediaChange) { @@ -2210,6 +2517,7 @@ NotifyClients(ETrue,pL); CompleteRequest(m, r); + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_DOREQUEST_EXIT, this, r ); return r; } @@ -2228,6 +2536,7 @@ if(iTotalPartitionsOpened == 0) { UpdatePartitionInfo(); + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_DOREQUEST_EXIT2, this, KErrNone ); return KErrNone; } if (!(m.Flags() & TLocDrvRequest::EAdjusted)) @@ -2239,6 +2548,7 @@ } if (r==KErrNone) { + OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_INTERNALS, DPRIMARYMEDIABASE_DOREQUEST_START, "req Id=%d; Remote Thread=0x%x", (TInt) m.Id(), (TUint) m.RemoteThread()); r=media->iDriver->Request(m); if (r>0) { @@ -2250,6 +2560,7 @@ __ASSERT_ALWAYS( ((m.Flags() & TLocDrvRequest::ECodePaging) == 0) || (m.Drive()->iPagingDrv), LOCM_FAULT()); __ASSERT_DEBUG(iBody->iPagingDevice,LOCM_FAULT()); __KTRACE_OPT2(KLOCDPAGING,KLOCDRV,Kern::Printf("Defer PageIn request 0x%08x",&m)); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_DOREQUEST2, "Defer PageIn request 0x%08x", &m); DMediaPagingDevice* pagingdevice=iBody->iPagingDevice; #ifdef __CONCURRENT_PAGING_INSTRUMENTATION__ @@ -2291,7 +2602,10 @@ } #if defined(__DEMAND_PAGING__) && defined(_DEBUG) else if (r == KErrNone && DMediaPagingDevice::PagingRequest(m)) + { __KTRACE_OPT(KLOCDPAGING,Kern::Printf("PageIn req 0x%08x completing asynchronously",&m)); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_DOREQUEST3, "PageIn req 0x%08x completing asynchronously", &m); + } #endif } } @@ -2309,16 +2623,18 @@ __ASSERT_ALWAYS( ((m.Flags() & TLocDrvRequest::ECodePaging) == 0) || (m.Drive()->iPagingDrv), LOCM_FAULT()); __ASSERT_DEBUG(iBody->iPagingDevice,LOCM_FAULT()); __KTRACE_OPT(KLOCDPAGING,Kern::Printf("media driver cannot service or defer PageIn request 0x%08x or serviced it synchronously (%d)",&m, s)); + OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_DOREQUEST4, "Media driver cannot service or defer PageIn request 0x%08x or serviced it synchronously; retval=%d",(TUint) &m, s); iBody->iPagingDevice->CompleteRequest(&m, s); } else #endif CompleteRequest(m, s); - + OstTraceDefExt3( OST_TRACE_CATEGORY_RND, TRACE_INTERNALS, DPRIMARYMEDIABASE_DOREQUEST_RETURN, "Return req Id=%d; Remote Thread=0x%x; retval=%d", (TInt) m.Id(), (TUint) m.RemoteThread(), (TInt) s); } iCurrentReq=NULL; + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_DOREQUEST_EXIT3, this, r ); return r; } @@ -2333,12 +2649,17 @@ @param anError Error code to be passed on while completing outstanding requests. */ { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_POWERUPCOMPLETE_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf(">DPrimaryMediaBase(%d)::PowerUpComplete err %d iState %d",iMediaId,anError,iState)); + + OstTraceExt3( TRACE_INTERNALS, DPRIMARYMEDIABASE_POWERUPCOMPLETE, "iMediaId=%d; anError=%d; iState=%d", iMediaId, anError, iState ); + if (anError!=KErrNone) { // error powering up device if (iState==EPoweringUp1 || iState==EPoweringUp2) SetClosed(anError); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_POWERUPCOMPLETE_EXIT, this ); return; } @@ -2353,18 +2674,22 @@ // media is powered up and ready, so handle the current/pending requests MediaReadyHandleRequest(); } + OstTraceFunctionExit1( DPRIMARYMEDIABASE_POWERUPCOMPLETE_EXIT2, this ); } void DPrimaryMediaBase::CloseMediaDrivers(DMedia* aMedia) { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_CLOSEMEDIADRIVERS_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf(">DPrimaryMediaBase(%d)::CloseMediaDrivers",iMediaId)); - + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_MEDIACHANGE, DPRIMARYMEDIABASE_CLOSEMEDIADRIVERS1, "DPrimaryMediaBase iMediaId=%d", iMediaId ); + // we mustn't ever close the media driver if it's responsible for data paging as re-opening the drive // would involve memory allocation which might cause deadlock if the kernel heap were to grow #ifdef __DEMAND_PAGING__ if (DataPagingDfcQ(this)) { __KTRACE_OPT(KLOCDRV,Kern::Printf("CloseMediaDrivers aborting for data paging media %08X", this)); + OstTrace1(TRACE_FLOW, DPRIMARYMEDIABASE_CLOSEMEDIADRIVERS_EXIT1, "CloseMediaDrivers aborting for data paging media 0x%08x", this); return; } #endif @@ -2376,6 +2701,7 @@ if (pL && pL->iPrimaryMedia==this) { __KTRACE_OPT(KLOCDRV,Kern::Printf("Drive %d",i)); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_MEDIACHANGE, DPRIMARYMEDIABASE_CLOSEMEDIADRIVERS2, "Drive=%d", i ); if (aMedia == NULL || pL->iMedia == aMedia) { pL->iMedia=NULL; @@ -2390,16 +2716,20 @@ DMediaDriver* pD=pM->iDriver; pM->iDriver=NULL; __KTRACE_OPT(KLOCDRV,Kern::Printf("DMedia[%d] @ %08x Driver @ %08x",i,pM,pD)); + OstTraceDefExt3( OST_TRACE_CATEGORY_RND, TRACE_MEDIACHANGE, DPRIMARYMEDIABASE_CLOSEMEDIADRIVERS3, "MediaId=%d; DMedia=0x%08x; MediaDriver=0x%08x", (TInt) i, (TUint) pM, (TUint) pD ); if (pD) pD->Close(); } } __KTRACE_OPT(KLOCDRV,Kern::Printf("<DPrimaryMediaBase(%d)::CloseMediaDrivers",iMediaId)); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_CLOSEMEDIADRIVERS_EXIT2, this ); } void DPrimaryMediaBase::StartOpenMediaDrivers() { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_STARTOPENMEDIADRIVERS_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase(%d)::StartOpenMediaDrivers",iMediaId)); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_MEDIACHANGE, DPRIMARYMEDIABASE_STARTOPENMEDIADRIVERS, "DPrimaryMediaBase iMediaId=%d ",iMediaId); TVersion ver(KMediaDriverInterfaceMajorVersion,KMediaDriverInterfaceMinorVersion,KMediaDriverInterfaceBuildVersion); // Get a list of all currently loaded media drivers @@ -2414,6 +2744,7 @@ { // out of memory or no driver exists SetClosed(r); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_STARTOPENMEDIADRIVERS_EXIT1, this ); return; } @@ -2424,12 +2755,15 @@ iMediaDriversOpened=0; iNextMediaDriver=NULL; OpenNextMediaDriver(); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_STARTOPENMEDIADRIVERS_EXIT2, this ); } void DPrimaryMediaBase::OpenNextMediaDriver() { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_OPENNEXTMEDIADRIVER_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase(%d)::OpenNextMediaDriver, this %x mediaId %d iBody->iPhysDevIndex %d",iNextMediaId, this, iMediaId, iBody->iPhysDevIndex)); - + OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_MEDIACHANGE, DPRIMARYMEDIABASE_OPENNEXTMEDIADRIVER, "DPrimaryMediaBase iNextMediaId=%d; this=%x; imediaId=%d; iBody->iPhysDevIndex=%d",iNextMediaId, (TUint) this, iMediaId, iBody->iPhysDevIndex); + TVersion ver(KMediaDriverInterfaceMajorVersion,KMediaDriverInterfaceMinorVersion,KMediaDriverInterfaceBuildVersion); SPhysicalDeviceEntry& e=iPhysDevArray[iBody->iPhysDevIndex]; DPhysicalDevice* pD=e.iPhysicalDevice; @@ -2441,25 +2775,30 @@ { iNextMediaDriver = pM->iDriver; DoOpenMediaDriverComplete(KErrNone); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_OPENNEXTMEDIADRIVER_EXIT1, this ); return; } // this may be asynchronous TInt s=pD->Create( (DBase*&)iNextMediaDriver, iMediaId, (TDesC8*) &iMountInfo, ver); - + __KTRACE_OPT(KLOCDRV,Kern::Printf("Media:Open-Opening %o(PRI:%d)-%d",pD,e.iPriority,s)); if (s!=KErrNone) { iAsyncErrorCode=s; iAsyncDfc.Enque(); } + OstTraceFunctionExit1( DPRIMARYMEDIABASE_OPENNEXTMEDIADRIVER_EXIT2, this ); } // Called when a media driver has responded to the Open request void DPrimaryMediaBase::DoOpenMediaDriverComplete(TInt anError) { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_DOOPENMEDIADRIVERCOMPLETE_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase(%d)::DoOpenMediaDriverComplete error %d iNextMediaDriver %x",iNextMediaId,anError,iNextMediaDriver)); - + OstTraceDefExt3( OST_TRACE_CATEGORY_RND, TRACE_MEDIACHANGE, DPRIMARYMEDIABASE_DOOPENMEDIADRIVERCOMPLETE, "iMediaId=%d; anError=%d; iNextMediaDriver=0x%x", (TInt) iNextMediaId, (TInt) anError, (TUint) iNextMediaDriver); + + if (anError!=KErrNone) { DMediaDriver* md = iNextMediaDriver; @@ -2472,6 +2811,7 @@ // if it's not ready or we're out of memory, abort CloseMediaDrivers(); SetClosed(anError); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_DOOPENMEDIADRIVERCOMPLETE_EXIT1, this ); return; } if (anError==KErrNone) @@ -2484,6 +2824,7 @@ ++iMediaDriversOpened; } + // if no error, read partition info on media iState = EReadPartitionInfo; @@ -2502,12 +2843,16 @@ { DoPartitionInfoComplete(anError); } + OstTraceFunctionExit1( DPRIMARYMEDIABASE_DOOPENMEDIADRIVERCOMPLETE_EXIT2, this ); } void DPrimaryMediaBase::DoPartitionInfoComplete(TInt anError) { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_DOPARTITIONINFOCOMPLETE_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase(%d)::DoPartitionInfoComplete error %d",iNextMediaId,anError)); + OstTraceExt2( TRACE_INTERNALS, DPRIMARYMEDIABASE_DOPARTITIONINFOCOMPLETE1, "iNextMediaId=%d; anError=%d", iNextMediaId, anError ); + DMedia* pM=TheMedia[iNextMediaId]; if (anError==KErrNone || anError == KErrLocked) { @@ -2523,6 +2868,7 @@ if (DataPagingDfcQ(this)) { __KTRACE_OPT(KLOCDRV,Kern::Printf("DoPartitionInfoComplete(%d) Close Media Driver aborted for data paging media %08X", this)); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_DOPARTITIONINFOCOMPLETE2, "Close Media Driver for data paging media 0x%08x", this); } else #endif @@ -2536,6 +2882,7 @@ // if it's not ready or we're out of memory, or the drive is locked, abort CloseMediaDrivers(); SetClosed(anError); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_DOPARTITIONINFOCOMPLETE_EXIT, this ); return; } } @@ -2551,14 +2898,17 @@ if (!complete) { OpenNextMediaDriver(); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_DOPARTITIONINFOCOMPLETE_EXIT2, this ); return; } __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase %d All media drivers open & partitions read",iMediaId)); __KTRACE_OPT(KLOCDRV,Kern::Printf("%d media drivers opened",iMediaDriversOpened)); + OstTrace1( TRACE_INTERNALS, DPRIMARYMEDIABASE_DOPARTITIONINFOCOMPLETE3, "iMediaDriversOpened=%d", iMediaDriversOpened ); if (iMediaDriversOpened==0) { SetClosed(KErrNotSupported); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_DOPARTITIONINFOCOMPLETE_EXIT3, this ); return; } @@ -2568,12 +2918,14 @@ // Finished reading partition info __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase %d Read partition info complete",iMediaId)); __KTRACE_OPT(KLOCDRV,Kern::Printf("%d total partitions",iTotalPartitionsOpened)); + OstTraceExt2( TRACE_INTERNALS, DPRIMARYMEDIABASE_DOPARTITIONINFOCOMPLETE4, "Read partition info complete iMediaId=%d; iPartitionsOpened=%d", iMediaId, iTotalPartitionsOpened ); if (iTotalPartitionsOpened==0) { SetClosed(KErrNotSupported); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_DOPARTITIONINFOCOMPLETE_EXIT4, this ); return; } - + // work out mapping of drives to partitions/media TInt totalPartitions=iTotalPartitionsOpened; TInt id=iMediaId; // start with primary media @@ -2597,6 +2949,8 @@ partitionsOnThisMedia=TheMedia[id]->PartitionCount(); } __KTRACE_OPT(KLOCDRV,Kern::Printf("Drive %d = Media %d Partition %d",j,id,partition)); + OstTraceExt3( TRACE_INTERNALS, DPRIMARYMEDIABASE_DOPARTITIONINFOCOMPLETE5, "Local Drive=%d; iMediaId=%d; partition=%d", j, id, partition ); + pD->iMedia=TheMedia[id]; pD->iPartitionNumber=partition; memcpy(pD, pD->iMedia->iPartitionInfo.iEntry+partition, sizeof(TPartitionEntry)); @@ -2607,10 +2961,12 @@ // media is now ready - handle current or deferred requests MediaReadyHandleRequest(); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_DOPARTITIONINFOCOMPLETE_EXIT5, this ); } void DPrimaryMediaBase::MediaReadyHandleRequest() { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_MEDIAREADYHANDLEREQUEST_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase::MediaReadyHandleRequest() this %x", this)); iState = EReady; @@ -2623,10 +2979,12 @@ // see if we can process any other requests concurrently RunDeferred(); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_MEDIAREADYHANDLEREQUEST_EXIT, this ); } void DPrimaryMediaBase::UpdatePartitionInfo() { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_UPDATEPARTITIONINFO_ENTRY, this ); iState=EReadPartitionInfo; iNextMediaId=iMediaId; DMedia* pM=TheMedia[iNextMediaId]; @@ -2637,10 +2995,12 @@ r=KErrNone; DoPartitionInfoComplete(r); } + OstTraceFunctionExit1( DPRIMARYMEDIABASE_UPDATEPARTITIONINFO_EXIT, this ); } void DPrimaryMediaBase::CompleteCurrent(TInt anError) { + OstTraceFunctionEntryExt( DPRIMARYMEDIABASE_COMPLETECURRENT_ENTRY, this ); if (iCurrentReq) { CHECK_RET(anError); @@ -2653,6 +3013,7 @@ __ASSERT_ALWAYS( ((iCurrentReq->Flags() & TLocDrvRequest::ECodePaging) == 0) || (iCurrentReq->Drive()->iPagingDrv), LOCM_FAULT()); __KTRACE_OPT2(KLOCDPAGING,KFAIL,Kern::Printf("Got here because it was powered down when powering up, or failed powering up or failed opening MD or got media change")); + OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_COMPLETECURRENT, "Completed request due to powered down when powering up, or failed powering up or failed opening MD or got media change"); iBody->iPagingDevice->CompleteRequest(iCurrentReq, anError); } else @@ -2660,12 +3021,16 @@ CompleteRequest(*iCurrentReq, anError); iCurrentReq=NULL; } + OstTraceFunctionExit1( DPRIMARYMEDIABASE_COMPLETECURRENT_EXIT, this ); } void DPrimaryMediaBase::CompleteRequest(TLocDrvRequest& aMsg, TInt aResult) { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_COMPLETEREQUEST_ENTRY, this ); + OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DPRIMARYMEDIABASE_COMPLETEREQUEST1, "TLocDrvRequest Object=0x%x; aResult=%d", (TUint) &aMsg, aResult); aMsg.Complete(aResult,EFalse); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_COMPLETEREQUEST_EXIT, this ); } EXPORT_C void DPrimaryMediaBase::RunDeferred() @@ -2676,12 +3041,16 @@ or DPrimaryMediaBase::NotifyEmergencyPowerDown() function or DMediaDriver::Complete() */ { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_RUNDEFERRED_ENTRY, this ); // Do nothing if an open or close is in progress - this might be the case, for example, // if a EForceMediaChange request (with the KForceMediaChangeReOpenMediaDriver flag) // has recently been processed if (iState!=EReady && iState!=EClosed && iState!=EPoweredDown) + { + OstTraceFunctionExit1( DPRIMARYMEDIABASE_RUNDEFERRED_EXIT1, this ); return; - + } + // rerun deferred requests; #ifdef __DEMAND_PAGING__ #ifdef __CONCURRENT_PAGING_INSTRUMENTATION__ @@ -2695,6 +3064,7 @@ if(iBody->iPagingDevice->iEmptyingQ & DMediaPagingDevice::EDeferredQ) // if already emptying deferred page in queue, don't reenter { __KTRACE_OPT(KLOCDPAGING,Kern::Printf("Already emptying deferred queue")); + OstTrace0(TRACE_FLOW, DPRIMARYMEDIABASE_RUNDEFERRED_EXIT2, "< Already emptying deferred queue"); return; } @@ -2723,6 +3093,7 @@ } #endif __KTRACE_OPT(KLOCDPAGING,Kern::Printf("RunDeferred: process req 0x%08x, last in deferred queue 0x%08x",pM,pL)); + OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_RUNDEFERRED2, "process req=0x%08x; last in deferred queue=0x%08x",(TUint) pM, (TUint) pL); #ifdef BTRACE_PAGING_MEDIA BTraceContext8(BTrace::EPagingMedia,BTrace::EPagingMediaLocMedPageInDeferredReposted,pM,pM->iValue); #endif @@ -2743,6 +3114,7 @@ if(pagingdevice->iEmptyingQ & DMediaPagingDevice::EMainQ) // already emptying main Page In queue, skip (any Page In requests will be deferred) { __KTRACE_OPT(KLOCDPAGING,Kern::Printf("Already emptying main queue")); + OstTrace0(TRACE_FLOW, DPRIMARYMEDIABASE_RUNDEFERRED_EXIT3, "< Already emptying main queue"); return; } @@ -2773,6 +3145,7 @@ #endif __KTRACE_OPT(KLOCDPAGING,Kern::Printf("RunDeferred: process req 0x%08x",pM)); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_RUNDEFERRED4, "process req=0x%08x", pM); DoRequest(*(TLocDrvRequest*)pM); // if Page In requests are synchronous this services them all in sequence, if they're asynch it defers them } @@ -2793,21 +3166,31 @@ } // if(iPagingMedia) #endif if (iRunningDeferred) + { + OstTraceFunctionExit1( DPRIMARYMEDIABASE_RUNDEFERRED_EXIT4, this ); return; + } TMessageBase* pL = iDeferred.Last(); if (!pL) + { + OstTraceFunctionExit1( DPRIMARYMEDIABASE_RUNDEFERRED_EXIT5, this ); return; // no deferred requests + } iRunningDeferred=1; TMessageBase* pM=NULL; while( pM != pL && (pM=iDeferred.Poll()) != NULL) // stop after processing last one (requests may be re-deferred) DoRequest(*(TLocDrvRequest*)pM); iRunningDeferred=0; + + OstTraceFunctionExit1( DPRIMARYMEDIABASE_RUNDEFERRED_EXIT6, this ); } void DPrimaryMediaBase::SetClosed(TInt anError) { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_SETCLOSED_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase(%d)::SetClosed error %d",iMediaId,anError)); + OstTraceExt2( TRACE_MEDIACHANGE, DPRIMARYMEDIABASE_SETCLOSED, "iMediaId=%d; anError=%d", iMediaId, anError ); CHECK_RET(anError); // cancel DMediaDriver::OpenMediaDriverComplete() / DMediaDriver::PartitionInfoComplete() DFC @@ -2830,6 +3213,7 @@ iState = EClosed; iWaitMedChg.CompleteAll(KErrNone); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_SETCLOSED_EXIT, this ); } void DPrimaryMediaBase::NotifyClients(TBool aMediaChange,TLocDrv* aLocDrv) @@ -2838,6 +3222,8 @@ // Notify all clients of a media change or power-down event // { + OstTraceFunctionEntryExt( DPRIMARYMEDIABASE_NOTIFYCLIENTS_ENTRY, this ); + SDblQueLink* pL=iConnectionQ.iA.iNext; while (pL!=&iConnectionQ.iA) { @@ -2848,6 +3234,7 @@ pD->NotifyChange(*this, aMediaChange); pL=pL->iNext; } + OstTraceFunctionExit1( DPRIMARYMEDIABASE_NOTIFYCLIENTS_EXIT, this ); } EXPORT_C void DPrimaryMediaBase::NotifyMediaChange() @@ -2857,8 +3244,11 @@ This also completes any force media change requests with KErrNone. */ { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_NOTIFYMEDIACHANGE_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase(%d)::NotifyMediaChange state %d",iMediaId,iState)); + OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_MEDIACHANGE, DPRIMARYMEDIABASE_NOTIFYMEDIACHANGE, "iMediaId=%d; iState=%d", iMediaId, iState ); + TInt state=iState; __ASSERT_DEBUG(iBody, LOCM_FAULT()); @@ -2888,6 +3278,7 @@ // complete any force media change requests iWaitMedChg.CompleteAll(KErrNone); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_NOTIFYMEDIACHANGE_EXIT, this ); } @@ -2899,8 +3290,11 @@ */ { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_NOTIFYPOWERDOWN_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase(%d)::NotifyPowerDown state %d",iMediaId,iState)); - + + OstTraceExt2( TRACE_INTERNALS, DPRIMARYMEDIABASE_NOTIFYPOWERDOWN, "iMediaId=%d; iState=%d", iMediaId, iState ); + TInt id; TBool allPersistent = ETrue; TBool allOpen = ETrue; @@ -2928,6 +3322,7 @@ } __KTRACE_OPT(KLOCDRV,Kern::Printf("allPersistent(%d)::allOpen %d",allPersistent, allOpen)); + OstTraceExt2( TRACE_INTERNALS, DPRIMARYMEDIABASE_NOTIFYPOWERDOWN2, "allPersistent=%d; allOpen=%d", allPersistent, allOpen ); if (allPersistent && allOpen && iState == EReady) { @@ -2950,6 +3345,7 @@ } NotifyClients(EFalse); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_NOTIFYPOWERDOWN_EXIT, this ); } @@ -2960,8 +3356,10 @@ */ { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_NOTIFYPSUFAULT_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase(%d)::NotifyPsuFault state %d, err %d",iMediaId,iState,anError)); - + OstTraceExt3( TRACE_INTERNALS, DPRIMARYMEDIABASE_NOTIFYPSUFAULT, "iMediaId=%d; iState=%d; anError=%d", iMediaId, iState, anError ); + if (iState>=EOpening) { CloseMediaDrivers(); @@ -2969,6 +3367,7 @@ // complete any outstanding requests with error SetClosed(anError); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_NOTIFYPSUFAULT_EXIT, this ); } EXPORT_C void DPrimaryMediaBase::NotifyEmergencyPowerDown() @@ -2979,7 +3378,10 @@ It closes all media drivers and notifies all clients of a power down event. */ { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_NOTIFYEMERGENCYPOWERDOWN_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase(%d)::NotifyEmergencyPowerDown state %d",iMediaId,iState)); + OstTraceExt2( TRACE_INTERNALS, DPRIMARYMEDIABASE_NOTIFYEMERGENCYPOWERDOWN, "iMediaId=%d; iState=%d", iMediaId, iState ); + TBool recover=EFalse; if (iState==EReady && iCritical!=0) { @@ -3013,6 +3415,7 @@ CloseMediaDrivers(); SetClosed(KErrNotReady); NotifyClients(EFalse); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_NOTIFYEMERGENCYPOWERDOWN_EXIT, this ); } EXPORT_C void DPrimaryMediaBase::NotifyMediaPresent() @@ -3020,7 +3423,9 @@ Notifies clients of a media change by calling NotifyClients ( ) function to indicate that media is present. */ { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_NOTIFYMEDIAPRESENT_ENTRY, this ); NotifyClients(ETrue); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_NOTIFYMEDIAPRESENT_EXIT, this ); } EXPORT_C TInt DPrimaryMediaBase::DoInCritical() @@ -3054,20 +3459,27 @@ TInt DPrimaryMediaBase::InCritical() { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_INCRITICAL_ENTRY, this ); if (iCritical==0) { TInt r=DoInCritical(); if (r!=KErrNone) + { + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_INCRITICAL_EXIT1, this, r ); return r; + } } ++iCritical; + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_INCRITICAL_EXIT2, this, KErrNone ); return KErrNone; } void DPrimaryMediaBase::EndInCritical() { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_ENDINCRITICAL_ENTRY, this ); if (--iCritical==0) DoEndInCritical(); + OstTraceFunctionExit1( DPRIMARYMEDIABASE_ENDINCRITICAL_EXIT, this ); } EXPORT_C void DPrimaryMediaBase::DeltaCurrentConsumption(TInt /*aCurrent*/) @@ -3086,7 +3498,11 @@ // Synchronous open for devices with no DFC queue (e.g. IRAM) // { + OstTraceFunctionEntry1( DPRIMARYMEDIABASE_OPENMEDIADRIVER_ENTRY, this ); + __KTRACE_OPT(KLOCDRV,Kern::Printf(">DPrimaryMediaBase:OpenMediaDriver-%d",iMediaId)); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_MEDIACHANGE, DPRIMARYMEDIABASE_OPENMEDIADRIVER1, "iMediaId=%d", iMediaId); + TVersion ver(KMediaDriverInterfaceMajorVersion,KMediaDriverInterfaceMinorVersion,KMediaDriverInterfaceBuildVersion); // Get a list of all currently loaded media drivers @@ -3098,8 +3514,10 @@ // using LocDrv::RegisterMediaDevice(). TInt r=iPhysDevArray.GetDriverList(KLitMediaDriverName,iDevice,iMountInfo.iInfo,ver); if (r!=KErrNone) + { + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_OPENMEDIADRIVER_EXIT1, this, r ); return r; - + } // Go through them starting with highest priority TInt totalPartitions=0; TInt c=iPhysDevArray.Count(); // can't be zero @@ -3114,6 +3532,7 @@ TInt s=pD->Create( (DBase*&)pM, iMediaId, NULL, ver); __KTRACE_OPT(KLOCDRV,Kern::Printf("Media:Open-Opening %o(PRI:%d)-%d",pD,iPhysDevArray[i].iPriority,s)); + OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_MEDIACHANGE, DPRIMARYMEDIABASE_OPENMEDIADRIVER2, "Media:Open-Opening 0x%x iPriority=%d; retval=%d", (TUint) pD, (TUint) iPhysDevArray[i].iPriority, (TUint) s); if (s!=KErrNone && pM) { pM->Close(); @@ -3183,6 +3602,7 @@ } __KTRACE_OPT(KLOCDRV,Kern::Printf("<DPrimaryMediaBase:OpenMediaDriver-%d",r)); + OstTraceFunctionExitExt( DPRIMARYMEDIABASE_OPENMEDIADRIVER_EXIT2, this, r ); return r; } @@ -3197,6 +3617,9 @@ __ASSERT_DEBUG(iBody, LOCM_FAULT()); TInt oldVal = (TInt) __e32_atomic_add_ord32(&iBody->iRequestCount, (TUint) 1); //Kern::Printf("RCINC: this %x cnt %d, old %d", this, iBody->iRequestCount, oldVal); + + OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_REQUESTCOUNTINC, "new count=%d; old count=%d", iBody->iRequestCount, oldVal ); + if (oldVal == 0 && iBody->iPagingDevice) { //Kern::Printf("RCINC: NotifyBusy()"); @@ -3214,6 +3637,9 @@ __ASSERT_DEBUG(iBody, LOCM_FAULT()); TInt oldVal = (TInt) __e32_atomic_add_ord32(&iBody->iRequestCount, (TUint) -1); //Kern::Printf("RCDEC: this %x cnt %d, old %d", this, iBody->iRequestCount, oldVal); + + OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_REQUESTCOUNTDEC, "new count=%d; old count=%d", iBody->iRequestCount, oldVal ); + if (oldVal == 1 && iBody->iPagingDevice) { //Kern::Printf("RCDEC: NotifyIdle()"); @@ -3223,7 +3649,6 @@ } #endif // __DEMAND_PAGING__ - TPartitionInfo::TPartitionInfo() // // Constructor @@ -3236,6 +3661,7 @@ void pageInDfc(TAny* aPtr) { + OstTraceFunctionEntry0( _PAGEINDFC_ENTRY ); __KTRACE_OPT2(KLOCDRV,KLOCDPAGING,Kern::Printf("pageInDfc")); DPrimaryMediaBase* primaryMedia=(DPrimaryMediaBase*)aPtr; __ASSERT_ALWAYS(primaryMedia && primaryMedia->iPagingMedia && primaryMedia->iBody->iPagingDevice,LOCM_FAULT()); @@ -3262,6 +3688,7 @@ (m->iValue == DMediaPagingDevice::ERomPageInRequest)?(countROM++):(countCode++); #endif __KTRACE_OPT(KLOCDPAGING, Kern::Printf("pageInDfc: process request 0x%08x, last in queue 0x%08x",m, pagingdevice->iMainQ.Last()) ); + OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, PAGEINDFC2, "process request=0x%08x; last in queue=0x%08x",(TUint) m, (TUint) pagingdevice->iMainQ.Last()); primaryMedia->HandleMsg(*m); } @@ -3276,6 +3703,7 @@ #endif pagingdevice->iMainQ.Receive(); // allow reception of more messages + OstTraceFunctionExit0( _PAGEINDFC_EXIT ); } DMediaPagingDevice::DMediaPagingDevice(DPrimaryMediaBase* aPtr) @@ -3287,6 +3715,7 @@ ,iServicingROM(NULL), iServicingCode(NULL) #endif { + OstTraceFunctionEntry1( DMEDIAPAGINGDEVICE_DMEDIAPAGINGDEVICE_CONSTRUCTOR_ENTRY, this ); iPrimaryMedia = aPtr; if (iPrimaryMedia->iDfcQ) // media driver has its own thread { @@ -3307,10 +3736,12 @@ #endif iMainQ.Receive(); + OstTraceFunctionExit1( DMEDIAPAGINGDEVICE_DMEDIAPAGINGDEVICE_CONSTRUCTOR_EXIT, this ); } DMediaPagingDevice::~DMediaPagingDevice() { +OstTraceFunctionEntry1( DMEDIAPAGINGDEVICE_DMEDIAPAGINGDEVICE_DESTRUCTOR_ENTRY, this ); if (iMountInfoDataLock) ThePinObjectAllocator->ReleasePinObject((DPinObjectAllocator::SVirtualPinContainer*) iMountInfoDataLock); @@ -3320,11 +3751,13 @@ if (iMountInfoDescLenLock) ThePinObjectAllocator->ReleasePinObject((DPinObjectAllocator::SVirtualPinContainer*) iMountInfoDescLenLock); + OstTraceFunctionExit1( DMEDIAPAGINGDEVICE_DMEDIAPAGINGDEVICE_DESTRUCTOR_EXIT, this ); } void DMediaPagingDevice::SendToMainQueueDfcAndBlock(TThreadMessage* aMsg) { + OstTraceFunctionEntryExt( DMEDIAPAGINGDEVICE_SENDTOMAINQUEUEDFCANDBLOCK_ENTRY, this ); __KTRACE_OPT2(KLOCDRV,KLOCDPAGING,Kern::Printf("Send request 0x%08x to main queue",aMsg)); __ASSERT_ALWAYS(aMsg->iState==TMessageBase::EFree,LOCM_FAULT()); // check that message was previously completed or never queued @@ -3353,7 +3786,7 @@ // we can call DPagingDevice::NotifyBusy() / DPagingDevice::NotifyIdle() if ((m.Flags() & TLocDrvRequest::EBackgroundPaging) == 0) iPrimaryMedia->RequestCountInc(); - + aMsg->SendReceive(&iMainQ); #ifdef __DEMAND_PAGING__ @@ -3369,10 +3802,12 @@ // come back here when request is completed __ASSERT_DEBUG(aMsg->iState==TMessageBase::EFree,LOCM_FAULT()); // check message has been completed + OstTraceFunctionExit1( DMEDIAPAGINGDEVICE_SENDTOMAINQUEUEDFCANDBLOCK_EXIT, this ); } void DMediaPagingDevice::SendToDeferredQ(TThreadMessage* aMsg) { + OstTraceFunctionEntryExt( DMEDIAPAGINGDEVICE_SENDTODEFERREDQ_ENTRY, this ); // This queue is only accessed from MD thread __ASSERT_ALWAYS(aMsg->iState==TMessageBase::EAccepted,LOCM_FAULT()); // check that message was previously dequeued #ifdef BTRACE_PAGING_MEDIA @@ -3383,11 +3818,13 @@ #endif aMsg->Forward(&iDeferredQ, EFalse); + OstTraceFunctionExit1( DMEDIAPAGINGDEVICE_SENDTODEFERREDQ_EXIT, this ); } void DMediaPagingDevice::CompleteRequest(TThreadMessage* aMsg, TInt aResult) { + OstTraceFunctionEntryExt( DMEDIAPAGINGDEVICE_COMPLETEREQUEST_ENTRY, this ); __KTRACE_OPT2(KLOCDRV,KLOCDPAGING,Kern::Printf("DMediaPagingDevice::CompleteRequest, request 0x%08x result %d", aMsg, aResult)); __ASSERT_DEBUG(aMsg->iState==TMessageBase::EAccepted,LOCM_FAULT()); @@ -3396,10 +3833,12 @@ #endif iPrimaryMedia->CompleteRequest(*((TLocDrvRequest*) aMsg), aResult); + OstTraceFunctionExit1( DMEDIAPAGINGDEVICE_COMPLETEREQUEST_EXIT, this ); } TInt DMediaPagingDevice::Read(TThreadMessage* aReq,TLinAddr aBuffer,TUint aOffset,TUint aSize,TInt aDrvNumber) { + OstTraceFunctionEntry1( DMEDIAPAGINGDEVICE_READ_ENTRY, this ); __ASSERT_ALWAYS(NKern::CurrentThread()!=iPrimaryMedia->iDfcQ->iThread,LOCM_FAULT()); // that would lock up the system, thus better die now __ASSERT_ALWAYS(aReq,LOCM_FAULT()); __ASSERT_CRITICAL @@ -3468,16 +3907,19 @@ #endif __KTRACE_OPT2(KLOCDRV,KLOCDPAGING,Kern::Printf("DMediaPagingDevice::Read, Req(0x%08x), Buff(0x%x),Offset(%d),Size(%d),DrvNo(%d)",aReq,aBuffer,offset,size,aDrvNumber)); + OstTraceDefExt5(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DMEDIAPAGINGDEVICE_READ1, "req=0x%08x; aBuffer=0x%x; offset=%d; size=%d; aDrvNumber=%d", (TUint) aReq, (TInt) aBuffer, (TInt) offset, (TUint) size, (TUint) aDrvNumber); // no DFCQ, media driver executes in the context of calling thread if (!iPrimaryMedia->iDfcQ) { LOCM_FAULT(); // don't allow paging + OstTraceFunctionExitExt( DMEDIAPAGINGDEVICE_READ_EXIT, this, KErrNone ); return KErrNone; // keep compiler happy } TLocDrvRequest& m=*(TLocDrvRequest*)(aReq); + #ifdef __DEMAND_PAGING_BENCHMARKS__ SPagingBenchmarkInfo* info = NULL; @@ -3545,7 +3987,8 @@ m.RemoteDesOffset()=0; // pre-aligned m.DriverFlags()=0; __KTRACE_OPT2(KLOCDRV,KLOCDPAGING,Kern::Printf("ReqId=%d, Pos=0x%lx, Len=0x%lx, remote Des 0x%x",m.Id(),m.Pos(),m.Length(),m.RemoteDes())); - + OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DMEDIAPAGINGDEVICE_READ2, "reqId=%d; position=0x%lx; length=0x%x; remote Des=0x%x", (TInt) m.Id(), (TUint) m.Pos(), (TUint) m.Length(), (TUint) m.RemoteDes()); + __ASSERT_DEBUG(iPrimaryMedia->iBody, LOCM_FAULT()); TInt mediaChanges = iPrimaryMedia->iBody->iMediaChanges; @@ -3554,7 +3997,9 @@ #ifdef __DEBUG_DEMAND_PAGING__ if (retVal != KErrNone) + { Kern::Printf("Pagin Failure %d, retry %d", retVal, i); + } #endif // reset retry count if there's ben a media change @@ -3583,12 +4028,13 @@ if (elapsed < info->iMinTime) info->iMinTime = elapsed; #endif // __DEMAND_PAGING_BENCHMARKS__ - + OstTraceFunctionExitExt( DMEDIAPAGINGDEVICE_READ_EXIT2, this, retVal ); return retVal; } TInt DMediaPagingDevice::Write(TThreadMessage* aReq,TLinAddr aBuffer,TUint aOffset,TUint aSize,TBool aBackground) { + OstTraceFunctionEntry1( DMEDIAPAGINGDEVICE_WRITE_ENTRY, this ); __ASSERT_ALWAYS(NKern::CurrentThread()!=iPrimaryMedia->iDfcQ->iThread,LOCM_FAULT()); // that would lock up the system, thus better die now __ASSERT_ALWAYS(aReq,LOCM_FAULT()); __ASSERT_CRITICAL @@ -3623,17 +4069,19 @@ #endif __KTRACE_OPT2(KLOCDRV,KLOCDPAGING,Kern::Printf("DMediaPagingDevice::Write, Req(0x%08x), Buff(0x%x),Offset(%d),Size(%d)",aReq,aBuffer,offset,size)); + OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DMEDIAPAGINGDEVICE_WRITE1, "req=0x%08x; aBuffer=0x%x; offset=%d; size=%d", (TUint) aReq, (TUint) aBuffer, offset, size); // no DFCQ, media driver executes in the context of calling thread if (!iPrimaryMedia->iDfcQ) { LOCM_FAULT(); // don't allow paging + OstTraceFunctionExitExt( DMEDIAPAGINGDEVICE_WRITE_EXIT, this, KErrNone ); return KErrNone; // keep compiler happy } TLocDrvRequest& m=*(TLocDrvRequest*)(aReq); - + #ifdef __DEMAND_PAGING_BENCHMARKS__ __e32_atomic_add_ord32(&iMediaPagingInfo.iDataPageOutCount, (TUint) 1); if (aBackground) @@ -3657,11 +4105,13 @@ m.RemoteDesOffset()=0; // pre-aligned m.DriverFlags()=0; __KTRACE_OPT2(KLOCDRV,KLOCDPAGING,Kern::Printf("ReqId=%d, Pos=0x%lx, Len=0x%lx, remote Des 0x%x",m.Id(),m.Pos(),m.Length(),m.RemoteDes())); - + OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DMEDIAPAGINGDEVICE_WRITE2, "reqId=%d; position=0x%lx; length=0x%lx; remote Des=0x%x", (TInt) m.Id(), (TUint) m.Pos(), (TUint) m.Length(), (TUint) m.RemoteDes()); + __ASSERT_DEBUG(iPrimaryMedia->iBody, LOCM_FAULT()); TInt mediaChanges = iPrimaryMedia->iBody->iMediaChanges; SendToMainQueueDfcAndBlock(&m); // queues request, sets and opens client thread, queues dfc and blocks thread until request is completed + retVal = m.iValue; #ifdef __DEBUG_DEMAND_PAGING__ @@ -3695,15 +4145,20 @@ if (elapsed < info.iMinTime) info.iMinTime = elapsed; #endif // __DEMAND_PAGING_BENCHMARKS__ - + + OstTraceFunctionExitExt( DMEDIAPAGINGDEVICE_WRITE_EXIT2, this, retVal ); return retVal; } TInt DMediaPagingDevice::DeleteNotify(TThreadMessage* aReq,TUint aOffset,TUint aSize) { + OstTraceFunctionEntry1( DMEDIAPAGINGDEVICE_DELETENOTIFY_ENTRY, this ); if (iDeleteNotifyNotSupported) + { + OstTraceFunctionExitExt( DMEDIAPAGINGDEVICE_DELETENOTIFY_EXIT1, this, KErrNotSupported ); return KErrNotSupported; + } __ASSERT_ALWAYS(NKern::CurrentThread()!=iPrimaryMedia->iDfcQ->iThread,LOCM_FAULT()); // that would lock up the system, thus better die now __ASSERT_ALWAYS(aReq,LOCM_FAULT()); @@ -3721,11 +4176,13 @@ #endif __KTRACE_OPT2(KLOCDRV,KLOCDPAGING,Kern::Printf("DMediaPagingDevice::Write, Req(0x%08x), Offset(%d),Size(%d)",aReq,offset,size)); + OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DMEDIAPAGINGDEVICE_DELETENOTIFY1 , "req=0x%08x; offset=%d; size=%d", (TUint) aReq, offset, size); // no DFCQ, media driver executes in the context of calling thread if (!iPrimaryMedia->iDfcQ) { LOCM_FAULT(); // don't allow paging + OstTraceFunctionExitExt( DMEDIAPAGINGDEVICE_DELETENOTIFY_EXIT2, this, KErrNone ); return KErrNone; // keep compiler happy } @@ -3743,7 +4200,7 @@ m.RemoteDesOffset() = 0; // pre-aligned m.DriverFlags()=0; __KTRACE_OPT2(KLOCDRV,KLOCDPAGING,Kern::Printf("ReqId=%d, Pos=0x%lx, Len=0x%lx, remote Des 0x%x",m.Id(),m.Pos(),m.Length(),m.RemoteDes())); - + OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DMEDIAPAGINGDEVICE_DELETENOTIFY2 , "reqId=%d; position=0x%lx; length=0x%lx; remote Des=0x%x", m.Id(), m.Pos(), m.Length(), (TUint) m.RemoteDes()); // send request aynchronously as we don't particularly care about the result // and waiting would slow down the thread taking the page fault @@ -3760,6 +4217,7 @@ if (retVal == KErrNotSupported) iDeleteNotifyNotSupported = ETrue; + OstTraceFunctionExitExt( DMEDIAPAGINGDEVICE_DELETENOTIFY_EXIT3, this, retVal ); return retVal; } @@ -3767,6 +4225,7 @@ EXPORT_C TInt TLocDrvRequest::WriteToPageHandler(const TAny* aSrc, TInt aSize, TInt anOffset) { + OstTraceFunctionEntry1( TLOCDRVREQUEST_WRITETOPAGEHANDLER_ENTRY, this ); #ifdef BTRACE_PAGING_MEDIA TMediaDevice medDev=Drive()->iMedia->iDevice; TInt buf[3]; @@ -3777,11 +4236,13 @@ #endif __KTRACE_OPT2(KLOCDRV,KLOCDPAGING,Kern::Printf("TLocDrvRequest::WriteToPageHandler, memcpy((aTrg)%08x, (aSrc)%08x, (aLength)%08x)",(TUint32)RemoteDes()+anOffset,aSrc,aSize)); (void)memcpy((TAny*)((TUint32)RemoteDes()+anOffset), aSrc, aSize); // maybe in later versions this could be something else + OstTraceFunctionExitExt( TLOCDRVREQUEST_WRITETOPAGEHANDLER_EXIT, this, KErrNone ); return KErrNone; } EXPORT_C TInt TLocDrvRequest::ReadFromPageHandler(TAny* aDst, TInt aSize, TInt anOffset) { + OstTraceFunctionEntry1( TLOCDRVREQUEST_READFROMPAGEHANDLER_ENTRY, this ); #ifdef BTRACE_PAGING_MEDIA TMediaDevice medDev=Drive()->iMedia->iDevice; TInt buf[3]; @@ -3792,6 +4253,7 @@ #endif __KTRACE_OPT2(KLOCDRV,KLOCDPAGING,Kern::Printf("TLocDrvRequest::ReadFromPageHandler, memcpy((aDst)%08x, (aTrg)%08x, (aLength)%08x)",aDst,(TUint32)RemoteDes()+anOffset,aSize)); (void)memcpy(aDst, (TAny*)((TUint32)RemoteDes()+anOffset), aSize); // maybe in later versions this could be something else + OstTraceFunctionExitExt( TLOCDRVREQUEST_READFROMPAGEHANDLER_EXIT, this, KErrNone ); return KErrNone; } @@ -3799,17 +4261,25 @@ TInt DFragmentationPagingLock::Construct(TUint aNumPages) { + OstTraceFunctionEntryExt( DFRAGMENTATIONPAGINGLOCK_CONSTRUCT_ENTRY, this ); TInt r=KErrNone; __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("Fragmentation Lock: creating Mutex")); r=Kern::MutexCreate(this->iFragmentationMutex, KLitFragmentationMutexName, KMutexOrdNone); if (r!=KErrNone) + { + OstTraceFunctionExitExt( DFRAGMENTATIONPAGINGLOCK_CONSTRUCT_EXIT1, this, r ); return r; + } __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("Fragmentation Lock: Mutex created OK")); + OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DFRAGMENTATIONPAGINGLOCK_CONSTRUCT1 , "Fragmentation Lock: Mutex created OK"); iFragmentGranularity = 0; if (aNumPages == 0) + { + OstTraceFunctionExitExt( DFRAGMENTATIONPAGINGLOCK_CONSTRUCT_EXIT2, this, KErrNone ); return KErrNone; - + } + // in CS TInt pageSize=Kern::RoundToPageSize(1); LockFragmentation(); @@ -3820,13 +4290,16 @@ { iFragmentGranularity = pageSize * aNumPages; __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("Fragmentation granularity set to 0x%x", iFragmentGranularity)); + OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DFRAGMENTATIONPAGINGLOCK_CONSTRUCT2, "Fragmentation granularity=0x%x", iFragmentGranularity); } + OstTraceFunctionExitExt( DFRAGMENTATIONPAGINGLOCK_CONSTRUCT_EXIT3, this, r ); return r; } void DFragmentationPagingLock::Cleanup() { + OstTraceFunctionEntry1( DFRAGMENTATIONPAGINGLOCK_CLEANUP_ENTRY, this ); // in CS if (iFragmentationMutex) { @@ -3835,6 +4308,7 @@ UnlockFragmentation(); Kern::SafeClose((DObject*&)iFragmentationMutex,NULL); } + OstTraceFunctionExit1( DFRAGMENTATIONPAGINGLOCK_CLEANUP_EXIT, this ); } #else @@ -3864,12 +4338,15 @@ */ EXPORT_C DMediaDriver::DMediaDriver(TInt aMediaId) { + OstTraceFunctionEntryExt( DMEDIADRIVER_DMEDIADRIVER_ENTRY, this ); + // iPhysicalDevice=NULL; // iTotalSizeInBytes=0; // iCurrentConsumption=0; // iPrimaryMedia=NULL; // iCritical=EFalse; iPrimaryMedia=(DPrimaryMediaBase*)TheMedia[aMediaId]; + OstTraceFunctionExit1( DMEDIADRIVER_DMEDIADRIVER_EXIT, this ); } @@ -3885,8 +4362,10 @@ */ EXPORT_C DMediaDriver::~DMediaDriver() { + OstTraceFunctionEntry1( DMEDIADRIVER_DMEDIADRIVER_DESTRUCTOR_ENTRY, this ); SetCurrentConsumption(0); Kern::SafeClose((DObject*&)iPhysicalDevice,NULL); + OstTraceFunctionExit1( DMEDIADRIVER_DMEDIADRIVER_DESTRUCTOR_EXIT, this ); } @@ -3924,9 +4403,11 @@ */ EXPORT_C void DMediaDriver::SetTotalSizeInBytes(Int64 aTotalSizeInBytes, TLocDrv* aLocDrv) { + OstTraceFunctionEntry1( DMEDIADRIVER_SETTOTALSIZEINBYTES_ENTRY, this ); iTotalSizeInBytes=aTotalSizeInBytes; if (aLocDrv) aLocDrv->iPartitionLen=aTotalSizeInBytes; + OstTraceFunctionExit1( DMEDIADRIVER_SETTOTALSIZEINBYTES_EXIT, this ); } @@ -3962,13 +4443,18 @@ */ EXPORT_C TInt DMediaDriver::InCritical() { + OstTraceFunctionEntry1( DMEDIADRIVER_INCRITICAL_ENTRY, this ); if (!iCritical) { TInt r=iPrimaryMedia->InCritical(); if (r!=KErrNone) + { + OstTraceFunctionExitExt( DMEDIADRIVER_INCRITICAL_EXIT, this, r ); return r; + } iCritical=ETrue; } + OstTraceFunctionExitExt( DMEDIADRIVER_INCRITICAL_EXIT2, this, KErrNone ); return KErrNone; } @@ -3982,11 +4468,13 @@ */ EXPORT_C void DMediaDriver::EndInCritical() { + OstTraceFunctionEntry1( DMEDIADRIVER_ENDINCRITICAL_ENTRY, this ); if (iCritical) { iCritical=EFalse; iPrimaryMedia->EndInCritical(); } + OstTraceFunctionExit1( DMEDIADRIVER_ENDINCRITICAL_EXIT, this ); } @@ -3997,9 +4485,11 @@ */ EXPORT_C void DMediaDriver::SetCurrentConsumption(TInt aValue) { + OstTraceFunctionEntryExt( DMEDIADRIVER_SETCURRENTCONSUMPTION_ENTRY, this ); TInt old = (TInt)__e32_atomic_swp_ord32(&iCurrentConsumption, aValue); TInt delta = aValue - old; iPrimaryMedia->DeltaCurrentConsumption(delta); + OstTraceFunctionExit1( DMEDIADRIVER_SETCURRENTCONSUMPTION_EXIT, this ); } @@ -4015,6 +4505,7 @@ */ EXPORT_C void DMediaDriver::Complete(TLocDrvRequest& m, TInt aResult) { + OstTraceExt2( TRACE_FLOW, DMEDIADRIVER_COMPLETE_ENTRY, "m=%x;aResult=%d", (TUint) &m, aResult ); CHECK_RET(aResult); #ifdef __DEMAND_PAGING__ if (DMediaPagingDevice::PagingRequest(m)) @@ -4032,6 +4523,7 @@ iPrimaryMedia->iCurrentReq = NULL; iPrimaryMedia->RunDeferred(); + OstTraceFunctionExit1( DMEDIADRIVER_COMPLETE_EXIT, this ); } @@ -4051,10 +4543,13 @@ */ EXPORT_C void DMediaDriver::OpenMediaDriverComplete(TInt anError) { + OstTraceFunctionEntry1( DMEDIADRIVER_OPENMEDIADRIVERCOMPLETE_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DMediaDriver::OpenMediaDriverComplete(%d) this %x iPrimaryMedia %x", anError, this, iPrimaryMedia)); + OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_MEDIACHANGE, DMEDIADRIVER_OPENMEDIADRIVERCOMPLETE, "anError %d this 0x%x iPrimaryMedia 0x%x", anError, (TUint) this, (TUint) iPrimaryMedia); DPrimaryMediaBase* pM=iPrimaryMedia; pM->iAsyncErrorCode=anError; pM->iAsyncDfc.Enque(); + OstTraceFunctionExit1( DMEDIADRIVER_OPENMEDIADRIVERCOMPLETE_EXIT, this ); } @@ -4074,10 +4569,13 @@ */ EXPORT_C void DMediaDriver::PartitionInfoComplete(TInt anError) { + OstTraceFunctionEntry1( DMEDIADRIVER_PARTITIONINFOCOMPLETE_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("DMediaDriver::PartitionInfoComplete(%d) anError %d this %x iPrimaryMedia %x", anError, this, iPrimaryMedia)); + OstTraceExt3( TRACE_INTERNALS, DMDEDIADRIVER_PARTITIONINFOCOMPLETE, "anError=%d; this=%x; iPrimaryMedia=%x", anError, (TUint) this, (TUint) iPrimaryMedia ); DPrimaryMediaBase* pM=iPrimaryMedia; pM->iAsyncErrorCode=anError; pM->iAsyncDfc.Enque(); + OstTraceFunctionExit1( DMEDIADRIVER_PARTITIONINFOCOMPLETE_EXIT, this ); } @@ -4089,10 +4587,12 @@ // Default implementation EXPORT_C void DMediaDriver::Disconnect(DLocalDrive* aLocalDrive, TThreadMessage* aMsg) { + OstTraceFunctionEntryExt( DMEDIADRIVER_DISCONNECT_ENTRY, this ); // don't need to worry about DLocalDrive going away aLocalDrive->Deque(); aMsg->Complete(KErrNone, EFalse); + OstTraceFunctionExit1( DMEDIADRIVER_DISCONNECT_EXIT, this ); } @@ -4137,13 +4637,19 @@ */ EXPORT_C TInt LocDrv::RegisterMediaDevice(TMediaDevice aDevice, TInt aDriveCount, const TInt* aDriveList, DPrimaryMediaBase* aPrimaryMedia, TInt aNumMedia, const TDesC& aName) { + OstTraceFunctionEntry0( LOCDRV_REGISTERMEDIADEVICE_ENTRY ); // Create TLocDrv / DMedia objects to handle a media device __KTRACE_OPT(KBOOT,Kern::Printf("RegisterMediaDevice %lS dev=%1d #drives=%d 1st=%d PM=%08x #media=%d",&aName,aDevice,aDriveCount,*aDriveList,aPrimaryMedia,aNumMedia)); + OstTraceExt5( TRACE_INTERNALS, LOCDRV_REGISTERMEDIADEVICE1, "aDevice=%d; aDriveCount=%d; aDriveList=%d; aPrimaryMedia=0x%08x; aNumMedia=%d", (TInt) aDevice, (TInt) aDriveCount, (TInt) *aDriveList, (TUint) aPrimaryMedia, (TInt) aNumMedia ); + const TInt* p=aDriveList; TInt i; TInt r=0; if (UsedMedia+aNumMedia>KMaxLocalDrives) + { + OstTrace0(TRACE_FLOW, LOCDRV_REGISTERMEDIADEVICE_EXIT1, "< KErrInUse"); return KErrInUse; + } for (i=0; i<aDriveCount; ++i) { TInt drv = *p++; @@ -4151,15 +4657,20 @@ if (drv == -1) continue; __KTRACE_OPT(KBOOT,Kern::Printf("Registering drive %d", drv)); + OstTrace1( TRACE_INTERNALS, LOCDRV_REGISTERMEDIADEVICE2, "Registering drive=%d", drv ); if (TheDrives[drv]) { __KTRACE_OPT(KBOOT,Kern::Printf("Drive %d already in use", drv)); + OstTrace1( TRACE_FLOW, LOCDRV_REGISTERMEDIADEVICE_EXIT2, "< Drive %d already in use; KErrInUse", drv); return KErrInUse; } } HBuf* pN=HBuf::New(aName); if (!pN) + { + OstTrace0(TRACE_FLOW, LOCDRV_REGISTERMEDIADEVICE_EXIT3, "< KErrNoMemory"); return KErrNoMemory; + } TInt lastMedia=UsedMedia+aNumMedia-1; for (i=UsedMedia; i<=lastMedia; ++i) { @@ -4168,14 +4679,22 @@ else TheMedia[i]=new DMedia; if (!TheMedia[i]) + { + OstTrace0(TRACE_FLOW, LOCDRV_REGISTERMEDIADEVICE_EXIT4, "< KErrNoMemory"); return KErrNoMemory; + } r=TheMedia[i]->Create(aDevice,i,lastMedia); __KTRACE_OPT(KBOOT,Kern::Printf("Media %d Create() returns %d",i,r)); + OstTraceExt2( TRACE_INTERNALS, LOCDRV_REGISTERMEDIADEVICE3, "Media=%d Create(); retval=%d", i, r ); if (r!=KErrNone) + { + OstTrace1(TRACE_FLOW, LOCDRV_REGISTERMEDIADEVICE_EXIT5, "< retval=%d", r); return r; + } } __KTRACE_OPT(KBOOT,Kern::Printf("FirstMedia %d LastMedia %d",UsedMedia,lastMedia)); + OstTraceExt2( TRACE_INTERNALS, LOCDRV_REGISTERMEDIADEVICE4, "FirstMedia=%d; LastMedia=%d", UsedMedia, lastMedia ); UsedMedia+=aNumMedia; p=aDriveList; for (i=0; i<aDriveCount; ++i) @@ -4185,12 +4704,18 @@ continue; TLocDrv* pL=new TLocDrv(drv); if (!pL) + { + OstTrace0(TRACE_FLOW, LOCDRV_REGISTERMEDIADEVICE_EXIT6, "< KErrNoMemory"); return KErrNoMemory; + } TheDrives[drv]=pL; DriveNames[drv]=pN; pL->iPrimaryMedia=aPrimaryMedia; __KTRACE_OPT(KBOOT,Kern::Printf("Drive %d: TLocDrv @ %08x",drv,pL)); + OstTraceExt2( TRACE_INTERNALS, LOCDRV_REGISTERMEDIADEVICE5, "Drive=%d; TLocDrv 0x%08x;", (TInt) drv, (TUint) pL ); } + + OstTraceFunctionExit0( LOCDRV_REGISTERMEDIADEVICE_EXIT7 ); return KErrNone; } @@ -4210,16 +4735,18 @@ */ EXPORT_C TInt LocDrv::RegisterPasswordStore(TPasswordStore* aStore) { + OstTraceFunctionEntry0( LOCDRV_REGISTERPASSWORDSTORE_ENTRY ); // Create TLocDrv / DMedia objects to handle a media device __KTRACE_OPT(KBOOT,Kern::Printf("RegisterPasswordStore")); - + TInt r = KErrNone; if(ThePasswordStore == NULL) ThePasswordStore = aStore; else r = KErrAlreadyExists; - + OstTrace1(TRACE_INTERNALS, LOCDRV_REGISTERPASSWORDSTORE, "retval=%d", r); + OstTraceFunctionExit0( LOCDRV_REGISTERPASSWORDSTORE_EXIT ); return r; } @@ -4235,7 +4762,6 @@ return ThePasswordStore; } - #ifdef __DEMAND_PAGING__ /** Registers a paging device with the Local Media Subsystem, and provides @@ -4272,12 +4798,17 @@ */ EXPORT_C TInt LocDrv::RegisterPagingDevice(DPrimaryMediaBase* aPrimaryMedia, const TInt* aPagingDriveList, TInt aDriveCount, TUint aPagingType, TInt aReadShift, TUint aNumPages) { + OstTraceFunctionEntry0( LOCDRV_REGISTERPAGINGDEVICE_ENTRY ); + __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf(">RegisterPagingDevice: paging type=%d PM=0x%x read shift=%d",aPagingType,aPrimaryMedia,aReadShift)); + OstTraceDefExt3( OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, LOCDRV_REGISTERPAGINGDEVICE1, "aPagingType=%d; aPrimaryMedia=0x%x; aReadShift=%d", (TInt) aPagingType, (TUint) aPrimaryMedia, (TInt) aReadShift); + TInt i; if(!aPagingType || (aPagingType&~(DPagingDevice::ERom | DPagingDevice::ECode | DPagingDevice::EData))) { __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("Unsupported paging type, exiting")); + OstTrace0(TRACE_FLOW, LOVDRV_REGISTERPAGINGDEVICE_EXIT1, "< Unsupported paging type; KErrArgument"); return KErrArgument; } @@ -4304,6 +4835,7 @@ { // there's already a ROM or Data paging device & this doesn't support code paging so quietly exit without further addo __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("Nothing left to register on locdrv no %d, exiting",i)); + OstTrace1(TRACE_FLOW, LOVDRV_REGISTERPAGINGDEVICE_EXIT2, "< Nothing left to register on locdrv no %d; KErrNone",i); return KErrNone; } @@ -4313,6 +4845,7 @@ if(!aDriveCount || (aDriveCount>=KMaxLocalDrives)) { __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("Invalid code paging drive count: %d", aDriveCount)); + OstTrace1(TRACE_FLOW, LOVDRV_REGISTERPAGINGDEVICE_EXIT3, "< Invalid code paging drive count=%d; KErrArgument", aDriveCount); return KErrArgument; } @@ -4322,24 +4855,33 @@ drvCount++; if(aDriveCount>drvCount) // can't exceed number of drives registered by this device { - __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("Invalid code paging drive count: %d total %d", aDriveCount, drvCount)); + __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("Invalid code paging drive count=%d; total=%d", aDriveCount, drvCount)); + OstTraceExt2(TRACE_FLOW, LOVDRV_REGISTERPAGINGDEVICE_EXIT4, "< Invalid code paging drive count=%d; total=%d; KErrArgument", aDriveCount, drvCount); return KErrArgument; } for (i=0; i<aDriveCount; ++i) { __KTRACE_OPT(KBOOT,Kern::Printf("RegisterPagingDevice: registering drive=%d ",*p)); + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, LOCDRV_REGISTERPAGINGDEVICE2, "Registering Drive=%d", *p ); TInt drv=*p++; if(drv>=KMaxLocalDrives) { __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("Invalid code paging drive number: %d", drv)); + OstTrace1(TRACE_FLOW, LOVDRV_REGISTERPAGINGDEVICE_EXIT5, "< Invalid code paging drive number=%d; KErrArgument", drv); return KErrArgument; } TLocDrv* pD=TheDrives[drv]; if (!pD) + { + OstTrace0(TRACE_FLOW, LOCRV_REGISTERPAGINGDEVICE_EXIT6, "< KErrNotFound"); return KErrNotFound; + } if (pD->iPrimaryMedia!=aPrimaryMedia) + { + OstTrace0(TRACE_FLOW, LOCRV_REGISTERPAGINGDEVICE_EXIT7, "< KErrNotSupported"); return KErrNotSupported; + } } } @@ -4360,9 +4902,9 @@ } } __ASSERT_ALWAYS(i < KMaxLocalDrives, LOCM_FAULT()); - __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("DMediaPagingDevice(), firstLocalDriveNumber %d", firstLocalDriveNumber)); - - + __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("DMediaPagingDevice(), firstLocalDriveNumber %d", firstLocalDriveNumber)); + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, LOCDRV_REGISTERPAGINGDEVICE3, "firstLocalDriveNumber=%d", firstLocalDriveNumber ); + // Send an ECaps message to wake up the media driver & ensure all partitions are // reported, then search for paged-data or paged-ROM partitions if ((aPagingType & DPagingDevice::EData) || @@ -4373,6 +4915,7 @@ if (aPrimaryMedia->iDfcQ && !aPrimaryMedia->iMsgQ.iReady) { __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("RegisterPagingDevice: Message queue not started")); + OstTrace0(TRACE_FLOW, LOVDRV_REGISTERPAGINGDEVICE_EXIT8, "< RegisterPagingDevice: Message queue not started; KErrNotReady"); return KErrNotReady; } @@ -4399,10 +4942,14 @@ //Kern::Printf("EQueryPageDeviceInfo: i %d: r %d ", i, r); __KTRACE_OPT2(KBOOT,KLOCDPAGING, Kern::Printf("Paging device ECaps: i %d: r %d ", i, r)); + OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, LOCDRV_REGISTERPAGINGDEVICE4, "Paging device ECaps: i %d retval=%d", i, r); } if (r != KErrNone) + { + OstTrace1(TRACE_FLOW, LOCRV_REGISTERPAGINGDEVICE_EXIT9, "< retval=%d",r); return r; + } TLocDrv* drive; for (i=0; i<KMaxLocalDrives; ++i) @@ -4415,12 +4962,14 @@ if ((romPagingDriveNumber == KErrNotFound) && (drive->iPartitionType == KPartitionTypeROM)) { __KTRACE_OPT2(KBOOT,KLOCDPAGING, Kern::Printf("Found ROM partition on local drive %d, size %x", i, I64LOW(drive->iPartitionLen))); + OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, LOCDRV_REGISTERPAGINGDEVICE5, "Found ROM partition on local drive=%d; size=0x%x", (TInt) i, (TUint) I64LOW(drive->iPartitionLen)); romPagingDriveNumber = i; } // swap partition ? else if ((dataPagingDriveNumber == KErrNotFound) && (drive->iPartitionType == KPartitionTypePagedData)) { __KTRACE_OPT2(KBOOT,KLOCDPAGING, Kern::Printf("Found swap partition on local drive %d, size %x", i, I64LOW(drive->iPartitionLen))); + OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, LOCDRV_REGISTERPAGINGDEVICE6, "Found SWAP partition on local drive=%d; size=0x%x", (TInt) i, (TUint) I64LOW(drive->iPartitionLen) ); dataPagingDriveNumber = i; swapSize = drive->iPartitionLen >> aReadShift; } @@ -4430,6 +4979,7 @@ if (swapSize == 0) { __KTRACE_OPT2(KBOOT,KLOCDPAGING, Kern::Printf("Disabling data paging")); + OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, LOCDRV_REGISTERPAGINGDEVICE7, "Disabling data paging"); aPagingType &= ~DPagingDevice::EData; } @@ -4441,6 +4991,7 @@ if(!pagingDevice) { __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("RegisterPagingDevice: could not create paging device")); + OstTrace0(TRACE_FLOW, LOVDRV_REGISTERPAGINGDEVICE_EXIT_EXIT10, "< RegisterPagingDevice: could not create paging device; KErrNoMemory"); return KErrNoMemory; } @@ -4461,7 +5012,7 @@ Kern::Printf("iRomPagingDriveNumber 0x%x\n", pagingDevice->iRomPagingDriveNumber); Kern::Printf("iDataPagingDriveNumber 0x%x\n", pagingDevice->iDataPagingDriveNumber); Kern::Printf("iSwapSize 0x%x\n", pagingDevice->iSwapSize); -#endif + #endif // This table is indexed by DPagingDevice::TType @@ -4490,12 +5041,14 @@ if(!ThePinObjectAllocator) { __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("RegisterPagingDevice: could not create ThePinObjectAllocator")); + OstTrace0(TRACE_FLOW, LOVDRV_REGISTERPAGINGDEVICE_EXIT11, "RegisterPagingDevice: could not create ThePinObjectAllocator; KErrNoMemory"); return KErrNoMemory; } TInt r = ThePinObjectAllocator->Construct(KDynamicPagingLockCount, aNumPages); if (r != KErrNone) { __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("RegisterPagingDevice: could not construct ThePinObjectAllocator")); + OstTrace1(TRACE_FLOW, LOVDRV_REGISTERPAGINGDEVICE_EXIT12, "< RegisterPagingDevice: could not construct ThePinObjectAllocator; retval=%d",r); return r; } @@ -4510,6 +5063,7 @@ if (r!=KErrNone) { __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("RegisterPagingDevice: could not install paging device")); + OstTrace1(TRACE_FLOW, LOVDRV_REGISTERPAGINGDEVICE_EXIT13, "< RegisterPagingDevice: could not install paging device; retval=%d", r); delete pagingDevice; return r; } @@ -4552,7 +5106,9 @@ { #ifdef __DEBUG_DEMAND_PAGING__ if (aPagingType & DPagingDevice::EData) + { Kern::Printf("Disabling data paging, not supported in this ROM"); + } #endif aPagingType&= ~DPagingDevice::EData; } @@ -4565,7 +5121,8 @@ TheDataPagingMedia = aPrimaryMedia; } - __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("<RegisterPagingDevice")); + __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("< RegisterPagingDevice")); + OstTraceFunctionExit0( LOCDRV_REGISTERPAGINGDEVICE_EXIT14 ); return KErrNone; } @@ -4598,9 +5155,12 @@ TInt aDmaMaxAddressable, // Max Addressing Range for DMA controller, 0 if None. TInt aDmaAlignment) // DMA Alignment e.g. word alignment required = 2 { + OstTraceFunctionEntry0( LOCDRV_REGISTERDMADEVICE_ENTRY ); + __KTRACE_OPT(KBOOT ,Kern::Printf("RegisterPhysicalAddrDevice: PM=0x%x BS=%d MaxAddr=%d DMA=%d", aPrimaryMedia, aMediaBlockSize, aDmaMaxAddressable, aDmaAlignment)); - + OstTraceExt4( TRACE_INTERNALS, LOCDRV_REGISTERDMADEVICE, "aPrimaryMedia=0x%x; aMediaBlockSize=%d; aDmaMaxAddressable=%d; aDmaAlignment=%d", (TUint) aPrimaryMedia, (TInt) aMediaBlockSize, (TInt) aDmaMaxAddressable, (TInt) aDmaAlignment ); + for (TInt i=0; i<KMaxLocalDrives; ++i) { TLocDrv* pL=TheDrives[i]; @@ -4617,11 +5177,13 @@ } } + OstTraceFunctionExit0( LOCDRV_REGISTERDMADEVICE_EXIT ); return KErrNone; } void GetDriveInfo(TDriveInfoV1& info) { + OstTraceFunctionEntry1( GETDRIVEINFO_ENTRY, ( TUint )&( info ) ); TInt i; TInt drives=0; TUint32 sock_mask=0; @@ -4645,6 +5207,7 @@ { info.iSocketName[sockNum]=*DriveNames[i]; __KTRACE_OPT(KLOCDRV,Kern::Printf("Socket %d device %d name %lS", sockNum, pM->iDevice, DriveNames[i])); + OstTraceExt2( TRACE_INTERNALS, GETDRIVEINFO1, "Socket=%d; device=%d", sockNum, (TUint) pM->iDevice ); if ( (sockNum + 1) > sockets ) sockets = sockNum + 1; } @@ -4652,6 +5215,7 @@ } info.iDriveName[i]=*DriveNames[i]; __KTRACE_OPT(KLOCDRV,Kern::Printf("Drive %d device %d name %lS",i,pM->iDevice,DriveNames[i])); + OstTraceExt2( TRACE_INTERNALS, GETDRIVEINFO2, "Drive=%d; device=%d", i, (TUint) pM->iDevice ); info.iRegisteredDriveBitmask |= (0x01 << i); } @@ -4660,6 +5224,8 @@ info.iTotalSockets=sockets; info.iRuggedFileSystem=ETrue; __KTRACE_OPT(KLOCDRV,Kern::Printf("Total drives=%d, sockets=%d",drives,sockets)); + OstTraceExt2( TRACE_INTERNALS, GETDRIVEINFO3, "Total drives=%d; sockets=%d", drives, sockets ); + OstTraceFunctionExit0( GETDRIVEINFO_EXIT ); } #if defined(__DEMAND_PAGING__) && defined(__CONCURRENT_PAGING_INSTRUMENTATION__) @@ -4966,6 +5532,7 @@ { __KTRACE_OPT(KLOCDRV, Kern::Printf("TPartitionTableScanner @ %08x : buf %08x entry %08x max %d sz %08x %08x", this, aSectorBuffer, aEntry, aMaxPartitions, I64HIGH(aMediaSize), I64LOW(aMediaSize))); + OstTraceExt4( TRACE_INTERNALS, TPARTITIONTABLESCANNER_SET, "TPartitionTableScanner at 0x%08x; aSectorBuffer=0x%08x; aEntry=0x%08x; aMaxPartitions=%d", (TUint) this, (TUint) aSectorBuffer, (TUint) aEntry, aMaxPartitions ); __ASSERT_ALWAYS(aMaxPartitions>0, LOCM_FAULT()); memclr(this, sizeof(TPartitionTableScanner)); iLBA = -1; @@ -4980,6 +5547,7 @@ { TInt n = iNextEntry - iFirstEntry; __KTRACE_OPT(KLOCDRV, Kern::Printf("TPartitionTableScanner N=%d", n)); + OstTrace1( TRACE_INTERNALS, TPARTITIONTABLESCANNER_NUMBERPARTITIONS, "Number of partitions=%d", n ); return n; } @@ -4990,27 +5558,41 @@ iRSS = a[8]|(a[9]<<8)|(a[10]<<16)|(a[11]<<24); iSectors = a[12]|(a[13]<<8)|(a[14]<<16)|(a[15]<<24); __KTRACE_OPT(KLOCDRV, Kern::Printf("SPart: BI=%02x TYPE=%02x RSS=%08x SIZE=%08x", iBootInd, iType, iRSS, iSectors)); + OstTraceExt4(TRACE_INTERNALS, TPARTITIONTABLESCANNER_SPART_SPART, "SPart: iBootInd=%02x; iType=%02x; iRSS=%08x; iSectors=%08x", (TUint) iBootInd, (TUint) iType, (TUint) iRSS, (TUint) iSectors); } TInt TPartitionTableScanner::MakeEntry(const SPart& a) { + OstTraceFunctionEntry1( TPARTITIONTABLESCANNER_MAKEENTRY_ENTRY, this ); if (iNextEntry == iLimit) + { + OstTraceFunctionExitExt( TPARTITIONTABLESCANNER_MAKEENTRY_EXIT1, this, KErrOverflow ); return KErrOverflow; + } if (a.iRSS<=0 || a.iSectors<=0 || a.iRSS>=iMediaSize) + { + OstTraceFunctionExitExt( TPARTITIONTABLESCANNER_MAKEENTRY_EXIT2, this, KErrCorrupt ); return KErrCorrupt; + } if (TUint64(a.iRSS) + TUint64(a.iSectors) > TUint64(iMediaSize)) + { + OstTraceFunctionExitExt( TPARTITIONTABLESCANNER_MAKEENTRY_EXIT3, this, KErrCorrupt ); return KErrCorrupt; + } iNextEntry->iBootIndicator = a.iBootInd; iNextEntry->iPartitionType = a.iType; iNextEntry->iPartitionBaseAddr = TInt64(a.iRSS)<<ESectorShift; iNextEntry->iPartitionLen = TInt64(a.iSectors)<<ESectorShift; ++iNextEntry; + OstTraceFunctionExitExt( TPARTITIONTABLESCANNER_MAKEENTRY_EXIT4, this, KErrNone ); return KErrNone; } EXPORT_C TInt64 TPartitionTableScanner::NextLBA() { + OstTraceFunctionEntry0( TPARTITIONTABLESCANNER_NEXTLBA_ENTRY ); __KTRACE_OPT(KLOCDRV, Kern::Printf(">TPartitionTableScanner iLBA=%08x %08x", I64HIGH(iLBA), I64LOW(iLBA))); + OstTraceExt2( TRACE_INTERNALS, TPARTITIONTABLESCANNER_NEXTLBA1, "TPartitionTableScanner iLBA=%08x %08x", I64HIGH(iLBA), I64LOW(iLBA) ); TInt r; TUint8* b = iSectorBuffer; TUint8* pS = b + 0x1be; @@ -5027,6 +5609,7 @@ if (b[ESectorSize-2]!=0x55 || b[ESectorSize-1]!=0xaa) { __KTRACE_OPT(KLOCDRV, Kern::Printf("Bad signature")); + OstTrace0( TRACE_INTERNALS, TPARTITIONTABLESCANNER_NEXTLBA2, "Bad signature" ); iLBA = KErrCorrupt; goto end; } @@ -5074,6 +5657,7 @@ const TInt64& size = iStack[sp].iSectors; __KTRACE_OPT(KLOCDRV, Kern::Printf("Stack[%d] RSS %08x %08x SIZE %08x %08x", sp, I64HIGH(rss), I64LOW(rss), I64HIGH(size), I64LOW(size) )); + OstTraceExt5(TRACE_INTERNALS, PARTITIONTABLESCANNER_NEXTLBA3, "Stack[%d] RSS 0x%x 0x%x SIZE 0x%08x 0x%08x", (TInt) sp, (TUint) I64HIGH(rss), (TUint) I64LOW(rss), (TUint) I64HIGH(size), (TUint) I64LOW(size)); } #endif } @@ -5106,6 +5690,8 @@ end: __KTRACE_OPT(KLOCDRV, Kern::Printf("<TPartitionTableScanner iLBA=%08x %08x", I64HIGH(iLBA), I64LOW(iLBA))); + OstTraceExt2( TRACE_INTERNALS, TPARTITIONTABLESCANNER_NEXTLBA3, "TPartitionTableScanner iLBA=0x%08x 0x%08x", I64HIGH(iLBA), I64LOW(iLBA) ); + OstTraceFunctionExit0( TPARTITIONTABLESCANNER_NEXTLBA_EXIT ); return iLBA; } @@ -5121,9 +5707,9 @@ */ EXPORT_C TInt TLocDrvRequest::GetNextPhysicalAddress(TPhysAddr& aAddr, TInt& aLen) { + OstTraceExt2(TRACE_FLOW, TLOCDRVREQUEST_GETNEXTPHYSICALADDRESS_ENTRY, "> TLocDrvRequest::GetNextPhysicalAddress;aAddr=%x;aLen=%d;", (TUint) &aAddr, aLen ); if (Flags() & EPhysAddr) { - #ifdef __DEMAND_PAGING__ if (DMediaPagingDevice::PagingRequest(*this)) { @@ -5134,6 +5720,7 @@ } else { + OstTraceFunctionExitExt( TLOCDRVREQUEST_GETNEXTPHYSICALADDRESS_EXIT, this, KErrNotSupported ); return KErrNotSupported; } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/drivers/locmedia/traces/OstTraceDefinitions.h Tue Jan 26 13:13:38 2010 +0200 @@ -0,0 +1,21 @@ +// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: + +#ifndef __OSTTRACEDEFINITIONS_H__ +#define __OSTTRACEDEFINITIONS_H__ +// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler +// REMOVE BEFORE CHECK-IN TO VERSION CONTROL +//#define OST_TRACE_COMPILER_IN_USE +#include <OpenSystemTrace.h> +#endif
--- a/kernel/eka/drivers/media/base_e32_drivers_media.mrp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/media/base_e32_drivers_media.mrp Tue Jan 26 13:13:38 2010 +0200 @@ -14,6 +14,7 @@ source \sf\os\kernelhwsrv\kernel\eka\drivers\pbus\spbus.cpp source \sf\os\kernelhwsrv\kernel\eka\drivers\pbus\distribution.policy.s60 source \sf\os\kernelhwsrv\kernel\eka\drivers\pbus\pccard +source \sf\os\kernelhwsrv\kernel\eka\drivers\pbus\mmc\traces source \sf\os\kernelhwsrv\kernel\eka\drivers\pbus\mmc\epbusm.mmh source \sf\os\kernelhwsrv\kernel\eka\drivers\pbus\mmc\epbusmmc.mmp source \sf\os\kernelhwsrv\kernel\eka\drivers\pbus\mmc\mmccd_init.cpp
--- a/kernel/eka/drivers/medmmc/emmcptn.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/medmmc/emmcptn.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -16,6 +16,15 @@ // #include <drivers/emmcptn.h> +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "locmedia_ost.h" +#ifdef __VC32__ +#pragma warning(disable: 4127) // disabling warning "conditional expression is constant" +#endif +#include "emmcptnTraces.h" +#endif + const TInt KDiskSectorShift=9; @@ -50,27 +59,34 @@ DLegacyEMMCPartitionInfo::DLegacyEMMCPartitionInfo() : iSessionEndCallBack(DLegacyEMMCPartitionInfo::SessionEndCallBack, this) { + OstTraceFunctionEntry0( DLEGACYEMMCPARTITIONINFO_DLEGACYEMMCPARTITIONINFO_ENTRY ); } DLegacyEMMCPartitionInfo::~DLegacyEMMCPartitionInfo() { + OstTraceFunctionEntry0( DLEGACYEMMCPARTITIONINFO_DESTRUCTOR_ENTRY ); delete iSession; + OstTraceFunctionExit0( DLEGACYEMMCPARTITIONINFO_DESTRUCTOR_EXIT ); } TInt DLegacyEMMCPartitionInfo::Initialise(DMediaDriver* aDriver) { + OstTraceFunctionEntry1( DLEGACYEMMCPARTITIONINFO_INITIALISE_ENTRY, this ); iDriver = aDriver; DMMCSocket* socket = ((DMMCSocket*)((DPBusPrimaryMedia*)(iDriver->iPrimaryMedia))->iSocket); if(socket == NULL) - return(KErrNoMemory); + { + OstTraceFunctionExitExt( DLEGACYEMMCPARTITIONINFO_INITIALISE_EXIT1, this, KErrNoMemory ); + return KErrNoMemory; + } DMMCStack* stack = socket->Stack(0); iCard = stack->CardP(((DPBusPrimaryMedia*)(iDriver->iPrimaryMedia))->iSlotNumber); iSession = stack->AllocSession(iSessionEndCallBack); if (iSession == NULL) - return(KErrNoMemory); + return KErrNoMemory; iSession->SetStack(stack); iSession->SetCard(iCard); @@ -79,11 +95,13 @@ TInt bufLen, minorBufLen; stack->BufferInfo(iIntBuf, bufLen, minorBufLen); - return(KErrNone); + OstTraceFunctionExitExt( DLEGACYEMMCPARTITIONINFO_INITIALISE_EXIT2, this, KErrNone ); + return KErrNone; } TInt DLegacyEMMCPartitionInfo::PartitionInfo(TPartitionInfo& anInfo, const TMMCCallBack& aCallBack) { + OstTraceFunctionEntry1( DLEGACYEMMCPARTITIONINFO_PARTITIONINFO_ENTRY, this ); iPartitionInfo = &anInfo; iCallBack = aCallBack; // If media driver is persistent (see EMediaDriverPersistent), @@ -99,11 +117,13 @@ if(r != KErrNone) iDriver->EndInCritical(); - return(r); + OstTraceFunctionExitExt( DLEGACYEMMCPARTITIONINFO_PARTITIONINFO_EXIT, this, r ); + return r; } TInt DLegacyEMMCPartitionInfo::PartitionCaps(TLocDrv& aDrive, TDes8& aInfo) { + OstTraceFunctionEntry1( DLEGACYEMMCPARTITIONINFO_PARTITIONCAPS_ENTRY, this ); TLocalDriveCapsV6Buf& Info = static_cast< TLocalDriveCapsV6Buf&> (aInfo); // is this query for the swap partition ? @@ -129,17 +149,21 @@ Info().iMediaAtt|= KMediaAttWriteProtected; } + OstTraceFunctionExitExt( DLEGACYEMMCPARTITIONINFO_PARTITIONCAPS_EXIT, this, KErrNone ); return KErrNone; } void DLegacyEMMCPartitionInfo::SessionEndCallBack(TAny* aSelf) { + OstTraceFunctionEntry0( DLEGACYEMMCPARTITIONINFO_SESSIONENDCALLBACK_ENTRY ); DLegacyEMMCPartitionInfo& self = *static_cast<DLegacyEMMCPartitionInfo*>(aSelf); self.DoSessionEndCallBack(); + OstTraceFunctionExit0( DLEGACYEMMCPARTITIONINFO_SESSIONENDCALLBACK_EXIT ); } void DLegacyEMMCPartitionInfo::DoSessionEndCallBack() { + OstTraceFunctionEntry1( DLEGACYEMMCPARTITIONINFO_DOSESSIONENDCALLBACK_ENTRY, this ); iDriver->EndInCritical(); TInt r = iSession->EpocErrorCode(); @@ -148,6 +172,7 @@ r = DecodePartitionInfo(); iDriver->PartitionInfoComplete(r == KErrNone ? r : KErrNotReady); + OstTraceFunctionExit1( DLEGACYEMMCPARTITIONINFO_DOSESSIONENDCALLBACK_EXIT, this ); } TInt DLegacyEMMCPartitionInfo::DecodePartitionInfo() @@ -155,6 +180,7 @@ // decode partition info that was read into internal buffer // { + OstTraceFunctionEntry1( DLEGACYEMMCPARTITIONINFO_DECODEPARTITIONINFO_ENTRY, this ); TUint partitionCount=iPartitionInfo->iPartitionCount=0; TInt defaultPartitionNumber=-1; TMBRPartitionEntry* pe; @@ -163,8 +189,11 @@ // Read of the first sector successful so check for a Master Boot Record if (*(TUint16*)(&iIntBuf[KMBRSignatureOffset])!=0xAA55) + { // If no valid signature give up now, No way to re-format an internal drive correctly + OstTraceFunctionExitExt( DLEGACYEMMCPARTITIONINFO_DECODEPARTITIONINFO_EXIT1, this, KErrCorrupt ); return KErrCorrupt; + } __ASSERT_COMPILE(KMBRFirstPartitionOffsetAligned + KMBRMaxPrimaryPartitions * sizeof(TMBRPartitionEntry) <= KMBRSignatureOffset); @@ -198,6 +227,7 @@ { SetPartitionEntry(&iPartitionInfo->iEntry[partitionCount],pe->iFirstSector,pe->iNumSectors); __KTRACE_OPT(KLOCDPAGING, Kern::Printf("Mmc: FAT partition found at sector #%u", pe->iFirstSector)); + OstTrace1(TRACE_INTERNALS, DLEGACYEMMCPARTITIONINFO_DECODEPARTITIONINFO_FAT, "FAT partition found at sector #%x", pe->iFirstSector); partitionCount++; } @@ -209,6 +239,7 @@ partitionCount++; __KTRACE_OPT(KLOCDPAGING, Kern::Printf("Mmc: KPartitionTypeROM found at sector #%u", pe->iFirstSector)); + OstTrace1(TRACE_INTERNALS, DLEGACYEMMCPARTITIONINFO_DECODEPARTITIONINFO_ROM, "KPartitionTypeROM found at sector #%x", pe->iFirstSector); } // ROFS partition ? @@ -220,6 +251,7 @@ SetPartitionEntry(&iPartitionInfo->iEntry[partitionCount],pe->iFirstSector,pe->iNumSectors); partitionEntry.iPartitionType = pe->iPartitionType; __KTRACE_OPT(KLOCDPAGING, Kern::Printf("Mmc: KPartitionTypeRofs found at sector #%u", pe->iFirstSector)); + OstTrace1(TRACE_INTERNALS, DLEGACYEMMCPARTITIONINFO_DECODEPARTITIONINFO_ROFS, "KPartitionTypeRofs found at sector #%x", pe->iFirstSector); partitionCount++; } @@ -227,7 +259,7 @@ else if (pe->iPartitionType == KPartitionTypePagedData) { __KTRACE_OPT(KLOCDPAGING, Kern::Printf("Mmc: KPartitionTypePagedData found at sector #%u", pe->iFirstSector)); - + OstTrace1(TRACE_INTERNALS, DLEGACYEMMCPARTITIONINFO_DECODEPARTITIONINFO_PAGED, "KPartitionTypeRofs found at sector #%x", pe->iFirstSector); TPartitionEntry& partitionEntry = iPartitionInfo->iEntry[partitionCount]; SetPartitionEntry(&iPartitionInfo->iEntry[partitionCount],pe->iFirstSector,pe->iNumSectors); partitionEntry.iPartitionType = pe->iPartitionType; @@ -245,6 +277,7 @@ if(part.iPartitionBaseAddr + part.iPartitionLen > deviceSize) { __KTRACE_OPT(KPBUSDRV, Kern::Printf("Mmc: MBR partition exceeds card memory space")); + OstTraceFunctionExitExt( DLEGACYEMMCPARTITIONINFO_DECODEPARTITIONINFO_EXIT2, this, KErrCorrupt ); return KErrCorrupt; } @@ -259,6 +292,7 @@ if(curr.iPartitionBaseAddr < (prev.iPartitionBaseAddr + prev.iPartitionLen)) { __KTRACE_OPT(KPBUSDRV, Kern::Printf("Mmc: Overlapping partitions")); + OstTraceFunctionExitExt( DLEGACYEMMCPARTITIONINFO_DECODEPARTITIONINFO_EXIT3, this, KErrCorrupt ); return KErrCorrupt; } } @@ -268,6 +302,7 @@ if (defaultPartitionNumber==(-1) && partitionCount==0) { __KTRACE_OPT(KPBUSDRV, Kern::Printf("No Valid Partitions Found!")); + OstTraceFunctionExitExt( DLEGACYEMMCPARTITIONINFO_DECODEPARTITIONINFO_EXIT4, this, KErrCorrupt ); return KErrCorrupt; } @@ -283,7 +318,8 @@ //Notify medmmc that partitioninfo is complete. iCallBack.CallBack(); - return(KErrNone); + OstTraceFunctionExitExt( DLEGACYEMMCPARTITIONINFO_DECODEPARTITIONINFO_EXIT5, this, KErrNone ); + return KErrNone; } @@ -292,11 +328,13 @@ // auxiliary static function to record partition information in TPartitionEntry object // { + OstTraceFunctionEntryExt( DLEGACYEMMCPARTITIONINFO_SETPARTITIONENTRY_ENTRY, this ); aEntry->iPartitionBaseAddr=aFirstSector; aEntry->iPartitionBaseAddr<<=KDiskSectorShift; aEntry->iPartitionLen=aNumSectors; aEntry->iPartitionLen<<=KDiskSectorShift; aEntry->iPartitionType=KPartitionTypeFAT12; + OstTraceFunctionExit1( DLEGACYEMMCPARTITIONINFO_SETPARTITIONENTRY_EXIT, this ); } // End - DLegacyEMMCPartitionInfo @@ -304,6 +342,7 @@ EXPORT_C DEMMCPartitionInfo* CreateEmmcPartitionInfo() { + OstTraceFunctionEntry0( _CREATEEMMCPARTITIONINFO_ENTRY ); return new DLegacyEMMCPartitionInfo; }
--- a/kernel/eka/drivers/medmmc/emmcptn.mmp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/medmmc/emmcptn.mmp Tue Jan 26 13:13:38 2010 +0200 @@ -20,6 +20,7 @@ #include "../../kernel/kern_ext.mmh" userinclude ../../include/drivers +USERINCLUDE traces source emmcptn.cpp
--- a/kernel/eka/drivers/medmmc/medmmc.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/medmmc/medmmc.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -19,6 +19,15 @@ #include "pbusmedia.h" #include <drivers/emmcptn.h> +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "locmedia_ost.h" +#ifdef __VC32__ +#pragma warning(disable: 4127) // disabling warning "conditional expression is constant" +#endif +#include "medmmcTraces.h" +#endif + #if defined(__DEMAND_PAGING__) // If in debug mode, enable paging stats and their retrieval using DLocalDrive::EControlIO #if defined( _DEBUG) @@ -317,19 +326,24 @@ DPhysicalDeviceMediaMmcFlash::DPhysicalDeviceMediaMmcFlash() { + OstTraceFunctionEntry1( DPHYSICALDEVICEMEDIAMMCFLASH_DPHYSICALDEVICEMEDIAMMCFLASH_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf("=mmd:ctr")); iUnitsMask = 0x01; iVersion = TVersion(KMediaDriverInterfaceMajorVersion,KMediaDriverInterfaceMinorVersion,KMediaDriverInterfaceBuildVersion); + OstTraceFunctionExit1( DPHYSICALDEVICEMEDIAMMCFLASH_DPHYSICALDEVICEMEDIAMMCFLASH_EXIT, this ); } TInt DPhysicalDeviceMediaMmcFlash::Install() { + OstTraceFunctionEntry1( DPHYSICALDEVICEMEDIAMMCFLASH_INSTALL_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf("=mmd:ins")); _LIT(KDrvNm, "Media.MmcF"); - return SetName(&KDrvNm); + TInt r = SetName(&KDrvNm); + OstTraceFunctionExitExt( DPHYSICALDEVICEMEDIAMMCFLASH_INSTALL_EXIT, this, r ); + return r; } @@ -344,22 +358,40 @@ // Return the priority of this media driver // { + OstTraceExt2(TRACE_FLOW, DPHYSICALDEVICEMEDIAMMCFLASH_INFO_ENTRY ,"DPhysicalDeviceMediaMmcFlash::Info;aFunction=%d;this=%x", aFunction, (TUint) this); __KTRACE_OPT(KPBUSDRV, Kern::Printf("=mmd:info")); if (aFunction==EPriority) + { + OstTraceFunctionExitExt( DPHYSICALDEVICEMEDIAMMCFLASH_INFO_EXIT1, this, KMediaDriverPriorityNormal ); return KMediaDriverPriorityNormal; + } // Don't close media driver when peripheral bus powers down. This avoids the need for Caps() to power up the stack. if (aFunction==EMediaDriverPersistent) + { + OstTraceFunctionExitExt( DPHYSICALDEVICEMEDIAMMCFLASH_INFO_EXIT2, this, KErrNone ); return KErrNone; + } + + OstTraceFunctionExitExt( DPHYSICALDEVICEMEDIAMMCFLASH_INFO_EXIT3, this, KErrNotSupported ); return KErrNotSupported; } TInt DPhysicalDeviceMediaMmcFlash::Validate(TInt aDeviceType, const TDesC8* /*aInfo*/, const TVersion& aVer) { + OstTraceExt2(TRACE_FLOW, DPHYSICALDEVICEMEDIAMMCFLASH_VALIDATE_ENTRY ,"DPhysicalDeviceMediaMmcFlash::Validate;aDeviceType=%d;this=%x", aDeviceType, (TUint) this); __KTRACE_OPT(KPBUSDRV, Kern::Printf("=mmd:validate aDeviceType %d", aDeviceType)); if (!Kern::QueryVersionSupported(iVersion,aVer)) + { + OstTraceFunctionExitExt( DPHYSICALDEVICEMEDIAMMCFLASH_VALIDATE_EXIT1, this, KErrNotSupported ); return KErrNotSupported; + } if (aDeviceType!=MEDIA_DEVICE_MMC) + { + OstTraceFunctionExitExt( DPHYSICALDEVICEMEDIAMMCFLASH_VALIDATE_EXIT2, this, KErrNotSupported ); return KErrNotSupported; + } + + OstTraceFunctionExitExt( DPHYSICALDEVICEMEDIAMMCFLASH_VALIDATE_EXIT3, this, KErrNone ); return KErrNone; } @@ -368,10 +400,14 @@ // Create an MMC Card media driver. // { + OstTraceExt2(TRACE_FLOW, DPHYSICALDEVICEMEDIAMMCFLASH_CREATE_ENTRY, "DPhysicalDeviceMediaMmcFlash::Create;aMediaId=%d;this=%x", aMediaId, (TUint) this); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:crt")); if (!Kern::QueryVersionSupported(iVersion,aVer)) + { + OstTraceFunctionExitExt( DPHYSICALDEVICEMEDIAMMCFLASH_CREATE_EXIT1, this, KErrNotSupported ); return KErrNotSupported; + } DMmcMediaDriverFlash* pD = new DMmcMediaDriverFlash(aMediaId); aChannel=pD; @@ -383,6 +419,8 @@ pD->OpenMediaDriverComplete(KErrNone); __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:mdf")); + + OstTraceFunctionExitExt( DPHYSICALDEVICEMEDIAMMCFLASH_CREATE_EXIT2, this, r ); return r; } @@ -431,16 +469,22 @@ __KTRACE_OPT(KPBUSDRV, Kern::Printf("=mmd:mmd")); // NB aMedia Id = the media ID of the primary media, iMediaId = the media ID of this media __KTRACE_OPT(KPBUSDRV, Kern::Printf("DMmcMediaDriverFlash(), iMediaId %d, aMediaId %d\n", iMediaId, aMediaId)); + OstTraceExt2( TRACE_FLOW, DMMCMEDIADRIVERFLASH_DMMCMEDIADRIVERFLASH, "> DMmcMediaDriverFlash::DMmcMediaDriverFlash;aMediaId=%d;iMediaId=%d", (TInt) aMediaId, (TInt) iMediaId ); + } #pragma warning( default : 4355 ) TInt DMmcMediaDriverFlash::DoCreate(TInt /*aMediaId*/) { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_DOCREATE_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:opn")); iSocket = ((DMMCSocket*)((DPBusPrimaryMedia*)iPrimaryMedia)->iSocket); if(iSocket == NULL) - return(KErrNoMemory); + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOCREATE_EXIT1, this, KErrNoMemory ); + return KErrNoMemory; + } iCardNumber = ((DPBusPrimaryMedia*)iPrimaryMedia)->iSlotNumber; @@ -453,14 +497,17 @@ iInternalSlot = machineInfo.iFlags & slotFlag; __KTRACE_OPT(KPBUSDRV, Kern::Printf("DMmcMediaDriverFlash::DoCreate() slotNumber %d iInternalSlot %d", iCardNumber, iInternalSlot)); - + OstTraceExt2(TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DOCREATE_SLOT, "slotNumber=%d; iInternalSlot=%d", iCardNumber, iInternalSlot); iSessionEndDfc.SetDfcQ(&iSocket->iDfcQ); iDataTransferCallBackDfc.SetDfcQ(&iSocket->iDfcQ); // check right type of card if ((iMediaType=iCard->MediaType())==EMultiMediaNotSupported) - return(KErrNotReady); + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOCREATE_EXIT2, this, KErrNotReady ); + return KErrNotReady; + } // get card characteristics const TCSD& csd = iCard->CSD(); @@ -479,7 +526,10 @@ // allocate and initialize session object TInt r = AllocateSession(); if (r!= KErrNone) + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOCREATE_EXIT3, this, r ); return r; + } // get buffer memory from EPBUS TUint8* buf; @@ -504,13 +554,17 @@ TInt bufIndex = (iCardNumber * numMedia) + mediaIndex; __KTRACE_OPT(KPBUSDRV, Kern::Printf("physicalCardSlots %d, iCardNumber %d\n", physicalCardSlots, iCardNumber)); + OstTraceExt2(TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DOCREATE_VARS1, "physicalCardSlots=%d; iCardNumber=%d", physicalCardSlots, iCardNumber); __KTRACE_OPT(KPBUSDRV, Kern::Printf("iMediaId %d numMedia %d, mediaIndex %d, totalNumMedia %d, bufIndex %d\n", iMediaId, numMedia, mediaIndex, totalNumMedia, bufIndex)); + OstTraceExt5(TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DOCREATE_VARS2, "iMediaId=%d; numMedia=%d; mediaIndex=%d; totalNumMedia=%d; bufIndex=%d", iMediaId, numMedia, mediaIndex, totalNumMedia, bufIndex); __KTRACE_OPT(KPBUSDRV, Kern::Printf("bufLen1 %08X iCacheBuf1 %08X", bufLen, iCacheBuf)); + OstTraceExt2(TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DOCREATE_CACHEBUF1, "bufLen1=0x%08x; iCacheBuf1=0x%08x", (TUint) bufLen, (TUint) iCacheBuf); bufLen/= totalNumMedia; iCacheBuf+= bufIndex * bufLen; __KTRACE_OPT(KPBUSDRV, Kern::Printf("bufLen2 %08X iCacheBuf2 %08X", bufLen, iCacheBuf)); + OstTraceExt2(TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DOCREATE_CACHEBUF2, "bufLen2=0x%08x; iCacheBuf2=0x%08x", (TUint) bufLen, (TUint) iCacheBuf); iBlocksInBuffer = bufLen >> iBlkLenLog2; // may lose partial block if(iSocket->SupportsDoubleBuffering()) @@ -537,9 +591,13 @@ // check the preferred write group length is a power of two if(iPrWtGpLen == 0 || (iPrWtGpLen & (~iPrWtGpLen + 1)) != iPrWtGpLen) - return(KErrNotReady); + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOCREATE_EXIT4, this, KErrNotReady ); + return KErrNotReady; + } __KTRACE_OPT(KPBUSDRV, Kern::Printf("iMaxBufSize %d iPrWtGpLen %d\n", iMaxBufSize, iPrWtGpLen)); + OstTraceExt2(TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DOCREATE_IPRWTGPLEN1, "iMaxBufSize=%d; iPrWtGpLen1=%d", iMaxBufSize, iPrWtGpLen); // ensure the preferred write group length is as large as possible // so we can write to more than one write group at once while (iPrWtGpLen < (TUint32) iMaxBufSize) @@ -551,11 +609,15 @@ iPrWtGpMsk = TInt64(iPrWtGpLen - 1); __KTRACE_OPT(KPBUSDRV, Kern::Printf("iPrWtGpLen #2 %d\n", iPrWtGpLen)); + OstTrace1(TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DOCREATE_IPRWTGPLEN2, "iPrWtGpLen2=%d", iPrWtGpLen); // allocate index for cached blocks iCachedBlocks = KernAlloc<TInt64>(iBlocksInBuffer); if (iCachedBlocks == 0) - return(KErrNoMemory); + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOCREATE_EXIT5, this, KErrNoMemory ); + return KErrNoMemory; + } InvalidateCache(); iLstUsdCchEnt = iBlocksInBuffer - 1; // use entry 0 first @@ -563,7 +625,10 @@ // allocate read lookup index iGamma = KernAlloc<TInt>(iBlocksInBuffer); if (iGamma == 0) - return(KErrNoMemory); + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOCREATE_EXIT6, this, KErrNoMemory ); + return KErrNoMemory; + } // get current requirements iReadCurrentInMilliAmps = csd.MaxReadCurrentInMilliamps(); @@ -572,7 +637,10 @@ // get preferred erase information for format operations const TInt err = iCard->GetEraseInfo(iEraseInfo); if(err != KErrNone) - return(err); + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOCREATE_EXIT7, this, err ); + return err; + } iEraseUnitMsk = TInt64(iEraseInfo.iPreferredEraseUnitSize) - 1; @@ -588,16 +656,22 @@ { iMmcPartitionInfo = CreateEmmcPartitionInfo(); if(iMmcPartitionInfo == NULL) + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOCREATE_EXIT8, this, KErrNoMemory ); return KErrNoMemory; - + } TInt err = iMmcPartitionInfo->Initialise(this); if(err != KErrNone) + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOCREATE_EXIT9, this, err ); return err; + } } __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:opn")); - return(KErrNone); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOCREATE_EXIT10, this, KErrNone ); + return KErrNone; } void DMmcMediaDriverFlash::Close() @@ -605,6 +679,7 @@ // Close the media driver - also called on media change // { + OstTraceFunctionEntry0( DMMCMEDIADRIVERFLASH_CLOSE_ENTRY ); __KTRACE_OPT(KPBUSDRV,Kern::Printf("=mmd:cls")); EndInCritical(); @@ -612,11 +687,13 @@ iDataTransferCallBackDfc.Cancel(); CompleteRequest(KErrNotReady); DMediaDriver::Close(); + OstTraceFunctionExit0( DMMCMEDIADRIVERFLASH_CLOSE_EXIT ); } DMmcMediaDriverFlash::~DMmcMediaDriverFlash() { + OstTraceFunctionEntry0( DMMCMEDIADRIVERFLASH_DMMCMEDIADRIVERFLASH_ENTRY ); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:dtr")); iSessionEndDfc.Cancel(); @@ -629,23 +706,36 @@ delete iMmcPartitionInfo; __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:dtr")); + OstTraceFunctionExit0( DMMCMEDIADRIVERFLASH_DMMCMEDIADRIVERFLASH_EXIT ); } TInt DMmcMediaDriverFlash::AllocateSession() { +OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_ALLOCATESESSION_ENTRY, this ); + + // already allocated ? if (iSession != NULL) + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_ALLOCATESESSION_EXIT1, this, KErrNone ); return KErrNone; + } iSession = iStack->AllocSession(iSessionEndCallBack); if (iSession == NULL) + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_ALLOCATESESSION_EXIT2, this, KErrNoMemory ); return KErrNoMemory; + } iSession->SetStack(iStack); iSession->SetCard(iCard); iSession->SetDataTransferCallback(iDataTransferCallBack); + + + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_ALLOCATESESSION_EXIT3, this, KErrNone ); return KErrNone; } @@ -657,13 +747,19 @@ // will be launched from the callback DFC. // { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_DOREAD_ENTRY, this ); TInt r = CheckDevice(EMReqTypeNormalRd); - if (r != KErrNone) return r; + if (r != KErrNone) + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOREAD_EXIT1, this, r ); + return r; + } const TInt64 pos(iCurrentReq->Pos()); TUint32 length(I64LOW(iCurrentReq->Length())); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:dr:0x%lx,0x%x", pos, length)); + OstTraceExt2( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DO_READ, "Position=0x%lx; Length=0x%x", (TUint) pos, (TUint) length); __ASSERT_DEBUG(CurrentRequest() == EMReqIdle, Panic(EDRInUse)); __ASSERT_DEBUG(pos < TotalSizeInBytes(), Panic(EDRStart)); __ASSERT_DEBUG(iCurrentReq->Length() >= 0, Panic(EDRNotPositive)); @@ -692,7 +788,11 @@ else r = LaunchRead(iReqCur, length); - if (r == KErrNone) return r; + if (r == KErrNone) + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOREAD_EXIT2, this, r ); + return r; + } } } else @@ -716,6 +816,7 @@ __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:dr:%d", r)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOREAD_EXIT3, this, r ); return r; } @@ -728,6 +829,8 @@ // assumed that before this function is called that ReadDataUntilCacheExhausted() has been used. // { + OstTraceFunctionEntryExt( DMMCMEDIADRIVERFLASH_LAUNCHREAD_ENTRY, this ); + OstTraceExt2( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_LAUNCHREAD, "position=0x%lx; length=0x%x", (TUint) iCurrentReq->Pos(), (TUint) I64LOW(iCurrentReq->Length())); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:lr:0x%lx,0x%x", aStart, aLength)); __ASSERT_DEBUG(TotalSizeInBytes() > aStart, Panic(ELRStart)); __ASSERT_DEBUG(aLength > 0, Panic(ELRNotPositive)); @@ -779,6 +882,7 @@ TInt r = EngageAndSetReadRequest(EMReqRead); __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:lr:%d", r)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_LAUNCHREAD_EXIT, this, r ); return r; } @@ -790,7 +894,9 @@ // assumed that before this function is called that ReadDataUntilCacheExhausted() has been used. // { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_LAUNCHDBREAD_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:ldbr:0x%lx,0x%x", iReqCur, I64LOW(iReqEnd - iReqCur))); + OstTraceExt2( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_LAUNCHDBREAD, "position=0x%lx; length=0x%x", (TInt) iReqCur, (TInt) I64LOW(iReqEnd - iReqCur)); __ASSERT_DEBUG(TotalSizeInBytes() > iReqCur, Panic(ELRStart)); __ASSERT_DEBUG(I64LOW(iReqEnd - iReqCur) > 0, Panic(ELRNotPositive)); __ASSERT_DEBUG(TotalSizeInBytes() >= iReqEnd, Panic(ELREnd)); @@ -838,6 +944,7 @@ __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:ldbr:%d", r)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_LAUNCHDBREAD_EXIT, this, r ); return r; } @@ -849,6 +956,8 @@ // ReadDataUntilCacheExhausted() has been used. // { + OstTraceFunctionEntryExt( DMMCMEDIADRIVERFLASH_LAUNCHPHYSREAD_ENTRY, this ); + OstTraceExt2( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_LAUNCHPHYSREAD, "position=0x%lx; length=0x%x", (TInt) iReqCur, (TInt) I64LOW(iReqEnd - iReqCur)); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:physr:0x%lx,0x%x", aStart, aLength)); __ASSERT_DEBUG(TotalSizeInBytes() > aStart, Panic(ELRStart)); __ASSERT_DEBUG(aLength > 0, Panic(ELRNotPositive)); @@ -879,6 +988,7 @@ if (firstPartial) { __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:physr:FirstPartial")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_LAUNCH_PHYSREAD_FP, "FirstPartial"); // first index does not start on block boundary // iIntBuf linear address is used for IPC within DoReadDataTransferCallBack() iRdROB |= KIPCWrite; @@ -922,6 +1032,7 @@ __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:lphysr:%d", r)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_LAUNCHPHYSREAD_EXIT, this, r ); return r; } @@ -933,10 +1044,12 @@ // any sectors that are only partially modified. // { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_DOWRITE_ENTRY, this ); const TInt64 pos = iCurrentReq->Pos(); const TUint32 length = I64LOW(iCurrentReq->Length()); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:dw:0x%lx,0x%x", pos, length)); + OstTraceExt2( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DOWRITE, "position=0x%lx; length=0x%x", (TUint) pos, (TUint) length); __ASSERT_DEBUG(CurrentRequest() == EMReqIdle, Panic(EDWInUse)); __ASSERT_DEBUG(pos < TotalSizeInBytes(), Panic(EDWStart)); __ASSERT_DEBUG(length > 0, Panic(EDWNotPositive)); @@ -959,16 +1072,19 @@ __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:dw:%d", r)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOWRITE_EXIT, this, r ); return r; } TInt DMmcMediaDriverFlash::DoFormat() { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_DOFORMAT_ENTRY, this ); const TInt64 pos = iCurrentReq->Pos(); const TUint32 length = I64LOW(iCurrentReq->Length()); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:df:0x%lx,0x%x", pos, length)); + OstTraceExt2( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DOFORMAT, "position=0x%lx; length=0x%x", (TUint) pos, (TUint) length); __ASSERT_DEBUG(CurrentRequest() == EMReqIdle, Panic(EDFInUse)); __ASSERT_DEBUG(pos < TotalSizeInBytes(), Panic(EDFStart)); __ASSERT_DEBUG(length > 0, Panic(EDFNotPositive)); @@ -997,6 +1113,7 @@ __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:df:%d", r)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOFORMAT_EXIT, this, r ); return r; } @@ -1007,6 +1124,8 @@ // maintain the iReq* instance variables. It sets iIntBuf, iPhysStart and iPhysEnd. // { + OstTraceFunctionEntryExt( DMMCMEDIADRIVERFLASH_LAUNCHFORMAT_ENTRY, this ); + OstTraceExt2( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_LAUNCHFORMAT, "position=0x%lx; length=0x%x", (TInt) iReqCur, (TInt) I64LOW(iReqEnd - iReqCur)); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:lf:0x%lx,0x%x", aStart, aLength)); __ASSERT_DEBUG(TotalSizeInBytes() > aStart, Panic(ELFStart)); __ASSERT_DEBUG((aStart & iBlkMsk) == 0, Panic(ELWFmtStAlign)); @@ -1092,6 +1211,7 @@ r = EngageAndSetWriteRequest(EMReqFormat); } + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_LAUNCHFORMAT_EXIT, this, r ); return r; } @@ -1103,6 +1223,8 @@ // maintain the iReq* instance variables. It sets iIntBuf, iPhysStart and iPhysEnd. // { + OstTraceExt4(TRACE_FLOW, DMMCMEDIADRIVERFLASH_LAUNCHWRITE_ENTRY, "DMmcMediaDriverFlash::LaunchWrite;aStart=%Ld;aLength=%x;aMedReq=%d;this=%x", aStart, (TUint) aLength, (TInt) aMedReq, (TUint) this); + OstTraceExt2( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_LAUNCHWRITE, "position=0x%lx; length=0x%x", (TInt) iReqCur, (TInt) I64LOW(iReqEnd - iReqCur)); __KTRACE_OPT(KPBUSDRV, Kern::Printf("\n>mmd:lw:0x%lx,%d,%d", aStart, aLength, aMedReq)); __ASSERT_DEBUG(aMedReq == EMReqWrite || aMedReq == EMReqFormat, Panic(ELWRequest)); __ASSERT_DEBUG(TotalSizeInBytes() > aStart, Panic(ELWStart)); @@ -1207,16 +1329,20 @@ if (iWtRBM & KWtRBMFst) { __KTRACE_OPT(KPBUSDRV, Kern::Printf("mmd:lw: read-before-modify required on first block")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_LAUNCHWRITE_RBMF, "Read-before-modify required on first block"); if (iDoPhysicalAddress) iSession->SetupCIMReadBlock(I64LOW(iPhysStart >> KMMCardHighCapBlockSizeLog2), iMinorBuf, iBlkLen >> KMMCardHighCapBlockSizeLog2); else iSession->SetupCIMReadBlock(I64LOW(iPhysStart >> KMMCardHighCapBlockSizeLog2), iIntBuf, iBlkLen >> KMMCardHighCapBlockSizeLog2); - return EngageAndSetReadRequest(aMedReq); + r = EngageAndSetReadRequest(aMedReq); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_LAUNCHWRITE_EXIT1, this, r ); + return r; } else if (iWtRBM & KWtRBMLst) { __KTRACE_OPT(KPBUSDRV, Kern::Printf("mmd:lw: read-before-modify required on last block")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_LAUNCHWRITE_RBML, "Read-before-modify required on last block"); if(iDoDoubleBuffer || iDoPhysicalAddress) { // @@ -1242,12 +1368,15 @@ } // Kick off the RMW-read operation for the last block... - return EngageAndSetReadRequest(aMedReq); + r = EngageAndSetReadRequest(aMedReq); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_LAUNCHWRITE_EXIT2, this, r ); + return r; } if (iWtRBM & KWtMinFst) { __KTRACE_OPT(KPBUSDRV, Kern::Printf("mmd:lw:Phys write-first-block-only")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_LAUNCHWRITE_FBO, "Write first block only"); //Overwrite first block with the new data TInt32 tlen = I64LOW(aStart & iBlkMsk); TInt32 wlen = UMin(I64LOW((iBlkMsk+1) - tlen), aLength); @@ -1256,12 +1385,16 @@ TPtr8 tgt(&iMinorBuf[tlen], I64LOW(wlen)); if ( (r = iCurrentReq->ReadRemote(&tgt,I64LOW(usrOfst))) != KErrNone) + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_LAUNCHWRITE_EXIT3, this, r ); return r; + } } if (iWtRBM & KWtMinLst) { __KTRACE_OPT(KPBUSDRV, Kern::Printf("mmd:lw:Phys write-last-block-only")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_LAUNCHWRITE_LBO, "Write last block only"); iWtRBM &= ~KWtMinLst; //Overwrite last block with the new data const TInt64 medEnds = aStart + aLength; @@ -1271,7 +1404,10 @@ TPtr8 tgt(iCacheBuf, I64LOW(tlen)); if ( (r = iCurrentReq->ReadRemote(&tgt,I64LOW(usrOfst+aLength-tlen))) !=KErrNone) + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_LAUNCHWRITE_EXIT4, this, r ); return r; + } } // no reads required - read data from user buffer and launch write @@ -1313,7 +1449,7 @@ iPhysEnd = iPhysStart+physLength; if ((TUint32)physLength > physLen) physLength = physLen; // more memory in fragment than required! - + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_LAUNCHWRITE_PHYSICAL, "Physical write request" ); iSession->SetupCIMWriteBlock(I64LOW(iPhysStart >> KMMCardHighCapBlockSizeLog2), (TUint8*) physAddr, physLen >> KMMCardHighCapBlockSizeLog2); iSession->Command().iFlags|= KMMCCmdFlagPhysAddr; iSession->EnableDoubleBuffering(physLength >> KDiskSectorShift); @@ -1321,6 +1457,8 @@ else { __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:lw:Phys:%d", r)); + + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_LAUNCHWRITE_EXIT5, this, r ); return r; } } // if (iDoPhysicalAddress) @@ -1334,6 +1472,7 @@ if(!iDoDoubleBuffer) { // EPBUSM automatically uses CMD24 instead of CMD25 for single block writes + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_LAUNCHWRITE_STANDARD, "Standard write request" ); iSession->SetupCIMWriteBlock(I64LOW(iPhysStart >> KMMCardHighCapBlockSizeLog2), iIntBuf, I64LOW((iPhysEnd - iPhysStart) >> KMMCardHighCapBlockSizeLog2)); } else @@ -1345,6 +1484,7 @@ // in 'len' above). This is performed only once - the double-buffering // is subsequently handled within the DoDataTransferCallback function. // + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_LAUNCHWRITE_DB, "Double-buffered write request" ); iSession->SetupCIMWriteBlock(I64LOW(iPhysStart >> KMMCardHighCapBlockSizeLog2), iIntBuf, I64LOW((((iDbEnd + iBlkMsk) & ~iBlkMsk) - iPhysStart) >> KMMCardHighCapBlockSizeLog2)); iSession->EnableDoubleBuffering(I64LOW((len + iBlkMsk) & ~iBlkMsk) >> KDiskSectorShift); @@ -1373,6 +1513,7 @@ __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:lw:%d", r)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_LAUNCHWRITE_EXIT6, this, r ); return r; } @@ -1382,6 +1523,7 @@ // then unlock the card before trying to read the first sector. // { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_PARTITIONINFO_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:rpi")); __ASSERT_DEBUG(CurrentRequest() == EMReqIdle, Panic(ERPIInUse)); @@ -1397,7 +1539,8 @@ if (KErrNone == r) iMedReq = EMReqEMMCPtnInfo; - return(r); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_PARTITIONINFO_EXIT1, this, r ); + return r; } // Assume MBR will be present or is not required @@ -1417,17 +1560,26 @@ // media subsystem, which will be updated when the media is finally unlocked. r = CreateDefaultPartition(); if (r != KErrNone) + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_PARTITIONINFO_EXIT2, this, r ); return r; + } + + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_PARTITIONINFO_EXIT3, this, KErrLocked ); return KErrLocked; } // KErrNone indicates asynchronous completion + + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_PARTITIONINFO_EXIT4, this, r ); return r; } TInt DMmcMediaDriverFlash::LaunchRPIUnlock(TLocalDrivePasswordData& aPasswordData) { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_LAUNCHRPIUNLOCK_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:lru:%d,%d", iCard->IsReady(), iCard->IsLocked())); + OstTraceExt2( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_LAUNCHRPIUNLOCK_ICARD, "iCard->IsReady=%d; iCard->IsLocked=%d", iCard->IsReady(), iCard->IsLocked()); __ASSERT_DEBUG(iSession != NULL, Panic(ECFSessPtrNull)); TInt r = KErrNone; @@ -1457,6 +1609,7 @@ } __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:lru:%d", r)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_LAUNCHRPIUNLOCK_EXIT, this, r ); return r; } @@ -1466,6 +1619,7 @@ // launch read request on first KDiskSectorSize (512) bytes // { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_LAUNCHRPIREAD_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf((">mmd:lrr"))); __ASSERT_DEBUG(iSession != NULL, Panic(ECFSessPtrNull)); @@ -1482,12 +1636,14 @@ } __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:lrr:%d", r)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_LAUNCHRPIREAD_EXIT, this, r ); return r; } TInt DMmcMediaDriverFlash::LaunchRPIErase() { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_LAUNCHRPIERASE_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:lre:%d,%d", iCard->IsReady(), iCard->IsLocked())); __ASSERT_DEBUG(iSession != NULL, Panic(ECFSessPtrNull)); @@ -1503,6 +1659,7 @@ else { __KTRACE_OPT(KPBUSDRV, Kern::Printf("mmd:df:EMReqForceErase")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_LAUNCHRPIERASE_FORCE_ERASE, "Force erase"); iMinorBuf[0] = KMMCLockUnlockErase; iSession->SetupCIMLockUnlock(1, iMinorBuf); r = EngageAndSetWriteRequest(EMReqForceErase); @@ -1510,6 +1667,7 @@ } __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:lru:%d", r)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_LAUNCHRPIERASE_EXIT, this, r ); return r; } @@ -1519,6 +1677,7 @@ // decode partition info that was read into internal buffer // { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_DECODEPARTITIONINFO_ENTRY, this ); TInt partitionCount=iPartitionInfo->iPartitionCount=0; TInt defaultPartitionNumber=-1; TMBRPartitionEntry* pe; @@ -1563,6 +1722,7 @@ { SetPartitionEntry(&iPartitionInfo->iEntry[partitionCount],pe->iFirstSector,pe->iNumSectors); __KTRACE_OPT(KLOCDPAGING, Kern::Printf("Mmc: FAT partition found at sector #%u", pe->iFirstSector)); + OstTrace1(TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DECODEPARTITIONINFO_FS,"FAT partition found at sector #%u", pe->iFirstSector); partitionCount++; } else @@ -1586,6 +1746,7 @@ if(part.iPartitionBaseAddr + part.iPartitionLen > deviceSize) { __KTRACE_OPT(KPBUSDRV, Kern::Printf("Mmc: MBR partition exceeds card memory space")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DECODEPARTITIONINFO_PARTCOUNT1, "MBR partition exceeds card memory space" ); // Adjust the partition length to card address boundary part.iPartitionLen = (deviceSize - part.iPartitionBaseAddr); @@ -1593,6 +1754,7 @@ if(part.iPartitionLen <= 0) { __KTRACE_OPT(KPBUSDRV, Kern::Printf("Mmc: Invalid base address")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DECODEPARTITIONINFO_PARTCOUNT2, "Invalid base address" ); // Invalid MBR - assume the boot sector is in the first sector defaultPartitionNumber =-1; partitionCount=0; @@ -1609,6 +1771,7 @@ if(curr.iPartitionBaseAddr < (prev.iPartitionBaseAddr + prev.iPartitionLen)) { __KTRACE_OPT(KPBUSDRV, Kern::Printf("Mmc: Overlapping partitions")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DECODEPARTITIONINFO_PARTCOUNT3, "Overlapping partitions" ); // Adjust the partition length to not overlap the next partition prev.iPartitionLen = (curr.iPartitionBaseAddr - prev.iPartitionBaseAddr); @@ -1616,6 +1779,7 @@ if(prev.iPartitionLen <= 0) { __KTRACE_OPT(KPBUSDRV, Kern::Printf("Mmc: Invalid base address")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DECODEPARTITIONINFO_PARTCOUNT4, "Invalid base address" ); // Invalid MBR - assume the boot sector is in the first sector defaultPartitionNumber=(-1); partitionCount=0; @@ -1629,15 +1793,20 @@ if (defaultPartitionNumber==(-1) && partitionCount==0) { __KTRACE_OPT(KPBUSDRV, Kern::Printf("Mmc:PartitionInfo no MBR")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DECODEPARTITIONINFO_MBRDONE1, "No MBR" ); if (MBRMandatory(iCard)) { // If the MBR is missing AND is required, we present a default partition entry to the local // media subsystem, which will be updated when the media is finally formatted __KTRACE_OPT(KPBUSDRV, Kern::Printf("MBR mandatory, defining space for MBR + default partition")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DECODEPARTITIONINFO_MBRDONE2, "MBR mandatory, defining space for MBR + default partition" ); iMbrMissing = ETrue; TInt r = CreateDefaultPartition(); if (r != KErrNone) + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DECODEPARTITIONINFO_EXIT1, this, r ); return r; + } } else { @@ -1656,6 +1825,8 @@ __KTRACE_OPT(KPBUSDRV, Kern::Printf(" Partition2 (B:%xH L:%xH)",I64LOW(iPartitionInfo->iEntry[1].iPartitionBaseAddr),I64LOW(iPartitionInfo->iEntry[1].iPartitionLen))); __KTRACE_OPT(KPBUSDRV, Kern::Printf(" Partition3 (B:%xH L:%xH)",I64LOW(iPartitionInfo->iEntry[2].iPartitionBaseAddr),I64LOW(iPartitionInfo->iEntry[2].iPartitionLen))); __KTRACE_OPT(KPBUSDRV, Kern::Printf(" Partition4 (B:%xH L:%xH)",I64LOW(iPartitionInfo->iEntry[3].iPartitionBaseAddr),I64LOW(iPartitionInfo->iEntry[3].iPartitionLen))); + OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_MMCDEBUG, DMMCMEDIADRIVERFLASH_DECODEPARTITIONINFO_PARTINFO1, "Partition1 (B:0x%x L:0x%x); Partition2 (B:0x%x L:0x%x)", I64LOW(iPartitionInfo->iEntry[0].iPartitionBaseAddr),I64LOW(iPartitionInfo->iEntry[0].iPartitionLen),I64LOW(iPartitionInfo->iEntry[1].iPartitionBaseAddr),I64LOW(iPartitionInfo->iEntry[1].iPartitionLen)); + OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_MMCDEBUG, DMMCMEDIADRIVERFLASH_DECODEPARTITIONINFO_PARTINFO2, "Partition3 (B:0x%x L:0x%x); Partition4 (B:0x%x L:0x%x)", I64LOW(iPartitionInfo->iEntry[2].iPartitionBaseAddr),I64LOW(iPartitionInfo->iEntry[2].iPartitionLen),I64LOW(iPartitionInfo->iEntry[3].iPartitionBaseAddr),I64LOW(iPartitionInfo->iEntry[3].iPartitionLen)); #ifdef _DEBUG TMBRPartitionEntry cPe; @@ -1680,7 +1851,8 @@ } #endif - return(KErrNone); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DECODEPARTITIONINFO_EXIT2, this, KErrNone ); + return KErrNone; } @@ -1690,6 +1862,7 @@ @return Standard Symbian OS Error Code */ { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_WRITEPARTITIONINFO_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:wpi")); __ASSERT_DEBUG(iSession != NULL, Panic(ECFSessPtrNull)); @@ -1708,7 +1881,8 @@ __KTRACE_OPT(KPBUSDRV, Kern::Printf(" End Cyclinder : %02xh", partitionEntry.iEndCylinder)); __KTRACE_OPT(KPBUSDRV, Kern::Printf(" Relative Sector : %08xh", partitionEntry.iFirstSector)); __KTRACE_OPT(KPBUSDRV, Kern::Printf(" Number of Sectors: %08xh", partitionEntry.iNumSectors)); - + OstTraceExt5(TRACE_MMCDEBUG, DMMCMEDIADRIVERFLASH_WRITEPARTITIONINFO_PARTINFO1, "Boot ID=0x%02x; Start Head=0x%02x; Start Sector=0x%02x; Start Cyclinder=0x%02x; System ID=0x%02x", (TUint) partitionEntry.iX86BootIndicator, (TUint) partitionEntry.iStartHead, (TUint) partitionEntry.iStartSector, (TUint) partitionEntry.iStartCylinder, (TUint) partitionEntry.iPartitionType); + OstTraceExt5(TRACE_MMCDEBUG, DMMCMEDIADRIVERFLASH_WRITEPARTITIONINFO_PARTINFO2, "End Head=0x%02x; End Sector=0x%02x; End Cyclinder=0x%02x; Relative Sector=0x%08x; Number of Sectors=0x%08x", (TUint) partitionEntry.iEndHead, (TUint) partitionEntry.iEndSector, (TUint) partitionEntry.iEndCylinder, (TUint) partitionEntry.iFirstSector, (TUint) partitionEntry.iNumSectors); // // Clear all other partition entries and align the partition info into the minor buffer for writing... // @@ -1729,12 +1903,14 @@ __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:wpi:%d", err)); - return(err); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_WRITEPARTITIONINFO_EXIT, this, err ); + return err; } TInt DMmcMediaDriverFlash::CreateDefaultPartition() { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_CREATEDEFAULTPARTITION_ENTRY, this ); TMBRPartitionEntry defPartition; TInt r = GetDefaultPartitionInfo(defPartition); if (r == KErrNone) @@ -1744,6 +1920,7 @@ iPartitionInfo->iPartitionCount = 1; iPartitionInfo->iMediaSizeInBytes = TotalSizeInBytes(); } + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_CREATEDEFAULTPARTITION_EXIT, this, r ); return r; } @@ -1756,7 +1933,8 @@ { memclr(&aPartitionEntry, sizeof(TMBRPartitionEntry)); TUint16 reservedSectors; // Not used - return GetMediaDefaultPartitionInfo(aPartitionEntry, reservedSectors, iCard); + TInt r = GetMediaDefaultPartitionInfo(aPartitionEntry, reservedSectors, iCard); + return r; } @@ -1765,15 +1943,18 @@ // auxiliary static function to record partition information in TPartitionEntry object // { + OstTraceFunctionEntry0( DMMCMEDIADRIVERFLASH_SETPARTITIONENTRY_ENTRY ); aEntry->iPartitionBaseAddr=aFirstSector; aEntry->iPartitionBaseAddr<<=KDiskSectorShift; aEntry->iPartitionLen=aNumSectors; aEntry->iPartitionLen<<=KDiskSectorShift; aEntry->iPartitionType=KPartitionTypeFAT12; + OstTraceFunctionExit0( DMMCMEDIADRIVERFLASH_SETPARTITIONENTRY_EXIT ); } TInt DMmcMediaDriverFlash::DoPasswordOp() { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_DOPASSWORDOP_ENTRY, this ); // Reconstruct password data structure in our address space TLocalDrivePasswordData clientData; TInt r = iCurrentReq->ReadRemoteRaw(&clientData, sizeof(TLocalDrivePasswordData)); @@ -1808,6 +1989,7 @@ if(r != KErrNone) PartitionInfoComplete(r); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_DOPASSWORDOP_EXIT, this, KErrNone ); return KErrNone; // ensures to indicate asynchronoous completion } @@ -1819,6 +2001,7 @@ // LaunchRPIUnlock(). // { + OstTraceExt2(TRACE_FLOW, DMMCMEDIADRIVERFLASH_PASSWORDCONTROL_ENTRY ,"DMmcMediaDriverFlash::PasswordControl;aFunc=%d;this=%x", aFunc, (TUint) this); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:pc:%d", (TInt) aFunc)); __ASSERT_DEBUG(CurrentRequest() == EMReqIdle, Panic(EPCInUse)); __ASSERT_DEBUG(aFunc == DLocalDrive::EPasswordLock || aFunc == DLocalDrive::EPasswordClear, Panic(EPCFunc)); @@ -1902,6 +2085,7 @@ CompleteRequest(r); __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:pc:%d", r)); + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_PASSWORDCONTROL_EXIT, this ); } @@ -1912,7 +2096,7 @@ // Check the device before initiating a command // { - + OstTraceExt2(TRACE_FLOW, DMMCMEDIADRIVERFLASH_CHECKDEVICE_ENTRY, "DMmcMediaDriverFlash::CheckDevice;aReqType=%d;this=%x", (TInt) aReqType, (TUint) this); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:cd:%d",aReqType)); TInt r=KErrNone; @@ -1949,7 +2133,8 @@ r=KErrAccessDenied; __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:cd:%d", r)); - return(r); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_CHECKDEVICE_EXIT, this, r ); + return r; } void DMmcMediaDriverFlash::SessionEndCallBack(TAny* aMediaDriver) @@ -1958,9 +2143,11 @@ // next session or to complete client request. // { + OstTraceFunctionEntry0( DMMCMEDIADRIVERFLASH_SESSIONENDCALLBACK_ENTRY ); DMmcMediaDriverFlash& md = *static_cast<DMmcMediaDriverFlash*>(aMediaDriver); __ASSERT_DEBUG(! md.iSessionEndDfc.Queued(), Panic(ESECBQueued)); md.iSessionEndDfc.Enque(); + OstTraceFunctionExit0( DMMCMEDIADRIVERFLASH_SESSIONENDCALLBACK_EXIT ); } @@ -1975,7 +2162,9 @@ // launch next session or complete client request // { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_DOSESSIONENDDFC_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:dsed:%d", CurrentRequest())); + OstTrace1( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DOSESSIONENDDFC_REQUEST, "Current Request=%d", CurrentRequest()); TInt r=KErrNone; @@ -2217,23 +2406,29 @@ InvalidateCache(); __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mdf:dsed:cmp:%d", r)); + OstTrace1( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DOSESSIONENDDFC_COMPLETE, "Complete request; retval=%d", r); CompleteRequest(r); } else { __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mdf:dsed:ncmp")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_DOSESSIONENDDFC_NOT_COMPLETE, "Request not complete"); } + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_DOSESSIONENDDFC_EXIT, this ); } void DMmcMediaDriverFlash::DataTransferCallBack(TAny* aMediaDriver) { + OstTraceFunctionEntry0( DMMCMEDIADRIVERFLASH_DATATRANSFERCALLBACK_ENTRY ); DMmcMediaDriverFlash& md = *static_cast<DMmcMediaDriverFlash*>(aMediaDriver); __ASSERT_DEBUG(! md.iDataTransferCallBackDfc.Queued(), Panic(EDBCBQueued)); md.iDataTransferCallBackDfc.Enque(); + OstTraceFunctionExit0( DMMCMEDIADRIVERFLASH_DATATRANSFERCALLBACK_EXIT ); } void DMmcMediaDriverFlash::DataTransferCallBackDfc(TAny* aMediaDriver) { + OstTraceFunctionEntry0( DMMCMEDIADRIVERFLASH_DATATRANSFERCALLBACKDFC_ENTRY ); DMmcMediaDriverFlash& md = *static_cast<DMmcMediaDriverFlash*>(aMediaDriver); if (md.iDoPhysicalAddress) @@ -2258,10 +2453,12 @@ md.DoReadDataTransferCallBack(); } } + OstTraceFunctionExit0( DMMCMEDIADRIVERFLASH_DATATRANSFERCALLBACKDFC_EXIT ); } void DMmcMediaDriverFlash::DoPhysWriteDataTransferCallBack() { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_DOPHYSWRITEDATATRANSFERCALLBACK_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf("++DMmcMediaDriverFlash::DoPhysWriteDataTransferCallBack()")); TInt err = KErrNone; @@ -2293,17 +2490,20 @@ iSession->MoreDataAvailable( (TInt)(iBlkLen >> KDiskSectorShift), iIntBuf, err); #endif __KTRACE_OPT(KPBUSDRV, Kern::Printf("--iDoPhysicalAddress(KIPCSetup)")); + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_DOPHYSWRITEDATATRANSFERCALLBACK_EXIT1, this ); return; } PrepareNextPhysicalFragment(); __KTRACE_OPT(KPBUSDRV, Kern::Printf("--DMmcMediaDriverFlash::DoPhysWriteDataTransferCallBack()")); + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_DOPHYSWRITEDATATRANSFERCALLBACK_EXIT2, this ); } void DMmcMediaDriverFlash::DoPhysReadDataTransferCallBack() { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_DOPHYSREADDATATRANSFERCALLBACK_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf("++DMmcMediaDriverFlash::DoPhysReadTransferCallBack()")); TInt err = KErrNone; @@ -2348,16 +2548,19 @@ #endif iSecondBuffer = ETrue; __KTRACE_OPT(KPBUSDRV, Kern::Printf("--iDoPhysicalAddress(KIPCWrite)")); + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_DOPHYSREADDATATRANSFERCALLBACK_EXIT1, this ); return; } PrepareNextPhysicalFragment(); __KTRACE_OPT(KPBUSDRV, Kern::Printf("--DMmcMediaDriverFlash::DoPhysReadTransferCallBack()")); + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_DOPHYSREADDATATRANSFERCALLBACK_EXIT2, this ); } void DMmcMediaDriverFlash::DoWriteDataTransferCallBack() { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_DOWRITEDATATRANSFERCALLBACK_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf("++DMmcMediaDriverFlash::DoWriteDataTransferCallBack()")); TInt err = KErrNone; @@ -2422,11 +2625,13 @@ iSession->MoreDataAvailable(numBlocks, bufPtr, err); __KTRACE_OPT(KPBUSDRV, Kern::Printf("--DMmcMediaDriverFlash::DoWriteDataTransferCallBack()")); + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_DOWRITEDATATRANSFERCALLBACK_EXIT, this ); } void DMmcMediaDriverFlash::DoReadDataTransferCallBack() { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_DOREADDATATRANSFERCALLBACK_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf("++DMmcMediaDriverFlash::DoReadTransferCallBack()")); TInt err = KErrNone; @@ -2449,6 +2654,7 @@ iSecondBuffer = EFalse; iSession->MoreDataAvailable(numBlocks, bufPtr, KErrNone); + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_DOREADDATATRANSFERCALLBACK_EXIT1, this ); return; } else @@ -2489,6 +2695,7 @@ iSession->MoreDataAvailable(numBlocks, bufPtr, err); __KTRACE_OPT(KPBUSDRV, Kern::Printf("--DMmcMediaDriverFlash::DoDataTransferCallBack()")); + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_DOREADDATATRANSFERCALLBACK_EXIT2, this ); } @@ -2497,13 +2704,19 @@ TInt DMmcMediaDriverFlash::EngageAndSetReadRequest(DMmcMediaDriverFlash::TMediaRequest aRequest) { - return EngageAndSetRequest(aRequest, iReadCurrentInMilliAmps); + OstTraceExt2(TRACE_FLOW, DMMCMEDIADRIVERFLASH_ENGAGEANDSETREADREQUEST_ENTRY, "DMmcMediaDriverFlash::EngageAndSetReadRequest;aRequest=%d;this=%x", (TInt) aRequest, (TUint) this); + TInt r = EngageAndSetRequest(aRequest, iReadCurrentInMilliAmps); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_ENGAGEANDSETREADREQUEST_EXIT, this, r ); + return r; } TInt DMmcMediaDriverFlash::EngageAndSetWriteRequest(DMmcMediaDriverFlash::TMediaRequest aRequest) { - return EngageAndSetRequest(aRequest, iWriteCurrentInMilliAmps); + OstTraceExt2(TRACE_FLOW, DMMCMEDIADRIVERFLASH_ENGAGEANDSETWRITEREQUEST_ENTRY, "DMmcMediaDriverFlash::EngageAndSetReadRequest;aRequest=%d;this=%x", (TInt) aRequest, (TUint) this); + TInt r = EngageAndSetRequest(aRequest, iWriteCurrentInMilliAmps); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_ENGAGEANDSETWRITEREQUEST_EXIT, this, r ); + return r; } @@ -2514,6 +2727,7 @@ // cleared in the corresponding call to CompleteRequest(). // { + OstTraceExt3(TRACE_FLOW, DMMCMEDIADRIVERFLASH_ENGAGEANDSETREQUEST_ENTRY, "DMmcMediaDriverFlash::EngageAndSetRequest;aRequest=%d;aCurrent=%d;this=%x", (TInt) aRequest, aCurrent, (TUint) this); __ASSERT_DEBUG(iSession != NULL, Panic(ECFSessPtrNull)); iMedReq = aRequest; @@ -2534,6 +2748,7 @@ EndInCritical(); } + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_ENGAGEANDSETREQUEST_EXIT, this, r ); return r; } @@ -2543,6 +2758,7 @@ // completes the specified request // { + OstTraceFunctionEntryExt( DMMCMEDIADRIVERFLASH_COMPLETEREQUEST_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf("=mmd:cr0x%08x,%d", iCurrentReq, aReason)); iMedReq = EMReqIdle; @@ -2559,10 +2775,12 @@ iCurrentReq=NULL; DMediaDriver::Complete(*pR,aReason); } + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_COMPLETEREQUEST_EXIT, this ); } TInt DMmcMediaDriverFlash::Caps(TLocDrv& aDrive, TLocalDriveCapsV6& aInfo) { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_CAPS_ENTRY, this ); // Fill buffer with current media caps. aInfo.iType = EMediaHardDisk; aInfo.iConnectionBusType = EConnectionBusInternal; @@ -2590,7 +2808,10 @@ TMBRPartitionEntry dummy; // Not used here const TInt r = GetMediaDefaultPartitionInfo(dummy, reservedSectors, iCard); if(r != KErrNone) + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_CAPS_EXIT1, this, r ); return r; + } aInfo.iFormatInfo.iReservedSectors = reservedSectors; aInfo.iExtraInfo = ETrue; @@ -2653,6 +2874,7 @@ // Must return KErrCompletion to indicate that this // is a synchronous version of the function + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_CAPS_EXIT2, this, KErrCompletion ); return KErrCompletion; } @@ -2670,7 +2892,9 @@ // This function is linear in the number of blocks in the cache. // { + OstTraceFunctionEntryExt( DMMCMEDIADRIVERFLASH_READDATAUNTILCACHEEXHAUSTED_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:rdc:%x,%x", iReqCur, iReqEnd)); + OstTraceExt2( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_READDATAUNTILCACHEEXHAUSTED, "iReqCur=0x%x; iReqEnd=0x%x", (TUint) iReqCur, (TUint) iReqEnd ); if ( iCurrentReq->IsPhysicalAddress() #if defined(__DEMAND_PAGING__) && !defined(__WINS__) @@ -2679,6 +2903,7 @@ ) { *aAllDone = EFalse; + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_READDATAUNTILCACHEEXHAUSTED_EXIT1, this, KErrNone ); return KErrNone; } @@ -2710,6 +2935,7 @@ *aAllDone = (iReqCur >= iReqEnd); __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:rdc:%d,%d", *aAllDone, r)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_READDATAUNTILCACHEEXHAUSTED_EXIT2, this, r ); return r; } @@ -2719,6 +2945,7 @@ // write the data from the most recent read operation to the user descriptor // { + OstTraceFunctionEntryExt( DMMCMEDIADRIVERFLASH_WRITEDATATOUSER_ENTRY, this ); TInt r = KErrNotSupported; // get range of data to read out of internal buffer @@ -2729,24 +2956,37 @@ // write data from internal buffer TUint usrOfst = I64LOW(iReqCur - iReqStart); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_WRITEDATATOUSER_LATENCY1, "Begin writing user data" ); #if defined(__DEMAND_PAGING__) && !defined(__WINS__) if (DMediaPagingDevice::PageInRequest(*iCurrentReq)) r=iCurrentReq->WriteToPageHandler((TUint8 *)(&extrView[0]), len, usrOfst); else #endif // __DEMAND_PAGING__ r = iCurrentReq->WriteRemote(&extrView,usrOfst); - + + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_WRITEDATATOUSER_LATENCY2, "End writing user data" ); + + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_WRITEDATATOUSER_EXIT, this, r ); return r; } TInt DMmcMediaDriverFlash::ReadDataFromUser(TDes8& aDes, TInt aOffset) { + OstTraceExt2(TRACE_FLOW, DMMCMEDIADRIVERFLASH_READDATAFROMUSER_ENTRY ,"DMmcMediaDriverFlash::ReadDataFromUser;aOffset=%d;this=%x", aOffset, (TUint) this); + TInt r = KErrNotSupported; #ifndef __WINS__ if (DMediaPagingDevice::PageOutRequest(*iCurrentReq)) - return iCurrentReq->ReadFromPageHandler((TAny*) aDes.Ptr(), aDes.MaxLength(), aOffset); + { + r = iCurrentReq->ReadFromPageHandler((TAny*) aDes.Ptr(), aDes.MaxLength(), aOffset); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_READDATAFROMUSER_EXIT1, this, r ); + return r; + } else #endif // #ifndef __WINS__ - return iCurrentReq->ReadRemote(&aDes, aOffset); + r = iCurrentReq->ReadRemote(&aDes, aOffset); + + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_READDATAFROMUSER_EXIT2, this, r ); + return r; } TInt DMmcMediaDriverFlash::AdjustPhysicalFragment(TPhysAddr &aPhysAddr, TInt &aPhysLength) @@ -2756,6 +2996,7 @@ // Note the offset may encompass multiple memory fragments. // { + OstTraceExt3(TRACE_FLOW, DMMCMEDIADRIVERFLASH_ADJUSTPHYSICALFRAGMENT_ENTRY, "DMmcMediaDriverFlash::AdjustPhysicalFragment;aPhysAddr=%x;aPhysLength=%d;this=%x", (TUint) aPhysAddr, aPhysLength, (TUint) this); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:APF")); TInt err = KErrNone; @@ -2766,7 +3007,10 @@ err = iCurrentReq->GetNextPhysicalAddress(aPhysAddr, aPhysLength); if (err != KErrNone) + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_ADJUSTPHYSICALFRAGMENT_EXIT1, this, err ); return err; + } if (offset >= aPhysLength) // more offset than in this physical chunk { @@ -2788,6 +3032,7 @@ if (aPhysAddr == 0) { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_ADJUSTPHYSICALFRAGMENT_EXIT2, this, KErrNoMemory ); return KErrNoMemory; } @@ -2796,11 +3041,13 @@ if ( (aPhysAddr & (iSocket->DmaAlignment()-1) ) ) { __KTRACE_OPT(KPBUSDRV, Kern::Printf("mmd:lr:Memory Fragment Not Word Aligned!")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_ADJUSTPHYSICALFRAGMENT_DMA, "Memory fragment not word aligned"); Panic(ENotDMAAligned); } #endif //_DEBUG __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:APF physAddr(0x%x), physLength(%d)",aPhysAddr, aPhysLength)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_ADJUSTPHYSICALFRAGMENT_EXIT3, this, err ); return err; } @@ -2811,6 +3058,7 @@ // memory fragments. // { + OstTraceExt4(TRACE_FLOW, DMMCMEDIADRIVERFLASH_PREPAREFIRSTPHYSICALFRAGMENT_ENTRY, "DMmcMediaDriverFlash::PrepareFirstPhysicalFragment;aPhysAddr=%x;aPhysLength=%d;aLength=%x;this=%x", (TUint) aPhysAddr, aPhysLength, (TUint) aLength, (TUint) this); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:PFPF")); TInt r = KErrNone; @@ -2822,6 +3070,7 @@ if ( ((TUint32)aPhysLength >= aLength) && len ) { __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:PFPF-end block")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_PREPAREFIRSTPHYSICALFRAGMENT_EB, "End block"); //next iteration will be an IPC for the end block //There is enough space in physical memory to fit //the extended read, but exceeds boundary for this request. @@ -2833,6 +3082,7 @@ if (aPhysLength & iBlkMsk) { __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:PFPF-straddles boundary")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_PREPAREFIRSTPHYSICALFRAGMENT_SB, "Straddles boundary"); // block must be straddling a fragment boundary // Next iteration must be an IPC iRdROB |= KIPCSetup; @@ -2844,6 +3094,7 @@ } __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:PFPF err(%d), physAddr(0x%x), physLength(%d)",r, aPhysAddr, aPhysLength)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_PREPAREFIRSTPHYSICALFRAGMENT_EXIT, this, r ); return r; } @@ -2855,6 +3106,7 @@ // memory fragments. // { + OstTraceFunctionEntry0( DMMCMEDIADRIVERFLASH_PREPARENEXTPHYSICALFRAGMENT_ENTRY ); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:PNPF")); TInt err = KErrNone; TPhysAddr physAddr = 0; @@ -2871,6 +3123,8 @@ if (len) { __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:PNPF-end block")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_PREPARENEXTPHYSICALFRAGMENT_EB, "End block" ); + // end point not block aligned! // next iteration must be an IPC call iRdROB |= KIPCSetup; @@ -2885,6 +3139,8 @@ if (physLength & iBlkMsk) { __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:PNPF-straddles boundary")); + OstTrace0( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_PREPARENEXTPHYSICALFRAGMENT_SB, "Straddles boundary" ); + // block must be straddling a fragment boundary // Next iteration must be an IPC iRdROB |= KIPCSetup; @@ -2900,6 +3156,7 @@ iSession->MoreDataAvailable( (physLength >> KDiskSectorShift), (TUint8*) physAddr, err); iSecondBuffer = EFalse; __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:PNPF")); + OstTraceFunctionExit0( DMMCMEDIADRIVERFLASH_PREPARENEXTPHYSICALFRAGMENT_EXIT ); } TUint8* DMmcMediaDriverFlash::ReserveReadBlocks(TInt64 aStart, TInt64 aEnd, TUint32* aLength) @@ -2911,6 +3168,7 @@ // ReadDataUntilCacheExhausted() is called from the callback DFC. // { + OstTraceFunctionEntryExt( DMMCMEDIADRIVERFLASH_RESERVEREADBLOCKS_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:rrb:%lx,%lx", aStart, aEnd)); __ASSERT_DEBUG((aStart & iBlkMsk) == 0, Panic(ERRBStAlign)); @@ -2960,6 +3218,8 @@ if (blkCnt < 1) blkCnt = 1; //RBW required < 1 block to be read + OstTraceExt2( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_RESERVEREADBLOCKS_RANGE, "blocksInRange=%d; blkCnt=%d", blocksInRange, blkCnt ); + TUint32 lengthInBytes = blkCnt << iBlkLenLog2; *aLength = lengthInBytes; MarkBlocks(aStart, aStart + lengthInBytes, startIndex); @@ -2968,6 +3228,7 @@ __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:rrb:%x", (TUint32) raby)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_RESERVEREADBLOCKS_EXIT, this, ( TUint )( raby ) ); return raby; } @@ -2985,6 +3246,7 @@ // information to minimize RBMs. // { + OstTraceFunctionEntryExt( DMMCMEDIADRIVERFLASH_RESERVEWRITEBLOCKS_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:rwb:%lx,%lx", aStart, aEnd)); TInt64 physStart = aStart & ~iBlkMsk; @@ -3000,6 +3262,7 @@ const TBool lastPartial = (aEnd & iBlkMsk) != 0; const TInt blkCnt = I64LOW((physEnd - physStart) >> iBlkLenLog2); + OstTrace1( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_RESERVEWRITEBLOCKS_RANGE, "blkCnt=%d", blkCnt ); TBool startUsed = EFalse; TBool endUsed = EFalse; @@ -3044,6 +3307,7 @@ //Physical addressing not to be used. //more efficent to use local Cache copying iDoPhysicalAddress = EFalse; + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_RESERVEWRITEBLOCKS_EXIT1, this, ( TUint )( raby ) ); return raby; } else @@ -3089,6 +3353,7 @@ *aRBM |= KWtRBMLst; } + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_RESERVEWRITEBLOCKS_EXIT2, this, ( TUint )( raby ) ); return raby; } } // if (iDoPhysicalAddress) @@ -3197,6 +3462,7 @@ __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:rwb:%x", (TUint32) raby)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_RESERVEWRITEBLOCKS_EXIT3, this, ( TUint )( raby ) ); return raby; } @@ -3206,6 +3472,7 @@ // the cache are already in the buffer they are invalidated. // { + OstTraceFunctionEntryExt( DMMCMEDIADRIVERFLASH_MARKBLOCKS_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf("=mmd:mb:%lx,%lx,%d", aStart, aEnd, aStartIndex)); __ASSERT_DEBUG(TotalSizeInBytes() > aStart, Panic(EMBStPos)); @@ -3225,6 +3492,7 @@ } TInt blkCnt = I64LOW((aEnd - aStart) >> iBlkLenLog2); + OstTrace1( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_MARKBLOCKS_RANGE, "blkCnt=%d", blkCnt ); for (i = aStartIndex; i < aStartIndex + blkCnt; ++i) iCachedBlocks[i] = aStart + (static_cast<TUint32>(i - aStartIndex) << iBlkLenLog2); @@ -3235,6 +3503,7 @@ } __ASSERT_CACHE(CacheInvariant(), Panic(EMBCchInvPost)); + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_MARKBLOCKS_EXIT, this ); } @@ -3247,6 +3516,7 @@ // quadratically searching through the array for each block. // { + OstTraceFunctionEntryExt( DMMCMEDIADRIVERFLASH_BUILDGAMMAARRAY_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf("=mmd:bga:%lx,%lx", aStart, aEnd)); __ASSERT_DEBUG(TotalSizeInBytes() > aStart, Panic(EBGAStPos)); @@ -3259,6 +3529,7 @@ // KNoCacheBlock = (0xff) x 4 TUint blocksInRange = I64LOW((aEnd - aStart) >> iBlkLenLog2); + OstTrace1( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_BUILDGAMMAARRAY_RANGE, "blocksInRange=%d", blocksInRange ); memset(iGamma, 0xff, sizeof(*iGamma) * blocksInRange); TInt64 blkAddr = 0; @@ -3271,20 +3542,24 @@ blocksInRange--; } } + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_BUILDGAMMAARRAY_EXIT, this ); } void DMmcMediaDriverFlash::InvalidateCache() { + OstTraceFunctionEntry0( DMMCMEDIADRIVERFLASH_INVALIDATECACHE1_ENTRY ); __KTRACE_OPT(KPBUSDRV, Kern::Printf("=mmd:ich")); // KInvalidBlock = (0xff) x 4 memset(iCachedBlocks, 0xff, sizeof(*iCachedBlocks) * iBlocksInBuffer); + OstTraceFunctionExit0( DMMCMEDIADRIVERFLASH_INVALIDATECACHE1_EXIT ); } // Invalidate any cache entries from aStart to aEnd // This is for DMA writes and is to prevent the cache becoming inconsistent with the media. void DMmcMediaDriverFlash::InvalidateCache(TInt64 aStart, TInt64 aEnd) { + OstTraceFunctionEntryExt( DMMCMEDIADRIVERFLASH_INVALIDATECACHE2_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf("=mmd:ich:%lx,%lx", aStart, aEnd)); __ASSERT_DEBUG(TotalSizeInBytes() > aStart, Panic(EBGAStPos)); @@ -3292,6 +3567,7 @@ __ASSERT_DEBUG(TotalSizeInBytes() >= aEnd, Panic(EBGAEndPos)); const TInt blkCnt = I64LOW((aStart - aEnd) >> iBlkLenLog2); + OstTrace1( TRACE_INTERNALS, DMMCMEDIADRIVERFLASH_INVALIDATECACHE_RANGE, "blocksInRange=%d", blkCnt ); __ASSERT_CACHE(CacheInvariant(), Panic(EBGACchInv)); @@ -3303,20 +3579,24 @@ if (blkAddr >= aStart && blkAddr < endBlk) iCachedBlocks[i] = KInvalidBlock; } + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_INVALIDATECACHE2_EXIT, this ); } TUint8* DMmcMediaDriverFlash::IdxToCchMem(TInt aIdx) const { + OstTraceFunctionEntryExt( DMMCMEDIADRIVERFLASH_IDXTOCCHMEM_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf("=mmd:icm:%d", aIdx)); __ASSERT_DEBUG(aIdx >= 0, Panic(EICMNegative)); __ASSERT_DEBUG(aIdx < iBlocksInBuffer, Panic(EICMOverflow)); + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_IDXTOCCHMEM_EXIT, this ); return &iCacheBuf[aIdx << iBlkLenLog2]; } TInt DMmcMediaDriverFlash::CchMemToIdx(TUint8* aMemP) const { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_CCHMEMTOIDX_ENTRY, this ); __ASSERT_DEBUG((aMemP >= iCacheBuf) && (aMemP < iCacheBuf + (iBlocksInBuffer << iBlkLenLog2)), Panic(ECMIOverflow)); return((aMemP - iCacheBuf) >> iBlkLenLog2); @@ -3330,6 +3610,7 @@ // the cache length. // { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_CACHEINVARIANT_ENTRY, this ); for (TInt i = 0; i < iBlocksInBuffer; ++i) { if (iCachedBlocks[i] == KInvalidBlock) @@ -3348,12 +3629,14 @@ } } + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_CACHEINVARIANT_EXIT, this ); return ETrue; } #endif void DMmcMediaDriverFlash::NotifyPowerDown() { + OstTraceFunctionEntry0( DMMCMEDIADRIVERFLASH_NOTIFYPOWERDOWN_ENTRY ); __KTRACE_OPT(KPBUSDRV,Kern::Printf(">Mmc:NotifyPowerDown")); iSessionEndDfc.Cancel(); @@ -3367,10 +3650,12 @@ CompleteRequest(KErrNotReady); iMedReq = EMReqIdle; + OstTraceFunctionExit0( DMMCMEDIADRIVERFLASH_NOTIFYPOWERDOWN_EXIT ); } void DMmcMediaDriverFlash::NotifyEmergencyPowerDown() { + OstTraceFunctionEntry0( DMMCMEDIADRIVERFLASH_NOTIFYEMERGENCYPOWERDOWN_ENTRY ); __KTRACE_OPT(KPBUSDRV,Kern::Printf(">Ata:NotifyEmergencyPowerDown")); iSessionEndDfc.Cancel(); @@ -3387,17 +3672,21 @@ CompleteRequest(r); iMedReq = EMReqIdle; + OstTraceFunctionExit0( DMMCMEDIADRIVERFLASH_NOTIFYEMERGENCYPOWERDOWN_EXIT ); } TInt DMmcMediaDriverFlash::Request(TLocDrvRequest& aRequest) { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_REQUEST_ENTRY, this ); __KTRACE_OPT(KLOCDRV,Kern::Printf("MmcMd:Req %08x id %d",&aRequest,aRequest.Id())); TInt r=KErrNotSupported; TInt id=aRequest.Id(); + OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DMMCMEDIADRIVERFLASH_REQUEST_ID, "Request=0x%08x; Request ID=%d", (TUint) &aRequest, id); #if defined (__TEST_PAGING_MEDIA_DRIVER__) DThread* client=aRequest.Client(); __KTRACE_OPT(KLOCDPAGING,Kern::Printf("Client:0x%08x",client)); + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DMMCMEDIADRIVERFLASH_REQUEST_CLIENT, "Request client=0x%08x", (TUint) client); #endif // __TEST_PAGING_MEDIA_DRIVER__ // First handle requests that can be handled without deferring @@ -3409,6 +3698,7 @@ c.iSize = drive.iPartitionLen; c.iPartitionType = drive.iPartitionType; c.iHiddenSectors = (TUint) (drive.iPartitionBaseAddr >> KDiskSectorShift); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_REQUEST_EXIT1, this, r ); return r; } @@ -3425,6 +3715,8 @@ // a request is already in progress, so hold on to this one __KTRACE_OPT(KLOCDRV,Kern::Printf("MmcMd:Req %08x ret 1",&aRequest)); + OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DMMCMEDIADRIVERFLASH_REQUEST_IN_PROGRESS, "Request in progress=0x%08x", (TUint) &aRequest); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_REQUEST_EXIT2, this, KMediaDriverDeferRequest ); return KMediaDriverDeferRequest; } else @@ -3441,11 +3733,13 @@ case DMediaPagingDevice::ERomPageInRequest: __KTRACE_OPT(KLOCDPAGING,Kern::Printf("DMediaDriverFlash::Request(ERomPageInRequest)")); BTraceContext8(BTrace::EPagingMedia,BTrace::EPagingMediaPagingMedDrvBegin,MEDIA_DEVICE_MMC,iCurrentReq); + OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DMMCMEDIADRIVERFLASH_REQUEST_ROM_PAGE_IN, "ROM page-in request"); r=DoRead(); break; case DMediaPagingDevice::ECodePageInRequest: __KTRACE_OPT(KLOCDPAGING,Kern::Printf("DMediaDriverFlash::Request(ECodePageInRequest)")); BTraceContext8(BTrace::EPagingMedia,BTrace::EPagingMediaPagingMedDrvBegin,MEDIA_DEVICE_MMC,iCurrentReq); + OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DMMCMEDIADRIVERFLASH_REQUEST_CODE_PAGE_IN, "Code page-in request"); r=DoRead(); break; #endif // __DEMAND_PAGING__ @@ -3459,12 +3753,18 @@ break; case DLocalDrive::EWrite: if (readOnly) + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_REQUEST_EXIT3, this, KErrNotSupported ); return KErrNotSupported; + } r=DoWrite(); break; case DLocalDrive::EFormat: if (readOnly) + { + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_REQUEST_EXIT4, this, KErrNotSupported ); return KErrNotSupported; + } r=DoFormat(); break; @@ -3539,13 +3839,16 @@ SetCurrentConsumption(KIdleCurrentInMilliAmps); } + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_REQUEST_EXIT5, this, r ); return r; } void DMmcMediaDriverFlash::Disconnect(DLocalDrive* aLocalDrive, TThreadMessage* aMsg) { + OstTraceFunctionEntry1( DMMCMEDIADRIVERFLASH_DISCONNECT_ENTRY, this ); // Complete using the default implementation DMediaDriver::Disconnect(aLocalDrive, aMsg); + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_DISCONNECT_EXIT, this ); } #ifdef _DEBUG_CACHE @@ -3558,6 +3861,7 @@ // this function is o(mn), whereas BuildGammaArray() is theta(m). // { + OstTraceFunctionEntryExt( DMMCMEDIADRIVERFLASH_GETCACHEDBLOCK_ENTRY, this ); __KTRACE_OPT(KPBUSDRV, Kern::Printf(">mmd:gcb:%lx", aMdAddr)); __ASSERT_DEBUG((aMdAddr & iBlkMsk) == 0, Panic(EGCBAlign)); @@ -3570,11 +3874,13 @@ { TUint8* raby = IdxToCchMem(i); __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:gcb:%x", (TUint32) raby)); + OstTraceFunctionExitExt( DMMCMEDIADRIVERFLASH_GETCACHEDBLOCK_EXIT1, this, ( TUint )( raby ) ); return raby; } } __KTRACE_OPT(KPBUSDRV, Kern::Printf("<mmd:gcb:0")); + OstTraceFunctionExit1( DMMCMEDIADRIVERFLASH_GETCACHEDBLOCK_EXIT2, this ); return 0; } #endif // _DEBUG_CACHE
--- a/kernel/eka/drivers/medmmc/medmmc.mmp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/medmmc/medmmc.mmp Tue Jan 26 13:13:38 2010 +0200 @@ -20,6 +20,7 @@ OS_LAYER_SYSTEMINCLUDE_SYMBIAN USERINCLUDE ../../include/drivers +USERINCLUDE traces target medmmc.pdd targettype pdd
--- a/kernel/eka/drivers/medmmc/mmcptn.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/medmmc/mmcptn.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -16,11 +16,20 @@ // #include "sdcard.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "locmedia_ost.h" +#ifdef __VC32__ +#pragma warning(disable: 4127) // disabling warning "conditional expression is constant" +#endif +#include "mmcptnTraces.h" +#endif const TInt KDiskSectorShift = 9; LOCAL_C void SetPartitionType(const TMMCard& aCard, TMBRPartitionEntry& aPartitionEntry) { + OstTraceFunctionEntry0( _SETPARTITIONTYPE_ENTRY ); if(aCard.IsHighCapacity()) { aPartitionEntry.iPartitionType = KPartitionTypeWin95FAT32; @@ -41,6 +50,7 @@ { aPartitionEntry.iPartitionType = KPartitionTypeWin95FAT32; } + OstTraceFunctionExit0( _SETPARTITIONTYPE_EXIT ); } /** @@ -48,6 +58,7 @@ */ GLDEF_C TInt BlockSize(const TMMCard* aCardP) { + OstTraceFunctionEntry0( _BLOCKSIZE_ENTRY ); if ((aCardP == NULL) || ((const TSDCard *) aCardP)->IsSDCard()) return KMMCardHighCapBlockSize; @@ -58,6 +69,7 @@ 512 << (extCSD.AccessSize()-1) : KMMCardHighCapBlockSize; // default write block size = 512 + OstTraceFunctionExit0( _BLOCKSIZE_EXIT ); return blockSize; } @@ -66,9 +78,12 @@ */ GLDEF_C TInt EraseBlockSize(const TMMCard* aCardP) { + OstTraceFunctionEntry0( _ERASEBLOCKSIZE_ENTRY ); if (aCardP == NULL) + { + OstTraceFunctionExit0( _ERASEBLOCKSIZE_EXIT ); return 0; - + } const TUint K8KBShift = 13; if (((const TSDCard *) aCardP)->IsSDCard()) @@ -78,7 +93,8 @@ TUint8 auSize = ((const TSDCard *) aCardP)->GetAUSize(); //eraseBlkSize is 2^(auSize + K8KBShift) TInt eraseBlkSize = 1 << (auSize + K8KBShift) ; - return (eraseBlkSize); + OstTraceFunctionExit0( DUP1__ERASEBLOCKSIZE_EXIT ); + return eraseBlkSize; } @@ -104,6 +120,7 @@ else eraseBlockSize = K16KBytes; + OstTraceFunctionExit0( DUP2__ERASEBLOCKSIZE_EXIT ); return eraseBlockSize; } @@ -114,6 +131,7 @@ */ GLDEF_C TInt GetMediaDefaultPartitionInfo(TMBRPartitionEntry& aPartitionEntry, TUint16& aReservedSectors, const TMMCard* aCardP) { + OstTraceFunctionEntry0( _GETMEDIADEFAULTPARTITIONINFO_ENTRY ); const TUint32 KTotalSectors = I64LOW(aCardP->DeviceSize64() >> KDiskSectorShift); aPartitionEntry.iFirstSector = EraseBlockSize(aCardP) >> KDiskSectorShift; @@ -123,6 +141,7 @@ aReservedSectors = 0; // Let the filesystem decide on the appropriate value.. + OstTraceFunctionExit0( _GETMEDIADEFAULTPARTITIONINFO_EXIT ); return(KErrNone); } @@ -142,23 +161,28 @@ */ GLDEF_C TBool CreateMBRAfterFormat(const TMMCard* aCardP) { + OstTraceFunctionEntry0( _CREATEMBRAFTERFORMAT_ENTRY ); if(aCardP == NULL) { + OstTraceFunctionExit0( _CREATEMBRAFTERFORMAT_EXIT ); return EFalse; } // Create an MBR on high capacity (FAT32) cards and optionally on low-capacity FAT16/FAT32 MMC cards if (aCardP->IsHighCapacity()) { + OstTraceFunctionExit0( DUP1__CREATEMBRAFTERFORMAT_EXIT ); return ETrue; } #ifdef SYMBIAN_CREATE_MBR_ON_LOW_CAPACITY_MMC if ((I64LOW(aCardP->DeviceSize64()) >> KDiskSectorShift) >= 32680) { + OstTraceFunctionExit0( DUP2__CREATEMBRAFTERFORMAT_EXIT ); return ETrue; } #endif + OstTraceFunctionExit0( DUP3__CREATEMBRAFTERFORMAT_EXIT ); return EFalse; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/drivers/medmmc/traces/OstTraceDefinitions.h Tue Jan 26 13:13:38 2010 +0200 @@ -0,0 +1,21 @@ +// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: + +#ifndef __OSTTRACEDEFINITIONS_H__ +#define __OSTTRACEDEFINITIONS_H__ +// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler +// REMOVE BEFORE CHECK-IN TO VERSION CONTROL +//#define OST_TRACE_COMPILER_IN_USE +#include <OpenSystemTrace.h> +#endif
--- a/kernel/eka/drivers/pbus/mmc/epbusm.mmh Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/pbus/mmc/epbusm.mmh Tue Jan 26 13:13:38 2010 +0200 @@ -26,6 +26,7 @@ systeminclude ../../../include/drivers #endif +USERINCLUDE traces sourcepath .. source spbus.cpp @@ -47,5 +48,4 @@ uid 0x1000008d 0x10004087 -capability all - +capability all \ No newline at end of file
--- a/kernel/eka/drivers/pbus/mmc/sdcard/sdcard3c/sdcard.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/pbus/mmc/sdcard/sdcard3c/sdcard.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -14,6 +14,14 @@ // #include <drivers/sdcard.h> +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "locmedia_ost.h" +#ifdef __VC32__ +#pragma warning(disable: 4127) // disabling warning "conditional expression is constant" +#endif +#include "sdcardTraces.h" +#endif // ======== TSDCard ======== @@ -29,6 +37,7 @@ // returns the SD device size // { + OstTraceFunctionEntry1( TSDCARD_DEVICESIZE64_ENTRY, this ); if(iFlags & KSDCardIsSDCard) { return (IsHighCapacity()) ? 512 * 1024 * (TInt64)(1 + CSD().CSDField(69, 48)) : TMMCard::DeviceSize64(); @@ -42,6 +51,7 @@ // return SD erase sector size, (SECTOR_SIZE + 1) * 2 ** WRITE_BLK_LEN // { + OstTraceFunctionEntry1( TSDCARD_PREFERREDWRITEGROUPLENGTH_ENTRY, this ); if(iFlags & KSDCardIsSDCard) { TSDCSD sdcsd(CSD()); @@ -94,6 +104,7 @@ // Return info. on erase services for this card // { + OstTraceFunctionEntry1( TSDCARD_GETERASEINFO_ENTRY, this ); // SD Controllers support MMC cards too. Check if we are really dealing with an SD card if(!(iFlags&KSDCardIsSDCard)) @@ -102,6 +113,7 @@ if (CSD().CCC() & KMMCCmdClassErase) { // This card supports erase cmds. However, SD cards don't support Erase Group commands (i.e. CMD35, CMD36). + OstTrace0( TRACE_INTERNALS, TSDCARD_GETERASEINFO, "Card supports erase class commands" ); aEraseInfo.iEraseFlags=KMMCEraseClassCmdsSupported; // Return the preferred size to be used as the unit for erase operations. @@ -123,7 +135,8 @@ else aEraseInfo.iEraseFlags=0; - return(KErrNone); + OstTraceFunctionExitExt( TSDCARD_GETERASEINFO_EXIT, this, KErrNone ); + return KErrNone; } TInt TSDCard::MaxReadBlLen() const @@ -134,6 +147,7 @@ * if possible, to try to avoid compatibility issues. */ { + OstTraceFunctionEntry1( TSDCARD_MAXREADBLLEN_ENTRY, this ); if (IsSDCard()) { TInt blkLenLog2 = CSD().ReadBlLen(); @@ -142,13 +156,17 @@ // The SD card spec. makes a special case for 2GByte cards, // ...and some manufacturers apply the same method to support 4G cards __KTRACE_OPT(KPBUS1, Kern::Printf("=mmc:mrbl > 2GB SD")); + OstTrace0( TRACE_INTERNALS, TSDCARD_MAXREADBLLEN, "SD Card > 2GB" ); blkLenLog2 = KDefaultBlockLen; } + OstTraceFunctionExitExt( TSDCARD_MAXREADBLLEN_EXIT, this, blkLenLog2 ); return blkLenLog2; } else // MMC card { - return (TMMCard::MaxReadBlLen()); + TInt ret = TMMCard::MaxReadBlLen(); + OstTraceFunctionExitExt( DUP1_TSDCARD_MAXREADBLLEN_EXIT, this, ret ); + return ret; } } @@ -160,6 +178,7 @@ * if possible, to try to avoid compatibility issues. */ { + OstTraceFunctionEntry1( TSDCARD_MAXWRITEBLLEN_ENTRY, this ); if (IsSDCard()) { TInt blkLenLog2 = CSD().WriteBlLen(); @@ -168,13 +187,17 @@ // The SD card spec. makes a special case for 2GByte cards, // ...and some manufacturers apply the same method to support 4G cards __KTRACE_OPT(KPBUS1, Kern::Printf("=mmc:mwbl > 2GB SD")); + OstTrace0( TRACE_INTERNALS, TSDCARD_MAXWRITEBLLEN, "SD Card > 2GB" ); blkLenLog2 = KDefaultBlockLen; } + OstTraceFunctionExitExt( TSDCARD_MAXWRITEBLLEN_EXIT, this, blkLenLog2 ); return blkLenLog2; } else // MMC card { - return (TMMCard::MaxWriteBlLen()); + TInt ret = TMMCard::MaxWriteBlLen(); + OstTraceFunctionExitExt( DUP1_TSDCARD_MAXWRITEBLLEN_EXIT, this, ret ); + return ret; } } @@ -184,6 +207,7 @@ * @return Speed, in Kilohertz */ { + OstTraceFunctionEntry1( TSDCARD_MAXTRANSPEEDINKILOHERTZ_ENTRY, this ); TUint maxClk = TMMCard::MaxTranSpeedInKilohertz(); if (IsSDCard()) @@ -195,16 +219,19 @@ if ( (maxClk != KSDDTClk25MHz) && (maxClk != KSDDTClk50MHz) ) { __KTRACE_OPT(KPBUS1, Kern::Printf("\t >DSDStack: Non-Compliant DT Clock")); + OstTrace0( TRACE_INTERNALS, TSDCARD_MAXTRANSPEEDINKILOHERTZ, "Non-Compliant DT Clock" ); } #endif if (maxClk > KSDDTClk50MHz) { //Clock rate exceeds SD possible max clock rate __KTRACE_OPT(KPBUS1, Kern::Printf("\t >DSDStack: Tuning DT Clock down to 50MHz")); + OstTrace0( TRACE_INTERNALS, TSDCARD_MAXTRANSPEEDINKILOHERTZ1, "Tuning DT Clock down to 50MHz" ); maxClk = KSDDTClk50MHz; } } + OstTraceFunctionExitExt( TSDCARD_MAXTRANSPEEDINKILOHERTZ_EXIT, this, maxClk ); return maxClk; } @@ -217,17 +244,25 @@ // if it fails. // { + OstTraceFunctionEntry1( TSDCARDARRAY_ALLOCCARDS_ENTRY, this ); for (TInt i = 0; i < (TInt) KMaxMMCardsPerStack; ++i) { // zeroing the card data used to be implicit because embedded in // CBase-derived DMMCStack. if ((iCards[i] = new TSDCard) == 0) + { + OstTraceFunctionExitExt( TSDCARDARRAY_ALLOCCARDS_EXIT, this, KErrNoMemory ); return KErrNoMemory; + } iCards[i]->iUsingSessionP = 0; if ((iNewCards[i] = new TSDCard) == 0) + { + OstTraceFunctionExitExt( DUP1_TSDCARDARRAY_ALLOCCARDS_EXIT, this, KErrNoMemory ); return KErrNoMemory; + } } + OstTraceFunctionExitExt( DUP2_TSDCARDARRAY_ALLOCCARDS_EXIT, this, KErrNone ); return KErrNone; } @@ -237,6 +272,7 @@ // the CID value in the slot. Return a RCA for the card. // { + OstTraceFunctionEntryExt( TSDCARDARRAY_ADDCARDSDMODE_ENTRY, this ); TRCA rca=0; @@ -256,6 +292,7 @@ Card(aCardNumber).iIndex=(aCardNumber+1); // Mark card as being present *aNewRCA=rca; + OstTraceFunctionExit1( TSDCARDARRAY_ADDCARDSDMODE_EXIT, this ); } TInt TSDCardArray::StoreRCAIfUnique(TUint aCardNumber,TRCA& anRCA) @@ -264,20 +301,28 @@ // no duplication then store in slot 'aCardNumber'. // { + OstTraceExt3(TRACE_FLOW, TSDCARDARRAY_STORERCAIFUNIQUE_ENTRY ,"TSDCardArray::StoreRCAIfUnique;aCardNumber=%x;anRCA=%x;this=%x", aCardNumber, (TUint) anRCA, (TUint) this); if (anRCA==0) - return(KErrGeneral); + { + OstTraceFunctionExitExt( TSDCARDARRAY_STORERCAIFUNIQUE_EXIT, this, KErrGeneral ); + return KErrGeneral; + } Card(aCardNumber).iRCA=0; // Now let's look if we've seen this card before for ( TUint i=0 ; i<iOwningStack->iMaxCardsInStack ; i++ ) { if ( Card(i).IsPresent() && Card(i).iRCA==anRCA ) - return(KErrInUse); + { + OstTraceFunctionExitExt( DUP1_TSDCARDARRAY_STORERCAIFUNIQUE_EXIT, this, KErrInUse ); + return KErrInUse; + } } Card(aCardNumber).iRCA=anRCA; Card(aCardNumber).iIndex=(aCardNumber+1); // Mark card as being present - return(KErrNone); + OstTraceFunctionExitExt( DUP2_TSDCARDARRAY_STORERCAIFUNIQUE_EXIT, this, KErrNone ); + return KErrNone; } EXPORT_C void TSDCardArray::DeclareCardAsGone(TUint aCardNumber) @@ -285,24 +330,30 @@ // reset SD specific fields to initial values and then reset generic MultiMediaCard // { + OstTraceFunctionEntryExt( TSDCARDARRAY_DECLARECARDASGONE_ENTRY, this ); Card(aCardNumber).SetBusWidth(1); TMMCardArray::DeclareCardAsGone(aCardNumber); + OstTraceFunctionExit1( TSDCARDARRAY_DECLARECARDASGONE_EXIT, this ); } // ======== DSDSession ======== void DSDSession::FillAppCommandDesc(TMMCCommandDesc& aDesc, TSDAppCmd aCmd) { + OstTraceFunctionEntry0( DSDSESSION_FILLAPPCOMMANDDESC_ENTRY ); aDesc.iCommand = (TMMCCommandEnum) aCmd; aDesc.iArgument = 0; // set stuff bits to zero FillAppCommandDesc(aDesc); + OstTraceFunctionExit0( DSDSESSION_FILLAPPCOMMANDDESC_EXIT ); } void DSDSession::FillAppCommandDesc(TMMCCommandDesc& aDesc, TSDAppCmd aCmd, TMMCArgument aArg) { + OstTraceFunctionEntry0( DUP1_DSDSESSION_FILLAPPCOMMANDDESC_ENTRY ); aDesc.iCommand = (TMMCCommandEnum) aCmd; aDesc.iArgument = aArg; FillAppCommandDesc(aDesc); + OstTraceFunctionExit0( DUP1_DSDSESSION_FILLAPPCOMMANDDESC_EXIT ); } const TUint32 CCA = KMMCCmdClassApplication; @@ -319,9 +370,11 @@ void DSDSession::FillAppCommandDesc(TMMCCommandDesc& aDesc) { + OstTraceFunctionEntry0( DUP2_DSDSESSION_FILLAPPCOMMANDDESC_ENTRY ); aDesc.iSpec = FindCommandSpec(AppCmdSpecTable, aDesc.iCommand); aDesc.iFlags = 0; aDesc.iBytesDone = 0; + OstTraceFunctionExit0( DUP2_DSDSESSION_FILLAPPCOMMANDDESC_EXIT ); } const TMMCIdxCommandSpec SdSpecificCmdSpecTable[] = @@ -340,23 +393,29 @@ void DSDSession::FillSdSpecificCommandDesc(TMMCCommandDesc& aDesc, TSDSpecificCmd aCmd, TMMCArgument aArg) { + OstTraceFunctionEntry0( DSDSESSION_FILLSDSPECIFICCOMMANDDESC_ENTRY ); aDesc.iCommand = (TMMCCommandEnum) aCmd; aDesc.iArgument = aArg; FillSdSpecificCommandDesc(aDesc); + OstTraceFunctionExit0( DSDSESSION_FILLSDSPECIFICCOMMANDDESC_EXIT ); } void DSDSession::FillSdSpecificCommandDesc(TMMCCommandDesc& aDesc, TSDSpecificCmd aCmd) { + OstTraceFunctionEntry0( DUP1_DSDSESSION_FILLSDSPECIFICCOMMANDDESC_ENTRY ); aDesc.iCommand = (TMMCCommandEnum) aCmd; aDesc.iArgument = 0; // set stuff bits to zero FillSdSpecificCommandDesc(aDesc); + OstTraceFunctionExit0( DUP1_DSDSESSION_FILLSDSPECIFICCOMMANDDESC_EXIT ); } void DSDSession::FillSdSpecificCommandDesc(TMMCCommandDesc& aDesc) { + OstTraceFunctionEntry0( DUP2_DSDSESSION_FILLSDSPECIFICCOMMANDDESC_ENTRY ); aDesc.iSpec = FindCommandSpec(SdSpecificCmdSpecTable, aDesc.iCommand); aDesc.iFlags = 0; aDesc.iBytesDone = 0; + OstTraceFunctionExit0( DUP2_DSDSESSION_FILLSDSPECIFICCOMMANDDESC_EXIT ); } @@ -364,7 +423,10 @@ EXPORT_C TInt DSDStack::Init() { - return DMMCStack::Init(); + OstTraceFunctionEntry1( DSDSTACK_INIT_ENTRY, this ); + TInt ret = DMMCStack::Init(); + OstTraceFunctionExitExt( DSDSTACK_INIT_EXIT, this, ret ); + return ret; } @@ -399,9 +461,11 @@ }; DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DSDSTACK_ATTACHCARDSM, "Current session = 0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DSDSTACK_ATTACHCARDSM1, "EStBegin" ); __KTRACE_OPT(KPBUS1, Kern::Printf(">DSDStack::AcquireStackSM()")); iRCAPool.ReleaseUnlocked(); @@ -409,6 +473,7 @@ SMF_STATE(EStNextFullRange) + OstTrace0( TRACE_INTERNALS, DSDSTACK_ATTACHCARDSM2, "EStNextFullRange" ); iCxCardType = ESDCardTypeUnknown; AddressCard(iCxCardCount); // Address the next card @@ -422,6 +487,7 @@ SMF_STATE(EStSendCIDIssued) + OstTrace0( TRACE_INTERNALS, DSDSTACK_ATTACHCARDSM3, "EStSendCIDIssued" ); if( !err ) { // The card responded with a CID. We need to initialise the @@ -457,10 +523,12 @@ SMF_STATE(EStIssueSendRCA) + OstTrace0( TRACE_INTERNALS, DSDSTACK_ATTACHCARDSM4, "EStIssueSendRCA" ); SMF_INVOKES(ExecCommandSMST,EStSendRCACheck) SMF_STATE(EStSendRCACheck) + OstTrace0( TRACE_INTERNALS, DSDSTACK_ATTACHCARDSM5, "EStSendRCACheck" ); // We need to check that the RCA recieved from the card doesn't clash // with any others in this stack. RCA is first 2 bytes of response buffer (in big endian) TRCA rca=(TUint16)((s.ResponseP()[0]<<8) | s.ResponseP()[1]); @@ -469,13 +537,16 @@ SMF_STATE(EStRCADone) + OstTrace0( TRACE_INTERNALS, DSDSTACK_ATTACHCARDSM6, "EStRCADone" ); SMF_INVOKES(ConfigureMemoryCardSMST, EStMoreCardsCheck) SMF_STATE(EStMoreCardsCheck) + OstTrace0( TRACE_INTERNALS, DSDSTACK_ATTACHCARDSM7, "EStMoreCardsCheck" ); if (++iCxCardCount < (TInt)iMaxCardsInStack) { __KTRACE_OPT(KPBUS1, Kern::Printf(">DSDStack::AcquireStackSM(): More Cards to check: %d",iCxCardCount)); + OstTrace1( TRACE_INTERNALS, DSDSTACK_ACQUIRESTACKSM8, "More Cards to check: iCxCardCount=%d", iCxCardCount ); SMF_GOTOS(EStNextFullRange) } else @@ -516,12 +587,14 @@ DMMCSession& s=Session(); DMMCPsu* psu=(DMMCPsu*)MMCSocket()->iVcc; + OstTrace1( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM, "Current session = 0x%x", &s ); static const TUint32 KCmd8Param = 0x0100 | 0x00AA; // Voltage supplied : 2.7-3.6V, Check Pattern 10101010b static const TUint32 KCmd8CheckMask = 0x00000FFF; SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM1, "EStBegin" ); iCxCardType = ESDCardTypeUnknown; s.iCardP = NULL; // This stops ExecCommandSM() from setting old RCA when sending CMD55 @@ -530,6 +603,7 @@ SMF_STATE(EStSendInterfaceCondition) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM2, "EStSendInterfaceCondition" ); iCxPollRetryCount=0; // Reset max number of poll attempts on card busy iConfig.SetPollAttempts(KSDMaxPollAttempts); // Increase card busy timeout to 1 Sec for SD Cards @@ -542,6 +616,7 @@ if (!(MMCSocket()->MachineInfo().iFlags & TMMCMachineInfo::ESupportsR7)) { __KTRACE_OPT(KPBUS1, Kern::Printf("R7 not supported.")); + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM3, "R7 not supported" ); Command().iSpec.iResponseType = ERespTypeR1; } @@ -551,6 +626,7 @@ SMF_STATE(EStSentInterfaceCondition) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM4, "EStSentInterfaceCondition" ); if (err == KMMCErrNone) { // Check the response for voltage and check pattern @@ -558,12 +634,14 @@ if((status & KCmd8CheckMask) == KCmd8Param) { __KTRACE_OPT(KPBUS1, Kern::Printf("Found v2 card.")); + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM5, "Found v2 card" ); iCurrentOpRange |= KMMCOCRAccessModeHCS; } else { // Pattern Mis-match, card does not support the specified voltage range - return( KMMCErrNotSupported ); + OstTraceFunctionExitExt( DSDSTACK_INITIALISEMEMORYCARDSM_EXIT, this, (TInt) KMMCErrNotSupported ); + return KMMCErrNotSupported; } SMF_GOTOS(EStCheckVoltage); @@ -575,7 +653,7 @@ SMF_STATE(EStCheckVoltage) - + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM6, "EStCheckVoltage" ); // If platform doesn't support an adjustable voltage PSU then there's no // point in doing a full range for its supported range. To support range // checking on a multi-card stack would require a complete scan of all @@ -591,6 +669,7 @@ SMF_STATE(EStSetFullRangeCmd) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM7, "EStSetFullRangeCmd" ); // Issue ACMD41/CMD1 with omitted voltage range if (iCxCardType==ESDCardTypeIsMMC) { @@ -608,9 +687,11 @@ SMF_STATE(EStCheckForFullRangeCmd41Timeout) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM8, "EStCheckForFullRangeCmd41Timeout" ); if (err==KMMCErrResponseTimeOut) { __KTRACE_OPT(KPBUS1, Kern::Printf("ACMD 41 not supported - Assuming MMC")); + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM9, "ACMD 41 not supported - Assuming MMC" ); iCxCardType=ESDCardTypeIsMMC; // Send CMD0 to re-initialise the card - otherwise we may get @@ -630,6 +711,7 @@ SMF_STATE(EStFullRangeDone) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM10, "EStFullRangeDone" ); if (!err) { // Card responded with Op range - evaluate the common subset with the current setting. @@ -637,7 +719,8 @@ const TUint32 range = (iCurrentOpRange & ~KMMCOCRAccessModeHCS) & (TMMC::BigEndian32(s.ResponseP()) & ~KMMCOCRBusy); if(range == 0) { - return( KMMCErrNotSupported ); // Card is incompatible with our h/w + OstTraceFunctionExitExt( DSDSTACK_INITIALISEMEMORYCARDSM_EXIT1, this, (TInt) KMMCErrNotSupported ); + return KMMCErrNotSupported; // Card is incompatible with our h/w } iCurrentOpRange = range | (iCurrentOpRange & KMMCOCRAccessModeHCS); } @@ -656,6 +739,7 @@ SMF_STATE(EStSetRangeCmd) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM11, "EStSetRangeCmd" ); // Issue ACMD41/CMD1 with voltage range if (iCxCardType==ESDCardTypeIsMMC) { @@ -678,7 +762,9 @@ SMF_STATE(EStCheckForRangeCmd41Timeout) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM12, "EStCheckForRangeCmd41Timeout" ); __KTRACE_OPT(KPBUS1, Kern::Printf("-mst:ascs:crct:%d", err)); + OstTrace1( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM13, "err=%d", (TInt) err); if (err==KMMCErrResponseTimeOut) { iCxCardType=ESDCardTypeIsMMC; @@ -696,6 +782,7 @@ __KTRACE_OPT(KPBUS1, Kern::Printf("-mst:ascs:crct2:%x", iCardArray)); __KTRACE_OPT(KPBUS1, Kern::Printf("-mst:ascs:crct3:%x", iCxCardCount)); __KTRACE_OPT(KPBUS1, Kern::Printf("-mst:ascs:crct4:%x", CardArray().CardP(iCxCardCount))); + OstTraceExt3(TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM14, "iCardArray=0x%x;iCxCardCount=%d;CardArray().CardP(iCxCardCount)=%d", (TUint) iCardArray, (TInt) iCxCardCount, (TInt) CardArray().CardP(iCxCardCount)); (CardArray().CardP(iCxCardCount)->iFlags)|=KSDCardIsSDCard; iCxCardType=ESDCardTypeIsSD; @@ -703,7 +790,9 @@ SMF_STATE(EStSetRangeBusyCheck) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM15, "EStSetRangeBusyCheck" ); __KTRACE_OPT(KPBUS1, Kern::Printf("-mst:ascs:src:%d",iCxCardType)); // 1:MMC, 2:SD + OstTrace1( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM16, "iCxCardType=%d", iCxCardType); if ( !err ) { @@ -716,13 +805,15 @@ if ( ++iCxPollRetryCount > iConfig.OpCondBusyTimeout() ) { __KTRACE_OPT2(KPBUS1, KPANIC, Kern::Printf("-sd:ocr busy timed out")); - return( KMMCErrBusTimeOut ); + OstTraceFunctionExitExt( DSDSTACK_INITIALISEMEMORYCARDSM_EXIT2, this, (TInt) KMMCErrBusTimeOut ); + return KMMCErrBusTimeOut; } #ifdef _DEBUG if ( iCxPollRetryCount > KMMCSpecOpCondBusyTimeout ) { __KTRACE_OPT2(KPBUS1, KPANIC, Kern::Printf("-sd:ocr exceeded spec timeout!! (%d ms)", (iCxPollRetryCount*KMMCRetryGapInMilliseconds))); + OstTrace1( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM17, "Exceeded spec timeout (%d ms)", (iCxPollRetryCount*KMMCRetryGapInMilliseconds)); } #endif m.ResetTraps(); @@ -738,10 +829,12 @@ if(iCxCardType == ESDCardTypeIsSD) { __KTRACE_OPT(KPBUS1, Kern::Printf("Found large SD card.")); + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM18, "Found large SD card" ); } else if(iCxCardType == ESDCardTypeIsMMC) { __KTRACE_OPT(KPBUS1, Kern::Printf("Found large MMC card.")); + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM19, "Found large MMC card" ); } #endif } @@ -765,18 +858,20 @@ psu->SetVoltage(iCurrentOpRange); if (psu->SetState(EPsuOnFull) != KErrNone) { - return(KMMCErrHardware); + OstTraceFunctionExitExt( DSDSTACK_INITIALISEMEMORYCARDSM_EXIT3, this, (TInt) KMMCErrHardware ); + return KMMCErrHardware; } SMF_STATE(EStCIDCmd) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM20, "EStCIDCmd" ); s.FillCommandDesc(ECmdAllSendCID,0); m.ResetTraps(); SMF_INVOKES(ExecCommandSMST,EStSendCIDIssued) SMF_STATE(EStSendCIDIssued) - + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITIALISEMEMORYCARDSM21, "EStSendCIDIssued" ); // All done - Higher level state machine expects CID in s.ResponseP() SMF_END @@ -797,11 +892,13 @@ }; DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DSDSTACK_CONFIGUREMEMORYCARDSM, "Current session = 0x%x", &s ); //coverity[UNREACHABLE] //Part of state machine design. SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DSDSTACK_CONFIGUREMEMORYCARDSM1, "EStBegin" ); // Cards is initialised so get its CSD s.FillCommandDesc(ECmdSendCSD, TUint32(CardArray().CardP(iCxCardCount)->iRCA) << 16); @@ -809,6 +906,7 @@ SMF_STATE(EStSendCSDDone) + OstTrace0( TRACE_INTERNALS, DSDSTACK_CONFIGUREMEMORYCARDSM2, "EStSendCSDDone" ); // Store the CSD in the new card entry TMMCard* cardP = CardArray().CardP(iCxCardCount); cardP->iCSD = s.ResponseP(); @@ -863,14 +961,17 @@ }; DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM, "Current session = 0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM1, "EStBegin" ); __KTRACE_OPT(KPBUS1, Kern::Printf(">DSDStack::InitStackAfterUnlockSM()")); iRCAPool.ReleaseUnlocked(); iCxCardCount=0; // Reset current card number SMF_STATE(EStNextCard) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM2, "EStNextCard" ); AddressCard(iCxCardCount); // Address the next card if (!CardDetect(iCxCardCount)) @@ -885,6 +986,7 @@ SMF_STATE(EStSelectCard) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM3, "EStSelectCard" ); TRCA targetRCA = CardArray().Card(iCxCardCount).RCA(); if (targetRCA == SelectedCard()) { @@ -895,6 +997,7 @@ SMF_INVOKES(ExecCommandSMST,EStSetBusWidth) SMF_STATE(EStSetBusWidth) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM4, "EStSetBusWidth" ); const TMMCStatus status = s.LastStatus(); if((status & KMMCStatCardIsLocked) != 0) SMF_GOTOS(EStDeselectCard) @@ -905,11 +1008,13 @@ SMF_INVOKES(IssueCommandCheckResponseSMST,EStSetBusWidth1) SMF_STATE(EStSetBusWidth1) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM5, "EStSetBusWidth1" ); CardArray().Card(iCxCardCount).SetBusWidth(4); DSDSession::FillAppCommandDesc(Command(), ESDACmdSetBusWidth, KSDBusWidth4); SMF_INVOKES(IssueCommandCheckResponseSMST,EStGetSDStatus) SMF_STATE(EStGetSDStatus) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM6, "EStGetSDStatus" ); // Now we have sent ACMD6, ask the controller to set the bus width to 4 DoSetBusWidth(EBusWidth4); @@ -919,21 +1024,27 @@ SMF_INVOKES(IssueCommandCheckResponseSMST,EStGetSDStatus1) SMF_STATE(EStGetSDStatus1) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM7, "EStGetSDStatus1" ); DSDSession::FillAppCommandDesc(Command(), ESDACmdSDStatus); s.FillCommandArgs(0, KSDStatusBlockLength, iPSLBuf, KSDStatusBlockLength); SMF_INVOKES(IssueCommandCheckResponseSMST,EStDecodeSDStatus); SMF_STATE(EStDecodeSDStatus) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM8, "EStDecodeSDStatus" ); #ifdef _DEBUG for (TUint i = 0; i < KSDStatusBlockLength; ++i) { __KTRACE_OPT(KPBUS1, Kern::Printf("SD_STATUS[0x%x] = %x", i, iPSLBuf[i])); + OstTraceExt2( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM9, "SD_STATUS[0x%x]=0x%x", i, (TUint) iPSLBuf[i]); } #endif // bits 495:480 are SD_CARD_TYPE. Check this is 00xxh (x = don't care). if (iPSLBuf[2] != 0) + { + OstTraceFunctionExitExt( DSDSTACK_INITSTACKAFTERUNLOCKSM_EXIT, this, (TInt) KMMCErrNotSupported ); return KMMCErrNotSupported; + } // bits 479:448 contain SIZE_OF_PROTECTED_AREA. // (This is bytes 4 to 7 in big-endian format.) @@ -942,6 +1053,7 @@ __KTRACE_OPT(KPBUS1, Kern::Printf("\t >DSDStack: Card %d", iCxCardCount)); TUint32 size_of_protected_area = TMMC::BigEndian32(&iPSLBuf[4]); __KTRACE_OPT(KPBUS1, Kern::Printf("\t >DSDStack: SizeOfProtectedArea: %d", size_of_protected_area)); + OstTraceExt2( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM10, "iCxCardCount=%d;SizeOfProtectedArea=%d", iCxCardCount, (TInt) size_of_protected_area); const TCSD& csd = sdc.CSD(); TUint32 pas = 0; @@ -951,6 +1063,7 @@ // Protected Area = SIZE_OF_PROTECTED_AREA pas = size_of_protected_area; __KTRACE_OPT(KPBUS1, Kern::Printf("\t >DSDStack(SDHC): SetProtectedAreaSize: %d", pas)); + OstTrace1( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM11, "SDHC: SetProtectedAreaSize=%d", pas); } else { @@ -958,6 +1071,7 @@ // Protected Area = SIZE_OF_PROTECTED_AREA * C_SIZE_MULT * BLOCK_LEN pas = size_of_protected_area * (1 << (csd.CSizeMult() + 2 + csd.ReadBlLen())); __KTRACE_OPT(KPBUS1, Kern::Printf("\t >DSDStack(SDSC): SetProtectedAreaSize: %d", pas)); + OstTrace1( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM12, "SDSC: SetProtectedAreaSize=%d", pas); } sdc.SetProtectedAreaSize(pas); @@ -972,10 +1086,12 @@ SMF_INVOKES(SwitchToHighSpeedModeSMST, EStDeselectCard) SMF_STATE(EStDeselectCard) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM13, "EStDeselectCard" ); s.FillCommandDesc(ECmdSelectCard, 0); SMF_INVOKES(ExecCommandSMST, EStCardDeselectedReadCSD) SMF_STATE(EStCardDeselectedReadCSD) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM14, "EStCardDeselectedReadCSD" ); // // Read the card's CSD register (again) // @@ -986,6 +1102,7 @@ SMF_INVOKES(ExecCommandSMST, EStCSDCmdSent) SMF_STATE(EStCSDCmdSent) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM15, "EStCSDCmdSent" ); // // Store the CSD in the card entry // @@ -993,9 +1110,11 @@ cardP->iCSD = s.ResponseP(); SMF_STATE(EStMoreCardsCheck) + OstTrace0( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM16, "EStMoreCardsCheck" ); if (++iCxCardCount < (TInt)iMaxCardsInStack) { __KTRACE_OPT(KPBUS1, Kern::Printf("\t >DSDStack: Address Next card: %d",iCxCardCount)); + OstTrace1( TRACE_INTERNALS, DSDSTACK_INITSTACKAFTERUNLOCKSM17, "Address Next card=%d", iCxCardCount); SMF_GOTOS(EStNextCard) } else @@ -1041,11 +1160,13 @@ }; DMMCSession& s = Session(); + OstTrace1( TRACE_INTERNALS, DSDSTACK_CIMREADWRITEBLOCKSSM, "Current session = 0x%x", &s ); __KTRACE_OPT(KPBUS1,Kern::Printf(">SD:RWBlocksSM %x",TUint(s.iLastStatus))); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DSDSTACK_CIMREADWRITEBLOCKSSM1, "EStBegin" ); TSDCard& sdCard = *static_cast<TSDCard*>(s.iCardP); AddressCard(sdCard.iIndex-1); @@ -1063,7 +1184,10 @@ // Check that the card supports class 4 (Write) commands const TUint ccc = s.iCardP->CSD().CCC(); if(!(ccc & KMMCCmdClassBlockWrite)) - return( KMMCErrNotSupported ); + { + OstTraceFunctionExitExt( DSDSTACK_CIMREADWRITEBLOCKSSM_EXIT, this, (TInt) KMMCErrNotSupported ); + return KMMCErrNotSupported; + } } Command().iCustomRetries = 0; // MBW retries @@ -1072,6 +1196,7 @@ SMF_STATE(EStRestart) // NB: ErrBypass is not processed here + OstTrace0( TRACE_INTERNALS, DSDSTACK_CIMREADWRITEBLOCKSSM2, "EStRestart" ); SMF_CALLMEWR(EStRestart) // Create a recursive call entry to recover from the errors trapped m.SetTraps(KMMCErrStatus); if (s.Command().iSpec.iCommandClass!=KMMCCmdClassApplication || s.Command().iCommand==ECmdAppCmd ) @@ -1082,12 +1207,15 @@ SMF_BPOINT(EStAttached) + OstTrace0( TRACE_INTERNALS, DSDSTACK_CIMREADWRITEBLOCKSSM3, "EStAttached" ); TMMCCommandDesc& cmd = s.Command(); const TUint32 blockLength = cmd.BlockLength(); if((blockLength == 0) || (blockLength > (TUint)KDefaultBlockLenInBytes)) { __KTRACE_OPT(KPBUS1,Kern::Printf(">SD:RWBlocksSM err BlockLen:%d",blockLength)); + OstTrace1( TRACE_INTERNALS, DSDSTACK_CIMREADWRITEBLOCKSSM4, "blockLength=%d", blockLength ); + OstTraceFunctionExitExt( DSDSTACK_CIMREADWRITEBLOCKSSM_EXIT1, this, (TInt) KMMCErrArgument ); return KMMCErrArgument; } @@ -1100,6 +1228,7 @@ if(!cmd.AdjustForBlockOrByteAccess(s)) { // unable to convert command arguments to suit the underlying block/byte access mode + OstTraceFunctionExitExt( DSDSTACK_CIMREADWRITEBLOCKSSM_EXIT2, this, (TInt) KMMCErrArgument ); return KMMCErrArgument; } } @@ -1117,14 +1246,19 @@ SMF_STATE(EStLength1) + OstTrace0( TRACE_INTERNALS, DSDSTACK_CIMREADWRITEBLOCKSSM5, "EStLength1" ); const TMMCStatus status(s.ResponseP()); s.PopCommandStack(); if (status.Error()) + { + OstTraceFunctionExitExt( DSDSTACK_CIMREADWRITEBLOCKSSM_EXIT3, this, (TInt) KMMCErrStatus ); SMF_RETURN(KMMCErrStatus) + } s.iCardP->iSetBlockLen = s.Command().BlockLength(); SMF_STATE(EStLengthSet) + OstTrace0( TRACE_INTERNALS, DSDSTACK_CIMREADWRITEBLOCKSSM6, "EStLengthSet" ); TMMCCommandDesc& cmd = s.Command(); TUint opType = 0; const TUint kTypeWrite = KBit0; @@ -1154,7 +1288,10 @@ const TUint blocks = cmd.iTotalLength / cmd.BlockLength(); if ( blocks * cmd.BlockLength() != cmd.iTotalLength ) - return( KMMCErrArgument ); + { + OstTraceFunctionExitExt( DSDSTACK_CIMREADWRITEBLOCKSSM_EXIT4, this, (TInt) KMMCErrArgument ); + return KMMCErrArgument; + } if ( !(opType & kTypeSpecial) ) // A special session has already set its command descriptor { @@ -1183,6 +1320,7 @@ SMF_STATE(EStIssued) + OstTrace0( TRACE_INTERNALS, DSDSTACK_CIMREADWRITEBLOCKSSM7, "EStIssued" ); // check state of card after data transfer with CMD13. if (s.Command().Direction() != 0) { @@ -1192,6 +1330,7 @@ SMF_GOTOS(EStRWFinish); SMF_STATE(EStWaitFinish) + OstTrace0( TRACE_INTERNALS, DSDSTACK_CIMREADWRITEBLOCKSSM8, "EStWaitFinish" ); // if MBW fail, then recover by rewriting ALL blocks... // (used to recover using ACMD22, but this has been changed // as is difficult to test for little gain in efficiency) @@ -1199,6 +1338,7 @@ { if (Command().iCustomRetries++ >= (TInt) KSDMaxMBWRetries) { + OstTraceFunctionExitExt( DSDSTACK_CIMREADWRITEBLOCKSSM_EXIT5, this, (TInt) err ); SMF_RETURN(err) } @@ -1218,6 +1358,7 @@ SMF_STATE(EStWaitFinish1) + OstTrace0( TRACE_INTERNALS, DSDSTACK_CIMREADWRITEBLOCKSSM9, "EStWaitFinish1" ); const TMMCStatus status(s.ResponseP()); s.PopCommandStack(); @@ -1232,22 +1373,32 @@ } if (status.Error()) + { + OstTraceFunctionExitExt( DUP7_DSDSTACK_CIMREADWRITEBLOCKSSM_EXIT, this, (TInt) KMMCErrStatus ); SMF_RETURN(KMMCErrStatus) + } #endif // Fall through if CURRENT_STATE is not PGM or DATA SMF_STATE(EStRWFinish) + OstTrace0( TRACE_INTERNALS, DSDSTACK_CIMREADWRITEBLOCKSSM10, "EStRWFinish" ); if (TMMCStatus(s.ResponseP()).Error() != 0) + { + OstTraceFunctionExitExt( DSDSTACK_CIMREADWRITEBLOCKSSM_EXIT6, this, (TInt) KMMCErrStatus ); SMF_RETURN(KMMCErrStatus); + } s.iState &= ~KMMCSessStateInProgress; // skip over recursive entry or throw error and catch in CIMLockUnlockSM() - return (s.Command().iCommand == ECmdLockUnlock) ? KMMCErrUpdPswd : KMMCErrBypass; + TMMCErr ret = (s.Command().iCommand == ECmdLockUnlock) ? KMMCErrUpdPswd : KMMCErrBypass; + OstTraceFunctionExitExt( DSDSTACK_CIMREADWRITEBLOCKSSM_EXIT7, this, (TInt) ret ); + return ret; SMF_STATE(EStDone) + OstTrace0( TRACE_INTERNALS, DSDSTACK_CIMREADWRITEBLOCKSSM11, "EStDone" ); __KTRACE_OPT(KPBUS1,Kern::Printf("<SD:RWBlocksSM()")); SMF_END @@ -1272,9 +1423,12 @@ //Part of state machine design. SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DSDSTACK_MODIFYCARDCAPABILITYSM, "EStBegin" ); SMF_INVOKES( DMMCStack::BaseModifyCardCapabilitySMST, EStDone ) SMF_STATE(EStDone) + + OstTrace0( TRACE_INTERNALS, DSDSTACK_MODIFYCARDCAPABILITYSM1, "EStDone" ); SMF_END } @@ -1300,10 +1454,14 @@ __KTRACE_OPT(KPBUS1,Kern::Printf(">SD:SwitchToHighSpeedModeSM ")); DMMCSession& s = Session(); + OstTrace1( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM, "Current session = 0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM1, "EStBegin"); + SMF_STATE(EstCheckController) + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM2, "EstCheckController"); // Get the clock speed supported by the controller TMMCMachineInfoV4 machineInfo; TMMCMachineInfoV4Pckg machineInfoPckg(machineInfo); @@ -1314,11 +1472,13 @@ if (machineInfo.iMaxClockSpeedInMhz < (KSDDTClk50MHz/1000) ) { __KTRACE_OPT(KPBUS1, Kern::Printf("High speed mode not supported by controller")); + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM3, "High speed mode not supported by controller"); SMF_GOTOS(EStDone); } } SMF_STATE(EStSendSCRCmd) + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM4, "EStSendSCRCmd"); // // ACMD51 Read the SD Configuration Register // @@ -1327,6 +1487,7 @@ SMF_INVOKES(ExecCommandSMST, EStCheckSpecVer); SMF_STATE(EStCheckSpecVer) + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM5, "EStCheckSpecVer"); // // Check the SD version // @@ -1335,6 +1496,7 @@ // __KTRACE_OPT(KPBUS1,Kern::Printf(" SD Configuration Register received")); __KTRACE_OPT(KPBUS1,Kern::Printf(" ...card_status=%x", TUint(s.iLastStatus))); + OstTrace1( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM6, "SD Configuration Register received: card_status=0x%x", (TUint) s.iLastStatus); #ifdef _DEBUG for (TUint32 i = 0; i < KSDSCRLength; ++i) @@ -1346,25 +1508,30 @@ if(iPSLBuf[0]==2) { __KTRACE_OPT(KPBUS1,Kern::Printf(" ...SD Spec Version 2")); + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM7, "SD Spec Version 2"); SMF_GOTOS(EStCheckFunction); } if(iPSLBuf[0]==1) { __KTRACE_OPT(KPBUS1,Kern::Printf(" ...SD Spec Version 1.10")); + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM8, "SD Spec Version 1.10"); SMF_GOTOS(EStCheckFunction); } if(iPSLBuf[0]==0) { __KTRACE_OPT(KPBUS1,Kern::Printf(" ...SD Spec Version 1.01")); + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM9, "SD Spec Version 1.01"); SMF_GOTOS(EStDone); } __KTRACE_OPT(KPBUS1,Kern::Printf(" ...SD Spec Version > 2 !")); + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM10, "SD Spec Version > 2"); SMF_STATE(EStCheckFunction) + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM11, "EStCheckFunction"); m.SetTraps(KMMCErrResponseTimeOut | KMMCErrNotSupported); // @@ -1379,18 +1546,22 @@ SMF_STATE(EStCheckFunctionSent) + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM12, "EStCheckFunctionSent"); __KTRACE_OPT(KPBUS1,Kern::Printf(" CheckFunctionSent %x",TUint(s.iLastStatus))); + OstTrace1( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM13, "CheckFunctionSent=0x%x", (TUint) s.iLastStatus); m.ResetTraps(); if(err == KMMCErrResponseTimeOut) { __KTRACE_OPT(KPBUS1,Kern::Printf(" ...CMD6 [Read] Response Timeout")); + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM14, "CMD6 [Read] Response Timeout"); SMF_GOTOS(EStDone); } else if(err == KMMCErrNotSupported) { __KTRACE_OPT(KPBUS1,Kern::Printf(" ...CMD6 [Read] Not Supported")); + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM15, "CMD6 [Read] Not Supported"); SMF_GOTOS(EStDone); } @@ -1415,21 +1586,26 @@ SMF_STATE(EStSwitchFunctionSent) + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM16, "EStSwitchFunctionSent"); #ifdef _DEBUG m.ResetTraps(); if(err == KMMCErrResponseTimeOut) { __KTRACE_OPT(KPBUS1,Kern::Printf(" ...CMD6 [Write] Response Timeout")); + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM17, "CMD6 [Write] Response Timeout"); } for (TUint32 i = 0; i < KSDSwitchFuncLength; ++i) { __KTRACE_OPT(KPBUS1, Kern::Printf(" ...SD Switch[0x%x] = %x", i, iPSLBuf[i])); + OstTraceExt2( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM18, "SD Switch[0x%x]=0x%x", (TUint) i, (TUint) iPSLBuf[i]); } #endif SMF_STATE(EStDone) + + OstTrace0( TRACE_INTERNALS, DSDSTACK_SWITCHTOHIGHSPEEDMODESM19, "EStSwitchFunctionSent"); SMF_END } @@ -1443,6 +1619,7 @@ * @return A pointer to the new session */ { + OstTraceFunctionEntry1( DSDSTACK_ALLOCSESSION_ENTRY, this ); return new DSDSession(aCallBack); }
--- a/kernel/eka/drivers/pbus/mmc/session.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/pbus/mmc/session.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -14,6 +14,15 @@ // #include <drivers/mmc.h> +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "locmedia_ost.h" +#ifdef __VC32__ +#pragma warning(disable: 4127) // disabling warning "conditional expression is constant" +#endif +#include "sessionTraces.h" +#endif + // -------- class DMMCSession -------- @@ -34,6 +43,7 @@ #endif // #ifdef __EPOC32__ iConfig() { + OstTraceFunctionEntry1( DMMCSESSION_DMMCSESSION_ENTRY, this ); } EXPORT_C DMMCSession::~DMMCSession() @@ -41,11 +51,13 @@ * Destructor. */ { + OstTraceFunctionEntry1( DUP1_DMMCSESSION_DMMCSESSION_ENTRY, this ); // Ensure that the stack isn't currently running in another thread's context, otherwise this session won't be // removed from the stack's workset until some time later - by which time the session will have been deleted __ASSERT_ALWAYS(!iStackP->StackRunning(), DMMCSocket::Panic(DMMCSocket::EMMCNotInDfcContext)); Abort(); UnlockStack(); + OstTraceFunctionExit1( DUP1_DMMCSESSION_DMMCSESSION_EXIT, this ); } EXPORT_C void DMMCSession::SetCard(TMMCard* aCardP) @@ -59,8 +71,10 @@ * @param aCardP A pointer to the card to be assigned to the session. */ { + OstTraceFunctionEntryExt( DMMCSESSION_SETCARD_ENTRY, this ); iCardP = aCardP; iCID = iCardP->CID(); + OstTraceFunctionExit1( DMMCSESSION_SETCARD_EXIT, this ); } EXPORT_C void DMMCSession::SetupCIMReadBlock(TMMCArgument aDevAddr, TUint32 aLength, TUint8* aMemoryP) @@ -75,9 +89,11 @@ * @param aMemoryP host destination address */ { + OstTraceExt4(TRACE_FLOW, DMMCSESSION_SETUPCIMREADBLOCK_ENTRY, "DMMCSession::SetupCIMReadBlock;aDevAddr=%x;aLength=%x;aMemoryP=%x;this=%x", (TUint) aDevAddr, (TUint) aLength, (TUint) aMemoryP, (TUint) this); ResetCommandStack(); FillCommandArgs(aDevAddr, aLength, aMemoryP, aLength); iSessionID = ECIMReadBlock; + OstTraceFunctionExit1( DMMCSESSION_SETUPCIMREADBLOCK_EXIT, this ); } EXPORT_C void DMMCSession::SetupCIMWriteBlock(TMMCArgument aDevAddr, TUint32 aLength, TUint8* aMemoryP) @@ -92,9 +108,11 @@ * @param aMemoryP Host source address */ { + OstTraceExt4(TRACE_FLOW, DMMCSESSION_SETUPCIMWRITEBLOCK_ENTRY, "DMMCSession::SetupCIMWriteBlock;aDevAddr=%x;aLength=%x;aMemoryP=%x;this=%x", (TUint) aDevAddr, (TUint) aLength, (TUint) aMemoryP, (TUint) this); ResetCommandStack(); FillCommandArgs(aDevAddr, aLength, aMemoryP, aLength); iSessionID = ECIMWriteBlock; + OstTraceFunctionExit1( DMMCSESSION_SETUPCIMWRITEBLOCK_EXIT, this ); } EXPORT_C void DMMCSession::SetupCIMReadMBlock(TMMCArgument aDevAddr, TUint32 aLength, TUint8* aMemoryP, TUint32 aBlkLen) @@ -111,9 +129,11 @@ * @param aBlkLen Block length */ { + OstTraceExt5(TRACE_FLOW, DMMCSESSION_SETUPCIMREADMBLOCK_ENTRY, "DMMCSession::SetupCIMReadMBlock;aDevAddr=%x;aLength=%x;aMemoryP=%x;aBlkLen=%x;this=%x", (TUint) aDevAddr, (TUint) aLength, (TUint) aMemoryP, (TUint) aBlkLen,(TUint) this); ResetCommandStack(); FillCommandArgs(aDevAddr, aLength, aMemoryP, aBlkLen); iSessionID = ECIMReadMBlock; + OstTraceFunctionExit1( DMMCSESSION_SETUPCIMREADMBLOCK_EXIT, this ); } EXPORT_C void DMMCSession::SetupCIMWriteMBlock(TMMCArgument aDevAddr, TUint32 aLength, TUint8* aMemoryP, TUint32 aBlkLen) @@ -130,9 +150,11 @@ * @param aBlkLen Block length */ { + OstTraceExt5(TRACE_FLOW, DMMCSESSION_SETUPCIMWRITEMBLOCK_ENTRY, "DMMCSession::SetupCIMWriteMBlock;aDevAddr=%x;aLength=%x;aMemoryP=%x;aBlkLen=%x;this=%x", (TUint) aDevAddr, (TUint) aLength, (TUint) aMemoryP, (TUint) aBlkLen,(TUint) this); ResetCommandStack(); FillCommandArgs(aDevAddr, aLength, aMemoryP, aBlkLen); iSessionID = ECIMWriteMBlock; + OstTraceFunctionExit1( DMMCSESSION_SETUPCIMWRITEMBLOCK_EXIT, this ); } EXPORT_C void DMMCSession::SetupCIMEraseSector(TMMCArgument aDevAddr, TUint32 aLength) @@ -152,9 +174,11 @@ * @param aLength Total number of bytes to erase */ { + OstTraceExt3(TRACE_FLOW, DMMCSESSION_SETUPCIMERASESECTOR_ENTRY, "DMMCSession::SetupCIMEraseSector;aDevAddr=%x;aLength=%x;this=%x", (TUint) aDevAddr, (TUint) aLength, (TUint) this); ResetCommandStack(); FillCommandArgs(aDevAddr, aLength, NULL, 0); iSessionID = ECIMEraseSector; + OstTraceFunctionExit1( DMMCSESSION_SETUPCIMERASESECTOR_EXIT, this ); } EXPORT_C void DMMCSession::SetupCIMEraseGroup(TMMCArgument aDevAddr, TUint32 aLength) @@ -173,9 +197,11 @@ * @param aLength Total number of bytes to erase */ { + OstTraceExt3(TRACE_FLOW, DMMCSESSION_SETUPCIMERASEGROUP_ENTRY, "DMMCSession::SetupCIMEraseGroup;aDevAddr=%x;aLength=%x;this=%x", (TUint) aDevAddr, (TUint) aLength, (TUint) this); ResetCommandStack(); FillCommandArgs(aDevAddr, aLength, NULL, 0); iSessionID = ECIMEraseGroup; + OstTraceFunctionExit1( DMMCSESSION_SETUPCIMERASEGROUP_EXIT, this ); } EXPORT_C void DMMCSession::SetupCIMReadIO(TUint8 aRegAddr, TUint32 aLength, TUint8* aMemoryP) @@ -189,9 +215,11 @@ * @param aMemoryP Host destination address */ { + OstTraceFunctionEntryExt( DMMCSESSION_SETUPCIMREADIO_ENTRY, this ); ResetCommandStack(); FillCommandArgs(aRegAddr, aLength, aMemoryP, 0); iSessionID = ECIMReadIO; + OstTraceFunctionExit1( DMMCSESSION_SETUPCIMREADIO_EXIT, this ); } EXPORT_C void DMMCSession::SetupCIMWriteIO(TUint8 aRegAddr, TUint32 aLength, TUint8* aMemoryP) @@ -205,9 +233,11 @@ * @param aMemoryP Host source address */ { + OstTraceFunctionEntryExt( DMMCSESSION_SETUPCIMWRITEIO_ENTRY, this ); ResetCommandStack(); FillCommandArgs(aRegAddr, aLength, aMemoryP, 0); iSessionID = ECIMWriteIO; + OstTraceFunctionExit1( DMMCSESSION_SETUPCIMWRITEIO_EXIT, this ); } EXPORT_C void DMMCSession::SetupCIMLockUnlock(TUint32 aLength, TUint8* aMemoryP) @@ -225,12 +255,14 @@ * @param aMemoryP Host source address containing password data */ { + OstTraceFunctionEntryExt( DMMCSESSION_SETUPCIMLOCKUNLOCK_ENTRY, this ); __KTRACE_OPT(KPBUS1, Kern::Printf("ms:slu%08x", aLength)); ResetCommandStack(); FillCommandDesc(ECmdLockUnlock); FillCommandArgs(0, aLength, aMemoryP, aLength); iSessionID = ECIMLockUnlock; + OstTraceFunctionExit1( DMMCSESSION_SETUPCIMLOCKUNLOCK_EXIT, this ); } EXPORT_C void DMMCSession::SetupCommand(TMMCCommandEnum aCommand, TMMCArgument anArgument) @@ -243,9 +275,11 @@ * @param anArgument Associated argument */ { + OstTraceExt3(TRACE_FLOW, DMMCSESSION_SETUPCOMMAND_ENTRY, "DMMCSession::SetupCommand;aCommand=%d;anArgument=%x;this=%x", (TInt) aCommand, (TUint) anArgument, (TUint) this); ResetCommandStack(); FillCommandDesc(aCommand, anArgument); iSessionID = ECIMNakedSession; + OstTraceFunctionExit1( DMMCSESSION_SETUPCOMMAND_EXIT, this ); } EXPORT_C void DMMCSession::SetupRSCommand(TMMCCommandEnum aCommand, TMMCArgument anArgument, @@ -265,6 +299,8 @@ * @todo Complete the parameter descriptions */ { + OstTraceExt4( TRACE_FLOW, DMMCSESSION_SETUPRSCOMMAND_ENTRY1, "DMMCSession::SetupRSCommand;aCommand=%d;anArgument=%x;aResponseLength=%x;this=%x", (TInt) aCommand, (TUint) anArgument, (TUint) aResponseLength, (TUint) this ); + OstTraceExt4( TRACE_FLOW, DMMCSESSION_SETUPRSCOMMAND_ENTRY2, "DMMCSession::SetupRSCommand;aCommandType=%d;aResponseType=%d;aCommandClass=%x;this=%x", (TInt) aCommandType, (TInt) aResponseType, (TUint) aCommandClass, (TUint) this ); ResetCommandStack(); FillCommandDesc(aCommand, anArgument); TMMCCommandSpec& cmdSpec = Command().iSpec; @@ -283,6 +319,7 @@ cmdSpec.iCommandClass = aCommandClass; iSessionID = ECIMNakedSession; + OstTraceFunctionExit1( DMMCSESSION_SETUPRSCOMMAND_EXIT, this ); } EXPORT_C void DMMCSession::SetupDTCommand(TMMCCommandEnum aCommand, TMMCArgument anArgument, @@ -305,6 +342,8 @@ * @todo Complete the parameter descriptions */ { + OstTraceExt5( TRACE_FLOW, DMMCSESSION_SETUPDTCOMMAND_ENTRY1, "DMMCSession::SetupDTCommand;aCommand=%d;anArgument=%x;aTotalLength=%x;aMemoryAddress=%x;this=%x", (TInt) aCommand, (TUint) anArgument, (TUint) aTotalLength, (TUint) aMemoryAddress, (TUint) this ); + OstTraceExt5( TRACE_FLOW, DMMCSESSION_SETUPDTCOMMAND_ENTRY2, "DMMCSession::SetupDTCommand;aBlockLength=%x;aStopTransmission=%d;aDir=%d;aCommandClass=%x;this=%x", (TUint) aBlockLength, (TInt) aStopTransmission, (TInt) aDir, (TUint) aCommandClass , (TUint) this ); ResetCommandStack(); FillCommandDesc(aCommand); FillCommandArgs(anArgument, aTotalLength, aMemoryAddress, aBlockLength); @@ -328,6 +367,7 @@ cmd.iSpec.iCommandClass = aCommandClass; iSessionID = ECIMNakedSession; + OstTraceFunctionExit1( DMMCSESSION_SETUPDTCOMMAND_EXIT, this ); } void DMMCSession::SetupCIMControl(TInt aSessID) @@ -335,6 +375,7 @@ // find matching macro function for supplied session // { + OstTraceFunctionEntryExt( DMMCSESSION_SETUPCIMCONTROL_ENTRY, this ); TMMCSMSTFunc f = GetMacro(aSessID); if (f == 0) @@ -352,6 +393,7 @@ ResetCommandStack(); iMachine.Setup(f, iStackP); + OstTraceFunctionExit1( DMMCSESSION_SETUPCIMCONTROL_EXIT, this ); } EXPORT_C TMMCSMSTFunc DMMCSession::GetMacro(TInt aSessNum) const @@ -395,28 +437,40 @@ * @return KErrNone if successful */ { + OstTraceFunctionEntry1( DMMCSESSION_ENGAGE_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf(">ms:eng")); if( iStackP == NULL ) - return( KErrBadDriver ); + { + OstTraceFunctionExitExt( DMMCSESSION_ENGAGE_EXIT, this, KErrBadDriver ); + return KErrBadDriver; + } if( iStackP->iLockingSessionP != NULL && iStackP->iLockingSessionP != this && (iStackP->EffectiveModes(iConfig) & KMMCModeEnqueIfLocked) == 0 ) - return( KErrServerBusy ); + { + OstTraceFunctionExitExt( DUP1_DMMCSESSION_ENGAGE_EXIT, this, KErrServerBusy ); + return KErrServerBusy; + } const TMediaState doorState=iStackP->MMCSocket()->iMediaChange->MediaState(); __KTRACE_OPT(KPBUS1,Kern::Printf(">MMC:Eng ds = %x", doorState)); + OstTrace1( TRACE_INTERNALS, DMMCSESSION_ENGAGE, "doorState = 0x%x", doorState); if (doorState == EDoorOpen) + { + OstTraceFunctionExitExt( DUP2_DMMCSESSION_ENGAGE_EXIT, this, KErrNotReady ); return KErrNotReady; + } SetupCIMControl(iSessionID); iStackP->Add(this); __KTRACE_OPT(KPBUS1,Kern::Printf("<ms:eng")); - return(KErrNone); + OstTraceFunctionExitExt( DUP3_DMMCSESSION_ENGAGE_EXIT, this, KErrNone ); + return KErrNone; } // Command specification table for standard MMC commands (CMD0 - CMD63) @@ -495,11 +549,13 @@ * Fills the current command descriptor with the default data according to MMC spec V2.1 */ { + OstTraceFunctionEntry1( DMMCSESSION_FILLCOMMANDDESC1_ENTRY, this ); TMMCCommandDesc& cmd = Command(); cmd.iSpec = CommandTable[cmd.iCommand & KMMCCommandMask]; cmd.iFlags = 0; cmd.iBytesDone = 0; + OstTraceFunctionExit1( DMMCSESSION_FILLCOMMANDDESC1_EXIT, this ); } EXPORT_C void DMMCSession::FillCommandDesc(TMMCCommandEnum aCommand) @@ -509,9 +565,11 @@ * @param aCommand Contains the command. */ { + OstTraceExt2(TRACE_FLOW, DMMCSESSION_FILLCOMMANDDESC2_ENTRY, "DMMCSession::FillCommandDesc;aCommand=%d;this=%x", (TInt) aCommand, (TUint) this); Command().iCommand = aCommand; Command().iArgument = 0; // set stuff bits to zero FillCommandDesc(); + OstTraceFunctionExit1( DMMCSESSION_FILLCOMMANDDESC2_EXIT, this ); } EXPORT_C void DMMCSession::FillCommandDesc(TMMCCommandEnum aCommand, TMMCArgument anArgument) @@ -522,10 +580,12 @@ * @param anArgument Specifies the argument. */ { + OstTraceExt3(TRACE_FLOW, DMMCSESSION_FILLCOMMANDDESC3_ENTRY, "DMMCSession::FillCommandDesc;aCommand=%d;anArgument=%x;this=%x", (TInt) aCommand, (TUint) anArgument, (TUint) this); TMMCCommandDesc& cmd = Command(); cmd.iCommand = aCommand; FillCommandDesc(); cmd.iArgument = anArgument; + OstTraceFunctionExit1( DMMCSESSION_FILLCOMMANDDESC3_EXIT, this ); } EXPORT_C void DMMCSession::FillCommandArgs(TMMCArgument anArgument, TUint32 aLength, TUint8* aMemoryP, @@ -540,6 +600,7 @@ * @param aBlkLen Block length */ { + OstTraceExt5(TRACE_FLOW, DMMCSESSION_FILLCOMMANDARGS_ENTRY ,"DMMCSession::FillCommandArgs;anArgument=%x;aLength=%x;aMemoryP=%x;aBlkLen=%x;this=%x", (TUint) anArgument, (TUint) aLength, (TUint) aMemoryP, (TUint) aBlkLen, (TUint) this); TMMCCommandDesc& cmd = Command(); cmd.iArgument = anArgument; @@ -547,6 +608,7 @@ cmd.iDataMemoryP = aMemoryP; cmd.iBlockLength = aBlkLen; cmd.iFlags = 0; + OstTraceFunctionExit1( DMMCSESSION_FILLCOMMANDARGS_EXIT, this ); } const TMMCCommandSpec& DMMCSession::FindCommandSpec(const TMMCIdxCommandSpec aSpecs[], TInt aIdx) @@ -557,9 +619,11 @@ * @param aIdx The requested command. */ { + OstTraceFunctionEntry0( DMMCSESSION_FINDCOMMANDSPEC_ENTRY ); TInt i = 0; while (aSpecs[i].iIdx != aIdx) ++i; + OstTraceFunctionExit0( DMMCSESSION_FINDCOMMANDSPEC_EXIT ); return aSpecs[i].iSpec; } @@ -568,7 +632,9 @@ // Blocks a session synchronously (within scheduler context) // { + OstTraceFunctionEntryExt( DMMCSESSION_SYNCHBLOCK_ENTRY, this ); (void)__e32_atomic_ior_ord32(&iBlockOn, aFlag); + OstTraceFunctionExit1( DMMCSESSION_SYNCHBLOCK_EXIT, this ); } void DMMCSession::SynchUnBlock(TUint32 aFlag) @@ -576,10 +642,15 @@ // Unblocks a session synchronously (within scheduler context) // { + OstTraceFunctionEntryExt( DMMCSESSION_SYNCHUNBLOCK_ENTRY, this ); if( (iBlockOn & aFlag) == 0 ) + { + OstTraceFunctionExit1( DMMCSESSION_SYNCHUNBLOCK_EXIT, this ); return; + } (void)__e32_atomic_and_ord32(&iBlockOn, ~aFlag); + OstTraceFunctionExit1( DUP1_DMMCSESSION_SYNCHUNBLOCK_EXIT, this ); } EXPORT_C TRCA DMMCSession::CardRCA() @@ -598,26 +669,32 @@ #ifdef __EPOC32__ void DMMCSession::ProgramTimerCallBack(TAny* aSessP) { + OstTraceFunctionEntry0( DMMCSESSION_PROGRAMTIMERCALLBACK_ENTRY ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mss:pgtcb")); static_cast<DMMCSession *>(aSessP)->iState |= KMMCSessStateDoDFC; static_cast<DMMCSession *>(aSessP)->UnBlock(KMMCBlockOnPgmTimer, KMMCErrNone); + OstTraceFunctionExit0( DMMCSESSION_PROGRAMTIMERCALLBACK_EXIT ); } void DMMCSession::PollTimerCallBack(TAny* aSessP) { + OstTraceFunctionEntry0( DMMCSESSION_POLLTIMERCALLBACK_ENTRY ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mss:ptcb")); static_cast<DMMCSession *>(aSessP)->iState |= KMMCSessStateDoDFC; static_cast<DMMCSession *>(aSessP)->UnBlock(KMMCBlockOnPollTimer, KMMCErrNone); + OstTraceFunctionExit0( DMMCSESSION_POLLTIMERCALLBACK_EXIT ); } void DMMCSession::RetryTimerCallBack(TAny* aSessP) { + OstTraceFunctionEntry0( DMMCSESSION_RETRYTIMERCALLBACK_ENTRY ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mss:rtcb")); static_cast<DMMCSession *>(aSessP)->iState |= KMMCSessStateDoDFC; static_cast<DMMCSession *>(aSessP)->UnBlock(KMMCBlockOnRetryTimer, KMMCErrNone); + OstTraceFunctionExit0( DMMCSESSION_RETRYTIMERCALLBACK_EXIT ); } #endif // #ifdef __EPOC32__ @@ -630,8 +707,10 @@ * @return Standard Symbian OS error code */ { + OstTraceFunctionEntry1( DMMCSESSION_EPOCERRORCODE_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mss:eee:%08x,%08x", MMCExitCode(), LastStatus().State() )); - + OstTraceExt2( TRACE_INTERNALS, DMMCSESSION_EPOCERRORCODE, "MMCExitCode = 0x%08x; LastStatus State = 0x%08x", (TUint) MMCExitCode(), (TUint) LastStatus().State()); + struct errorTableEntry { TUint32 iMask; @@ -670,7 +749,10 @@ TUint32 errCode = MMCExitCode(); if( errCode == 0 ) + { + OstTraceFunctionExitExt( DMMCSESSION_EPOCERRORCODE_EXIT, this, KErrNone ); return KErrNone; + } const errorTableEntry* ptr = &mmcTable[0]; @@ -679,12 +761,19 @@ ptr = &statusTable[0]; if( (errCode = LastStatus()) == 0 ) - return( KErrUnknown ); + { + OstTraceFunctionExitExt( DUP1_DMMCSESSION_EPOCERRORCODE_EXIT, this, KErrUnknown ); + return KErrUnknown; + } } for( ;; ) if( (errCode & ptr->iMask) != 0 ) - return( ptr->iErrorCode ); + { + TInt ret = ptr->iErrorCode; + OstTraceFunctionExitExt( DUP2_DMMCSESSION_EPOCERRORCODE_EXIT, this, ret ); + return ret; + } else ptr++; }
--- a/kernel/eka/drivers/pbus/mmc/stack.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/pbus/mmc/stack.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -20,6 +20,15 @@ #include <drivers/locmedia.h> #include "stackbody.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "locmedia_ost.h" +#ifdef __VC32__ +#pragma warning(disable: 4127) // disabling warning "conditional expression is constant" +#endif +#include "stackTraces.h" +#endif + #ifdef __SMP__ TSpinLock MMCLock(TSpinLock::EOrderGenericIrqHigh0); #endif @@ -312,6 +321,8 @@ { const TUint state = iStatus.State(); __KTRACE_OPT(KPBUS1, Kern::Printf("=mcc:ir:%d,0x%08x", IsPresent(), state)); + OstTraceExt2( TRACE_INTERNALS, TMMCARD_ISREADY, "IsPresent=%d; state=0x%08x", IsPresent(), state ); + return IsPresent() && (state == ECardStateStby || state == ECardStateTran || state == ECardStateSlp); } @@ -327,6 +338,7 @@ * @return ETrue if locked, EFalse otherwise. */ { + OstTraceFunctionEntry1( TMMCARD_ISLOCKED_ENTRY, this ); if ( !IsPresent() ) return( EFalse ); @@ -339,6 +351,7 @@ * @return The size of the MMC card in bytes. */ { + OstTraceFunctionEntry1( TMMCARD_DEVICESIZE64_ENTRY, this ); const TBool highCapacity = IsHighCapacity(); const TUint32 sectorCount = ExtendedCSD().SectorCount(); @@ -352,6 +365,7 @@ * @return The preferred write group length. */ { + OstTraceFunctionEntry1( TMMCARD_PREFERREDWRITEGROUPLENGTH_ENTRY, this ); return(CSD().WriteBlockLength() << 5); // 16K for a standard 512byte block length } @@ -400,11 +414,13 @@ * @return Symbian OS error code. */ { + OstTraceFunctionEntry1( TMMCARD_GETERASEINFO_ENTRY, this ); // Check whether this card supports Erase Class Commands. Also, validate the erase group size if ((CSD().CCC() & KMMCCmdClassErase) && IsPowerOfTwo(CSD().EraseGroupSize())) { // This card supports erase cmds. Also, all versions of MMC cards support Erase Group commands (i.e. CMD35, CMD36). + OstTrace0( TRACE_INTERNALS, TMMCARD_GETERASEINFO, "Card supports erase class commands" ); aEraseInfo.iEraseFlags=(KMMCEraseClassCmdsSupported|KMMCEraseGroupCmdsSupported); // Return the preferred size to be used as the unit for format operations. We need to return a sensible @@ -422,7 +438,8 @@ else aEraseInfo.iEraseFlags=0; - return(KErrNone); + OstTraceFunctionExitExt( TMMCARD_GETERASEINFO_EXIT, this, KErrNone ); + return KErrNone; } TUint TMMCard::MaxTranSpeedInKilohertz() const @@ -431,6 +448,7 @@ * @return Speed, in Kilohertz */ { + OstTraceFunctionEntry1( TMMCARD_MAXTRANSPEEDINKILOHERTZ_ENTRY, this ); // Default implementation obtains the transaction speed from the CSD TUint32 highSpeedClock = HighSpeedClock(); return(highSpeedClock ? highSpeedClock : iCSD.MaxTranSpeedInKilohertz()); @@ -445,6 +463,7 @@ * if possible, to try to avoid compatibility issues. */ { + OstTraceFunctionEntry1( TMMCARD_MAXREADBLLEN_ENTRY, this ); const TInt KDefaultReadBlockLen = 9; // 2^9 = 512 bytes const TCSD& csd = CSD(); @@ -453,6 +472,9 @@ if (blkLenLog2 > KDefaultReadBlockLen) { __KTRACE_OPT(KPBUS1, Kern::Printf("=mmc:mrbl %d", blkLenLog2)); + OstTrace1( TRACE_INTERNALS, TMMCARD_MAXREADBLLEN1, "Block length 1=%d", blkLenLog2 ); + + if (csd.ReadBlPartial() || CSD().SpecVers() >= 4) { // @@ -461,9 +483,11 @@ // blkLenLog2 = KDefaultReadBlockLen; __KTRACE_OPT(KPBUS1, Kern::Printf("=mmc:mrbl -> %d", blkLenLog2)); + OstTrace1( TRACE_INTERNALS, TMMCARD_MAXREADBLLEN2, "Block length 2=%d", blkLenLog2 ); } } + OstTraceFunctionExitExt( TMMCARD_MAXREADBLLEN_EXIT, this, blkLenLog2 ); return blkLenLog2; } @@ -476,6 +500,7 @@ * if possible, to try to avoid compatibility issues. */ { + OstTraceFunctionEntry1( TMMCARD_MAXWRITEBLLEN_ENTRY, this ); const TInt KDefaultWriteBlockLen = 9; // 2^9 = 512 bytes const TCSD& csd = CSD(); @@ -484,6 +509,7 @@ if (blkLenLog2 > KDefaultWriteBlockLen) { __KTRACE_OPT(KPBUS1, Kern::Printf("=mmc:mrbl %d", blkLenLog2)); + OstTrace1( TRACE_INTERNALS, TMMCARD_MAXWRITEBLLEN1, "Block length 1=%d", blkLenLog2 ); if (csd.WriteBlPartial() || CSD().SpecVers() >= 4) { // @@ -492,9 +518,11 @@ // blkLenLog2 = KDefaultWriteBlockLen; __KTRACE_OPT(KPBUS1, Kern::Printf("=mmc:mrbl -> %d", blkLenLog2)); + OstTrace1( TRACE_INTERNALS, TMMCARD_MAXWRITEBLLEN2, "Block length 1=%d", blkLenLog2 ); } } + OstTraceFunctionExitExt( TMMCARD_MAXWRITEBLLEN_EXIT, this, blkLenLog2 ); return blkLenLog2; } @@ -510,18 +538,26 @@ * @return KErrNone if successful, Standard Symbian OS error code otherwise. */ { + OstTraceFunctionEntry1( TMMCARDARRAY_ALLOCCARDS_ENTRY, this ); for (TUint i = 0; i < KMaxMMCardsPerStack; ++i) { // zeroing the card data used to be implicit because embedded in // CBase-derived DMMCStack. if ((iCards[i] = new TMMCard) == 0) + { + OstTraceFunctionExitExt( TMMCARDARRAY_ALLOCCARDS_EXIT1, this, KErrNoMemory ); return KErrNoMemory; + } iCards[i]->iUsingSessionP = 0; if ((iNewCards[i] = new TMMCard) == 0) + { + OstTraceFunctionExitExt( TMMCARDARRAY_ALLOCCARDS_EXIT2, this, KErrNoMemory ); return KErrNoMemory; + } iNewCards[i]->iUsingSessionP = 0; } + OstTraceFunctionExitExt( TMMCARDARRAY_ALLOCCARDS_EXIT3, this, KErrNone ); return KErrNone; } @@ -530,7 +566,9 @@ * Prepare card array for new scan. */ { + OstTraceFunctionEntry1( TMMCARDARRAY_INITNEWCARDSCAN_ENTRY, this ); iNewCardsCount=0; + OstTraceFunctionExit1( TMMCARDARRAY_INITNEWCARDSCAN_EXIT, this ); } void TMMCardArray::MoveCardAndLockRCA(TMMCard& aSrcCard,TMMCard& aDestCard,TInt aDestIndex) @@ -538,6 +576,7 @@ * Copy card object and lock RCA. */ { + OstTraceExt2(TRACE_FLOW, TMMCARDARRAY_MOVECARDANDLOCKRCA_ENTRY, "TMMCardArray::MoveCardAndLockRCA;aDestIndex=%d;this=%x", aDestIndex, (TUint) this); __KTRACE_OPT(KPBUS1, Kern::Printf("=mca:mclr:%d", aDestIndex)); aDestCard.iCID=aSrcCard.iCID; @@ -556,6 +595,7 @@ aSrcCard.iHighSpeedClock = 0; aSrcCard.iUsingSessionP = NULL; + OstTraceFunctionExit1( TMMCARDARRAY_MOVECARDANDLOCKRCA_EXIT, this ); } EXPORT_C void TMMCardArray::AddNewCard(const TUint8* aCID,TRCA* aNewRCA) @@ -565,6 +605,7 @@ * entries. */ { + OstTraceFunctionEntryExt( TMMCARDARRAY_ADDNEWCARD_ENTRY, this ); // Store the CID in the next free slot NewCard(iNewCardsCount).iCID = aCID; @@ -589,8 +630,11 @@ } __KTRACE_OPT(KPBUS1, Kern::Printf("mca:adn: assigning new card %d rca 0x%04x", iNewCardsCount, TUint16(*aNewRCA) )); + OstTraceExt2( TRACE_INTERNALS, TMMCARDARRAY_ADDNEWCARD, "iNewCardsCount=%d; RCA=0x%04x", iNewCardsCount, (TUint) *aNewRCA ); + NewCard(iNewCardsCount).iRCA=*aNewRCA; iNewCardsCount++; + OstTraceFunctionExit1( TMMCARDARRAY_ADDNEWCARD_EXIT, this ); } TInt TMMCardArray::MergeCards(TBool aFirstPass) @@ -600,8 +644,12 @@ * Returns KErrNotFound if not able to successfully place all the new cards. */ { - + OstTraceFunctionEntryExt( TMMCARDARRAY_MERGECARDS_ENTRY, this ); + + __KTRACE_OPT(KPBUS1,Kern::Printf("=mca:mc:%d,%d", aFirstPass, iNewCardsCount)); + OstTrace1( TRACE_INTERNALS, TMMCARDARRAY_MERGECARDS1, "iNewCardsCount=%d", iNewCardsCount ); + TUint i; // New card index TUint j; // Main card index @@ -611,6 +659,7 @@ for ( i=0 ; i<iNewCardsCount ; i++ ) { __KTRACE_OPT(KPBUS1, Kern::Printf("-mca:fp,i=%d,idx=0x%x", i, NewCard(i).iIndex)); + OstTraceExt2( TRACE_INTERNALS, TMMCARDARRAY_MERGECARDS2, "i=%d; Index=0x%x", i, NewCard(i).iIndex ); if( NewCard(i).iIndex != 0 ) // Signifies card was here before (iIndex has old slot number +1) { // Put it in the same slot as before @@ -628,18 +677,24 @@ // Find a spare slot in main array for this new card while ( Card(j).IsPresent() ) if ( ++j==iOwningStack->iMaxCardsInStack ) - return(KErrNotFound); + { + OstTraceFunctionExitExt( TMMCARDARRAY_MERGECARDS_EXIT1, this, KErrNotFound ); + return KErrNotFound; + } // Found a free slot; move the card info there __KTRACE_OPT(KPBUS1, Kern::Printf("-mca:freej=%d,rca=0x%04x", j, TUint16(Card(j).iRCA) )); + OstTraceExt2( TRACE_INTERNALS, TMMCARDARRAY_MERGECARDS3, "j=%d; RCA=0x%04x", j, (TUint) (Card(j).iRCA) ); if ( Card(j).iRCA != 0 ) iOwningStack->iRCAPool.UnlockRCA(Card(j).iRCA); __KTRACE_OPT(KPBUS1, Kern::Printf("merging new card %d to card %d dest index %d", i, j, j+1)); + OstTraceExt3( TRACE_INTERNALS, TMMCARDARRAY_MERGECARDS4, "Merging new card %d to card %d; Destination index=%d", (TInt) i, (TInt) j, (TInt) j+1 ); MoveCardAndLockRCA(NewCard(i),Card(j),(j+1)); } } - return(KErrNone); + OstTraceFunctionExitExt( TMMCARDARRAY_MERGECARDS_EXIT2, this, KErrNone ); + return KErrNone; } void TMMCardArray::UpdateAcquisitions(TUint* aMaxClock) @@ -649,7 +704,8 @@ * maximum bus clock that can be employed - by checking the CSD of each card. */ { - + OstTraceFunctionEntryExt( TMMCARDARRAY_UPDATEACQUISITIONS_ENTRY, this ); + __KTRACE_OPT(KPBUS1,Kern::Printf("=mca:uda")); iCardsPresent=0; TUint maxClk = iOwningStack->iMultiplexedBus ? 1 : 800000; // ??? @@ -680,6 +736,7 @@ // instead of relying on ASSP defaults. *aMaxClock=maxClk; + OstTraceFunctionExit1( TMMCARDARRAY_UPDATEACQUISITIONS_EXIT, this ); } EXPORT_C void TMMCardArray::DeclareCardAsGone(TUint aCardNumber) @@ -687,7 +744,8 @@ * Clears up a card info object in the main card array */ { - + OstTraceFunctionEntryExt( TMMCARDARRAY_DECLARECARDASGONE_ENTRY, this ); + __KTRACE_OPT(KPBUS1,Kern::Printf("=mca:dcag")); // If we thought this one was present then mark it as not present TMMCard& card = Card(aCardNumber); @@ -706,17 +764,20 @@ card.iFlags=0; // Reset 'has password' and 'write protected' bit fields card.iHighSpeedClock=0; card.iBusWidth=1; + OstTraceFunctionExit1( TMMCARDARRAY_DECLARECARDASGONE_EXIT, this ); } // return this card's index in the array or KErrNotFound if not found TInt TMMCardArray::CardIndex(const TMMCard* aCard) { + OstTraceFunctionEntryExt( TMMCARDARRAY_CARDINDEX_ENTRY, this ); TInt i; for (i = KMaxMMCardsPerStack-1; i>= 0; i--) { if (iCards[i] == aCard) break; } + OstTraceFunctionExitExt( TMMCARDARRAY_CARDINDEX_EXIT, this, i ); return i; } @@ -727,11 +788,17 @@ * returns -1, 0 or +1 for DT directions read, none or write respectively */ { + OstTraceFunctionEntry1( TMMCCOMMANDDESC_DIRECTION_ENTRY, this ); TUint dir = iSpec.iDirection; TInt result = dir; + TInt ret; if( dir == 0 ) - return( 0 ); + { + ret = 0; + OstTraceFunctionExitExt( TMMCCOMMANDDESC_DIRECTION_EXIT1, this, ret ); + return ret; + } if( dir & KMMCCmdDirWBitArgument ) result = TUint(iArgument) >> (dir & KMMCCmdDirIndBitPosition); @@ -739,12 +806,16 @@ if( dir & KMMCCmdDirNegate ) result = ~result; - return( ((result&1)-1)|1 ); + ret = ((result&1)-1)|1; + + OstTraceFunctionExitExt( TMMCCOMMANDDESC_DIRECTION_EXIT2, this, ret ); + return ret; } TBool TMMCCommandDesc::AdjustForBlockOrByteAccess(const DMMCSession& aSession) { + OstTraceExt2(TRACE_FLOW, TMMCCOMMANDDESC_ADJUSTFORBLOCKORBYTEACCESS_ENTRY, "TMMCCommandDesc::AdjustForBlockOrByteAccess;Session ID=%d;this=%x", (TInt) aSession.SessionID(), (TUint) this); /** * The MMC session provides both block and byte based IO methods, all of which can * be used on both block and byte based MMC cards. This method adjusts the command @@ -759,7 +830,8 @@ iTotalLength % KMMCardHighCapBlockSize != 0 || // always aligned on 512 bytes blockLength % KMMCardHighCapBlockSize != 0) { - return(EFalse); + OstTraceFunctionExitExt( TMMCCOMMANDDESC_ADJUSTFORBLOCKORBYTEACCESS_EXIT1, this, (TUint) EFalse ); + return EFalse; } if(aSession.CardP()->IsHighCapacity()) @@ -772,7 +844,8 @@ if(iArgument % KMMCardHighCapBlockSize != 0) { // Block based media does not support misaligned access - return(EFalse); + OstTraceFunctionExitExt( TMMCCOMMANDDESC_ADJUSTFORBLOCKORBYTEACCESS_EXIT2, this, (TUint) EFalse ); + return EFalse; } // adjust for block based access @@ -792,7 +865,8 @@ if(iArgument > maxBlocks) { // The address is out of range (>2G) - cannot convert - return(EFalse); + OstTraceFunctionExitExt( TMMCCOMMANDDESC_ADJUSTFORBLOCKORBYTEACCESS_EXIT3, this, (TUint) EFalse ); + return EFalse; } // adjust for byte-based access @@ -802,11 +876,13 @@ else if(iArgument % KMMCardHighCapBlockSize != 0) { // byte addressing, unaligned address - return(EFalse); + OstTraceFunctionExitExt( TMMCCOMMANDDESC_ADJUSTFORBLOCKORBYTEACCESS_EXIT4, this, (TUint) EFalse ); + return EFalse; } } - return(ETrue); + OstTraceFunctionExitExt( TMMCCOMMANDDESC_ADJUSTFORBLOCKORBYTEACCESS_EXIT5, this, (TUint) ETrue ); + return ETrue; } void TMMCCommandDesc::Dump(TUint8* aResponseP, TMMCErr aErr) @@ -965,11 +1041,17 @@ * Returns a free RCA number from the pool or zero if none is available */ { + OstTraceFunctionEntry1( TMMCRCAPOOL_GETFREERCA_ENTRY, this ); TUint32 seekm = (iPool | iLocked) + 1; iPool |= (seekm & ~iLocked); - + TUint16 ret; + if( (seekm & 0xFFFFFFFF) == 0 ) - return( 0 ); + { + ret = 0; + OstTraceFunctionExitExt( TMMCRCAPOOL_GETFREERCA_EXIT1, this, (TUint) ret); + return ret; + } TUint16 pos = 1; @@ -986,7 +1068,9 @@ // The iRCA field itself is only assigned values from iNewCards[] or zero. iNewCards // in turn is fed values from this function, in DMMCStack::CIMUpdateAcqSM() / EStSendCIDIssued. - return TUint16(pos << 8 | pos); + ret = TUint16(pos << 8 | pos); + OstTraceFunctionExitExt( TMMCRCAPOOL_GETFREERCA_EXIT2, this, (TUint) ret); + return ret; } @@ -998,14 +1082,18 @@ * Constructor */ : iPMark(NULL),iPoint(NULL),iPrevP(NULL),iSize(0) - {} + {OstTraceFunctionEntry1( TMMCSESSRING_TMMCSESSRING_ENTRY, this );} void TMMCSessRing::Erase() /** * Erases all the ring content */ - {iPMark = iPoint = iPrevP = NULL; iSize = 0;} + { + OstTraceFunctionEntry1( TMMCSESSRING_ERASE_ENTRY, this ); + iPMark = iPoint = iPrevP = NULL; iSize = 0; + OstTraceFunctionExit1( TMMCSESSRING_ERASE_EXIT, this ); + } DMMCSession* TMMCSessRing::operator++(TInt) @@ -1030,15 +1118,20 @@ * Finds aSessP and sets Point to that position */ { + OstTraceFunctionEntryExt( TMMCSESSRING_POINT_ENTRY, this ); Point(); while( iPoint != NULL ) if( iPoint == aSessP ) - return( ETrue ); + { + OstTraceFunctionExitExt( TMMCSESSRING_POINT_EXIT1, this, (TUint) ETrue ); + return ETrue; + } else this->operator++(0); - return( EFalse ); + OstTraceFunctionExitExt( TMMCSESSRING_POINT_EXIT2, this, (TUint) EFalse ); + return EFalse; } void TMMCSessRing::Add(DMMCSession* aSessP) @@ -1046,11 +1139,13 @@ * Inserts aSessP before Marker. Point is moved into the Marker position. */ { + OstTraceFunctionEntryExt( TMMCSESSRING_ADD1_ENTRY, this ); if( iSize == 0 ) { iPMark = iPrevP = iPoint = aSessP; aSessP->iLinkP = aSessP; iSize = 1; + OstTraceFunctionExit1( TMMCSESSRING_ADD1_EXIT1, this ); return; } @@ -1059,6 +1154,7 @@ aSessP->iLinkP = iPoint; iPMark = iPrevP = aSessP; iSize++; + OstTraceFunctionExit1( TMMCSESSRING_ADD1_EXIT2, this ); } @@ -1069,10 +1165,14 @@ * Erases aRing. */ { + OstTraceFunctionEntry1( TMMCSESSRING_ADD2_ENTRY, this ); Point(); if( aRing.iSize == 0 ) + { + OstTraceFunctionExit1( TMMCSESSRING_ADD2_EXIT1, this ); return; + } if( iSize == 0 ) { @@ -1089,6 +1189,7 @@ } aRing.Erase(); + OstTraceFunctionExit1( TMMCSESSRING_ADD2_EXIT2, this ); } DMMCSession* TMMCSessRing::Remove() @@ -1097,6 +1198,7 @@ * Point (and possibly Marker) move forward as in operator++ */ { + OstTraceFunctionEntry1( TMMCSESSRING_REMOVE1_ENTRY, this ); DMMCSession* remS = iPrevP; if( iSize < 2 ) @@ -1117,7 +1219,8 @@ } } - return( remS ); + OstTraceFunctionExitExt( TMMCSESSRING_REMOVE1_EXIT, this, ( TUint )( remS ) ); + return remS; } @@ -1126,10 +1229,12 @@ * Removes a specified session from the ring */ { + OstTraceFunctionEntryExt( TMMCSESSRING_REMOVE2_ENTRY, this ); if( Point(aSessP) ) Remove(); else DMMCSocket::Panic(DMMCSocket::EMMCSessRingNoSession); + OstTraceFunctionExit1( TMMCSESSRING_REMOVE2_EXIT, this ); } @@ -1144,9 +1249,11 @@ */ EXPORT_C void TMMCStateMachine::Reset() { + OstTraceFunctionEntry1( TMMCSTATEMACHINE_RESET_ENTRY, this ); iAbort = EFalse; iSP = 0; iExitCode = 0; iStack[0].iState = 0; iStack[0].iTrapMask = 0; + OstTraceFunctionExit1( TMMCSTATEMACHINE_RESET_EXIT, this ); } @@ -1159,7 +1266,8 @@ */ EXPORT_C TMMCErr TMMCStateMachine::Dispatch() { - + OstTraceFunctionEntry1( TMMCSTATEMACHINE_DISPATCH_ENTRY, this ); + // If a state machine returns non-zero, i.e. a non-empty error set, then the second // inner while loop is broken. The errors are thrown like an exception where the // stack is unravelled until it reaches a state machine which can handle at least @@ -1182,11 +1290,13 @@ if ( iExitCode ) { __KTRACE_OPT(KPBUS1,Kern::Printf(">MMC:Err %x",iExitCode)); + OstTrace1( TRACE_INTERNALS, TMMCSTATEMACHINE_DISPATCH, "iExitCode=0x%x", iExitCode ); } while( iSP >= 0 && !iAbort ) { __KTRACE_OPT(KPBUS1,Kern::Printf("-msm:dsp:%02x:%08x.%02x",iSP, TUint32(iStack[iSP].iFunction), State())); + OstTraceExt3( TRACE_INTERNALS, TMMCSTATEMACHINE_DISPATCH2, "iSP=%d; iStack[iSP].iFunction=0x%08x; State=0x%02x", (TInt) iSP, (TUint) iStack[iSP].iFunction, (TUint) State() ); iSuspend = ETrue; const TMMCErr signal = iStack[iSP].iFunction(iContextP); @@ -1200,12 +1310,14 @@ if( iSuspend ) { __KTRACE_OPT(KPBUS1,Kern::Printf("<msm:dsp:exitslp")); + OstTraceFunctionExit1( TMMCSTATEMACHINE_DISPATCH_EXIT1, this ); return(0); } } } __KTRACE_OPT(KPBUS1,Kern::Printf("<msm:dsp:exit%08x", iExitCode)); + OstTraceFunctionExit1( TMMCSTATEMACHINE_DISPATCH_EXIT2, this ); return( KMMCErrBypass | iExitCode ); } @@ -1235,6 +1347,7 @@ */ EXPORT_C TMMCErr TMMCStateMachine::Push(TMMCErr (*anEntry)(TAny*), TBool aSuspend) { + OstTraceFunctionEntry1( TMMCSTATEMACHINE_PUSH_ENTRY, this ); iSP++; __ASSERT_ALWAYS(TUint(iSP)<KMaxMMCMachineStackDepth, DMMCSocket::Panic(DMMCSocket::EMMCMachineStack)); @@ -1243,7 +1356,8 @@ iStack[iSP].iTrapMask = 0; if( !aSuspend ) iSuspend = EFalse; - return( 0 ); + OstTraceFunctionExit1( TMMCSTATEMACHINE_PUSH_EXIT, this ); + return 0; } @@ -1262,12 +1376,14 @@ */ EXPORT_C TMMCErr TMMCStateMachine::Jump(TMMCErr (*anEntry)(TAny*), TBool aSuspend) { + OstTraceFunctionEntry1( TMMCSTATEMACHINE_JUMP_ENTRY, this ); iStack[iSP].iFunction = anEntry; iStack[iSP].iState = 0; iStack[iSP].iTrapMask = 0; if( !aSuspend ) iSuspend = EFalse; - return( 0 ); + OstTraceFunctionExit1( TMMCSTATEMACHINE_JUMP_EXIT, this ); + return 0; } @@ -1320,13 +1436,20 @@ * @return KErrNone if successful, standard error code otherwise. */ { + OstTraceFunctionEntry1( DMMCSTACK_INIT_ENTRY, this ); // allocate and initialize session object if ((iStackSession = AllocSession(TMMCCallBack(StackSessionCBST, this))) == 0) - return(KErrNoMemory); + { + OstTraceFunctionExitExt( DMMCSTACK_INIT_EXIT1, this, KErrNoMemory ); + return KErrNoMemory; + } // create helper class if ((iBody = new DBody(*this)) == NULL) - return(KErrNoMemory); + { + OstTraceFunctionExitExt( DMMCSTACK_INIT_EXIT2, this, KErrNoMemory ); + return KErrNoMemory; + } iStackSession->SetStack(this); @@ -1339,7 +1462,8 @@ TInt r = iCardArray->AllocCards(); - return(r); + OstTraceFunctionExitExt( DMMCSTACK_INIT_EXIT3, this, r ); + return r; } EXPORT_C void DMMCStack::PowerUpStack() @@ -1348,6 +1472,7 @@ * This is an asynchronous operation, which calls DMMCSocket::PowerUpSequenceComplete upon completion. */ { + OstTraceFunctionEntry1( DMMCSTACK_POWERUPSTACK_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:pus")); if (iPSLBuf == NULL) @@ -1359,6 +1484,7 @@ ReportPowerDown(); // ensure power will be switch on regardless Scheduler( iInitialise ); + OstTraceFunctionExit1( DMMCSTACK_POWERUPSTACK_EXIT, this ); } void DMMCStack::QSleepStack() @@ -1366,9 +1492,11 @@ * Schedules a session to place media in Sleep State */ { + OstTraceFunctionEntry1( DMMCSTACK_QSLEEPSTACK_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:qsleep")); Scheduler( iSleep ); + OstTraceFunctionExit1( DMMCSTACK_QSLEEPSTACK_EXIT, this ); } EXPORT_C void DMMCStack::PowerDownStack() @@ -1382,6 +1510,7 @@ * timeout system can be left to power it down. */ { + OstTraceFunctionEntry1( DMMCSTACK_POWERDOWNSTACK_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:pds")); ReportPowerDown(); @@ -1435,6 +1564,7 @@ iInitialise = EFalse; iStackState &= ~(KMMCStackStateInitInProgress | KMMCStackStateInitPending | KMMCStackStateBusInconsistent | KMMCStackStateWaitingDFC); iSessionP = NULL; + OstTraceFunctionExit1( DMMCSTACK_POWERDOWNSTACK_EXIT, this ); } // @@ -1445,10 +1575,14 @@ * Initiates stack DFC. Returns either Continue or Loop. */ { + OstTraceFunctionEntry1( DMMCSTACK_SCHEDGETONDFC_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:sgd")); if( iDFCRunning ) - return( ESchedContinue ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDGETONDFC_EXIT1, this, (TInt) ESchedContinue); + return ESchedContinue; + } if( (iStackState & KMMCStackStateWaitingDFC) == 0 ) { @@ -1460,7 +1594,8 @@ iStackDFC.Enque(); } - return( ESchedLoop ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDGETONDFC_EXIT2, this, (TInt) ESchedLoop); + return ESchedLoop; } void DMMCStack::SchedSetContext(DMMCSession* aSessP) @@ -1470,12 +1605,14 @@ * @param aSessP A pointer to the session. */ { + OstTraceFunctionEntry1( DMMCSTACK_SCHEDSETCONTEXT_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:ssc")); if( (iStackState & (KMMCStackStateInitPending|KMMCStackStateBusInconsistent)) != 0 && aSessP->iSessionID != ECIMInitStack ) { iInitialise = ETrue; + OstTraceFunctionExit1( DMMCSTACK_SCHEDSETCONTEXT_EXIT1, this ); return; } @@ -1497,6 +1634,7 @@ } iSessionP->iState &= ~KMMCSessStateDoReSchedule; + OstTraceFunctionExit1( DMMCSTACK_SCHEDSETCONTEXT_EXIT2, this ); } void DMMCStack::SchedDoAbort(DMMCSession* aSessP) @@ -1505,6 +1643,7 @@ * @param aSessP A pointer to the session to be aborted. */ { + OstTraceFunctionEntryExt( DMMCSTACK_SCHEDDOABORT_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:sda")); #ifdef __EPOC32__ @@ -1532,6 +1671,7 @@ (void)__e32_atomic_and_ord32(&aSessP->iBlockOn, ~(KMMCBlockOnPollTimer | KMMCBlockOnRetryTimer | KMMCBlockOnWaitToLock | KMMCBlockOnASSPFunction | KMMCBlockOnInterrupt | KMMCBlockOnDataTransfer) ); + OstTraceFunctionExit1( DMMCSTACK_SCHEDDOABORT_EXIT, this ); } DMMCStack::TMMCStackSchedStateEnum DMMCStack::SchedResolveStatBlocks(DMMCSession* aSessP) @@ -1541,6 +1681,7 @@ * @return EschedContinue or ESchedLoop (if scheduler is to be restarted) */ { + OstTraceFunctionEntryExt( DMMCSTACK_SCHEDRESOLVESTATBLOCKS_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:srsb")); @@ -1554,10 +1695,12 @@ iStackState &= ~KMMCStackStateWaitingToLock; aSessP->SynchUnBlock( KMMCBlockOnWaitToLock ); MarkComplete( aSessP, KMMCErrNone ); - return( ESchedLoop ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDRESOLVESTATBLOCKS_EXIT1, this, (TInt) ESchedLoop ); + return ESchedLoop; } - return( ESchedContinue ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDRESOLVESTATBLOCKS_EXIT2, this, (TInt) ESchedContinue ); + return ESchedContinue; } DMMCStack::TMMCStackSchedStateEnum DMMCStack::SchedGroundDown(DMMCSession* aSessP, TMMCErr aReason) @@ -1575,10 +1718,14 @@ * separate scheduler pass. */ { + OstTraceExt3(TRACE_FLOW, DMMCSTACK_SCHEDGROUNDDOWN_ENTRY, "DMMCStack::SchedGroundDown;aSessionP=%x;aReason=%d;this=%x", (TUint) aSessP, (TInt) aReason, (TUint) this); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:sgdn")); if( (aSessP == iStackSession) || InitStackInProgress() ) - return( ESchedLoop ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDGROUNDDOWN_EXIT1, this, (TInt) ESchedLoop ); + return ESchedLoop; + } if( aSessP->iState & KMMCSessStateInProgress ) { @@ -1590,7 +1737,8 @@ KMMCSessStateDoDFC); } - return( ESchedContinue ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDGROUNDDOWN_EXIT2, this, (TInt) ESchedContinue ); + return ESchedContinue; } DMMCStack::TMMCStackSchedStateEnum DMMCStack::SchedEnqueStackSession(TMMCSessionTypeEnum aSessID) @@ -1599,18 +1747,21 @@ * @return EschedContinue or ESchedLoop */ { + OstTraceExt2(TRACE_FLOW, DMMCSTACK_SCHEDENQUESTACKSESSION_ENTRY ,"DMMCStack::SchedEnqueStackSession;aSessID=%d;this=%x", (TInt) aSessID, (TUint) this); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:sess")); if( iStackSession->IsEngaged() ) { MarkComplete( iStackSession, KMMCErrAbort ); - return( ESchedLoop ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDENQUESTACKSESSION_EXIT1, this, (TInt) ESchedLoop ); + return ESchedLoop; } iStackSession->SetupCIMControl( aSessID ); iWorkSet.Add( iStackSession ); iStackSession->iState |= KMMCSessStateEngaged; - return( ESchedContinue ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDENQUESTACKSESSION_EXIT2, this, (TInt) ESchedContinue ); + return ESchedContinue; } void DMMCStack::SchedGrabEntries() @@ -1619,6 +1770,8 @@ * after the completion pass */ { + OstTraceFunctionEntry1( DMMCSTACK_SCHEDGRABENTRIES_ENTRY, this ); + __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:sge")); iAttention = EFalse; // Strictly in this order @@ -1628,6 +1781,7 @@ iReadyQueue.Add( iEntryQueue ); RESTOREPREEMPTION } + OstTraceFunctionExit1( DMMCSTACK_SCHEDGRABENTRIES_EXIT, this ); } void DMMCStack::SchedDisengage() @@ -1637,6 +1791,7 @@ * clear up the dependent resources */ { + OstTraceFunctionEntry1( DMMCSTACK_SCHEDDISENGAGE_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:sd")); DMMCSession* sessP = iWorkSet.Remove(); @@ -1665,6 +1820,7 @@ ASSPDisengage(); sessP->iState = 0; + OstTraceFunctionExit1( DMMCSTACK_SCHEDDISENGAGE_EXIT, this ); } inline DMMCStack::TMMCStackSchedStateEnum DMMCStack::SchedAbortPass() @@ -1673,6 +1829,7 @@ * only for the sake of Scheduler() clarity. */ { + OstTraceFunctionEntry1( DMMCSTACK_SCHEDABORTPASS_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:sap")); iAbortReq = EFalse; @@ -1699,7 +1856,10 @@ iReadyQueue++; if( iAbortReq ) - return( ESchedLoop ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDABORTPASS_EXIT1, this, (TInt) ESchedLoop ); + return ESchedLoop; + } // Clearing iAbortAll here is a bit dodgy. It wouldn't work if somebody interrupted us // at this point, enqued a session and then immediately called Reset() - that session @@ -1707,7 +1867,8 @@ // and process them in the Scheduler main loop) seems to be too expensive just to avoid // this particular effect. iAbortAll = EFalse; - return( ESchedContinue ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDABORTPASS_EXIT2, this, (TInt) ESchedContinue ); + return ESchedContinue; } inline DMMCStack::TMMCStackSchedStateEnum DMMCStack::SchedCompletionPass() @@ -1716,6 +1877,7 @@ * Returns either Continue or Loop. */ { + OstTraceFunctionEntry1( DMMCSTACK_SCHEDCOMPLETIONPASS_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:scp")); iCompReq = EFalse; @@ -1738,7 +1900,8 @@ // DFC has been queued so return back to main loop. Next time // SchedGetOnDfc() will return EFalse, and the callback will be called. iCompReq = ETrue; - return( ESchedLoop ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDCOMPLETIONPASS_EXIT1, this, (TInt) ESchedLoop ); + return ESchedLoop; } SchedDisengage(); // calls iWorkSet.Remove @@ -1787,11 +1950,15 @@ iWorkSet++; if( iCompReq ) - return( ESchedLoop ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDCOMPLETIONPASS_EXIT2, this, (TInt) ESchedLoop ); + return ESchedLoop; + } iCompleteAllExitCode = 0; - return( ESchedContinue ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDCOMPLETIONPASS_EXIT3, this, ( TInt) ESchedContinue ); + return ESchedContinue; } inline DMMCStack::TMMCStackSchedStateEnum DMMCStack::SchedInitStack() @@ -1799,10 +1966,14 @@ * "Immediate" InitStack initiator. Returns either Continue or Loop. */ { + OstTraceFunctionEntry1( DMMCSTACK_SCHEDINITSTACK_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:sis")); if( SchedGetOnDFC() ) - return( ESchedLoop ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDINITSTACK_EXIT1, this, (TInt) ESchedLoop ); + return ESchedLoop; + } if( iSessionP != NULL && (iStackState & KMMCStackStateJobChooser) == 0 ) { @@ -1811,7 +1982,8 @@ if( SchedGroundDown(iSessionP, KMMCErrPowerDown) ) { MarkComplete( iSessionP, KMMCErrPowerDown ); - return( ESchedLoop ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDINITSTACK_EXIT2, this, (TInt) ESchedLoop ); + return ESchedLoop; } } else @@ -1829,7 +2001,10 @@ if( iSessionP == NULL || iSessionP->iSessionID != ECIMInitStack ) { if( SchedEnqueStackSession(ECIMInitStack) ) - return( ESchedLoop ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDINITSTACK_EXIT3, this, (TInt) ESchedLoop ); + return ESchedLoop; + } SchedSetContext( iStackSession ); // make the internal session to be current job } @@ -1841,7 +2016,8 @@ iStackState |= KMMCStackStateInitInProgress; // nothing can stop this session now; it's safe to clear iInitialise here. iInitialise = EFalse; - return( ESchedContinue ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDINITSTACK_EXIT4, this, (TInt) ESchedContinue ); + return ESchedContinue; } inline DMMCStack::TMMCStackSchedStateEnum DMMCStack::SchedSleepStack() @@ -1849,13 +2025,15 @@ * "Immediate" Stack sleep mode. Returns either Continue or Loop. */ { + OstTraceFunctionEntry1( DMMCSTACK_SCHEDSLEEPSTACK_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:SchdSlp!")); // Make sure Stack DFC is Running! if( SchedGetOnDFC() ) { __KTRACE_OPT(KPBUS1, Kern::Printf("mst:SchdSlp - DFC not running")); - return( ESchedLoop ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDSLEEPSTACK_EXIT1, this, (TInt) ESchedLoop ); + return ESchedLoop; } if( iSessionP != NULL && (iStackState & KMMCStackStateJobChooser) == 0 ) @@ -1865,7 +2043,8 @@ // A session has been queued before sleep, // cancel sleep and loop for next session iSleep = EFalse; - return( ESchedLoop ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDSLEEPSTACK_EXIT2, this, (TInt) ESchedLoop ); + return ESchedLoop; } } @@ -1875,7 +2054,8 @@ __KTRACE_OPT(KPBUS1,Kern::Printf("SchdSlp: already Enqued")); // Stack already busy cancel sleep iSleep = EFalse; - return( ESchedLoop ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDSLEEPSTACK_EXIT3, this, (TInt) ESchedLoop ); + return ESchedLoop; } SchedSetContext( iStackSession ); // make the internal session to be current job @@ -1885,7 +2065,8 @@ iStackState |= KMMCStackStateSleepinProgress; __KTRACE_OPT(KPBUS1, Kern::Printf("<mst:SchdSlp")); - return( ESchedLoop ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDSLEEPSTACK_EXIT4, this, (TInt) ESchedLoop ); + return ESchedLoop; } @@ -1894,14 +2075,21 @@ * Checks if the current session can be preempted */ { // strictly in the following order + OstTraceFunctionEntry1( DMMCSTACK_SCHEDPREEMPTABLE_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:spe")); if( (iStackState & KMMCStackStateJobChooser) || (iSessionP->iState & KMMCSessStateDoReSchedule) ) - return( ETrue ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDPREEMPTABLE_EXIT1, this, (TUint) ETrue ); + return ETrue; + } if( (iSessionP->iBlockOn & KMMCBlockOnASSPFunction) ) - return( EFalse ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDPREEMPTABLE_EXIT2, this, (TUint) EFalse ); + return EFalse; + } TBool preemptDC = EFalse; @@ -1916,7 +2104,10 @@ // is set at the variant, and determines whether commands may be // issued during the data transfer period. if(!(iSessionP->iState & KMMCSessStateAllowDirectCommands)) - return( EFalse ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDPREEMPTABLE_EXIT3, this, (TUint) EFalse ); + return EFalse; + } // We must consider the remaining blocking conditions // before being sure that we can enable pre-emtion of this session @@ -1924,23 +2115,39 @@ } if( (iSessionP->iBlockOn & (KMMCBlockOnCardInUse | KMMCBlockOnNoRun)) ) - return( ETrue ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDPREEMPTABLE_EXIT4, this, (TUint) ETrue ); + return ETrue; + } if( (iConfig.iModes & KMMCModeEnablePreemption) == 0 ) - return( EFalse ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDPREEMPTABLE_EXIT5, this, (TUint) EFalse ); + return EFalse; + } if( (iSessionP->iBlockOn & KMMCBlockOnGapTimersMask) && (iConfig.iModes & KMMCModePreemptInGaps) && (iSessionP->iState & KMMCSessStateSafeInGaps) ) - return( ETrue ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDPREEMPTABLE_EXIT6, this, (TUint) ETrue ); + return ETrue; + } if( iSessionP->iBlockOn & KMMCBlockOnInterrupt ) - return( ETrue ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDPREEMPTABLE_EXIT7, this, (TUint) ETrue ); + return ETrue; + } if(preemptDC) - return( ETrue ); + { + OstTraceFunctionExitExt( DDMMCSTACK_SCHEDPREEMPTABLE_EXIT8, this, (TUint) ETrue ); + return ETrue; + } - return( EFalse ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDPREEMPTABLE_EXIT9, this, (TUint) EFalse ); + return EFalse; } inline DMMCStack::TMMCStackSchedStateEnum DMMCStack::SchedSession() @@ -1948,37 +2155,54 @@ * Current context analyser. Returns Exit, Loop or ChooseJob. */ { + OstTraceFunctionEntry1( DMMCSTACK_SCHEDSESSION_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:ss")); // If no current session selected then we need to choose one if (iSessionP == NULL) - return(ESchedChooseJob); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDSESSION_EXIT1, this, (TInt) ESchedChooseJob ); + return ESchedChooseJob; + } // Check any static blocking conditions on the current session and remove if possible if (SchedResolveStatBlocks(iSessionP)==ESchedLoop) - return(ESchedLoop); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDSESSION_EXIT2, this, (TInt) ESchedLoop ); + return ESchedLoop; + } // If current session is still blocked, see if we could pre-empt the session if (iSessionP->iBlockOn) { if( SchedPreemptable() ) - return(ESchedChooseJob); - - return( ESchedExit ); // No preemption possible + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDSESSION_EXIT3, this, (TInt) ESchedChooseJob ); + return ESchedChooseJob; + } + + OstTraceFunctionExitExt( DMMCSTACK_SCHEDSESSION_EXIT4, this, (TInt) ESchedExit ); + return ESchedExit; // No preemption possible } // If the current session has been marked to be 'un-scheduled' then we // need to choose another session if ones available if ( (iSessionP->iState & KMMCSessStateDoReSchedule) ) - return( ESchedChooseJob ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDSESSION_EXIT5, this, (TInt) ESchedChooseJob ); + return ESchedChooseJob; + } // Check if this session requires to be run in DFC context - loop if necessary if ( (iSessionP->iState & KMMCSessStateDoDFC) ) { iSessionP->iState &= ~KMMCSessStateDoDFC; if( SchedGetOnDFC()==ESchedLoop ) - return( ESchedLoop ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDSESSION_EXIT6, this, (TInt) ESchedLoop ); + return ESchedLoop; + } } // Now we actually execute the current session @@ -2023,7 +2247,8 @@ if( exitCode ) MarkComplete( iSessionP, (exitCode & ~KMMCErrBypass) ); - return(ESchedLoop); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDSESSION_EXIT7, this, (TInt) ESchedLoop ); + return ESchedLoop; } TBool DMMCStack::SchedYielding(DMMCSession* aSessP) @@ -2031,6 +2256,7 @@ * Check whether the scheduler should yield to another command */ { + OstTraceFunctionEntryExt( DMMCSTACK_SCHEDYIELDING_ENTRY, this ); // Test whether a full loop through the sessions has occurred during a yield if ((aSessP->iBlockOn & KMMCBlockOnYielding) && (iStackState & KMMCStackStateYielding)) { @@ -2038,7 +2264,9 @@ aSessP->iBlockOn &= ~KMMCBlockOnYielding; iStackState &= ~KMMCStackStateYielding; } - return(iStackState & KMMCStackStateYielding) != 0; + TBool ret = (iStackState & KMMCStackStateYielding) != 0; + OstTraceFunctionExitExt( DMMCSTACK_SCHEDYIELDING_EXIT, this, ret ); + return ret; } TBool DMMCStack::SchedAllowDirectCommands(DMMCSession* aSessP) @@ -2046,6 +2274,7 @@ * Check whether direct only commands can be run. */ { + OstTraceFunctionEntryExt( DMMCSTACK_SCHEDALLOWDIRECTCOMMANDS_ENTRY, this ); TBool allowDirectCommands = EFalse; // Test the remaining sessions to see if they have a DMA data transfer blockage which allow direct commands only @@ -2058,7 +2287,8 @@ } while((aSessP != testSessP) && (testSessP != NULL)); - return(allowDirectCommands); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDALLOWDIRECTCOMMANDS_EXIT, this, allowDirectCommands ); + return allowDirectCommands; } inline DMMCStack::TMMCStackSchedStateEnum DMMCStack::SchedChooseJob() @@ -2066,6 +2296,7 @@ * Find an unblocked job to run. Returns Exit or Loop. */ { + OstTraceFunctionEntry1( DMMCSTACK_SCHEDCHOOSEJOB_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:scj")); iStackState |= KMMCStackStateJobChooser; @@ -2110,7 +2341,10 @@ { // first, remove all static blocking conditions if( SchedResolveStatBlocks(sessP) ) - return( ESchedLoop ); + { + OstTraceFunctionExitExt( DMMCSTACK_SCHEDCHOOSEJOB_EXIT1, this, (TInt) ESchedLoop ); + return ESchedLoop; + } TBool scheduleSession = ETrue; // Test whether we are yielding @@ -2127,13 +2361,15 @@ { iWorkSet.SetMarker(); SchedSetContext( sessP ); - return( ESchedLoop ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDCHOOSEJOB_EXIT2, this, (TInt) ESchedLoop ); + return ESchedLoop; } iWorkSet++; } - return( ESchedExit ); + OstTraceFunctionExitExt( DMMCSTACK_SCHEDCHOOSEJOB_EXIT3, this, (TInt) ESchedExit ); + return ESchedExit; } void DMMCStack::StackDFC(TAny* aStackP) @@ -2141,10 +2377,12 @@ * This DFC is used to startup Stack Scheduler from the background. */ { + OstTraceFunctionEntry0( DMMCSTACK_STACKDFC_ENTRY ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:sdf")); DMMCStack* const stackP = static_cast<DMMCStack*>(aStackP); stackP->Scheduler( stackP->iDFCRunning ); + OstTraceFunctionExit0( DMMCSTACK_STACKDFC_EXIT ); } void DMMCStack::Scheduler(volatile TBool& aFlag) @@ -2154,6 +2392,7 @@ * DoSchedule() */ { + OstTraceFunctionEntry0( DMMCSTACK_SCHEDULER_ENTRY ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:sch")); DISABLEPREEMPTION @@ -2168,10 +2407,12 @@ iStackState |= KMMCStackStateRunning; RESTOREPREEMPTION DoSchedule(); + OstTraceFunctionExit0( DMMCSTACK_SCHEDULER_EXIT ); } void DMMCStack::DoSchedule() { + OstTraceFunctionEntry1( DMMCSTACK_DOSCHEDULE_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf(">mst:dos")); for(;;) @@ -2224,6 +2465,7 @@ RESTOREPREEMPTION __KTRACE_OPT(KPBUS1,Kern::Printf("<mst:dos")); + OstTraceFunctionExit1( DMMCSTACK_DOSCHEDULE_EXIT1, this ); return; } @@ -2239,6 +2481,7 @@ * Adds session aSessP to the EntryQueue (asynchronous function) */ { + OstTraceFunctionEntryExt( DMMCSTACK_ADD_ENTRY, this ); ASSERT_NOT_ISR_CONTEXT __KTRACE_OPT(KPBUS1,Kern::Printf(">MMC:Add %d",TUint(aSessP->iSessionID))); @@ -2247,6 +2490,7 @@ aSessP->iState |= KMMCSessStateEngaged; RESTOREPREEMPTION Scheduler( iAttention ); + OstTraceFunctionExit1( DMMCSTACK_ADD_EXIT, this ); } void DMMCStack::Abort(DMMCSession* aSessP) @@ -2254,16 +2498,21 @@ * Aborts a session */ { + OstTraceFunctionEntryExt( DMMCSTACK_ABORT_ENTRY, this ); ASSERT_NOT_ISR_CONTEXT __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:abt")); if( !aSessP->IsEngaged() ) + { + OstTraceFunctionExit1( DMMCSTACK_ABORT_EXIT1, this ); return; + } aSessP->iDoAbort = ETrue; aSessP->iMachine.Abort(); Scheduler( iAbortReq ); + OstTraceFunctionExit1( DMMCSTACK_ABORT_EXIT2, this ); } void DMMCStack::Stop(DMMCSession* aSessP) @@ -2271,26 +2520,38 @@ * Signals session to stop */ { + OstTraceFunctionEntryExt( DMMCSTACK_STOP1_ENTRY, this ); ASSERT_NOT_ISR_CONTEXT __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:stp")); if( !aSessP->IsEngaged() ) + { + OstTraceFunctionExit1( DMMCSTACK_STOP1_EXIT1, this ); return; + } aSessP->iDoStop = ETrue; + OstTraceFunctionExit1( DMMCSTACK_STOP1_EXIT2, this ); } EXPORT_C void DMMCStack::Block(DMMCSession* aSessP, TUint32 aFlag) { + OstTraceFunctionEntryExt( DMMCSTACK_BLOCK_ENTRY, this ); ASSERT_NOT_ISR_CONTEXT __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:blk")); if( !aSessP->IsEngaged() ) + { + OstTraceFunctionExit1( DMMCSTACK_BLOCK_EXIT1, this ); return; + } __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:blk:[aFlag=%08x, iBlockOn=%08x]", aFlag, aSessP->iBlockOn)); + OstTraceExt2( TRACE_INTERNALS, DMMCSTACK_BLOCK, "aFlag=0x%08x; iBlockOn=0x%08x", aFlag, aSessP->iBlockOn ); + (void)__e32_atomic_ior_ord32(&aSessP->iBlockOn, aFlag); + OstTraceFunctionExit1( DMMCSTACK_BLOCK_EXIT2, this ); } EXPORT_C void DMMCStack::UnBlock(DMMCSession* aSessP, TUint32 aFlag, TMMCErr anExitCode) @@ -2299,14 +2560,20 @@ * session is waiting on all of these events, then it is scheduled. */ { + OstTraceExt4(TRACE_FLOW, DMMCSTACK_UNBLOCK_ENTRY , "DMMCStack::UnBlock;aSessP=%x;aFlag=%x;anExitCode=%d;this=%x", (TUint) aSessP, (TUint) aFlag, (TInt) anExitCode, (TUint) this); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:ubl")); if (aSessP != NULL) { __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:ubl:[aFlag=%08x, iBlockOn=%08x", aFlag, aSessP->iBlockOn)); + OstTraceExt2( TRACE_INTERNALS, DMMCSTACK_UNBLOCK, "aFlag=0x%08x; iBlockOn=0x%08x", aFlag, aSessP->iBlockOn ); + if( (aSessP->iBlockOn & aFlag) == 0 ) + { + OstTraceFunctionExit1( DMMCSTACK_UNBLOCK_EXIT1, this ); return; + } // Must be either in a DFC or have the KMMCSessStateDoDFC flag set __ASSERT_DEBUG( @@ -2320,6 +2587,7 @@ if( aSessP->iBlockOn == 0 ) Scheduler( iAttention ); } + OstTraceFunctionExit1( DMMCSTACK_UNBLOCK_EXIT2, this ); } void DMMCStack::UnlockStack(DMMCSession* aSessP) @@ -2327,6 +2595,7 @@ * Removes stack lock. Asynchronous function. */ { + OstTraceFunctionEntryExt( DMMCSTACK_UNLOCKSTACK_ENTRY, this ); ASSERT_NOT_ISR_CONTEXT __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:ust")); @@ -2337,6 +2606,7 @@ iLockingSessionP = NULL; Scheduler( iAttention ); } + OstTraceFunctionExit1( DMMCSTACK_UNLOCKSTACK_EXIT1, this ); } EXPORT_C TInt DMMCStack::Stop(TMMCard* aCardP) @@ -2345,6 +2615,7 @@ * Returns either KErrNone or KErrServerBusy. */ { + OstTraceFunctionEntryExt( DMMCSTACK_STOP2_ENTRY, this ); ASSERT_NOT_ISR_CONTEXT __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:stp")); @@ -2353,7 +2624,7 @@ if( iStackState & KMMCStackStateRunning ) { RESTOREPREEMPTION - return( KErrServerBusy ); // can not operate in foreground + return KErrServerBusy; // can not operate in foreground } iStackState |= KMMCStackStateRunning; @@ -2382,7 +2653,8 @@ SchedGetOnDFC(); DoSchedule(); - return( KErrNone ); + OstTraceFunctionExitExt( DMMCSTACK_STOP2_EXIT, this, KErrNone ); + return KErrNone; } void DMMCStack::MarkComplete(DMMCSession* aSessP, TMMCErr anExitCode) @@ -2390,6 +2662,7 @@ * Marks session to be completed on the next scheduler pass. */ { + OstTraceExt3(TRACE_FLOW, DMMCSTACK_MARKCOMPLETE_ENTRY ,"DMMCStack::MarkComplete;aSessP=%x;anExitCode=%d;this=%x", (TUint) aSessP, (TInt) anExitCode, (TUint) this); ASSERT_NOT_ISR_CONTEXT __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:mcp")); @@ -2397,6 +2670,7 @@ aSessP->iMMCExitCode = anExitCode; aSessP->iDoComplete = ETrue; iCompReq = ETrue; + OstTraceFunctionExit1( DMMCSTACK_MARKCOMPLETE_EXIT, this ); } // @@ -2407,6 +2681,7 @@ * Calculates effective client modes as real client modes merged with iMasterConfig modes */ { + OstTraceFunctionEntry1( DMMCSTACK_EFFECTIVEMODES_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:em")); const TUint32 masterMode = (iMasterConfig.iModes & iMasterConfig.iUpdateMask) | @@ -2422,10 +2697,18 @@ const TUint32 effectiveMode = (userMode & userMask) | (masterMode & ~userMask); if( effectiveMode & KMMCModeEnableClientConfig ) - return( effectiveMode ); + { + OstTraceFunctionExitExt( DMMCSTACK_EFFECTIVEMODES_EXIT1, this, ( TUint )( effectiveMode ) ); + return effectiveMode; + } else - return( (effectiveMode & KMMCModeClientOverrides) | - (masterMode & ~(KMMCModeClientOverrides | KMMCModeClientMask)) ); + { + + TUint32 ret = (effectiveMode & KMMCModeClientOverrides) | + (masterMode & ~(KMMCModeClientOverrides | KMMCModeClientMask)); + OstTraceFunctionExitExt( DMMCSTACK_EFFECTIVEMODES_EXIT2, this, ( TUint )( ret ) ); + return ret; + } } void DMMCStack::MergeConfig(DMMCSession* aSessP) @@ -2433,6 +2716,7 @@ * Merges client and master configuration into iConfig */ { + OstTraceFunctionEntryExt( DMMCSTACK_MERGECONFIG_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:mc")); TMMCStackConfig& cC = aSessP->iConfig; @@ -2514,6 +2798,7 @@ iConfig.iBusConfig.iBusyTimeOut = (modes & KMMCModeClientBusyTimeOut) ? cC.iBusConfig.iBusyTimeOut : mC.iBusConfig.iBusyTimeOut; + OstTraceFunctionExit1( DMMCSTACK_MERGECONFIG_EXIT, this ); } TBool DMMCStack::StaticBlocks() @@ -2522,18 +2807,25 @@ * Returns ETrue if the session has to be stopped right now */ { + OstTraceFunctionEntry1( DMMCSTACK_STATICBLOCKS_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:stb")); if( iSessionP->iDoStop ) { MarkComplete( iSessionP, KMMCErrAbort ); - return( ETrue ); + OstTraceFunctionExitExt( DMMCSTACK_STATICBLOCKS_EXIT1, this, (TUint) ETrue ); + return ETrue; } if( !iDFCRunning && (iSessionP->iState & KMMCSessStateDoDFC) ) - return( ETrue ); - - return( (iSessionP->iState & KMMCSessStateDoReSchedule) != 0 ); + { + OstTraceFunctionExitExt( DMMCSTACK_STATICBLOCKS_EXIT2, this, (TUint) ETrue ); + return ETrue; + } + + TBool ret = (iSessionP->iState & KMMCSessStateDoReSchedule) != 0; + OstTraceFunctionExitExt( DMMCSTACK_STATICBLOCKS_EXIT3, this, ret ); + return ret; } @@ -2566,7 +2858,6 @@ * Stack Session completion routine. */ { - __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:sscbs")); static_cast<DMMCStack *>(aStackP)->StackSessionCB(); } @@ -2574,13 +2865,15 @@ TInt DMMCStack::StackSessionCB() { + OstTraceFunctionEntry1( DMMCSTACK_STACKSESSIONCB_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:sscb ")); if (iStackState & KMMCStackStateSleepinProgress) { // Sleep completed update stack state iStackState &= ~KMMCStackStateSleepinProgress; - return( 0 ); + OstTraceFunctionExit1( DMMCSTACK_STACKSESSIONCB_EXIT1, this ); + return 0; } TMMCErr mmcError = iStackSession->MMCExitCode(); @@ -2646,6 +2939,7 @@ { // don't complete power up request yet // - This will be done in DMMCStack::AutoUnlockCB() + OstTraceFunctionExit1( DMMCSTACK_STACKSESSIONCB_EXIT2, this ); return 0; } } @@ -2685,7 +2979,8 @@ } - return( 0 ); + OstTraceFunctionExit1( DMMCSTACK_STACKSESSIONCB_EXIT3, this ); + return 0; } void DMMCStack::AutoUnlockCBST(TAny *aStackP) @@ -2698,6 +2993,7 @@ TInt DMMCStack::AutoUnlockCB() { + OstTraceFunctionEntry1( DMMCSTACK_AUTOUNLOCKCB_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("=mst:aucb")); // This is the session end callback for iAutoUnlockSession, @@ -2714,6 +3010,7 @@ iSocket->PowerUpSequenceComplete(epocErr); iStackState |= KMMCStackStateRunning; + OstTraceFunctionExit1( DMMCSTACK_AUTOUNLOCKCB_EXIT, this ); return 0; } @@ -2740,11 +3037,16 @@ }; DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_ATTACHCARDSM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ATTACHCARDSM2, "EStBegin" ); if( s.iCardP == NULL ) - return( KMMCErrNoCard ); + { + OstTraceFunctionExitExt( DMMCSTACK_ATTACHCARDSM_EXIT1, this, (TInt) KMMCErrNoCard ); + return KMMCErrNoCard; + } if( s.iCardP->iUsingSessionP != NULL && s.iCardP->iUsingSessionP != &s ) { @@ -2755,7 +3057,10 @@ if( s.iCardP->IsPresent() && s.iCardP->iCID == s.iCID ) s.iCardP->iUsingSessionP = &s; else - return( KMMCErrNoCard ); + { + OstTraceFunctionExitExt( DMMCSTACK_ATTACHCARDSM_EXIT2, this, (TInt) KMMCErrNoCard ); + return KMMCErrNoCard; + } s.iConfig.SetMode( KMMCModeCardControlled ); // for future context switching iConfig.SetMode( KMMCModeCardControlled ); // for this context @@ -2773,7 +3078,9 @@ SMF_STATE(EStAttStatus) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ATTACHCARDSM3, "EStAttStatus" ); s.PopCommandStack(); + OstTraceFunctionExitExt( DMMCSTACK_ATTACHCARDSM_EXIT3, this, (TInt) err ); SMF_RETURN( err ) SMF_END @@ -2795,17 +3102,21 @@ __KTRACE_OPT(KPBUS1,Kern::Printf(">MMC:InitStackSM")); DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CIMINITSTACKSM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMINITSTACKSM2, "EStBegin" ); m.SetTraps( KMMCErrAll ); // to prevent this macro from infinite restarts via iInitialise SMF_INVOKES( CIMUpdateAcqSMST, EStInitDone ) SMF_STATE(EStInitDone) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMINITSTACKSM3, "EStInitDone" ); s.iState &= ~KMMCSessStateInProgress; // now we won't be restarted SchedGetOnDFC(); // StackSessionCB must be on DFC + OstTraceFunctionExitExt( DMMCSTACK_CIMINITSTACKSM_EXIT, this, (TInt) err ); SMF_RETURN( err ) // _?_ power cycles can be performed here if error SMF_END @@ -2840,9 +3151,11 @@ DMMCSession& s=Session(); DMMCPsu* psu=(DMMCPsu*)iSocket->iVcc; + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CIMUPDATEACQSM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMUPDATEACQSM2, "EStBegin" ); // This macro works naked and must not be preempted iConfig.RemoveMode( KMMCModeEnablePreemption | KMMCModeCardControlled ); // Ensure DFC is running before and after powering up @@ -2865,6 +3178,7 @@ SMF_STATE(EStPoweredUp) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMUPDATEACQSM3, "EStPoweredUp" ); // Switch on the bus clock in identification mode SetBusConfigDefaults(iMasterConfig.iBusConfig, KMMCBusClockFOD); DoSetClock(KMMCBusClockFOD); @@ -2879,6 +3193,7 @@ SMF_STATE(EStClockOn) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMUPDATEACQSM4, "EStClockOn" ); // Check if there are any cards present in the stack if (!HasCardsPresent()) SMF_GOTOS( EStCheckStack ) @@ -2895,16 +3210,19 @@ SMF_STATE(EStStartInterrogation) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMUPDATEACQSM5, "EStStartInterrogation" ); // NB: RCAs are not unlocked here. They will be unlocked one by one during the update of card info array. SMF_INVOKES( AcquireStackSMST, EStCheckStack ) SMF_STATE(EStCheckStack) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMUPDATEACQSM6, "EStCheckStack" ); // Check that all known cards are still present by issuing select/deselect SMF_INVOKES( CheckStackSMST, EStCardCap ) SMF_STATE(EStCardCap) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMUPDATEACQSM7, "EStCardCap" ); // Call a licencee-specific state machine to allow card capabilities to be modified. SMF_INVOKES( ModifyCardCapabilitySMST, EStIssueDSR ) @@ -2918,6 +3236,7 @@ // of a multiplexed bus such as SD), the highest clock is returned and the clock // rate is changed when a new card is selected. // + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMUPDATEACQSM8, "EStIssueDSR" ); TUint maxClk; iCardArray->UpdateAcquisitions(&maxClk); SetBusConfigDefaults( iMasterConfig.iBusConfig, maxClk ); @@ -2932,6 +3251,7 @@ SMF_STATE(EStFinishUp) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMUPDATEACQSM9, "EStFinishUp" ); s.iState &= ~(KMMCSessStateInProgress | KMMCSessStateCritical); // Update/Init stack has been completed. @@ -2967,9 +3287,11 @@ DMMCSession& s = Session(); TBool initSingleCard = (s.CardP() == NULL) ? (TBool)EFalse : (TBool)ETrue; + OstTrace1( TRACE_INTERNALS, DMMCSTACK_INITSTACKAFTERUNLOCKSM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_INITSTACKAFTERUNLOCKSM2, "EStBegin" ); if(initSingleCard) { iSelectedCardIndex = iCxCardCount; @@ -2994,6 +3316,8 @@ SMF_STATE(EStTestNextCard) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_INITSTACKAFTERUNLOCKSM3, "EStTestNextCard" ); + // any more cards ? if (++iSelectedCardIndex >= iCxCardCount) SMF_GOTOS(EStNoMoreCards); @@ -3011,9 +3335,13 @@ SMF_STATE(EStGetExtendedCSD) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_INITSTACKAFTERUNLOCKSM4, "EStGetExtendedCSD" ); + // Get the Extended CSD if this is an MMC version 4 card __KTRACE_OPT(KPBUS1, Kern::Printf(">ConfigureHighSpeed(), SpecVers() %u", s.CardP()->CSD().SpecVers())); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_INITSTACKAFTERUNLOCKSM5, "SpecVers()=%u", s.CardP()->CSD().SpecVers() ); + // clear the Extended CSD contents in case this is a pre-version 4 card or the read fails. memset(s.CardP()->iExtendedCSD.Ptr(), 0, KMMCExtendedCSDLength); @@ -3030,7 +3358,8 @@ SMF_INVOKES(CIMReadWriteBlocksSMST, EStGotExtendedCSD) SMF_STATE(EStGotExtendedCSD) - + + OstTrace0( TRACE_INTERNALS, DMMCSTACK_INITSTACKAFTERUNLOCKSM6, "EStGotExtendedCSD" ); if (err != KMMCErrNone) { SMF_GOTOS(EStExit); @@ -3043,6 +3372,8 @@ SMF_STATE(EStGotModifiedExtendedCSD) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_INITSTACKAFTERUNLOCKSM7, "EStGotExtendedCSD" ); + __KTRACE_OPT(KPBUS1, Kern::Printf("Extended CSD")); __KTRACE_OPT(KPBUS1, Kern::Printf("CSDStructureVer: %u", s.CardP()->ExtendedCSD().CSDStructureVer())); __KTRACE_OPT(KPBUS1, Kern::Printf("ExtendedCSDRev: %u", s.CardP()->ExtendedCSD().ExtendedCSDRev())); @@ -3070,7 +3401,14 @@ __KTRACE_OPT(KPBUS1, Kern::Printf("BootConfig: %u", s.CardP()->ExtendedCSD().BootConfig())); __KTRACE_OPT(KPBUS1, Kern::Printf("BootBusWidth: %u", s.CardP()->ExtendedCSD().BootBusWidth())); __KTRACE_OPT(KPBUS1, Kern::Printf("EraseGroupDef: %u", s.CardP()->ExtendedCSD().EraseGroupDef())); - + + OstTraceDefExt3( OST_TRACE_CATEGORY_RND, TRACE_MMCDEBUG, DMMCSTACK_INITSTACKAFTERUNLOCKSM8, "CSDStructureVer=%u; ExtendedCSDRev=%u; SupportedCmdSet=%u", s.CardP()->ExtendedCSD().CSDStructureVer(), s.CardP()->ExtendedCSD().ExtendedCSDRev(), s.CardP()->ExtendedCSD().SupportedCmdSet() ); + OstTraceDefExt4( OST_TRACE_CATEGORY_RND, TRACE_MMCDEBUG, DMMCSTACK_INITSTACKAFTERUNLOCKSM9, "PowerClass26Mhz360V=0x%02x; PowerClass52Mhz360V=0x%02x; PowerClass26Mhz195V=0x%02x; PowerClass52Mhz195V=0x%02x", s.CardP()->ExtendedCSD().PowerClass26Mhz360V(), s.CardP()->ExtendedCSD().PowerClass52Mhz360V(), s.CardP()->ExtendedCSD().PowerClass26Mhz195V(), s.CardP()->ExtendedCSD().PowerClass52Mhz195V() ); + OstTraceDefExt5( OST_TRACE_CATEGORY_RND, TRACE_MMCDEBUG, DMMCSTACK_INITSTACKAFTERUNLOCKSM10, "CardType=%u; CmdSet=%u; CmdSetRev=%u; PowerClass=%u; HighSpeedTiming=%u", s.CardP()->ExtendedCSD().CardType(), s.CardP()->ExtendedCSD().CmdSet(), s.CardP()->ExtendedCSD().CmdSetRev(), s.CardP()->ExtendedCSD().PowerClass(), s.CardP()->ExtendedCSD().HighSpeedTiming() ); + OstTraceDefExt5( OST_TRACE_CATEGORY_RND, TRACE_MMCDEBUG, DMMCSTACK_INITSTACKAFTERUNLOCKSM11, "HighCapacityEraseGroupSize=%u; AccessSize=%u; BootInfo=%u; BootSizeMultiple=%u; EraseTimeoutMultiple=%u", s.CardP()->ExtendedCSD().HighCapacityEraseGroupSize(), s.CardP()->ExtendedCSD().AccessSize(), s.CardP()->ExtendedCSD().BootInfo(), s.CardP()->ExtendedCSD().BootSizeMultiple(), s.CardP()->ExtendedCSD().EraseTimeoutMultiple() ); + OstTraceDefExt5( OST_TRACE_CATEGORY_RND, TRACE_MMCDEBUG, DMMCSTACK_INITSTACKAFTERUNLOCKSM12, "ReliableWriteSector=%u; HighCapWriteProtGroupSize=%u; SleepCurrentVcc=%u; SleepCurrentVccQ=%u; SleepAwakeTimeout=%u", s.CardP()->ExtendedCSD().ReliableWriteSector(), s.CardP()->ExtendedCSD().HighCapacityWriteProtectGroupSize(), s.CardP()->ExtendedCSD().SleepCurrentVcc(), s.CardP()->ExtendedCSD().SleepCurrentVccQ(), s.CardP()->ExtendedCSD().SleepAwakeTimeout() ); + OstTraceDefExt3( OST_TRACE_CATEGORY_RND, TRACE_MMCDEBUG, DMMCSTACK_INITSTACKAFTERUNLOCKSM13, "BootConfig=%u; BootBusWidth=%u; EraseGroupDef=%u", s.CardP()->ExtendedCSD().BootConfig(), s.CardP()->ExtendedCSD().BootBusWidth(), s.CardP()->ExtendedCSD().EraseGroupDef() ); + if (s.CardP()->ExtendedCSD().ExtendedCSDRev() >= 3) { if (!(s.CardP()->ExtendedCSD().EraseGroupDef()) && s.CardP()->ExtendedCSD().HighCapacityEraseGroupSize()) @@ -3083,6 +3421,8 @@ 0); __KTRACE_OPT(KPBUS1, Kern::Printf(">Writing to EXT_CSD (EEraseGroupDefIndex), arg %08X", (TUint32) arg)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_INITSTACKAFTERUNLOCKSM14, "Writing to EXT_CSD (EEraseGroupDefIndex); arg=0x%08x", (TUint32) arg ); + s.FillCommandDesc(ECmdSwitch, arg); SMF_INVOKES(ExecSwitchCommandST, EStEraseGroupDefSet) @@ -3093,6 +3433,8 @@ SMF_STATE(EStEraseGroupDefSet) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_INITSTACKAFTERUNLOCKSM15, "EStEraseGroupDefSet" ); + if (err == KMMCErrNone) { // EEraseGroupDef has been updated succussfully, @@ -3102,10 +3444,12 @@ SMF_STATE(EStDetermineBusWidthAndClock) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_INITSTACKAFTERUNLOCKSM16, "EStDetermineBusWidthAndClock" ); SMF_INVOKES( DetermineBusWidthAndClockSMST, EStGotBusWidthAndClock ) SMF_STATE(EStGotBusWidthAndClock) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_INITSTACKAFTERUNLOCKSM17, "EStGotBusWidthAndClock" ); SMF_NEXTS(initSingleCard ? EStExit : EStTestNextCard) if(iMultiplexedBus || iCardArray->CardsPresent() == 1) @@ -3117,8 +3461,11 @@ SMF_STATE(EStNoMoreCards) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_INITSTACKAFTERUNLOCKSM18, "EStNoMoreCards" ); SMF_STATE(EStExit) + + OstTrace0( TRACE_INTERNALS, DMMCSTACK_INITSTACKAFTERUNLOCKSM19, "EStExit" ); m.ResetTraps(); SMF_END @@ -3154,8 +3501,11 @@ DMMCSession& s = Session(); TMMCard* cardP = iCardArray->CardP(iSelectedCardIndex); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_DETERMINEBUSWIDTHANDCLOCKSM1, "Current session=0x%x", &s ); SMF_BEGIN + + OstTrace0( TRACE_INTERNALS, DMMCSTACK_DETERMINEBUSWIDTHANDCLOCKSM2, "EStBegin" ); // Trap Switch errors & no-response errors m.SetTraps(KMMCErrResponseTimeOut | KMMCErrStatus); @@ -3164,6 +3514,8 @@ SMF_STATE(EStWritePowerClass) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_DETERMINEBUSWIDTHANDCLOCKSM3, "EStWritePowerClass" ); + // Check the card type is valid // The only currently valid values for this field are 0x01 or 0x03 TUint cardType = cardP->iExtendedCSD.CardType(); @@ -3171,6 +3523,8 @@ cardType != (TExtendedCSD::EHighSpeedCard26Mhz | TExtendedCSD::EHighSpeedCard52Mhz)) { __KTRACE_OPT(KPBUS1, Kern::Printf("Unsupported card type %u", cardType)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_DETERMINEBUSWIDTHANDCLOCKSM4, "Unsupported card type=%u", cardType ); + SMF_GOTOS(EStExit); } @@ -3193,12 +3547,15 @@ 0); __KTRACE_OPT(KPBUS1, Kern::Printf(">ConfigureHighSpeed(), Writing to EXT_CSD (EPowerClass), arg %08X", (TUint32) arg)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_DETERMINEBUSWIDTHANDCLOCKSM5, "Writing to EXT_CSD (EPowerClass); arg=0x%08x", (TUint32) arg ); s.FillCommandDesc(ECmdSwitch, arg); SMF_INVOKES(ExecSwitchCommandST, EStStartBusTest) } SMF_STATE(EStStartBusTest) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_DETERMINEBUSWIDTHANDCLOCKSM6, "EStStartBusTest" ); + if (err != KMMCErrNone) { SMF_GOTOS(EStExit); @@ -3209,6 +3566,8 @@ SMF_INVOKES(ExecBusTestSMST, EStExit); SMF_STATE(EStExit) + + OstTrace0( TRACE_INTERNALS, DMMCSTACK_DETERMINEBUSWIDTHANDCLOCKSM7, "EStExit" ); m.ResetTraps(); SMF_END @@ -3244,13 +3603,17 @@ DMMCSession& s = Session(); TMMCard* cardP = iCardArray->CardP(iSelectedCardIndex); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CONFIGUREHIGHSPEEDSM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CONFIGUREHIGHSPEEDSM2, "EStBegin" ); + // Trap Switch errors & no-response errors m.SetTraps(KMMCErrResponseTimeOut | KMMCErrStatus); __KTRACE_OPT(KPBUS1, Kern::Printf(">ConfigureHighSpeed(), iCxCardCount %u", iCxCardCount)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CONFIGUREHIGHSPEEDSM3, "iCxCardCount=%d", iCxCardCount ); cardP->SetHighSpeedClock(0); @@ -3261,6 +3624,7 @@ cardType != (TExtendedCSD::EHighSpeedCard26Mhz | TExtendedCSD::EHighSpeedCard52Mhz)) { __KTRACE_OPT(KPBUS1, Kern::Printf("Unsupported card type %u", cardType)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CONFIGUREHIGHSPEEDSM4, "Unsupported card type=%u", cardType ); SMF_GOTOS(EStExit); } @@ -3275,12 +3639,15 @@ 0); __KTRACE_OPT(KPBUS1, Kern::Printf(">ConfigureHighSpeed(), Writing to EXT_CSD (EBusWidthMode), arg %08X", (TUint32) arg)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CONFIGUREHIGHSPEEDSM5, "Writing to EXT_CSD (EBusWidthMode); arg=0x%x", (TUint32) arg ); s.FillCommandDesc(ECmdSwitch, arg); SMF_INVOKES(ExecSwitchCommandST, EStConfigureBusWidth) } SMF_STATE(EStConfigureBusWidth) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CONFIGUREHIGHSPEEDSM6, "EStConfigureBusWidth" ); + if (err != KMMCErrNone) { SMF_GOTOS(EStExit); @@ -3299,6 +3666,9 @@ // fall through to next state SMF_STATE(EStWriteHsTiming) + + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CONFIGUREHIGHSPEEDSM7, "EStWriteHsTiming" ); + if (iBusWidthAndClock == E1Bit20Mhz) SMF_GOTOS(EStExit); @@ -3309,12 +3679,15 @@ 0); __KTRACE_OPT(KPBUS1, Kern::Printf(">ConfigureHighSpeed(), Writing to EXT_CSD (EHighSpeedInterfaceTiming), arg %08X", (TUint32) arg)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CONFIGUREHIGHSPEEDSM8, "Writing to EXT_CSD (EHighSpeedInterfaceTiming); arg=0x%x", (TUint32) arg ); s.FillCommandDesc(ECmdSwitch, arg); SMF_INVOKES(ExecSwitchCommandST, EStConfigureClock) SMF_STATE(EStConfigureClock) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CONFIGUREHIGHSPEEDSM9, "EStConfigureClock" ); + if (err != KMMCErrNone) { DoSetBusWidth(EBusWidth1); @@ -3327,6 +3700,9 @@ TMMCMachineInfoV4::EClockSpeed26Mhz))); SMF_STATE(EStExit) + + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CONFIGUREHIGHSPEEDSM10, "EStExit" ); + m.ResetTraps(); SMF_END @@ -3345,15 +3721,19 @@ }; DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_EXECSWITCHCOMMAND1, "Current session=0x%x", &s ); SMF_BEGIN - SMF_INVOKES(ExecCommandSMST, EStSendStatus) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECSWITCHCOMMAND2, "EStBegin" ); + SMF_INVOKES(ExecCommandSMST, EStSendStatus) SMF_STATE(EStSendStatus) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECSWITCHCOMMAND3, "EStSendStatus" ); s.FillCommandDesc(ECmdSendStatus, 0); SMF_INVOKES(ExecCommandSMST, EStGetStatus) SMF_STATE(EStGetStatus) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECSWITCHCOMMAND4, "EStGetStatus" ); const TMMCStatus st(s.ResponseP()); const TMMCardStateEnum st1 = st.State(); @@ -3383,9 +3763,12 @@ }; DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_EXECSLEEPCOMMANDSM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECSLEEPCOMMANDSM2, "EStBegin" ); + __KTRACE_OPT(KPBUS1, Kern::Printf(">ExecSleepCommandSM()")); iAutoUnlockIndex = -1; @@ -3393,6 +3776,7 @@ SMF_STATE(EStIndexNxtCard) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECSLEEPCOMMANDSM3, "EStIndexNxtCard" ); __KTRACE_OPT(KPBUS1, Kern::Printf(">EStIndexNxtCard")); // the cycle is finished when iAutoUnlockIndex == KMaxMultiMediaCardsPerStack if(iAutoUnlockIndex >= TInt(KMaxMMCardsPerStack)) @@ -3415,6 +3799,7 @@ if (useIndex) { __KTRACE_OPT(KPBUS1, Kern::Printf(">Card[%d]: is v4.3 device",iAutoUnlockIndex)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_EXECSLEEPCOMMANDSM4, "Card[%d]: is v4.3+ device", iAutoUnlockIndex ); break; } } @@ -3435,6 +3820,7 @@ SMF_STATE(EStSleepAwakeIssued) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECSLEEPCOMMANDSM5, "EStSleepAwakeIssued" ); __KTRACE_OPT(KPBUS1, Kern::Printf(">EStSleepAwakeIssued!")); const TMMCStatus status(s.ResponseP()); @@ -3446,6 +3832,7 @@ // R1b is issued before Sleep state is achieved and // will therefore return the previous state which was Standby __KTRACE_OPT(KPBUS1, Kern::Printf(">Card[%d]: SLEEP",iAutoUnlockIndex)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_EXECSLEEPCOMMANDSM6, "Card[%d]: SLEEP", iAutoUnlockIndex ); // Ensure card status is ECardStateSlp s.CardP()->iStatus.UpdateState(ECardStateSlp); @@ -3456,6 +3843,8 @@ else { __KTRACE_OPT(KPBUS1, Kern::Printf(">Card[%d]: UNKNOWN",iAutoUnlockIndex)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_EXECSLEEPCOMMANDSM7, "Card[%d]: UNKNOWN", iAutoUnlockIndex ); + return (KMMCErrStatus); } @@ -3463,6 +3852,7 @@ SMF_STATE(EStUpdateStackState) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECSLEEPCOMMANDSM8, "EStUpdateStackState" ); if (iStackState & KMMCStackStateSleep) { // Media has been transitioned to sleep state @@ -3477,6 +3867,7 @@ SMF_STATE(EStDone) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECSLEEPCOMMANDSM9, "EStDone" ); __KTRACE_OPT(KPBUS1, Kern::Printf("<ExecSleepCommandSM()")); SMF_END @@ -3496,9 +3887,11 @@ }; DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_EXECAWAKECOMMANDSM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECAWAKECOMMANDSM2, "EStBegin" ); __KTRACE_OPT(KPBUS1, Kern::Printf(">ExecAwakeCommandSM()")); // Call PSL to ensure VccQ is powered up before continuing @@ -3506,6 +3899,7 @@ SMF_STATE(EStPoweredUp) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECAWAKECOMMANDSM3, "EStPoweredUp" ); __KTRACE_OPT(KPBUS1, Kern::Printf("VccQ Powered Up")); //Issue CMD5 to awaken media @@ -3517,6 +3911,7 @@ SMF_STATE(EStAwakeIssued) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECAWAKECOMMANDSM4, "EStAwakeIssued" ); __KTRACE_OPT(KPBUS1, Kern::Printf(">>EStAwakeIssued!")); TMMCStatus status(s.ResponseP()); @@ -3526,19 +3921,22 @@ // R1b is issued before Standby state is achieved and // will therefore return the previous state which was Sleep __KTRACE_OPT(KPBUS1, Kern::Printf(">Card[%d]: STANDBY",iAutoUnlockIndex)); - + OstTrace1( TRACE_INTERNALS, DMMCSTACK_EXECAWAKECOMMANDSM5, "Card[%d]: STANDBY", iAutoUnlockIndex ); s.CardP()->iStatus.UpdateState(ECardStateStby); } else { __KTRACE_OPT(KPBUS1, Kern::Printf(">Card[%d]: UNKNOWN",iAutoUnlockIndex)); - return (KMMCErrStatus); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_EXECAWAKECOMMANDSM6, "Card[%d]: UNKNOWN", iAutoUnlockIndex ); + OstTraceFunctionExitExt( DMMCSTACK_EXECAWAKECOMMANDSM_EXIT, this, (TInt) KMMCErrStatus ); + return KMMCErrStatus; } s.PopCommandStack(); SMF_STATE(EStDone) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECAWAKECOMMANDSM7, "EStDone" ); __KTRACE_OPT(KPBUS1, Kern::Printf("<ExecAwakeCommandSM()")); SMF_END @@ -3553,6 +3951,7 @@ TUint& aPowerClass, TBusWidthAndClock& aBusWidthAndClock) { + OstTraceExt2(TRACE_FLOW, DMMCSTACK_DETERMINEBUSWIDTHANDCLOCK_ENTRY, "DMMCStack::DetermineBusWidthAndClock;aLowVoltage=%d;this=%x", (TInt) aLowVoltage, (TUint) this); // Set default return values - in case power constraints aren't matched aPowerClass = 0; @@ -3564,7 +3963,10 @@ TMMCMachineInfoV4Pckg machineInfoPckg(machineInfo); MachineInfo(machineInfoPckg); if (machineInfo.iVersion < TMMCMachineInfoV4::EVersion4) + { + OstTraceFunctionExit1( DMMCSTACK_DETERMINEBUSWIDTHANDCLOCK_EXIT1, this ); return; + } TBusWidth maxBusWidth = machineInfo.iMaxBusWidth; TInt maxClockSpeedInMhz = machineInfo.iMaxClockSpeedInMhz; @@ -3614,10 +4016,13 @@ } __KTRACE_OPT(KPBUS1, Kern::Printf("aPowerClass %u, targetWidthAndClock = %08X", aPowerClass, aBusWidthAndClock)); + OstTraceExt2( TRACE_INTERNALS, DMMCSTACK_DETERMINEBUSWIDTHANDCLOCK, "aPowerClass=%u; targetWidthAndClock=0x%08x", aPowerClass, (TUint) aBusWidthAndClock ); + OstTraceFunctionExit1( DMMCSTACK_DETERMINEBUSWIDTHANDCLOCK_EXIT2, this ); } TUint DMMCStack::GetPowerClass(const TMMCard& aCard, TBusWidthAndClock aWidthAndClock, TBool aLowVoltage) { + OstTraceExt3(TRACE_FLOW, DMMCSTACK_GETPOWERCLASS_ENTRY, "DMMCStack::GetPowerClass;aWidthAndClock=%d;aLowVoltage=%d;this=%x", (TInt) aWidthAndClock, (TInt) aLowVoltage, (TUint) this); // The power class for 4 bit bus configurations is in the low nibble, // The power class for 8 bit bus configurations is in the high nibble, #define LO_NIBBLE(val) (val & 0x0F) @@ -3670,6 +4075,7 @@ } } + OstTraceFunctionExitExt( DMMCSTACK_GETPOWERCLASS_EXIT, this, powerClass ); return powerClass; } @@ -3689,25 +4095,30 @@ }; DMMCSession& s = Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM1, "Current session=0x%x", &s ); SMF_BEGIN // // Start the BUSTEST sequence at the maximum supported by the PSL // - iSpare[0] keeps track of the current bus width // + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM2, "EStBegin" ); if (iBusWidthAndClock & E8BitMask) { iSpare[0] = EBusWidth8; __KTRACE_OPT(KPBUS1, Kern::Printf("...Hardware supports 8-bit bus")); + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM3, "Hardware supports 8-bit bus" ); } else if(iBusWidthAndClock & E4BitMask) { iSpare[0] = EBusWidth4; __KTRACE_OPT(KPBUS1, Kern::Printf("...Hardware supports 4-bit bus")); + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM4, "Hardware supports 4-bit bus" ); } else { __KTRACE_OPT(KPBUS1, Kern::Printf("...Hardware supports 1-bit bus")); + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM5, "Hardware supports 1-bit bus" ); iSpare[0] = EBusWidth1; } @@ -3719,12 +4130,14 @@ // // Issue the BUSTEST_W command // + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM6, "EStSendBusTest_W" ); TInt length = 2; switch(iSpare[0]) { case EBusWidth8: // Set the host to 8-bit mode __KTRACE_OPT(KPBUS1, Kern::Printf("BUSTEST : EBusWidth8")); + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM7, "BUSTEST : EBusWidth8" ); DoSetBusWidth(EBusWidth8); iPSLBuf[0] = 0x55; iPSLBuf[1] = 0xaa; @@ -3733,6 +4146,7 @@ case EBusWidth4: // Set the host to 4-bit mode __KTRACE_OPT(KPBUS1, Kern::Printf("BUSTEST : EBusWidth4")); + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM8, "BUSTEST : EBusWidth4" ); DoSetBusWidth(EBusWidth4); iPSLBuf[0] = 0x5a; iPSLBuf[1] = 0x00; @@ -3742,6 +4156,7 @@ default: // Set the host to 1-bit mode __KTRACE_OPT(KPBUS1, Kern::Printf("BUSTEST : EBusWidth1")); + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM9, "BUSTEST : EBusWidth1" ); DoSetBusWidth(EBusWidth1); iPSLBuf[0] = 0x40; iPSLBuf[1] = 0x00; @@ -3751,6 +4166,7 @@ // Issue BUSTEST_W __KTRACE_OPT(KPBUS1, Kern::Printf("...Issue BUSTEST_W [%02x:%02x]", iPSLBuf[1], iPSLBuf[0])); + OstTraceExt2( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM10, "Issue BUSTEST_W [%02x:%02x]", (TUint) iPSLBuf[1], (TUint) iPSLBuf[0] ); m.SetTraps(KMMCErrDataCRC); // CRC check is optional for BUSTEST @@ -3762,11 +4178,14 @@ // // Issue the BUSTEST_R command // + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM11, "EStSendBusTest_R" ); __KTRACE_OPT(KPBUS1, Kern::Printf("...got BUSTEST_W response : %02x", err)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM12, "Got BUSTEST_W response=0x%02x", err ); if(err == KMMCErrNone || err == KMMCErrDataCRC) { __KTRACE_OPT(KPBUS1, Kern::Printf("...sending BUSTEST_R")); + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM13, "Sending BUSTEST_R" ); iPSLBuf[0] = 0; iPSLBuf[1] = 0; @@ -3777,6 +4196,7 @@ } else { + OstTraceFunctionExitExt( DMMCSTACK_EXECBUSTESTSM_EXIT, this, (TInt) KMMCErrNotSupported ); SMF_RETURN(KMMCErrNotSupported); } @@ -3784,7 +4204,9 @@ // // Validate the BUSTEST_R data with that issued by BUSTEST_W // + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM14, "EStGotBusTest_R" ); __KTRACE_OPT(KPBUS1, Kern::Printf("...got BUSTEST_R response [%02x:%02x] : err(%02x)", iPSLBuf[1], iPSLBuf[0], err)); + OstTraceExt3( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM15, "Got BUSTEST_R response [%02x:%02x]; err(%x)", (TUint) iPSLBuf[1], (TUint) iPSLBuf[0], (TUint) err ); TBool retry = EFalse; TBool is52MHzSupported = (iBusWidthAndClock & E52MhzMask) ? (TBool)ETrue : (TBool)EFalse; @@ -3845,6 +4267,7 @@ if(retry) { __KTRACE_OPT(KPBUS1, Kern::Printf("...BUSTEST Failed : Retry")); + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM16, "BUSTEST Failed : Retry" ); SMF_GOTOS(EstSendBusTest_W); } @@ -3866,10 +4289,12 @@ } __KTRACE_OPT(KPBUS1, Kern::Printf("...BUSTEST OK")); + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM17, "BUSTEST OK" ); DoSetBusWidth(EBusWidth1); SMF_STATE(EStExit) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECBUSTESTSM18, "EStExit" ); iConfig.SetMode( KMMCModeCardControlled ); SMF_END @@ -3885,6 +4310,7 @@ */ EXPORT_C void DMMCStack::GetInterface(TInterfaceId aInterfaceId, MInterface*& aInterfacePtr) { + OstTraceFunctionEntry1( DMMCSTACK_GETINTERFACE_ENTRY, this ); if (aInterfaceId == KInterfaceCancelSession) { DMMCSession* session = (DMMCSession*&) aInterfacePtr; @@ -3892,6 +4318,7 @@ UnlockStack(session); } + OstTraceFunctionExit1( DMMCSTACK_GETINTERFACE_EXIT, this ); } @@ -3911,17 +4338,21 @@ }; DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_GOIDLESM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_GOIDLESM2, "EStBegin" ); s.FillCommandDesc( ECmdGoIdleState, 0 ); iCxPollRetryCount = KMMCIdleCommandsAtRestart; SMF_STATE(EStIdleLoop) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_GOIDLESM3, "EStIdleLoop" ); SMF_INVOKES( ExecCommandSMST, EStIdleEndCheck ) SMF_STATE(EStIdleEndCheck) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_GOIDLESM4, "EStIdleEndCheck" ); if( --iCxPollRetryCount > 0 ) SMF_INVOKES( RetryGapTimerSMST, EStIdleLoop ) @@ -3965,9 +4396,11 @@ DMMCSession& s=Session(); DMMCPsu* psu=(DMMCPsu*)iSocket->iVcc; + OstTrace1( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM2, "EStBegin" ); iRCAPool.ReleaseUnlocked(); iCxPollRetryCount = 0; // Reset max number of poll attempts on card busy @@ -3975,6 +4408,7 @@ SMF_STATE(EStIdle) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM3, "EStIdle" ); // If this platform doesn't support an adjustable voltage PSU then there is // no point in interogating the card(s) present for their supported range if ( !(psu->VoltageSupported()&KMMCAdjustableOpVoltage) ) @@ -3993,6 +4427,7 @@ SMF_STATE(EStFullRangeDone) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM4, "EStFullRangeDone" ); if( err ) // If timeout { iConfig.RemoveMode( KMMCModeEnableTimeOutRetry ); // There is no point to do it second time @@ -4008,7 +4443,10 @@ { // One or more card is incompatible with our h/w if (iMaxCardsInStack<=1) - return( KMMCErrNotSupported ); // There can only be one card - we don't support it. + { + OstTraceFunctionExitExt( DMMCSTACK_ACQUIRESTACKSM_EXIT1, this, (TInt) KMMCErrNotSupported ); + return KMMCErrNotSupported; // There can only be one card - we don't support it. + } else // Force the default range iCurrentOpRange=(psu->VoltageSupported() & ~KMMCAdjustableOpVoltage); @@ -4026,6 +4464,7 @@ SMF_STATE(EStSetRangeLoop) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM5, "EStSetRangeLoop" ); // Repeat CMD1 this time setting Current Op Range s.Command().iArgument = iCurrentOpRange | KMMCOCRAccessModeHCS | KMMCOCRBusy; @@ -4035,6 +4474,7 @@ SMF_STATE(EStSetRangeBusyCheck) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM6, "EStSetRangeLoop" ); if( !err ) { // Bit31 of the OCR response is low if the cards are still powering up. @@ -4042,12 +4482,17 @@ const TBool isBusy = ((ocrResponse & KMMCOCRBusy) == 0); __KTRACE_OPT(KPBUS1,Kern::Printf("-mmc:upd:bsy%d", isBusy)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM7, "MMC busy status=%d", isBusy ); if (isBusy) { // Some cards are still busy powering up. Check if we should timeout if ( ++iCxPollRetryCount > iConfig.OpCondBusyTimeout() ) - return( KMMCErrBusTimeOut ); + { + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM8, "Peripheral bus timeout" ); + OstTraceFunctionExitExt( DMMCSTACK_ACQUIRESTACKSM_EXIT2, this, (TInt) KMMCErrBusTimeOut ); + return KMMCErrBusTimeOut; + } m.ResetTraps(); SMF_INVOKES( RetryGapTimerSMST, EStSetRangeLoop ) } @@ -4057,6 +4502,7 @@ if((ocrResponse & KMMCOCRAccessModeMask) == KMMCOCRAccessModeHCS) { __KTRACE_OPT(KPBUS1, Kern::Printf("Found large MMC card.")); + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM9, "Found large MMC card" ); iSpare[0] = KMMCardIsHighCapacity; } } @@ -4066,12 +4512,16 @@ // All cards are now ready and notified of the voltage range - ask ASSP to set it up psu->SetVoltage(iCurrentOpRange); if (psu->SetState(EPsuOnFull) != KErrNone) - return(KMMCErrHardware); + { + OstTraceFunctionExitExt( DMMCSTACK_ACQUIRESTACKSM_EXIT3, this, (TInt) KMMCErrHardware ); + return KMMCErrHardware; + } iCardArray->InitNewCardScan(); // Collect new cards, one by one SMF_STATE(EStCIDLoop) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM10, "EStCIDLoop" ); if ( iCardArray->NewCardCount() >= iMaxCardsInStack ) SMF_GOTOS( EStCIDsDone ) @@ -4082,6 +4532,7 @@ SMF_STATE(EStSendCIDIssued) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM11, "EStSendCIDIssued" ); if( !err ) { // A card responded with a CID. Create a new card entry in the card array @@ -4098,6 +4549,7 @@ SMF_STATE(EStCIDsDone) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM12, "EStCIDsDone" ); // All cards are initialised; get all their CSDs m.ResetTraps(); // We are no longer processing any errors @@ -4109,11 +4561,13 @@ SMF_STATE(EStCSDLoop) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM13, "EStCSDLoop" ); s.Command().iArgument = TMMCArgument(iCardArray->NewCardP(iCxCardCount)->iRCA); SMF_INVOKES( ExecCommandSMST, EStSendCSDDone ) SMF_STATE(EStSendCSDDone) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM14, "EStSendCSDDone" ); // Store the CSD in the new card entry TMMCard* cardP = iCardArray->NewCardP(iCxCardCount); cardP->iCSD = s.ResponseP(); @@ -4138,6 +4592,7 @@ SMF_STATE(EStMergeCards) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM15, "EStMergeCards" ); // Merging the old card info with newly acquired cards (we will ask each card for status // to determine whether it's really present later). if( SchedGetOnDFC() ) @@ -4149,10 +4604,14 @@ SMF_STATE(EStReMergeCards) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ACQUIRESTACKSM16, "EStReMergeCards" ); if( SchedGetOnDFC() ) SMF_WAIT if ( iCardArray->MergeCards(EFalse)!=KErrNone ) // There are more cards in the stack than we can handle - return(KMMCErrTooManyCards); + { + OstTraceFunctionExitExt( DMMCSTACK_ACQUIRESTACKSM_EXIT4, this, (TInt) KMMCErrTooManyCards ); + return KMMCErrTooManyCards; + } SMF_END } @@ -4176,8 +4635,10 @@ __KTRACE_OPT(KPBUS1,Kern::Printf(">MMC:SwLowVolt")); DMMCPsu* psu=(DMMCPsu*)iSocket->iVcc; + OstTrace1( TRACE_INTERNALS, DMMCSTACK_SWITCHTOLOWVOLTAGESM1, "Current PSU=0x%x", psu ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_SWITCHTOLOWVOLTAGESM2, "EStBegin" ); // turn power off DoPowerDown(); psu->SetState(EPsuOff); @@ -4185,15 +4646,20 @@ // turn power back on in low voltage mode psu->SetVoltage(iCurrentOpRange); if (psu->SetState(EPsuOnFull) != KErrNone) - return(KMMCErrHardware); + { + OstTraceFunctionExitExt( DMMCSTACK_SWITCHTOLOWVOLTAGESM_EXIT, this, (TInt) KMMCErrHardware ); + return KMMCErrHardware; + } SMF_INVOKES( DoPowerUpSMST, EStPoweredUp ) SMF_STATE(EStPoweredUp) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_SWITCHTOLOWVOLTAGESM3, "EStPoweredUp" ); // turn the clock back on SMF_INVOKES( InitClockOnSMST, EStClockOn ) // Feed init clock to the bus SMF_STATE(EStClockOn) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_SWITCHTOLOWVOLTAGESM4, "EStClockOn" ); // wait for 1ms and then 74 clock cycles // 74 clock cylces @ 400 Khz = 74 / 400,000 = 0.000185 secs = 0.185 ms // so total wait = 1.185 ms @@ -4217,9 +4683,11 @@ }; DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CIMCHECKSTACKSM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMCHECKSTACKSM2, "EStBegin" ); // This macro works naked and must not be preempted iConfig.RemoveMode( KMMCModeEnablePreemption | KMMCModeCardControlled ); s.iState |= KMMCSessStateInProgress; @@ -4228,6 +4696,7 @@ SMF_STATE(EStFinish) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMCHECKSTACKSM3, "EStFinish" ); s.iState &= ~KMMCSessStateInProgress; SMF_END @@ -4250,14 +4719,17 @@ }; DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CHECKSTACKSM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CHECKSTACKSM2, "EStBegin" ); iCxCardCount=-1; m.SetTraps( KMMCErrResponseTimeOut ); SMF_STATE(EStLoop) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CHECKSTACKSM3, "EStLoop" ); if ( ++iCxCardCount == (TInt)iMaxCardsInStack ) SMF_EXIT @@ -4270,7 +4742,9 @@ SMF_STATE(EStCardSelectedGotStatus) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CHECKSTACKSM4, "EStCardSelectedGotStatus" ); __KTRACE_OPT(KPBUS1, Kern::Printf("-mst:cssm:err%08x", err)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CHECKSTACKSM5, "err=0x%08x", err ); if(err) { @@ -4293,6 +4767,7 @@ SMF_INVOKES(ExecCommandSMST, EStCardDeselected) SMF_STATE(EStCardDeselected) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CHECKSTACKSM6, "EStCardDeselected" ); SMF_GOTOS( EStLoop ) SMF_END @@ -4325,9 +4800,11 @@ }; DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CHECKLOCKSTATUSSM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CHECKLOCKSTATUSSM2, "EStBegin" ); iCxCardCount=-1; m.SetTraps( KMMCErrResponseTimeOut ); iMinorBufLen = KMinMinorBufSize; @@ -4346,7 +4823,9 @@ SMF_STATE(EStCardSelectedGotStatus) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CHECKLOCKSTATUSSM3, "EStCardSelectedGotStatus" ); __KTRACE_OPT(KPBUS1, Kern::Printf("-mst:cssm:err%08x", err)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CHECKLOCKSTATUSSM4, "err=0x%08x", err ); if ( !err ) { TMMCard& card=*(iCardArray->CardP(iCxCardCount)); @@ -4400,7 +4879,9 @@ SMF_STATE(EStCheckLockStatus) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CHECKLOCKSTATUSSM5, "EStCheckLockStatus" ); __KTRACE_OPT(KPBUS1, Kern::Printf("-mst:cssm:err%08x", err)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CHECKLOCKSTATUSSM6, "err=0x%08x", err ); if ((err & KMMCErrUpdPswd) || ((err & KMMCErrStatus) && (s.LastStatus().Error() == KMMCStatErrLockUnlock))) @@ -4420,6 +4901,7 @@ SMF_INVOKES(ExecCommandSMST, EStCardDeselected) SMF_STATE(EStCardDeselected) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CHECKLOCKSTATUSSM7, "EStCardDeselected" ); SMF_GOTOS( EStLoop ) SMF_END @@ -4465,10 +4947,11 @@ }; #ifdef __EPOC32__ DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_POLLGAPTIMERSM1, "Current session=0x%x", &s ); #endif SMF_BEGIN - + OstTrace0( TRACE_INTERNALS, DMMCSTACK_POLLGAPTIMERSM2, "EStBegin" ); #ifdef __EPOC32__ s.SynchBlock( KMMCBlockOnPollTimer ); s.iPollTimer.OneShot(KMMCPollGapInMilliseconds,EFalse); @@ -4497,10 +4980,11 @@ }; #ifdef __EPOC32__ DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_RETRYGAPTIMERSM1, "Current session=0x%x", &s ); #endif SMF_BEGIN - + OstTrace0( TRACE_INTERNALS, DMMCSTACK_RETRYGAPTIMERSM2, "EStBegin" ); #ifdef __EPOC32__ s.SynchBlock( KMMCBlockOnRetryTimer ); s.iRetryTimer.OneShot(KMMCRetryGapInMilliseconds,EFalse); @@ -4530,9 +5014,11 @@ #ifdef __EPOC32__ DMMCSession &s = Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_PROGRAMTIMERSM1, "Current session=0x%x", &s ); #endif SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_PROGRAMTIMERSM2, "EStBegin" ); #ifdef __EPOC32__ s.SynchBlock(KMMCBlockOnPgmTimer); s.iProgramTimer.Cancel(); @@ -4562,9 +5048,11 @@ #ifdef __EPOC32__ DMMCSession &s = Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_LOWVOLTAGEPOWERUPTIMERSM1, "Current session=0x%x", &s ); #endif SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_LOWVOLTAGEPOWERUPTIMERSM2, "EStBegin" ); #ifdef __EPOC32__ s.SynchBlock(KMMCBlockOnRetryTimer); s.iRetryTimer.OneShot(KMMCLowVoltagePowerUpTimeoutInMilliseconds,EFalse); @@ -4616,9 +5104,11 @@ }; DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_EXECCOMMANDSM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECCOMMANDSM2, "EStBegin" ); if ( ( s.CardRCA() != 0 ) && ( (s.CardP()->iStatus.State()) == ECardStateSlp) ) { // Currently selected media is asleep, so it must be awoken @@ -4627,6 +5117,7 @@ SMF_STATE(EStExecCmd) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECCOMMANDSM3, "EStExecCmd" ); TMMCCommandDesc& cmd = s.Command(); // clearup some internally used flags cmd.iFlags &= ~(KMMCCmdFlagExecTopBusy|KMMCCmdFlagExecSelBusy); @@ -4634,6 +5125,7 @@ SMF_STATE(EStRetry) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECCOMMANDSM4, "EStRetry" ); TMMCCommandDesc& cmd = s.Command(); m.SetTraps( KMMCErrBasic & ~Command().iExecNotHandle); // Processing all trappable errors @@ -4668,15 +5160,17 @@ iCxDeselectCount=iDeselectsToIssue; SMF_STATE(EStDeselectLoop) - + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECCOMMANDSM5, "EStDeselectLoop" ); SMF_INVOKES(IssueCommandCheckResponseSMST,EStDeselectEndCheck) SMF_STATE(EStDeselectEndCheck) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECCOMMANDSM6, "EStDeselectEndCheck" ); // If we got an error and this is the last de-select then give up if (err && iCxDeselectCount == 1) { s.PopCommandStack(); + OstTraceFunctionExitExt( DMMCSTACK_EXECCOMMANDSM_EXIT1, this, (TInt) err ); SMF_RETURN(err) } @@ -4688,6 +5182,7 @@ SMF_STATE(EStAnalyseCommand) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECCOMMANDSM7, "EStAnalyseCommand" ); TMMCCommandDesc& cmd = s.Command(); // Check if its un-important whether the card is in transfer state (i.e // selected) or not for the command we are about to execute. Such @@ -4695,7 +5190,10 @@ // This state machine should never send CMD55 if (cmd.iCommand == ECmdAppCmd) + { + OstTraceFunctionExitExt( DMMCSTACK_EXECCOMMANDSM_EXIT2, this, (TInt) KMMCErrNotSupported ); SMF_RETURN (KMMCErrNotSupported) + } SMF_NEXTS( EStTestAppCommand ) if (cmd.iCommand == ECmdGoIdleState || cmd.iCommand == ECmdSelectCard || cmd.iCommand == ECmdSendStatus) @@ -4717,7 +5215,10 @@ SMF_GOTONEXTS // Get the RCA of the card if ( (targetRCA = s.CardRCA()) == 0 ) + { + OstTraceFunctionExitExt( DMMCSTACK_EXECCOMMANDSM_EXIT3, this, (TInt) KMMCErrNoCard ); SMF_RETURN( KMMCErrNoCard ) + } break; } default: @@ -4737,6 +5238,7 @@ SMF_STATE(EStSelectDone) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECCOMMANDSM8, "EStSelectDone" ); TMMCCommandDesc& cmd = s.Command(); if ( err ) @@ -4748,7 +5250,8 @@ s.PopCommandStack(); SMF_NEXTS(EStErrRecover) - return(err); // re-enter the next state with that error + OstTraceFunctionExitExt( DMMCSTACK_EXECCOMMANDSM_EXIT4, this, (TInt) err ); + return err; // re-enter the next state with that error } // Are we trying to recover from a top-level command returning busy (by de-selecting and re-selecting) @@ -4789,10 +5292,14 @@ SMF_STATE(EStBlockCountCmdIssued) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECCOMMANDSM9, "EStBlockCountCmdIssued" ); const TMMCStatus status(s.ResponseP()); s.PopCommandStack(); if (status.Error()) + { + OstTraceFunctionExitExt( DMMCSTACK_EXECCOMMANDSM_EXIT5, this, (TInt) KMMCErrStatus ); SMF_RETURN(KMMCErrStatus) + } if(err & KMMCErrNotSupported) { @@ -4802,6 +5309,7 @@ // Fall through... SMF_STATE(EStTestAppCommand) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECCOMMANDSM10, "EStTestAppCommand" ); TMMCCommandDesc& cmd = s.Command(); if (cmd.iSpec.iCommandClass != KMMCCmdClassApplication) SMF_GOTOS( EStIssueCommand ) @@ -4811,16 +5319,19 @@ SMF_INVOKES(IssueCommandCheckResponseSMST,EStIssueAppCommandDone) SMF_STATE(EStIssueAppCommandDone) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECCOMMANDSM11, "EStIssueAppCommandDone" ); s.PopCommandStack(); if ( err ) { SMF_NEXTS(EStErrRecover) - return(err); // re-enter the next state with that error + OstTraceFunctionExitExt( DMMCSTACK_EXECCOMMANDSM_EXIT6, this, (TInt) err ); + return err; // re-enter the next state with that error } SMF_STATE(EStIssueCommand) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECCOMMANDSM12, "EStIssueCommand" ); TMMCCommandDesc& cmd = s.Command(); // If its an addressed command (rather than a selected command), then // setup the argument with the RCA. (Commands requiring card to be @@ -4829,7 +5340,10 @@ { const TRCA targetRCA = s.CardRCA(); if ( targetRCA == 0 ) + { + OstTraceFunctionExitExt( DMMCSTACK_EXECCOMMANDSM_EXIT7, this, (TInt) KMMCErrNoCard ); SMF_RETURN( KMMCErrNoCard ) + } cmd.iArgument.SetRCA(targetRCA); } @@ -4838,12 +5352,14 @@ SMF_STATE(EStCommandIssued) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECCOMMANDSM13, "EStCommandIssued" ); // If command was succesful then we've finished. if (!err) SMF_EXIT SMF_STATE(EStErrRecover) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_EXECCOMMANDSM14, "EStErrRecover" ); TMMCCommandDesc& cmd = s.Command(); const TUint32 modes=iConfig.iModes; SMF_NEXTS(EStRetry) @@ -4863,12 +5379,16 @@ if (cmd.iTotalLength < cmd.BlockLength()) { DeselectsToIssue(1); - return(err); + OstTraceFunctionExitExt( DMMCSTACK_EXECCOMMANDSM_EXIT8, this, (TInt) err ); + return err; } } if ((modes & KMMCModeEnableRetries) == 0) - return( err ); + { + OstTraceFunctionExitExt( DMMCSTACK_EXECCOMMANDSM_EXIT9, this, (TInt) err ); + return err; + } const TUint32 toMask = (KMMCErrResponseTimeOut|KMMCErrDataTimeOut); const TUint32 crcMask = (KMMCErrResponseCRC|KMMCErrDataCRC|KMMCErrCommandCRC); @@ -4880,7 +5400,10 @@ DeselectsToIssue( 1 ); // enforce deselect before any retries if( (modes & KMMCModeCardControlled) == 0 ) - return( err ); // we wouldn't know what to select - no retries + { + OstTraceFunctionExitExt( DMMCSTACK_EXECCOMMANDSM_EXIT10, this, (TInt) err ); + return err; // we wouldn't know what to select - no retries + } } TUint32 gapEnabled = 0; @@ -4892,7 +5415,10 @@ if( (modes & KMMCModeEnableTimeOutRetry) == 0 || cmd.iTimeOutRetries > iConfig.iTimeOutRetries ) - return( err ); + { + OstTraceFunctionExitExt( DMMCSTACK_EXECCOMMANDSM_EXIT11, this, (TInt) err ); + return err; + } } if( err & crcMask ) @@ -4903,7 +5429,10 @@ if( (modes & KMMCModeEnableCRCRetry) == 0 || cmd.iCRCRetries > iConfig.iCRCRetries || ((err & KMMCErrDataCRC) != 0 && (modes & KMMCModeDataCRCRetry) == 0) ) - return( err ); + { + OstTraceFunctionExitExt( DMMCSTACK_EXECCOMMANDSM_EXIT12, this, (TInt) err ); + return err; + } } if( (modes & gapEnabled) == gapEnabled ) @@ -4935,7 +5464,10 @@ s.iGlobalRetries++; if( s.iGlobalRetries > KMMCMaxGlobalRetries ) - return( err ); + { + OstTraceFunctionExitExt( DMMCSTACK_EXECCOMMANDSM_EXIT13, this, (TInt) err ); + return err; + } s.SwapMe(); // To prevent the initialiser from aborting this session SMF_WAIT // Initialiser will take over here @@ -4952,7 +5484,10 @@ if( (modes & KMMCModeEnableBusyPoll) == 0 || ((modes & KMMCModeCardControlled) == 0 && cmd.iCommand != ECmdSelectCard) || cmd.iPollAttempts > iConfig.iPollAttempts ) - return( err ); + { + OstTraceFunctionExitExt( DMMCSTACK_EXECCOMMANDSM_EXIT14, this, (TInt) err ); + return err; + } if( modes & KMMCModeBusyPollGap ) { @@ -4971,7 +5506,8 @@ SMF_GOTONEXTS } - return( err ); + OstTraceFunctionExitExt( DMMCSTACK_EXECCOMMANDSM_EXIT15, this, (TInt) err ); + return err; SMF_END } @@ -4995,16 +5531,20 @@ DMMCSession& s=Session(); TMMCCommandDesc& cmd = Command(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_ISSUECOMMANDCHECKRESPONSESM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ISSUECOMMANDCHECKRESPONSESM2, "EStBegin" ); __KTRACE_OPT(KPBUS1,Kern::Printf(">MMC:Issue %d %x",TUint(cmd.iCommand),TUint(cmd.iArgument))); - + OstTraceExt2( TRACE_INTERNALS, DMMCSTACK_ISSUECOMMANDCHECKRESPONSESM3, "CMD%02d(0x%08x)", TUint(cmd.iCommand), TUint(cmd.iArgument) ); + // Stop the Controller from powering down the card due to bus inactivity iSocket->ResetInactivity(0); SMF_STATE(EStIssueCommand) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ISSUECOMMANDCHECKRESPONSESM4, "EStIssueCommand" ); // If command is directed at a specific card then save this command in card object if (iConfig.iModes & KMMCModeCardControlled) { @@ -5028,10 +5568,14 @@ SMF_STATE(EStCommandIssued) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_ISSUECOMMANDCHECKRESPONSESM5, "EStCommandIssued" ); #ifdef ENABLE_DETAILED_SD_COMMAND_TRACE cmd.Dump(s.ResponseP(), err); #endif + OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_MMCDEBUG, DMMCSTACK_ISSUECOMMANDCHECKRESPONSESM6, "MMC Protocol: CMD%02d(0x%08x)", (TInt) cmd.iCommand, (TUint) cmd.iArgument ); + OstTraceDefExt4( OST_TRACE_CATEGORY_RND, TRACE_MMCDEBUG, DMMCSTACK_ISSUECOMMANDCHECKRESPONSESM7, "MMC Protocol: RSP%d - LEN 0x%08x - ERR 0x%08x - STAT 0x%08x", (TUint) cmd.iSpec.iResponseType, (TUint) cmd.iSpec.iResponseLength, (TUint) err, (TUint) TMMC::BigEndian32(s.ResponseP()) ); + TMMCErr exitCode=err; // If we have just de-selected all cards in the stack, RCA(0) then ignore response timeout. if ( cmd.iCommand==ECmdSelectCard && TRCA(cmd.iArgument)==0 ) @@ -5047,6 +5591,7 @@ TMMCStatus status=s.ResponseP(); s.iLastStatus=status; __KTRACE_OPT(KPBUS1, Kern::Printf("mmc:ec:st=%08x", TUint32(status))); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_ISSUECOMMANDCHECKRESPONSESM8, "status=0x%08x", TUint32(status) ); if (iConfig.iModes & KMMCModeCardControlled) s.iCardP->iStatus=status; @@ -5062,6 +5607,7 @@ if (cmd.iCommand==ECmdSelectCard && exitCode==KMMCErrNone) iSelectedCard=TRCA(cmd.iArgument); + OstTraceFunctionExitExt( DMMCSTACK_ISSUECOMMANDCHECKRESPONSESM_EXIT, this, ( TInt ) exitCode ); SMF_RETURN(exitCode) SMF_END @@ -5089,8 +5635,10 @@ }; DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_NAKEDSESSIONSM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_NAKEDSESSIONSM2, "EStBegin" ); s.iState |= KMMCSessStateInProgress; if( (iConfig.iModes & KMMCModeCardControlled) != 0 ) @@ -5098,10 +5646,12 @@ SMF_BPOINT(EStAttached) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_NAKEDSESSIONSM3, "EStAttached" ); SMF_INVOKES( ExecCommandSMST, EStFinish ) SMF_STATE(EStFinish) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_NAKEDSESSIONSM4, "EStFinish" ); s.iState &= ~KMMCSessStateInProgress; SMF_END } @@ -5123,29 +5673,38 @@ }; DMMCSession& s=Session(); + OstTraceExt2( TRACE_INTERNALS, DMMCSTACK_CIMSETUPCARDSM1, "Current session=0x%x; Last status=0x%x", (TUint) &s, (TUint) s.iLastStatus ); __KTRACE_OPT(KPBUS1,Kern::Printf(">MMC:SetupCardSM %x",TUint(s.iLastStatus))); SMF_BEGIN + + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMSETUPCARDSM2, "EStBegin" ); s.iState |= KMMCSessStateInProgress; SMF_INVOKES( AttachCardSMST, EStAttached ) // attachment is mandatory here SMF_BPOINT(EStAttached) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMSETUPCARDSM3, "EStAttached" ); s.FillCommandDesc( ECmdSelectCard, 0 ); SMF_INVOKES( ExecCommandSMST, EStSelected ) SMF_STATE(EStSelected) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMSETUPCARDSM4, "EStSelected" ); if( !s.iCardP->IsReady() ) - return( KMMCErrNoCard ); + { + OstTraceFunctionExitExt( DMMCSTACK_CIMSETUPCARDSM_EXIT, this, (TInt) KMMCErrNoCard ); + return KMMCErrNoCard; + } s.FillCommandDesc( ECmdSendCSD, Command().iArgument ); // NB: the card will be deselected to execute this command SMF_INVOKES( ExecCommandSMST, EStGotCSD ) SMF_STATE(EStGotCSD) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMSETUPCARDSM5, "EStGotCSD" ); s.iCardP->iCSD = s.ResponseP(); s.iState &= ~KMMCSessStateInProgress; @@ -5188,17 +5747,22 @@ }; DMMCSession& s=Session(); + OstTraceExt2( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEBLOCKSSM1, "Current session=0x%x; Last status=0x%x", (TUint) &s, (TUint) s.iLastStatus ); __KTRACE_OPT(KPBUS1,Kern::Printf(">MMC:RWBlocksSM %x",TUint(s.iLastStatus))); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEBLOCKSSM2, "EStBegin" ); if(s.iSessionID == ECIMWriteBlock || s.iSessionID == ECIMWriteMBlock) { // Check that the card supports class 4 (Write) commands const TUint ccc = s.iCardP->CSD().CCC(); if(!(ccc & KMMCCmdClassBlockWrite)) - return( KMMCErrNotSupported ); + { + OstTraceFunctionExitExt( DMMCSTACK_CIMREADWRITEBLOCKSSM_EXIT1, this, (TInt) KMMCErrNotSupported ); + return KMMCErrNotSupported; + } } s.iState |= KMMCSessStateInProgress; @@ -5206,6 +5770,7 @@ SMF_STATE(EStRestart) // NB: ErrBypass is not processed here + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEBLOCKSSM3, "EStRestart" ); SMF_CALLMEWR(EStRestart) // Create a recursive call entry to recover from the errors trapped m.SetTraps(KMMCErrStatus); if (s.Command().iSpec.iCommandClass!=KMMCCmdClassApplication || s.Command().iCommand==ECmdAppCmd) @@ -5216,11 +5781,15 @@ SMF_BPOINT(EStAttached) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEBLOCKSSM4, "EStAttached" ); TMMCCommandDesc& cmd = s.Command(); const TUint32 blockLength = cmd.BlockLength(); if(blockLength == 0) + { + OstTraceFunctionExitExt( DMMCSTACK_CIMREADWRITEBLOCKSSM_EXIT2, this, (TInt) KMMCErrArgument ); return KMMCErrArgument; + } if(s.iSessionID == ECIMReadBlock || s.iSessionID == ECIMWriteBlock || @@ -5231,6 +5800,7 @@ if(!cmd.AdjustForBlockOrByteAccess(s)) { // unable to convert command arguments to suit the underlying block/byte access mode + OstTraceFunctionExitExt( DMMCSTACK_CIMREADWRITEBLOCKSSM_EXIT3, this, (TInt) KMMCErrArgument ); return KMMCErrArgument; } } @@ -5248,14 +5818,19 @@ SMF_STATE(EStLength1) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEBLOCKSSM5, "EStAttached" ); const TMMCStatus status(s.ResponseP()); s.PopCommandStack(); if (status.Error()) + { + OstTraceFunctionExitExt( DMMCSTACK_CIMREADWRITEBLOCKSSM_EXIT4, this, (TInt) KMMCErrStatus ); SMF_RETURN(KMMCErrStatus) + } s.iCardP->iSetBlockLen = s.Command().BlockLength(); SMF_STATE(EStLengthSet) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEBLOCKSSM6, "EStLengthSet" ); TMMCCommandDesc& cmd = s.Command(); TUint opType = 0; const TUint kTypeWrite = KBit0; @@ -5316,6 +5891,8 @@ // if(s.iCardP->CSD().SpecVers() >= 3) { + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEBLOCKSSM7, "CMD12 (STOP_TRANSMISSION) not used" ); + cmd.iSpec.iUseStopTransmission = EFalse; SMF_NEXTS(EStIssueBlockCount) } @@ -5329,6 +5906,7 @@ SMF_GOTONEXTS SMF_STATE(EStIssueBlockCount) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEBLOCKSSM8, "EStIssueBlockCount" ); // // Issues SET_BLOCK_COUNT (CMD23) for MB R/W data transfers. // This is only issued if MMC version >= 3.1 and the PSL @@ -5352,10 +5930,14 @@ SMF_STATE(EStBlockCountCmdIssued) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEBLOCKSSM9, "EStBlockCountCmdIssued" ); const TMMCStatus status(s.ResponseP()); s.PopCommandStack(); if (status.Error()) + { + OstTraceFunctionExitExt( DMMCSTACK_CIMREADWRITEBLOCKSSM_EXIT5, this, (TInt) KMMCErrStatus ); SMF_RETURN(KMMCErrStatus) + } if(err & KMMCErrNotSupported) { @@ -5367,13 +5949,18 @@ SMF_STATE(EStAppCmdIssued) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEBLOCKSSM10, "EStAppCmdIssued" ); const TMMCStatus status(s.ResponseP()); s.PopCommandStack(); if (status.Error()) + { + OstTraceFunctionExitExt( DMMCSTACK_CIMREADWRITEBLOCKSSM_EXIT6, this, (TInt) KMMCErrStatus ); SMF_RETURN(KMMCErrStatus) + } SMF_BPOINT(EStBpoint1) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEBLOCKSSM11, "EStBpoint1" ); // NB We need to trap KMMCErrStatus errors, because if one occurs, // we still need to wait to exit PRG/RCV/DATA state m.SetTraps(KMMCErrStatus); @@ -5382,6 +5969,7 @@ SMF_STATE(EStIssued) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEBLOCKSSM12, "EStIssued" ); // check state of card after data transfer with CMD13. if (s.Command().Direction() != 0) @@ -5392,6 +5980,8 @@ SMF_GOTOS(EStRWFinish); SMF_STATE(EStWaitFinish) + + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEBLOCKSSM13, "EStWaitFinish" ); // Save the status and examine it after issuing CMD13... // NB We don't know where in the command stack the last response is stored (e.g. there may // have bee a Deselect/Select issued), but we do know last response is stored in iLastStatus @@ -5402,6 +5992,7 @@ SMF_INVOKES(ExecCommandSMST, EStWaitFinish1) SMF_STATE(EStWaitFinish1) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEBLOCKSSM14, "EStWaitFinish1" ); const TMMCStatus status(s.ResponseP()); s.PopCommandStack(); @@ -5414,19 +6005,28 @@ SMF_INVOKES(ProgramTimerSMST, EStWaitFinish); } if (status.Error()) + { + OstTraceFunctionExitExt( DMMCSTACK_CIMREADWRITEBLOCKSSM_EXIT7, this, (TInt) KMMCErrStatus ); SMF_RETURN(KMMCErrStatus) + } #endif // Fall through if CURRENT_STATE is not PGM or DATA SMF_STATE(EStRWFinish) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEBLOCKSSM15, "EStRWFinish" ); if (TMMCStatus(s.ResponseP()).Error() != 0) + { + OstTraceFunctionExitExt( DMMCSTACK_CIMREADWRITEBLOCKSSM_EXIT8, this, (TInt) KMMCErrStatus ); SMF_RETURN(KMMCErrStatus); + } s.iState &= ~KMMCSessStateInProgress; // skip over recursive entry or throw error and catch in CIMLockUnlockSM() - return (s.Command().iCommand == ECmdLockUnlock) ? KMMCErrUpdPswd : KMMCErrBypass; + TMMCErr ret = (s.Command().iCommand == ECmdLockUnlock) ? KMMCErrUpdPswd : KMMCErrBypass; + OstTraceFunctionExitExt( DMMCSTACK_CIMREADWRITEBLOCKSSM_EXIT9, this, (TInt) ret ); + return ret; SMF_END } @@ -5453,21 +6053,28 @@ }; DMMCSession& s=Session(); + OstTraceExt2( TRACE_INTERNALS, DMMCSTACK_CIMERASESM1, "Current session=0x%x; Last status=0x%x", (TUint) &s, (TUint) s.iLastStatus ); + __KTRACE_OPT(KPBUS1,Kern::Printf(">MMC:EraseSM %x",TUint(s.iLastStatus))); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMERASESM2, "EStBegin" ); // Check that the card supports class 4 (Write) commands const TUint ccc = s.iCardP->CSD().CCC(); if(!(ccc & KMMCCmdClassErase)) - return( KMMCErrNotSupported ); + { + OstTraceFunctionExitExt( DMMCSTACK_CIMERASESM_EXIT1, this, (TInt) KMMCErrNotSupported ); + return KMMCErrNotSupported; + } s.iState |= KMMCSessStateInProgress; m.SetTraps( KMMCErrInitContext ); SMF_STATE(EStRestart) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMERASESM3, "EStRestart" ); SMF_CALLMEWR(EStRestart) // Create a recursive call entry to recover from Init s.ResetCommandStack(); @@ -5475,23 +6082,32 @@ SMF_BPOINT(EStAttached) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMERASESM4, "EStAttached" ); TMMCCommandDesc& cmd = s.Command(); if(cmd.iTotalLength == 0) - return( KMMCErrArgument ); + { + OstTraceFunctionExitExt( DMMCSTACK_CIMERASESM_EXIT2, this, (TInt) KMMCErrArgument ); + return KMMCErrArgument; + } switch( s.iSessionID ) { case ECIMEraseSector: + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMERASESM5, "ECIMEraseSector" ); TMMCEraseInfo eraseInfo; s.iCardP->GetEraseInfo(eraseInfo); cmd.iBlockLength = eraseInfo.iMinEraseSectorSize; cmd.iCommand = ECmdTagSectorStart; break; case ECIMEraseGroup: + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMERASESM6, "ECIMEraseGroup" ); cmd.iBlockLength = s.iCardP->iCSD.EraseGroupSize(); if(cmd.iBlockLength == 0 || cmd.iTotalLength % cmd.iBlockLength != 0) + { + OstTraceFunctionExitExt( DMMCSTACK_CIMERASESM_EXIT3, this, (TInt) KMMCErrArgument ); return KMMCErrArgument; + } cmd.iCommand = ECmdTagEraseGroupStart; break; default: @@ -5499,7 +6115,10 @@ } if(!cmd.AdjustForBlockOrByteAccess(s)) + { + OstTraceFunctionExitExt( DMMCSTACK_CIMERASESM_EXIT4, this, (TInt) KMMCErrArgument ); return KMMCErrArgument; + } iConfig.RemoveMode( KMMCModeEnablePreemption ); // erase sequence must not be pre-empted @@ -5510,6 +6129,7 @@ SMF_STATE(EStStartTagged) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMERASESM7, "EStStartTagged" ); const TMMCCommandDesc& cmd = s.Command(); TMMCCommandEnum command; @@ -5539,6 +6159,7 @@ SMF_STATE(EStEndTagged) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMERASESM8, "EStEndTagged" ); // Increase the inactivity timeout as an erase operation can potentially take a long time // At the moment this is a somewhat arbitrary 30 seconds. This could be calculated more accurately // using TAAC,NSAC, R2W_FACTOR etc. but that seems to yield very large values (?) @@ -5549,20 +6170,26 @@ SMF_INVOKES( ExecCommandSMST, EStErased ) SMF_STATE(EStErased) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMERASESM9, "EStErased" ); m.SetTraps( KMMCErrInitContext ); iBody->RestoreInactivityTimeout(); if (err != KMMCErrNone) + { + OstTraceFunctionExitExt( DMMCSTACK_CIMERASESM_EXIT5, this, (TInt) err ); SMF_RETURN(err); + } SMF_STATE(EStWaitFinish) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMERASESM10, "EStWaitFinish" ); s.PushCommandStack(); s.FillCommandDesc(ECmdSendStatus, 0); SMF_INVOKES(ExecCommandSMST, EStWaitFinish1) SMF_STATE(EStWaitFinish1) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMERASESM11, "EStWaitFinish1" ); const TMMCStatus st(s.ResponseP()); s.PopCommandStack(); @@ -5579,8 +6206,10 @@ // Fall through if CURRENT_STATE is not PGM or DATA SMF_STATE(EStEraseFinish) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMERASESM12, "EStEraseFinish" ); s.iState &= ~KMMCSessStateInProgress; - return( KMMCErrBypass ); // to skip over the recursive entry + OstTraceFunctionExitExt( DMMCSTACK_CIMERASESM_EXIT6, this, (TInt) KMMCErrBypass ); + return KMMCErrBypass; // to skip over the recursive entry SMF_END } @@ -5603,10 +6232,13 @@ DMMCSession& s=Session(); TMMCCommandDesc& cmd = s.Command(); + OstTraceExt2( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEIOSM1, "Current session=0x%x; Last status=0x%x", (TUint) &s, (TUint) s.iLastStatus ); + __KTRACE_OPT(KPBUS1,Kern::Printf(">MMC:IOSM %x",TUint(s.iLastStatus))); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEIOSM2, "EStBegin" ); s.iState |= KMMCSessStateInProgress; TUint argument = (TUint(cmd.iArgument)&0x7F) << 8; // shift reg addr into a proper position @@ -5628,11 +6260,13 @@ SMF_STATE(EStReadIO) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEIOSM3, "EStReadIO" ); *(cmd.iDataMemoryP)++ = s.ResponseP()[3]; cmd.iTotalLength--; SMF_BPOINT(EStIOLoop) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMREADWRITEIOSM4, "EStIOLoop" ); s.iBytesTransferred++; if( cmd.iTotalLength == 0 ) @@ -5676,15 +6310,19 @@ DMMCSession& s=Session(); TMMCCommandDesc& cmd = Command(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CIMLOCKUNLOCKSM1, "Current session=0x%x", &s ); __KTRACE_OPT(KPBUS1, Kern::Printf("mmc:clusm")); SMF_BEGIN + + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMLOCKUNLOCKSM2, "EStBegin" ); m.SetTraps(KMMCErrStatus | KMMCErrUpdPswd); cmd.iUnlockRetries = 0; // attempt counter iCMD42CmdByte = cmd.iDataMemoryP[0]; SMF_STATE(EStRetry) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMLOCKUNLOCKSM3, "EStRetry" ); __KTRACE_OPT(KPBUS1, Kern::Printf("mmc:clusm:%x/%x", cmd.iUnlockRetries, (iSessionP == &iAutoUnlockSession) ? KMMCMaxAutoUnlockRetries : iConfig.iUnlockRetries)); if (iCMD42CmdByte == KMMCLockUnlockErase) @@ -5700,6 +6338,7 @@ SMF_INVOKES(CIMReadWriteBlocksSMST, EStTestR1); SMF_STATE(EStTestR1) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMLOCKUNLOCKSM4, "EStTestR1" ); if (iCMD42CmdByte == KMMCLockUnlockErase) { m.SetTraps(KMMCErrStatus | KMMCErrUpdPswd); @@ -5713,6 +6352,7 @@ __KTRACE_OPT(KPBUS1, Kern::Printf("mmc:clusm:EStTestR1 [err: %08x, st:%08x] : RETRY [%d]", err, (TInt)s.LastStatus(), cmd0.iUnlockRetries)); + OstTraceExt3( TRACE_INTERNALS, DMMCSTACK_CIMLOCKUNLOCKSM5, "err=%08x; Last status=%d; Unlock retries=%d", (TUint) err, (TInt) s.LastStatus(), (TUint) cmd0.iUnlockRetries ); const TInt KMaxRetries = (iSessionP == &iAutoUnlockSession) ? KMMCMaxAutoUnlockRetries : iConfig.iUnlockRetries; @@ -5723,11 +6363,13 @@ && ++cmd0.iUnlockRetries < KMaxRetries )) { __KTRACE_OPT(KPBUS1, Kern::Printf("mmc:clusm:abt")); - + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMLOCKUNLOCKSM6, "LockUnlock abort" ); + OstTraceFunctionExitExt( DMMCSTACK_CIMLOCKUNLOCKSM_EXIT, this, (TInt) err ); SMF_RETURN(err); } __KTRACE_OPT(KPBUS1, Kern::Printf("mmc:clusm:retry")); + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMLOCKUNLOCKSM7, "LockUnlock retry" ); #ifdef __EPOC32__ s.SynchBlock(KMMCBlockOnRetryTimer); @@ -5753,6 +6395,7 @@ } else if (err != KMMCErrNone) { + OstTraceFunctionExitExt( DMMCSTACK_CIMLOCKUNLOCKSM_EXIT2, this, (TInt) err ); SMF_RETURN(err); } @@ -5780,15 +6423,18 @@ __KTRACE_OPT(KPBUS1,Kern::Printf(">MMC:CIMAutoUnlockSM")); DMMCSession& s=Session(); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CIMAUTOUNLOCKSM1, "Current session=0x%x", &s ); SMF_BEGIN + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMAUTOUNLOCKSM2, "EStBegin" ); iAutoUnlockIndex = -1; m.SetTraps(KMMCErrAll); // Trap (and ignore) all errors during auto-unlock SMF_STATE(EStNextIndex) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMAUTOUNLOCKSM3, "EStNextIndex" ); if(err) { iSocket->PasswordControlEnd(&Session(), err); @@ -5832,6 +6478,8 @@ // TMMCard &cd = *(iCardArray->CardP(iAutoUnlockIndex++)); + OstTrace1( TRACE_INTERNALS, DMMCSTACK_CIMAUTOUNLOCKSM4, "Attempting to unlock card %d", cd.Number() ); + s.SetCard(&cd); const TInt kPWD_LEN = mp->iPWD.Length(); @@ -5849,6 +6497,7 @@ SMF_STATE(EStInitStackAfterUnlock) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMAUTOUNLOCKSM5, "EStInitStackAfterUnlock" ); // // We've attempted to unlock all cards (successfully or not) // - Now perform second-stage initialisation that can only be performed @@ -5860,6 +6509,7 @@ SMF_INVOKES( InitStackAfterUnlockSMST, EStDone ) SMF_STATE(EStDone) + OstTrace0( TRACE_INTERNALS, DMMCSTACK_CIMAUTOUNLOCKSM6, "EStDone" ); SMF_END } @@ -6016,6 +6666,7 @@ * @return A pointer to the new session */ { + OstTraceFunctionEntry1( DMMCSTACK_ALLOCSESSION_ENTRY, this ); return new DMMCSession(aCallBack); } @@ -6027,11 +6678,13 @@ */ void DMMCStack::DoSetBusWidth(TUint32 aBusWidth) { + OstTraceFunctionEntryExt( DMMCSTACK_DOSETBUSWIDTH_ENTRY, this ); if (iBody->iCurrentSelectedBusWidth != aBusWidth) { iBody->iCurrentSelectedBusWidth = aBusWidth; SetBusWidth(aBusWidth); } + OstTraceFunctionExit1( DMMCSTACK_DOSETBUSWIDTH_EXIT, this ); } /** @@ -6044,6 +6697,7 @@ */ void DMMCStack::DoSetClock(TUint32 aClock) { + OstTraceFunctionEntryExt( DMMCSTACK_DOSETCLOCK_ENTRY, this ); iConfig.iBusConfig.iBusClock = aClock; if (iPoweredUp&&(iBody->iCurrentSelectedClock != aClock)) @@ -6051,13 +6705,17 @@ iBody->iCurrentSelectedClock = aClock; SetBusConfigDefaults(iConfig.iBusConfig, aClock); } + OstTraceFunctionExit1( DMMCSTACK_DOSETCLOCK_EXIT, this ); } TUint DMMCStack::MaxTranSpeedInKilohertz(const TMMCard& aCard) const { + OstTraceFunctionEntry1( DMMCSTACK_MAXTRANSPEEDINKILOHERTZ_ENTRY, this ); TUint32 highSpeedClock = aCard.HighSpeedClock(); - return highSpeedClock ? highSpeedClock : aCard.MaxTranSpeedInKilohertz(); + TUint ret = highSpeedClock ? highSpeedClock : aCard.MaxTranSpeedInKilohertz(); + OstTraceFunctionExitExt( DMMCSTACK_MAXTRANSPEEDINKILOHERTZ_EXIT, this, ret ); + return ret; } @@ -6077,6 +6735,7 @@ * @return the bus width encoded as a TBusWidth */ { + OstTraceFunctionEntryExt( DMMCSTACK_BUSWIDTHENCODING_ENTRY, this ); TBusWidth busWidth = EBusWidth1; switch(aBusWidth) @@ -6095,6 +6754,7 @@ DMMCSocket::Panic(DMMCSocket::EMMCBadBusWidth); } + OstTraceFunctionExitExt( DMMCSTACK_BUSWIDTHENCODING_EXIT, this, ( TUint )&( busWidth ) ); return busWidth; } @@ -6110,6 +6770,7 @@ :DPBusSocket(aSocketNumber), iPasswordStore(aPasswordStore) { + OstTraceFunctionEntryExt( DMMCSOCKET_DMMCSOCKET_ENTRY, this ); } TInt DMMCSocket::TotalSupportedCards() @@ -6118,6 +6779,8 @@ * @return The number of MMC slots supported by the socket */ { + OstTraceFunctionEntry1( DMMCSOCKET_TOTALSUPPORTEDCARDS_ENTRY, this ); + OstTraceFunctionExitExt( DMMCSOCKET_TOTALSUPPORTEDCARDS_EXIT, this, iMachineInfo.iTotalSockets ); return iMachineInfo.iTotalSockets; } @@ -6150,6 +6813,7 @@ * @return KErrNone on success */ { + OstTraceExt3(TRACE_FLOW, DMMCSOCKET_PREPARESTORE_ENTRY, "DMMCSocket::PrepareStore;aBus=%d;aFunc=%d;this=%x", aBus, aFunc, (TUint) this); TInt r = 0; TMMCard *card=iStack->CardP(aBus); @@ -6196,6 +6860,7 @@ break; } + OstTraceFunctionExitExt( DMMCSOCKET_PREPARESTORE_EXIT, this, r ); return r; } @@ -6218,6 +6883,7 @@ * See PasswordControlEnd() for recovery policy. */ { + OstTraceFunctionEntry1( DMMCSOCKET_PASSWORDCONTROLSTART_ENTRY, this ); TInt r = KErrNone; // error code TBool changed = EFalse; // compress store if changed @@ -6266,7 +6932,10 @@ { TMediaPassword mp; // empty, to indicate !s if ((r = iPasswordStore->InsertMapping(aCID, mp, TMapping::EStPending)) != KErrNone) + { + OstTraceFunctionExitExt( DMMCSOCKET_PASSWORDCONTROLSTART_EXIT1, this, r ); return r; + } changed = ETrue; } @@ -6275,6 +6944,7 @@ if (changed) iPasswordStore->iStore->Compress(); + OstTraceFunctionExitExt( DMMCSOCKET_PASSWORDCONTROLSTART_EXIT2, this, r ); return r; } @@ -6304,6 +6974,7 @@ * See PasswordControlStart() for details of how store set up. */ { + OstTraceFunctionEntryExt( DMMCSOCKET_PASSWORDCONTROLEND_ENTRY, this ); // autounlock is a special case because the PasswordControlStart() will // not have been called (the CID is not known in ks context.) The mapping // for this specific card is removed on failure, because it is the current @@ -6354,6 +7025,7 @@ TInt psn = iPasswordStore->iStore->Find(mp, iPasswordStore->iIdentityRelation); if (psn == KErrNotFound) { + OstTraceFunctionExit1( DMMCSOCKET_PASSWORDCONTROLEND_EXIT1, this ); return; } else @@ -6386,6 +7058,7 @@ } } // else (f) } // else if (aSessP == &iStack->iAutoUnlockSession) + OstTraceFunctionExit1( DMMCSOCKET_PASSWORDCONTROLEND_EXIT2, this ); } @@ -6395,6 +7068,7 @@ */ : iIdentityRelation(TMMCPasswordStore::CompareCID) { + OstTraceFunctionEntry1( TMMCPASSWORDSTORE_TMMCPASSWORDSTORE_ENTRY, this ); } TInt TMMCPasswordStore::Init() @@ -6403,10 +7077,15 @@ * @return KErrNone if successful, standard error code otherwise. */ { + OstTraceFunctionEntry1( TMMCPASSWORDSTORE_INIT_ENTRY, this ); // We don't have a destructor yet as this object lasts forever iStore = new RArray<TMapping>(4, _FOFF(TMapping, iCID)); if(!iStore) + { + OstTraceFunctionExitExt( TMMCPASSWORDSTORE_INIT_EXIT1, this, KErrNoMemory ); return KErrNoMemory; + } + OstTraceFunctionExitExt( TMMCPASSWORDSTORE_INIT_EXIT2, this, KErrNone ); return KErrNone; } @@ -6417,8 +7096,11 @@ * or if cannot tell (because no valid mapping.) */ { + OstTraceFunctionEntry1( TMMCPASSWORDSTORE_ISMAPPINGINCORRECT_ENTRY, this ); TMapping* pmp = FindMappingInStore(aCID); - return (pmp != 0 && pmp->iState == TMapping::EStValid && pmp->iPWD.Compare(aPWD) != 0); + TBool ret = pmp != 0 && pmp->iState == TMapping::EStValid && pmp->iPWD.Compare(aPWD) != 0; + OstTraceFunctionExitExt( TMMCPASSWORDSTORE_ISMAPPINGINCORRECT_EXIT, this, ret ); + return ret; } TMapping *TMMCPasswordStore::FindMappingInStore(const TCID &aCID) @@ -6426,6 +7108,7 @@ * return pointer to aCID mapping in store or NULL if not found */ { + OstTraceFunctionEntry1( TMMCPASSWORDSTORE_FINDMAPPINGINSTORE_ENTRY, this ); TMapping *pmp = NULL; TMapping mp; // 8 + 16 + 8 + 16 + 4 bytes mp.iCID.SetLength(KMMCCIDLength); @@ -6436,6 +7119,7 @@ { pmp = &(*iStore)[psn]; } + OstTraceFunctionExitExt( TMMCPASSWORDSTORE_FINDMAPPINGINSTORE_EXIT, this, ( TUint )( pmp ) ); return pmp; } @@ -6449,6 +7133,7 @@ * is a binary search, otherwise it may involve kernel heap allocation. */ { + OstTraceFunctionEntry1( TMMCPASSWORDSTORE_INSERTMAPPING_ENTRY, this ); TInt r = KErrNone; TMapping mpN; mpN.iCID.SetLength(KMMCCIDLength); @@ -6469,6 +7154,7 @@ r = KErrNone; } + OstTraceFunctionExitExt( TMMCPASSWORDSTORE_INSERTMAPPING_EXIT, this, r ); return r; } @@ -6479,6 +7165,7 @@ * of the password store */ { + OstTraceFunctionEntry1( TMMCPASSWORDSTORE_PASSWORDSTORELENGTHINBYTES_ENTRY, this ); TInt sz = 0; for (TInt i = 0; i < iStore->Count(); ++i) @@ -6488,6 +7175,7 @@ sz += KMMCCIDLength + sizeof(TInt32) + mp.iPWD.Length(); } + OstTraceFunctionExitExt( TMMCPASSWORDSTORE_PASSWORDSTORELENGTHINBYTES_EXIT, this, sz ); return sz; } @@ -6500,6 +7188,7 @@ * is returned and aBuf is not mutated. */ { + OstTraceFunctionEntry1( TMMCPASSWORDSTORE_READPASSWORDDATA_ENTRY, this ); TInt r=KErrNone; // error code if (PasswordStoreLengthInBytes() > aBuf.MaxLength()) @@ -6526,6 +7215,7 @@ r = KErrNone; } + OstTraceFunctionExitExt( TMMCPASSWORDSTORE_READPASSWORDDATA_EXIT, this, r ); return r; } @@ -6536,6 +7226,7 @@ * replace current store with data from persistent representation in aBuf. */ { + OstTraceFunctionEntry1( TMMCPASSWORDSTORE_WRITEPASSWORDDATA_ENTRY, this ); // should only be called at boot up, but remove chance of duplicate entries iStore->Reset(); @@ -6565,7 +7256,10 @@ } if (corrupt) + { + OstTraceFunctionExitExt( TMMCPASSWORDSTORE_WRITEPASSWORDDATA_EXIT1, this, KErrCorrupt ); return KErrCorrupt; + } // Build the store from the entries in the buffer. TInt r = KErrNone; // error code @@ -6589,6 +7283,7 @@ if (r != KErrNone) iStore->Reset(); + OstTraceFunctionExitExt( TMMCPASSWORDSTORE_WRITEPASSWORDDATA_EXIT2, this, r ); return r; } @@ -6597,6 +7292,7 @@ * CID Comparason Functions for RArray::Find */ { + OstTraceFunctionEntry0( TMMCPASSWORDSTORE_COMPARECID_ENTRY ); return(aLeft.iCID == aRight.iCID); } @@ -6605,7 +7301,9 @@ * Initiates a power up sequence on the stack */ { + OstTraceFunctionEntry1( DMMCSOCKET_INITIATEPOWERUPSEQUENCE_ENTRY, this ); iStack->PowerUpStack(); + OstTraceFunctionExit1( DMMCSOCKET_INITIATEPOWERUPSEQUENCE_EXIT, this ); } TBool DMMCSocket::CardIsPresent() @@ -6614,7 +7312,10 @@ * @return ETrue if a card is present, EFalse otherwise */ { - return(iStack->HasCardsPresent()); + OstTraceFunctionEntry1( DMMCSOCKET_CARDISPRESENT_ENTRY, this ); + TInt r = iStack->HasCardsPresent(); + OstTraceFunctionExitExt( DMMCSOCKET_CARDISPRESENT_EXIT, this, r ); + return r; } void DMMCSocket::AdjustPartialRead(const TMMCard* aCard, TUint32 aStart, TUint32 aEnd, TUint32* aPhysStart, TUint32* aPhysEnd) const @@ -6630,7 +7331,9 @@ * @param aPhysEnd The adjusted end position */ { + OstTraceFunctionEntryExt( DMMCSOCKET_ADJUSTPARTIALREAD_ENTRY, this ); iStack->AdjustPartialRead(aCard, aStart, aEnd, aPhysStart, aPhysEnd); + OstTraceFunctionExit1( DMMCSOCKET_ADJUSTPARTIALREAD_EXIT, this ); } void DMMCSocket::GetBufferInfo(TUint8** aMDBuf, TInt* aMDBufLen) @@ -6642,7 +7345,9 @@ * @param aMDBufLen The length of the allocated buffer */ { + OstTraceFunctionEntryExt( DMMCSOCKET_GETBUFFERINFO_ENTRY, this ); iStack->GetBufferInfo(aMDBuf, aMDBufLen); + OstTraceFunctionExit1( DMMCSOCKET_GETBUFFERINFO_EXIT, this ); } void DMMCSocket::Reset1() @@ -6653,6 +7358,7 @@ * this will occur immediately. */ { + OstTraceFunctionEntry1( DMMCSOCKET_RESET1_ENTRY, this ); if (iState == EPBusCardAbsent) { // Reset is result of card eject! @@ -6661,6 +7367,7 @@ iStack->PowerDownStack(); + OstTraceFunctionExit1( DMMCSOCKET_RESET1_EXIT, this ); } void DMMCSocket::Reset2() @@ -6679,6 +7386,7 @@ * @return KErrNotReady if no stack has been allocated, standard error code otherwise */ { + OstTraceFunctionEntry1( DMMCSOCKET_INIT_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf(">MMC:Init")); GetMachineInfo(); @@ -6686,16 +7394,26 @@ // We need to make sure the stack is initialised, // as DPBusSocket::Init() will initiate a power up sequence if(iStack == NULL) + { + OstTraceFunctionExitExt( DMMCSOCKET_INIT_EXIT1, this, KErrNotReady ); return KErrNotReady; + } TInt r = iStack->Init(); if (r!=KErrNone) + { + OstTraceFunctionExitExt( DMMCSOCKET_INIT_EXIT2, this, r ); return r; + } r = DPBusSocket::Init(); if (r!=KErrNone) + { + OstTraceFunctionExitExt( DMMCSOCKET_INIT_EXIT3, this, r ); return r; + } + OstTraceFunctionExitExt( DMMCSOCKET_INIT_EXIT4, this, KErrNone ); return KErrNone; } @@ -6705,6 +7423,7 @@ * @see TMMCMachineInfo */ { + OstTraceFunctionEntry1( DMMCSOCKET_GETMACHINEINFO_ENTRY, this ); // Get machine info from the stack iStack->MachineInfo(iMachineInfo); @@ -6713,7 +7432,10 @@ __KTRACE_OPT(KPBUS1, Kern::Printf(">GetMI : iTotalPrimarySupplies %u", iMachineInfo.iTotalPrimarySupplies)); __KTRACE_OPT(KPBUS1, Kern::Printf(">GetMI : iSPIMode %u", iMachineInfo.iSPIMode)); __KTRACE_OPT(KPBUS1, Kern::Printf(">GetMI : iBaseBusNumber %u", iMachineInfo.iBaseBusNumber)); - + OstTraceDefExt5( OST_TRACE_CATEGORY_RND, TRACE_MMCDEBUG, DMMCSOCKET_GETMACHINEINFO, "iTotalSockets=%d; iTotalMediaChanges=%d; iTotalPrimarySupplies=%d; iSPIMode=%d; iBaseBusNumber=%d", iMachineInfo.iTotalSockets, iMachineInfo.iTotalMediaChanges, iMachineInfo.iTotalPrimarySupplies, iMachineInfo.iSPIMode, iMachineInfo.iBaseBusNumber ); + + + OstTraceFunctionExit1( DMMCSOCKET_GETMACHINEINFO_EXIT, this ); } @@ -6725,7 +7447,7 @@ * @param aPanic The panic code */ { - + OstTraceFunctionEntry0( DMMCSOCKET_PANIC_ENTRY ); _LIT(KPncNm,"PBUS-MMC"); Kern::PanicCurrentThread(KPncNm,aPanic); } @@ -6738,8 +7460,10 @@ */ : DPBusPsuBase(aPsuNum, aMediaChangedNum) { + OstTraceFunctionEntryExt( DMMCPSU_DMMCPSU_ENTRY, this ); iVoltageSetting=0x00ffc000; // Default voltage range - 2.6V to 3.6V (OCR reg. format). + OstTraceFunctionExit1( DMMCPSU_DMMCPSU_EXIT, this ); } EXPORT_C TInt DMMCPsu::DoCreate() @@ -6763,6 +7487,7 @@ * @Param aPtr reference to DMMCPsu Object to be acted upon. */ { + OstTraceFunctionEntry0( DMMCPSU_SLEEPCHECK_ENTRY ); DMMCPsu& self = *static_cast<DMMCPsu*>(aPtr); if ( @@ -6773,6 +7498,7 @@ DMMCSocket* socket = static_cast<DMMCSocket*>(self.iSocket); socket->iStack->QSleepStack(); } + OstTraceFunctionExit0( DMMCPSU_SLEEPCHECK_EXIT ); } EXPORT_C DMMCMediaChange::DMMCMediaChange(TInt aMediaChangeNum) @@ -6781,7 +7507,9 @@ * @param aMediaChangeNum The media change number */ : DMediaChangeBase(aMediaChangeNum) - {} + { + OstTraceFunctionEntryExt( DMMCMEDIACHANGE_DMMCMEDIACHANGE_ENTRY, this ); + } EXPORT_C TInt DMMCMediaChange::Create() /** @@ -6792,6 +7520,9 @@ * @return Standard Symbian OS error code. */ { - return DMediaChangeBase::Create(); - } - + OstTraceFunctionEntry1( DMMCMEDIACHANGE_CREATE_ENTRY, this ); + TInt r = DMediaChangeBase::Create(); + OstTraceFunctionExitExt( DMMCMEDIACHANGE_CREATE_EXIT, this, r ); + return r; + } +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/drivers/pbus/mmc/traces/OstTraceDefinitions.h Tue Jan 26 13:13:38 2010 +0200 @@ -0,0 +1,21 @@ +// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: + +#ifndef __OSTTRACEDEFINITIONS_H__ +#define __OSTTRACEDEFINITIONS_H__ +// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler +// REMOVE BEFORE CHECK-IN TO VERSION CONTROL +//#define OST_TRACE_COMPILER_IN_USE +#include <OpenSystemTrace.h> +#endif
--- a/kernel/eka/drivers/pbus/pbusmedia.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/pbus/pbusmedia.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -16,17 +16,29 @@ // #include <drivers/pbusmedia.h> +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "locmedia_ost.h" +#ifdef __VC32__ +#pragma warning(disable: 4127) // disabling warning "conditional expression is constant" +#endif +#include "pbusmediaTraces.h" +#endif void mediaCallBack(TAny* aPtr, TInt aReason, TAny* a1, TAny* a2) { + OstTraceFunctionEntry0( MEDIACALLBACK_ENTRY ); DPBusPrimaryMedia* pM=(DPBusPrimaryMedia*)aPtr; __KTRACE_OPT(KLOCDRV,Kern::Printf("mediaCallBack media %d, reason %d, a1=0x%x, a2=0x%x",pM->iMediaId,aReason,a1,a2)); + OstTraceExt4( TRACE_INTERNALS, MEDIACALLBACK, "aPtr=0x%x; aReason=%d; a1=0x%x; a2=0x%x", ( TUint )( aPtr ), aReason, ( TUint )( a1 ), ( TUint )( a2 ) ); + switch (aReason) { case TPBusCallBack::EPBusStateChange: pM->PBusStateChange((TInt)a1,(TInt)a2); break; } + OstTraceFunctionExit0( MEDIACALLBACK_EXIT ); } /** @@ -38,6 +50,7 @@ DPBusPrimaryMedia::DPBusPrimaryMedia(DPBusSocket* aSocket) : iSocket(aSocket) { + OstTraceFunctionEntryExt( DPBUSPRIMARYMEDIA_DPBUSPRIMARYMEDIA_ENTRY, this ); } /** This function install a media call back for a removable media device. @@ -50,6 +63,8 @@ */ TInt DPBusPrimaryMedia::Create(TMediaDevice aDevice, TInt aMediaId, TInt aLastMediaId) { + OstTraceExt4(TRACE_FLOW, DPBUSPRIMARYMEDIA_CREATE_ENTRY ,"DPBusPrimaryMedia::Create;aDevice=%d;aMediaId=%d;aLastMediaId=%d;this=%x", (TInt) aDevice, aMediaId, aLastMediaId, (TUint) this); + // Permanently install a media call back if for a removable media device TInt r=KErrArgument; iPBusState=EPBusCardAbsent; @@ -67,6 +82,7 @@ iMsgQ.Receive(); } } + OstTraceFunctionExitExt( DPBUSPRIMARYMEDIA_CREATE_EXIT, this, r ); return r; } @@ -78,10 +94,13 @@ */ TInt DPBusPrimaryMedia::QuickCheckStatus() { + OstTraceFunctionEntry1( DPBUSPRIMARYMEDIA_QUICKCHECKSTATUS_ENTRY, this ); TInt r=KErrNone; if (iSocket && iSocket->State()==EPBusCardAbsent) r=KErrNotReady; __KTRACE_OPT(KLOCDRV,Kern::Printf("DPBusPrimaryMedia::QuickCheckStatus media %d returns %d",iMediaId,r)); + OstTraceExt2(TRACE_INTERNALS, DPBUSPRIMARYMEDIA_QUICKCHECKSTATUS, "iMediaId=%d; retval=%d",iMediaId,r); + OstTraceFunctionExit1( DPBUSPRIMARYMEDIA_QUICKCHECKSTATUS_EXIT, this ); return r; } @@ -94,6 +113,7 @@ */ TInt DPBusPrimaryMedia::ForceMediaChange(TInt aFlags) { + OstTraceFunctionEntryExt( DPBUSPRIMARYMEDIA_FORCEMEDIACHANGE_ENTRY, this ); if ((aFlags != KMediaRemountForceMediaChange) || (iPBusState == EPBusCardAbsent)) { TInt pbusState = iPBusState; @@ -107,10 +127,12 @@ iSocket->ChangeState(pbusState == EPBusCardAbsent ? EPBusCardAbsent : EPBusOff, KErrNotReady); + OstTraceFunctionExitExt( DPBUSPRIMARYMEDIA_FORCEMEDIACHANGE_EXIT1, this, KErrCompletion ); return KErrCompletion; } iSocket->ForceMediaChange(); + OstTraceFunctionExitExt( DPBUSPRIMARYMEDIA_FORCEMEDIACHANGE_EXIT2, this, KErrNone ); return KErrNone; } @@ -122,7 +144,10 @@ */ TInt DPBusPrimaryMedia::InitiatePowerUp() { - return iSocket->PowerUp(); + OstTraceFunctionEntry1( DPBUSPRIMARYMEDIA_INITIATEPOWERUP_ENTRY, this ); + TInt r = iSocket->PowerUp(); + OstTraceFunctionExitExt( DPBUSPRIMARYMEDIA_INITIATEPOWERUP_EXIT, this, r ); + return r; } /** @@ -133,7 +158,10 @@ */ TInt DPBusPrimaryMedia::DoInCritical() { - return iSocket->InCritical(); + OstTraceFunctionEntry1( DPBUSPRIMARYMEDIA_DOINCRITICAL_ENTRY, this ); + TInt r = iSocket->InCritical(); + OstTraceFunctionExitExt( DPBUSPRIMARYMEDIA_DOINCRITICAL_EXIT, this, r ); + return r; } /** @@ -144,7 +172,9 @@ */ void DPBusPrimaryMedia::DoEndInCritical() { + OstTraceFunctionEntry1( DPBUSPRIMARYMEDIA_DOENDINCRITICAL_ENTRY, this ); iSocket->EndInCritical(); + OstTraceFunctionExit1( DPBUSPRIMARYMEDIA_DOENDINCRITICAL_EXIT, this ); } /** @@ -154,7 +184,9 @@ */ void DPBusPrimaryMedia::DeltaCurrentConsumption(TInt aCurrent) { + OstTraceFunctionEntryExt( DPBUSPRIMARYMEDIA_DELTACURRENTCONSUMPTION_ENTRY, this ); iSocket->DeltaCurrentConsumption(aCurrent); + OstTraceFunctionExit1( DPBUSPRIMARYMEDIA_DELTACURRENTCONSUMPTION_EXIT, this ); } /** @@ -165,9 +197,11 @@ */ void DPBusPrimaryMedia::DefaultDriveCaps(TLocalDriveCapsV2& aCaps) { + OstTraceFunctionEntry1( DPBUSPRIMARYMEDIA_DEFAULTDRIVECAPS_ENTRY, this ); // aCaps is zeroed beforehand aCaps.iType = EMediaNotPresent; aCaps.iDriveAtt = KDriveAttLocal|KDriveAttRemovable; + OstTraceFunctionExit1( DPBUSPRIMARYMEDIA_DEFAULTDRIVECAPS_EXIT, this ); } /** @@ -177,14 +211,18 @@ */ TBool DPBusPrimaryMedia::IsRemovableDevice(TInt& aSocketNum) { + OstTraceFunctionEntryExt( DPBUSPRIMARYMEDIA_ISREMOVABLEDEVICE_ENTRY, this ); aSocketNum=iSocket->iSocketNumber; + OstTraceFunctionExit1( DPBUSPRIMARYMEDIA_ISREMOVABLEDEVICE_EXIT, this ); return(ETrue); } void DPBusPrimaryMedia::PBusStateChange(TInt aState, TInt anError) { + OstTraceFunctionEntryExt( DPBUSPRIMARYMEDIA_PBUSSTATECHANGE_ENTRY, this ); // receive power down and media change notifications __KTRACE_OPT(KLOCDRV,Kern::Printf("DPBusPrimaryMedia(%d)::PBusStateChange state %d, err %d",iMediaId,aState,anError)); + OstTraceExt3(TRACE_INTERNALS, DPBUSPRIMARYMEDIA_PBUSSTATECHANGE, "iMediaId=%d; aState=%d; anError=%d", iMediaId,aState,anError); if (aState!=iPBusState) { TInt oldState = iPBusState; @@ -243,5 +281,6 @@ break; } } + OstTraceFunctionExit1( DPBUSPRIMARYMEDIA_PBUSSTATECHANGE_EXIT, this ); }
--- a/kernel/eka/drivers/pbus/spbus.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/drivers/pbus/spbus.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -16,6 +16,15 @@ // #include <drivers/pbus.h> +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "locmedia_ost.h" +#ifdef __VC32__ +#pragma warning(disable: 4127) // disabling warning "conditional expression is constant" +#endif +#include "spbusTraces.h" +#endif + const TInt KPBusSocketThreadPriority=26; @@ -30,33 +39,43 @@ EXPORT_C TPBusCallBack::TPBusCallBack() : iSocket(NULL), iFunction(NULL), iIntMask(0), iPtr(NULL) { + OstTraceFunctionEntry0( TPBUSCALLBACK_TPBUSCALLBACK1_ENTRY ); iNext=NULL; + OstTraceFunctionExit0( TPBUSCALLBACK_TPBUSCALLBACK1_EXIT ); } EXPORT_C TPBusCallBack::TPBusCallBack(TPBusCallBackFn aFunction, TAny* aPtr) : iSocket(NULL), iFunction(aFunction), iIntMask(0), iPtr(aPtr) { + OstTraceFunctionEntry0( TPBUSCALLBACK_TPBUSCALLBACK2_ENTRY ); iNext=NULL; + OstTraceFunctionExit0( TPBUSCALLBACK_TPBUSCALLBACK2_EXIT ); } EXPORT_C TPBusCallBack::TPBusCallBack(TPBusIsr anIsr, TAny* aPtr, TUint anIntMask) : iSocket(NULL), iFunction(NULL), iIntMask(anIntMask), iIsr(anIsr), iPtr(aPtr) { + OstTraceFunctionEntry0( TPBUSCALLBACK_TPBUSCALLBACK3_ENTRY ); iNext=NULL; + OstTraceFunctionExit0( TPBUSCALLBACK_TPBUSCALLBACK3_EXIT ); } EXPORT_C void TPBusCallBack::Remove() { + OstTraceFunctionEntry0( TPBUSCALLBACK_REMOVE_ENTRY ); TInt irq=NKern::DisableAllInterrupts(); if (iNext) Deque(); iNext=NULL; NKern::RestoreInterrupts(irq); + OstTraceFunctionExit0( TPBUSCALLBACK_REMOVE_EXIT ); } EXPORT_C void TPBusCallBack::SetSocket(TInt aSocket) { + OstTraceFunctionEntryExt( TPBUSCALLBACK_SETSOCKET_ENTRY, this ); iSocket=TheSockets[aSocket]; + OstTraceFunctionExit1( TPBUSCALLBACK_SETSOCKET_EXIT, this ); } /******************************************** @@ -73,6 +92,7 @@ iReplyCount(0), iDoorOpenDfc(DoorOpenDfcFn,this,Kern::DfcQue1(),1) { + OstTraceFunctionEntryExt( DMEDIACHANGEBASE_DMEDIACHANGEBASE_ENTRY, this ); } @@ -106,13 +126,22 @@ EXPORT_C void DMediaChangeBase::DoorOpenService() { if (NKern::CurrentContext()==NKern::EInterrupt) + { + OstTrace0(TRACE_INTERNALS, DMEDIACHANGEBASE_DOOROPENSERVICE, "Interrupt driven asynchronous media change event"); iDoorOpenDfc.Add(); + } else { if (Kern::DfcQue1()->iThread==(NThreadBase *)NKern::CurrentThread()) // check if this is being called from PBUS thread + { + OstTrace0(TRACE_INTERNALS, DMEDIACHANGEBASE_DOOROPENSERVICE2, "Synchronous media change event"); MediaChangeEvent(ETrue); + } else + { + OstTrace0(TRACE_INTERNALS, DMEDIACHANGEBASE_DOOROPENSERVICE3, "Different thread is queueing request, asynchronous media change event"); iDoorOpenDfc.Enque(); + } } } @@ -126,8 +155,10 @@ */ void DMediaChangeBase::DoorOpenDfcFn(TAny* aPtr) { + OstTraceFunctionEntry0( DMEDIACHANGEBASE_DOOROPENDFCFN_ENTRY ); DMediaChangeBase* pM=(DMediaChangeBase*)aPtr; pM->MediaChangeEvent(ETrue); + OstTraceFunctionExit0( DMEDIACHANGEBASE_DOOROPENDFCFN_EXIT ); } /** @@ -138,7 +169,9 @@ */ EXPORT_C void DMediaChangeBase::DoorClosedService() { + OstTraceFunctionEntry1( DMEDIACHANGEBASE_DOORCLOSEDSERVICE_ENTRY, this ); MediaChangeEvent(EFalse); + OstTraceFunctionExit1( DMEDIACHANGEBASE_DOORCLOSEDSERVICE_EXIT, this ); } /** @@ -150,7 +183,9 @@ */ void DMediaChangeBase::MediaChangeEvent(TBool aDoorOpened) { + OstTraceFunctionEntry1( DMEDIACHANGEBASE_MEDIACHANGEEVENT_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf(">DMediaChangeBase(%d)::MediaChangeEvent(%d)",iMediaChangeNum,aDoorOpened)); + OstTraceExt2(TRACE_INTERNALS, DMEDIACHANGEBASE_DMEDIACHANGEBASE, "iMediaChangeNum=%d; aDoorOpened=%d", iMediaChangeNum,aDoorOpened); TInt i; // notify all sockets affected @@ -165,6 +200,7 @@ pS->MediaChangeEvent(aDoorOpened); } } + OstTraceFunctionExit1( DMEDIACHANGEBASE_MEDIACHANGEEVENT_EXIT, this ); } /** @@ -179,6 +215,7 @@ */ void DMediaChangeBase::AcknowledgeEvent(TBool aDoorOpened) { + OstTraceFunctionEntryExt( DMEDIACHANGEBASE_ACKNOWLEDGEEVENT_ENTRY, this ); TInt c = __e32_atomic_tas_ord32(&iReplyCount, 1, -1, 0); if (c==1) { @@ -187,6 +224,7 @@ else DoDoorClosed(); } + OstTraceFunctionExit1( DMEDIACHANGEBASE_ACKNOWLEDGEEVENT_EXIT, this ); } /******************************************** @@ -194,14 +232,18 @@ ********************************************/ void psuTick(TAny* aPtr) { + OstTraceFunctionEntry0( _PSUTICK_ENTRY ); DPBusPsuBase* pP=(DPBusPsuBase*)aPtr; pP->iPsuDfc.Enque(); + OstTraceFunctionExit0( _PSUTICK_EXIT ); } void psuDfc(TAny* aPtr) { + OstTraceFunctionEntry0( _PSUDFC_ENTRY ); DPBusPsuBase* pP=(DPBusPsuBase*)aPtr; pP->DoTickService(); + OstTraceFunctionExit0( _PSUDFC_EXIT ); } /** @@ -215,6 +257,7 @@ iPsuDfc(psuDfc, this, 4), iPwrDownCheckFn(DoPwrDownCheck) { + OstTraceFunctionEntryExt( DPBUSPSUBASE_DPBUSPSUBASE_ENTRY, this ); // iCurrLimited=EFalse; // iVoltageSupported=0; // iMaxCurrentInMicroAmps=0; @@ -227,8 +270,10 @@ void DPBusPsuBase::DoPwrDownCheck(TAny* aPtr) { + OstTraceFunctionEntry0( DPBUSPSUBASE_DOPWRDOWNCHECK_ENTRY ); DPBusPsuBase& self = *static_cast<DPBusPsuBase*>(aPtr); self.PwrDownCheck(); + OstTraceFunctionExit0( DPBUSPSUBASE_DOPWRDOWNCHECK_EXIT ); } /** @@ -244,6 +289,7 @@ */ TInt DPBusPsuBase::Create() { + OstTraceFunctionEntry1( DPBUSPSUBASE_CREATE_ENTRY, this ); TPBusPsuInfo pi; PsuInfo(pi); @@ -256,10 +302,14 @@ TInt r=DoCreate(); if (r!=KErrNone) + { + OstTraceFunctionExitExt( DPBUSPSUBASE_CREATE_EXIT1, this, r ); return r; + } iPsuDfc.SetDfcQ(&iSocket->iDfcQ); + OstTraceFunctionExitExt( DPBUSPSUBASE_CREATE_EXIT2, this, KErrNone ); return KErrNone; } @@ -276,7 +326,10 @@ */ EXPORT_C TInt DPBusPsuBase::DoCreate() { - return KErrNone; + OstTraceFunctionEntry1( DPBUSPSUBASE_DOCREATE_ENTRY, this ); + TInt r = KErrNone; + OstTraceFunctionExitExt( DPBUSPSUBASE_DOCREATE_EXIT, this, r ); + return r; } @@ -286,8 +339,10 @@ */ void DPBusPsuBase::Reset() { + OstTraceFunctionEntry1( DPBUSPSUBASE_RESET_ENTRY, this ); SetState(EPsuOff); iCurrLimited=EFalse; + OstTraceFunctionExit1( DPBUSPSUBASE_RESET_EXIT, this ); } @@ -320,6 +375,7 @@ */ EXPORT_C TInt DPBusPsuBase::SetState(TPBusPsuState aState) { + OstTraceFunctionEntry1( DPBUSPSUBASE_SETSTATE_ENTRY, this ); TInt r=KErrGeneral; if (aState==EPsuOff) @@ -343,6 +399,8 @@ r=KErrNone; } __KTRACE_OPT(KPBUS2,Kern::Printf("<Psu(%d):Set(%d)-%d",iPsuNum,aState,r)); + OstTraceExt3(TRACE_INTERNALS, DPBUSPSUBASE_SETSTATE, "iPsuNum=%d; aState=%d; retval=%d", iPsuNum, (TInt) aState, r); + OstTraceFunctionExit1( DPBUSPSUBASE_SETSTATE_EXIT, this ); return r; } @@ -363,6 +421,7 @@ */ TInt DPBusPsuBase::CheckVoltage(TUint aCheckStatus) { + OstTraceFunctionEntryExt( DPBUSPSUBASE_CHECKVOLTAGE_ENTRY, this ); // Check that voltage checking is in order at this time if ( (aCheckStatus&iVoltCheckInterval) && @@ -370,8 +429,10 @@ ) { DoCheckVoltage(); + OstTraceFunctionExitExt( DPBUSPSUBASE_CHECKVOLTAGE_EXIT, this, KErrNone ); return KErrNone; } + OstTraceFunctionExitExt( DPBUSPSUBASE_CHECKVOLTAGE_EXIT2, this, KErrNotSupported ); return KErrNotSupported; } @@ -393,12 +454,15 @@ */ EXPORT_C void DPBusPsuBase::ReceiveVoltageCheckResult(TInt anError) { + OstTraceFunctionEntryExt( DPBUSPSUBASE_RECEIVEVOLTAGECHECKRESULT_ENTRY, this ); // __KTRACE_OPT(KPBUS1,Kern::Printf("DPBusPsuBase(%d)::ReceiveVoltageCheckResult(%d)",iPsuNum,anError)); + OstTraceExt2(TRACE_INTERNALS, DPBUSPSUBASE_RECEVIVEVOLTAGECHECKRESULT,"iPsuNum=%d; ReceiveVoltageCheckResult=%d",iPsuNum,anError ); if (anError==KErrGeneral) { SetCurrLimited(); iSocket->PsuFault(KErrCorrupt); } + OstTraceFunctionExit1( DPBUSPSUBASE_RECEIVEVOLTAGECHECKRESULT_EXIT, this ); } /** @@ -410,10 +474,17 @@ */ TPBusPsuStatus DPBusPsuBase::Status() { + OstTraceFunctionEntry1( DPBUSPSUBASE_STATUS_ENTRY, this ); if (iCurrLimited) + { + OstTraceFunctionExit1( DPBUSPSUBASE_STATUS_EXIT1, this ); return(EPsuStatError); + } else + { + OstTraceFunctionExit1( DPBUSPSUBASE_STATUS_EXIT2, this ); return( (iState==EPsuOff) ? EPsuStatOff : EPsuStatOn ); + } } @@ -424,12 +495,13 @@ */ void DPBusPsuBase::PwrDownCheck() { - +OstTraceFunctionEntry1( DPBUSPSUBASE_PWRDOWNCHECK_ENTRY, this ); if ( (iNotLockedTimeout&&!IsLocked()&&++iNotLockedCount>iNotLockedTimeout) || (iInactivityTimeout&&++iInactivityCount>iInactivityTimeout) ) iSocket->PsuTimeout(); + OstTraceFunctionExit1( DPBUSPSUBASE_PWRDOWNCHECK_EXIT, this ); } @@ -438,9 +510,11 @@ */ EXPORT_C void DPBusPsuBase::DoTickService() { + OstTraceFunctionEntry1( DPBUSPSUBASE_DOTICKSERVICE_ENTRY, this ); if (iPwrDownCheckFn) (*iPwrDownCheckFn)(this); CheckVoltage(KPsuChkWhileOn); // Check voltage level + OstTraceFunctionExit1( DPBUSPSUBASE_DOTICKSERVICE_EXIT, this ); } @@ -451,16 +525,21 @@ : DPowerHandler(*aSocket->iName), iSocket(aSocket) { + OstTraceFunctionEntryExt( DPBUSPOWERHANDLER_DPBUSPOWERHANDLER_ENTRY, this ); } void DPBusPowerHandler::PowerUp() { + OstTraceFunctionEntry1( DPBUSPOWERHANDLER_POWERUP_ENTRY, this ); iSocket->iPowerUpDfc.Enque(); + OstTraceFunctionExit1( DPBUSPOWERHANDLER_POWERUP_EXIT, this ); } void DPBusPowerHandler::PowerDown(TPowerState) { + OstTraceFunctionEntry1( DPBUSPOWERHANDLER_POWERDOWN_ENTRY, this ); iSocket->iPowerDownDfc.Enque(); + OstTraceFunctionExit1( DPBUSPOWERHANDLER_POWERDOWN_EXIT, this ); } /******************************************** @@ -468,23 +547,29 @@ ********************************************/ void mediaChangeDfc(TAny* aPtr) { + OstTraceFunctionEntry0( _MEDIACHANGEDFC_ENTRY ); DPBusSocket* pS=(DPBusSocket*)aPtr; if (pS->iDoorOpened) pS->DoorOpenEvent(); else pS->DoorCloseEvent(); + OstTraceFunctionExit0( _MEDIACHANGEDFC_EXIT ); } void powerUpDfc(TAny* aPtr) { + OstTraceFunctionEntry0( _POWERUPDFC_ENTRY ); DPBusSocket* pS=(DPBusSocket*)aPtr; pS->DoPowerUp(); + OstTraceFunctionExit0( _POWERUPDFC_EXIT ); } void powerDownDfc(TAny* aPtr) { + OstTraceFunctionEntry0( _POWERDOWNDFC_ENTRY ); DPBusSocket* pS=(DPBusSocket*)aPtr; pS->DoPowerDown(); + OstTraceFunctionExit0( _POWERDOWNDFC_EXIT ); } /** @@ -508,10 +593,16 @@ */ EXPORT_C TInt DPBusSocket::InCritical() { + OstTraceFunctionEntry1( DPBUSSOCKET_INCRITICAL_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf(">DPBusSocket(%d)::InCritical",iSocketNumber)); + OstTrace1(TRACE_INTERNALS, DPBUSSOCKET_INCRITICAL, "iSocketNumber=%d",iSocketNumber ); if (iPostponeCount==0 && iPostponedEvents!=0) + { + OstTraceFunctionExitExt( DPBUSSOCKET_INCRITICAL_EXIT1, this, KErrNotReady ); return KErrNotReady; // we are about to do media change/power down + } ++iPostponeCount; + OstTraceFunctionExitExt( DPBUSSOCKET_INCRITICAL_EXIT2, this, KErrNone ); return KErrNone; } @@ -523,20 +614,25 @@ */ EXPORT_C void DPBusSocket::EndInCritical() { + OstTraceFunctionEntry1( DPBUSSOCKET_ENDINCRITICAL_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf(">DPBusSocket(%d)::EndInCritical",iSocketNumber)); + OstTrace1(TRACE_INTERNALS, DPBUSSOCKET_ENDINCRITICAL1, "iSocketNumber=%d",iSocketNumber); if (iPostponeCount && --iPostponeCount==0) { if (iPostponedEvents & EMediaChange) { iMediaChangeDfc.Enque(); __KTRACE_OPT(KPBUS1,Kern::Printf("Media change - done postponed")); + OstTrace0(TRACE_INTERNALS, DPBUSSOCKET_ENDINCRITICAL2, "Media change - done postponed"); } if (iPostponedEvents & EPowerDown) { iPowerDownDfc.Enque(); __KTRACE_OPT2(KPBUS1,KPOWER,Kern::Printf("Power down - done postponed")); + OstTrace0(TRACE_INTERNALS, DPBUSSOCKET_ENDINCRITICAL3, "Power down - done postponed"); } } + OstTraceFunctionExit1( DPBUSSOCKET_ENDINCRITICAL_EXIT, this ); } /** @@ -546,7 +642,9 @@ */ EXPORT_C void DPBusSocket::DeltaCurrentConsumption(TInt aDelta) { + OstTraceFunctionEntryExt( DPBUSSOCKET_DELTACURRENTCONSUMPTION_ENTRY, this ); iPowerHandler->DeltaCurrentConsumption(aDelta); + OstTraceFunctionExit1( DPBUSSOCKET_DELTACURRENTCONSUMPTION_EXIT, this ); } /** @@ -561,6 +659,7 @@ iPowerDownDfc(powerDownDfc, this, 4), iPsuDfc(psuDfc, this, 4) { + OstTraceFunctionEntryExt( DPBUSSOCKET_DPBUSSOCKET_ENTRY, this ); // iPowerGroup=0; // iName=NULL; // iState=EPBusCardAbsent; @@ -583,20 +682,29 @@ */ TInt DPBusSocket::Create(const TDesC* aName) { + OstTraceFunctionEntry1( DPBUSSOCKET_CREATE_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf(">DPBusSocket(%d)::Create %lS",iSocketNumber,aName)); + OstTrace1(TRACE_INTERNALS, DPBUSSOCKET_CREATE, "iSocketNumber=%d",iSocketNumber); iName=aName; DPBusPowerHandler* pH=new DPBusPowerHandler(this); if (!pH) + { + OstTraceFunctionExitExt( DPBUSSOCKET_CREATE_EXIT1, this, KErrNoMemory ); return KErrNoMemory; + } iPowerHandler=pH; pH->Add(); // register power handler TInt r=Kern::DfcQInit(&iDfcQ, KPBusSocketThreadPriority, iName); if (r!=KErrNone) + { + OstTraceFunctionExitExt( DPBUSSOCKET_CREATE_EXIT2, this, r ); return r; + } iMediaChangeDfc.SetDfcQ(&iDfcQ); iPowerUpDfc.SetDfcQ(&iDfcQ); iPowerDownDfc.SetDfcQ(&iDfcQ); + OstTraceFunctionExitExt( DPBUSSOCKET_CREATE_EXIT3, this, KErrNone ); return KErrNone; } @@ -607,19 +715,25 @@ */ TInt DPBusSocket::Init() { + OstTraceFunctionEntry1( DPBUSSOCKET_INIT_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf(">DPBusSocket(%d)::Init",iSocketNumber)); + OstTrace1(TRACE_INTERNALS, DPBUSSOCKET_INIT, "iSocketNumber=%d",iSocketNumber); __PM_ASSERT(iState == EPBusCardAbsent); if (MediaState()==EDoorClosed && CardIsPresent()) ChangeState(EPBusOff,KErrNotReady); + OstTraceFunctionExitExt( DPBUSSOCKET_INIT_EXIT, this, KErrNone ); return KErrNone; } void DPBusSocket::ResetSocket(TBool aFullReset) { + OstTraceFunctionEntryExt( DPBUSSOCKET_RESETSOCKET_ENTRY, this ); + OstTraceExt2(TRACE_INTERNALS, DPBUSSOCKET_RESETSOCKET, "iSocketNumber=%d; aFullReset=%d", iSocketNumber, aFullReset); Reset1(); iVcc->Reset(); if (aFullReset) Reset2(); + OstTraceFunctionExit1( DPBUSSOCKET_RESETSOCKET_EXIT, this ); } void DPBusSocket::ChangeState(TInt aState, TInt anError) @@ -627,7 +741,9 @@ // Change state, notifying all clients // { + OstTraceFunctionEntryExt( DPBUSSOCKET_CHANGESTATE_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("Socket %d ChangeState %d to %d, err %d",iSocketNumber,iState,aState,anError)); + OstTraceExt4(TRACE_INTERNALS, DPBUSSOCKET_CHANGESTATE , "iSocketNumber=%d; ChangeState %d to %d; anError=%d",iSocketNumber,iState,aState,anError); if (iState!=aState) { if(iState == EPBusCardAbsent && aState == EPBusOff && anError == KErrTimedOut) @@ -648,6 +764,7 @@ pC=pC->iNext; } } + OstTraceFunctionExit1( DPBUSSOCKET_CHANGESTATE_EXIT, this ); } void DPBusSocket::Isr(TInt anId) @@ -655,6 +772,8 @@ // Service a card interrupt // { + OstTraceFunctionEntry1( DPBUSSOCKET_ISR_ENTRY, this ); + OstTraceExt2(TRACE_INTERNALS, DPBUSSOCKET_ISR, "iSocketNumber=%d; anId=%d", iSocketNumber, anId ); // notify all interested clients of interrupt SDblQueLink* pC=iCallBackQ.iA.iNext; #ifdef _DEBUG @@ -670,7 +789,9 @@ } #ifdef _DEBUG __KTRACE_OPT(KPBUS1,Kern::Printf("!%d",n)); + OstTrace1(TRACE_INTERNALS, DPBUSSOCKET_ISR2, "!%d", n); #endif + OstTraceFunctionExit1( DPBUSSOCKET_ISR_EXIT, this ); } /** @@ -680,11 +801,14 @@ */ EXPORT_C void DPBusSocket::Add(TPBusCallBack* aCallBack) { + OstTraceFunctionEntry1( DPBUSSOCKET_ADD_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf("DPBusSocket(%d)::Add(%08x) next %08x",iSocketNumber,aCallBack,aCallBack->iNext)); + OstTraceExt3(TRACE_INTERNALS, DPBUSSOCKET_ADD, "iSocketNumber=%d; aCallBack=0x%08x; aCallBack->iNext=0x%08x",iSocketNumber, (TUint) aCallBack, (TUint) aCallBack->iNext); TInt irq=NKern::DisableAllInterrupts(); if (!aCallBack->iNext) iCallBackQ.Add(aCallBack); NKern::RestoreInterrupts(irq); + OstTraceFunctionExit1( DPBUSSOCKET_ADD_EXIT, this ); } /** @@ -700,7 +824,9 @@ */ EXPORT_C TInt DPBusSocket::PowerUp() { + OstTraceFunctionEntry1( DPBUSSOCKET_POWERUP_ENTRY, this ); __KTRACE_OPT2(KPBUS1,KPOWER,Kern::Printf(">DPBusSocket(%d)::PowerUp state %d",iSocketNumber,iState)); + OstTraceExt2(TRACE_INTERNALS, DPBUSSOCKET_POWERUP1, "iSocketNumber=%d; iState=%d",iSocketNumber,iState); TInt r=KErrNone; switch (iState) { @@ -737,6 +863,8 @@ } } __KTRACE_OPT2(KPBUS1,KPOWER,Kern::Printf("<DPBusSocket(%d)::PowerUp ret %d, state %d",iSocketNumber,r,iState)); + OstTraceExt2(TRACE_INTERNALS, DPBUSSOCKET_POWERUP2, "iSocketNumber=%d; iState=%d",iSocketNumber,iState); + OstTraceFunctionExitExt( DPBUSSOCKET_POWERUP_EXIT, this, r ); return r; } /** @@ -749,7 +877,9 @@ EXPORT_C void DPBusSocket::PowerUpSequenceComplete(TInt anError) { + OstTraceFunctionEntry1( DPBUSSOCKET_POWERUPSEQUENCECOMPLETE_ENTRY, this ); __KTRACE_OPT2(KPBUS1,KPOWER,Kern::Printf("DPBusSocket(%d)::PowerUpSequenceComplete state %d error %d",iSocketNumber,iState,anError)); + OstTraceExt3(TRACE_INTERNALS, DPBUSSOCKET_POWERUPSEQUENCECOMPLETE, "iSocketNumber=%d; iState=%d; anError=%d",iSocketNumber,iState,anError); if (iState!=EPBusCardAbsent && iState!=EPBusOff) { if (anError==KErrNone) @@ -761,11 +891,13 @@ else ChangeState(EPBusPsuFault,anError); } + OstTraceFunctionExit1( DPBUSSOCKET_POWERUPSEQUENCECOMPLETE_EXIT, this ); } void DPBusSocket::PsuFault(TInt anError) { __KTRACE_OPT(KPBUS1,Kern::Printf(">DPBusSocket(%d)::PsuFault state %d error %d",iSocketNumber,iState,anError)); + OstTraceExt2(TRACE_INTERNALS, DPBUSSOCKET_PSUFAULT, "iSocketNumber=%d; iState=%d",iSocketNumber,iState ); ResetSocket(ETrue); ChangeState(EPBusPsuFault,anError); } @@ -773,6 +905,7 @@ void DPBusSocket::PsuTimeout() { __KTRACE_OPT(KPBUS1,Kern::Printf(">DPBusSocket(%d)::PsuTimeout state %d",iSocketNumber,iState)); + OstTraceExt2(TRACE_INTERNALS, DPBUSSOCKET_PSUTIMEOUT, "iSocketNumber=%d; iState=%d",iSocketNumber,iState ); ResetSocket(EFalse); ChangeState(EPBusOff,KErrTimedOut); } @@ -782,7 +915,10 @@ // Called on transition from standby // { + OstTraceFunctionEntry1( DPBUSSOCKET_DOPOWERUP_ENTRY, this ); + __KTRACE_OPT2(KPBUS1,KPOWER,Kern::Printf("DPBusSocket(%d)::DoPowerUp state %d",iSocketNumber,iState)); + OstTraceExt2(TRACE_INTERNALS, DPBUSSOCKET_DOPOWERUP, "iSocketNumber=%d; iState=%d",iSocketNumber,iState ); __PM_ASSERT(iStandby); if (iState!=EPBusCardAbsent && iState!=EPBusOff && iState!=EPBusPowerUpPending) Panic(EMcPowerUpInvalidState); @@ -814,6 +950,7 @@ ChangeState(EPBusOff,KErrNotReady); iStandby = EFalse; iPowerHandler->PowerUpDone(); + OstTraceFunctionExit1( DPBUSSOCKET_DOPOWERUP_EXIT, this ); } void DPBusSocket::DoPowerDown() @@ -821,12 +958,15 @@ // Called by DPowerManager on transition to standby // { + OstTraceFunctionEntry1( DPBUSSOCKET_DOPOWERDOWN_ENTRY, this ); __KTRACE_OPT2(KPBUS1,KPOWER,Kern::Printf("DPBusSocket(%d)::DoPowerDown state %d",iSocketNumber,iState)); + OstTraceExt2(TRACE_INTERNALS, DPBUSSOCKET_DOPOWERDOWN1, "iSocketNumber=%d; iState=%d",iSocketNumber,iState ); __PM_ASSERT(!iStandby); if (iPostponeCount) { iPostponedEvents |= EPowerDown; __KTRACE_OPT(KPBUS1,Kern::Printf("Power down postponed")); + OstTrace0(TRACE_INTERNALS, DPBUSSOCKET_DOPOWERDOWN2, "Power down postponed"); return; } iPostponedEvents &= ~EPowerDown; @@ -850,6 +990,7 @@ iStandby = ETrue; iPowerHandler->PowerDownDone(); } + OstTraceFunctionExit1( DUP1_DPBUSSOCKET_DOPOWERDOWN_EXIT, this ); } /** @@ -859,9 +1000,11 @@ */ EXPORT_C void DPBusSocket::RequestAsyncPowerDown() { - __KTRACE_OPT(KPBUS1,Kern::Printf("DPBusSocket::RequestAsyncPowerDown")); + __KTRACE_OPT(KPBUS1,Kern::Printf("DPBusSocket::RequestAsyncPowerDown")); + OstTrace0(TRACE_INTERNALS, DPBUSSOCKET_REQUESTASYNCPOWERDOWN1, "DPBusSocket::RequestAsyncPowerDown"); __e32_atomic_add_ord32(&iRequestPowerDownCount, 1); __KTRACE_OPT(KPBUS1,Kern::Printf(" >> count=%d", iRequestPowerDownCount)); + OstTrace1(TRACE_INTERNALS, DPBUSSOCKET_REQUESTASYNCPOWERDOWN2, "iRequestPowerDownCount=%d", iRequestPowerDownCount); } /** @@ -872,12 +1015,15 @@ EXPORT_C void DPBusSocket::PowerDownComplete() { __KTRACE_OPT(KPBUS1,Kern::Printf("DPBusSocket::PowerDownComplete")); + OstTrace0(TRACE_INTERNALS, DPBUSSOCKET_POWERDOWNCOMPLETE, "DPBusSocket::PowerDownComplete"); if (__e32_atomic_tas_ord32(&iRequestPowerDownCount, 1, -1, 0) == 1) { __KTRACE_OPT(KPBUS1,Kern::Printf(" > Signalling Power Down (deferred)")); + OstTrace0(TRACE_INTERNALS, DPBUSSOCKET_POWERDOWNCOMPLETE2, "Signalling Power Down (deferred)"); DoPowerDown(); } __KTRACE_OPT(KPBUS1,Kern::Printf(" >> count=%d", iRequestPowerDownCount)); + OstTrace1(TRACE_INTERNALS, DPBUSSOCKET_POWERDOWNCOMPLETE3, "iRequestPowerDownCount=%d", iRequestPowerDownCount); } /** @@ -886,6 +1032,7 @@ */ EXPORT_C void DPBusSocket::ForceMediaChange() { + OstTrace1(TRACE_INTERNALS, DPBUSSOCKET_FORCEMEDIACHANGE, "iSocketNumber=%d", iSocketNumber); iMediaChange->ForceMediaChange(); } @@ -895,6 +1042,7 @@ // { __KTRACE_OPT(KPBUS1,Kern::Printf(">DPBusSocket(%d)::MediaChangeEvent %d state %d",iSocketNumber,aDoorOpened,iState)); + OstTraceExt3(TRACE_INTERNALS, DPBUSSOCKET_MEDIACHANGEEVENT, "iSocketNumber=%d; aDoorOpened=%d; iState=%d",iSocketNumber,aDoorOpened,iState); iDoorOpened=aDoorOpened; iMediaChangeDfc.Enque(); } @@ -904,12 +1052,16 @@ // Called in socket thread // { + OstTraceFunctionEntry1( DPBUSSOCKET_DOOROPENEVENT_ENTRY, this ); + __KTRACE_OPT(KPBUS1,Kern::Printf(">DPBusSocket(%d)::DoorOpenEvent state %d",iSocketNumber,iState)); + OstTraceExt2(TRACE_INTERNALS, DPBUSSOCKET_DOOROPENEVENT1, "iSocketNumber=%d; iState=%d",iSocketNumber,iState); if (iPostponeCount) { iPostponedEvents |= EMediaChange; __KTRACE_OPT(KPBUS1,Kern::Printf("Media change postponed")); + OstTraceFunctionExit1( DPBUSSOCKET_DOOROPENEVENT_EXIT1, this ); return; } iPostponedEvents &= ~EMediaChange; @@ -947,14 +1099,18 @@ #endif { __KTRACE_OPT(KPBUS1,Kern::Printf("At least 1 door still closed"));; + OstTrace0(TRACE_INTERNALS, DPBUSSOCKET_DOOROPENEVENT2 , "At least 1 door still closed"); ChangeState(EPBusOff,KErrNotReady); } + OstTraceFunctionExit1( DPBUSSOCKET_DOOROPENEVENT_EXIT2, this ); } void DPBusSocket::DoorCloseEvent() { + OstTraceFunctionEntry1( DPBUSSOCKET_DOORCLOSEEVENT_ENTRY, this ); __KTRACE_OPT(KPBUS1,Kern::Printf(">DPBusSocket(%d)::DoorCloseEvent state %d",iSocketNumber,iState)); + OstTraceExt2(TRACE_INTERNALS, DPBUSSOCKET_DOORCLOSEEVENT , "iSocketNumber=%d; iState=%d",iSocketNumber,iState); // NB If there are multiple doors then the bus may already be powererd up, // so it's not possible to determine the bus state. @@ -1000,6 +1156,7 @@ #else iMediaChange->AcknowledgeEvent(EFalse); #endif + OstTraceFunctionExit1( DPBUSSOCKET_DOORCLOSEEVENT_EXIT, this ); } /** Gets pointer to the PBus Socket corresponding to the opened logical unit. @@ -1008,8 +1165,13 @@ */ EXPORT_C DPBusSocket* DPBusSocket::SocketFromId(TInt anId) { + OstTraceFunctionEntry0( DPBUSSOCKET_SOCKETFROMID_ENTRY ); if (anId>=0 && anId<KMaxPBusSockets) + { + OstTraceFunctionExit0( DPBUSSOCKET_SOCKETFROMID_EXIT1 ); return TheSockets[anId]; + } + OstTraceFunctionExit0( DPBUSSOCKET_SOCKETFROMID_EXIT2 ); return NULL; } @@ -1031,6 +1193,7 @@ */ EXPORT_C TInt DPBusSocket::ControlIO(TInt aFunction, TAny* aParam1, TAny* /*aParam2*/) { + OstTraceExt3(TRACE_FLOW, DPBUSSOCKET_CONTROLIO_ENTRY,"DPBusSocket::ControlIO;aFunction=%d;aParam1=%d;this=%x", (TInt) aFunction, (TInt) aParam1, (TUint) this); TInt err = KErrNone; switch(aFunction) @@ -1046,7 +1209,7 @@ if(newState != iSimulatedMediaState) { iSimulatedMediaState = newState; - + OstTrace1(TRACE_INTERNALS, DPBUSSOCKET_CONTROLIO , "iSimulatedMediaState=%d",iSimulatedMediaState); switch(iSimulatedMediaState) { case EPeriphBusMediaNormal: @@ -1101,6 +1264,7 @@ break; } + OstTraceFunctionExitExt( DPBUSSOCKET_CONTROLIO_EXIT, this, err ); return err; }
--- a/kernel/eka/eabi/ekernsmp.def Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/eabi/ekernsmp.def Tue Jan 26 13:13:38 2010 +0200 @@ -1171,4 +1171,8 @@ _ZN9TRawEvent9SetRepeatENS_5TTypeEii @ 1170 NONAME _ZNK9TRawEvent7RepeatsEv @ 1171 NONAME _ZN4Kern17MakeHandleAndOpenEP7DThreadP7DObject10TOwnerType @ 1172 NONAME + _ZN4Kern15MapAndPinMemoryEP16TKernelMapObjectP7DThreadmjjRmPm @ 1173 NONAME + _ZN4Kern19UnmapAndUnpinMemoryEP16TKernelMapObject @ 1174 NONAME + _ZN4Kern21CreateKernelMapObjectERP16TKernelMapObjectj @ 1175 NONAME + _ZN4Kern22DestroyKernelMapObjectERP16TKernelMapObject @ 1176 NONAME
--- a/kernel/eka/eabi/ekernu.def Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/eabi/ekernu.def Tue Jan 26 13:13:38 2010 +0200 @@ -1162,4 +1162,8 @@ _ZN9TRawEvent9SetRepeatENS_5TTypeEii @ 1161 NONAME _ZNK9TRawEvent7RepeatsEv @ 1162 NONAME _ZN4Kern17MakeHandleAndOpenEP7DThreadP7DObject10TOwnerType @ 1163 NONAME + _ZN4Kern15MapAndPinMemoryEP16TKernelMapObjectP7DThreadmjjRmPm @ 1164 NONAME + _ZN4Kern19UnmapAndUnpinMemoryEP16TKernelMapObject @ 1165 NONAME + _ZN4Kern21CreateKernelMapObjectERP16TKernelMapObjectj @ 1166 NONAME + _ZN4Kern22DestroyKernelMapObjectERP16TKernelMapObject @ 1167 NONAME
--- a/kernel/eka/include/drivers/hcr.h Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/include/drivers/hcr.h Tue Jan 26 13:13:38 2010 +0200 @@ -17,8 +17,10 @@ /** @file hcr.h -Kernel side API for Hardware Configuration Repository (HCR). The HCR service -provides access to hardware settings defined for the base port. +Kernel side client API for Hardware Configuration Repository (HCR). +The HCR service provides access to hardware settings defined for the base port. +This API is used by kernel side components such as PDDs, hardware service +providers and other kernel extensions. @publishedPartner @prototype @@ -26,7 +28,6 @@ - #ifndef HCR_H #define HCR_H @@ -44,13 +45,20 @@ /** The HCR namespace contains all the types and APIs that make up the -Kernel side Hardware Configuration Repository (HCR). -It provides accessor functions to settings held by the HCR and may be used by -kernel side clients such as physical device drivers and other services from -thread contexts. -The published Setting IDs available for use with this API can be found +client API of the Kernel Hardware Configuration Repository (HCR). +It provides accessor functions to retrieve settings held by the HCR and may be +called by kernel components from with in thread context. + +The _published_ Setting IDs available for use with this API can be found in the BSP exported header 'hcrconfig.h'. This provides the top-level header -that clients can include to gain access to all IDs for the BSP. +that clients can include to gain access to all IDs for the BSP. IDs for settings +that are internal to a component and not used by others are defined in a file +private to that component. + +The HCR supports a number of setting repositories and searches them in a defined +order, always returns the first setting found matching the ID or criteria. +This allows setting values to be overriden by more recent repositories created +during platform development and product creation. */ namespace HCR { @@ -75,7 +83,7 @@ }; /** The setting Identifier type. A class used to uniquely identify a - setting in the HCR. Used in calls to HCR API. + setting in the HCR. Used in calls to HCR API to retrieve one setting. */ class TSettingId : public SSettingId { @@ -120,10 +128,11 @@ /** - Retrieve settings of built in types from the HCR. - - @param aId The setting identifier - @param aValue The retrieved setting data value + Retrieve a word size integer setting value from the HCR. + On error aValue is undefined. + + @param aId in: The setting identifier + @param aValue out: The retrieved setting data value @return KErrNone if successful, output parameters valid KErrNotFound if aId is not a known setting ID @@ -140,23 +149,74 @@ IMPORT_C TInt GetInt(const TSettingId& aId, TInt32& aValue); IMPORT_C TInt GetInt(const TSettingId& aId, TInt64& aValue); + /** + Retrieve a boolean setting value from the HCR. + On error aValue is undefined. + + @param aId in: The setting identifier + @param aValue out: The retrieved setting data value + + @return KErrNone if successful, output parameters valid + KErrNotFound if aId is not a known setting ID + KErrArgument if the setting identified is not the correct type + KErrNotReady if the HCR is used before it has been initialised + KErrCorrupt if HCR finds a repository to be corrupt + KErrGeneral if an internal failure occurs, see trace. + Otherwise one of the other system-wide error codes. + + @pre Call from thread context, during Init1 or later + */ IMPORT_C TInt GetBool(const TSettingId& aId, TBool& aValue); + /** + Retrieve an word size unsigned integer setting value from the HCR. + On error aValue is undefined. + + @param aId in: The setting identifier + @param aValue out: The retrieved setting data value + + @return KErrNone if successful, output parameters valid + KErrNotFound if aId is not a known setting ID + KErrArgument if the setting identified is not the correct type + KErrNotReady if the HCR is used before it has been initialised + KErrCorrupt if HCR finds a repository to be corrupt + KErrGeneral if an internal failure occurs, see trace. + Otherwise one of the other system-wide error codes. + + @pre Call from thread context, during Init1 or later + */ IMPORT_C TInt GetUInt(const TSettingId& aId, TUint8& aValue); IMPORT_C TInt GetUInt(const TSettingId& aId, TUint16& aValue); IMPORT_C TInt GetUInt(const TSettingId& aId, TUint32& aValue); IMPORT_C TInt GetUInt(const TSettingId& aId, TUint64& aValue); + /** + Retrieve a word size linear address setting value from the HCR. + On error aValue is undefined. + + @param aId in: The setting identifier + @param aValue out: The retrieved setting data value + + @return KErrNone if successful, output parameters valid + KErrNotFound if aId is not a known setting ID + KErrArgument if the setting identified is not the correct type + KErrNotReady if the HCR is used before it has been initialised + KErrCorrupt if HCR finds a repository to be corrupt + KErrGeneral if an internal failure occurs, see trace. + Otherwise one of the other system-wide error codes. + + @pre Call from thread context, during Init1 or later + */ IMPORT_C TInt GetLinAddr(const TSettingId& aId, TLinAddr& aValue); + /** - Retrieve a binary data (ETypeBinData) setting from the HCR. + Retrieve a large binary data setting value from the HCR. The value + is copied into the supplied descriptor buffer. + On error the descriptor and output arguments have undefined values. - @param aId The setting identifier - @param aMaxLen The maximum value length that can be stored in the buffer - @param aValue A pointer to the buffer or a descriptor to hold the value - @param aLen Contains the length of the setting value written - + @param aId in: The setting identifier + @param aValue inout: A pre-allocated descriptor to hold the value @return KErrNone if successful and aValue has been set KErrNotFound if aId is not a known setting ID @@ -170,15 +230,39 @@ @pre Call from thread context, during Init1 or later */ IMPORT_C TInt GetData(const TSettingId& aId, TDes8& aValue); - IMPORT_C TInt GetData(const TSettingId& aId, TUint16 aMaxLen, - TUint8* aValue, TUint16& aLen); + /** - Retrieve a character string (ETypeText8) setting from the HCR. + Retrieve a large binary data setting value from the HCR. The value is copied + into the supplied byte array buffer. + On error the buffer and output arguments have undefined values. + + @param aId in: The setting identifier + @param aMaxLen in: The maximum value length that can be stored in the buffer + @param aValue inout: The address of a pre-allocated buffer to hold the value + @param aLen out: Contains the length of the setting value written - @param aId The setting identifier - @param aMaxLen The maximum value length that can be stored in the buffer - @param aValue A pointer to the buffer or a descriptor to hold the value - @param aLen Contains the length of the setting value written + @return KErrNone if successful and aValue has been set + KErrNotFound if aId is not a known setting ID + KErrArgument if the setting identified is not the correct type + KErrNotReady if the HCR is used before it has been initialised + KErrCorrupt if HCR finds a repository to be corrupt + KErrTooBig if the setting is larger than the supplied buffer + KErrGeneral if an internal failure occurs, see trace + Otherwise one of the other system-wide error codes. + + @pre Call from thread context, during Init1 or later + */ + IMPORT_C TInt GetData(const TSettingId& aId, TUint16 aMaxLen, + TUint8* aValue, TUint16& aLen); + + /** + Retrieve an 8 bit character string setting from the HCR. The value + is copied into the supplied descriptor buffer. Note the string is not zero + terminated. + On error the descriptor and output arguments have undefined values. + + @param aId in: The setting identifier + @param aValue inout: A pre-allocated descriptor to hold the value @return KErrNone if successful and aValue has been set KErrNotFound if aId is not a known setting ID @@ -192,17 +276,41 @@ @pre Call from thread context, during Init1 or later */ IMPORT_C TInt GetString(const TSettingId& aId, TDes8& aValue); + + /** + Retrieve an 8 bit character string setting from the HCR. The value + is copied into the byte array buffer. Note the string is not zero + terminated. + On error the descriptor and output arguments have undefined values. + + @param aId in: The setting identifier + @param aMaxLen in: The maximum value length that can be stored in the buffer + @param aValue inout: The address of a pre-allocated buffer to hold the value + @param aLen out: Contains the length of the setting value written + + @return KErrNone if successful and aValue has been set + KErrNotFound if aId is not a known setting ID + KErrArgument if the setting identified is not the correct type + KErrNotReady if the HCR is used before it has been initialised + KErrCorrupt if HCR finds a repository to be corrupt + KErrTooBig if the setting is larger than the supplied buffer + KErrGeneral if an internal failure occurs, see trace + Otherwise one of the other system-wide error codes. + + @pre Call from thread context, during Init1 or later + */ IMPORT_C TInt GetString(const TSettingId& aId, TUint16 aMaxLen, TText8* aValue, TUint16& aLen); /** - Retrieve an array setting from the HCR. All value length paramters are - measured in bytes. + Retrieve an array of signed integers from the HCR. The value + is copied into the byte array buffer. + On error the descriptor and output arguments have undefined values. - @param aId The setting identifier - @param aMaxLen The maximum value length that can be stored in the buffer - @param aValue A pointer to the buffer to hold the value - @param aLen Contains the length of the setting value written + @param aId in: The setting identifier + @param aMaxLen in: The maximum value length that can be stored in the buffer + @param aValue inout: The address of a pre-allocated word array to hold the value + @param aLen out: Contains the length, in bytes of the setting value written @return KErrNone if successful and aValue has been set KErrNotFound if aId is not a known setting ID @@ -221,26 +329,35 @@ TUint32* aValue, TUint16& aLen); /** - Retrieve multiple simple settings from the Hardware Configuration + Retrieve multiple word sized settings from the Hardware Configuration Repository in one call. This method can be used for all settings of size 4 - bytes or less (i.e those with a type in 0x0000ffff). - + bytes or less (i.e those with a type less than 0x0000ffff). + The caller is responsible for pre-allocating the arrays supplied. Note the + array of setting IDs (aIds) supplied by the client must be ordered with + aIds[0] containing the lowest and aIds[aNum-1] the highest. Undefined + behaviour will result if this pre-condition is not met. + + On successful return the client will need to check the number found (return + value) matches their needs and cast each value in the aValues + array to the correct type before use. The correct type is either known at + compile time by the caller or determined from aTypes, if supplied. + + When an overall error is returned from the function the output arrays have + undefined values. + @param aNum in: The number of settings to retrieve. It is also the size of the arrays in the following arguments - @param aIds in: An ordered array of setting identifiers to retrieve, lowest first - @param aValues out: An array of values, populated on exit - @param aTypes out: An optional array of type enumerations describing - the type of each setting found. May be 0 if client is - not interested - @param aErrors out: A mandatory array supplied by the user which is populated by error - codes for each setting. If no error found for the setting then - KErrNone(=0) is written - setting. - Possible error codes: - KErrArgument if the setting has size larger than - four bytes - KErrNotFound if the setting is not found - KErrNone no any errors reported for this setting + @param aIds in: An ordered array of setting identifiers to retrieve + @param aValues inout: An array of values, populated on exit + @param aTypes inout: An optional array of type enumerations, populated on + exit describing the type of each setting found. + May be 0 if client is not interested + @param aErrors inout: An array of search errors for each setting populated + on exit. If no error found for the setting then KErrNone + is written. Possible error codes: + KErrArgument the setting is not of a suitable type + KErrNotFound the setting is not found + KErrNone when setting found @return Zero or positive number of settings found, -ve on error @@ -260,11 +377,12 @@ /** Retrieve the type and size of a HCR setting. Can be used by clients to - obtain the setting size if a dynamic buffer is to be used. + obtain the setting size should a buffer need to be allocated. + On error the output arguments are undefined. - @param aId The setting identifier - @param aType The type enumeration of found setting - @param aLen The length in bytes of found setting + @param aId in: The setting identifier + @param aType out: The type enumeration of the found setting + @param aLen out: The length in bytes of the found setting @return KErrNone if successful, output parameters valid KErrNotFound if aId is not a known setting ID @@ -279,14 +397,16 @@ TSettingType& aType, TUint16& aLen); /** - Retrieve the number of settings held in the HCR for one particular category. - It allows a client to perpare buffers for other calls to the HCR to - retrieve these settings. - This search method will return the total number of setting records found - across all HCR repositories for a given category. It does not apply the - override rules of other routines meaning that it counts duplicates to - maintain performance. - + Retrieve the number of unique ettings held in the HCR for one particular + category. It allows a client to perpare buffers for other calls to the HCR + to retrieve these settings. + The method carries out a search to return the total number of unique setting + records found across all HCR repositories for a given category. It does not + count settings that are duplicate from being redefined in different + repositories. + The function is particularly useful for open-ended categories were the + run-time client can not predict the number of settings prvisioned. + @param aCatUid in: The setting identifier category to use in the search @return Zero or positive number of settings found in category, -ve on error @@ -300,22 +420,32 @@ IMPORT_C TInt FindNumSettingsInCategory (TCategoryUid aCatUid); /** - Retrieve all the setting ids, types and sizes in one particular - category. Can be used by clients to obtain the number, size and types of - all the settings in a category. It allows a client to alloc buffers for - other calls to the HCR to retrieve these settings should any be larger than - 4 bytes. - - @param aCatUid in: The setting identifier category to use in the search + Retrieve details of all the settings (ids, types and sizes) in one + particular category. This function can be used by clients to obtain the + number of, ids, sizes and types of all the settings in a category. + It allows a client to alloc buffers for other calls to the HCR to retrieve + the values of these settings. + + On successful return the client will need to check the number found (return + value) matches the expected number. When there are more defined in + the category than was able to be returned, i.e. when number found + exceeded aMaxNum then aMaxNum is returned. + + When an overall error is returned from the function the output arrays have + undefined values. + + @param aCat in: The setting category to search for @param aMaxNum in: The maximum number of settings to return. It is also the size of the arrays in the following arguments - @param aKeyIds inout: Client supplied array populated on exit. Large + @param aKeyIds inout: Client supplied array populated on exit. Large enough to hold all elements in category. @param aTypes inout: Client supplied array populated with setting types - enumerations on exit. May be 0 if client is - not interested. + enumerations on exit. Array address may be 0 if + client is not interested. @param aLens inout: Client supplied array populated with setting lengths - on exit. May be 0 if client is not interested. + on exit for those settings with a type > 0x0000ffff. + When less than this 0 is set in the aLens array element. + Array address may be 0 if client is not interested. @return Zero or positive number of settings found in category, -ve on error KErrArgument if some parameters are wrong(i.e. aErrors is a null @@ -331,14 +461,18 @@ TElementId aKeyIds[], TSettingType aTypes[], TUint16 aLens[]); /** - Finds multiple settings in the Hardware Configuration Repository who's - setting ID matches the supplied search bit pattern. This method is useful - for categories that contain structured settings i.e. row/column structured - or record based categories as might be the case with hardware service - providers. - - The caller supplies the category to search, an element ID mask and the - pattern to match. SettingIDs that satisfy this logic are returned: + Retrieve details of all the settings (ids, types and sizes) in one + particular category who's key ID matches the supplied bit pattern/mask. + This function can be used by clients to obtain the number of, ids, sizes + and types of all the settings in a category. It allows a client to alloc + buffers for other calls to the HCR to retrieve the values of these settings. + + This search method allows categories to contain structured settings + i.e. row/column structured or record based categories as might be used + for configuration data of a hardware service provider. + + The caller supplies the category to search, a setting key ID mask and the + pattern to match. Setting keys that satisfy this logic are returned: ((elementID & aElementMask) == (aPattern & aElementMask)) For example, a set of driver capability structures might be encoded into @@ -348,21 +482,31 @@ to retrieve key fields of all records supply: aElemMask = 0x000000ff, aPattern = 0x******01 (* = dont care) + + On successful return the client will need to check the number found (return + value) matches the expected number. When there are more defined in + the category than was able to be returned, i.e. when number found + exceeded aMaxNum then aMaxNum is returned. + + When an overall error is returned from the function the output arrays have + undefined values. @param aCat in: The category to retrieve settings for @param aMaxNum in: The maximum number of settings to retrieve. It is also the size of the arrays in the following arguments - @param aElemMask in: The bits in the Element ID to be checked against + @param aMask in: The bits in the Element ID to be checked against aPattern @param aPattern in: Identified the bits that must be set for a setting to be returned in the search - @param aKeyIds inout: Client supplied array populated on exit. Large + @param aKeyIds inout: Client supplied array populated on exit. Large enough to hold aMaxNum element ids. - @param aTypes inout: Client supplied array populated with setting types - enumerations on exit. May be 0 if client is - not interested. - @param aLen inout: Client supplied array populated with setting lengths - on exit. May be 0 if client is not interested. + @param aTypes inout: Client supplied array populated with setting types + enumerations on exit. Array address may be 0 if + client is not interested. + @param aLens inout: Client supplied array populated with setting lengths + on exit for those settings with a type > 0x0000ffff. + When less than this 0 is set in the aLens array element. + Array address may be 0 if client is not interested. @return Zero or positive number of settings found in category, -ve on error KErrArgument if some parameters are wrong(i.e. aErrors is a null
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/include/drivers/locmedia_ost.h Tue Jan 26 13:13:38 2010 +0200 @@ -0,0 +1,120 @@ +// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\drivers\locmedia_ost.h +// +// + +#ifndef LOCMEDIA_OST_H +#define LOCMEDIA_OST_H + +#ifndef _DEBUG + +#ifdef OstTrace0 +#undef OstTrace0 +#define OstTrace0( aGroupName, aTraceName, aTraceText ) +#endif + +#ifdef OstTrace1 +#undef OstTrace1 +#define OstTrace1( aGroupName, aTraceName, aTraceText, aParam ) +#endif + +#ifdef OstTraceData +#undef OstTraceData +#define OstTraceData( aGroupName, aTraceName, aTraceText, aPtr, aLength ) +#endif + +#ifdef OstTraceExt1 +#undef OstTraceExt1 +#define OstTraceExt1( aGroupName, aTraceName, aTraceText, aParam ) +#endif + +#ifdef OstTraceExt2 +#undef OstTraceExt2 +#define OstTraceExt2( aGroupName, aTraceName, aTraceText, aParam1, aParam2 ) +#endif + +#ifdef OstTraceExt3 +#undef OstTraceExt3 +#define OstTraceExt3( aGroupName, aTraceName, aTraceText, aParam1, aParam2, aParam3 ) +#endif + +#ifdef OstTraceExt4 +#undef OstTraceExt4 +#define OstTraceExt4( aGroupName, aTraceName, aTraceText, aParam1, aParam2, aParam3, aParam4 ) +#endif + +#ifdef OstTraceExt5 +#undef OstTraceExt5 +#define OstTraceExt5( aGroupName, aTraceName, aTraceText, aParam1, aParam2, aParam3, aParam4, aParam5 ) +#endif + +#ifdef OstTraceFunctionEntry0 +#undef OstTraceFunctionEntry0 +#define OstTraceFunctionEntry0( aTraceName ) +#endif + +#ifdef OstTraceFunctionEntry1 +#undef OstTraceFunctionEntry1 +#define OstTraceFunctionEntry1( aTraceName, aInstance ) +#endif + +#ifdef OstTraceFunctionEntryExt +#undef OstTraceFunctionEntryExt +#define OstTraceFunctionEntryExt(aTraceName, aInstance) +#endif + +#ifdef OstTraceFunctionExit0 +#undef OstTraceFunctionExit0 +#define OstTraceFunctionExit0( aTraceName ) +#endif + +#ifdef OstTraceFunctionExit1 +#undef OstTraceFunctionExit1 +#define OstTraceFunctionExit1( aTraceName, aInstance ) +#endif + +#ifdef OstTraceEventStart0 +#undef OstTraceEventStart0 +#define OstTraceEventStart0( aTraceName, aEventName ) +#endif + +#ifdef OstTraceEventStart1 +#undef OstTraceEventStart1 +#define OstTraceEventStart1( aTraceName, aEventName, aParam ) +#endif + +#ifdef OstTraceFunctionExitExt +#undef OstTraceFunctionExitExt +#define OstTraceFunctionExitExt(aTraceName, aInstance, aRetval) +#endif + +#ifdef OstTraceEventStop +#undef OstTraceEventStop +#define OstTraceEventStop( aTraceName, aEventName, aStartTraceName ) +#endif + +#ifdef OstTraceState0 +#undef OstTraceState0 +#define OstTraceState0( aTraceName, aStateName, aNewState ) +#endif + +#ifdef OstTraceState1 +#undef OstTraceState1 +#define OstTraceState1( aTraceName, aStateName, aNewState, aInstance ) +#endif + +#endif // _DEBUG + +#endif // LOCMEDIA_OST_H
--- a/kernel/eka/include/e32ver.h Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/include/e32ver.h Tue Jan 26 13:13:38 2010 +0200 @@ -28,7 +28,7 @@ const TInt KE32MajorVersionNumber=2; const TInt KE32MinorVersionNumber=0; -const TInt KE32BuildVersionNumber=2063; +const TInt KE32BuildVersionNumber=2065; const TInt KMachineConfigurationMajorVersionNumber=1; const TInt KMachineConfigurationMinorVersionNumber=0;
--- a/kernel/eka/include/kernel/cache.h Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/include/kernel/cache.h Tue Jan 26 13:13:38 2010 +0200 @@ -217,7 +217,7 @@ - TMappingAttributes2 object. For user memory (always fully cached), EMapAttrCachedMax enum value can be passed. - @return KErrNotSupported on memory models other then flexible. + @return KErrNotSupported on memory models other than flexible. KErrNone, on flexible memory model. @pre Interrupts must be enabled.
--- a/kernel/eka/include/kernel/kern_priv.h Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/include/kernel/kern_priv.h Tue Jan 26 13:13:38 2010 +0200 @@ -2781,6 +2781,11 @@ static void UnpinPhysicalMemory(TPhysicalPinObject* aPinObject); static void DestroyPhysicalPinObject(TPhysicalPinObject*& aPinObject); + static TInt CreateKernelMapObject(TKernelMapObject*& aMapObject, TUint aMaxReserveSize); + static TInt MapAndPinMemory(TKernelMapObject* aMapObject, DThread* aThread, TLinAddr aStart, TUint aSize, TUint aMapAttributes, TLinAddr& aKernelAddr, TPhysAddr* aPages); + static void UnmapAndUnpinMemory(TKernelMapObject* aMapObject); + static void DestroyKernelMapObject(TKernelMapObject*& aMapObject); + // RAM allocator and defrag interfaces. static void RamAllocLock(); static void RamAllocUnlock();
--- a/kernel/eka/include/kernel/kernel.h Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/include/kernel/kernel.h Tue Jan 26 13:13:38 2010 +0200 @@ -890,6 +890,7 @@ class DLogicalDevice; class DPhysicalDevice; class TShPoolCreateInfo; +class TKernelMapObject; class Kern /** @@ -912,6 +913,23 @@ ETimeSet_AsyncNotify = 8, /**< Asynchronously trigger change notifiers*/ ETimeSet_Secure = 16 /**< Set the secure clock (implies ETimeSet_SetHwRtc)*/ }; + /** + Attributes that can be set on new kernel mapping objects created via Kern::CreateKernelMapObject(). + + @see Kern::CreateKernelMapObject() + */ + enum TKernelMapAttributes + { + /** + Set this flag to create a read only kernel mapping object. When set DMA + operations to memory mapped by the mapping object must not write to the + memory mapped, i.e. the only DMA operations must be DMA copied into H/W. + Setting this flag may improve the performance if the memory the + kernel mapping object maps is paged out. + */ + EKernelMap_ReadOnly = 1, + EKernelMap_ValidMask = EKernelMap_ReadOnly, /**<@internalComponent*/ + }; public: IMPORT_C static void Printf(const char* aFmt, ...); IMPORT_C static TInt AddHalEntry(TInt aId, THalFunc aFunc, TAny* aPtr); @@ -1155,7 +1173,11 @@ IMPORT_C static TInt PinPhysicalMemory(TPhysicalPinObject* aPinObject, TLinAddr aStart, TUint aSize, TBool aReadOnly, TPhysAddr& aAddress, TPhysAddr* aPages, TUint32& aMapAttr, TUint& aColour, DThread* aThread=NULL); IMPORT_C static TInt UnpinPhysicalMemory(TPhysicalPinObject* aPinObject); // prototype IMPORT_C static TInt DestroyPhysicalPinObject(TPhysicalPinObject*& aPinObject); // prototype - + + IMPORT_C static TInt CreateKernelMapObject(TKernelMapObject*& aMapObject, TUint aMaxReserveSize=0); + IMPORT_C static TInt MapAndPinMemory(TKernelMapObject* aMapObject, DThread* aThread, TLinAddr aStart, TUint aSize, TUint aMapAttributes, TLinAddr& aKernelAddr, TPhysAddr* aPages=NULL); + IMPORT_C static void UnmapAndUnpinMemory(TKernelMapObject* aMapObject); + IMPORT_C static void DestroyKernelMapObject(TKernelMapObject*& aMapObject); IMPORT_C static TInt ShPoolCreate(TShPool*& aPool, TShPoolCreateInfo& aInfo, TBool aMap, TUint aFlags); IMPORT_C static TInt ShPoolOpen(TShPool*& aPool, DThread* aThread, TInt aHandle, TBool aMap, TUint aFlags);
--- a/kernel/eka/kernel/sutils.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/kernel/sutils.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -4210,7 +4210,7 @@ // Implementation of kernel pin APIs -/* +/** Create an object which can be used to pin virtual memory. @param aPinObject A reference to a pointer which is set to the newly-created object on success. @@ -4227,7 +4227,6 @@ @see Kern::DestroyVirtualPinObject() @prototype -@internalTechnology */ EXPORT_C TInt Kern::CreateVirtualPinObject(TVirtualPinObject*& aPinObject) { @@ -4235,7 +4234,7 @@ return M::CreateVirtualPinObject(aPinObject); } -/* +/** Pin an area of virtual memory. The act of pinning virtual memory means that the memory in the specified virtual address range is @@ -4265,7 +4264,6 @@ @see Kern::UnpinVirtualMemory() @prototype -@internalTechnology */ EXPORT_C TInt Kern::PinVirtualMemory(TVirtualPinObject* aPinObject, TLinAddr aStart, TUint aSize, DThread* aThread) { @@ -4280,7 +4278,7 @@ return r; } -/* +/** Pin an area of virtual memory. The act of pinning virtual memory means that the memory in the specified virtual address range is @@ -4294,6 +4292,10 @@ Note that this operation may fail with KErrNoMemory. +Note - Instances of TVirtualPinObject are not protected from concurrent operations being performed +with them by separate threads i.e. it is the responsibility of the creator of a TVirtualPinObject +instance to ensure that it will not be pinned, unpinned or destroyed by more than one thread at a time. + @param aPinObject A virtual pin object previously created by calling Kern::CreateVirtualPinObject(). @param aDes A TClientBuffer object representing a client descriptor to pin. @param aThread The thread that owns the memory to pin, or NULL to use the current thread. @@ -4309,7 +4311,6 @@ @see Kern::UnpinVirtualMemory() @prototype -@internalTechnology */ EXPORT_C TInt Kern::PinVirtualMemory(TVirtualPinObject* aPinObject, const TClientBuffer& aDes, DThread* aThread) { @@ -4326,7 +4327,7 @@ NKern::ThreadLeaveCS(); return r; } -/* +/** Create a pin object and then pin an area of virtual memory in the current address space. If an error occurs then no pin object will exist @@ -4341,6 +4342,10 @@ Note that this operation may fail with KErrNoMemory. +Note - Instances of TVirtualPinObject are not protected from concurrent operations being performed +with them by separate threads i.e. it is the responsibility of the creator of a TVirtualPinObject +instance to ensure that it will not be pinned, unpinned or destroyed by more than one thread at a time. + @param aPinObject A reference to a pointer which is set to the newly-created object on success. @param aStart The start address of the memory to pin. @param aSize The size of the memory to pin in bytes. @@ -4358,7 +4363,6 @@ @see Kern::DestroyVirtualPinObject() @prototype -@internalTechnology */ EXPORT_C TInt Kern::CreateAndPinVirtualMemory(TVirtualPinObject*& aPinObject, TLinAddr aStart, TUint aSize) { @@ -4367,7 +4371,7 @@ } -/* +/** Unpin an area of memory previously pinned by calling Kern::PinVirtualMemory(). @param aPinObject The virtual pin object used to pin the memory. @@ -4381,7 +4385,6 @@ @see Kern::PinVirtualMemory() @prototype -@internalTechnology */ EXPORT_C void Kern::UnpinVirtualMemory(TVirtualPinObject* aPinObject) { @@ -4391,7 +4394,7 @@ NKern::ThreadLeaveCS(); } -/* +/** Dispose of a virtual pin object which is no longer required. Any memory pinned by the object is unpinned first. @@ -4409,7 +4412,6 @@ @see Kern::CreateVirtualPinObject() @prototype -@internalTechnology */ EXPORT_C void Kern::DestroyVirtualPinObject(TVirtualPinObject*& aPinObject) { @@ -4418,7 +4420,11 @@ } /** -Creates an object which is used to pin physical memory. Suported by Kernel running flexible memory model. +Creates an object which is used to pin physical memory. Supported by Kernel running flexible memory model. + +Note - Instances of TPhysicalPinObject are not protected from concurrent operations being performed +with them by separate threads i.e. it is the responsibility of the creator of a TPhysicalPinObject +instance to ensure that it will not be pinned, unpinned or destroyed by more than one thread at a time. @param aPinObject A reference to a pointer which is set to the newly-created object on success. @@ -4443,10 +4449,10 @@ } /** -Pins an area of physical memory. Suported by Kernel running flexible memory model. - -The physical memory to pin is defined by its existing virtual mapping (by aLinAddr, aSize & aThread parameters). -On return, aPhysicalAddress will hold physical address (if memory is mapped contigiously) and aPhysicalPageList +Pins an area of physical memory. Supported by Kernel running flexible memory model. + +The physical memory to pin is defined by its existing virtual mapping (by aStart, aSize & aThread parameters). +On return, aAddress will hold physical address (if memory is mapped contigiously) and aPages area will be populated with the list of physical pages of the mapping. aColour will hold the mapping colour of the first physical page in the mapping. @@ -4454,13 +4460,13 @@ Kernel address space (but to user client's, instead). The act of pinning physical memory means that it is guaranteed to be excluded from RAM defragmentation. -However, it can still be the subject of data paging. Physically pinned memory is also guaranteed not to be +However, it can still be the subject of demand paging. Physically pinned memory is also guaranteed not to be reused for some other purpose - even if the process owning the memory decommits it or terminates. Note that this operation may fail with KErrNoMemory. @param aPinObject A physical pin object previously created by calling Kern::CreatePhysicalPinObject(). -@param aLinAddr Virtual address of memory to pin. +@param aStart Virtual address of memory to pin. @param aSize The length (in bytes) of memory to pin. @param aThread The thread that owns the memory to pin, or NULL to use the current thread. @param aReadOnlyMemory Set to ETrue if the content of physical memory is not going to change while being @@ -4491,9 +4497,9 @@ @pre Can be used in a device driver. @see Kern::UnpinPhysicalMemory() -@see Cache::SyncPhysicalMemoryBeforeDmaWrite -@see Cache::SyncPhysicalMemoryBeforeDmaRead -@see Cache::SyncPhysicalMemoryAfterDmaRead +@see Cache::SyncPhysicalMemoryBeforeDmaWrite() +@see Cache::SyncPhysicalMemoryBeforeDmaRead() +@see Cache::SyncPhysicalMemoryAfterDmaRead() @prototype */ EXPORT_C TInt Kern::PinPhysicalMemory(TPhysicalPinObject* aPinObject, TLinAddr aStart, TUint aSize, TBool aReadOnlyMemory, @@ -4537,7 +4543,7 @@ return KErrNone; } -/* +/** Dispose of a physical pin object which is no longer required. Any memory pinned by the object is unpinned first. @@ -4565,3 +4571,167 @@ M::DestroyPhysicalPinObject(aPinObject); return KErrNone; } + + +/** +Creates an object which is used to map user side memory in the kernel address space +and also physically pin the memory. Supported by Kernel running the flexible memory model. + +When the map object will only be used to map non-demand paged memory aMaxReserveSize can be used +to pre-reserve the resources that would be required for Kern::MapAndPinMemory(). This will +prevent Kern::MapAndPinMemory() failing due to low memory and will reduce the time to execute +Kern::MapAndPinMemory() but only when the mapping object is used to map non-demand paged memory. + +Note - Instances of TKernelMapObject are not protected from concurrent operations being performed +with them by separate threads i.e. it is the responsibility of the creator of a TKernelMapObject +instance to ensure that it will not be mapped, unmapped or destroyed by more than one thread at a time. + +@param aMapObject A reference to a pointer which is set to the newly created object on success. +@param aMaxReserveSize When set to zero (the default) the resources required to map memory will be + allocated when Kern::MapAndPinMemory() is invoked with the newly created map + object. When not set to zero all resources required for the mapping object + to map up to aMaxReserveSize bytes will be reserved when creating the mapping + object. When the mapping object is used to map non-demand paged memory, + this will prevent Kern::MapAndPinMemory() from returning KErrNoMemory + when invoked with the mapping object. However, it will limit the mapping + object to being able to map a maximum of aMaxReserveSize bytes and may also + waste resources if it is used to map less than aMaxReserveSize bytes. + +@return KErrNotSupported on memory models other then flexible. + KErrNone, if successful, otherwise one of the other system-wide error codes. + +@pre Calling thread must be in a critical section +@pre Interrupts must be enabled. +@pre Kernel must be unlocked. +@pre No fast mutex can be held. +@pre Call in a thread context. +@pre Suitable for use in a device driver. + +@see Kern::DestroyKernelMapObject() +@see Kern::MapAndPinMemory() + +@prototype +*/ +EXPORT_C TInt Kern::CreateKernelMapObject(TKernelMapObject*& aMapObject, TUint aMaxReserveSize) + { + CHECK_PRECONDITIONS(MASK_THREAD_CRITICAL,"Kern::CreateKernelMapObject"); + return M::CreateKernelMapObject(aMapObject, aMaxReserveSize); + } + + +/** +Maps an area of memory into the kernel address space and physically pins it. Supported by Kernel running +the flexible memory model. + +The memory to map and pin is defined by its existing virtual mapping (via the aStart, aSize & aThread parameters). +On return, if aPages is not NULL, aPages will be populated with the list of physical pages mapped. + +This operation is provided to enable device drivers to not only operate DMA transfers on memory which was not +originally mapped to the kernel address space (but to user client's, instead) but also read or modify the data +from kernel context, e.g. a DFC. + +The act of mapping the memory means that it is guaranteed to be excluded from RAM defragmentation. The new mapping +will also be protected from the effects of demand paging. Once mapped the memory is also guaranteed not to be reused for +some other purpose - even if the process owning the memory decommits it or terminates. + +Note that this operation may fail with KErrNoMemory if the kernel mapping object was created with aMaxReserveSize==0 +or the memory to be mapped is demand paged. + +@param aMapObject A kernel map object previously created by calling Kern::CreateKernelMapObject(). +@param aThread The thread that owns the memory to map, or NULL to use the current thread. +@param aStart Virtual address of memory to map. +@param aSize The length (in bytes) of memory to map. +@param aMapAttributes A bit mask of TKernelMapAttributes attributes for the mapping. +@param aKernelAddr Set to the base linear address of the new kernel mapping. This is the address to use when accessing + the memory from kernel side and to pass to cache maintence operations before and after performing + DMA operations. +@param aPages Points to area of TPhysAddr which will on exit hold the addresses of the physical pages contained + in the specified region. The array must be large enough to hold the whole list of pages in the region. + Set aPages to NULL if the physical addresses of the pages being mapped are not required. + +@return KErrNone, if successful, + KErrInUse if aMapObject is already mapping some memory, + KErrArgument if aSize is larger than the argument aMaxReserveSize of Kern::CreateKernelMapObject() + when creating aMapObject or aMapAttributes has invalid bits set. + KErrNotSupported on memory models other then flexible. + Otherwise one of the other system-wide error codes. + +@pre Interrupts must be enabled. +@pre Kernel must be unlocked. +@pre No fast mutex can be held. +@pre Call in a thread context. +@pre Can be used in a device driver. + +@see Kern::UnmapAndUnpinMemory() +@see Cache::SyncMemoryBeforeDmaWrite() +@see Cache::SyncMemoryBeforeDmaRead() +@see Cache::SyncMemoryAfterDmaRead() +@prototype + */ +EXPORT_C TInt Kern::MapAndPinMemory(TKernelMapObject* aMapObject, DThread* aThread, TLinAddr aStart, TUint aSize, + TUint aMapAttributes, TLinAddr& aKernelAddr, TPhysAddr* aPages) + { + CHECK_PRECONDITIONS(MASK_THREAD_STANDARD,"Kern::MapAndPinMemory"); + if (~EKernelMap_ValidMask & aMapAttributes) + {// Invalid mapping attribute flags set. + return KErrArgument; + } + if (aThread == NULL) + aThread = TheCurrentThread; + if (aSize == 0) + return KErrNone; + NKern::ThreadEnterCS(); + TInt r = M::MapAndPinMemory(aMapObject, aThread, aStart, aSize, aMapAttributes, aKernelAddr, aPages); + NKern::ThreadLeaveCS(); + return r; + } + + +/** +Unmaps and unpins an area of memory previously mapped by calling Kern::MapAndPinMemory(). + +@param aMapObject The kernel mapping object used to map and pin the memory. + +@pre Interrupts must be enabled. +@pre Kernel must be unlocked. +@pre No fast mutex can be held. +@pre Call in a thread context. +@pre Can be used in a device driver. + +@see Kern::MapAndPinMemory() + +@prototype +*/ +EXPORT_C void Kern::UnmapAndUnpinMemory(TKernelMapObject* aMapObject) + { + CHECK_PRECONDITIONS(MASK_THREAD_STANDARD,"Kern::UnmapAndUnpinMemory"); + NKern::ThreadEnterCS(); + M::UnmapAndUnpinMemory(aMapObject); + NKern::ThreadLeaveCS(); + } + + +/** +Dispose of a kernel mapping object which is no longer required. + +Any memory mapped and pinned by the object is unmapped and unpinned first. + +@param aMapObject A reference to a pointer to the mapping object to destroy. + This pointer will be set to NULL on return. + +@pre Calling thread must be in a critical section +@pre Interrupts must be enabled. +@pre Kernel must be unlocked. +@pre No fast mutex can be held. +@pre Call in a thread context. +@pre Suitable for use in a device driver. + +@see Kern::CreateKernelMapObject() + +@prototype +*/ +EXPORT_C void Kern::DestroyKernelMapObject(TKernelMapObject*& aMapObject) + { + CHECK_PRECONDITIONS(MASK_THREAD_CRITICAL,"Kern::DestroyKernelMapObject"); + M::DestroyKernelMapObject(aMapObject); + }
--- a/kernel/eka/memmodel/emul/win32/mutils.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/memmodel/emul/win32/mutils.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -384,6 +384,32 @@ Kern::AsyncFree(object); } +// +// Kernel map and pin (Not supported on the emulator). +// + +TInt M::CreateKernelMapObject(TKernelMapObject*&, TUint) + { + return KErrNotSupported; + } + + +TInt M::MapAndPinMemory(TKernelMapObject*, DThread*, TLinAddr, TUint, TUint, TLinAddr&, TPhysAddr*) + { + return KErrNotSupported; + } + + +void M::UnmapAndUnpinMemory(TKernelMapObject*) + { + } + + +void M::DestroyKernelMapObject(TKernelMapObject*&) + { + } + + // Misc DPagingDevice methods EXPORT_C void DPagingDevice::NotifyIdle()
--- a/kernel/eka/memmodel/epoc/direct/mutils.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/memmodel/epoc/direct/mutils.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -644,6 +644,33 @@ K::Fault(K::EPhysicalPinObjectBad); } + +// +// Kernel map and pin (Not supported on the direct memory models). +// + +TInt M::CreateKernelMapObject(TKernelMapObject*&, TUint) + { + return KErrNotSupported; + } + + +TInt M::MapAndPinMemory(TKernelMapObject*, DThread*, TLinAddr, TUint, TUint, TLinAddr&, TPhysAddr*) + { + return KErrNotSupported; + } + + +void M::UnmapAndUnpinMemory(TKernelMapObject*) + { + } + + +void M::DestroyKernelMapObject(TKernelMapObject*&) + { + } + + // Misc DPagingDevice methods EXPORT_C void DPagingDevice::NotifyIdle()
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mmapping.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/memmodel/epoc/flexible/mmu/mmapping.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -63,6 +63,12 @@ DMemoryMapping::~DMemoryMapping() { TRACE(("DMemoryMapping[0x%08x]::~DMemoryMapping()",this)); + Destruct(); + } + + +void DMemoryMapping::Destruct() + { __NK_ASSERT_DEBUG(!IsAttached()); // remove from address space... @@ -1258,6 +1264,74 @@ } +// +// DKernelPinMapping +// +DKernelPinMapping::DKernelPinMapping() + // : iReservePages(0) // Allocated on the kernel heap so will already be 0. + { + Flags() |= EPhysicalPinningMapping | EPinned; + } + + +TInt DKernelPinMapping::Construct(TUint aReserveMaxSize) + { + TInt r = KErrNone; + if (aReserveMaxSize) + { + // Should not call Construct() on a mapping that has already reserved resources. + __NK_ASSERT_DEBUG(!iReservePages); + r = DFineMapping::Construct(EMemoryAttributeStandard, + EMappingCreateReserveAllResources, + KKernelOsAsid, + 0, + aReserveMaxSize, + 0); + if (r == KErrNone) + iReservePages = aReserveMaxSize >> KPageShift; + } + return r; + } + + +TInt DKernelPinMapping::MapAndPin(DMemoryObject* aMemory, TUint aIndex, TUint aCount, TMappingPermissions aPermissions) + { + if (IsAttached()) + { + return KErrInUse; + } + + if (!iReservePages) + { + TInt r = DFineMapping::Construct( EMemoryAttributeStandard, + EMappingCreateDefault, + KKernelOsAsid, + 0, + aCount, + 0); + if (r != KErrNone) + return r; + } + // Map the memory, this will pin it first then map it. + TInt r = DFineMapping::Map(aMemory, aIndex, aCount, aPermissions); + + if (r != KErrNone && !iReservePages) + {// Reset this mapping object so it can be reused but has freed its address space. + DMemoryMapping::Destruct(); + } + return r; + } + + +void DKernelPinMapping::UnmapAndUnpin() + { + DFineMapping::Unmap(); + if (!iReservePages) + {// Reset this mapping object so it can be reused but has freed its address space. + DMemoryMapping::Destruct(); + } + } + // // DPhysicalPinMapping @@ -1269,41 +1343,6 @@ } -TInt DPhysicalPinMapping::PhysAddr(TUint aIndex, TUint aCount, TPhysAddr& aPhysicalAddress, TPhysAddr* aPhysicalPageList) - { - __NK_ASSERT_ALWAYS(IsAttached()); - - __NK_ASSERT_ALWAYS(TUint(aIndex+aCount)>aIndex && TUint(aIndex+aCount)<=iSizeInPages); - aIndex += iStartIndex; - - DCoarseMemory* memory = (DCoarseMemory*)Memory(true); // safe because we should only be called whilst memory is Pinned - TInt r = memory->PhysAddr(aIndex,aCount,aPhysicalAddress,aPhysicalPageList); - if(r!=KErrNone) - return r; - - if(memory->IsDemandPaged() && !IsReadOnly()) - { - // the memory is demand paged and writeable so we need to mark it as dirty - // as we have to assume that the memory will be modified via the physical - // addresses we return... - MmuLock::Lock(); - TPhysAddr* pages = aPhysicalPageList; - TUint count = aCount; - while(count) - { - SPageInfo* pi = SPageInfo::FromPhysAddr(*(pages++)); - pi->SetDirty(); - if((count&(KMaxPageInfoUpdatesInOneGo-1))==0) - MmuLock::Flash(); // flash lock every KMaxPageInfoUpdatesInOneGo iterations of the loop - --count; - } - MmuLock::Unlock(); - } - - return KErrNone; - } - - TInt DPhysicalPinMapping::Pin(DMemoryObject* aMemory, TUint aIndex, TUint aCount, TMappingPermissions aPermissions) { PteType() = Mmu::PteType(aPermissions,true); @@ -1714,6 +1753,41 @@ } +TInt DMemoryMappingBase::PhysAddr(TUint aIndex, TUint aCount, TPhysAddr& aPhysicalAddress, TPhysAddr* aPhysicalPageList) + { + __NK_ASSERT_ALWAYS(IsAttached() && IsPhysicalPinning()); + + __NK_ASSERT_ALWAYS(TUint(aIndex+aCount)>aIndex && TUint(aIndex+aCount)<=iSizeInPages); + aIndex += iStartIndex; + + DCoarseMemory* memory = (DCoarseMemory*)Memory(true); // safe because we should only be called whilst memory is Pinned + TInt r = memory->PhysAddr(aIndex,aCount,aPhysicalAddress,aPhysicalPageList); + if(r!=KErrNone) + return r; + + if(memory->IsDemandPaged() && !IsReadOnly()) + { + // the memory is demand paged and writeable so we need to mark it as dirty + // as we have to assume that the memory will be modified via the physical + // addresses we return... + MmuLock::Lock(); + TPhysAddr* pages = aPhysicalPageList; + TUint count = aCount; + while(count) + { + SPageInfo* pi = SPageInfo::FromPhysAddr(*(pages++)); + pi->SetDirty(); + if((count&(KMaxPageInfoUpdatesInOneGo-1))==0) + MmuLock::Flash(); // flash lock every KMaxPageInfoUpdatesInOneGo iterations of the loop + --count; + } + MmuLock::Unlock(); + } + + return KErrNone; + } + + // // Debug
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mmapping.h Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/memmodel/epoc/flexible/mmu/mmapping.h Tue Jan 26 13:13:38 2010 +0200 @@ -273,6 +273,33 @@ */ void UnlinkFromMemory(TMappingList& aMappingList); + /** + Get the physical address(es) for a region of pages in this mapping. + + @param aIndex Page index, within the mapping, for start of the region. + @param aCount Number of pages in the region. + @param aPhysicalAddress On success, this value is set to one of two values. + If the specified region is physically contiguous, + the value is the physical address of the first page + in the region. If the region is discontiguous, the + value is set to KPhysAddrInvalid. + @param aPhysicalPageList If not zero, this points to an array of TPhysAddr + objects. On success, this array will be filled + with the addresses of the physical pages which + contain the specified region. If aPageList is + zero, then the function will fail with + KErrNotFound if the specified region is not + physically contiguous. + + @return 0 if successful and the whole region is physically contiguous. + 1 if successful but the region isn't physically contiguous. + KErrNotFound, if any page in the region is not present, + otherwise one of the system wide error codes. + + @pre This mapping must have been attached to a memory object with #Pin. + */ + TInt PhysAddr(TUint aIndex, TUint aCount, TPhysAddr& aPhysicalAddress, TPhysAddr* aPhysicalPageList); + protected: /** @param aType Initial value for #Flags. @@ -676,6 +703,12 @@ ~DMemoryMapping(); /** + Free any resources owned by this mapping, i.e. allow Construct() to be used + on this mapping at a new address etc. + */ + void Destruct(); + + /** Allocatate virtual addresses for this mapping to use. This is called from #Construct and the arguments to this function are the same. @@ -872,6 +905,25 @@ }; +/** +A mapping which maps any memory into the kernel address space and provides access to +the physical address used by a memory object. + +These mappings are always of the 'pinned' type to prevent the obtained physical addresses +from becoming invalid. +*/ +class DKernelPinMapping : public DFineMapping + { +public: + DKernelPinMapping(); + TInt Construct(TUint aReserveSize); + TInt MapAndPin(DMemoryObject* aMemory, TUint aIndex, TUint aCount, TMappingPermissions aPermissions); + void UnmapAndUnpin(); + +public: + TInt iReservePages; ///< The number of pages this mapping is able to map with its reserved resources(page tables etc). + }; + /** A mapping which provides access to the physical address used by a memory object @@ -914,32 +966,6 @@ */ virtual void Unpin(); - /** - Get the physical address(es) for a region of pages in this mapping. - - @param aIndex Page index, within the mapping, for start of the region. - @param aCount Number of pages in the region. - @param aPhysicalAddress On success, this value is set to one of two values. - If the specified region is physically contiguous, - the value is the physical address of the first page - in the region. If the region is discontiguous, the - value is set to KPhysAddrInvalid. - @param aPhysicalPageList If not zero, this points to an array of TPhysAddr - objects. On success, this array will be filled - with the addresses of the physical pages which - contain the specified region. If aPageList is - zero, then the function will fail with - KErrNotFound if the specified region is not - physically contiguous. - - @return 0 if successful and the whole region is physically contiguous. - 1 if successful but the region isn't physically contiguous. - KErrNotFound, if any page in the region is not present, - otherwise one of the system wide error codes. - - @pre This mapping must have been attached to a memory object with #Pin. - */ - TInt PhysAddr(TUint aIndex, TUint aCount, TPhysAddr& aPhysicalAddress, TPhysAddr* aPhysicalPageList); private: // from DMemoryMappingBase... virtual TInt MapPages(RPageArray::TIter aPages, TUint aMapInstanceCount); ///< Not implemented. Faults in debug builds.
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mmu.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/memmodel/epoc/flexible/mmu/mmu.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -733,8 +733,6 @@ if(mapping) { - // Pinning mappings should not be found from within an address space. - __NK_ASSERT_DEBUG(!mapping->IsPinned()); MmuLock::Lock(); // check if we need to process page fault... @@ -747,6 +745,10 @@ } else { + // Should not be able to take a fault on a pinned mapping if accessing it + // with the correct permissions. + __NK_ASSERT_DEBUG(!mapping->IsPinned()); + // we do need to handle fault so is this a demand paging or page moving fault DMemoryObject* memory = mapping->Memory(); if(!memory) @@ -2161,7 +2163,7 @@ TInt M::PinVirtualMemory(TVirtualPinObject* aPinObject, TLinAddr aStart, TUint aSize, DThread* aThread) { - NKern::ThreadEnterCS(); + __ASSERT_CRITICAL; TUint offsetInMapping; TUint mapInstanceCount; DMemoryMapping* mapping = MM::FindMappingInThread( (DMemModelThread*)aThread, @@ -2205,16 +2207,14 @@ } } mapping->Close(); - } - NKern::ThreadLeaveCS(); - + } return r; } TInt M::CreateAndPinVirtualMemory(TVirtualPinObject*& aPinObject, TLinAddr aStart, TUint aSize) { + __ASSERT_CRITICAL; aPinObject = 0; - NKern::ThreadEnterCS(); TUint offsetInMapping; TUint mapInstanceCount; DMemoryMapping* mapping = MM::FindMappingInThread( (DMemModelThread*)&Kern::CurrentThread(), @@ -2264,9 +2264,7 @@ } } mapping->Close(); - } - NKern::ThreadLeaveCS(); - + } return r; } @@ -2288,20 +2286,20 @@ } } +// +// Physical pinning +// + TInt M::CreatePhysicalPinObject(TPhysicalPinObject*& aPinObject) { aPinObject = (TPhysicalPinObject*)new DPhysicalPinMapping; return aPinObject != NULL ? KErrNone : KErrNoMemory; } -// -// Physical pinning -// - TInt M::PinPhysicalMemory(TPhysicalPinObject* aPinObject, TLinAddr aStart, TUint aSize, TBool aReadOnly, TPhysAddr& aAddress, TPhysAddr* aPages, TUint32& aMapAttr, TUint& aColour, DThread* aThread) { - NKern::ThreadEnterCS(); + __ASSERT_CRITICAL; TUint offsetInMapping; TUint mapInstanceCount; DMemoryMapping* mapping = MM::FindMappingInThread( (DMemModelThread*)aThread, @@ -2345,7 +2343,6 @@ } mapping->Close(); } - NKern::ThreadLeaveCS(); aColour = (aStart >>KPageShift) & KPageColourMask; return r; } @@ -2369,6 +2366,111 @@ } +// +// Kernel map and pin. +// + +TInt M::CreateKernelMapObject(TKernelMapObject*& aMapObject, TUint aMaxReserveSize) + { + DKernelPinMapping* pinObject = new DKernelPinMapping(); + aMapObject = (TKernelMapObject*) pinObject; + if (pinObject == NULL) + { + return KErrNoMemory; + } + // Ensure we reserve enough bytes for all possible alignments of the start and + // end of the region to map. + TUint reserveBytes = aMaxReserveSize? ((aMaxReserveSize + KPageMask) & ~KPageMask) + KPageSize : 0; + TInt r = pinObject->Construct(reserveBytes); + if (r != KErrNone) + {// Failed so delete the kernel mapping object. + pinObject->Close(); + aMapObject = NULL; + } + return r; + } + + +TInt M::MapAndPinMemory(TKernelMapObject* aMapObject, DThread* aThread, TLinAddr aStart, + TUint aSize, TUint aMapAttributes, TLinAddr& aKernelAddr, TPhysAddr* aPages) + { + __ASSERT_CRITICAL; + TUint offsetInMapping; + TUint mapInstanceCount; + DMemoryMapping* mapping = MM::FindMappingInThread( (DMemModelThread*)aThread, + aStart, + aSize, + offsetInMapping, + mapInstanceCount); + TInt r = KErrBadDescriptor; + if (mapping) + { + DKernelPinMapping* kernelMap = (DKernelPinMapping*)aMapObject; + TInt count = (((aStart + aSize + KPageMask) & ~KPageMask) - (aStart & ~KPageMask)) >> KPageShift; + if (kernelMap->iReservePages && kernelMap->iReservePages < count) + { + mapping->Close(); + return KErrArgument; + } + + MmuLock::Lock(); + DMemoryObject* memory = mapping->Memory(); + if (mapInstanceCount == mapping->MapInstanceCount() && memory) + { + memory->Open(); + MmuLock::Unlock(); + + TUint startInMemory = (offsetInMapping >> KPageShift) + mapping->iStartIndex; + TBool readOnly = aMapAttributes & Kern::EKernelMap_ReadOnly; + TMappingPermissions permissions = readOnly ? ESupervisorReadOnly : ESupervisorReadWrite; + r = kernelMap->MapAndPin(memory, startInMemory, count, permissions); + if (r == KErrNone) + { + __NK_ASSERT_DEBUG(!kernelMap->IsUserMapping()); + aKernelAddr = kernelMap->Base(); + TPhysAddr contigAddr; // Ignore this value as aPages will be populated + // whether the memory is contiguous or not. + r = kernelMap->PhysAddr(0, count, contigAddr, aPages); + if (r>=KErrNone) + { + r = KErrNone; //Do not report discontiguous memory in return value. + } + else + { + UnmapAndUnpinMemory((TKernelMapObject*)kernelMap); + } + } + memory->Close(); + } + else // mapping has been reused or no memory... + { + MmuLock::Unlock(); + } + mapping->Close(); + } + return r; + } + + +void M::UnmapAndUnpinMemory(TKernelMapObject* aMapObject) + { + DKernelPinMapping* mapping = (DKernelPinMapping*)aMapObject; + if (mapping->IsAttached()) + mapping->UnmapAndUnpin(); + } + + +void M::DestroyKernelMapObject(TKernelMapObject*& aMapObject) + { + DKernelPinMapping* mapping = (DKernelPinMapping*)__e32_atomic_swp_ord_ptr(&aMapObject, 0); + if (mapping) + { + if (mapping->IsAttached()) + mapping->UnmapAndUnpin(); + mapping->AsyncClose(); + } + } + // // Cache sync operations
--- a/kernel/eka/memmodel/epoc/mmubase/mmubase.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/memmodel/epoc/mmubase/mmubase.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -5196,6 +5196,33 @@ K::Fault(K::EPhysicalPinObjectBad); } + +// +// Kernel map and pin (Not supported on the moving or multiple memory models). +// + +TInt M::CreateKernelMapObject(TKernelMapObject*&, TUint) + { + return KErrNotSupported; + } + + +TInt M::MapAndPinMemory(TKernelMapObject*, DThread*, TLinAddr, TUint, TUint, TLinAddr&, TPhysAddr*) + { + return KErrNotSupported; + } + + +void M::UnmapAndUnpinMemory(TKernelMapObject*) + { + } + + +void M::DestroyKernelMapObject(TKernelMapObject*&) + { + } + + // Misc DPagingDevice methods EXPORT_C void DPagingDevice::NotifyIdle()
--- a/kernel/eka/release.txt Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/release.txt Tue Jan 26 13:13:38 2010 +0200 @@ -1,3 +1,29 @@ +Version 2.00.2065 +================= +(Made by vfebvre 17/12/2009) + +1. vfebvre + 1. MILESTONE: GT0515, MS3.16 + RM-RIM REQ417-52763: HCR: Final delivery (Reference implementation and Docs) + Gaia Feature Release 422961 Package Release 428954 + + +Version 2.00.2064 +================= +(Made by vfebvre 17/12/2009) + +1. patrickconway + 1. MILESTONE: GT0515, MS3.31 + RM-RIM REQ417-53000: Instrument local media subsystem and media drivers + Gaia Feature Release 424355 Package Release 424358 + +2. MarkTa + 1. DEFECT FIX: DEF143438: Flexible memory model is missing an api to map any memory kernel side + Add new TKernelMapObject and Kern methods that use it to allow device drivers to map and physically + pin any memory. The memory can then be accessed from kernel side for DMA operations and without + the effects of ram defrag and demandpaging. + + Version 2.00.2063 ================= (Made by vfebvre 16/12/2009)
--- a/kernel/eka/rombuild/nandtest_load.oby Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/rombuild/nandtest_load.oby Tue Jan 26 13:13:38 2010 +0200 @@ -83,3 +83,5 @@ #endif data=smr1.img \smr1.img +data=\epoc32\data\smr_part_102400.img \smr2.img +
--- a/kerneltest/e32test/group/romstuff.mke Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/group/romstuff.mke Tue Jan 26 13:13:38 2010 +0200 @@ -32,7 +32,9 @@ @echo data=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\empty.dat sys\data\empty.dat unpaged paging_unmovable @echo data=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\filerepos.dat sys\data\filerepos.dat unpaged paging_unmovable @echo data=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\nandrepos.dat sys\data\nandrepos.dat unpaged paging_unmovable - @echo data=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\megalarge1.dat \sys\data\megalarge1.dat unpaged paging_unmovable - @echo data=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\megalarge2.dat \sys\data\megalarge2.dat unpaged paging_unmovable + @echo data=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\megalarge1.dat sys\data\megalarge1.dat unpaged paging_unmovable + @echo data=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\megalarge2.dat sys\data\megalarge2.dat unpaged paging_unmovable + @echo data=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\filerepos_bc0.dat sys\data\filerepos_bc0.dat unpaged paging_unmovable + @echo data=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\filerepos_bc1.dat sys\data\filerepos_bc1.dat unpaged paging_unmovable @echo hcrdata=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\filerepos.dat sys\data\hcr.dat #endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/hcr/HcrImageData_1024.h Tue Jan 26 13:13:38 2010 +0200 @@ -0,0 +1,76 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Hardware Configuration Respoitory Tests +// +// GENERATED FILE - DO NOT EDIT !!! +// This file can be use with SMR_PART_1024.img only! +// + +#ifndef HCRIMAGEDATA_1024_H +#define HCRIMAGEDATA_1024_H + +const TInt itemsSize = 37; + +typedef struct + { + TUint32 iCategoryUID; + TUint32 iElementID; + TInt32 iType; + TUint16 iFlags; + TUint16 iLen; + TUint32 iValue; + } SMRItem; + +const SMRItem items[itemsSize] = + { + { 0x10286af6, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286af6, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286af6, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286af6, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286af6, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286af6, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286af6, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286af6, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286af6, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286af6, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286af6, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286af6, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286af7, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286af7, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286af7, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286af7, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286af7, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286af7, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286af7, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286af7, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286af7, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286af7, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286af7, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286af7, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286af8, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286af8, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286af8, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286af8, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286af8, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286af8, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286af8, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286af8, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286af8, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286af8, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286af8, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286af8, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286af9, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + }; +#endif //HCRIMAGEDATA_1024_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/hcr/HcrImageData_10240.h Tue Jan 26 13:13:38 2010 +0200 @@ -0,0 +1,537 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Hardware Configuration Respoitory Tests +// +// GENERATED FILE - DO NOT EDIT !!! +// This file can be use with SMR_PART_10240.img only! +// + +#ifndef HCRIMAGEDATA_10240_H +#define HCRIMAGEDATA_10240_H + +const TInt itemsSize = 498; + +typedef struct + { + TUint32 iCategoryUID; + TUint32 iElementID; + TInt32 iType; + TUint16 iFlags; + TUint16 iLen; + TUint32 iValue; + } SMRItem; + +const SMRItem items[itemsSize] = + { + { 0x10286af6, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286af6, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286af6, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286af6, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286af6, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286af6, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286af6, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286af6, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286af6, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286af6, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286af6, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286af6, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286af7, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286af7, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286af7, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286af7, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286af7, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286af7, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286af7, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286af7, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286af7, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286af7, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286af7, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286af7, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286af8, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286af8, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286af8, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286af8, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286af8, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286af8, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286af8, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286af8, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286af8, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286af8, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286af8, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286af8, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286af9, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286af9, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286af9, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286af9, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286af9, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286af9, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286af9, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286af9, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286af9, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286af9, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286af9, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286af9, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286afa, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286afa, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286afa, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286afa, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286afa, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286afa, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286afa, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286afa, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286afa, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286afa, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286afa, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286afa, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286afb, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286afb, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286afb, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286afb, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286afb, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286afb, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286afb, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286afb, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286afb, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286afb, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286afb, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286afb, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286afc, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286afc, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286afc, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286afc, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286afc, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286afc, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286afc, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286afc, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286afc, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286afc, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286afc, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286afc, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286afd, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286afd, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286afd, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286afd, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286afd, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286afd, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286afd, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286afd, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286afd, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286afd, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286afd, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286afd, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286afe, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286afe, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286afe, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286afe, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286afe, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286afe, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286afe, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286afe, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286afe, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286afe, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286afe, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286afe, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286aff, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286aff, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286aff, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286aff, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286aff, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286aff, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286aff, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286aff, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286aff, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286aff, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286aff, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286aff, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b00, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b00, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b00, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b00, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b00, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b00, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b00, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b00, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b00, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b00, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b00, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b00, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b01, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b01, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b01, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b01, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b01, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b01, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b01, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b01, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b01, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b01, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b01, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b01, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b02, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b02, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b02, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b02, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b02, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b02, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b02, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b02, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b02, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b02, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b02, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b02, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b03, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b03, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b03, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b03, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b03, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b03, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b03, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b03, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b03, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b03, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b03, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b03, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b04, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b04, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b04, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b04, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b04, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b04, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b04, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b04, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b04, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b04, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b04, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b04, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b05, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b05, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b05, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b05, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b05, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b05, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b05, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b05, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b05, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b05, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b05, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b05, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b06, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b06, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b06, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b06, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b06, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b06, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b06, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b06, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b06, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b06, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b06, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b06, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b07, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b07, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b07, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b07, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b07, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b07, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b07, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b07, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b07, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b07, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b07, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b07, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b08, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b08, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b08, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b08, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b08, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b08, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b08, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b08, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b08, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b08, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b08, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b08, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b09, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b09, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b09, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b09, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b09, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b09, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b09, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b09, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b09, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b09, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b09, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b09, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b0a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b0a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b0a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b0a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b0a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b0a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b0a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b0a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b0a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b0a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b0a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b0a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b0b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b0b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b0b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b0b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b0b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b0b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b0b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b0b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b0b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b0b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b0b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b0b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b0c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b0c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b0c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b0c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b0c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b0c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b0c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b0c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b0c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b0c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b0c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b0c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b0d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b0d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b0d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b0d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b0d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b0d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b0d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b0d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b0d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b0d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b0d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b0d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b0e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b0e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b0e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b0e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b0e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b0e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b0e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b0e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b0e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b0e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b0e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b0e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b0f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b0f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b0f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b0f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b0f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b0f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b0f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b0f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b0f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b0f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b0f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b0f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b10, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b10, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b10, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b10, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b10, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b10, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b10, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b10, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b10, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b10, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b10, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b10, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b11, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b11, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b11, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b11, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b11, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b11, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b11, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b11, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b11, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b11, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b11, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b11, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b12, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b12, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b12, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b12, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b12, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b12, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b12, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b12, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b12, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b12, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b12, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b12, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b13, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b13, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b13, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b13, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b13, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b13, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b13, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b13, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b13, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b13, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b13, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b13, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b14, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b14, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b14, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b14, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b14, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b14, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b14, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b14, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b14, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b14, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b14, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b14, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b15, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b15, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b15, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b15, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b15, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b15, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b15, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b15, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b15, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b15, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b15, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b15, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b16, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b16, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b16, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b16, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b16, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b16, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b16, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b16, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b16, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b16, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b16, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b16, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b17, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b17, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b17, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b17, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b17, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b17, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b17, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b17, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b17, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b17, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b17, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b17, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b18, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b18, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b18, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b18, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b18, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b18, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b18, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b18, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b18, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b18, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b18, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b18, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b19, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b19, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b19, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b19, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b19, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b19, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b19, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b19, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b19, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b19, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b19, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b19, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b1a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b1a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b1a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b1a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b1a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b1a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b1a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b1a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b1a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b1a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b1a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b1a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b1b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b1b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b1b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b1b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b1b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b1b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b1b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b1b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b1b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b1b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b1b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b1b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b1c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b1c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b1c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b1c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b1c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b1c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b1c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b1c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b1c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b1c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b1c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b1c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b1d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b1d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b1d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b1d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b1d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b1d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b1d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b1d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b1d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b1d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b1d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b1d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b1e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b1e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b1e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b1e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b1e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b1e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b1e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b1e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b1e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b1e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b1e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b1e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b1f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b1f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b1f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b1f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b1f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b1f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + }; +#endif //HCRIMAGEDATA_10240_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/hcr/HcrImageData_102400.h Tue Jan 26 13:13:38 2010 +0200 @@ -0,0 +1,5145 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Hardware Configuration Respoitory Tests +// +// GENERATED FILE - DO NOT EDIT !!! +// This file can be use with SMR_PART_102400.img only! +// + +#ifndef HCRIMAGEDATA_102400_H +#define HCRIMAGEDATA_102400_H + +const TInt itemsSize = 5106; + +typedef struct + { + TUint32 iCategoryUID; + TUint32 iElementID; + TInt32 iType; + TUint16 iFlags; + TUint16 iLen; + TUint32 iValue; + } SMRItem; + +const SMRItem items[itemsSize] = + { + { 0x10286af6, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286af6, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286af6, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286af6, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286af6, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286af6, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286af6, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286af6, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286af6, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286af6, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286af6, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286af6, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286af7, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286af7, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286af7, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286af7, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286af7, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286af7, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286af7, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286af7, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286af7, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286af7, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286af7, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286af7, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286af8, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286af8, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286af8, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286af8, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286af8, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286af8, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286af8, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286af8, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286af8, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286af8, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286af8, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286af8, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286af9, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286af9, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286af9, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286af9, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286af9, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286af9, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286af9, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286af9, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286af9, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286af9, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286af9, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286af9, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286afa, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286afa, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286afa, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286afa, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286afa, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286afa, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286afa, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286afa, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286afa, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286afa, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286afa, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286afa, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286afb, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286afb, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286afb, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286afb, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286afb, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286afb, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286afb, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286afb, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286afb, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286afb, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286afb, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286afb, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286afc, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286afc, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286afc, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286afc, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286afc, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286afc, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286afc, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286afc, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286afc, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286afc, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286afc, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286afc, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286afd, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286afd, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286afd, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286afd, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286afd, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286afd, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286afd, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286afd, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286afd, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286afd, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286afd, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286afd, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286afe, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286afe, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286afe, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286afe, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286afe, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286afe, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286afe, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286afe, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286afe, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286afe, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286afe, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286afe, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286aff, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286aff, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286aff, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286aff, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286aff, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286aff, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286aff, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286aff, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286aff, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286aff, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286aff, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286aff, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b00, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b00, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b00, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b00, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b00, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b00, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b00, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b00, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b00, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b00, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b00, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b00, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b01, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b01, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b01, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b01, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b01, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b01, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b01, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b01, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b01, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b01, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b01, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b01, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b02, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b02, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b02, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b02, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b02, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b02, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b02, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b02, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b02, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b02, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b02, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b02, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b03, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b03, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b03, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b03, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b03, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b03, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b03, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b03, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b03, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b03, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b03, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b03, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b04, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b04, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b04, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b04, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b04, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b04, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b04, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b04, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b04, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b04, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b04, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b04, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b05, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b05, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b05, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b05, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b05, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b05, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b05, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b05, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b05, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b05, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b05, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b05, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b06, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b06, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b06, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b06, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b06, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b06, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b06, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b06, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b06, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b06, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b06, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b06, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b07, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b07, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b07, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b07, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b07, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b07, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b07, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b07, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b07, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b07, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b07, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b07, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b08, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b08, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b08, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b08, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b08, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b08, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b08, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b08, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b08, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b08, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b08, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b08, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b09, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b09, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b09, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b09, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b09, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b09, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b09, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b09, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b09, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b09, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b09, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b09, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b0a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b0a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b0a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b0a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b0a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b0a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b0a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b0a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b0a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b0a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b0a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b0a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b0b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b0b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b0b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b0b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b0b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b0b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b0b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b0b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b0b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b0b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b0b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b0b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b0c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b0c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b0c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b0c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b0c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b0c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b0c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b0c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b0c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b0c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b0c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b0c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b0d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b0d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b0d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b0d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b0d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b0d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b0d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b0d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b0d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b0d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b0d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b0d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b0e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b0e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b0e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b0e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b0e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b0e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b0e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b0e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b0e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b0e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b0e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b0e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b0f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b0f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b0f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b0f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b0f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b0f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b0f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b0f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b0f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b0f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b0f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b0f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b10, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b10, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b10, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b10, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b10, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b10, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b10, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b10, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b10, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b10, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b10, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b10, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b11, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b11, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b11, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b11, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b11, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b11, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b11, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b11, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b11, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b11, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b11, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b11, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b12, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b12, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b12, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b12, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b12, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b12, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b12, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b12, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b12, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b12, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b12, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b12, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b13, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b13, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b13, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b13, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b13, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b13, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b13, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b13, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b13, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b13, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b13, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b13, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b14, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b14, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b14, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b14, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b14, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b14, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b14, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b14, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b14, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b14, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b14, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b14, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b15, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b15, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b15, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b15, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b15, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b15, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b15, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b15, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b15, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b15, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b15, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b15, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b16, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b16, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b16, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b16, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b16, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b16, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b16, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b16, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b16, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b16, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b16, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b16, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b17, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b17, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b17, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b17, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b17, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b17, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b17, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b17, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b17, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b17, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b17, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b17, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b18, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b18, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b18, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b18, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b18, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b18, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b18, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b18, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b18, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b18, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b18, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b18, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b19, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b19, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b19, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b19, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b19, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b19, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b19, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b19, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b19, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b19, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b19, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b19, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b1a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b1a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b1a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b1a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b1a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b1a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b1a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b1a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b1a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b1a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b1a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b1a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b1b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b1b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b1b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b1b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b1b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b1b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b1b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b1b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b1b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b1b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b1b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b1b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b1c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b1c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b1c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b1c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b1c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b1c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b1c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b1c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b1c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b1c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b1c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b1c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b1d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b1d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b1d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b1d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b1d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b1d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b1d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b1d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b1d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b1d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b1d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b1d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b1e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b1e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b1e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b1e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b1e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b1e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b1e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b1e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b1e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b1e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b1e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b1e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b1f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b1f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b1f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b1f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b1f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b1f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b1f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b1f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b1f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b1f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b1f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b1f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b20, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b20, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b20, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b20, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b20, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b20, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b20, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b20, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b20, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b20, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b20, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b20, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b21, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b21, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b21, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b21, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b21, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b21, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b21, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b21, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b21, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b21, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b21, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b21, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b22, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b22, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b22, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b22, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b22, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b22, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b22, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b22, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b22, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b22, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b22, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b22, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b23, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b23, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b23, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b23, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b23, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b23, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b23, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b23, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b23, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b23, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b23, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b23, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b24, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b24, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b24, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b24, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b24, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b24, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b24, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b24, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b24, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b24, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b24, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b24, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b25, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b25, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b25, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b25, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b25, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b25, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b25, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b25, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b25, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b25, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b25, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b25, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b26, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b26, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b26, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b26, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b26, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b26, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b26, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b26, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b26, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b26, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b26, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b26, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b27, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b27, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b27, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b27, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b27, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b27, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b27, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b27, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b27, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b27, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b27, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b27, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b28, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b28, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b28, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b28, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b28, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b28, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b28, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b28, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b28, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b28, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b28, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b28, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b29, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b29, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b29, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b29, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b29, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b29, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b29, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b29, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b29, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b29, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b29, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b29, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b2a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b2a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b2a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b2a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b2a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b2a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b2a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b2a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b2a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b2a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b2a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b2a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b2b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b2b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b2b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b2b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b2b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b2b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b2b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b2b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b2b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b2b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b2b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b2b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b2c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b2c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b2c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b2c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b2c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b2c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b2c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b2c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b2c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b2c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b2c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b2c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b2d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b2d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b2d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b2d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b2d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b2d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b2d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b2d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b2d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b2d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b2d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b2d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b2e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b2e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b2e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b2e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b2e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b2e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b2e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b2e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b2e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b2e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b2e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b2e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b2f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b2f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b2f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b2f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b2f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b2f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b2f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b2f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b2f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b2f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b2f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b2f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b30, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b30, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b30, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b30, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b30, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b30, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b30, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b30, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b30, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b30, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b30, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b30, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b31, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b31, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b31, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b31, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b31, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b31, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b31, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b31, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b31, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b31, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b31, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b31, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b32, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b32, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b32, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b32, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b32, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b32, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b32, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b32, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b32, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b32, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b32, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b32, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b33, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b33, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b33, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b33, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b33, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b33, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b33, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b33, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b33, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b33, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b33, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b33, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b34, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b34, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b34, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b34, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b34, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b34, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b34, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b34, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b34, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b34, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b34, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b34, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b35, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b35, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b35, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b35, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b35, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b35, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b35, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b35, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b35, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b35, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b35, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b35, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b36, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b36, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b36, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b36, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b36, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b36, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b36, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b36, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b36, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b36, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b36, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b36, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b37, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b37, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b37, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b37, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b37, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b37, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b37, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b37, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b37, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b37, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b37, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b37, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b38, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b38, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b38, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b38, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b38, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b38, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b38, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b38, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b38, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b38, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b38, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b38, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b39, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b39, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b39, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b39, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b39, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b39, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b39, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b39, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b39, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b39, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b39, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b39, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b3a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b3a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b3a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b3a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b3a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b3a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b3a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b3a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b3a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b3a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b3a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b3a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b3b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b3b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b3b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b3b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b3b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b3b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b3b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b3b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b3b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b3b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b3b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b3b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b3c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b3c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b3c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b3c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b3c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b3c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b3c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b3c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b3c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b3c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b3c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b3c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b3d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b3d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b3d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b3d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b3d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b3d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b3d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b3d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b3d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b3d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b3d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b3d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b3e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b3e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b3e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b3e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b3e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b3e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b3e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b3e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b3e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b3e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b3e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b3e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b3f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b3f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b3f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b3f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b3f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b3f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b3f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b3f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b3f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b3f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b3f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b3f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b40, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b40, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b40, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b40, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b40, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b40, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b40, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b40, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b40, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b40, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b40, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b40, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b41, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b41, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b41, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b41, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b41, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b41, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b41, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b41, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b41, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b41, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b41, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b41, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b42, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b42, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b42, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b42, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b42, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b42, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b42, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b42, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b42, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b42, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b42, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b42, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b43, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b43, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b43, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b43, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b43, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b43, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b43, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b43, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b43, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b43, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b43, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b43, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b44, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b44, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b44, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b44, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b44, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b44, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b44, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b44, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b44, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b44, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b44, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b44, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b45, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b45, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b45, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b45, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b45, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b45, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b45, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b45, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b45, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b45, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b45, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b45, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b46, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b46, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b46, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b46, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b46, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b46, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b46, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b46, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b46, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b46, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b46, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b46, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b47, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b47, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b47, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b47, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b47, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b47, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b47, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b47, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b47, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b47, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b47, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b47, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b48, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b48, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b48, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b48, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b48, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b48, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b48, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b48, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b48, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b48, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b48, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b48, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b49, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b49, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b49, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b49, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b49, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b49, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b49, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b49, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b49, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b49, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b49, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b49, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b4a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b4a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b4a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b4a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b4a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b4a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b4a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b4a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b4a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b4a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b4a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b4a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b4b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b4b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b4b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b4b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b4b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b4b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b4b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b4b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b4b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b4b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b4b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b4b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b4c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b4c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b4c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b4c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b4c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b4c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b4c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b4c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b4c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b4c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b4c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b4c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b4d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b4d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b4d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b4d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b4d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b4d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b4d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b4d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b4d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b4d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b4d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b4d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b4e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b4e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b4e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b4e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b4e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b4e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b4e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b4e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b4e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b4e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b4e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b4e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b4f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b4f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b4f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b4f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b4f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b4f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b4f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b4f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b4f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b4f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b4f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b4f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b50, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b50, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b50, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b50, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b50, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b50, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b50, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b50, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b50, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b50, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b50, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b50, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b51, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b51, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b51, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b51, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b51, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b51, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b51, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b51, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b51, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b51, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b51, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b51, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b52, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b52, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b52, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b52, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b52, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b52, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b52, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b52, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b52, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b52, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b52, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b52, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b53, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b53, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b53, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b53, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b53, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b53, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b53, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b53, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b53, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b53, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b53, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b53, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b54, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b54, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b54, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b54, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b54, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b54, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b54, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b54, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b54, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b54, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b54, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b54, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b55, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b55, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b55, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b55, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b55, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b55, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b55, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b55, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b55, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b55, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b55, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b55, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b56, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b56, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b56, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b56, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b56, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b56, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b56, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b56, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b56, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b56, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b56, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b56, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b57, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b57, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b57, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b57, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b57, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b57, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b57, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b57, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b57, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b57, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b57, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b57, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b58, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b58, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b58, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b58, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b58, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b58, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b58, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b58, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b58, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b58, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b58, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b58, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b59, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b59, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b59, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b59, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b59, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b59, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b59, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b59, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b59, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b59, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b59, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b59, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b5a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b5a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b5a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b5a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b5a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b5a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b5a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b5a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b5a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b5a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b5a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b5a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b5b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b5b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b5b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b5b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b5b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b5b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b5b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b5b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b5b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b5b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b5b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b5b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b5c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b5c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b5c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b5c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b5c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b5c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b5c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b5c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b5c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b5c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b5c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b5c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b5d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b5d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b5d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b5d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b5d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b5d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b5d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b5d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b5d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b5d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b5d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b5d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b5e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b5e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b5e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b5e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b5e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b5e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b5e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b5e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b5e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b5e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b5e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b5e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b5f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b5f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b5f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b5f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b5f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b5f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b5f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b5f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b5f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b5f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b5f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b5f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b60, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b60, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b60, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b60, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b60, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b60, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b60, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b60, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b60, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b60, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b60, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b60, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b61, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b61, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b61, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b61, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b61, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b61, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b61, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b61, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b61, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b61, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b61, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b61, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b62, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b62, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b62, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b62, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b62, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b62, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b62, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b62, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b62, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b62, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b62, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b62, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b63, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b63, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b63, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b63, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b63, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b63, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b63, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b63, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b63, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b63, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b63, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b63, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b64, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b64, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b64, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b64, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b64, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b64, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b64, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b64, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b64, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b64, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b64, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b64, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b65, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b65, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b65, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b65, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b65, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b65, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b65, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b65, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b65, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b65, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b65, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b65, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b66, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b66, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b66, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b66, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b66, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b66, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b66, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b66, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b66, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b66, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b66, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b66, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b67, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b67, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b67, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b67, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b67, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b67, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b67, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b67, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b67, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b67, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b67, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b67, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b68, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b68, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b68, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b68, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b68, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b68, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b68, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b68, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b68, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b68, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b68, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b68, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b69, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b69, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b69, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b69, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b69, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b69, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b69, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b69, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b69, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b69, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b69, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b69, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b6a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b6a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b6a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b6a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b6a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b6a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b6a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b6a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b6a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b6a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b6a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b6a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b6b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b6b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b6b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b6b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b6b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b6b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b6b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b6b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b6b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b6b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b6b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b6b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b6c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b6c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b6c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b6c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b6c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b6c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b6c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b6c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b6c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b6c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b6c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b6c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b6d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b6d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b6d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b6d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b6d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b6d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b6d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b6d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b6d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b6d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b6d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b6d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b6e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b6e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b6e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b6e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b6e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b6e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b6e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b6e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b6e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b6e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b6e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b6e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b6f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b6f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b6f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b6f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b6f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b6f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b6f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b6f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b6f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b6f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b6f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b6f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b70, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b70, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b70, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b70, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b70, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b70, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b70, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b70, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b70, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b70, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b70, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b70, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b71, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b71, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b71, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b71, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b71, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b71, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b71, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b71, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b71, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b71, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b71, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b71, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b72, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b72, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b72, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b72, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b72, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b72, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b72, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b72, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b72, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b72, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b72, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b72, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b73, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b73, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b73, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b73, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b73, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b73, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b73, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b73, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b73, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b73, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b73, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b73, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b74, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b74, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b74, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b74, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b74, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b74, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b74, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b74, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b74, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b74, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b74, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b74, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b75, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b75, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b75, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b75, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b75, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b75, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b75, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b75, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b75, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b75, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b75, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b75, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b76, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b76, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b76, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b76, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b76, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b76, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b76, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b76, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b76, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b76, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b76, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b76, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b77, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b77, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b77, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b77, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b77, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b77, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b77, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b77, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b77, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b77, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b77, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b77, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b78, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b78, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b78, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b78, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b78, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b78, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b78, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b78, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b78, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b78, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b78, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b78, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b79, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b79, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b79, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b79, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b79, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b79, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b79, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b79, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b79, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b79, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b79, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b79, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b7a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b7a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b7a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b7a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b7a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b7a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b7a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b7a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b7a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b7a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b7a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b7a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b7b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b7b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b7b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b7b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b7b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b7b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b7b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b7b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b7b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b7b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b7b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b7b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b7c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b7c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b7c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b7c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b7c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b7c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b7c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b7c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b7c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b7c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b7c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b7c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b7d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b7d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b7d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b7d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b7d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b7d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b7d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b7d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b7d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b7d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b7d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b7d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b7e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b7e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b7e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b7e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b7e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b7e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b7e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b7e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b7e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b7e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b7e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b7e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b7f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b7f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b7f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b7f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b7f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b7f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b7f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b7f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b7f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b7f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b7f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b7f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b80, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b80, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b80, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b80, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b80, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b80, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b80, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b80, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b80, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b80, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b80, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b80, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b81, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b81, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b81, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b81, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b81, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b81, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b81, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b81, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b81, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b81, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b81, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b81, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b82, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b82, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b82, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b82, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b82, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b82, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b82, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b82, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b82, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b82, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b82, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b82, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b83, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b83, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b83, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b83, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b83, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b83, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b83, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b83, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b83, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b83, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b83, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b83, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b84, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b84, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b84, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b84, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b84, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b84, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b84, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b84, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b84, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b84, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b84, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b84, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b85, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b85, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b85, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b85, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b85, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b85, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b85, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b85, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b85, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b85, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b85, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b85, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b86, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b86, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b86, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b86, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b86, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b86, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b86, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b86, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b86, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b86, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b86, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b86, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b87, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b87, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b87, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b87, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b87, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b87, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b87, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b87, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b87, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b87, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b87, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b87, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b88, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b88, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b88, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b88, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b88, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b88, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b88, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b88, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b88, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b88, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b88, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b88, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b89, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b89, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b89, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b89, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b89, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b89, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b89, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b89, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b89, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b89, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b89, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b89, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b8a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b8a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b8a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b8a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b8a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b8a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b8a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b8a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b8a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b8a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b8a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b8a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b8b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b8b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b8b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b8b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b8b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b8b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b8b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b8b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b8b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b8b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b8b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b8b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b8c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b8c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b8c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b8c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b8c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b8c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b8c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b8c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b8c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b8c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b8c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b8c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b8d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b8d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b8d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b8d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b8d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b8d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b8d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b8d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b8d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b8d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b8d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b8d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b8e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b8e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b8e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b8e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b8e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b8e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b8e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b8e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b8e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b8e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b8e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b8e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b8f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b8f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b8f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b8f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b8f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b8f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b8f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b8f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b8f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b8f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b8f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b8f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b90, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b90, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b90, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b90, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b90, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b90, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b90, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b90, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b90, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b90, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b90, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b90, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b91, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b91, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b91, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b91, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b91, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b91, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b91, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b91, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b91, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b91, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b91, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b91, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b92, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b92, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b92, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b92, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b92, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b92, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b92, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b92, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b92, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b92, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b92, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b92, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b93, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b93, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b93, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b93, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b93, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b93, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b93, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b93, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b93, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b93, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b93, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b93, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b94, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b94, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b94, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b94, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b94, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b94, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b94, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b94, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b94, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b94, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b94, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b94, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b95, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b95, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b95, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b95, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b95, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b95, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b95, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b95, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b95, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b95, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b95, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b95, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b96, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b96, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b96, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b96, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b96, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b96, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b96, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b96, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b96, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b96, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b96, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b96, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b97, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b97, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b97, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b97, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b97, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b97, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b97, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b97, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b97, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b97, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b97, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b97, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b98, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b98, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b98, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b98, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b98, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b98, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b98, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b98, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b98, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b98, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b98, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b98, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b99, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b99, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b99, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b99, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b99, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b99, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b99, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b99, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b99, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b99, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b99, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b99, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b9a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b9a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b9a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b9a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b9a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b9a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b9a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b9a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b9a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b9a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b9a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b9a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b9b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b9b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b9b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b9b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b9b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b9b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b9b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b9b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b9b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b9b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b9b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b9b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b9c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b9c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b9c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b9c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b9c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b9c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b9c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b9c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b9c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b9c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b9c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b9c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b9d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b9d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b9d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b9d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b9d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b9d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b9d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b9d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b9d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b9d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b9d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b9d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b9e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b9e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b9e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b9e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b9e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b9e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b9e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b9e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b9e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b9e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b9e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b9e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286b9f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286b9f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286b9f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286b9f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286b9f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286b9f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286b9f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286b9f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286b9f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286b9f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286b9f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286b9f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286ba0, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286ba0, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286ba0, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286ba0, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286ba0, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286ba0, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286ba0, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286ba0, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286ba0, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286ba0, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286ba0, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286ba0, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286ba1, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286ba1, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286ba1, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286ba1, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286ba1, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286ba1, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286ba1, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286ba1, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286ba1, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286ba1, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286ba1, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286ba1, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286ba2, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286ba2, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286ba2, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286ba2, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286ba2, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286ba2, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286ba2, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286ba2, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286ba2, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286ba2, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286ba2, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286ba2, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286ba3, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286ba3, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286ba3, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286ba3, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286ba3, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286ba3, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286ba3, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286ba3, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286ba3, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286ba3, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286ba3, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286ba3, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286ba4, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286ba4, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286ba4, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286ba4, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286ba4, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286ba4, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286ba4, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286ba4, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286ba4, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286ba4, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286ba4, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286ba4, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286ba5, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286ba5, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286ba5, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286ba5, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286ba5, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286ba5, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286ba5, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286ba5, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286ba5, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286ba5, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286ba5, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286ba5, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286ba6, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286ba6, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286ba6, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286ba6, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286ba6, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286ba6, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286ba6, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286ba6, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286ba6, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286ba6, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286ba6, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286ba6, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286ba7, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286ba7, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286ba7, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286ba7, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286ba7, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286ba7, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286ba7, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286ba7, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286ba7, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286ba7, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286ba7, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286ba7, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286ba8, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286ba8, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286ba8, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286ba8, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286ba8, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286ba8, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286ba8, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286ba8, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286ba8, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286ba8, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286ba8, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286ba8, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286ba9, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286ba9, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286ba9, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286ba9, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286ba9, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286ba9, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286ba9, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286ba9, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286ba9, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286ba9, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286ba9, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286ba9, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286baa, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286baa, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286baa, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286baa, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286baa, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286baa, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286baa, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286baa, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286baa, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286baa, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286baa, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286baa, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bab, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bab, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bab, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bab, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bab, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bab, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bab, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bab, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bab, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bab, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bab, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bab, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bac, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bac, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bac, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bac, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bac, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bac, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bac, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bac, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bac, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bac, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bac, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bac, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bad, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bad, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bad, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bad, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bad, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bad, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bad, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bad, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bad, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bad, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bad, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bad, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bae, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bae, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bae, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bae, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bae, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bae, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bae, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bae, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bae, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bae, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bae, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bae, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286baf, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286baf, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286baf, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286baf, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286baf, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286baf, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286baf, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286baf, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286baf, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286baf, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286baf, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286baf, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bb0, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bb0, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bb0, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bb0, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bb0, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bb0, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bb0, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bb0, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bb0, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bb0, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bb0, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bb0, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bb1, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bb1, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bb1, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bb1, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bb1, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bb1, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bb1, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bb1, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bb1, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bb1, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bb1, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bb1, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bb2, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bb2, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bb2, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bb2, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bb2, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bb2, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bb2, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bb2, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bb2, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bb2, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bb2, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bb2, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bb3, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bb3, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bb3, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bb3, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bb3, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bb3, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bb3, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bb3, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bb3, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bb3, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bb3, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bb3, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bb4, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bb4, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bb4, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bb4, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bb4, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bb4, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bb4, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bb4, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bb4, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bb4, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bb4, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bb4, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bb5, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bb5, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bb5, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bb5, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bb5, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bb5, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bb5, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bb5, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bb5, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bb5, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bb5, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bb5, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bb6, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bb6, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bb6, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bb6, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bb6, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bb6, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bb6, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bb6, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bb6, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bb6, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bb6, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bb6, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bb7, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bb7, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bb7, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bb7, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bb7, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bb7, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bb7, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bb7, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bb7, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bb7, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bb7, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bb7, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bb8, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bb8, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bb8, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bb8, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bb8, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bb8, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bb8, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bb8, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bb8, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bb8, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bb8, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bb8, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bb9, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bb9, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bb9, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bb9, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bb9, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bb9, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bb9, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bb9, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bb9, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bb9, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bb9, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bb9, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bba, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bba, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bba, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bba, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bba, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bba, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bba, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bba, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bba, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bba, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bba, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bba, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bbb, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bbb, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bbb, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bbb, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bbb, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bbb, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bbb, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bbb, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bbb, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bbb, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bbb, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bbb, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bbc, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bbc, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bbc, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bbc, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bbc, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bbc, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bbc, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bbc, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bbc, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bbc, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bbc, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bbc, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bbd, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bbd, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bbd, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bbd, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bbd, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bbd, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bbd, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bbd, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bbd, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bbd, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bbd, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bbd, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bbe, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bbe, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bbe, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bbe, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bbe, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bbe, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bbe, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bbe, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bbe, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bbe, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bbe, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bbe, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bbf, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bbf, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bbf, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bbf, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bbf, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bbf, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bbf, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bbf, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bbf, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bbf, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bbf, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bbf, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bc0, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bc0, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bc0, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bc0, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bc0, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bc0, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bc0, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bc0, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bc0, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bc0, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bc0, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bc0, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bc1, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bc1, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bc1, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bc1, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bc1, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bc1, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bc1, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bc1, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bc1, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bc1, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bc1, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bc1, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bc2, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bc2, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bc2, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bc2, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bc2, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bc2, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bc2, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bc2, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bc2, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bc2, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bc2, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bc2, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bc3, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bc3, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bc3, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bc3, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bc3, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bc3, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bc3, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bc3, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bc3, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bc3, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bc3, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bc3, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bc4, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bc4, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bc4, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bc4, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bc4, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bc4, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bc4, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bc4, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bc4, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bc4, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bc4, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bc4, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bc5, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bc5, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bc5, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bc5, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bc5, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bc5, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bc5, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bc5, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bc5, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bc5, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bc5, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bc5, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bc6, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bc6, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bc6, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bc6, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bc6, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bc6, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bc6, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bc6, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bc6, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bc6, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bc6, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bc6, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bc7, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bc7, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bc7, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bc7, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bc7, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bc7, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bc7, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bc7, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bc7, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bc7, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bc7, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bc7, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bc8, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bc8, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bc8, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bc8, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bc8, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bc8, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bc8, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bc8, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bc8, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bc8, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bc8, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bc8, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bc9, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bc9, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bc9, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bc9, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bc9, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bc9, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bc9, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bc9, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bc9, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bc9, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bc9, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bc9, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bca, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bca, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bca, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bca, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bca, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bca, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bca, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bca, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bca, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bca, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bca, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bca, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bcb, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bcb, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bcb, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bcb, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bcb, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bcb, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bcb, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bcb, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bcb, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bcb, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bcb, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bcb, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bcc, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bcc, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bcc, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bcc, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bcc, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bcc, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bcc, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bcc, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bcc, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bcc, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bcc, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bcc, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bcd, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bcd, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bcd, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bcd, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bcd, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bcd, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bcd, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bcd, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bcd, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bcd, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bcd, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bcd, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bce, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bce, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bce, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bce, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bce, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bce, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bce, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bce, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bce, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bce, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bce, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bce, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bcf, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bcf, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bcf, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bcf, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bcf, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bcf, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bcf, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bcf, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bcf, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bcf, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bcf, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bcf, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bd0, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bd0, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bd0, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bd0, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bd0, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bd0, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bd0, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bd0, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bd0, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bd0, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bd0, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bd0, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bd1, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bd1, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bd1, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bd1, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bd1, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bd1, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bd1, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bd1, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bd1, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bd1, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bd1, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bd1, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bd2, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bd2, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bd2, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bd2, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bd2, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bd2, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bd2, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bd2, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bd2, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bd2, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bd2, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bd2, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bd3, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bd3, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bd3, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bd3, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bd3, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bd3, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bd3, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bd3, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bd3, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bd3, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bd3, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bd3, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bd4, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bd4, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bd4, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bd4, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bd4, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bd4, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bd4, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bd4, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bd4, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bd4, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bd4, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bd4, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bd5, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bd5, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bd5, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bd5, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bd5, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bd5, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bd5, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bd5, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bd5, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bd5, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bd5, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bd5, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bd6, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bd6, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bd6, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bd6, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bd6, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bd6, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bd6, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bd6, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bd6, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bd6, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bd6, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bd6, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bd7, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bd7, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bd7, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bd7, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bd7, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bd7, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bd7, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bd7, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bd7, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bd7, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bd7, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bd7, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bd8, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bd8, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bd8, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bd8, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bd8, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bd8, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bd8, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bd8, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bd8, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bd8, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bd8, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bd8, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bd9, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bd9, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bd9, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bd9, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bd9, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bd9, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bd9, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bd9, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bd9, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bd9, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bd9, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bd9, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bda, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bda, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bda, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bda, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bda, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bda, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bda, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bda, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bda, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bda, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bda, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bda, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bdb, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bdb, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bdb, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bdb, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bdb, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bdb, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bdb, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bdb, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bdb, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bdb, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bdb, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bdb, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bdc, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bdc, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bdc, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bdc, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bdc, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bdc, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bdc, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bdc, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bdc, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bdc, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bdc, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bdc, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bdd, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bdd, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bdd, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bdd, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bdd, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bdd, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bdd, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bdd, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bdd, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bdd, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bdd, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bdd, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bde, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bde, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bde, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bde, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bde, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bde, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bde, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bde, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bde, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bde, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bde, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bde, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bdf, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bdf, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bdf, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bdf, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bdf, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bdf, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bdf, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bdf, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bdf, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bdf, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bdf, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bdf, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286be0, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286be0, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286be0, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286be0, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286be0, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286be0, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286be0, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286be0, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286be0, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286be0, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286be0, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286be0, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286be1, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286be1, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286be1, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286be1, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286be1, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286be1, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286be1, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286be1, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286be1, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286be1, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286be1, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286be1, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286be2, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286be2, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286be2, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286be2, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286be2, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286be2, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286be2, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286be2, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286be2, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286be2, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286be2, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286be2, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286be3, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286be3, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286be3, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286be3, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286be3, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286be3, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286be3, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286be3, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286be3, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286be3, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286be3, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286be3, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286be4, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286be4, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286be4, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286be4, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286be4, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286be4, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286be4, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286be4, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286be4, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286be4, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286be4, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286be4, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286be5, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286be5, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286be5, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286be5, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286be5, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286be5, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286be5, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286be5, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286be5, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286be5, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286be5, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286be5, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286be6, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286be6, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286be6, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286be6, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286be6, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286be6, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286be6, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286be6, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286be6, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286be6, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286be6, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286be6, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286be7, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286be7, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286be7, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286be7, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286be7, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286be7, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286be7, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286be7, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286be7, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286be7, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286be7, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286be7, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286be8, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286be8, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286be8, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286be8, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286be8, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286be8, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286be8, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286be8, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286be8, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286be8, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286be8, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286be8, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286be9, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286be9, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286be9, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286be9, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286be9, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286be9, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286be9, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286be9, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286be9, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286be9, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286be9, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286be9, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bea, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bea, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bea, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bea, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bea, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bea, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bea, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bea, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bea, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bea, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bea, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bea, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286beb, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286beb, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286beb, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286beb, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286beb, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286beb, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286beb, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286beb, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286beb, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286beb, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286beb, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286beb, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bec, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bec, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bec, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bec, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bec, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bec, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bec, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bec, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bec, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bec, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bec, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bec, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bed, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bed, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bed, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bed, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bed, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bed, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bed, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bed, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bed, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bed, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bed, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bed, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bee, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bee, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bee, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bee, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bee, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bee, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bee, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bee, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bee, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bee, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bee, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bee, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bef, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bef, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bef, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bef, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bef, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bef, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bef, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bef, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bef, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bef, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bef, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bef, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bf0, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bf0, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bf0, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bf0, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bf0, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bf0, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bf0, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bf0, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bf0, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bf0, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bf0, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bf0, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bf1, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bf1, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bf1, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bf1, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bf1, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bf1, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bf1, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bf1, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bf1, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bf1, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bf1, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bf1, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bf2, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bf2, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bf2, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bf2, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bf2, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bf2, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bf2, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bf2, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bf2, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bf2, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bf2, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bf2, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bf3, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bf3, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bf3, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bf3, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bf3, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bf3, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bf3, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bf3, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bf3, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bf3, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bf3, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bf3, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bf4, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bf4, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bf4, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bf4, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bf4, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bf4, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bf4, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bf4, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bf4, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bf4, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bf4, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bf4, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bf5, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bf5, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bf5, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bf5, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bf5, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bf5, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bf5, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bf5, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bf5, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bf5, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bf5, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bf5, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bf6, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bf6, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bf6, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bf6, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bf6, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bf6, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bf6, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bf6, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bf6, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bf6, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bf6, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bf6, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bf7, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bf7, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bf7, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bf7, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bf7, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bf7, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bf7, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bf7, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bf7, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bf7, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bf7, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bf7, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bf8, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bf8, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bf8, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bf8, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bf8, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bf8, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bf8, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bf8, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bf8, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bf8, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bf8, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bf8, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bf9, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bf9, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bf9, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bf9, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bf9, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bf9, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bf9, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bf9, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bf9, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bf9, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bf9, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bf9, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bfa, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bfa, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bfa, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bfa, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bfa, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bfa, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bfa, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bfa, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bfa, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bfa, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bfa, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bfa, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bfb, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bfb, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bfb, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bfb, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bfb, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bfb, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bfb, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bfb, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bfb, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bfb, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bfb, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bfb, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bfc, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bfc, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bfc, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bfc, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bfc, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bfc, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bfc, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bfc, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bfc, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bfc, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bfc, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bfc, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bfd, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bfd, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bfd, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bfd, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bfd, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bfd, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bfd, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bfd, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bfd, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bfd, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bfd, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bfd, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bfe, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bfe, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bfe, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bfe, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bfe, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bfe, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bfe, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bfe, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bfe, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bfe, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bfe, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bfe, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286bff, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286bff, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286bff, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286bff, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286bff, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286bff, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286bff, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286bff, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286bff, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286bff, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286bff, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286bff, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c00, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c00, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c00, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c00, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c00, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c00, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c00, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c00, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c00, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c00, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c00, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c00, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c01, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c01, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c01, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c01, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c01, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c01, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c01, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c01, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c01, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c01, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c01, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c01, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c02, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c02, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c02, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c02, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c02, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c02, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c02, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c02, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c02, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c02, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c02, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c02, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c03, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c03, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c03, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c03, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c03, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c03, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c03, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c03, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c03, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c03, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c03, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c03, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c04, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c04, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c04, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c04, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c04, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c04, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c04, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c04, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c04, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c04, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c04, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c04, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c05, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c05, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c05, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c05, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c05, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c05, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c05, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c05, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c05, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c05, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c05, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c05, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c06, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c06, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c06, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c06, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c06, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c06, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c06, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c06, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c06, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c06, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c06, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c06, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c07, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c07, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c07, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c07, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c07, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c07, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c07, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c07, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c07, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c07, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c07, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c07, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c08, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c08, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c08, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c08, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c08, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c08, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c08, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c08, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c08, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c08, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c08, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c08, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c09, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c09, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c09, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c09, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c09, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c09, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c09, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c09, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c09, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c09, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c09, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c09, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c0a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c0a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c0a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c0a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c0a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c0a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c0a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c0a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c0a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c0a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c0a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c0a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c0b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c0b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c0b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c0b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c0b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c0b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c0b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c0b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c0b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c0b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c0b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c0b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c0c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c0c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c0c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c0c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c0c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c0c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c0c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c0c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c0c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c0c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c0c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c0c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c0d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c0d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c0d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c0d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c0d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c0d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c0d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c0d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c0d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c0d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c0d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c0d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c0e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c0e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c0e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c0e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c0e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c0e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c0e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c0e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c0e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c0e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c0e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c0e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c0f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c0f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c0f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c0f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c0f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c0f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c0f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c0f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c0f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c0f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c0f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c0f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c10, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c10, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c10, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c10, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c10, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c10, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c10, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c10, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c10, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c10, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c10, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c10, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c11, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c11, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c11, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c11, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c11, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c11, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c11, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c11, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c11, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c11, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c11, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c11, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c12, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c12, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c12, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c12, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c12, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c12, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c12, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c12, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c12, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c12, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c12, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c12, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c13, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c13, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c13, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c13, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c13, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c13, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c13, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c13, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c13, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c13, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c13, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c13, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c14, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c14, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c14, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c14, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c14, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c14, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c14, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c14, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c14, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c14, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c14, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c14, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c15, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c15, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c15, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c15, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c15, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c15, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c15, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c15, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c15, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c15, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c15, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c15, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c16, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c16, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c16, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c16, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c16, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c16, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c16, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c16, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c16, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c16, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c16, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c16, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c17, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c17, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c17, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c17, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c17, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c17, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c17, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c17, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c17, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c17, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c17, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c17, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c18, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c18, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c18, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c18, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c18, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c18, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c18, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c18, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c18, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c18, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c18, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c18, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c19, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c19, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c19, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c19, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c19, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c19, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c19, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c19, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c19, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c19, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c19, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c19, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c1a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c1a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c1a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c1a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c1a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c1a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c1a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c1a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c1a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c1a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c1a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c1a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c1b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c1b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c1b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c1b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c1b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c1b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c1b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c1b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c1b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c1b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c1b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c1b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c1c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c1c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c1c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c1c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c1c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c1c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c1c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c1c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c1c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c1c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c1c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c1c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c1d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c1d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c1d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c1d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c1d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c1d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c1d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c1d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c1d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c1d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c1d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c1d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c1e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c1e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c1e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c1e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c1e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c1e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c1e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c1e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c1e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c1e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c1e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c1e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c1f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c1f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c1f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c1f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c1f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c1f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c1f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c1f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c1f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c1f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c1f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c1f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c20, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c20, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c20, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c20, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c20, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c20, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c20, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c20, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c20, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c20, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c20, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c20, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c21, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c21, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c21, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c21, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c21, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c21, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c21, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c21, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c21, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c21, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c21, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c21, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c22, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c22, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c22, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c22, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c22, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c22, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c22, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c22, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c22, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c22, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c22, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c22, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c23, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c23, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c23, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c23, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c23, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c23, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c23, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c23, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c23, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c23, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c23, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c23, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c24, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c24, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c24, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c24, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c24, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c24, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c24, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c24, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c24, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c24, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c24, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c24, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c25, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c25, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c25, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c25, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c25, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c25, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c25, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c25, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c25, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c25, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c25, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c25, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c26, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c26, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c26, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c26, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c26, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c26, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c26, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c26, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c26, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c26, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c26, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c26, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c27, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c27, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c27, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c27, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c27, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c27, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c27, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c27, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c27, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c27, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c27, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c27, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c28, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c28, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c28, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c28, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c28, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c28, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c28, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c28, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c28, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c28, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c28, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c28, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c29, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c29, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c29, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c29, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c29, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c29, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c29, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c29, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c29, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c29, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c29, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c29, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c2a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c2a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c2a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c2a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c2a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c2a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c2a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c2a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c2a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c2a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c2a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c2a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c2b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c2b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c2b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c2b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c2b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c2b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c2b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c2b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c2b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c2b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c2b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c2b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c2c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c2c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c2c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c2c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c2c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c2c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c2c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c2c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c2c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c2c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c2c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c2c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c2d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c2d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c2d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c2d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c2d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c2d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c2d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c2d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c2d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c2d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c2d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c2d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c2e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c2e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c2e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c2e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c2e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c2e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c2e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c2e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c2e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c2e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c2e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c2e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c2f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c2f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c2f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c2f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c2f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c2f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c2f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c2f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c2f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c2f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c2f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c2f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c30, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c30, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c30, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c30, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c30, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c30, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c30, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c30, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c30, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c30, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c30, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c30, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c31, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c31, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c31, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c31, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c31, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c31, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c31, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c31, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c31, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c31, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c31, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c31, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c32, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c32, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c32, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c32, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c32, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c32, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c32, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c32, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c32, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c32, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c32, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c32, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c33, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c33, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c33, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c33, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c33, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c33, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c33, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c33, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c33, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c33, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c33, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c33, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c34, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c34, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c34, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c34, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c34, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c34, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c34, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c34, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c34, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c34, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c34, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c34, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c35, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c35, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c35, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c35, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c35, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c35, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c35, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c35, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c35, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c35, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c35, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c35, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c36, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c36, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c36, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c36, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c36, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c36, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c36, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c36, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c36, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c36, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c36, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c36, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c37, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c37, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c37, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c37, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c37, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c37, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c37, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c37, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c37, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c37, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c37, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c37, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c38, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c38, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c38, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c38, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c38, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c38, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c38, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c38, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c38, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c38, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c38, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c38, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c39, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c39, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c39, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c39, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c39, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c39, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c39, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c39, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c39, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c39, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c39, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c39, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c3a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c3a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c3a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c3a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c3a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c3a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c3a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c3a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c3a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c3a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c3a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c3a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c3b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c3b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c3b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c3b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c3b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c3b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c3b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c3b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c3b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c3b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c3b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c3b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c3c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c3c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c3c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c3c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c3c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c3c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c3c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c3c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c3c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c3c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c3c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c3c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c3d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c3d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c3d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c3d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c3d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c3d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c3d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c3d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c3d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c3d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c3d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c3d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c3e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c3e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c3e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c3e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c3e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c3e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c3e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c3e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c3e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c3e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c3e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c3e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c3f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c3f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c3f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c3f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c3f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c3f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c3f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c3f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c3f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c3f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c3f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c3f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c40, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c40, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c40, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c40, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c40, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c40, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c40, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c40, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c40, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c40, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c40, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c40, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c41, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c41, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c41, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c41, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c41, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c41, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c41, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c41, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c41, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c41, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c41, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c41, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c42, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c42, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c42, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c42, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c42, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c42, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c42, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c42, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c42, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c42, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c42, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c42, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c43, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c43, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c43, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c43, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c43, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c43, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c43, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c43, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c43, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c43, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c43, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c43, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c44, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c44, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c44, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c44, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c44, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c44, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c44, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c44, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c44, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c44, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c44, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c44, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c45, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c45, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c45, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c45, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c45, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c45, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c45, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c45, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c45, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c45, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c45, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c45, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c46, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c46, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c46, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c46, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c46, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c46, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c46, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c46, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c46, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c46, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c46, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c46, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c47, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c47, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c47, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c47, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c47, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c47, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c47, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c47, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c47, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c47, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c47, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c47, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c48, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c48, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c48, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c48, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c48, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c48, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c48, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c48, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c48, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c48, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c48, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c48, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c49, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c49, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c49, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c49, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c49, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c49, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c49, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c49, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c49, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c49, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c49, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c49, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c4a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c4a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c4a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c4a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c4a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c4a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c4a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c4a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c4a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c4a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c4a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c4a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c4b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c4b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c4b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c4b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c4b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c4b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c4b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c4b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c4b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c4b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c4b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c4b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c4c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c4c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c4c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c4c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c4c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c4c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c4c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c4c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c4c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c4c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c4c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c4c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c4d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c4d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c4d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c4d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c4d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c4d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c4d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c4d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c4d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c4d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c4d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c4d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c4e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c4e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c4e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c4e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c4e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c4e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c4e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c4e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c4e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c4e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c4e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c4e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c4f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c4f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c4f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c4f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c4f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c4f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c4f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c4f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c4f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c4f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c4f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c4f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c50, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c50, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c50, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c50, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c50, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c50, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c50, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c50, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c50, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c50, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c50, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c50, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c51, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c51, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c51, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c51, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c51, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c51, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c51, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c51, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c51, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c51, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c51, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c51, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c52, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c52, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c52, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c52, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c52, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c52, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c52, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c52, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c52, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c52, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c52, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c52, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c53, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c53, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c53, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c53, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c53, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c53, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c53, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c53, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c53, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c53, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c53, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c53, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c54, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c54, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c54, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c54, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c54, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c54, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c54, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c54, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c54, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c54, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c54, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c54, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c55, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c55, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c55, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c55, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c55, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c55, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c55, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c55, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c55, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c55, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c55, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c55, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c56, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c56, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c56, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c56, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c56, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c56, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c56, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c56, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c56, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c56, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c56, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c56, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c57, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c57, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c57, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c57, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c57, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c57, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c57, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c57, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c57, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c57, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c57, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c57, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c58, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c58, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c58, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c58, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c58, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c58, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c58, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c58, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c58, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c58, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c58, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c58, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c59, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c59, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c59, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c59, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c59, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c59, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c59, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c59, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c59, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c59, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c59, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c59, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c5a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c5a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c5a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c5a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c5a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c5a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c5a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c5a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c5a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c5a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c5a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c5a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c5b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c5b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c5b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c5b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c5b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c5b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c5b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c5b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c5b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c5b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c5b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c5b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c5c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c5c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c5c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c5c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c5c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c5c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c5c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c5c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c5c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c5c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c5c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c5c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c5d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c5d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c5d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c5d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c5d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c5d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c5d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c5d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c5d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c5d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c5d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c5d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c5e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c5e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c5e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c5e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c5e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c5e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c5e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c5e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c5e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c5e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c5e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c5e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c5f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c5f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c5f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c5f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c5f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c5f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c5f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c5f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c5f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c5f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c5f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c5f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c60, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c60, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c60, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c60, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c60, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c60, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c60, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c60, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c60, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c60, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c60, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c60, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c61, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c61, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c61, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c61, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c61, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c61, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c61, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c61, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c61, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c61, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c61, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c61, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c62, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c62, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c62, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c62, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c62, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c62, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c62, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c62, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c62, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c62, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c62, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c62, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c63, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c63, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c63, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c63, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c63, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c63, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c63, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c63, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c63, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c63, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c63, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c63, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c64, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c64, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c64, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c64, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c64, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c64, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c64, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c64, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c64, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c64, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c64, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c64, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c65, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c65, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c65, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c65, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c65, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c65, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c65, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c65, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c65, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c65, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c65, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c65, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c66, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c66, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c66, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c66, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c66, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c66, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c66, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c66, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c66, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c66, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c66, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c66, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c67, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c67, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c67, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c67, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c67, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c67, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c67, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c67, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c67, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c67, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c67, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c67, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c68, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c68, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c68, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c68, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c68, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c68, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c68, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c68, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c68, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c68, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c68, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c68, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c69, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c69, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c69, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c69, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c69, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c69, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c69, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c69, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c69, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c69, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c69, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c69, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c6a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c6a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c6a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c6a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c6a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c6a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c6a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c6a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c6a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c6a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c6a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c6a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c6b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c6b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c6b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c6b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c6b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c6b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c6b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c6b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c6b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c6b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c6b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c6b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c6c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c6c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c6c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c6c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c6c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c6c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c6c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c6c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c6c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c6c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c6c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c6c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c6d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c6d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c6d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c6d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c6d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c6d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c6d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c6d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c6d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c6d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c6d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c6d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c6e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c6e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c6e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c6e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c6e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c6e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c6e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c6e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c6e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c6e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c6e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c6e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c6f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c6f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c6f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c6f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c6f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c6f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c6f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c6f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c6f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c6f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c6f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c6f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c70, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c70, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c70, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c70, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c70, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c70, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c70, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c70, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c70, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c70, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c70, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c70, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c71, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c71, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c71, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c71, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c71, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c71, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c71, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c71, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c71, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c71, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c71, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c71, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c72, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c72, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c72, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c72, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c72, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c72, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c72, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c72, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c72, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c72, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c72, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c72, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c73, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c73, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c73, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c73, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c73, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c73, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c73, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c73, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c73, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c73, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c73, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c73, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c74, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c74, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c74, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c74, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c74, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c74, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c74, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c74, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c74, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c74, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c74, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c74, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c75, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c75, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c75, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c75, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c75, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c75, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c75, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c75, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c75, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c75, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c75, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c75, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c76, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c76, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c76, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c76, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c76, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c76, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c76, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c76, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c76, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c76, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c76, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c76, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c77, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c77, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c77, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c77, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c77, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c77, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c77, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c77, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c77, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c77, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c77, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c77, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c78, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c78, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c78, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c78, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c78, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c78, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c78, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c78, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c78, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c78, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c78, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c78, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c79, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c79, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c79, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c79, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c79, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c79, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c79, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c79, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c79, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c79, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c79, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c79, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c7a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c7a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c7a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c7a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c7a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c7a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c7a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c7a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c7a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c7a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c7a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c7a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c7b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c7b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c7b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c7b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c7b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c7b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c7b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c7b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c7b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c7b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c7b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c7b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c7c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c7c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c7c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c7c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c7c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c7c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c7c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c7c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c7c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c7c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c7c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c7c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c7d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c7d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c7d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c7d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c7d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c7d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c7d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c7d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c7d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c7d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c7d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c7d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c7e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c7e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c7e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c7e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c7e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c7e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c7e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c7e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c7e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c7e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c7e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c7e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c7f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c7f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c7f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c7f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c7f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c7f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c7f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c7f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c7f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c7f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c7f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c7f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c80, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c80, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c80, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c80, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c80, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c80, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c80, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c80, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c80, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c80, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c80, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c80, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c81, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c81, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c81, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c81, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c81, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c81, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c81, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c81, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c81, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c81, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c81, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c81, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c82, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c82, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c82, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c82, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c82, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c82, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c82, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c82, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c82, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c82, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c82, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c82, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c83, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c83, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c83, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c83, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c83, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c83, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c83, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c83, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c83, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c83, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c83, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c83, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c84, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c84, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c84, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c84, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c84, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c84, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c84, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c84, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c84, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c84, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c84, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c84, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c85, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c85, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c85, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c85, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c85, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c85, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c85, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c85, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c85, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c85, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c85, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c85, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c86, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c86, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c86, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c86, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c86, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c86, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c86, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c86, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c86, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c86, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c86, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c86, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c87, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c87, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c87, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c87, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c87, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c87, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c87, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c87, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c87, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c87, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c87, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c87, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c88, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c88, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c88, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c88, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c88, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c88, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c88, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c88, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c88, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c88, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c88, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c88, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c89, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c89, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c89, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c89, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c89, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c89, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c89, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c89, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c89, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c89, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c89, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c89, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c8a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c8a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c8a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c8a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c8a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c8a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c8a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c8a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c8a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c8a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c8a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c8a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c8b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c8b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c8b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c8b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c8b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c8b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c8b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c8b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c8b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c8b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c8b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c8b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c8c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c8c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c8c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c8c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c8c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c8c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c8c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c8c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c8c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c8c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c8c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c8c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c8d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c8d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c8d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c8d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c8d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c8d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c8d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c8d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c8d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c8d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c8d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c8d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c8e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c8e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c8e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c8e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c8e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c8e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c8e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c8e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c8e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c8e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c8e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c8e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c8f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c8f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c8f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c8f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c8f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c8f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c8f, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c8f, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c8f, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c8f, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c8f, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c8f, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c90, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c90, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c90, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c90, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c90, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c90, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c90, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c90, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c90, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c90, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c90, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c90, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c91, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c91, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c91, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c91, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c91, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c91, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c91, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c91, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c91, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c91, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c91, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c91, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c92, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c92, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c92, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c92, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c92, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c92, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c92, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c92, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c92, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c92, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c92, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c92, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c93, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c93, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c93, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c93, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c93, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c93, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c93, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c93, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c93, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c93, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c93, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c93, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c94, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c94, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c94, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c94, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c94, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c94, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c94, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c94, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c94, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c94, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c94, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c94, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c95, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c95, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c95, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c95, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c95, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c95, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c95, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c95, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c95, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c95, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c95, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c95, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c96, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c96, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c96, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c96, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c96, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c96, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c96, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c96, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c96, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c96, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c96, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c96, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c97, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c97, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c97, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c97, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c97, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c97, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c97, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c97, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c97, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c97, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c97, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c97, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c98, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c98, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c98, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c98, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c98, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c98, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c98, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c98, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c98, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c98, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c98, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c98, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c99, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c99, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c99, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c99, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c99, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c99, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c99, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c99, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c99, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c99, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c99, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c99, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c9a, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c9a, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c9a, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c9a, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c9a, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c9a, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c9a, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c9a, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c9a, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c9a, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c9a, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c9a, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c9b, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c9b, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c9b, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c9b, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c9b, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c9b, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c9b, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c9b, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c9b, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c9b, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c9b, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c9b, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c9c, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c9c, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c9c, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c9c, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c9c, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c9c, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c9c, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c9c, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c9c, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c9c, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c9c, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c9c, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c9d, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c9d, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c9d, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c9d, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c9d, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c9d, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c9d, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c9d, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c9d, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c9d, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c9d, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c9d, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c9e, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c9e, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c9e, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c9e, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c9e, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c9e, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + ,{ 0x10286c9e, 0x00000007, 0x00000100, 0x0000, 0x0004, 0x00000007 } + ,{ 0x10286c9e, 0x00000008, 0x00000001, 0x0000, 0x0004, 0x00000008 } + ,{ 0x10286c9e, 0x00000009, 0x00000002, 0x0000, 0x0004, 0x00000009 } + ,{ 0x10286c9e, 0x0000000a, 0x00000004, 0x0000, 0x0004, 0x0000000a } + ,{ 0x10286c9e, 0x0000000b, 0x00000008, 0x0000, 0x0004, 0x0000000b } + ,{ 0x10286c9e, 0x0000000c, 0x00000010, 0x0000, 0x0004, 0x0000000c } + ,{ 0x10286c9f, 0x00000001, 0x00000002, 0x0000, 0x0004, 0x00000001 } + ,{ 0x10286c9f, 0x00000002, 0x00000004, 0x0000, 0x0004, 0x00000002 } + ,{ 0x10286c9f, 0x00000003, 0x00000008, 0x0000, 0x0004, 0x00000003 } + ,{ 0x10286c9f, 0x00000004, 0x00000010, 0x0000, 0x0004, 0x00000004 } + ,{ 0x10286c9f, 0x00000005, 0x00000020, 0x0000, 0x0004, 0x00000005 } + ,{ 0x10286c9f, 0x00000006, 0x00000040, 0x0000, 0x0004, 0x00000006 } + }; +#endif //HCRIMAGEDATA_102400_H +
--- a/kerneltest/e32test/hcr/d_hcrsim.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/d_hcrsim.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -17,12 +17,11 @@ #include "d_hcrsim.h" #include <kernel/kernel.h> #include <plat_priv.h> -#ifndef HCRTEST_USERSIDE_INTERFACE #include "hcr_debug.h" -#include "hcr_hai.h" -#include "hcr_pil.h" +#include "hcr_uids.h" +#ifdef HCRTEST_USERSIDE_INTERFACE +#include "d_hcrsim_testdata.h" #endif // HCRTEST_USERSIDE_INTERFACE -#include "hcr_uids.h" #define TEST(a) CheckPoint(a, __LINE__) #define TEST_KERRNONE(a) CheckPointError(a, __LINE__) @@ -107,10 +106,40 @@ } } +void HasRepositoryInSmr(TBool& aHasSmr, TBool& aHasSmrHcr) + { + aHasSmr = EFalse; + aHasSmrHcr = EFalse; + + // Note: the SMR feature by which we obtain the address of the override + // repository is only supported in the ARM bootstrap, not X86 or WINS so + // this test code needs conditional compilation. +#if !defined(__WINS__) && !defined(__X86__) + const TSuperPage& superpage = Kern::SuperPage(); + TUint32* smrib = (TUint32*) superpage.iSmrData; + SSmrBank* smrbank = (SSmrBank*) smrib; + if((smrib != NULL) && (smrib != (TUint32*)KSuperPageAddressFieldUndefined)) + { + aHasSmr = ETrue; + while (smrbank->iBase) + { + if (smrbank->iPayloadUID == KHCRUID_SMRPayloadUID) + { + // We have a HCR repository - assuming it is the test one... + aHasSmrHcr = ETrue; + break; + } + ++smrbank; + } + } +#endif // !__WINS__ && !__X86__ + } + #ifdef HCRTEST_USERSIDE_INTERFACE #define KEXT_TESTKERRNONE(_r) \ { \ - if ((_r) && !TestKernExtensionTestLine) \ + TInt _s = _r; \ + if ((_s) && !TestKernExtensionTestLine) \ { \ TestKernExtensionTestError = (_r); \ TestKernExtensionTestLine = __LINE__; \ @@ -128,18 +157,101 @@ void KextInitTests() { TInt r; - // Get last Setting in compiled repository + // Get last Setting in Reference Compiled Repository TUint32 value1; - HCR::TSettingId setting1(0xFFFFFFFF, 0xFFFFFFFF); - r = HCR::GetUInt(setting1, value1); + TSettingId setting1(0xFFFFFFFF, 0xFFFFFFFF); + r = GetUInt(setting1, value1); KEXT_TESTKERRNONE(r); KEXT_TEST(value1==0x4C415354); // 'L', 'A', 'S', 'T' - // Get Setting in file repository - TUint32 value2; - HCR::TSettingId setting2(2, 2); - r = HCR::GetUInt(setting2, value2); - KEXT_TESTKERRNONE(r); + // Determine what test repositories the HCR has loaded + // Make sure we have the file repository + const TRomHeader& romheader = Epoc::RomHeader(); + KEXT_TEST(romheader.iHcrFileAddress != NULL); // Assuming this is the test repository (hcr.dat) + // Find the nand repository + TBool smr; + TBool smrrep; + SSettingC* repos = NULL; + TInt nosettings = 0; + HasRepositoryInSmr(smr, smrrep); + if (smrrep) + { + repos = SettingsList6; // File+Nand + nosettings = sizeof(SettingsList6) / sizeof(SSettingC); + } + else if (!smr) + { + repos = SettingsList7; // File Only + nosettings = sizeof(SettingsList7) / sizeof(SSettingC); + } + else + { + // SMR partitions found but no HCR repository + KEXT_TEST(0); + return; + } + + // Simple word setting Get + for (SSettingC* setting = repos; setting < repos + nosettings; setting++) + { +// Note: these macros are irrelevant here, it is just so the two test kernel +// extensions do something different +#ifdef HCRTEST_CLIENT_THREAD + if (setting->iName.iType == ETypeInt32) + { + TSettingId id(setting->iName.iId.iCat, setting->iName.iId.iKey); + TInt32 val; + r = GetInt(id, val); + KEXT_TESTKERRNONE(r); + KEXT_TEST(setting->iValue.iLit.iInt32 == val); + } +#else // !HCRTEST_CLIENT_THREAD + if (setting->iName.iType == ETypeUInt32) + { + TSettingId id(setting->iName.iId.iCat, setting->iName.iId.iKey); + TUint32 val; + r = GetUInt(id, val); + KEXT_TESTKERRNONE(r); + KEXT_TEST(setting->iValue.iLit.iUInt32 == val); + } +#endif // !HCRTEST_CLIENT_THREAD + } + + // Large setting Get + for (SSettingC* setting = repos; setting < repos + nosettings; setting++) + { +// Note: these macros are irrelevant here, it is just so the two test kernel +// extensions do something different +#ifdef HCRTEST_CLIENT_THREAD + if (setting->iName.iType == ETypeBinData) + { + TSettingId id(setting->iName.iId.iCat, setting->iName.iId.iKey); + TBuf8<KMaxSettingLength> val; + TPtrC8 aval(setting->iValue.iPtr.iData, setting->iName.iLen); + r = GetData(id, val); + KEXT_TESTKERRNONE(r); + KEXT_TEST(0 == val.Compare(aval)); + } +#else // !HCRTEST_CLIENT_THREAD + if (setting->iName.iType == ETypeText8) + { + TSettingId id(setting->iName.iId.iCat, setting->iName.iId.iKey); + TBuf8<KMaxSettingLength> val; + TPtrC8 aval(setting->iValue.iPtr.iString8, setting->iName.iLen); + r = GetString(id, val); + KEXT_TESTKERRNONE(r); + KEXT_TEST(0 == val.Compare(aval)); + } +#endif // !HCRTEST_CLIENT_THREAD + } + + // Some other API calls + TUint i; + for (i = 0; i < sizeof(KTestCategories) / sizeof(TCategoryUid); i++) + { + r = FindNumSettingsInCategory(KTestCategories[i]); + KEXT_TEST(r >= 0); + } } DECLARE_EXTENSION_WITH_PRIORITY(KExtensionMaximumPriority) @@ -266,16 +378,16 @@ { case RHcrSimTestChannel::EHcrGetLinAddr: { - HCR::TSettingId setting; + TSettingId setting; TLinAddr value; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); - r = HCR::GetLinAddr(setting, value); + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); + r = GetLinAddr(setting, value); TEST_MEMPUT(a2, &value, sizeof(value)); break; } case RHcrSimTestChannel::EHcrFindNumSettingsInCategory: { - r = HCR::FindNumSettingsInCategory((HCR::TCategoryUid) a1); + r = FindNumSettingsInCategory((TCategoryUid) a1); break; } case RHcrSimTestChannel::EHcrFindSettingsCategory: @@ -284,82 +396,88 @@ TAny* args[6]; TEST_MEMGET(a1, args, sizeof(args)); TInt aMaxNum = (TInt) args[1]; - // Allocate temporary memory - - HCR::TElementId* ids; - HCR::TSettingType* types = NULL; + + TElementId* ids = NULL; + TSettingType* types = NULL; TUint16* lens = NULL; - TEST_ENTERCS(); - ids = (HCR::TElementId*) Kern::Alloc(aMaxNum * sizeof(HCR::TElementId)); - TEST_LEAVECS(); - if (ids == NULL) - { - r = KErrNoMemory; - } + if(args[3]) + { + TEST_ENTERCS(); + ids = (TElementId*) Kern::Alloc(_ABS(aMaxNum) * sizeof(TElementId)); + TEST_LEAVECS(); + } + + if (args[4]) // aTypes + { + TEST_ENTERCS(); + types = (TSettingType*) Kern::Alloc(_ABS(aMaxNum) * sizeof(TSettingType)); + TEST_LEAVECS(); + } + if (types == NULL && args[4]) + { + r = KErrNoMemory; + } else - { - if (args[4]) // aTypes - { - TEST_ENTERCS(); - types = (HCR::TSettingType*) Kern::Alloc(aMaxNum * sizeof(HCR::TSettingType)); - TEST_LEAVECS(); - } - if (types == NULL && args[4]) - { - r = KErrNoMemory; - } - else - { - if (args[5]) // aLens - { - TEST_ENTERCS(); - lens = (TUint16*) Kern::Alloc(aMaxNum * sizeof(TUint16)); - TEST_LEAVECS(); - } - if (lens == NULL && args[5]) - { - r = KErrNoMemory; - } - else - { - // Actual API call - r = HCR::FindSettings((HCR::TCategoryUid) args[0], - aMaxNum, ids, types, lens); - - // Send values back to client - if (r >= 0) - { - TEST_MEMPUT(args[2], &r, sizeof(TUint32)); - TEST_MEMPUT(args[3], ids, aMaxNum * sizeof(HCR::TElementId)); - if (args[4]) - { - TEST_MEMPUT(args[4], types, aMaxNum * sizeof(HCR::TSettingType)); - } - if (args[5]) - { - TEST_MEMPUT(args[5], lens, aMaxNum * sizeof(TUint16)); - } - } - if (args[5]) - { - TEST_ENTERCS(); - Kern::Free(lens); - TEST_LEAVECS(); - } - } - if (args[4]) - { - TEST_ENTERCS(); - Kern::Free(types); - TEST_LEAVECS(); - } - } - TEST_ENTERCS(); - Kern::Free(ids); - TEST_LEAVECS(); - } + { + if (args[5]) // aLens + { + TEST_ENTERCS(); + lens = (TUint16*) Kern::Alloc(_ABS(aMaxNum) * sizeof(TUint16)); + TEST_LEAVECS(); + } + if (lens == NULL && args[5]) + { + r = KErrNoMemory; + } + else + { + // Actual API call + r = FindSettings((TCategoryUid) args[0], + aMaxNum, ids, types, lens); + + // Send values back to client + if (r >= 0) + { + if(args[3]) + { + TEST_MEMPUT(args[3], ids, _ABS(aMaxNum) * sizeof(TElementId)); + + if (args[4]) + { + TEST_MEMPUT(args[4], types, _ABS(aMaxNum) * sizeof(TSettingType)); + } + if (args[5]) + { + TEST_MEMPUT(args[5], lens, _ABS(aMaxNum) * sizeof(TUint16)); + } + } + } + + if (args[5]) + { + TEST_ENTERCS(); + Kern::Free(lens); + TEST_LEAVECS(); + } + } + if (args[4]) + { + TEST_ENTERCS(); + Kern::Free(types); + TEST_LEAVECS(); + } + } + + if(args[3]) + { + TEST_ENTERCS(); + Kern::Free(ids); + TEST_LEAVECS(); + } + break; } + case RHcrSimTestChannel::EHcrFindSettingsPattern: { // Get list of pointers @@ -367,80 +485,88 @@ TEST_MEMGET(a1, args, sizeof(args)); TInt aMaxNum = (TInt) args[1]; // Allocate temporary memory - TUint32 numfound; - HCR::TElementId* ids; - HCR::TSettingType* types = NULL; + + TElementId* ids = NULL; + TSettingType* types = NULL; TUint16* lens = NULL; - TEST_ENTERCS(); - ids = (HCR::TElementId*) Kern::Alloc(aMaxNum * sizeof(HCR::TElementId)); - TEST_LEAVECS(); - if (ids == NULL) - { - r = KErrNoMemory; - } + + if(args[5]) + { + TEST_ENTERCS(); + ids = (TElementId*) Kern::Alloc(_ABS(aMaxNum) * sizeof(TElementId)); + if(!ids) + return KErrNoMemory; + TEST_LEAVECS(); + } + + if (args[6]) // aTypes + { + TEST_ENTERCS(); + types = (TSettingType*) Kern::Alloc(_ABS(aMaxNum) * sizeof(TSettingType)); + TEST_LEAVECS(); + } + + if (types == NULL && args[6]) + { + r = KErrNoMemory; + } else - { - if (args[6]) // aTypes - { - TEST_ENTERCS(); - types = (HCR::TSettingType*) Kern::Alloc(aMaxNum * sizeof(HCR::TSettingType)); - TEST_LEAVECS(); - } - if (types == NULL && args[6]) - { - r = KErrNoMemory; - } - else - { - if (args[7]) // aLens - { - TEST_ENTERCS(); - lens = (TUint16*) Kern::Alloc(aMaxNum * sizeof(TUint16)); - TEST_LEAVECS(); - } - if (lens == NULL && args[7]) - { - r = KErrNoMemory; - } - else - { - // Actual API call - r = HCR::FindSettings((HCR::TCategoryUid) args[0], - aMaxNum, (TUint32) args[2], (TUint32) args[3], - ids, types, lens); - - // Send values back to client - if (r > 0) - { - TEST_MEMPUT(args[4], &numfound, sizeof(TUint32)); - TEST_MEMPUT(args[5], ids, aMaxNum * sizeof(HCR::TElementId)); - if (args[6]) - { - TEST_MEMPUT(args[6], types, aMaxNum * sizeof(HCR::TSettingType)); - } - if (args[7]) - { - TEST_MEMPUT(args[7], lens, aMaxNum * sizeof(TUint16)); - } - } - if (args[7]) - { - TEST_ENTERCS(); - Kern::Free(lens); - TEST_LEAVECS(); - } - } - if (args[6]) - { - TEST_ENTERCS(); - Kern::Free(types); - TEST_LEAVECS(); - } - } - TEST_ENTERCS(); - Kern::Free(ids); - TEST_LEAVECS(); - } + { + if (args[7]) // aLens + { + TEST_ENTERCS(); + lens = (TUint16*) Kern::Alloc(_ABS(aMaxNum) * sizeof(TUint16)); + TEST_LEAVECS(); + } + if (lens == NULL && args[7]) + { + r = KErrNoMemory; + } + else + { + + // Actual API call + r = FindSettings((TCategoryUid) args[0], + aMaxNum, (TUint32) args[2], (TUint32) args[3], + ids, types, lens); + + // Send values back to client + if (r > 0) + { + + TEST_MEMPUT(args[5], ids, _ABS(aMaxNum) * sizeof(TElementId)); + if (args[6]) + { + TEST_MEMPUT(args[6], types, _ABS(aMaxNum) * sizeof(TSettingType)); + } + if (args[7]) + { + TEST_MEMPUT(args[7], lens, _ABS(aMaxNum) * sizeof(TUint16)); + } + } + if (args[7]) + { + TEST_ENTERCS(); + Kern::Free(lens); + TEST_LEAVECS(); + } + } + if (args[6]) + { + TEST_ENTERCS(); + Kern::Free(types); + TEST_LEAVECS(); + } + } + + if(args[5]) + { + TEST_ENTERCS(); + Kern::Free(ids); + TEST_LEAVECS(); + } + + break; } case RHcrSimTestChannel::EHcrGetTypeAndSize: @@ -448,12 +574,12 @@ // Get list of pointers TAny* args[3]; TEST_MEMGET(a1, args, sizeof(args)); - HCR::TSettingId id; - TEST_MEMGET(args[0], &id, sizeof(HCR::TSettingId)); - HCR::TSettingType type; + TSettingId id; + TEST_MEMGET(args[0], &id, sizeof(TSettingId)); + TSettingType type; TUint16 len; - r = HCR::GetTypeAndSize(id, type, len); - TEST_MEMPUT(args[1], &type, sizeof(HCR::TSettingType)); + r = GetTypeAndSize(id, type, len); + TEST_MEMPUT(args[1], &type, sizeof(TSettingType)); TEST_MEMPUT(args[2], &len, sizeof(TUint16)); break; } @@ -464,16 +590,16 @@ TEST_MEMGET(a1, args, sizeof(args)); TInt aNum = (TInt) args[0]; // Allocate temporary memory - HCR::SSettingId* ids; - HCR::SSettingId* inIds = (HCR::SSettingId*)args[1]; + SSettingId* ids; + SSettingId* inIds = (SSettingId*)args[1]; TInt32* vals; - HCR::TSettingType* types= NULL; + TSettingType* types= NULL; TInt* errors = NULL; TEST_ENTERCS(); if(inIds) { - ids = (HCR::SSettingId*) Kern::Alloc((aNum>=0?aNum:-aNum) * sizeof(HCR::SSettingId)); + ids = (SSettingId*) Kern::Alloc((aNum>=0?aNum:-aNum) * sizeof(SSettingId)); //Read data from the user side if (ids == NULL) { @@ -481,7 +607,7 @@ break; } - TEST_MEMGET(inIds, ids, (aNum>=0?aNum:-aNum) * sizeof(HCR::SSettingId)); + TEST_MEMGET(inIds, ids, (aNum>=0?aNum:-aNum) * sizeof(SSettingId)); } else ids = NULL; @@ -504,8 +630,8 @@ if (args[3]) // aTypes { TEST_ENTERCS(); - types = (HCR::TSettingType*) Kern::Alloc((aNum>=0?aNum:-aNum) * - sizeof(HCR::TSettingType)); + types = (TSettingType*) Kern::Alloc((aNum>=0?aNum:-aNum) * + sizeof(TSettingType)); TEST_LEAVECS(); } if (types == NULL && args[3]) @@ -527,15 +653,15 @@ else { // Actual API call - r = HCR::GetWordSettings(aNum, ids, vals, types, errors); + r = GetWordSettings(aNum, ids, vals, types, errors); // Send values back to client if (r >= 0) { - TEST_MEMPUT(args[1], ids, aNum * sizeof(HCR::SSettingId)); + TEST_MEMPUT(args[1], ids, aNum * sizeof(SSettingId)); TEST_MEMPUT(args[2], vals, aNum * sizeof(TInt32)); if (args[3]) { - TEST_MEMPUT(args[3], types,(aNum>=0?aNum:-aNum) * sizeof(HCR::TSettingType)); + TEST_MEMPUT(args[3], types,(aNum>=0?aNum:-aNum) * sizeof(TSettingType)); } if (args[4]) { @@ -571,46 +697,46 @@ } case RHcrSimTestChannel::EHcrGetInt64: { - HCR::TSettingId setting; + TSettingId setting; TInt64 value; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); - r = HCR::GetInt(setting, value); + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); + r = GetInt(setting, value); TEST_MEMPUT(a2, &value, sizeof(value)); break; } case RHcrSimTestChannel::EHcrGetInt32: { - HCR::TSettingId setting; + TSettingId setting; TInt32 value; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); - r = HCR::GetInt(setting, value); + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); + r = GetInt(setting, value); TEST_MEMPUT(a2, &value, sizeof(value)); break; } case RHcrSimTestChannel::EHcrGetInt16: { - HCR::TSettingId setting; + TSettingId setting; TInt16 value; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); - r = HCR::GetInt(setting, value); + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); + r = GetInt(setting, value); TEST_MEMPUT(a2, &value, sizeof(value)); break; } case RHcrSimTestChannel::EHcrGetInt8: { - HCR::TSettingId setting; + TSettingId setting; TInt8 value; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); - r = HCR::GetInt(setting, value); + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); + r = GetInt(setting, value); TEST_MEMPUT(a2, &value, sizeof(value)); break; } case RHcrSimTestChannel::EHcrGetBool: { - HCR::TSettingId setting; + TSettingId setting; TBool value; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); - r = HCR::GetBool(setting, value); + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); + r = GetBool(setting, value); TEST_MEMPUT(a2, &value, sizeof(value)); break; } @@ -621,8 +747,8 @@ TEST_MEMGET(a1, args, sizeof(args)); TUint maxlen = (TUint) args[1]; // Retrieve structures from client - HCR::TSettingId id; - TEST_MEMGET(args[0], &id, sizeof(HCR::TSettingId)); + TSettingId id; + TEST_MEMGET(args[0], &id, sizeof(TSettingId)); // Allocate temporary memory TUint16 len; TUint8* value; @@ -636,7 +762,7 @@ else { // Actual API call - r = HCR::GetData(id, (TUint16) maxlen, + r = GetData(id, (TUint16) maxlen, value, len); // Send value back to client if (!r) @@ -652,8 +778,8 @@ } case RHcrSimTestChannel::EHcrGetDataDes: { - HCR::TSettingId setting; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); + TSettingId setting; + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); TInt userdes[sizeof(TDes8) / sizeof(TInt) + 1]; TEST_MEMGET(a2, userdes, sizeof(TDes8)); HBuf8* value; @@ -666,7 +792,7 @@ } else { - r = HCR::GetData(setting, *value); + r = GetData(setting, *value); TEST_DESPUT(a2, *value); TEST_ENTERCS(); delete value; @@ -676,37 +802,37 @@ } case RHcrSimTestChannel::EHcrGetUInt64: { - HCR::TSettingId setting; + TSettingId setting; TUint64 value; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); - r = HCR::GetUInt(setting, value); + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); + r = GetUInt(setting, value); TEST_MEMPUT(a2, &value, sizeof(value)); break; } case RHcrSimTestChannel::EHcrGetUInt32: { - HCR::TSettingId setting; + TSettingId setting; TUint32 value; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); - r = HCR::GetUInt(setting, value); + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); + r = GetUInt(setting, value); TEST_MEMPUT(a2, &value, sizeof(value)); break; } case RHcrSimTestChannel::EHcrGetUInt16: { - HCR::TSettingId setting; + TSettingId setting; TUint16 value; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); - r = HCR::GetUInt(setting, value); + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); + r = GetUInt(setting, value); TEST_MEMPUT(a2, &value, sizeof(value)); break; } case RHcrSimTestChannel::EHcrGetUInt8: { - HCR::TSettingId setting; + TSettingId setting; TUint8 value; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); - r = HCR::GetUInt(setting, value); + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); + r = GetUInt(setting, value); TEST_MEMPUT(a2, &value, sizeof(value)); break; } @@ -717,8 +843,8 @@ TEST_MEMGET(a1, args, sizeof(args)); TUint maxlen = (TUint) args[1]; // Retrieve structures from client - HCR::TSettingId id; - TEST_MEMGET(args[0], &id, sizeof(HCR::TSettingId)); + TSettingId id; + TEST_MEMGET(args[0], &id, sizeof(TSettingId)); // Allocate temporary memory TUint16 len; TInt32* value; @@ -732,7 +858,7 @@ else { // Actual API call - r = HCR::GetArray(id, (TUint16) maxlen, + r = GetArray(id, (TUint16) maxlen, value, len); // Send value back to client if (!r) @@ -753,8 +879,8 @@ TEST_MEMGET(a1, args, sizeof(args)); TUint maxlen = (TUint) args[1]; // Retrieve structures from client - HCR::TSettingId id; - TEST_MEMGET(args[0], &id, sizeof(HCR::TSettingId)); + TSettingId id; + TEST_MEMGET(args[0], &id, sizeof(TSettingId)); // Allocate temporary memory TUint16 len; TUint32* value; @@ -768,7 +894,7 @@ else { // Actual API call - r = HCR::GetArray(id, (TUint16) maxlen, + r = GetArray(id, (TUint16) maxlen, value, len); // Send value back to client if (!r) @@ -789,8 +915,8 @@ TEST_MEMGET(a1, args, sizeof(args)); TUint maxlen = (TUint) args[1]; // Retrieve structures from client - HCR::TSettingId id; - TEST_MEMGET(args[0], &id, sizeof(HCR::TSettingId)); + TSettingId id; + TEST_MEMGET(args[0], &id, sizeof(TSettingId)); // Allocate temporary memory TUint16 len; TText8* value; @@ -804,7 +930,7 @@ else { // Actual API call - r = HCR::GetString(id, (TUint16) maxlen, + r = GetString(id, (TUint16) maxlen, value, len); // Send value back to client if (!r) @@ -820,8 +946,8 @@ } case RHcrSimTestChannel::EHcrGetStringDes: { - HCR::TSettingId setting; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); + TSettingId setting; + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); TInt userdes[sizeof(TDes8) / sizeof(TInt) + 1]; TEST_MEMGET(a2, userdes, sizeof(TDes8)); HBuf8* value; @@ -834,7 +960,7 @@ } else { - r = HCR::GetString(setting, *value); + r = GetString(setting, *value); TEST_DESPUT(a2, *value); TEST_ENTERCS(); delete value; @@ -863,13 +989,13 @@ { pfile = NULL; } - if ((TUint) a2 == HCR::HCRInternal::ECoreRepos) + if ((TUint) a2 == HCRInternal::ECoreRepos) { - r = HCRSingleton->SwitchRepository(pfile, HCR::HCRInternal::ECoreRepos); + r = HCRSingleton->SwitchRepository(pfile, HCRInternal::ECoreRepos); } - else if ((TUint) a2 == HCR::HCRInternal::EOverrideRepos) + else if ((TUint) a2 == HCRInternal::EOverrideRepos) { - r = HCRSingleton->SwitchRepository(pfile, HCR::HCRInternal::EOverrideRepos); + r = HCRSingleton->SwitchRepository(pfile, HCRInternal::EOverrideRepos); } break; } @@ -886,18 +1012,28 @@ TEST_MEMPUT(a2, (TAny*) &TestKernExtensionTestError, sizeof(TInt)); } break; + case RHcrSimTestChannel::EHcrHasRepositoryInSmr: + { + r = KErrNone; + TBool smr; + TBool smrrep; + HasRepositoryInSmr(smr, smrrep); + TEST_MEMPUT(a1, (TAny*) &smr, sizeof(TBool)); + TEST_MEMPUT(a2, (TAny*) &smrrep, sizeof(TBool)); + } + break; case RHcrSimTestChannel::EHcrBenchmarkGetSettingInt: { r = KErrNone; TUint i; - HCR::TSettingId setting; + TSettingId setting; TInt32 value; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); // TUint32 start = NKern::TickCount(); for (i = 0; i < KTestBenchmarkIterations; i++) { - r |= HCR::GetInt(setting, value); + r |= GetInt(setting, value); } TUint32 end = NKern::TickCount(); // @@ -910,12 +1046,12 @@ { r = KErrNone; TUint i; - HCR::TSettingId setting; + TSettingId setting; TText8* value; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); // Allocate temporary memory TEST_ENTERCS(); - value = (TText8*) Kern::Alloc(HCR::KMaxSettingLength); + value = (TText8*) Kern::Alloc(KMaxSettingLength); TEST_LEAVECS(); if (value == NULL) { @@ -927,7 +1063,7 @@ TUint32 start = NKern::TickCount(); for (i = 0; i < KTestBenchmarkIterations; i++) { - r |= HCR::GetString(setting, (TUint16) HCR::KMaxSettingLength, value, len); + r |= GetString(setting, (TUint16) KMaxSettingLength, value, len); } TUint32 end = NKern::TickCount(); // @@ -944,13 +1080,13 @@ { r = KErrNone; TUint i; - HCR::TSettingId setting; - TBuf8<HCR::KMaxSettingLength> value; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); + TSettingId setting; + TBuf8<KMaxSettingLength> value; + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); TUint32 start = NKern::TickCount(); for (i = 0; i < KTestBenchmarkIterations; i++) { - r |= HCR::GetString(setting, value); + r |= GetString(setting, value); } TUint32 end = NKern::TickCount(); // @@ -966,7 +1102,7 @@ TUint32 start = NKern::TickCount(); for (i = 0; i < KTestBenchmarkIterations; i++) { - r |= HCR::FindNumSettingsInCategory((HCR::TCategoryUid) a1); + r |= FindNumSettingsInCategory((TCategoryUid) a1); } TUint32 end = NKern::TickCount(); // @@ -980,11 +1116,11 @@ r = 0; TUint i; - HCR::TElementId* ids; - HCR::TSettingType* types; + TElementId* ids; + TSettingType* types; TUint16* lens; TEST_ENTERCS(); - ids = (HCR::TElementId*) Kern::Alloc(KTestBenchmarkNumberOfSettingsInCategory * sizeof(HCR::TElementId)); + ids = (TElementId*) Kern::Alloc(KTestBenchmarkNumberOfSettingsInCategory * sizeof(TElementId)); TEST_LEAVECS(); if (!ids) { @@ -995,7 +1131,7 @@ { TEST_ENTERCS(); - types = (HCR::TSettingType*) Kern::Alloc(KTestBenchmarkNumberOfSettingsInCategory * sizeof(HCR::TSettingType)); + types = (TSettingType*) Kern::Alloc(KTestBenchmarkNumberOfSettingsInCategory * sizeof(TSettingType)); TEST_LEAVECS(); if (!types) { @@ -1018,7 +1154,7 @@ TUint32 start = NKern::TickCount(); for (i = 0; i < KTestBenchmarkIterations; i++) { - r |= HCR::FindSettings((HCR::TCategoryUid) a1, + r |= FindSettings((TCategoryUid) a1, KTestBenchmarkNumberOfSettingsInCategory, ids, types, lens); } @@ -1046,15 +1182,15 @@ { r = KErrNone; TUint i; - HCR::TSettingId setting; - HCR::TSettingType type; + TSettingId setting; + TSettingType type; TUint16 len; - TEST_MEMGET(a1, &setting, sizeof(HCR::TSettingId)); + TEST_MEMGET(a1, &setting, sizeof(TSettingId)); // TUint32 start = NKern::TickCount(); for (i = 0; i < KTestBenchmarkIterations; i++) { - r |= HCR::GetTypeAndSize(setting, type, len); + r |= GetTypeAndSize(setting, type, len); } TUint32 end = NKern::TickCount(); // @@ -1067,15 +1203,15 @@ { r = 0; TUint i; - HCR::SSettingId* ids; - HCR::TSettingType* types; - HCR::TCategoryUid catId = (HCR::TCategoryUid)a1; + SSettingId* ids; + TSettingType* types; + TCategoryUid catId = (TCategoryUid)a1; TInt32* values; TInt* errors; TEST_ENTERCS(); //We allocate here KTestBenchmarkNumberOfSettingsInCategory - 1 because //last element in the category is a large setting - ids = (HCR::SSettingId*) Kern::Alloc((KTestBenchmarkNumberOfSettingsInCategory - 1) * sizeof(HCR::SSettingId)); + ids = (SSettingId*) Kern::Alloc((KTestBenchmarkNumberOfSettingsInCategory - 1) * sizeof(SSettingId)); TEST_LEAVECS(); if (!ids) { @@ -1091,7 +1227,7 @@ ids[eId].iKey = eId + 1; } TEST_ENTERCS(); - types = (HCR::TSettingType*) Kern::Alloc((KTestBenchmarkNumberOfSettingsInCategory - 1) * sizeof(HCR::TSettingType)); + types = (TSettingType*) Kern::Alloc((KTestBenchmarkNumberOfSettingsInCategory - 1) * sizeof(TSettingType)); TEST_LEAVECS(); if (!types) { @@ -1123,7 +1259,7 @@ TUint32 start = NKern::TickCount(); for (i = 0; i < KTestGetMultipleBenchmarkIterations; i++) { - r |= HCR::GetWordSettings(KTestBenchmarkNumberOfSettingsInCategory - 1, ids, values, types, errors); + r |= GetWordSettings(KTestBenchmarkNumberOfSettingsInCategory - 1, ids, values, types, errors); } TUint32 end = NKern::TickCount(); //
--- a/kerneltest/e32test/hcr/d_hcrsim.h Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/d_hcrsim.h Tue Jan 26 13:13:38 2010 +0200 @@ -21,14 +21,13 @@ #include <e32cmn.h> #include <e32ver.h> #include <drivers/hcr.h> -#ifndef HCRTEST_USERSIDE_INTERFACE #include "hcr_hai.h" #include "hcr_pil.h" -#endif // HCRTEST_USERSIDE_INTERFACE + +using namespace HCR; -#ifndef __KERNEL_MODE__ -using namespace HCR; -#endif // __KERNEL_MODE__ +//Local helper macros +#define _ABS(x) (x > 0 ? x : -x) // Device driver names _LIT(KTestHcrRealOwn, "d_hcrext_own"); @@ -111,6 +110,7 @@ EHcrCheckIntegrity, // Others EHcrGetInitExtensionTestResults, + EHcrHasRepositoryInSmr, EHcrBenchmarkGetSettingInt, EHcrBenchmarkGetSettingArray, EHcrBenchmarkGetSettingDes, @@ -125,11 +125,11 @@ inline TInt GetLinAddr(const TSettingId& aId, TLinAddr& aValue); inline TInt FindNumSettingsInCategory(TCategoryUid aCatUid); inline TInt FindSettings(TCategoryUid aCatUid, - TInt aMaxNum, TUint32& aNumFound, - TElementId* aElIds, TSettingType* aTypes, TUint16* aLens); + TInt aMaxNum, TElementId* aElIds, TSettingType* aTypes, + TUint16* aLens); inline TInt FindSettings(TCategoryUid aCat, TInt aMaxNum, - TUint32 aMask, TUint32 aPattern, TUint32& aNumFound, - TElementId* aElIds, TSettingType* aTypes, TUint16* aLens); + TUint32 aMask, TUint32 aPattern, TElementId* aElIds, + TSettingType* aTypes, TUint16* aLens); inline TInt GetTypeAndSize(const TSettingId& aId, TSettingType& aType, TUint16& aLen); inline TInt GetWordSettings(TInt aNum, const SSettingId aIds[], @@ -158,6 +158,7 @@ inline TInt SwitchRepository(const TDesC8& aFileName, HCRInternal::TReposId aId); inline TInt CheckIntegrity(); inline TInt GetInitExtensionTestResults(TInt& aLine, TInt& aError); + inline TInt HasRepositoryInSmr(TBool& aHasSmr, TBool& aHasSmrRep); inline TInt BenchmarkGetSettingInt(const TSettingId& aId, TUint32& aTimeMs); inline TInt BenchmarkGetSettingArray(const TSettingId& aId, TUint32& aTimeMs); inline TInt BenchmarkGetSettingDes(const TSettingId& aId, TUint32& aTimeMs); @@ -176,28 +177,27 @@ inline TInt RHcrSimTestChannel::FindNumSettingsInCategory(TCategoryUid aCatUid) {return DoControl(EHcrFindNumSettingsInCategory, (TAny*) aCatUid);} inline TInt RHcrSimTestChannel::FindSettings(TCategoryUid aCatUid, - TInt aMaxNum, TUint32& aNumFound, - TElementId* aElIds, TSettingType* aTypes, TUint16* aLens) + TInt aMaxNum, TElementId* aElIds, TSettingType* aTypes, TUint16* aLens) { TAny* args[6]; args[0] = (TAny*) aCatUid; args[1] = (TAny*) aMaxNum; - args[2] = (TAny*) &aNumFound; + args[2] = 0; //It's not used args[3] = (TAny*) aElIds; args[4] = (TAny*) aTypes; args[5] = (TAny*) aLens; return DoControl(EHcrFindSettingsCategory, (TAny*) args); } inline TInt RHcrSimTestChannel::FindSettings(TCategoryUid aCat, TInt aMaxNum, - TUint32 aMask, TUint32 aPattern, TUint32& aNumFound, - TElementId* aElIds, TSettingType* aTypes, TUint16* aLens) + TUint32 aMask, TUint32 aPattern, TElementId* aElIds, + TSettingType* aTypes, TUint16* aLens) { TAny* args[8]; args[0] = (TAny*) aCat; args[1] = (TAny*) aMaxNum; args[2] = (TAny*) aMask; args[3] = (TAny*) aPattern; - args[4] = (TAny*) &aNumFound; + args[4] = 0; //It's not used args[5] = (TAny*) aElIds; args[6] = (TAny*) aTypes; args[7] = (TAny*) aLens; @@ -294,6 +294,8 @@ {return DoControl(EHcrCheckIntegrity);} inline TInt RHcrSimTestChannel::GetInitExtensionTestResults(TInt& aLine, TInt& aError) {return DoControl(EHcrGetInitExtensionTestResults, (TAny*) &aLine, (TAny*) &aError);} +inline TInt RHcrSimTestChannel::HasRepositoryInSmr(TBool& aHasSmr, TBool& aHasSmrRep) + {return DoControl(EHcrHasRepositoryInSmr, (TAny*) &aHasSmr, (TAny*) &aHasSmrRep);} inline TInt RHcrSimTestChannel::BenchmarkGetSettingInt(const TSettingId& aId, TUint32& aTimeMs) {return DoControl(EHcrBenchmarkGetSettingInt, (TAny*) &aId, (TAny*) &aTimeMs);} inline TInt RHcrSimTestChannel::BenchmarkGetSettingArray(const TSettingId& aId, TUint32& aTimeMs)
--- a/kerneltest/e32test/hcr/d_hcrsim.mmp Mon Jan 18 21:31:10 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// Hardware Configuration Respoitory Tests -// - -macro HCRTEST_NO_EXPORT -macro HCRTEST_COREIMG_DONTUSE_ROMHDR - -#define HCRTEST_TEST_MMP -#include "../../../kernel/eka/drivers/hcr/hcr.mmh" -target d_hcrsim.ldd -targettype ldd -userinclude ../../../kernel/eka/drivers/hcr -sourcepath ../../../kernel/eka/drivers/hcr -source HCR_PIL_SOURCE -sourcepath . -source d_hcrsim.cpp -source d_hcrsim_psl.cpp -source d_hcrsim_psl_config.cpp - -epocallowdlldata -smpsafe - -start wins -win32_headers -end
--- a/kerneltest/e32test/hcr/d_hcrsim_psl.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/d_hcrsim_psl.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -110,6 +110,11 @@ TInt HCRTest::GetOverrideRepositoryAddress(TAny*& aAddr) { HCR_FUNC("HCRTest::GetRAMRepositoryAddress"); + // Note: the SMR feature by which we obtain the address of the override + // repository is only supported in the ARM bootstrap, not X86 so this test + // code may in the future need conditional compilation should it need to + // access the SuperPage SMR field to return KErrNotSupported for __X86__ + // compilations. TInt r = KErrNotSupported; if (PslConfigurationFlags & ETestEnableOverrideRepository) {
--- a/kerneltest/e32test/hcr/d_hcrsim_testdata.h Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/d_hcrsim_testdata.h Tue Jan 26 13:13:38 2010 +0200 @@ -14,6 +14,9 @@ // Hardware Configuration Respoitory Test Application // +#ifndef D_HCRSIM_TESTDATA_H +#define D_HCRSIM_TESTDATA_H + const TText8* TestString1 = reinterpret_cast<const TText8*>("_"); const TText8* TestString64a = reinterpret_cast<const TText8*>("Two peanuts walked into a bar, and ... one was a-salted... !!! #"); const TText8* TestString64b = reinterpret_cast<const TText8*>("A termite walks into a bar and says, 'Is the bar tender here?' #"); @@ -181,7 +184,17 @@ 0xd665d40b, 0xd88e2f37, 0x4a54a266, 0xbb462ef0, }; -const TCategoryUid KTestCategories[] = {1, 2, 1000, 0xffffffff, 0x10000001, 0x10000002, 0x10000003, 0x10000004}; +const TCategoryUid KTestCategories[] = { + 1, // 0 + 2, // 1 + 1000, // 2 + 0xfffffff0, // 3 + 0x10000001, // 4 + 0x10000002, // 5 + 0x10000003, // 6 + 0x10000004 // 7 + }; + const TInt64 KTestI64One = I64LIT(-1); const TInt64 KTestI64Two = KMinTInt64; const TInt64 KTestI64Three = KMaxTInt64; @@ -245,7 +258,7 @@ {{{ KTestCategories[0], 1}, ETypeInt32, 0x0000, 0 }, {{ 0 }}}, {{{ KTestCategories[0], 2}, ETypeInt32, 0x0000, 0 }, {{ 0 }}}, }; -#ifndef __KERNEL_MODE__ +#if !defined(__KERNEL_MODE__) || defined(HCRTEST_USERSIDE_INTERFACE) const TUint32 KTestInvalidCategory = 1234; const TUint32 KTestInvalidSettingId = 5678; @@ -657,4 +670,5 @@ {{{ KTestCategories[5], 0x00d0}, ETypeUInt64, 0x0000, sizeof(TUint64) }, {{ reinterpret_cast<TInt32>(&KTestU64Three) }}}, {{{ KTestCategories[5], 0xffffffff}, ETypeInt8, 0x0000, 0 }, {{ 1 }}}, }; -#endif // __KERNEL_MODE__ +#endif // !defined(__KERNEL_MODE__) || defined(HCRTEST_USERSIDE_INTERFACE) +#endif // !D_HCRSIM_TESTDATA_H
--- a/kerneltest/e32test/hcr/d_hcrut.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/d_hcrut.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -24,18 +24,18 @@ #include <platform.h> #include <u32hal.h> #include "d_hcrut.h" - +#include "hcr_hai.h" #include "hcr_pil.h" #include <drivers/hcr.h> - - +#define TEST_MEMGET(s, d, l) kumemget(d, s, l) +#define TEST_MEMPUT(d, s, l) kumemput(d, s, l) +#include "HcrImageData_102400.h" // -- CLASSES ----------------------------------------------------------------- - class DHcrTestFactory : public DLogicalDevice { public: @@ -83,7 +83,11 @@ HCR::TRepository* GetCoreImgRepos(); HCR::TRepository* GetOverrideImgRepos(); + HCR::MVariant* GetVariant() {return iHcrInt->iVariant;}; TInt SwitchRepository(const TText * aFileName, const HCR::HCRInternal::TReposId aId=HCR::HCRInternal::ECoreRepos); + + TInt CheckIntegrity(void); + TInt FindSetting(const TSettingId& aId, TSettingType aType, TSettingRef& aSetting); public: @@ -128,6 +132,20 @@ NKern::ThreadLeaveCS(); return retVal; } + + +TInt HCR::HCRInternalTestObserver::CheckIntegrity(void) + { + TInt retVal = iHcrInt->CheckIntegrity(); + return retVal; + } + +TInt HCR::HCRInternalTestObserver::FindSetting(const TSettingId& aId, TSettingType aType, TSettingRef& aSetting) + { + TInt retVal = iHcrInt->FindSetting( aId, aType, aSetting); + return retVal; + } + // -- GLOBALS ----------------------------------------------------------------- // @@ -195,12 +213,10 @@ return KErrNone; } -TInt DHcrTestChannel::Request(TInt aReqNo, TAny*, TAny*) +TInt DHcrTestChannel::Request(TInt aReqNo, TAny* a1, TAny* /*a2*/ ) { HCR_FUNC("DHcrTestChannel::Request"); - - switch(aReqNo) { @@ -216,6 +232,118 @@ case RHcrTest::ECtrlGetWordSetting: { + TAny* args[3]; + TEST_MEMGET(a1, args, sizeof(args)); + + HCR::TCategoryUid category = (HCR::TCategoryUid) args[0]; + + HCR::TElementId key = (HCR::TElementId) args[1]; + + TInt type = (TInt) args[2]; + + const TText * fileInSysBinName = (const TText *)"filerepos.dat"; + TInt err = gObserver.SwitchRepository(fileInSysBinName, HCR::HCRInternal::ECoreRepos); + if (err != KErrNone) + HCR_TRACE_RETURN(err); + + // Negative tests on HCR::TRepositoryFile; aNum will be 0 + HCR::TRepository* repos = gObserver.GetCoreImgRepos();; + __NK_ASSERT_DEBUG(repos != NULL); + + + HCR::SSettingId* ids[1];// = new HCR::SSettingId*[1]; + + TInt32* vals[1]; + TInt* errs[1]; + HCR::TSettingType* types[1]; + + NKern::ThreadEnterCS(); + ids[0] = new HCR::SSettingId(); + vals[0] = new TInt32(); + errs[0] = new TInt(); + types[0] = new HCR::TSettingType(); + + if(ids[0] == NULL || vals[0] == NULL || errs[0] == NULL || types[0] == NULL) + { + delete ids[0]; + delete vals[0]; + delete errs[0]; + delete types[0]; + NKern::ThreadLeaveCS(); + HCR_TRACE_RETURN(KErrNoMemory); + } + + ids[0]->iCat = category; + ids[0]->iKey = key; + + // Negative tests on HCR::TRepositoryFile; aNum will be 0 + TInt r = repos->GetWordSettings(0, ids, vals, types, errs); + // only expected errors are KErrNotFound or KErrNone + // thest if there is other error; if yes fail the test + if(r != KErrNotFound && r != KErrNone && r < KErrNone) + { + delete ids[0]; + delete vals[0]; + delete errs[0]; + delete types[0]; + NKern::ThreadLeaveCS(); + HCR_TRACE_RETURN(r); + } + + // Negative testing on HCR::TRepositoryFile; try to get words for large value + if(type > HCR::ETypeLinAddr) + { + r = repos->GetWordSettings(1, ids, vals, types, errs); + if(r != KErrArgument && r != KErrNotFound && r < KErrNone) + { + delete ids[0]; + delete vals[0]; + delete errs[0]; + delete types[0]; + NKern::ThreadLeaveCS(); + HCR_TRACE_RETURN(r); + } + } + + HCR::TRepositoryCompiled* compiledRepos = reinterpret_cast<HCR::TRepositoryCompiled*>(gObserver.GetVariantImgRepos()); + __NK_ASSERT_DEBUG(compiledRepos != NULL); + + ids[0]->iCat = KHCRUID_TestCategory1; + ids[0]->iKey = key; + + // Negative tests on HCR::TRepositoryCompiled; aNum will be 0 + r = compiledRepos->GetWordSettings(0, ids, vals, types, errs); + if(r != KErrNotFound && r != KErrNone && r < KErrNone) + { + delete ids[0]; + delete vals[0]; + delete errs[0]; + delete types[0]; + NKern::ThreadLeaveCS(); + HCR_TRACE_RETURN(r); + } + + // Negative testing on HCR::TRepositoryFile; try to get words for large value + if(type > HCR::ETypeLinAddr) + { + r = compiledRepos->GetWordSettings(1, ids, vals, types, errs); + if(r != KErrArgument && r != KErrNotFound && r < KErrNone) + { + delete ids[0]; + delete vals[0]; + delete errs[0]; + delete types[0]; + NKern::ThreadLeaveCS(); + HCR_TRACE_RETURN(r); + } + } + + delete ids[0]; + delete vals[0]; + delete errs[0]; + delete types[0]; + NKern::ThreadLeaveCS(); + return KErrNone; } @@ -303,10 +431,210 @@ return err; } - case RHcrTest::ECtrlFreePhyscialRam: + case RHcrTest::ECtrlNegativeTestsLargeValues: + { + //Test that HCR::TRepositoryCompiled::GetLargeValue & HCR::TRepositoryFile::GetLargeValue return KErrArgument + TAny* args[1]; + TEST_MEMGET(a1, args, sizeof(args)); + // Retrieve structures from client + TInt expectedError = (TUint) args[0]; + + const TText * fileInSysBinName = (const TText *)"filerepos.dat"; + TInt err = gObserver.SwitchRepository(fileInSysBinName, HCR::HCRInternal::ECoreRepos); + if (err != KErrNone) + HCR_TRACE_RETURN(err); + + // Do test for HCR::TRepositoryFile + HCR::TRepository* repos = gObserver.GetCoreImgRepos();; + __NK_ASSERT_DEBUG(repos != NULL); + + HCR::UValueLarge value; + HCR::TSettingRef ref(0,0); + HCR::TSettingId id(1,1); //word setting value in repository + err = repos->FindSetting(id, ref); + if(err == KErrNone) + { + err = repos->GetLargeValue(ref, value); + if(err != expectedError) + { + HCR_TRACE_RETURN(err); + } + } + + //Do test for HCR::TRepositoryCompiled + HCR::TRepositoryCompiled* compiledRepos = reinterpret_cast<HCR::TRepositoryCompiled*>(gObserver.GetVariantImgRepos()); + if (compiledRepos == 0) + { + HCR_TRACE_RETURN(KErrGeneral); + } + + id = HCR::TSettingId(KHCRUID_TestCategory1,1); + err = compiledRepos->FindSetting(id, ref); + if(err == KErrNone) + { + err = compiledRepos->GetLargeValue(ref, value); + if(err != expectedError) + { + HCR_TRACE_RETURN(err); + } + } + + return KErrNone; + } + + + case RHcrTest::ECtrlCheckOverrideReposIntegrity: + { + HCR::TRepository* overrideRepos = gObserver.GetOverrideImgRepos(); // Shadowed SMR/HCR + TInt err = KErrNone; + + if( 0 != overrideRepos ) + { + err = overrideRepos->CheckIntegrity(); + + } + return err; + } + + case RHcrTest::ECtrlCheckOverrideRepos102400Content: { - return KErrNone; + HCR::TRepository* overrideRepos = gObserver.GetOverrideImgRepos(); // Shadowed SMR/HCR + TInt err = KErrNone; + + if( 0 != overrideRepos ) + { + for( TInt index = 0; index < itemsSize; ++index) + { + HCR::TSettingId id(items[index].iCategoryUID, items[index].iElementID); + HCR_TRACE3("--- index:%5d, iCategoryUID:0x%08x, iElementID:0x%08x" + , index + , items[index].iCategoryUID + , items[index].iElementID + ); + HCR::TSettingRef val(overrideRepos, 0); + HCR::TSettingType type = (HCR::TSettingType)items[index].iType; + TInt r = gObserver.FindSetting(id, type, val); + if( r != KErrNone) + { + err = KErrNotFound; + break; + } + HCR::UValueWord valueWord; + r = overrideRepos->GetValue(val, valueWord); + HCR_TRACE1("--- value:0x%08x", valueWord.iUInt32); + if( valueWord.iUInt32 != items[index].iValue) + { + err = KErrNotFound; + break; + } + } + } + return err; } + + case RHcrTest::ECtrlSwitchFileRepository: + { + TInt r; + TAny* args[2]; + TEST_MEMGET(a1, args, sizeof(args)); + const TText* fileRepName = (TText*) args[0]; + + r = gObserver.SwitchRepository(fileRepName, HCR::HCRInternal::ECoreRepos); + if (r != KErrNone) + { + HCR_TRACE_RETURN(r); + } + else + return r; + } + + case RHcrTest::ECtrlCompiledFindSettingsInCategory: + { + TInt r = 0; + //Do test for HCR::TRepositoryCompiled + TAny* args[3]; + + + //It's a pre-condition to enter critical section before + //kernel memory allocation + NKern::ThreadEnterCS(); + TInt32* pFirst = new TInt32; + TInt32* pLast = new TInt32; + //We've done with allocation, exit CS + NKern::ThreadLeaveCS(); + + if(!pFirst || !pLast) + { + HCR_TRACE_RETURN(KErrNoMemory); + } + + TEST_MEMGET(a1, args, sizeof(args)); + HCR::TCategoryUid catUid = (HCR::TCategoryUid)args[0]; + + + HCR::TRepositoryCompiled* compiledRepos = + reinterpret_cast<HCR::TRepositoryCompiled*>(gObserver.GetVariantImgRepos()); + if (compiledRepos == 0) + { + HCR_TRACE_RETURN(KErrGeneral); + } + + //This function return the result of operation r and first element and + //last element in the category written back to the user side test code + //variable referenced by pFirst and pLast pointers + r = compiledRepos->FindNumSettingsInCategory(catUid, + *pFirst, *pLast); + + TEST_MEMPUT(args[1], pFirst, sizeof(TInt32)); + TEST_MEMPUT(args[2], pLast, sizeof(TInt32)); + + if(r < 0) + {HCR_TRACE_RETURN(r);} + else + return r; + } + + case RHcrTest::ECtrlFileFindSettingsInCategory: + { + TInt r; + TAny* args[3]; + TEST_MEMGET(a1, args, sizeof(args)); + HCR::TCategoryUid catUid = (HCR::TCategoryUid)args[0]; + + //It's a pre-condition to enter critical section before + //kernel memory allocation + NKern::ThreadEnterCS(); + TInt32* pFirst = new TInt32; + TInt32* pLast = new TInt32; + //We've done with allocation, exit CS + NKern::ThreadLeaveCS(); + + if(!pFirst || !pLast) + { + HCR_TRACE_RETURN(KErrNoMemory); + } + + + // Do test for HCR::TRepositoryFile + HCR::TRepository* repos = gObserver.GetCoreImgRepos(); + __NK_ASSERT_DEBUG(repos != NULL); + + //This function return the result of operation r and first element and + //last element in the category written back to the user side test code + //variable referenced by pFirst and pLast pointers + r = repos->FindNumSettingsInCategory(catUid, + *pFirst, *pLast); + + TEST_MEMPUT(args[1], pFirst, sizeof(TInt32)); + TEST_MEMPUT(args[2], pLast, sizeof(TInt32)); + + if(r < 0) + {HCR_TRACE_RETURN(r);} + else + return r; + } + + default: break; @@ -322,16 +650,23 @@ DECLARE_STANDARD_LDD() { HCR_FUNC("D_HCR_DECLARE_STANDARD_LDD"); - + + // Try to initialise without a varian; KErrGeneral error should be returned + new(&gTestHcrInt) HCR::HCRInternal(NULL); + TInt err = gTestHcrInt.Initialise(); + if (err != KErrGeneral) + return 0; + + // Taken from HCR_PIL.CPP InitExtension() method HCR::MVariant* varPtr = CreateHCRVariant(); if (varPtr==0) return 0; - + new(&gTestHcrInt) HCR::HCRInternal(varPtr); - - TInt err = gTestHcrInt.Initialise(); + + err = gTestHcrInt.Initialise(); if (err != KErrNone) return 0;
--- a/kerneltest/e32test/hcr/d_hcrut.h Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/d_hcrut.h Tue Jan 26 13:13:38 2010 +0200 @@ -14,8 +14,8 @@ // Hardware Configuration Respoitory Tests // -#ifndef D_HCR_H -#define D_HCR_H +#ifndef D_HCRUT_H +#define D_HCRUT_H #include <e32cmn.h> #include <e32ver.h> @@ -31,6 +31,7 @@ */ class RHcrTest : public RBusLogicalChannel { + public: #ifndef __KERNEL_MODE__ @@ -48,18 +49,69 @@ { return DoControl(ECtrlSanityTestLargeSettings); } - - inline TUint Test_ReleaseSDRs() - { - return DoControl(ECtrlFreePhyscialRam); - } inline TUint Test_SwitchRepository() { return DoControl(ECtrlSwitchRepository); } + + inline TUint Test_FindCompiledSettingsInCategory(HCR::TCategoryUid aCatUid, + TInt32* aFirst, TInt32* aLast) + { + TAny* args[3]; + args[0] = (TAny*) aCatUid; + args[1] = (TAny*) aFirst; + args[2] = (TAny*) aLast; + + return DoControl(ECtrlCompiledFindSettingsInCategory, (TAny*)args); + } + + inline TUint Test_FindFileSettingsInCategory(HCR::TCategoryUid aCatUid, + TInt32* aFirst, TInt32* aLast) + { + TAny* args[3]; + args[0] = (TAny*) aCatUid; + args[1] = (TAny*) aFirst; + args[2] = (TAny*) aLast; + + return DoControl(ECtrlFileFindSettingsInCategory, (TAny*)args); + } + + inline TUint Test_SwitchFileRepository(const TText* aRepName) + { + TAny* args[1]; + args[0] = (TAny*) aRepName; + return DoControl(ECtrlSwitchFileRepository, (TAny*)args); + } + inline TUint Test_CheckIntegrity() + { + return DoControl(ECtrlCheckOverrideReposIntegrity); + } + + inline TUint Test_CheckContent() + { + return DoControl(ECtrlCheckOverrideRepos102400Content); + } + + inline TUint Test_NegativeTestsLargeValues(TInt& aExpectedError) + { + TAny* args[1]; + args[0] = (TAny*) aExpectedError; + return DoControl(ECtrlNegativeTestsLargeValues, (TAny*) args); + } + inline TUint Test_TRepositoryGetWordValue(HCR::TCategoryUid& aCategory, HCR::TElementId& aKey,TInt& type) + { + TAny* args[3]; + args[0] = (TAny*) aCategory; + args[1] = (TAny*) aKey; + args[2] = (TAny*) type; + return DoControl(ECtrlGetWordSetting, (TAny*) args); + } + + + #endif inline static const TDesC& Name(); @@ -78,8 +130,16 @@ ECtrlGetManyLargeSettings, ECtrlSwitchRepository, + + ECtrlNegativeTestsLargeValues, - ECtrlFreePhyscialRam + ECtrlFreePhyscialRam, + ECtrlCheckOverrideReposIntegrity, + ECtrlCheckOverrideRepos102400Content, + + ECtrlSwitchFileRepository, + ECtrlFileFindSettingsInCategory, + ECtrlCompiledFindSettingsInCategory }; friend class DHcrTestChannel; @@ -88,10 +148,8 @@ inline const TDesC& RHcrTest::Name() { - _LIT(KTestDriver,"d_hcr"); + _LIT(KTestDriver,"d_hcrut"); return KTestDriver; } - - -#endif // D_HCR_H +#endif // D_HCRUT_H
--- a/kerneltest/e32test/hcr/d_hcrut.mmp Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/d_hcrut.mmp Tue Jan 26 13:13:38 2010 +0200 @@ -16,7 +16,8 @@ macro HCRTEST_NO_EXPORT macro HCRTEST_NO_KEXT_ENTRY_POINT -macro HCR_TRACE +// Uncomment for debug trace +// macro HCR_TRACE #define HCRTEST_TEST_MMP #include "../../../kernel/eka/drivers/hcr/hcr.mmh" @@ -24,6 +25,7 @@ targettype ldd userinclude ../../../kernel/eka/drivers/hcr +userinclude ../../../../boardsupport/naviengine/navienginebsp/ne1_tb/hcr sourcepath ../../../kernel/eka/drivers/hcr source HCR_PIL_SOURCE
--- a/kerneltest/e32test/hcr/d_hcrut_psl.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/d_hcrut_psl.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -1,12 +1,14 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +*/ // // Contributors: // @@ -23,14 +25,24 @@ #include "hcr_hai.h" +#include "hcr_uids.h" + +#include <plat_priv.h> +#include <kernel/kernboot.h> + + +#ifdef __WINS__ +// On WINS the EMapAttrSupRo and EMapAttrCachedMax doesn't exists +#define EMapAttrSupRo 0x01 +#define EMapAttrCachedMax 0xF000 +#endif // -- GLOBALS ----------------------------------------------------------------- -#define GLOBAL_REPOSITORY GLREF_C HCR::SRepositoryCompiled -//GLREF_C HCR::SRepositoryCompiled gRepository; -GLOBAL_REPOSITORY gRepository; +GLREF_C HCR::SRepositoryCompiled gRepository; +#define BUFFER_OFFSET_ZERO 0 // -- CLASSES- ---------------------------------------------------------------- @@ -51,6 +63,8 @@ TInt GetCompiledRepositoryAddress( TAny* & aAddr); TInt GetOverrideRepositoryAddress( TAny* & aAddr); +private: + DChunk * iChunk; }; @@ -60,6 +74,7 @@ HCRVariant::HCRVariant() + : iChunk(0) { HCR_FUNC("HCRVariant"); } @@ -68,6 +83,13 @@ HCRVariant::~HCRVariant() { HCR_FUNC("~HCRVariant"); + if (iChunk != 0) + { + NKern::ThreadEnterCS(); + TInt r = Kern::ChunkClose(iChunk); + __NK_ASSERT_ALWAYS(r!=0); + NKern::ThreadLeaveCS(); + } } @@ -86,8 +108,7 @@ aAddr = static_cast<TAny*>(&gRepository); HCR_TRACE_RETURN(KErrNone); } - - + TBool HCRVariant::IgnoreCoreImgRepository() { HCR_FUNC("HCRVariant::IgnoreCoreImgRepository"); @@ -98,9 +119,107 @@ TInt HCRVariant::GetOverrideRepositoryAddress( TAny* & aAddr) { HCR_FUNC("HCRVariant::GetRAMRepositoryAddress"); - aAddr = NULL; + aAddr = 0; + + // Note: the SMR feature by which we obtain the address of the override + // repository is only supported in the ARM bootstrap, not X86 or WINS so + // this test code needs conditional compilation. +#if !defined(__WINS__) && !defined(__X86__) + + // Note to future implementor: + // #include <kernel\kernboot.h> + // First check to see if SMRIB was created during boot time. + // If SSuperPageBase::iSmrData == KSuperPageAddressFieldUndefined (i.e. -1) + // it does not exist, return KErrNotSupported, SMR not support by base port + // or it is not available due to boot scenario, i.e. boot from MMC + // + // If it does exist (i.e. boot from NAND) then read and process the + // SMR entries listed in the SMRIB looking for KHCRUID_SMRPayloadUID. + // Next using the internal sizes from the HCR dat file within the SMR image + // determine if the RAM holding the SMR image can be shrunk to return + // unused RAM pages at the end of the image. + // + // Finally allocate the reserved RAM identified in the SMR entry to a + // DChunk and return the virtual address of the HCR data file payload + // within the SMR image, i.e. iBase+(sizeof(SSmrRomHeader)>>2). + // Locate SMRIB + const TSuperPage& superpage = Kern::SuperPage(); + TUint32* smrIB; + smrIB = (TUint32 *) superpage.iSmrData; + + HCR_TRACE2("--- Superpage: 0x%08x, SMRIB: 0x%08x", &superpage, smrIB); + + if( (smrIB == NULL) || (smrIB == (TUint32*)KSuperPageAddressFieldUndefined)) + { + HCR_TRACE_RETURN(KErrNotSupported); + } + + HCR_HEX_DUMP_ABS((TUint8 *)smrIB, 8*sizeof(SSmrBank) ); + SSmrBank * smrBank = (SSmrBank *) smrIB; + + // T_HCRUT designed to work ith the second HCR SMR image as the first + // is used by the t_hcr test suite. + int smrInst = 2; + + while( smrBank->iBase != 0 ) + { + HCR_TRACE2("--- smrBank: 0x%08x, smrBank->iPayloadUID: 0x%08x", smrBank, smrBank->iPayloadUID); + + if (smrBank->iPayloadUID == KHCRUID_SMRPayloadUID) + { + smrInst--; + if (smrInst == 0) // PSL to use only the 2nd HCR SMR image + { + + HCR_TRACE2("--- smrPhysAddr: 0x%08x, size:0x%08x", smrBank->iBase, smrBank->iSize); + NKern::ThreadEnterCS(); + + TChunkCreateInfo info; + info.iType = TChunkCreateInfo::ESharedKernelSingle; + info.iMaxSize = smrBank->iSize; + + // Enable to give supervisor read only access and maximum caching at both L1 and L2. + info.iMapAttr = EMapAttrSupRo|EMapAttrCachedMax; + + info.iOwnsMemory = EFalse; + info.iDestroyedDfc = NULL; + TUint32 mapAttr; + TLinAddr chunkKernAddr; + TInt r = Kern::ChunkCreate(info, iChunk, chunkKernAddr, mapAttr); + if( r != KErrNone ) + { + HCR_TRACE1("--- Kern::ChunkCreate failed: 0x%08x", r); + NKern::ThreadLeaveCS(); + HCR_TRACE_RETURN(r); + } + + r = Kern::ChunkCommitPhysical(iChunk, BUFFER_OFFSET_ZERO, smrBank->iSize, smrBank->iBase); + if( r != KErrNone) + { + HCR_TRACE1("--- Kern::ChunkCommitPhysical failed: 0x%08x", r); + TInt r2 = Kern::ChunkClose(iChunk); + __NK_ASSERT_ALWAYS(r2!=0); + NKern::ThreadLeaveCS(); + HCR_TRACE_RETURN(r); + } + NKern::ThreadLeaveCS(); + + HCR_TRACE1("--- iChunkKernAddr: 0x%08x", chunkKernAddr); + // It should contains SMR and HCR image headers and some settings + HCR_HEX_DUMP_ABS((TUint8 *)chunkKernAddr, 1024 ); + + // Skip the SMR header, so we return the address of the first byte in the Repository + aAddr = (TAny *) (chunkKernAddr + sizeof(SSmrRomHeader)); + + HCR_TRACE_RETURN(KErrNone); + } + } + + ++smrBank; + } +#endif // !__WINS__ && !__X86__ + HCR_TRACE_RETURN(KErrNotSupported); - }
--- a/kerneltest/e32test/hcr/filerepos.txt Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/filerepos.txt Tue Jan 26 13:13:38 2010 +0200 @@ -351,7 +351,7 @@ . @ -cuid: 0xffffffff +cuid: 0xfffffff0 eid: 32 type: ArrayUInt32 flags: 0x0000 @@ -486,7 +486,7 @@ . @ -cuid: 0xffffffff +cuid: 0xfffffff0 eid: 33 type: Int64 flags: 0x0000 @@ -494,7 +494,7 @@ . @ -cuid: 0xffffffff +cuid: 0xfffffff0 eid: 3435973836 type: UInt64 flags: 0x0000 @@ -502,7 +502,7 @@ . @ -cuid: 0xffffffff +cuid: 0xfffffff0 eid: 4294967294 type: Int8 flags: 0x0000
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/hcr/filerepos_bc0.txt Tue Jan 26 13:13:38 2010 +0200 @@ -0,0 +1,510 @@ +@ +cuid: 0x00000001 +eid: 1 +type: Int32 +flags: 0x0000 +intval: 444 +. +@ +cuid: 0x00000001 +eid: 4 +type: Int16 +flags: 0x0000 +intval: -7632 +. + +@ +cuid: 0x00000001 +eid: 7 +type: Int8 +flags: 0x0000 +intval: 120 +. + +@ +cuid: 0x00000001 +eid: 10 +type: Bool +flags: 0x0000 +intval: 0 +. + +@ +cuid: 0x00000002 +eid: 2 +type: UInt32 +flags: 0x0000 +intval: 555555 +. + +@ +cuid: 0x00000002 +eid: 5 +type: UInt16 +flags: 0x0000 +intval: 60000 +. + +@ +cuid: 0x00000002 +eid: 8 +type: UInt8 +flags: 0x0000 +intval: 11 +. + +@ +cuid: 0x00000002 +eid: 12 +type: LinAddr +flags: 0x0000 +hexval: 0x0faece50 +. + +@ +cuid: 0x000003e8 +eid: 4096 +type: BinData +flags: 0x0000 +binval: 18 a1 0b bc 61 41 de c9 cd d2 f9 3b ba 99 e5 e2 +binval: fa e0 13 fe 8f d4 e3 50 1a 5e a3 32 39 34 1f 16 +binval: 9a a8 b3 61 1d 7d 7f fd b1 58 af 91 53 f7 76 c4 +binval: da dd + +. + +@ +cuid: 0x000003e8 +eid: 28672 +type: Text8 +flags: 0x0000 +strval: "These two strings walk up to a bar. The first string walks in and orders and the bartender throws him out and yells 'I don't serve strings in this bar'. The other string ruffs himself up on the street and curls up and orders. The bartender shouts, 'Hey, didn't you hear what I told your buddy?'. The string says 'Yeah.' The bartender says, 'aren't you a string?' The string says, 'No, I'm a frayed knot...'*********************************************************************************************************?" +. + +@ +cuid: 0x000003e8 +eid: 32768 +type: ArrayInt32 +flags: 0x0000 +arrval: 2034128484 +arrval: 358489471 +arrval: -1196607986 +arrval: -1223123619 +arrval: -643073403 +arrval: -1330549099 +. + +@ +cuid: 0x10000001 +eid: 4096 +type: Int32 +flags: 0x0000 +intval: 333 +. + +@ +cuid: 0x10000001 +eid: 4112 +type: Int16 +flags: 0x0000 +intval: 17632 +. + +@ +cuid: 0x10000001 +eid: 4128 +type: Int8 +flags: 0x0000 +intval: 44 +. + +@ +cuid: 0x10000001 +eid: 4144 +type: Bool +flags: 0x0000 +intval: 1 +. + +@ +cuid: 0x10000001 +eid: 4160 +type: UInt32 +flags: 0x0000 +intval: 3123123123 +. + +@ +cuid: 0x10000001 +eid: 4176 +type: UInt16 +flags: 0x0000 +intval: 18 +. + +@ +cuid: 0x10000001 +eid: 4192 +type: UInt8 +flags: 0x0000 +intval: 80 +. + +@ +cuid: 0x10000001 +eid: 4208 +type: LinAddr +flags: 0x0000 +hexval: 0xdeadbeef +. + +@ +cuid: 0x10000002 +eid: 128 +type: BinData +flags: 0x0000 +binval: 18 a1 0b bc 61 41 de c9 cd d2 f9 3b ba 99 e5 e2 +binval: fa e0 13 fe 8f d4 e3 50 1a 5e a3 32 39 34 1f 16 +binval: 9a a8 b3 61 1d 7d 7f fd b1 58 af 91 53 f7 76 c4 +binval: da dd + +. + +@ +cuid: 0x10000002 +eid: 147 +type: Text8 +flags: 0x0000 +strval: "A termite walks into a bar and says, 'Is the bar tender here?' #" +. + +@ +cuid: 0x10000002 +eid: 160 +type: ArrayInt32 +flags: 0x0000 +arrval: 2034128484 +arrval: 358489471 +arrval: -1196607986 +arrval: -1223123619 +arrval: -643073403 +arrval: -1330549099 +. + +@ +cuid: 0x10000002 +eid: 177 +type: ArrayUInt32 +flags: 0x0000 +arrval: 2034128484 +arrval: 358489471 +arrval: 3098359310 +arrval: 3071843677 +arrval: 3651893893 +arrval: 2964418197 +arrval: 2696294136 +arrval: 1696227301 +arrval: 1516067404 +arrval: 1171111215 +arrval: 45904065 +arrval: 3152352058 +arrval: 204038089 +arrval: 3427962251 +arrval: 3455401965 +arrval: 1362098275 +arrval: 2253564637 +arrval: 3426182366 +arrval: 173516448 +arrval: 3814089518 +arrval: 136723162 +arrval: 2036722935 +arrval: 4113668927 +arrval: 1744493008 +arrval: 2493449248 +arrval: 3579645660 +arrval: 567353362 +arrval: 882914186 +arrval: 386211010 +arrval: 3553761645 +arrval: 2569035486 +arrval: 508738370 +arrval: 2156711458 +arrval: 1917508866 +arrval: 4265921673 +arrval: 2570997289 +arrval: 3925131413 +arrval: 3804548107 +arrval: 2789297085 +arrval: 3612835159 +arrval: 2938836477 +arrval: 2656050096 +arrval: 3214230399 +arrval: 3908414061 +arrval: 2565375854 +arrval: 2461262451 +arrval: 1843121370 +arrval: 3664914997 +arrval: 3998453453 +arrval: 956775374 +arrval: 3966551413 +arrval: 3687801665 +arrval: 2761783920 +arrval: 3143394259 +arrval: 2885547835 +arrval: 1464987787 +arrval: 1940297660 +arrval: 257153229 +arrval: 1950234869 +arrval: 404798999 +arrval: 4170795976 +arrval: 449084638 +arrval: 2206107629 +arrval: 1726753423 +arrval: 3649910521 +arrval: 3495736484 +arrval: 2906992014 +arrval: 696657641 +arrval: 3811005607 +arrval: 1429964498 +arrval: 2130501125 +arrval: 126113280 +arrval: 657988026 +arrval: 412465877 +arrval: 1468324572 +arrval: 2212639033 +arrval: 526226762 +arrval: 4199939442 +arrval: 2447247776 +arrval: 580919075 +arrval: 3399586879 +arrval: 1773665383 +arrval: 2596675710 +arrval: 2204277779 +arrval: 3440949747 +arrval: 2163247371 +arrval: 374652132 +arrval: 2265994439 +arrval: 2525472208 +arrval: 751154667 +arrval: 60655135 +arrval: 1819822599 +arrval: 1996296943 +arrval: 1160968304 +arrval: 3511898622 +arrval: 4008505154 +arrval: 3363107771 +arrval: 3003598970 +arrval: 2321824624 +arrval: 1793148977 +arrval: 192387216 +arrval: 2391359999 +arrval: 3986410788 +arrval: 4170387316 +arrval: 112839256 +arrval: 957431730 +arrval: 2403276842 +arrval: 2443299891 +arrval: 3871206705 +arrval: 2309718684 +arrval: 4239645330 +arrval: 749665729 +arrval: 1567563783 +arrval: 3770371262 +arrval: 3625425678 +arrval: 3724751159 +arrval: 3335150391 +arrval: 1301676466 +arrval: 4209560974 +arrval: 4214040856 +arrval: 1115066926 +arrval: 2972142156 +arrval: 2476797414 +arrval: 882703343 +arrval: 3596997643 +arrval: 3633196855 +arrval: 1247060582 +arrval: 3141938928 +. + +@ +cuid: 0x10000002 +eid: 194 +type: Int64 +flags: 0x0000 +binval: ff ff ff ff ff ff ff ff +. + +@ +cuid: 0x10000002 +eid: 208 +type: UInt64 +flags: 0x0000 +binval: 00 00 00 00 00 00 00 00 +. + +@ +cuid: 0x10000002 +eid: 4294967295 +type: Int8 +flags: 0x0000 +intval: 1 +. + +@ +cuid: 0xffffffff +eid: 32 +type: ArrayUInt32 +flags: 0x0000 +arrval: 2034128484 +arrval: 358489471 +arrval: 3098359310 +arrval: 3071843677 +arrval: 3651893893 +arrval: 2964418197 +arrval: 2696294136 +arrval: 1696227301 +arrval: 1516067404 +arrval: 1171111215 +arrval: 45904065 +arrval: 3152352058 +arrval: 204038089 +arrval: 3427962251 +arrval: 3455401965 +arrval: 1362098275 +arrval: 2253564637 +arrval: 3426182366 +arrval: 173516448 +arrval: 3814089518 +arrval: 136723162 +arrval: 2036722935 +arrval: 4113668927 +arrval: 1744493008 +arrval: 2493449248 +arrval: 3579645660 +arrval: 567353362 +arrval: 882914186 +arrval: 386211010 +arrval: 3553761645 +arrval: 2569035486 +arrval: 508738370 +arrval: 2156711458 +arrval: 1917508866 +arrval: 4265921673 +arrval: 2570997289 +arrval: 3925131413 +arrval: 3804548107 +arrval: 2789297085 +arrval: 3612835159 +arrval: 2938836477 +arrval: 2656050096 +arrval: 3214230399 +arrval: 3908414061 +arrval: 2565375854 +arrval: 2461262451 +arrval: 1843121370 +arrval: 3664914997 +arrval: 3998453453 +arrval: 956775374 +arrval: 3966551413 +arrval: 3687801665 +arrval: 2761783920 +arrval: 3143394259 +arrval: 2885547835 +arrval: 1464987787 +arrval: 1940297660 +arrval: 257153229 +arrval: 1950234869 +arrval: 404798999 +arrval: 4170795976 +arrval: 449084638 +arrval: 2206107629 +arrval: 1726753423 +arrval: 3649910521 +arrval: 3495736484 +arrval: 2906992014 +arrval: 696657641 +arrval: 3811005607 +arrval: 1429964498 +arrval: 2130501125 +arrval: 126113280 +arrval: 657988026 +arrval: 412465877 +arrval: 1468324572 +arrval: 2212639033 +arrval: 526226762 +arrval: 4199939442 +arrval: 2447247776 +arrval: 580919075 +arrval: 3399586879 +arrval: 1773665383 +arrval: 2596675710 +arrval: 2204277779 +arrval: 3440949747 +arrval: 2163247371 +arrval: 374652132 +arrval: 2265994439 +arrval: 2525472208 +arrval: 751154667 +arrval: 60655135 +arrval: 1819822599 +arrval: 1996296943 +arrval: 1160968304 +arrval: 3511898622 +arrval: 4008505154 +arrval: 3363107771 +arrval: 3003598970 +arrval: 2321824624 +arrval: 1793148977 +arrval: 192387216 +arrval: 2391359999 +arrval: 3986410788 +arrval: 4170387316 +arrval: 112839256 +arrval: 957431730 +arrval: 2403276842 +arrval: 2443299891 +arrval: 3871206705 +arrval: 2309718684 +arrval: 4239645330 +arrval: 749665729 +arrval: 1567563783 +arrval: 3770371262 +arrval: 3625425678 +arrval: 3724751159 +arrval: 3335150391 +arrval: 1301676466 +arrval: 4209560974 +arrval: 4214040856 +arrval: 1115066926 +arrval: 2972142156 +arrval: 2476797414 +arrval: 882703343 +arrval: 3596997643 +arrval: 3633196855 +arrval: 1247060582 +arrval: 3141938928 +. + +@ +cuid: 0xffffffff +eid: 33 +type: Int64 +flags: 0x0000 +binval: 00 00 00 00 00 00 00 80 +. + +@ +cuid: 0xffffffff +eid: 3435973836 +type: UInt64 +flags: 0x0000 +binval: ff ff ff ff ff ff ff 7f +. + +@ +cuid: 0xffffffff +eid: 4294967294 +type: Int8 +flags: 0x0000 +intval: 1 +.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/hcr/filerepos_bc1.txt Tue Jan 26 13:13:38 2010 +0200 @@ -0,0 +1,463 @@ +@ +cuid: 0x00000001 +eid: 1 +type: Int32 +flags: 0x0000 +intval: 444 +. + +@ +cuid: 0x00000002 +eid: 2 +type: UInt32 +flags: 0x0000 +intval: 555555 +. + +@ +cuid: 0x00000002 +eid: 5 +type: UInt16 +flags: 0x0000 +intval: 60000 +. + +@ +cuid: 0x00000002 +eid: 8 +type: UInt8 +flags: 0x0000 +intval: 11 +. + +@ +cuid: 0x00000002 +eid: 12 +type: LinAddr +flags: 0x0000 +hexval: 0x0faece50 +. + +@ +cuid: 0x000003e8 +eid: 4096 +type: BinData +flags: 0x0000 +binval: 18 a1 0b bc 61 41 de c9 cd d2 f9 3b ba 99 e5 e2 +binval: fa e0 13 fe 8f d4 e3 50 1a 5e a3 32 39 34 1f 16 +binval: 9a a8 b3 61 1d 7d 7f fd b1 58 af 91 53 f7 76 c4 +binval: da dd + +. + +@ +cuid: 0x000003e8 +eid: 28672 +type: Text8 +flags: 0x0000 +strval: "These two strings walk up to a bar. The first string walks in and orders and the bartender throws him out and yells 'I don't serve strings in this bar'. The other string ruffs himself up on the street and curls up and orders. The bartender shouts, 'Hey, didn't you hear what I told your buddy?'. The string says 'Yeah.' The bartender says, 'aren't you a string?' The string says, 'No, I'm a frayed knot...'*********************************************************************************************************?" +. + +@ +cuid: 0x000003e8 +eid: 32768 +type: ArrayInt32 +flags: 0x0000 +arrval: 2034128484 +arrval: 358489471 +arrval: -1196607986 +arrval: -1223123619 +arrval: -643073403 +arrval: -1330549099 +. + +@ +cuid: 0x10000001 +eid: 4096 +type: Int32 +flags: 0x0000 +intval: 333 +. + +@ +cuid: 0x10000001 +eid: 4112 +type: Int16 +flags: 0x0000 +intval: 17632 +. + +@ +cuid: 0x10000001 +eid: 4128 +type: Int8 +flags: 0x0000 +intval: 44 +. + +@ +cuid: 0x10000001 +eid: 4144 +type: Bool +flags: 0x0000 +intval: 1 +. + +@ +cuid: 0x10000001 +eid: 4160 +type: UInt32 +flags: 0x0000 +intval: 3123123123 +. + +@ +cuid: 0x10000001 +eid: 4176 +type: UInt16 +flags: 0x0000 +intval: 18 +. + +@ +cuid: 0x10000001 +eid: 4192 +type: UInt8 +flags: 0x0000 +intval: 80 +. + +@ +cuid: 0x10000001 +eid: 4208 +type: LinAddr +flags: 0x0000 +hexval: 0xdeadbeef +. + +@ +cuid: 0x10000002 +eid: 128 +type: BinData +flags: 0x0000 +binval: 18 a1 0b bc 61 41 de c9 cd d2 f9 3b ba 99 e5 e2 +binval: fa e0 13 fe 8f d4 e3 50 1a 5e a3 32 39 34 1f 16 +binval: 9a a8 b3 61 1d 7d 7f fd b1 58 af 91 53 f7 76 c4 +binval: da dd + +. + +@ +cuid: 0x10000002 +eid: 147 +type: Text8 +flags: 0x0000 +strval: "A termite walks into a bar and says, 'Is the bar tender here?' #" +. + +@ +cuid: 0x10000002 +eid: 160 +type: ArrayInt32 +flags: 0x0000 +arrval: 2034128484 +arrval: 358489471 +arrval: -1196607986 +arrval: -1223123619 +arrval: -643073403 +arrval: -1330549099 +. + +@ +cuid: 0x10000002 +eid: 177 +type: ArrayUInt32 +flags: 0x0000 +arrval: 2034128484 +arrval: 358489471 +arrval: 3098359310 +arrval: 3071843677 +arrval: 3651893893 +arrval: 2964418197 +arrval: 2696294136 +arrval: 1696227301 +arrval: 1516067404 +arrval: 1171111215 +arrval: 45904065 +arrval: 3152352058 +arrval: 204038089 +arrval: 3427962251 +arrval: 3455401965 +arrval: 1362098275 +arrval: 2253564637 +arrval: 3426182366 +arrval: 173516448 +arrval: 3814089518 +arrval: 136723162 +arrval: 2036722935 +arrval: 4113668927 +arrval: 1744493008 +arrval: 2493449248 +arrval: 3579645660 +arrval: 567353362 +arrval: 882914186 +arrval: 386211010 +arrval: 3553761645 +arrval: 2569035486 +arrval: 508738370 +arrval: 2156711458 +arrval: 1917508866 +arrval: 4265921673 +arrval: 2570997289 +arrval: 3925131413 +arrval: 3804548107 +arrval: 2789297085 +arrval: 3612835159 +arrval: 2938836477 +arrval: 2656050096 +arrval: 3214230399 +arrval: 3908414061 +arrval: 2565375854 +arrval: 2461262451 +arrval: 1843121370 +arrval: 3664914997 +arrval: 3998453453 +arrval: 956775374 +arrval: 3966551413 +arrval: 3687801665 +arrval: 2761783920 +arrval: 3143394259 +arrval: 2885547835 +arrval: 1464987787 +arrval: 1940297660 +arrval: 257153229 +arrval: 1950234869 +arrval: 404798999 +arrval: 4170795976 +arrval: 449084638 +arrval: 2206107629 +arrval: 1726753423 +arrval: 3649910521 +arrval: 3495736484 +arrval: 2906992014 +arrval: 696657641 +arrval: 3811005607 +arrval: 1429964498 +arrval: 2130501125 +arrval: 126113280 +arrval: 657988026 +arrval: 412465877 +arrval: 1468324572 +arrval: 2212639033 +arrval: 526226762 +arrval: 4199939442 +arrval: 2447247776 +arrval: 580919075 +arrval: 3399586879 +arrval: 1773665383 +arrval: 2596675710 +arrval: 2204277779 +arrval: 3440949747 +arrval: 2163247371 +arrval: 374652132 +arrval: 2265994439 +arrval: 2525472208 +arrval: 751154667 +arrval: 60655135 +arrval: 1819822599 +arrval: 1996296943 +arrval: 1160968304 +arrval: 3511898622 +arrval: 4008505154 +arrval: 3363107771 +arrval: 3003598970 +arrval: 2321824624 +arrval: 1793148977 +arrval: 192387216 +arrval: 2391359999 +arrval: 3986410788 +arrval: 4170387316 +arrval: 112839256 +arrval: 957431730 +arrval: 2403276842 +arrval: 2443299891 +arrval: 3871206705 +arrval: 2309718684 +arrval: 4239645330 +arrval: 749665729 +arrval: 1567563783 +arrval: 3770371262 +arrval: 3625425678 +arrval: 3724751159 +arrval: 3335150391 +arrval: 1301676466 +arrval: 4209560974 +arrval: 4214040856 +arrval: 1115066926 +arrval: 2972142156 +arrval: 2476797414 +arrval: 882703343 +arrval: 3596997643 +arrval: 3633196855 +arrval: 1247060582 +arrval: 3141938928 +. + +@ +cuid: 0x10000002 +eid: 194 +type: Int64 +flags: 0x0000 +binval: ff ff ff ff ff ff ff ff +. + +@ +cuid: 0x10000002 +eid: 208 +type: UInt64 +flags: 0x0000 +binval: 00 00 00 00 00 00 00 00 +. + +@ +cuid: 0x10000002 +eid: 4294967295 +type: Int8 +flags: 0x0000 +intval: 1 +. + +@ +cuid: 0xffffffff +eid: 32 +type: ArrayUInt32 +flags: 0x0000 +arrval: 2034128484 +arrval: 358489471 +arrval: 3098359310 +arrval: 3071843677 +arrval: 3651893893 +arrval: 2964418197 +arrval: 2696294136 +arrval: 1696227301 +arrval: 1516067404 +arrval: 1171111215 +arrval: 45904065 +arrval: 3152352058 +arrval: 204038089 +arrval: 3427962251 +arrval: 3455401965 +arrval: 1362098275 +arrval: 2253564637 +arrval: 3426182366 +arrval: 173516448 +arrval: 3814089518 +arrval: 136723162 +arrval: 2036722935 +arrval: 4113668927 +arrval: 1744493008 +arrval: 2493449248 +arrval: 3579645660 +arrval: 567353362 +arrval: 882914186 +arrval: 386211010 +arrval: 3553761645 +arrval: 2569035486 +arrval: 508738370 +arrval: 2156711458 +arrval: 1917508866 +arrval: 4265921673 +arrval: 2570997289 +arrval: 3925131413 +arrval: 3804548107 +arrval: 2789297085 +arrval: 3612835159 +arrval: 2938836477 +arrval: 2656050096 +arrval: 3214230399 +arrval: 3908414061 +arrval: 2565375854 +arrval: 2461262451 +arrval: 1843121370 +arrval: 3664914997 +arrval: 3998453453 +arrval: 956775374 +arrval: 3966551413 +arrval: 3687801665 +arrval: 2761783920 +arrval: 3143394259 +arrval: 2885547835 +arrval: 1464987787 +arrval: 1940297660 +arrval: 257153229 +arrval: 1950234869 +arrval: 404798999 +arrval: 4170795976 +arrval: 449084638 +arrval: 2206107629 +arrval: 1726753423 +arrval: 3649910521 +arrval: 3495736484 +arrval: 2906992014 +arrval: 696657641 +arrval: 3811005607 +arrval: 1429964498 +arrval: 2130501125 +arrval: 126113280 +arrval: 657988026 +arrval: 412465877 +arrval: 1468324572 +arrval: 2212639033 +arrval: 526226762 +arrval: 4199939442 +arrval: 2447247776 +arrval: 580919075 +arrval: 3399586879 +arrval: 1773665383 +arrval: 2596675710 +arrval: 2204277779 +arrval: 3440949747 +arrval: 2163247371 +arrval: 374652132 +arrval: 2265994439 +arrval: 2525472208 +arrval: 751154667 +arrval: 60655135 +arrval: 1819822599 +arrval: 1996296943 +arrval: 1160968304 +arrval: 3511898622 +arrval: 4008505154 +arrval: 3363107771 +arrval: 3003598970 +arrval: 2321824624 +arrval: 1793148977 +arrval: 192387216 +arrval: 2391359999 +arrval: 3986410788 +arrval: 4170387316 +arrval: 112839256 +arrval: 957431730 +arrval: 2403276842 +arrval: 2443299891 +arrval: 3871206705 +arrval: 2309718684 +arrval: 4239645330 +arrval: 749665729 +arrval: 1567563783 +arrval: 3770371262 +arrval: 3625425678 +arrval: 3724751159 +arrval: 3335150391 +arrval: 1301676466 +arrval: 4209560974 +arrval: 4214040856 +arrval: 1115066926 +arrval: 2972142156 +arrval: 2476797414 +arrval: 882703343 +arrval: 3596997643 +arrval: 3633196855 +arrval: 1247060582 +arrval: 3141938928 +.
--- a/kerneltest/e32test/hcr/hcr.inf Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/hcr.inf Tue Jan 26 13:13:38 2010 +0200 @@ -28,56 +28,75 @@ PRJ_TESTEXPORTS -hcr_tests.iby /epoc32/rom/include/hcr_tests.iby -tshell_hcrtest.oby ../../../kernel/eka/rombuild/tshell_hcrtest.oby -hcrtest.auto.bat /epoc32/rom/include/hcrtest.auto.bat -hcr_autoexec.bat /epoc32/rom/include/hcr_autoexec.bat -smr1.oby /epoc32/rom/include/smr1.oby +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 +smr1.oby /epoc32/rom/include/smr1.oby + +// Export smr1.img for non-btb manual ad-hoc on target testing +// File autogenerated from smr1.oby above into the eka\rombuild folder +// in BTB test run. +smr1.img /epoc32/data/smr1.img +SMR_PART_1024.img /epoc32/data/smr_part_1024.img +SMR_PART_10240.img /epoc32/data/smr_part_10240.img +SMR_PART_102400.img /epoc32/data/smr_part_102400.img + // The emulator test data exported next must match that included into a // ROM for the HCR Test suite. See hcr_tests.iby -filerepos.dat /epoc32/release/wins/udeb/z/sys/data/filerepos.dat -nandrepos.dat /epoc32/release/wins/udeb/z/sys/data/nandrepos.dat -corrupt1.dat /epoc32/release/wins/udeb/z/sys/data/corrupt1.dat -corrupt2.dat /epoc32/release/wins/udeb/z/sys/data/corrupt2.dat -empty.dat /epoc32/release/wins/udeb/z/sys/data/empty.dat -megalarge1.dat /epoc32/release/wins/udeb/z/sys/data/megalarge1.dat -megalarge2.dat /epoc32/release/wins/udeb/z/sys/data/megalarge2.dat -filerepos.dat /epoc32/release/wins/udeb/Z/sys/data/hcr.dat +filerepos_bc0.dat /epoc32/release/wins/udeb/z/sys/data/filerepos_bc0.dat +filerepos_bc1.dat /epoc32/release/wins/udeb/z/sys/data/filerepos_bc1.dat +filerepos.dat /epoc32/release/wins/udeb/z/sys/data/filerepos.dat +nandrepos.dat /epoc32/release/wins/udeb/z/sys/data/nandrepos.dat +corrupt1.dat /epoc32/release/wins/udeb/z/sys/data/corrupt1.dat +corrupt2.dat /epoc32/release/wins/udeb/z/sys/data/corrupt2.dat +empty.dat /epoc32/release/wins/udeb/z/sys/data/empty.dat +megalarge1.dat /epoc32/release/wins/udeb/z/sys/data/megalarge1.dat +megalarge2.dat /epoc32/release/wins/udeb/z/sys/data/megalarge2.dat +filerepos.dat /epoc32/release/wins/udeb/z/sys/data/hcr.dat -filerepos.dat /epoc32/release/wins/urel/z/sys/data/filerepos.dat -nandrepos.dat /epoc32/release/wins/urel/z/sys/data/nandrepos.dat -corrupt1.dat /epoc32/release/wins/urel/z/sys/data/corrupt1.dat -corrupt2.dat /epoc32/release/wins/urel/z/sys/data/corrupt2.dat -empty.dat /epoc32/release/wins/urel/z/sys/data/empty.dat -megalarge1.dat /epoc32/release/wins/urel/z/sys/data/megalarge1.dat -megalarge2.dat /epoc32/release/wins/urel/z/sys/data/megalarge2.dat -filerepos.dat /epoc32/release/wins/urel/Z/sys/data/hcr.dat +filerepos_bc0.dat /epoc32/release/wins/urel/z/sys/data/filerepos_bc0.dat +filerepos_bc1.dat /epoc32/release/wins/urel/z/sys/data/filerepos_bc1.dat +filerepos.dat /epoc32/release/wins/urel/z/sys/data/filerepos.dat +nandrepos.dat /epoc32/release/wins/urel/z/sys/data/nandrepos.dat +corrupt1.dat /epoc32/release/wins/urel/z/sys/data/corrupt1.dat +corrupt2.dat /epoc32/release/wins/urel/z/sys/data/corrupt2.dat +empty.dat /epoc32/release/wins/urel/z/sys/data/empty.dat +megalarge1.dat /epoc32/release/wins/urel/z/sys/data/megalarge1.dat +megalarge2.dat /epoc32/release/wins/urel/z/sys/data/megalarge2.dat +filerepos.dat /epoc32/release/wins/urel/z/sys/data/hcr.dat -filerepos.dat /epoc32/release/winscw/udeb/z/sys/data/filerepos.dat -nandrepos.dat /epoc32/release/winscw/udeb/z/sys/data/nandrepos.dat -corrupt1.dat /epoc32/release/winscw/udeb/z/sys/data/corrupt1.dat -corrupt2.dat /epoc32/release/winscw/udeb/z/sys/data/corrupt2.dat -empty.dat /epoc32/release/winscw/udeb/z/sys/data/empty.dat -megalarge1.dat /epoc32/release/winscw/udeb/z/sys/data/megalarge1.dat -megalarge2.dat /epoc32/release/winscw/udeb/z/sys/data/megalarge2.dat -filerepos.dat /epoc32/release/winscw/udeb/Z/sys/data/hcr.dat +filerepos_bc0.dat /epoc32/release/winscw/udeb/z/sys/data/filerepos_bc0.dat +filerepos_bc1.dat /epoc32/release/winscw/udeb/z/sys/data/filerepos_bc1.dat +filerepos.dat /epoc32/release/winscw/udeb/z/sys/data/filerepos.dat +nandrepos.dat /epoc32/release/winscw/udeb/z/sys/data/nandrepos.dat +corrupt1.dat /epoc32/release/winscw/udeb/z/sys/data/corrupt1.dat +corrupt2.dat /epoc32/release/winscw/udeb/z/sys/data/corrupt2.dat +empty.dat /epoc32/release/winscw/udeb/z/sys/data/empty.dat +megalarge1.dat /epoc32/release/winscw/udeb/z/sys/data/megalarge1.dat +megalarge2.dat /epoc32/release/winscw/udeb/z/sys/data/megalarge2.dat +filerepos.dat /epoc32/release/winscw/udeb/z/sys/data/hcr.dat -filerepos.dat /epoc32/release/winscw/urel/z/sys/data/filerepos.dat -nandrepos.dat /epoc32/release/winscw/urel/z/sys/data/nandrepos.dat -corrupt1.dat /epoc32/release/winscw/urel/z/sys/data/corrupt1.dat -corrupt2.dat /epoc32/release/winscw/urel/z/sys/data/corrupt2.dat -empty.dat /epoc32/release/winscw/urel/z/sys/data/empty.dat -megalarge1.dat /epoc32/release/winscw/urel/z/sys/data/megalarge1.dat -megalarge2.dat /epoc32/release/winscw/urel/z/sys/data/megalarge2.dat -filerepos.dat /epoc32/release/winscw/urel/Z/sys/data/hcr.dat +filerepos_bc0.dat /epoc32/release/winscw/urel/z/sys/data/filerepos_bc0.dat +filerepos_bc1.dat /epoc32/release/winscw/urel/z/sys/data/filerepos_bc1.dat +filerepos.dat /epoc32/release/winscw/urel/z/sys/data/filerepos.dat +nandrepos.dat /epoc32/release/winscw/urel/z/sys/data/nandrepos.dat +corrupt1.dat /epoc32/release/winscw/urel/z/sys/data/corrupt1.dat +corrupt2.dat /epoc32/release/winscw/urel/z/sys/data/corrupt2.dat +empty.dat /epoc32/release/winscw/urel/z/sys/data/empty.dat +megalarge1.dat /epoc32/release/winscw/urel/z/sys/data/megalarge1.dat +megalarge2.dat /epoc32/release/winscw/urel/z/sys/data/megalarge2.dat +filerepos.dat /epoc32/release/winscw/urel/z/sys/data/hcr.dat PRJ_TESTMMPFILES -d_hcrsim_client support -d_hcrsim_own support -d_hcrut support +d_hcrsim_client support +d_hcrsim_own support +d_hcrut support #ifndef SMP t_hcr
--- a/kerneltest/e32test/hcr/hcr_tests.iby Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/hcr_tests.iby Tue Jan 26 13:13:38 2010 +0200 @@ -42,5 +42,7 @@ data=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\nandrepos.dat \sys\data\nandrepos.dat unpaged paging_unmovable data=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\megalarge1.dat \sys\data\megalarge1.dat unpaged paging_unmovable data=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\megalarge2.dat \sys\data\megalarge2.dat unpaged paging_unmovable +data=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\filerepos_bc0.dat \sys\data\filerepos_bc0.dat unpaged paging_unmovable +data=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\filerepos_bc1.dat \sys\data\filerepos_bc1.dat unpaged paging_unmovable hcrdata=##BASEPATH##kernelhwsrv\kerneltest\e32test\hcr\filerepos.dat \sys\data\hcr.dat #endif // __HCR_TEST_IBY__
--- a/kerneltest/e32test/hcr/hcrtest_ne1roms.mbc Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/hcrtest_ne1roms.mbc Tue Jan 26 13:13:38 2010 +0200 @@ -38,7 +38,7 @@ 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 -D _NAND2 + 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 @@ -49,7 +49,7 @@ 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 -D _NAND2 + 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 @@ -66,7 +66,7 @@ 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 -D _NAND2 +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 @@ -78,11 +78,16 @@ 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 -D _NAND2 +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 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/hcr/nandloader_hcrtest.oby Tue Jan 26 13:13:38 2010 +0200 @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +//#NAME: NAND Loader rom + +#define BASE_ROM +#define NANDLOADER_ROM +#include <rom\##VARIANT##\header.iby> + +files= + +#include <rom\##VARIANT##\kernel.iby> + +#ifdef WITH_EXTENSION +#undef WITH_EXTENSION +#endif +#ifdef WITH_ROFS +#undef WITH_ROFS +#endif +#ifdef WITH_COMP +#undef WITH_COMP +#endif + +#include "user.iby" +#include <rom\hal\hal.iby> +#include <rom\f32\f32.iby> + +#if defined(LMNAND2) || defined(_NAND2) || defined(_ONENAND) +#if defined (__LABRADOR_BOARD__) +file=\Epoc32\Release\##MAIN##\##BUILD##\LAB_NANDLOADER_UNISTORE2.EXE \sys\bin\NANDLOADER.EXE +#else +file=\Epoc32\Release\##MAIN##\##BUILD##\NANDLOADER_UNISTORE2.EXE \sys\bin\NANDLOADER.EXE +#endif +#else +file=\Epoc32\Release\##MAIN##\##BUILD##\NANDLOADER.EXE \sys\bin\NANDLOADER.EXE +#endif + +data=\epoc32\rom\nandloader\autoexec.bat \autoexec.bat + +data=\epoc32\data\smr1.img \smr1.img + + +data=\epoc32\data\smr_part_102400.img \smr2.img
--- a/kerneltest/e32test/hcr/nandrepos.txt Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/nandrepos.txt Tue Jan 26 13:13:38 2010 +0200 @@ -217,7 +217,7 @@ . @ -cuid: 0xffffffff +cuid: 0xfffffff0 eid: 32 type: ArrayUInt32 flags: 0x0000 @@ -256,7 +256,7 @@ . @ -cuid: 0xffffffff +cuid: 0xfffffff0 eid: 3435973836 type: UInt64 flags: 0x0000 @@ -264,7 +264,7 @@ . @ -cuid: 0xffffffff +cuid: 0xfffffff0 eid: 4294967294 type: Int8 flags: 0x0000
--- a/kerneltest/e32test/hcr/t_hcr.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/t_hcr.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -34,6 +34,13 @@ _LIT8(KTestClearRepos, ""); +static const TInt KSimOwnThread = 0; +static const TInt KSimClientThread = 1; +static TInt gHcrThread = KSimOwnThread; + +//Calculation of the fraction defined by f for the number x +#define _FRACTION(x, f) (x>f ? x/f : x) + RTest test(_L("T_HCR")); RHcrSimTestChannel HcrSimTest; @@ -325,6 +332,16 @@ r = HcrSimTest.GetData(id, dval); test_Equal(KErrTooBig, r); dval.Close(); + + TUint8* pval; + pval = (TUint8*) User::Alloc(setting->iName.iLen); + test_NotNull(pval); + // + TUint16 actuallength; + r = HcrSimTest.GetData(id, (unsigned short)( setting->iName.iLen - 1), pval, actuallength); + test_Equal(KErrTooBig, r); + // + User::Free(pval); } if (setting->iName.iType != ETypeText8) { @@ -350,6 +367,16 @@ r = HcrSimTest.GetString(id, dval); test_Equal(KErrTooBig, r); dval.Close(); + + TText8* pval; + pval = (TText8*) User::Alloc(setting->iName.iLen); + test_NotNull(pval); + // + TUint16 actuallength; + r = HcrSimTest.GetString(id, (unsigned short)(setting->iName.iLen >> 1), pval, actuallength); + test_Equal(KErrTooBig, r); + // + User::Free(pval); } if (setting->iName.iType != ETypeArrayInt32) { @@ -370,7 +397,7 @@ test_NotNull(pval); // TUint16 actuallength; - r = HcrSimTest.GetArray(id, (TUint16) (setting->iName.iLen / 2), pval, actuallength); + r = HcrSimTest.GetArray(id, (TUint16) (setting->iName.iLen >> 1), pval, actuallength); test_Equal(KErrTooBig, r); // User::Free(pval); @@ -851,152 +878,188 @@ numsettings.Close(); } + + void HcrSimFindSettingsCategory(SSettingC* aRepository, TUint aNumberOfSettings) - { - test.Next(_L("FindSettingsCategory")); - TInt r; - // Build a hash table with number of settings for each category - RHashMap<TUint32, TInt> numsettings; - SSettingC* setting; - TInt* pV = NULL; - TInt value = 0; - for (setting = aRepository; setting < aRepository + aNumberOfSettings; setting++) - { - pV = numsettings.Find(setting->iName.iId.iCat); - if(pV) - value = *pV; - if (!pV) - { - r = numsettings.Insert(setting->iName.iId.iCat, 1); - test_KErrNone(r); - } - else - { - r = numsettings.Remove(setting->iName.iId.iCat); - test_KErrNone(r); - r = numsettings.Insert(setting->iName.iId.iCat, value + 1); - test_KErrNone(r); - } - } + { + test.Next(_L("FindSettingsCategory")); + TInt r; + + // Build a hash table with number of settings for each category + RHashMap<TUint32, TInt> numsettings; + SSettingC* setting; + TInt* pV = NULL; + TInt value = 0; + for (setting = aRepository; setting < aRepository + aNumberOfSettings; setting++) + { + pV = numsettings.Find(setting->iName.iId.iCat); + if(pV) + value = *pV; + if (!pV) + { + r = numsettings.Insert(setting->iName.iId.iCat, 1); + test_KErrNone(r); + } + else + { + r = numsettings.Remove(setting->iName.iId.iCat); + test_KErrNone(r); + r = numsettings.Insert(setting->iName.iId.iCat, value + 1); + test_KErrNone(r); + } + } - // - RHashMap<TUint32, TInt>::TIter catiter(numsettings); - for (;;) - { - const TUint32* nextcat = catiter.NextKey(); - if (!nextcat) - { - break; - } - test.Printf(_L("Category %08x"), *nextcat); - const TInt* v = numsettings.Find(*nextcat); - test_NotNull(v); + // + RHashMap<TUint32, TInt>::TIter catiter(numsettings); + for (;;) + { + const TUint32* nextcat = catiter.NextKey(); + if (!nextcat) + { + break; + } + test.Printf(_L("Category %08x"), *nextcat); + const TInt* v = numsettings.Find(*nextcat); + test_NotNull(v); + + // Allocate memory for holding array of settings + TElementId* elids; + TSettingType* types; + TUint16* lens; + + TInt maxNum; + + + // Try all permutations of optional values + TInt i; + for (i = 0; i < 3; i++) + { + test.Printf(_L(".")); - // Allocate memory for holding array of settings - TElementId* elids; - TSettingType* types; - TUint16* lens; - elids = (TElementId*) User::Alloc(*v * sizeof(TElementId)); - test_NotNull(elids); - types = (TSettingType*) User::Alloc(*v * sizeof(TSettingType)); - test_NotNull(types); - lens = (TUint16*) User::Alloc(*v * sizeof(TUint16)); - test_NotNull(lens); - - // Try all permutations of optional values - TInt i; - for (i = 0; i < 3; i++) - { - test.Printf(_L(".")); - Mem::Fill(elids, *v * sizeof(TElementId), 0xcc); - Mem::Fill(types, *v * sizeof(TSettingType), 0xcc); - Mem::Fill(lens, *v * sizeof(TUint16), 0xcc); - TUint32 numfound; - r = HcrSimTest.FindSettings(*nextcat, - *v, numfound, - elids, - i & 0x1 ? types : NULL, - i & 0x2 ? lens : NULL); - numfound = r; - test_Compare(0, <=, r); - test_Equal(*v, r); - + TUint32 numfound; + + //maxNum is equal: + //0 - 1, the total elements from the category + //1 - 1/2 of total number of elements from the category + //2 - 1 + 1/2 of total number of element from the category + + if(i == 0) + maxNum = *v; + else if(i == 1) + maxNum = _FRACTION((*v), 2); + else + maxNum = *v + _FRACTION((*v), 2); + + + elids = (TElementId*) User::Alloc(maxNum * sizeof(TElementId)); + test_NotNull(elids); + types = (TSettingType*) User::Alloc(maxNum * sizeof(TSettingType)); + test_NotNull(types); + lens = (TUint16*) User::Alloc(maxNum * sizeof(TUint16)); + test_NotNull(lens); + + Mem::Fill(elids, maxNum * sizeof(TElementId), 0xcc); + Mem::Fill(types, maxNum * sizeof(TSettingType), 0xcc); + Mem::Fill(lens, maxNum * sizeof(TUint16), 0xcc); + - // Check returned list of element ids - TUint j; - for (j = 0; j < numfound; j++) - { - // Find current element in the test array - for (setting = aRepository; setting < aRepository + aNumberOfSettings; setting++) - { - if ((setting->iName.iId.iCat == *nextcat) && (setting->iName.iId.iKey == elids[j])) - { - break; - } - } - test_Compare(setting,<,aRepository+aNumberOfSettings); // Fail if element not found - switch (setting->iName.iType) - { - case ETypeInt32: - case ETypeInt16: - case ETypeInt8: - case ETypeBool: - case ETypeUInt32: - case ETypeUInt16: - case ETypeUInt8: - case ETypeLinAddr: - if (i & 0x1) - { - test_Equal(setting->iName.iType, types[j]); - } - if (i & 0x2) - { - test_Equal(0, lens[j]); - } - break; - // Fall-through - case ETypeBinData: - case ETypeText8: - case ETypeArrayInt32: - case ETypeArrayUInt32: - case ETypeInt64: - case ETypeUInt64: - if (i & 0x1) - { - test_Equal(setting->iName.iType, types[j]); - } - if (i & 0x2) - { - test_Equal(setting->iName.iLen, lens[j]); - } - break; - default: - test(EFalse); - } - } - // Check all expected elements are in the returned list of element ids - for (setting = aRepository; setting < aRepository + aNumberOfSettings; setting++) - { - if ((setting->iName.iId.iCat == *nextcat)) - { - for (j = 0; j < numfound; j++) - { - if (elids[j] == setting->iName.iId.iKey) - { - break; - } - } - test_Compare(j, <=, numfound); - } - } - } - User::Free(elids); - User::Free(types); - User::Free(lens); - test.Printf(_L("\n")); - } - numsettings.Close(); - } + r = HcrSimTest.FindSettings(*nextcat, + maxNum, elids, + i & 0x1 ? types : NULL, + i & 0x2 ? lens : NULL); + numfound = r; + test_Compare(0, <=, r); + + if(i < 2) + { + //for 0 & 1 the number of settings returned must be equal maxNum + test_Equal(maxNum, r); + } + else + { + //for 2, it's equal the real number of settings + test_Equal((*v), r); + } + + + + // Check returned list of element ids + TUint j; + for (j = 0; j < numfound; j++) + { + // Find current element in the test array + for (setting = aRepository; setting < aRepository + aNumberOfSettings; setting++) + { + if ((setting->iName.iId.iCat == *nextcat) && (setting->iName.iId.iKey == elids[j])) + { + break; + } + } + test_Compare(setting,<,aRepository+aNumberOfSettings); // Fail if element not found + switch (setting->iName.iType) + { + case ETypeInt32: + case ETypeInt16: + case ETypeInt8: + case ETypeBool: + case ETypeUInt32: + case ETypeUInt16: + case ETypeUInt8: + case ETypeLinAddr: + if (i & 0x1) + { + test_Equal(setting->iName.iType, types[j]); + } + if (i & 0x2) + { + test_Equal(0, lens[j]); + } + break; + // Fall-through + case ETypeBinData: + case ETypeText8: + case ETypeArrayInt32: + case ETypeArrayUInt32: + case ETypeInt64: + case ETypeUInt64: + if (i & 0x1) + { + test_Equal(setting->iName.iType, types[j]); + } + if (i & 0x2) + { + test_Equal(setting->iName.iLen, lens[j]); + } + break; + default: + test(EFalse); + } + } + // Check all expected elements are in the returned list of element ids + for (setting = aRepository; setting < aRepository + aNumberOfSettings; setting++) + { + if ((setting->iName.iId.iCat == *nextcat)) + { + for (j = 0; j < numfound; j++) + { + if (elids[j] == setting->iName.iId.iKey) + { + break; + } + } + test_Compare(j, <=, numfound); + } + } + + User::Free(elids); + User::Free(types); + User::Free(lens); + } + + test.Printf(_L("\n")); + } + numsettings.Close(); + } struct TTestFindSettingsPatternArgs { @@ -1007,146 +1070,478 @@ const TTestFindSettingsPatternArgs KTestFindSettingsPatternArgs[] = { // iMask iPattern {0x00000000, 0x00000000}, -/* {0xfffffff0, 0x00000000}, - {0xffffffff, 0x00000001},*/ + {0xfffffff0, 0x00000000}, + {0xffffffff, 0x00000001} }; void HcrSimFindSettingsPattern(SSettingC* aRepository, TUint aNumberOfSettings) - { - test.Next(_L("FindSettingsPattern")); - TInt r; - TUint i; + { + test.Next(_L("FindSettingsPattern")); + TInt r; + TUint i; + + // Allocate memory for holding array of settings + TElementId* elids; + TSettingType* types; + TUint16* lens; + TInt maxNum; + + // Build a hash table with number of settings for each category + RHashMap<TUint32, TInt> numsettings; + SSettingC* setting; + TInt* pV = NULL; + TInt value = 0; + for (setting = aRepository; setting < aRepository + aNumberOfSettings; setting++) + { + pV = numsettings.Find(setting->iName.iId.iCat); + if(pV) + value = *pV; + if (!pV) + { + r = numsettings.Insert(setting->iName.iId.iCat, 1); + test_KErrNone(r); + } + else + { + r = numsettings.Remove(setting->iName.iId.iCat); + test_KErrNone(r); + r = numsettings.Insert(setting->iName.iId.iCat, value + 1); + test_KErrNone(r); + } + } + + // Hash map includes the number of settings of each category + RHashMap<TUint32, TInt>::TIter catiter(numsettings); + for (;;) + { + const TUint32* nextcat = catiter.NextKey(); + if (!nextcat) + { + break; + } + test.Printf(_L("Category %08x"), *nextcat); + const TInt* v = numsettings.Find(*nextcat); + test_NotNull(v); + + + + for (i = 0; i < sizeof(KTestFindSettingsPatternArgs) / sizeof(TTestFindSettingsPatternArgs); i++) + { + test.Printf(_L("iMask=0x%08x iPattern=0x%08x\n"), + KTestFindSettingsPatternArgs[i].iMask, + KTestFindSettingsPatternArgs[i].iPattern); - // Allocate memory for holding array of settings - TElementId* elids; - TSettingType* types; - TUint16* lens; - elids = (TElementId*) User::Alloc(aNumberOfSettings * sizeof(TElementId)); - test_NotNull(elids); - types = (TSettingType*) User::Alloc(aNumberOfSettings * sizeof(TSettingType)); - test_NotNull(types); - lens = (TUint16*) User::Alloc(aNumberOfSettings * sizeof(TUint16)); - test_NotNull(lens); + TUint k; + for (k = 0; k < 3; k++) + { + TUint32 numfound; + + // aMaxNum is less than the total number of settings in the + // category + //0 - all elements from the category are requested + //1 - 1/2 of total number of elements from the category + //2 - 1 + 1/2 of total number of element from the category + if(k == 0) + maxNum = *v; + else if(k == 1) + maxNum = _FRACTION((*v), 2); + else + maxNum = (*v) + _FRACTION((*v), 2); + + elids = (TElementId*) User::Alloc(maxNum * sizeof(TElementId)); + test_NotNull(elids); + types = (TSettingType*) User::Alloc(maxNum * sizeof(TSettingType)); + test_NotNull(types); + lens = (TUint16*) User::Alloc(maxNum * sizeof(TUint16)); + test_NotNull(lens); + - for (i = 0; i < sizeof(KTestFindSettingsPatternArgs) / sizeof(TTestFindSettingsPatternArgs); i++) - { - test.Printf(_L("iMask=0x%08x iPattern=0x%08x\n"), - KTestFindSettingsPatternArgs[i].iMask, - KTestFindSettingsPatternArgs[i].iPattern); + // Actual API call + r = HcrSimTest.FindSettings( + *nextcat, + maxNum, + KTestFindSettingsPatternArgs[i].iMask, + KTestFindSettingsPatternArgs[i].iPattern, + elids, + (k & 0x1 ? types : NULL), + (k & 0x2 ? lens : NULL)); + test_Compare(0, <=, r); + test_Compare(maxNum, >=, r); + + numfound = r; + test.Printf(_L("%d match(es)\n"), r); - // Test each category - TUint j; - for (j = 0; j < sizeof(KTestCategories) / sizeof(TCategoryUid); j++) - { - test.Printf(_L("Category 0x%08x: "), KTestCategories[j]); + // Check that all returned element ids satisfy the conditions + TUint32 l; + for (l = 0; l < numfound; l++) + { + test_Assert( + (KTestFindSettingsPatternArgs[i].iMask & KTestFindSettingsPatternArgs[i].iPattern) == + (KTestFindSettingsPatternArgs[i].iMask & elids[l]), test.Printf(_L("!!%08x!!\n"), elids[l]) + ); + + //Somehow the macro test_Compare consider TInt32 instead TUint32 + //as a result comparasion is done by this way: + //RTEST: (0x0 (0) < 0x80000000 (-2147483648)) == EFalse at line 1038 + //althought 0x80000000 > 0, with the signed form this number will be + //-2147483648. + //test_Compare(KTestFindSettingsPatternArgs[i].iAtId, <=, elids[l]); + } - // Test all possible permutations of optional arguments - TUint k; - for (k = 0; k < 3; k++) - { - TUint32 numfound; - // Actual API call - r = HcrSimTest.FindSettings( - KTestCategories[j], - aNumberOfSettings, - KTestFindSettingsPatternArgs[i].iMask, - KTestFindSettingsPatternArgs[i].iPattern, - numfound, - elids, - (k & 0x1 ? types : NULL), - (k & 0x2 ? lens : NULL)); - test_Compare(0, <=, r); - - numfound = r; - - test.Printf(_L("%d match(es)\n"), r); + // Check that all elements that satisfy the conditions have been returned + SSettingC* setting; + TUint32 numsettings = 0; + + //Flag indicates that the element is found + TBool fFlag = EFalse; + + for (setting = aRepository; setting < aRepository + aNumberOfSettings; setting++) + { + if ((setting->iName.iId.iCat == *nextcat) + && ((KTestFindSettingsPatternArgs[i].iMask & KTestFindSettingsPatternArgs[i].iPattern) == + (KTestFindSettingsPatternArgs[i].iMask & setting->iName.iId.iKey))) + { + for (l = 0; l < numfound; l++) + { + if (setting->iName.iId.iKey == elids[l]) + { + fFlag = ETrue; + break; + } + } + + if(fFlag) + { + test_Assert(l < numfound, test.Printf(_L("!!%08x!!\n"), elids[l])); - // Check that all returned element ids satisfy the conditions - TUint l; - for (l = 0; l < numfound; l++) - { - test_Assert( - (KTestFindSettingsPatternArgs[i].iMask & KTestFindSettingsPatternArgs[i].iPattern) == - (KTestFindSettingsPatternArgs[i].iMask & elids[l]), test.Printf(_L("!!%08x!!\n"), elids[l]) - ); - //Somehow the macro test_Compare consider TInt32 instead TUint32 - //as a result comparasion is done by this way: - //RTEST: (0x0 (0) < 0x80000000 (-2147483648)) == EFalse at line 1038 - //althought 0x80000000 > 0, with the signed form this number will be - //-2147483648. - //test_Compare(KTestFindSettingsPatternArgs[i].iAtId, <=, elids[l]); - } + // Check type and size returned + switch (setting->iName.iType) + { + case ETypeInt32: + case ETypeInt16: + case ETypeInt8: + case ETypeBool: + case ETypeUInt32: + case ETypeUInt16: + case ETypeUInt8: + case ETypeLinAddr: + if (k & 0x1) + { + test_Equal(setting->iName.iType, types[l]); + } + if (k & 0x2) + { + test_Equal(0, lens[l]); + } + break; + // Fall-through + case ETypeBinData: + case ETypeText8: + case ETypeArrayInt32: + case ETypeArrayUInt32: + case ETypeInt64: + case ETypeUInt64: + if (k & 0x1) + { + test_Equal(setting->iName.iType, types[l]); + } + if (k & 0x2) + { + test_Equal(setting->iName.iLen, lens[l]); + } + break; + default: + test(EFalse); + } + numsettings++; + fFlag = EFalse; + } + } + } + + test_Equal(numsettings, numfound); + + // Free memory + User::Free(elids); + User::Free(types); + User::Free(lens); + + } + } + } + numsettings.Close(); + } + + + +void HcrSimFindSettingsCategoryNegative(SSettingC* aRepository, TUint aNumberOfSettings) + { + + TInt r; + // Build a hash table with number of settings for each category + RHashMap<TUint32, TInt> numsettings; + SSettingC* setting; + TInt* pV = NULL; + TInt value = 0; + //Iterator object of the number of elements in the category + RHashMap<TUint32, TInt>::TIter catiter(numsettings); + + + test.Next(_L("FindSettingsCategoryNegative invalid user parameters")); + for (setting = aRepository; setting < aRepository + aNumberOfSettings; setting++) + { + pV = numsettings.Find(setting->iName.iId.iCat); + if(pV) + value = *pV; + if (!pV) + { + r = numsettings.Insert(setting->iName.iId.iCat, 1); + test_KErrNone(r); + } + else + { + r = numsettings.Remove(setting->iName.iId.iCat); + test_KErrNone(r); + r = numsettings.Insert(setting->iName.iId.iCat, value + 1); + test_KErrNone(r); + } + } - // Check that all elements that satisfy the conditions have been returned - SSettingC* setting; - TUint32 numsettings = 0; - for (setting = aRepository; setting < aRepository + aNumberOfSettings; setting++) - { - if ((setting->iName.iId.iCat == KTestCategories[j]) - && ((KTestFindSettingsPatternArgs[i].iMask & KTestFindSettingsPatternArgs[i].iPattern) == - (KTestFindSettingsPatternArgs[i].iMask & setting->iName.iId.iKey))) - { - for (l = 0; l < numfound; l++) - { - if (setting->iName.iId.iKey == elids[l]) - { - break; - } - } - test_Assert(l < numfound, test.Printf(_L("!!%08x!!\n"), elids[l])); + // + for (;;) + { + const TUint32* nextcat = catiter.NextKey(); + if (!nextcat) + { + break; + } + test.Printf(_L("Category %08x"), *nextcat); + const TInt* v = numsettings.Find(*nextcat); + test_NotNull(v); + + // Allocate memory for holding array of settings + TElementId* elids; + TSettingType* types; + TUint16* lens; + elids = (TElementId*) User::Alloc(*v * sizeof(TElementId)); + test_NotNull(elids); + types = (TSettingType*) User::Alloc(*v * sizeof(TSettingType)); + test_NotNull(types); + lens = (TUint16*) User::Alloc(*v * sizeof(TUint16)); + test_NotNull(lens); + + + test.Printf(_L(".")); + Mem::Fill(elids, *v * sizeof(TElementId), 0xcc); + Mem::Fill(types, *v * sizeof(TSettingType), 0xcc); + Mem::Fill(lens, *v * sizeof(TUint16), 0xcc); + + TInt i; + for (i = 0; i < 3; i++) + { + //Perform the following permutations: + // 0 - negative aMaxNum AND aElIds != NULL + // 1 - positive aMaxNum AND aElIds == NULL + // 2 - negative aMaxNum AND aElIds == NULL + + switch(i) + { + case 0: + r = HcrSimTest.FindSettings(*nextcat, + (-1)*(*v), elids, types, lens); + + test_Equal(KErrArgument, r); + break; + + case 1: + r = HcrSimTest.FindSettings(*nextcat, + *v, NULL, types, lens); + + test_Equal(KErrArgument, r); + break; + + case 2: + r = HcrSimTest.FindSettings(*nextcat, + (-1)*(*v), NULL, types, lens); + + test_Equal(KErrArgument, r); + break; + + } + } + + + User::Free(elids); + User::Free(types); + User::Free(lens); + test.Printf(_L("\n")); + } + numsettings.Close(); + + } + + +void HcrSimFindSettingsPatternNegative(TUint aNumberOfSettings) + { + + TInt r; + TUint i; + + // Allocate memory for holding array of settings + TElementId* elids; + TSettingType* types; + TUint16* lens; + elids = (TElementId*) User::Alloc(aNumberOfSettings * sizeof(TElementId)); + test_NotNull(elids); + types = (TSettingType*) User::Alloc(aNumberOfSettings * sizeof(TSettingType)); + test_NotNull(types); + lens = (TUint16*) User::Alloc(aNumberOfSettings * sizeof(TUint16)); + test_NotNull(lens); + + test.Next(_L("FindSettingsPattern, invalid user parameters")); + for (i = 0; i < sizeof(KTestFindSettingsPatternArgs) / sizeof(TTestFindSettingsPatternArgs); i++) + { + test.Printf(_L("iMask=0x%08x iPattern=0x%08x\n"), + KTestFindSettingsPatternArgs[i].iMask, + KTestFindSettingsPatternArgs[i].iPattern); + + // Test each category + TUint j; + for (j = 0; j < sizeof(KTestCategories) / sizeof(TCategoryUid); j++) + { + test.Printf(_L("Category 0x%08x: "), KTestCategories[j]); - // Check type and size returned - switch (setting->iName.iType) - { - case ETypeInt32: - case ETypeInt16: - case ETypeInt8: - case ETypeBool: - case ETypeUInt32: - case ETypeUInt16: - case ETypeUInt8: - case ETypeLinAddr: - if (k & 0x1) - { - test_Equal(setting->iName.iType, types[l]); - } - if (k & 0x2) - { - test_Equal(0, lens[l]); - } - break; - // Fall-through - case ETypeBinData: - case ETypeText8: - case ETypeArrayInt32: - case ETypeArrayUInt32: - case ETypeInt64: - case ETypeUInt64: - if (k & 0x1) - { - test_Equal(setting->iName.iType, types[l]); - } - if (k & 0x2) - { - test_Equal(setting->iName.iLen, lens[l]); - } - break; - default: - test(EFalse); - } - numsettings++; - } - } - test_Equal(numsettings, numfound); - } - } - } - - // Free memory - User::Free(elids); - User::Free(types); - User::Free(lens); - } + // Test all possible permutations of optional arguments + TInt k; + for (k = 0; k < 3; k++) + { + //Perform the following permutations: + // 0 - negative aMaxNum AND aElIds != NULL + // 1 - positive aMaxNum AND aElIds == NULL + // 2 - negative aMaxNum AND aElIds == NULL + + switch(k) + { + case 0: + // Actual API call + r = HcrSimTest.FindSettings( + KTestCategories[j], + (-1) * static_cast<TInt>(aNumberOfSettings), + KTestFindSettingsPatternArgs[i].iMask, + KTestFindSettingsPatternArgs[i].iPattern, + elids, + types, lens); + test_Equal(KErrArgument,r); + break; + + + case 1: + // Actual API call + r = HcrSimTest.FindSettings( + KTestCategories[j], + aNumberOfSettings, + KTestFindSettingsPatternArgs[i].iMask, + KTestFindSettingsPatternArgs[i].iPattern, + NULL, + types, lens); + test_Equal(KErrArgument,r); + break; + + + case 2: + // Actual API call + r = HcrSimTest.FindSettings( + KTestCategories[j], + (-1) * static_cast<TInt>(aNumberOfSettings), + KTestFindSettingsPatternArgs[i].iMask, + KTestFindSettingsPatternArgs[i].iPattern, + NULL, + types, lens); + test_Equal(KErrArgument,r); + break; + + } + + } + } + } + + // Free memory + User::Free(elids); + User::Free(types); + User::Free(lens); + } + + + + +void HcrSimFindSettingsPatternMemAllocFails(TUint aNumberOfSettings) + { + TInt r; + TUint i; + + // Allocate memory for holding array of settings + TElementId* elids; + TSettingType* types; + TUint16* lens; + elids = (TElementId*) User::Alloc(aNumberOfSettings * sizeof(TElementId)); + test_NotNull(elids); + types = (TSettingType*) User::Alloc(aNumberOfSettings * sizeof(TSettingType)); + test_NotNull(types); + lens = (TUint16*) User::Alloc(aNumberOfSettings * sizeof(TUint16)); + test_NotNull(lens); + + test.Next(_L("FindSettingsPattern, memory allocation failure")); + for (i = 0; i < sizeof(KTestFindSettingsPatternArgs) / sizeof(TTestFindSettingsPatternArgs); i++) + { + test.Printf(_L("iMask=0x%08x iPattern=0x%08x\n"), + KTestFindSettingsPatternArgs[i].iMask, + KTestFindSettingsPatternArgs[i].iPattern); + + // Test each category + TUint j; + for (j = 0; j < sizeof(KTestCategories) / sizeof(TCategoryUid); j++) + { + test.Printf(_L("Category 0x%08x: "), KTestCategories[j]); + //Memory allocation fail test. By this code we simulate the memory + //allocation failure at place defined by allocFactor. The loop will + //continue until the next allocation is not failed. When we reached + //this point it means we've gone through all possible allocations in + //the tested method below. + TInt allocFactor = 1; + //Memory allocation fails + do + { + __KHEAP_MARK; + __KHEAP_SETFAIL(RAllocator::EFailNext, allocFactor); + r = HcrSimTest.FindSettings( + KTestCategories[j], + aNumberOfSettings, + KTestFindSettingsPatternArgs[i].iMask, + KTestFindSettingsPatternArgs[i].iPattern, + elids, + types, lens); + __KHEAP_MARKEND; + + __KHEAP_RESET; + + //Let's arrise the memory allocation failure at another place + allocFactor ++; + + }while(r == KErrNoMemory); + + } + } + + + + // Free memory + User::Free(elids); + User::Free(types); + User::Free(lens); + + } + void HcrSimApiNegative(const TInt aExpectedErrorCode, const TUint32 aCategory, const TUint32 aSettingId) { @@ -1260,7 +1655,6 @@ { TSettingType type = ETypeUndefined; TUint16 len = 0; - TUint32 numfound = 0; TElementId elid = 0; @@ -1274,21 +1668,32 @@ { test_Equal(0, r); } + else + { + test_Equal(aExpectedErrorCode, r); + } // - r = HcrSimTest.FindSettings(id.iCat, 1, numfound, &elid, &type, &len); + r = HcrSimTest.FindSettings(id.iCat, 1, &elid, &type, &len); if (aExpectedErrorCode == KErrNotFound) { test_Equal(0, r); } + else + { + test_Equal(aExpectedErrorCode, r); + } // - r = HcrSimTest.FindSettings(id.iCat, 1, 0, 0, numfound, &elid, &type, &len); + r = HcrSimTest.FindSettings(id.iCat, 1, 0, 0, &elid, &type, &len); if (aExpectedErrorCode == KErrNotFound) { test_Equal(0, r); } - + else + { + test_Equal(aExpectedErrorCode, r); + } } { SSettingId settingid; @@ -1300,19 +1705,31 @@ TSettingType type; TInt i; - for(i = 0; i < 4; ++i) + for(i = 0; i < 5; ++i) { // test parameter combinations where aIds[], aValues[], aErrors[] are NULL - r = HcrSimTest.GetWordSettings(i, (i==1)?NULL:&settingid, (i==2)?NULL:&val, &type, (i==3)?NULL:&err); - if(r != KErrArgument) + r = HcrSimTest.GetWordSettings((i==1)?0:1, (i==2)?NULL:&settingid, (i==3)?NULL:&val, &type, (i==4)?NULL:&err); + if (aExpectedErrorCode != KErrNotFound) + { + // HCR did not initialise properly - HCR will not bother checking validity of arguments + test_Equal(aExpectedErrorCode, r); + } + else if (i > 0) { - test_Equal(aExpectedErrorCode, r); + // One of the arguments is invalid + test_Equal(KErrArgument, r); + } + else + { + // Arguments are fine but element does not exist + test_Equal(0, r); } } } } + void HcrSimTestApiTests(SSettingC* aRepository, TUint aNumberOfSettings) { if (aRepository && aNumberOfSettings > 0) @@ -1324,6 +1741,11 @@ HcrSimNumSettingsInCategory(aRepository, aNumberOfSettings); HcrSimFindSettingsCategory(aRepository, aNumberOfSettings); HcrSimFindSettingsPattern(aRepository, aNumberOfSettings); + + HcrSimFindSettingsCategoryNegative(aRepository, aNumberOfSettings); + HcrSimFindSettingsPatternNegative(aNumberOfSettings); + if(gHcrThread == KSimOwnThread) + HcrSimFindSettingsPatternMemAllocFails(aNumberOfSettings); } HcrSimApiNegative(KErrNotFound, KTestInvalidCategory, KTestInvalidSettingId); @@ -1385,6 +1807,7 @@ test.Start(_L("Load Device Driver")); test.Printf(_L("%S\n"), &aDriver); TInt r; + r = User::LoadLogicalDevice(aDriver); if (r == KErrAlreadyExists) { @@ -1408,6 +1831,14 @@ r = HcrSimTest.InitExtension(); test_KErrNone(r); + //Initialize static variable with the right HCR client type + if(aDriver.Compare(KTestHcrSimOwn) == 0) + gHcrThread = KSimOwnThread; + else if(aDriver.Compare(KTestHcrSimClient) == 0) + gHcrThread = KSimClientThread; + else + test(EFalse); + test.Next(_L("Compiled")); test.Start(_L("Initialisation")); r = HcrSimTest.SwitchRepository(KTestClearRepos, HCRInternal::ECoreRepos); @@ -1415,8 +1846,8 @@ r = HcrSimTest.SwitchRepository(KTestClearRepos, HCRInternal::EOverrideRepos); test_KErrNone(r); HcrSimTestApiTests(SettingsList, sizeof(SettingsList) / sizeof(SSettingC)); - test.End(); - + test.End(); + test.Next(_L("Compiled+File")); test.Start(_L("Initialisation")); r = HcrSimTest.SwitchRepository(KTestFileRepos, HCRInternal::ECoreRepos); @@ -1534,10 +1965,21 @@ HcrSimTestApiTests(SettingsList7, sizeof(SettingsList7) / sizeof(SSettingC)); test.End(); + test.Next(_L("Empty+File+Empty")); + test.Start(_L("Initialisation")); + r = HcrSimTest.SwitchRepository(KTestEmpty, HCRInternal::EOverrideRepos); + test_KErrNone(r); + r = HcrSimTest.CheckIntegrity(); + test_KErrNone(r); + HcrSimTestApiTests(SettingsList7, sizeof(SettingsList7) / sizeof(SSettingC)); + test.End(); + test.Next(_L("No Repository (Empty)")); test.Start(_L("Initialisation")); r = HcrSimTest.SwitchRepository(KTestClearRepos, HCRInternal::ECoreRepos); test_KErrNone(r); + r = HcrSimTest.SwitchRepository(KTestClearRepos, HCRInternal::EOverrideRepos); + test_KErrNone(r); r = HcrSimTest.CheckIntegrity(); test_KErrNone(r); HcrSimTestApiTests(NULL, 0); @@ -1704,7 +2146,6 @@ test_Compare(0, <=, nosettings); if (nosettings > 0) { - TUint32 numfound; TElementId* elids; TSettingType* types; TUint16* lens; @@ -1714,9 +2155,9 @@ test_NotNull(types); lens = (TUint16*) User::Alloc(nosettings * sizeof(TUint16)); test_NotNull(lens); - r = HcrSimTest.FindSettings(cat, nosettings, numfound, elids, types, lens); + r = HcrSimTest.FindSettings(cat, nosettings, elids, types, lens); test_Equal(nosettings, r); - test_Equal(nosettings, numfound); + TInt i; for (i = 0; i < nosettings; i++) { @@ -1957,6 +2398,29 @@ // HcrRealRetrieveKernelExtensionTestResults(); HcrRealSettingDiscovery(); + + // Initialize static variable with the right HCR client type + if(aDriver.Compare(KTestHcrRealOwn) == 0) + gHcrThread = KSimOwnThread; + else if(aDriver.Compare(KTestHcrRealClient) == 0) + gHcrThread = KSimClientThread; + else + test(EFalse); + // + TBool smr; + TBool smrrep; + r = HcrSimTest.HasRepositoryInSmr(smr, smrrep); + test_KErrNone(r); + if (smrrep) + { + // File + NAND + HcrSimTestApiTests(SettingsList6, sizeof(SettingsList6) / sizeof(SSettingC)); + } + else + { + // File + HcrSimTestApiTests(SettingsList7, sizeof(SettingsList7) / sizeof(SSettingC)); + } // test.Next(_L("Close LDD")); HcrSimTest.Close(); @@ -2131,8 +2595,7 @@ test.Title(); test.Start(_L("HCR Test Suite")); - - + //Order the the test lists in descend(the setting with the smallest //setting Id is first) @@ -2167,8 +2630,8 @@ sizeof(SettingsList7)/sizeof(SettingsList7[0])); rSettingsList7.Sort(order); - - //Functional API tests + + //Functional API test RomHeaderTests(); HcrRealTests(KTestHcrRealOwn); HcrRealTests(KTestHcrRealClient);
--- a/kerneltest/e32test/hcr/t_hcrut.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/t_hcrut.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -20,16 +20,124 @@ #include <u32hal.h> #include <hal.h> #include <hal_data.h> +#include <drivers/hcr.h> + +#include "hcr_hai.h" // for SSettingC structure +#include "hcr_uids.h" + +using namespace HCR; + #include "d_hcrut.h" +#include "d_hcrsim_testdata.h" + #define __TRACE_LINE__() test.Printf(_L("%d\n"),__LINE__) RTest test(_L("T_HCRUT")); _LIT(KTestDriver,"d_hcrut"); - + RHcrTest HcrTest; + +void TestBoundaryFindSettingsInCategory() + { + TInt32 firstEl; + TInt32 lastEl; + + + //Test low end boundary conditions in the compiled repository, first and + //end elements don't belong to the repository + TUint32 TestCat = KHCRUID_TestCategory1; + TInt NumInTestCat = 15; + + test_KErrNone(HcrTest.Test_FindCompiledSettingsInCategory(TestCat, + &firstEl, &lastEl)); + test_Equal((lastEl - firstEl + 1), NumInTestCat); + + // Load file repository data for the boundary test condition + const TText * fileBc0 = (const TText *)"filerepos_bc0.dat"; + test_KErrNone(HcrTest.Test_SwitchFileRepository(fileBc0)); + + // Test the low end boundary conditions in the file repository. + // First element in the category is also the first element in the + // repository + TestCat = 0x00000001; + NumInTestCat = 4; + + test_KErrNone(HcrTest.Test_FindFileSettingsInCategory(TestCat, + &firstEl, &lastEl)); + test_Equal((lastEl - firstEl + 1), NumInTestCat); + + // Test the high end boundary conditions in the file repository. + // Last element in the category is also the last element in the + // repository + TestCat = 0xFFFFFFFF; + NumInTestCat = 4; + + test_KErrNone(HcrTest.Test_FindFileSettingsInCategory(TestCat, + &firstEl, &lastEl)); + test_Equal((lastEl - firstEl + 1), NumInTestCat); + + + + //Load relevant coreImg repository + const TText * fileBc1 = (const TText *)"filerepos_bc1.dat"; + test_KErrNone(HcrTest.Test_SwitchFileRepository(fileBc1)); + + + //Test the low end boundary condition when first element of the + //repository does not belong to the requested category, so first element + // in TestBc1Cat0 is second in the repository. + TestCat = 0x2; + NumInTestCat = 4; + + test_KErrNone(HcrTest.Test_FindFileSettingsInCategory(TestCat, + &firstEl, &lastEl)); + test_Equal((lastEl - firstEl + 1), NumInTestCat); + + + + //Test the high end boundary condition when last element in the + // repository does not belong to TestBc1Cat1 in opposite to the previous + //element which part of this category. + TestCat = 0x10000002; + NumInTestCat = 7; + + test_KErrNone(HcrTest.Test_FindFileSettingsInCategory(TestCat, + &firstEl, &lastEl)); + test_Equal((lastEl - firstEl + 1), NumInTestCat); + + + //The required category has only one element and it's first setting + //in the repository + TestCat = 0x01; + NumInTestCat = 1; + + test_KErrNone(HcrTest.Test_FindFileSettingsInCategory(TestCat, + &firstEl, &lastEl)); + test_Equal((lastEl - firstEl + 1), NumInTestCat); + + //The required category has only one element and it's the last setting + //in the repository + TestCat = 0xFFFFFFFF; + NumInTestCat = 1; + + test_KErrNone(HcrTest.Test_FindFileSettingsInCategory(TestCat, + &firstEl, &lastEl)); + test_Equal((lastEl - firstEl + 1), NumInTestCat); + + + //Standard use case, all elements of the category are situated somewhere + //in the middle of the repository + TestCat = 0x10000002; + NumInTestCat = 7; + + test_KErrNone(HcrTest.Test_FindFileSettingsInCategory(TestCat, + &firstEl, &lastEl)); + test_Equal((lastEl - firstEl + 1), NumInTestCat); + } + //--------------------------------------------- //! @SYMTestCaseID //! @SYMTestType @@ -44,22 +152,75 @@ //--------------------------------------------- TInt TestBasics () { - test.Next(_L("Switch repository test")); + test.Next(_L("Check Integrity test")); +#ifdef __WINS__ + test.Printf(_L("Skipped on the emulator")); +#else + test_KErrNone( HcrTest.Test_CheckIntegrity()); +#endif // __WINS__ + + test.Next(_L("Check Content test")); +#ifdef __WINS__ + test.Printf(_L("Skipped on the emulator")); +#else + test_KErrNone( HcrTest.Test_CheckContent()); +#endif // __WINS__ - test_KErrNone( HcrTest.Test_SwitchRepository()); + + test.Next(_L("Switch repository test")); + test_KErrNone(HcrTest.Test_SwitchRepository()); + + test.Next(_L("Invoke FindSettingsInCategory boundary conditon tests")); + TestBoundaryFindSettingsInCategory(); + + // Wait for idle + async cleanup (waits for DKernelEventHandler to go away) + TInt r = UserSvr::HalFunction(EHalGroupKernel, EKernelHalSupervisorBarrier, (TAny*)5000, 0); + test_KErrNone(r); + + User::After(5000000); + + + return KErrNone; + } + + +TInt TRepositoryGetWordValueUnitTests () + { + test.Next(_L("Unit tests for HCR::TRepositoryFile::GetWordValue && HCR::TRepositoryCompiled::GetWordValue")); + + SSettingC* setting; + for(setting = SettingsList; setting < SettingsList + sizeof(SettingsList) / sizeof(SSettingC); ++setting) + { + TCategoryUid category = setting->iName.iId.iCat; + TElementId key = setting->iName.iId.iKey; + TInt type = setting->iName.iType; + test_KErrNone( HcrTest.Test_TRepositoryGetWordValue(category, key, type)); + + } // Wait for idle + async cleanup (waits for DKernelEventHandler to go away) TInt r = UserSvr::HalFunction(EHalGroupKernel, EKernelHalSupervisorBarrier, (TAny*)5000, 0); test_KErrNone(r); - User::After(1000000); + return KErrNone; + } + +TInt NegativeTestsLargeValues () + { + test.Next(_L("Negative tests for HCR::TRepository::GetLargeValues")); + + TInt expectedError = KErrArgument; + + test_KErrNone( HcrTest.Test_NegativeTestsLargeValues(expectedError)); + + // Wait for idle + async cleanup (waits for DKernelEventHandler to go away) + TInt r = UserSvr::HalFunction(EHalGroupKernel, EKernelHalSupervisorBarrier, (TAny*)5000, 0); + test_KErrNone(r); return KErrNone; } - - GLDEF_C TInt E32Main() { TInt r; @@ -78,6 +239,9 @@ // TestBasics(); + NegativeTestsLargeValues(); + TRepositoryGetWordValueUnitTests(); + test.Next(_L("=== Close LDD")); HcrTest.Close();
--- a/kerneltest/e32test/hcr/t_hcrut.mmp Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/hcr/t_hcrut.mmp Tue Jan 26 13:13:38 2010 +0200 @@ -21,6 +21,7 @@ OS_LAYER_SYSTEMINCLUDE_SYMBIAN +userinclude ../../../kernel/eka/drivers/hcr sourcepath . source t_hcrut.cpp
--- a/kerneltest/e32test/mmu/d_memorytest.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/mmu/d_memorytest.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -54,10 +54,17 @@ struct{ TPhysicalPinObject* iObject; TPhysAddr iPhysAddr; - TPhysAddr iPhysPageList[UCPageCount]; + TPhysAddr iPhysPageList[KUCPageCount]; TUint iColour; TUint32 iActualMapAttr; }iPhysicalPinning; + + struct{ + TKernelMapObject* iObject; + TPhysAddr iPhysPageList[KUCPageCount]; + TLinAddr iLinAddr; + }iKernelMapping; + TUint32 iPageSize; }; @@ -249,7 +256,7 @@ return KErrNotSupported; #else TInt i; - for (i=0;i<UCPageCount; i++) + for (i=0;i<KUCPageCount; i++) { TPhysAddr addr = Epoc::LinearToPhysical((TLinAddr)a1 + i*iPageSize); if (addr==KPhysAddrInvalid) return KErrGeneral; @@ -313,6 +320,107 @@ NKern::ThreadLeaveCS(); return r; } + + case RMemoryTestLdd::ECreateKernelMapObject: + { + NKern::ThreadEnterCS(); + r=Kern::CreateKernelMapObject(iKernelMapping.iObject, (TUint)a1); + NKern::ThreadLeaveCS(); + return r; + } + + case RMemoryTestLdd::EKernelMapMemory: + return Kern::MapAndPinMemory( iKernelMapping.iObject, NULL, (TLinAddr)a1, (TUint)a2, 0, + iKernelMapping.iLinAddr, iKernelMapping.iPhysPageList); + + case RMemoryTestLdd::EKernelMapMemoryRO: + return Kern::MapAndPinMemory( iKernelMapping.iObject, NULL, (TLinAddr)a1, (TUint)a2, Kern::EKernelMap_ReadOnly, + iKernelMapping.iLinAddr, iKernelMapping.iPhysPageList); + + case RMemoryTestLdd::EKernelMapMemoryInvalid: + return Kern::MapAndPinMemory( iKernelMapping.iObject, NULL, (TLinAddr)a1, (TUint)a2, (TUint)~Kern::EKernelMap_ReadOnly, + iKernelMapping.iLinAddr, iKernelMapping.iPhysPageList); + + case RMemoryTestLdd::EKernelMapCheckPageList: + { +#ifdef __WINS__ + return KErrNotSupported; +#else + TUint i = 0; + for (; i < (TUint)KUCPageCount; i++) + { + // Compare the user side address to physical addresses + TPhysAddr addr = Epoc::LinearToPhysical((TLinAddr)a1 + i*iPageSize); + if (addr == KPhysAddrInvalid) + return KErrGeneral; + if (addr != iKernelMapping.iPhysPageList[i]) + return KErrNotFound; + // Compare the kernel side address to physical addresses + addr = Epoc::LinearToPhysical(iKernelMapping.iLinAddr + i*iPageSize); + if (addr == KPhysAddrInvalid) + return KErrGeneral; + if (addr != iKernelMapping.iPhysPageList[i]) + return KErrNotFound; + } + return KErrNone; +#endif + } + + case RMemoryTestLdd::EKernelMapSyncMemory: + Cache::SyncMemoryBeforeDmaWrite(iKernelMapping.iLinAddr, KUCPageCount*iPageSize); + return KErrNone; + + case RMemoryTestLdd::EKernelMapInvalidateMemory: + { + Cache::SyncMemoryBeforeDmaRead(iKernelMapping.iLinAddr, KUCPageCount*iPageSize); + Cache::SyncMemoryAfterDmaRead(iKernelMapping.iLinAddr, KUCPageCount*iPageSize); + return KErrNone; + } + + case RMemoryTestLdd::EKernelMapMoveMemory: + { +#ifdef __WINS__ + return KErrNotSupported; +#else + TPhysAddr newPage; + NKern::ThreadEnterCS(); + r = Epoc::MovePhysicalPage(iKernelMapping.iPhysPageList[(TUint)a1], newPage); + NKern::ThreadLeaveCS(); + return r; +#endif + } + + case RMemoryTestLdd::EKernelMapReadModifyMemory: + { + TUint8* p = (TUint8*)iKernelMapping.iLinAddr; + // Verify the contents of the data when accessed via the kernel mapping. + TUint i = 0; + for (i = 0; i < KUCPageCount*iPageSize; i++) + { + if (*p++ != (TUint8)i) + return KErrCorrupt; + } + // Modify the data via the kernel mapping. + p = (TUint8*)iKernelMapping.iLinAddr; + for (i = 0; i < KUCPageCount*iPageSize; i++) + { + *p++ = (TUint8)(i + 1); + } + return KErrNone; + } + + case RMemoryTestLdd::EKernelUnmapMemory: + Kern::UnmapAndUnpinMemory(iKernelMapping.iObject); + return KErrNone; + + case RMemoryTestLdd::EDestroyKernelMapObject: + { + NKern::ThreadEnterCS(); + Kern::DestroyKernelMapObject(iKernelMapping.iObject); + NKern::ThreadLeaveCS(); + return KErrNone; + } + default: return KErrNotSupported; }
--- a/kerneltest/e32test/mmu/d_memorytest.h Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/mmu/d_memorytest.h Tue Jan 26 13:13:38 2010 +0200 @@ -25,7 +25,7 @@ _LIT(KMemoryTestLddName,"d_memorytest"); -const TInt UCPageCount = 2;//Page count of user chunk used in physical pinning tests. +const TInt KUCPageCount = 4;//Page count of user chunk used in physical pinning tests. class RMemoryTestLdd : public RBusLogicalChannel { @@ -54,7 +54,18 @@ EDestroyPhysicalPinObject, EPinKernelPhysicalMemory, ESetPanicTrace, - EIsMemoryPresent + EIsMemoryPresent, + ECreateKernelMapObject, + EDestroyKernelMapObject, + EKernelMapMemory, + EKernelMapMemoryRO, + EKernelMapMemoryInvalid, + EKernelMapCheckPageList, + EKernelMapSyncMemory, + EKernelMapInvalidateMemory, + EKernelMapMoveMemory, + EKernelMapReadModifyMemory, + EKernelUnmapMemory, }; #ifndef __KERNEL_MODE__ @@ -112,6 +123,28 @@ { return DoControl(ESetPanicTrace,(TAny*)aEnable); } inline TInt IsMemoryPresent(const TAny* aPtr) { return DoControl(EIsMemoryPresent,(TAny*)aPtr); } + inline TInt CreateKernelMapObject(TUint aReserveBytes) + { return DoControl(ECreateKernelMapObject, (TAny*)aReserveBytes); } + inline TInt DestroyKernelMapObject() + { return DoControl(EDestroyKernelMapObject); } + inline TInt KernelMapMemory(TLinAddr aStart, TUint aSize) + { return DoControl(EKernelMapMemory,(TAny*)aStart, (TAny*)aSize); } + inline TInt KernelMapMemoryRO(TLinAddr aStart, TUint aSize) + { return DoControl(EKernelMapMemoryRO,(TAny*)aStart, (TAny*)aSize); } + inline TInt KernelMapMemoryInvalid(TLinAddr aStart, TUint aSize) + { return DoControl(EKernelMapMemoryInvalid,(TAny*)aStart, (TAny*)aSize); } + inline TInt KernelMapCheckPageList(TUint8* aStart) + { return DoControl(EKernelMapCheckPageList, (TAny*)aStart); } + inline TInt KernelMapSyncMemory() + { return DoControl(EKernelMapSyncMemory); } + inline TInt KernelMapInvalidateMemory() + { return DoControl(EKernelMapInvalidateMemory); } + inline TInt KernelMapMoveMemory(TUint aIndex) + { return DoControl(EKernelMapMoveMemory, (TAny*)aIndex); } + inline TInt KernelMapReadAndModifyMemory() + { return DoControl(EKernelMapReadModifyMemory); } + inline TInt KernelUnmapMemory() + { return DoControl(EKernelUnmapMemory); } #endif };
--- a/kerneltest/e32test/mmu/t_pin.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/e32test/mmu/t_pin.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -115,7 +115,7 @@ test.Printf(_L("Allocate user chunk\n")); TChunkCreateInfo createInfo; - createInfo.SetDisconnected(0,UCPageCount*PageSize,UCPageCount*PageSize); + createInfo.SetDisconnected(0,KUCPageCount*PageSize,KUCPageCount*PageSize); createInfo.SetPaging(TChunkCreateInfo::EPaged); test_KErrNone(chunk.Create(createInfo)); UCBase = (TInt8*)chunk.Base(); @@ -130,12 +130,12 @@ test_KErrNone(Ldd.UnpinPhysicalMemory()); test.Printf(_L("Perform Physical pin operation on the chunk\n")); - test_KErrNone(Ldd.PinPhysicalMemory((TLinAddr)UCBase, UCPageCount*PageSize)); + test_KErrNone(Ldd.PinPhysicalMemory((TLinAddr)UCBase, KUCPageCount*PageSize)); test.Printf(_L("Test that pinned physical memory preserves its mapping when recommited\n")); - test_KErrNone(chunk.Decommit(0,UCPageCount*PageSize)); //Decommit all - for (i=UCPageCount-1;i>=0;i--) test_KErrNone(chunk.Commit(i*PageSize,PageSize)); //Commit in reverse order - for (i=0;i<UCPageCount;i++) // Recommited memory is not paged in. So, write into each page, before driver + test_KErrNone(chunk.Decommit(0,KUCPageCount*PageSize)); //Decommit all + for (i=KUCPageCount-1;i>=0;i--) test_KErrNone(chunk.Commit(i*PageSize,PageSize)); //Commit in reverse order + for (i=0;i<KUCPageCount;i++) // Recommited memory is not paged in. So, write into each page, before driver { // calls Kern::LinearToPhysical or it will get KErrInvalidMemory in return. volatile TInt8* ptr = (volatile TInt8*)(UCBase+i*PageSize); *ptr = 10; @@ -143,10 +143,10 @@ test_KErrNone(Ldd.CheckPageList(chunk.Base())); // Check that the mapping is preserved. test.Printf(_L("Sync cache & memory of User Chunk\n"));//Test Cache::SyncPhysicalMemoryBeforeDmaWrite - test_KErrNone(Ldd.SyncPinnedPhysicalMemory(0,UCPageCount*PageSize)); + test_KErrNone(Ldd.SyncPinnedPhysicalMemory(0,KUCPageCount*PageSize)); test.Printf(_L("Invalidate cache of User Chunk\n"));//Test Cache::SyncPhysicalMemoryBefore/AfterDmaRead - test_KErrNone(Ldd.InvalidatePinnedPhysicalMemory(0,UCPageCount*PageSize)); + test_KErrNone(Ldd.InvalidatePinnedPhysicalMemory(0,KUCPageCount*PageSize)); test.Printf(_L("Try to move pinned phys. memory...\n")); //RAM defrag should return error code here. i = Ldd.MovePinnedPhysicalMemory(0); @@ -157,15 +157,15 @@ chunk.Close(); // ... mapped to another virtual memory. test.Printf(_L("Allocate & initilise the second chunk\n"));// Kernel sholudn't commit pinned physical memory ... - test_KErrNone(chunk.CreateLocal(2*PageSize,2*PageSize)); // ...that has been just decommited from the first chunk. + test_KErrNone(chunk.CreateLocal(KUCPageCount*PageSize,KUCPageCount*PageSize)); // ...that has been just decommited from the first chunk. UCBase = (TInt8*)chunk.Base(); - for (i=0;i<UCPageCount*PageSize;i++) UCBase[i]=0; //Initialise user buffer + for (i=0;i<KUCPageCount*PageSize;i++) UCBase[i]=0; //Initialise user buffer test.Printf(_L("Invalidate cache of pinned memory\n"));//This shouldn't affect the second chunk. - test_KErrNone(Ldd.InvalidatePinnedPhysicalMemory(0,UCPageCount*PageSize)); + test_KErrNone(Ldd.InvalidatePinnedPhysicalMemory(0,KUCPageCount*PageSize)); test.Printf(_L("Check data in the second chunk is unaffected\n")); - for (i=0;i<UCPageCount*PageSize;i++) test(UCBase[i]==0); + for (i=0;i<KUCPageCount*PageSize;i++) test(UCBase[i]==0); test.Printf(_L("Close the second chunk\n")); chunk.Close(); @@ -199,7 +199,7 @@ RChunk chunk; test.Printf(_L("Allocate user chunk\n")); - test_KErrNone(chunk.CreateDisconnectedLocal(0,UCPageCount*PageSize,UCPageCount*PageSize)); + test_KErrNone(chunk.CreateDisconnectedLocal(0,KUCPageCount*PageSize,KUCPageCount*PageSize)); UCBase = (TInt8*)chunk.Base(); const TInt KMaxKernelAllocations = 1024; @@ -223,7 +223,7 @@ { __KHEAP_FAILNEXT(i); test.Printf(_L("Perform physical pin operation\n")); - r = Ldd.PinPhysicalMemory((TLinAddr)UCBase, UCPageCount*PageSize); + r = Ldd.PinPhysicalMemory((TLinAddr)UCBase, KUCPageCount*PageSize); __KHEAP_RESET; } test.Printf(_L("Perform physical pin operation took %d tries\n"),i); @@ -649,6 +649,163 @@ } +TInt KernelModifyData(TAny*) + { + Ldd.KernelMapReadAndModifyMemory(); + return KErrNone; + } + +void TestMapAndPinMemory() + { + + TInt mm = UserSvr::HalFunction(EHalGroupKernel, EKernelHalMemModelInfo, 0, 0) & EMemModelTypeMask; + if (mm < EMemModelTypeFlexible) + { + test.Printf(_L("Memory model (%d) doesn't support physical pining\n"),mm); + return; + } + TInt i; + TUint KUCBytes = KUCPageCount * PageSize; + RChunk chunk; + + test.Printf(_L("Allocate user chunk\n")); + TChunkCreateInfo createInfo; + createInfo.SetDisconnected(0, KUCBytes, KUCBytes); + createInfo.SetPaging(TChunkCreateInfo::EPaged); + test_KErrNone(chunk.Create(createInfo)); + TUint8* chunkBase = (TUint8*)chunk.Base(); + + test.Printf(_L("Create kernel map object\n")); + test_KErrNone(Ldd.CreateKernelMapObject(0)); + + test.Printf(_L("Perform kernel map operation on zero-length buffer\n")); + test_KErrNone(Ldd.KernelMapMemory((TLinAddr)chunkBase, 0)); + + test.Printf(_L("Perform kernel unmap operation\n")); + test_KErrNone(Ldd.KernelUnmapMemory()); + + test.Printf(_L("Perform kernel map operation on the chunk\n")); + test_KErrNone(Ldd.KernelMapMemory((TLinAddr)chunkBase, KUCBytes)); + + test.Printf(_L("Attempt to map the memory again while already mapped\n")); + test_Equal(KErrInUse, Ldd.KernelMapMemory((TLinAddr)chunkBase, KUCBytes)); + + test.Printf(_L("Use the kernel mapping to modify the data and verify it\n")); + TUint8* p = chunkBase; + for (i = 0; i < (TInt)KUCBytes; i++) + *p++ = (TUint8)i; + test_KErrNone(Ldd.KernelMapReadAndModifyMemory()); + p = chunkBase; + for (i = 0; i < (TInt)KUCBytes; i++) + test_Equal((TUint8)(i + 1), *p++); + + test.Printf(_L("Test that kernel mapped memory preserves its mapping when recommited\n")); + test_KErrNone(chunk.Decommit(0,KUCPageCount*PageSize)); //Decommit all + for (i=KUCPageCount-1;i>=0;i--) test_KErrNone(chunk.Commit(i*PageSize,PageSize)); //Commit in reverse order + for (i=0;i<KUCPageCount;i++) // Recommited memory is not paged in. So, write into each page, before driver + { // calls Kern::LinearToPhysical or it will get KErrInvalidMemory in return. + volatile TInt8* ptr = (volatile TInt8*)(chunkBase+i*PageSize); + *ptr = 10; + } + test_KErrNone(Ldd.KernelMapCheckPageList(chunkBase)); // Check that the mapping is preserved. + + test.Printf(_L("Sync cache & memory of User Chunk\n")); //Test Cache::SyncMemoryBeforeDmaWrite + test_KErrNone(Ldd.KernelMapSyncMemory()); + + test.Printf(_L("Invalidate cache of User Chunk\n"));//Test Cache::SyncMemoryBefore/AfterDmaRead + test_KErrNone(Ldd.KernelMapInvalidateMemory()); + + test.Printf(_L("Try to move kernel map memory...\n")); //RAM defrag should return error code here. + for (i = 0; i < KUCPageCount; i++) + { + TInt r = Ldd.KernelMapMoveMemory(0); + test.Printf(_L("...[%d] returned %d\n"), i, r); + test(r != KErrNone); + } + + test.Printf(_L("Unmap the memory and attempt to map with invalid attributes\n")); + test_KErrNone(Ldd.KernelUnmapMemory()); + test_Equal(KErrArgument, Ldd.KernelMapMemoryInvalid((TLinAddr)chunkBase, KUCBytes)); + + test.Printf(_L("Map the memory read only and attempt to modify it kernel side\n")); + test_KErrNone(Ldd.KernelMapMemoryRO((TLinAddr)chunkBase, KUCBytes)); + // Reset the contents of the memory. + p = chunkBase; + for (i = 0; i < (TInt)KUCBytes; i++) + *p++ = (TUint8)i; + + RThread modThread; + test_KErrNone(modThread.Create(KNullDesC, KernelModifyData, PageSize, PageSize, PageSize, (TAny*)NULL)); + TRequestStatus status; + modThread.Logon(status); + test_Equal(KRequestPending, status.Int()); + modThread.Resume(); + User::WaitForRequest(status); + test_Equal(EExitPanic, modThread.ExitType()); + test(modThread.ExitCategory() == _L("KERN-EXEC")); + test_Equal(ECausedException, modThread.ExitReason()); + CLOSE_AND_WAIT(modThread); + + test.Printf(_L("Close the chunk\n")); // Phys. memory is pinned and shouldn't be ... + chunk.Close(); // ... mapped to another virtual memory. + + test.Printf(_L("Allocate & initilise the second chunk\n"));// Kernel shouldn't commit pinned physical memory ... + test_KErrNone(chunk.CreateLocal(KUCBytes, KUCBytes)); // ...that has just been decommited from the first chunk. + chunkBase = (TUint8*)chunk.Base(); + for (i = 0; i < KUCPageCount * PageSize; i++) + chunkBase[i] = 0; //Initialise user buffer + + test.Printf(_L("Invalidate cache of pinned memory\n"));//This shouldn't affect the second chunk. + test_KErrNone(Ldd.KernelMapInvalidateMemory()); + + test.Printf(_L("Check data in the second chunk is unaffected\n")); + for (i=0; i < KUCPageCount * PageSize; i++) + test(chunkBase[i]==0); + + test.Printf(_L("Close the second chunk\n")); + chunk.Close(); + + test.Printf(_L("Perform kernel unmap operation\n")); + test_KErrNone(Ldd.KernelUnmapMemory()); + + test.Printf(_L("Perform physical unpin operation (again)\n")); + test_KErrNone(Ldd.KernelUnmapMemory()); // test double unpin ok + + test.Printf(_L("Destroy physical pin object\n")); + test_KErrNone(Ldd.DestroyKernelMapObject()); + + test.Printf(_L("Destroy physical pin object (again)\n")); + test_KErrNone(Ldd.DestroyKernelMapObject()); // test double destroy ok + + // + // Test a kernel mapping with preserved resources doesn't allocate when mapping and pinning. + // + test.Printf(_L("Create a pre-reserving kernel mapping object\n")); + TUint mappingSize = KUCBytes>>1; + // This test step relies on mapping objet being smaller than the user chunk + // and as mapping object will always be >=2 pages, user chunk must be at least 4. + __ASSERT_COMPILE(KUCPageCount >= 4); + test_KErrNone(Ldd.CreateKernelMapObject(mappingSize)); + TChunkCreateInfo chunkInfo; + chunkInfo.SetNormal(KUCBytes, KUCBytes); + chunkInfo.SetPaging(TChunkCreateInfo::EUnpaged); + test_KErrNone(chunk.Create(chunkInfo)); + + test.Printf(_L("Map and pin an unpaged chunk with pre-reserved resources\n")); + __KHEAP_FAILNEXT(1); // Ensure any attempted kernel heap allocations fail. + test_KErrNone(Ldd.KernelMapMemory((TLinAddr)chunk.Base(), mappingSize)); + test_KErrNone(Ldd.KernelUnmapMemory()); + + test.Printf(_L("Map more memory than we have pre-reserved resources for\n")); + test_Equal(KErrArgument, Ldd.KernelMapMemory((TLinAddr)chunk.Base(), mappingSize*2)); + + test.Printf(_L("Destroy the kernel map object with pre-reserved resources\n")); + test_KErrNone(Ldd.DestroyKernelMapObject()); // This will also unpin the memory. + // Clear the kernel heap fail next. + __KHEAP_RESET; + chunk.Close(); + } + TInt E32Main() { test.Title(); @@ -717,7 +874,10 @@ test.Next(_L("Physical pinning OOM")); TestPhysicalPinOutOfMemory(); - + + test.Next(_L("Kernel pin mapping")); + TestMapAndPinMemory(); + test.Next(_L("Pin OOM Tests")); TestPinOutOfMemory();
--- a/kerneltest/f32test/shostmassstorage/testclient/usbtestmsclient/transport/cbulkonlytransport.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/kerneltest/f32test/shostmassstorage/testclient/usbtestmsclient/transport/cbulkonlytransport.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -231,6 +231,8 @@ { // KInEndpoint is going to be our TX (IN, write) endpoint ifc().iEndpointData[0].iType = KUsbEpTypeBulk; + if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) + ifc().iEndpointData[0].iFeatureWord1 = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering; ifc().iEndpointData[0].iDir = KUsbEpDirIn; ifc().iEndpointData[0].iSize = maxPacketSize; ifc().iEndpointData[0].iInterval_Hs = 0; @@ -246,6 +248,8 @@ { // KOutEndpoint is going to be our RX (OUT, read) endpoint ifc().iEndpointData[1].iType = KUsbEpTypeBulk; + if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) + ifc().iEndpointData[1].iFeatureWord1 = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering; ifc().iEndpointData[1].iDir = KUsbEpDirOut; ifc().iEndpointData[1].iSize = maxPacketSize; ifc().iEndpointData[1].iInterval_Hs = 0; @@ -360,28 +364,36 @@ iDataTransferMan.Init(); iStarted = ETrue; - // Set up DMA if possible (errors are non-critical) - TInt err = iLdd.AllocateEndpointResource(KOutEndpoint, EUsbcEndpointResourceDMA); - if (err != KErrNone) - { - __PRINT1(_L("Set DMA on OUT endpoint failed with error code: %d"), err); - } - err = iLdd.AllocateEndpointResource(KInEndpoint, EUsbcEndpointResourceDMA); - if (err != KErrNone) + TUsbDeviceCaps d_caps; + TInt ret = iLdd.DeviceCaps(d_caps); + if (ret == KErrNone) { - __PRINT1(_L("Set DMA on IN endpoint failed with error code: %d"), err); - } + if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) != KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) + { + // Set up DMA if possible (errors are non-critical) + TInt err = iLdd.AllocateEndpointResource(KOutEndpoint, EUsbcEndpointResourceDMA); + if (err != KErrNone) + { + __PRINT1(_L("Set DMA on OUT endpoint failed with error code: %d"), err); + } + err = iLdd.AllocateEndpointResource(KInEndpoint, EUsbcEndpointResourceDMA); + if (err != KErrNone) + { + __PRINT1(_L("Set DMA on IN endpoint failed with error code: %d"), err); + } - // Set up Double Buffering if possible (errors are non-critical) - err = iLdd.AllocateEndpointResource(KOutEndpoint, EUsbcEndpointResourceDoubleBuffering); - if (err != KErrNone) - { - __PRINT1(_L("Set Double Buffering on OUT endpoint failed with error code: %d"), err); - } - err = iLdd.AllocateEndpointResource(KInEndpoint, EUsbcEndpointResourceDoubleBuffering); - if (err != KErrNone) - { - __PRINT1(_L("Set Double Buffering on IN endpoint failed with error code: %d"), err); + // Set up Double Buffering if possible (errors are non-critical) + err = iLdd.AllocateEndpointResource(KOutEndpoint, EUsbcEndpointResourceDoubleBuffering); + if (err != KErrNone) + { + __PRINT1(_L("Set Double Buffering on OUT endpoint failed with error code: %d"), err); + } + err = iLdd.AllocateEndpointResource(KInEndpoint, EUsbcEndpointResourceDoubleBuffering); + if (err != KErrNone) + { + __PRINT1(_L("Set Double Buffering on IN endpoint failed with error code: %d"), err); + } + } } if (aDiscard)
--- a/userlibandfileserver/fileserver/group/release.txt Mon Jan 18 21:31:10 2010 +0200 +++ b/userlibandfileserver/fileserver/group/release.txt Tue Jan 26 13:13:38 2010 +0200 @@ -1,3 +1,12 @@ +Version 2.00.2026 +================= +(Made by vfebvre 17/12/2009) + +1. patrickconway + 1. DEFECT FIX: DEF143273: Mass Storage still using an obsoleted API to allocate endpoint resources + In cases where support for new API is detected in device capabilities, use that API to allocate endpoint resources + + Version 2.00.2025 ================= (Made by vfebvre 16/12/2009)
--- a/userlibandfileserver/fileserver/inc/f32ver.h Mon Jan 18 21:31:10 2010 +0200 +++ b/userlibandfileserver/fileserver/inc/f32ver.h Tue Jan 26 13:13:38 2010 +0200 @@ -58,6 +58,6 @@ @see TVersion */ -const TInt KF32BuildVersionNumber=2025; +const TInt KF32BuildVersionNumber=2026; // #endif
--- a/userlibandfileserver/fileserver/smassstorage/cbulkonlytransportusbcldd.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/userlibandfileserver/fileserver/smassstorage/cbulkonlytransportusbcldd.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -400,6 +400,8 @@ { // InEndpoint is going to be our TX (IN, write) endpoint ifc().iEndpointData[0].iType = KUsbEpTypeBulk; + if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) + ifc().iEndpointData[0].iFeatureWord1 = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering; ifc().iEndpointData[0].iDir = KUsbEpDirIn; ifc().iEndpointData[0].iSize = maxPacketSize; ifc().iEndpointData[0].iInterval_Hs = 0; @@ -415,6 +417,8 @@ { // OutEndpoint is going to be our RX (OUT, read) endpoint ifc().iEndpointData[1].iType = KUsbEpTypeBulk; + if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) + ifc().iEndpointData[1].iFeatureWord1 = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering; ifc().iEndpointData[1].iDir = KUsbEpDirOut; ifc().iEndpointData[1].iSize = maxPacketSize; ifc().iEndpointData[1].iInterval_Hs = 0; @@ -486,28 +490,36 @@ void CBulkOnlyTransportUsbcLdd::AllocateEndpointResources() { - // Set up DMA if possible (errors are non-critical) - TInt err = iLdd.AllocateEndpointResource(OutEndpoint, EUsbcEndpointResourceDMA); - if (err != KErrNone) - { - __PRINT1(_L("Set DMA on OUT endpoint failed with error code: %d"), err); - } - err = iLdd.AllocateEndpointResource(InEndpoint, EUsbcEndpointResourceDMA); - if (err != KErrNone) + TUsbDeviceCaps d_caps; + TInt ret = iLdd.DeviceCaps(d_caps); + if (ret == KErrNone) { - __PRINT1(_L("Set DMA on IN endpoint failed with error code: %d"), err); - } + if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) != KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) + { + // Set up DMA if possible (errors are non-critical) + TInt err = iLdd.AllocateEndpointResource(OutEndpoint, EUsbcEndpointResourceDMA); + if (err != KErrNone) + { + __PRINT1(_L("Set DMA on OUT endpoint failed with error code: %d"), err); + } + err = iLdd.AllocateEndpointResource(InEndpoint, EUsbcEndpointResourceDMA); + if (err != KErrNone) + { + __PRINT1(_L("Set DMA on IN endpoint failed with error code: %d"), err); + } - // Set up Double Buffering if possible (errors are non-critical) - err = iLdd.AllocateEndpointResource(OutEndpoint, EUsbcEndpointResourceDoubleBuffering); - if (err != KErrNone) - { - __PRINT1(_L("Set Double Buffering on OUT endpoint failed with error code: %d"), err); - } - err = iLdd.AllocateEndpointResource(InEndpoint, EUsbcEndpointResourceDoubleBuffering); - if (err != KErrNone) - { - __PRINT1(_L("Set Double Buffering on IN endpoint failed with error code: %d"), err); + // Set up Double Buffering if possible (errors are non-critical) + err = iLdd.AllocateEndpointResource(OutEndpoint, EUsbcEndpointResourceDoubleBuffering); + if (err != KErrNone) + { + __PRINT1(_L("Set Double Buffering on OUT endpoint failed with error code: %d"), err); + } + err = iLdd.AllocateEndpointResource(InEndpoint, EUsbcEndpointResourceDoubleBuffering); + if (err != KErrNone) + { + __PRINT1(_L("Set Double Buffering on IN endpoint failed with error code: %d"), err); + } + } } }
--- a/userlibandfileserver/fileserver/smassstorage/cbulkonlytransportusbcscldd.cpp Mon Jan 18 21:31:10 2010 +0200 +++ b/userlibandfileserver/fileserver/smassstorage/cbulkonlytransportusbcscldd.cpp Tue Jan 26 13:13:38 2010 +0200 @@ -426,6 +426,8 @@ { // InEndpoint is going to be our TX (IN, write) endpoint ifc().iEndpointData[0].iType = KUsbEpTypeBulk; + if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) + ifc().iEndpointData[0].iFeatureWord1 = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering; ifc().iEndpointData[0].iDir = KUsbEpDirIn; ifc().iEndpointData[0].iSize = maxPacketSize; ifc().iEndpointData[0].iInterval_Hs = 0; @@ -442,6 +444,8 @@ { // OutEndpoint is going to be our RX (OUT, read) endpoint ifc().iEndpointData[1].iType = KUsbEpTypeBulk; + if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) + ifc().iEndpointData[1].iFeatureWord1 = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering; ifc().iEndpointData[1].iDir = KUsbEpDirOut; ifc().iEndpointData[1].iSize = maxPacketSize; ifc().iEndpointData[1].iInterval_Hs = 0; @@ -553,32 +557,40 @@ } } } - - __PRINT(_L("CBulkOnlyTransportUsbcScLdd::Start - Setting up DMA and double buffering\n")); - // Set up DMA if possible (errors are non-critical) - TInt err = iLdd.AllocateEndpointResource(iOutEndpoint, EUsbcEndpointResourceDMA); - if (err != KErrNone) + + TUsbDeviceCaps d_caps; + TInt err; + TInt ret = iLdd.DeviceCaps(d_caps); + if (ret == KErrNone) { - __PRINT1(_L("Set DMA on OUT endpoint failed with error code: %d"), err); - } - err = iLdd.AllocateEndpointResource(iInEndpoint, EUsbcEndpointResourceDMA); - if (err != KErrNone) - { - __PRINT1(_L("Set DMA on IN endpoint failed with error code: %d"), err); + if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) != KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) + { + __PRINT(_L("CBulkOnlyTransportUsbcScLdd::Start - Setting up DMA and double buffering\n")); + // Set up DMA if possible (errors are non-critical) + err = iLdd.AllocateEndpointResource(iOutEndpoint, EUsbcEndpointResourceDMA); + if (err != KErrNone) + { + __PRINT1(_L("Set DMA on OUT endpoint failed with error code: %d"), err); + } + err = iLdd.AllocateEndpointResource(iInEndpoint, EUsbcEndpointResourceDMA); + if (err != KErrNone) + { + __PRINT1(_L("Set DMA on IN endpoint failed with error code: %d"), err); + } + + // Set up Double Buffering if possible (errors are non-critical) + err = iLdd.AllocateEndpointResource(iOutEndpoint, EUsbcEndpointResourceDoubleBuffering); + if (err != KErrNone) + { + __PRINT1(_L("Set Double Buffering on OUT endpoint failed with error code: %d"), err); + } + err = iLdd.AllocateEndpointResource(iInEndpoint, EUsbcEndpointResourceDoubleBuffering); + if (err != KErrNone) + { + __PRINT1(_L("Set Double Buffering on IN endpoint failed with error code: %d"), err); + } + } } - - // Set up Double Buffering if possible (errors are non-critical) - err = iLdd.AllocateEndpointResource(iOutEndpoint, EUsbcEndpointResourceDoubleBuffering); - if (err != KErrNone) - { - __PRINT1(_L("Set Double Buffering on OUT endpoint failed with error code: %d"), err); - } - err = iLdd.AllocateEndpointResource(iInEndpoint, EUsbcEndpointResourceDoubleBuffering); - if (err != KErrNone) - { - __PRINT1(_L("Set Double Buffering on IN endpoint failed with error code: %d"), err); - } - err = OpenEndpoints(); }