// Copyright (c) 1996-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:
// e32test\system\t_exc.cpp
// 
//


#include <e32test.h>
#include <e32svr.h>
#include <u32std.h>
#include <exec_enum.h>

#if defined(__CPU_ARM)
__NAKED__ void UndefinedInstruction()
	{
	asm("mcr p15, 0, r0, c3, c0 ");
	}

__NAKED__ TInt ContextThread0(TAny *)
	{
	asm("cmp r0, #0x80000000 ");
	asm("beq 1f ");
	asm("mov r0, #0xa0000000 ");
	asm("msr cpsr_flg, r0 ");
	asm("mov r0, #0x00");
	asm("mov r1, #0x11");
	asm("mov r2, #0x22");
	asm("mov r3, #0x33");
	asm("mov r4, #0x44");
	asm("mov r5, #0x55");
	asm("mov r6, #0x66");
	asm("mov r7, #0x77");
	asm("mov r8, #0x88");
	asm("mov r9, #0x99");
	asm("mov r10, #0xaa");
	asm("mov r11, #0xbb");
	asm("mov r12, #0xcc");
	asm("mov r13, #0xdd");
	asm("mov r14, #0xee");

	asm("context_thread0_loop: ");
	asm("b context_thread0_loop ");
	asm("1: ");
	asm("adr r0, context_thread0_loop ");
	__JUMP(,lr);
	}

__NAKED__ TInt ContextThread1(TAny *)
	{
	asm("cmp r0, #0x80000000 ");
	asm("beq 1f ");
	asm("mov r0, #0xa0000000 ");
	asm("msr cpsr_flg, r0 ");
	asm("mov r0, #0x00");
	asm("mov r1, #0x11");
	asm("mov r2, #0x22");
	asm("mov r3, #0x33");
	asm("mov r4, #0x44");
	asm("mov r5, #0x55");
	asm("mov r6, #0x66");
	asm("mov r7, #0x77");
	asm("mov r8, #0x88");
	asm("mov r9, #0x99");
	asm("mov r10, #0xaa");
	asm("mov r11, #0xbb");
	asm("mov r12, #0xcc");
	asm("mov r13, #0xdd");
	asm("mov r14, #0xee");

	asm("swi 0x800000"); //	WaitForAnyRequest");

	asm("context_thread1_pc: ");
	asm("b context_thread1_pc ");
	asm("1: ");
	asm("adr r0, context_thread1_pc ");
	__JUMP(,lr);
	}

__NAKED__ TInt ContextThread2(TAny *)
	{
	asm("cmp r0, #0x80000000 ");
	asm("beq 1f ");
	asm("ldr r0, __current_thread_handle ");
	asm("mov r1, #0xa0000000 ");
	asm("msr cpsr_flg, r1 ");
	asm("mov r1, #0x11");
	asm("mov r2, #0x22");
	asm("mov r3, #0x33");
	asm("mov r4, #0x44");
	asm("mov r5, #0x55");
	asm("mov r6, #0x66");
	asm("mov r7, #0x77");
	asm("mov r8, #0x88");
	asm("mov r9, #0x99");
	asm("mov r10, #0xaa");
	asm("mov r11, #0xbb");
	asm("mov r12, #0xcc");
	asm("mov r13, #0xdd");
	asm("mov r14, #0xee");

	asm("swi %a0" : : "i" (EExecThreadSuspend)); //	RThread::Suspend");

	asm("context_thread2_pc: ");
	asm("b context_thread2_pc ");
	asm("1: ");
	asm("adr r0, context_thread2_pc ");
	__JUMP(,lr);

	asm("__current_thread_handle: ");
	asm(".word 0xffff8001 ");
	}
#endif

#if defined(__CPU_X86)
__NAKED__ TInt ContextThread0(TAny *)
	{
	asm("mov eax, [esp+4] ");
	asm("cmp eax, 0x80000000 ");
	asm("jz short c0_get_eip_addr ");
	asm("mov eax, 0xaaaaaaaa ");
	asm("mov ebx, 0xbbbbbbbb ");
	asm("mov ecx, 0xcccccccc ");
	asm("mov edx, 0xdddddddd ");
	asm("mov ebp, 0xeb0eb0eb ");
	asm("mov esi, 0xe51e51e5 ");
	asm("mov edi, 0xed1ed1ed ");
	asm("pushfd ");
	asm("or dword ptr [esp], 0xcd5 ");	// set OF DF SF ZF AF PF CF
	asm("popfd ");
	asm("mov esp, 0xe50e50e5 ");
	asm("c0_loop: ");
	asm("jmp short c0_loop ");
	asm("c0_get_eip_addr: ");
	asm("lea eax, c0_loop ");
	asm("ret ");
	}

__NAKED__ TInt ContextThread1(TAny *)
	{
	asm("mov eax, [esp+4] ");
	asm("cmp eax, 0x80000000 ");
	asm("jz short c1_get_eip_addr ");
	asm("mov eax, 0xaaaaaaaa ");
	asm("mov ebx, 0xbbbbbbbb ");
	asm("mov ecx, 0xcccccccc ");
	asm("mov edx, 0xdddddddd ");
	asm("mov ebp, 0xeb0eb0eb ");
	asm("mov esi, 0xe51e51e5 ");
	asm("mov edi, 0xed1ed1ed ");
	asm("pushfd ");
	asm("or dword ptr [esp], 0xcd5 ");	// set OF DF SF ZF AF PF CF
	asm("popfd ");
	asm("mov esp, 0xe50e50e5 ");
	asm("mov eax, %0" : : "i" (EFastExecWaitForAnyRequest));
	asm("int 0x20 ");
	asm("c1_eip: ");
	asm("c1_get_eip_addr: ");
	asm("lea eax, c1_eip ");
	asm("ret ");
	}

__NAKED__ TInt ContextThread2(TAny *)
	{
	asm("mov eax, [esp+4] ");
	asm("cmp eax, 0x80000000 ");
	asm("jz short c2_get_eip_addr ");
	asm("mov eax, 0xaaaaaaaa ");
	asm("mov ebx, 0xbbbbbbbb ");
	asm("mov ecx, 0xcccccccc ");
	asm("mov edx, 0xdddddddd ");
	asm("mov ebp, 0xeb0eb0eb ");
	asm("mov esi, 0xe51e51e5 ");
	asm("mov edi, 0xed1ed1ed ");
	asm("pushfd ");
	asm("or dword ptr [esp], 0xcd5 ");	// set OF DF SF ZF AF PF CF
	asm("popfd ");
	asm("mov esp, 0xe50e50e5 ");
	asm("mov eax, %0" : : "i" (EExecThreadSuspend));
	asm("mov ecx, 0xffff8001 ");
	asm("int 0x21 ");
	asm("c2_eip: ");
	asm("c2_get_eip_addr: ");
	asm("lea eax, c2_eip ");
	asm("ret ");
	}

#endif

