kernel/eka/euser/epoc/arm/uc_trp.cia
author John Imhofe
Mon, 19 Oct 2009 15:55:17 +0100
changeset 0 a41df078684a
child 109 b3a1d9898418
permissions -rw-r--r--
Convert Kernelhwsrv package from SFL to EPL kernel\eka\compsupp is subject to the ARM EABI LICENSE userlibandfileserver\fatfilenameconversionplugins\unicodeTables is subject to the Unicode license kernel\eka\kernel\zlib is subject to the zlib license

// 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 <e32cia.h>
#include <u32std.h>
#include <e32panic.h>
#include <u32exec.h>
#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__