sl@0: // Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // e32\euser\epoc\win32\uc_utl.cpp sl@0: // sl@0: // sl@0: sl@0: #include "u32std.h" sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include "uc_std.h" sl@0: sl@0: typedef void (*TBootEpoc)(TBool); sl@0: sl@0: #ifdef __LEAVE_EQUALS_THROW__ sl@0: sl@0: // Stub versions of TTrap exports to keep X86 and WINS versions of euser.def sl@0: // the same. sl@0: sl@0: class TTrap sl@0: { sl@0: public: sl@0: IMPORT_C TInt Trap(TInt& aResult); sl@0: IMPORT_C static void UnTrap(); sl@0: }; sl@0: sl@0: sl@0: #ifdef __SYMC__ sl@0: sl@0: EXPORT_C TInt TTrap::Trap(TInt&) sl@0: { sl@0: /* sl@0: TTrapHandler* h = Exec::PushTrapFrame(this); sl@0: if (h != NULL) sl@0: h->Trap(); sl@0: */ sl@0: return 0; sl@0: } sl@0: sl@0: EXPORT_C void TTrap::UnTrap() sl@0: { sl@0: } sl@0: sl@0: #else sl@0: EXPORT_C TInt TTrap::Trap(TInt&) sl@0: { sl@0: return 0; sl@0: } sl@0: sl@0: EXPORT_C void TTrap::UnTrap() sl@0: { sl@0: } sl@0: #endif sl@0: sl@0: #endif sl@0: sl@0: EXPORT_C void EmptyFunction() sl@0: //Function with an empty body sl@0: { sl@0: } sl@0: sl@0: GLDEF_C void Panic(TCdtArchitecturePanic aPanic) sl@0: // sl@0: // Panic the process with USER as the category. sl@0: // sl@0: { sl@0: _LIT(KCategory,"USER-Arch"); sl@0: User::Panic(KCategory,aPanic); sl@0: } sl@0: sl@0: sl@0: sl@0: sl@0: EXPORT_C TInt User::IsRomAddress(TBool& aBool, TAny* aPtr) sl@0: // sl@0: // The FileServer loads ROM files as ReadOnly Memory Mapped Files sl@0: // We check the access rights of the given address for : sl@0: // Read access sl@0: // No write access sl@0: // sl@0: /** sl@0: Tests whether the specified address is in the ROM. sl@0: sl@0: @param aBool True, if the address at aPtr is within the ROM; false, sl@0: otherwise. sl@0: @param aPtr The address to be tested. sl@0: sl@0: @return Always KErrNone. sl@0: */ sl@0: { sl@0: const TInt KRomMask = 0xFF; sl@0: const TInt KRomAccess = PAGE_READONLY; sl@0: sl@0: aBool=EFalse; sl@0: MEMORY_BASIC_INFORMATION mi; sl@0: sl@0: __LOCK_HOST; sl@0: if (VirtualQuery(aPtr, &mi, sizeof(mi)) != 0 && (mi.Protect & KRomMask) == KRomAccess) sl@0: aBool=ETrue; sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: sl@0: sl@0: EXPORT_C void BootEpoc(TBool aAutoRun) sl@0: { sl@0: HINSTANCE epoc = LoadLibraryA("ekern.exe"); sl@0: if (epoc) sl@0: { sl@0: TBootEpoc ep = (TBootEpoc)GetProcAddress(epoc, "_E32Startup"); sl@0: if (ep) sl@0: ep(aAutoRun); sl@0: } sl@0: ExitProcess(102); sl@0: } sl@0: sl@0: EXPORT_C void RFastLock::Wait() sl@0: { sl@0: if (InterlockedDecrement((LPLONG)&iCount) < -1) sl@0: RSemaphore::Wait(); sl@0: } sl@0: sl@0: EXPORT_C void RFastLock::Signal() sl@0: { sl@0: if (InterlockedIncrement((LPLONG)&iCount) < 0) sl@0: RSemaphore::Signal(); sl@0: } sl@0: sl@0: // Hash an 8 bit string at aPtr, length aLen bytes. sl@0: __NAKED__ TUint32 DefaultStringHash(const TUint8* /*aPtr*/, TInt /*aLen*/) sl@0: { sl@0: _asm push esi sl@0: _asm mov esi, [esp+8] sl@0: _asm mov ecx, [esp+12] sl@0: _asm xor eax, eax sl@0: _asm sub ecx, 4 sl@0: _asm jb lt4 sl@0: ge4: sl@0: _asm xor eax, [esi] sl@0: _asm add esi, 4 sl@0: _asm mov edx, 9E3779B9h sl@0: _asm mul edx sl@0: _asm sub ecx, 4 sl@0: _asm jae ge4 sl@0: lt4: sl@0: _asm add ecx, 4 sl@0: _asm jz done sl@0: _asm xor edx, edx sl@0: _asm cmp ecx, 2 sl@0: _asm jbe le2 sl@0: _asm mov dl, [esi+2] sl@0: _asm shl edx, 16 sl@0: le2: sl@0: _asm cmp ecx, 2 sl@0: _asm jb onemore sl@0: _asm mov dh, [esi+1] sl@0: onemore: sl@0: _asm mov dl, [esi] sl@0: _asm xor eax, edx sl@0: _asm mov edx, 9E3779B9h sl@0: _asm mul edx sl@0: done: sl@0: _asm pop esi sl@0: _asm ret sl@0: } sl@0: sl@0: // Hash a 16 bit string at aPtr, length aLen bytes. sl@0: __NAKED__ TUint32 DefaultWStringHash(const TUint16* /*aPtr*/, TInt /*aLen*/) sl@0: { sl@0: _asm push esi sl@0: _asm mov esi, [esp+8] sl@0: _asm mov ecx, [esp+12] sl@0: _asm xor eax, eax sl@0: _asm sub ecx, 8 sl@0: _asm jb lt8 sl@0: ge8: sl@0: _asm mov edx, [esi+4] sl@0: _asm xor eax, [esi] sl@0: _asm add esi, 8 sl@0: _asm rol edx, 8 sl@0: _asm xor eax, edx sl@0: _asm mov edx, 9E3779B9h sl@0: _asm mul edx sl@0: _asm sub ecx, 8 sl@0: _asm jae ge8 sl@0: lt8: sl@0: _asm add ecx, 8 sl@0: _asm jz done sl@0: _asm xor edx, edx sl@0: _asm cmp ecx, 4 sl@0: _asm jbe le4 sl@0: _asm mov dx, [esi+4] sl@0: _asm rol edx, 8 sl@0: _asm xor eax, edx sl@0: _asm xor edx, edx sl@0: le4: sl@0: _asm cmp ecx, 4 sl@0: _asm jb onemore sl@0: _asm mov dx, [esi+2] sl@0: _asm shl edx, 16 sl@0: onemore: sl@0: _asm mov dx, [esi] sl@0: _asm xor eax, edx sl@0: _asm mov edx, 9E3779B9h sl@0: _asm mul edx sl@0: done: sl@0: _asm pop esi sl@0: _asm ret sl@0: } sl@0: sl@0: /** sl@0: @publishedAll sl@0: @released sl@0: sl@0: Calculate a 32 bit hash from a 32 bit integer. sl@0: sl@0: @param aInt The integer to be hashed. sl@0: @return The calculated 32 bit hash value. sl@0: */ sl@0: EXPORT_C __NAKED__ TUint32 DefaultHash::Integer(const TInt& /*aInt*/) sl@0: { sl@0: _asm mov edx, [esp+4] sl@0: _asm mov eax, 9E3779B9h sl@0: _asm mul dword ptr [edx] sl@0: _asm ret sl@0: } sl@0: