kernel/eka/include/win32atx.h
author Mike Kinghan <mikek@symbian.org>
Tue, 16 Nov 2010 14:39:21 +0000
branchGCC_SURGE
changeset 303 9b85206a602c
parent 0 a41df078684a
permissions -rw-r--r--
We need a way to pass flags to rombuilds in Raptor via extension flm interfaces, so that the CPP pass of the rom input files can be informed what toolchain we are building with and conditionally include or exclude files depending on whether the toolchain could build them.

// 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\include\win32atx.h
// 
//

/**
 @file
 @internalComponent
*/

#ifndef __WIN32ATX_H__
#define __WIN32ATX_H__

#if defined(__VC32__)

#define	MAX_ATEXIT_HANDLERS	255

#ifdef __KERNEL_MODE__
#define PANIC()	Kern::Fault("ATEXIT", __LINE__)
#else
_LIT(KLitAtExitPanic,"ATEXIT");
#define PANIC()	User::Panic(KLitAtExitPanic, __LINE__)
#endif

extern "C" {
typedef void (__cdecl* TAtExit)(void);
static TUint sp=0;
static TAtExit handlers[MAX_ATEXIT_HANDLERS];

int atexit(TAtExit aFunc)
	{
	if (sp>=MAX_ATEXIT_HANDLERS)
		PANIC();
	handlers[sp++]=aFunc;
	return 0;
	}

void __call_atexit_handlers()
	{
	while(sp)
		(*handlers[--sp])();
	}

#pragma data_seg(".CRT$XPU")
TAtExit __xp_a[] = { __call_atexit_handlers };

}

#elif defined(__CW32__)

struct SDestructorEntry
	{
	SDestructorEntry* iNext;
	TAny* iDstrFn;
	TAny* iObj;
	};

SDestructorEntry* DEListHead;

extern "C" {

void* __register_global_object(void* obj, void* dfn, void* entry)
	{
	SDestructorEntry* e = (SDestructorEntry*)entry;
	e->iNext = DEListHead;
	e->iDstrFn = dfn;
	e->iObj = obj;
	DEListHead = e;
	return obj;
	}

__declspec(naked) void __destroy_global_chain(void)
	{
	_asm push ebp
	_asm mov ebp, esp
	_asm push ebx
	_asm lea ebx, DEListHead
	dgc1:
	_asm mov ebx, [ebx]
	_asm test ebx, ebx
	_asm jz dgc0
	_asm mov ecx, [ebx+8]
	_asm call dword ptr [ebx+4]
	_asm jmp dgc1
	dgc0:
	_asm lea ebx, DEListHead
	_asm mov [ebx], 0
	_asm pop ebx
	_asm mov esp, ebp
	_asm pop ebp
	_asm ret
	}

#pragma data_seg(".CRT$XPU")
void (*__xp_a[])(void) = { &__destroy_global_chain };
}

#elif defined(__GCC32__)
// todo: figure out what to do here
#else
#error Unknown X86 compiler
#endif

#endif