singrdk/base/Kernel/Native/cinit.cpp

98 lines
2.6 KiB
C++
Raw Permalink Normal View History

2008-11-17 18:29:00 -05:00
////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: cinit.cpp
//
// Note: Kernel & Process
//
#include "hal.h"
//////////////////////////////////////////////////////////////////////////////
// Need to put the following marker variables into the .CRT section.
// The .CRT section contains arrays of function pointers.
// The compiler creates functions and adds pointers to this section
// for things like C++ global constructors.
//
// The XIA, XCA etc are group names with in the section.
// The compiler sorts the contributions by the group name.
// For example, .CRT$XCA followed by .CRT$XCB, ... .CRT$XCZ.
// The marker variables below let us get pointers
// to the beginning/end of the arrays of function pointers.
//
// For example, standard groups are
// XCA used here, for begin marker
// XCC "compiler" inits
// XCL "library" inits
// XCU "user" inits
// XCZ used here, for end marker
//
typedef void (__cdecl *_PVFV)(void);
// typedef int (__cdecl *_PIFV)(void);
typedef _PVFV _PIFV;
#pragma comment(linker, "/merge:.CRT=.DATA")
#pragma data_seg(".CRT$XIA", "DATA")
extern "C" _PIFV __xi_a[] = { NULL }; // C initializers.
#pragma data_seg(".CRT$XIZ", "DATA")
extern "C" _PIFV __xi_z[] = { NULL };
#pragma data_seg(".CRT$XCA", "DATA")
extern "C" _PVFV __xc_a[] = { NULL }; // C++ initializers.
#pragma data_seg(".CRT$XCZ", "DATA")
extern "C" _PVFV __xc_z[] = { NULL };
#pragma data_seg(".CRT$XPA", "DATA")
extern "C" _PVFV __xp_a[] = { NULL }; // C pre-terminators.
#pragma data_seg(".CRT$XPZ", "DATA")
extern "C" _PVFV __xp_z[] = { NULL };
#pragma data_seg(".CRT$XTA", "DATA")
extern "C" _PVFV __xt_a[] = { NULL }; // C terminators.
#pragma data_seg(".CRT$XTZ", "DATA")
extern "C" _PVFV __xt_z[] = { NULL };
#pragma data_seg()
// Walk an array of function pointers, call non-NULL ones.
static void __cdecl _initterm(_PVFV *pfbegin, _PVFV *pfend)
{
for (; pfbegin < pfend; pfbegin++) {
if (*pfbegin != NULL) {
(**pfbegin)();
}
}
}
// Call all of the C++ static constructors.
//
int __cdecl _cinit(void)
{
// do C initializations
_initterm( __xi_a, __xi_z );
// do C++ initializations
_initterm( __xc_a, __xc_z );
return 0;
}
int __cdecl _cfini(void)
{
// do C initializations
_initterm( __xp_a, __xp_z );
// do C++ terminations
_initterm( __xt_a, __xt_z );
return 0;
}