diff -r 000000000000 -r 96e5fb8b040d kernel/eka/euser/epoc/arm/uc_trp.cia --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/euser/epoc/arm/uc_trp.cia Thu Dec 17 09:24:54 2009 +0200 @@ -0,0 +1,109 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\epoc\arm\uc_trp.cia +// +// + +#include +#include +#include +#include +#include "uc_std.h" + +// With -fvtable-thunks +const TInt KVTableTrapOffset=8; +const TInt KVTableLeaveOffset=16; + +// Without -fvtable-thunks +// const TInt KVTableTrapOffset=12; +// const TInt KVTableLeaveOffset=28; + + +#ifndef __LEAVE_EQUALS_THROW__ + +EXPORT_C __NAKED__ TInt TTrap::Trap(TInt & /*aResult*/) +// +// Save the enter frame state and return 0. +// + { + + asm("mov r2, #0 "); // aResult==KErrNone + asm("str r2, [r1, #0] "); // iResult=(&aResult) + asm("str r1, [r0, #%a0]" : : "i" _FOFF(TTrap,iResult)); + asm("stmia r0, {r4-r11, sp, lr} "); // Save the context + asm("stmfd sp!, {r4,lr} "); + asm("bl " CSM_ZN4Exec13PushTrapFrameEP5TTrap); + asm("cmp r0, #0 "); // == NULL + asm("ldrne r3, [r0, #%a0]" : : "i" (_TTRAPHANDLER_VPTR_OFFSET_)); + asm("beq ttrap_trap_no_trap_handler "); +#ifdef __SUPPORT_THUMB_INTERWORKING + asm("ldr r3, [r3, #%a0]" : : "i" (_TTRAPHANDLER_TRAP_OFFSET_)); + asm("adr lr, __ttrap_trap_return "); // iHandler->Trap() + asm("bx r3 "); +#else + asm("adr lr, __ttrap_trap_return "); // iHandler->Trap() + asm("ldr pc, [r3, #%a0]" : : "i" (_TTRAPHANDLER_TRAP_OFFSET_)); +#endif + asm("__ttrap_trap_return: "); + asm("mov r0, #0 "); + asm("ttrap_trap_no_trap_handler: "); + __POPRET("r4,"); + } + +extern void PanicNoTrapFrame(); + + + +EXPORT_C __NAKED__ void User::Leave(TInt /*aReason*/) +/** +Leaves the currently executing function, unwinds the call stack, and returns +from the most recently entered trap harness. + +@param aReason The value returned from the most recent call to TRAP or TRAPD. + This is known as the reason code and, typically, it gives the + reason for the environment or user error causing this leave + to occur. + +@see TRAP +@see TRAPD +*/ + { + + asm("mov r4, r0 "); // Save aReason + asm("bl " CSM_ZN4Exec12PopTrapFrameEv); // Returns the current TTrap + asm("cmp r0, #0 "); + asm("bleq " CSM_Z16PanicNoTrapFramev); + asm("ldr r1, [r0, #%a0]" : : "i" _FOFF(TTrap,iResult)); + asm("mov r5, r0 "); // Save it for later + asm("ldr r0, [r0, #%a0]" : : "i" _FOFF(TTrap,iHandler)); + asm("str r4, [r1, #0] "); // *(pT->iResult)=aReason + asm("cmp r0, #0 "); + asm("ldrne r2, [r0, #%a0]" : : "i" (_TTRAPHANDLER_VPTR_OFFSET_)); + asm("beq user_leave_no_trap_handler "); // No trap handler + asm("mov r1, r4 "); // Pass aReason +#ifdef __SUPPORT_THUMB_INTERWORKING + asm("ldr r3, [r2, #%a0]" : : "i" (_TTRAPHANDLER_LEAVE_OFFSET_)); + asm("adr lr, user_leave_no_trap_handler "); // iHandler->Leave(aReason) + asm("bx r3 "); +#else + asm("adr lr, user_leave_no_trap_handler "); // iHandler->Leave(aReason) + asm("ldr pc, [r2, #%a0]" : : "i" (_TTRAPHANDLER_LEAVE_OFFSET_)); +#endif + asm("user_leave_no_trap_handler: "); + asm("ldmia r5, {r4-r11, sp, lr} "); // Restore the context + asm("mov r0, #1 "); // return(1) + __JUMP(,lr); // return + } + +#endif // !__LEAVE_EQUALS_THROW__