singrdk/base/Kernel/Native/ProcessEntry.cpp

113 lines
3.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: ProcessEntry.cpp
//
// Note: Process Only
//
#include "hal.h"
int __cdecl _cinit(void);
//////////////////////////////////////////////////////////////////////////////
// debugging code. Put it here for now.
void fail_assert(Class_System_String *message)
{
Struct_Microsoft_Singularity_V1_Services_DebugService::g_Print((bartok_char*)&message->m_firstChar,
message->m_stringLength);
//Struct_Microsoft_Singularity_V1_Services_DebugService::g_Break();
Class_Microsoft_Singularity_DebugStub::g_Break();
}
//////////////////////////////////////////////////////////////////////////////
//
BOOL KdDebuggerNotPresent;
extern Class_System_RuntimeType * brtmainClass;
extern int (*brtmain)(ClassVector_Class_System_String *args);
extern int brtmainReturnsInt;
#if ISA_IX86
// Note: CallMain's return value is only meaningful if brtmainReturnsInt is true.
// Example:
// int ret = CallMain(args);
// if (!MainReturnsInt()) ret = 0;
__declspec(naked) int Class_Microsoft_Singularity_AppRuntime::
g_CallMain(ClassVector_Class_System_String *args)
{
// To avoid creating an unmanaged stack frame, jmp directly to the main function:
__asm {
mov eax, brtmain;
jmp eax;
}
}
#endif
bool Class_Microsoft_Singularity_AppRuntime::g_MainReturnsInt()
{
return (brtmainReturnsInt != 0);
}
void Class_Microsoft_Singularity_AppRuntime::g_SetDebuggerPresence(bool debuggerPresent)
{
KdDebuggerNotPresent = !debuggerPresent;
}
//////////////////////////////////////////////////////////////////////////////
//
// These are the first instruction executed in a process.
//
extern "C" int32 __fastcall RuntimeEntryPoint(int threadIndex)
{
int32 ret = 0;
if (threadIndex == -1) {
// WARNING: When initializing an SIP, before making any other calls
// into the HAL we need to make sure the HAL is initialized using
// the following API.
Class_Microsoft_Singularity_Isal_Isa::c_currentThreadOffset
= Struct_Microsoft_Singularity_V1_Services_PlatformService::g_GetThreadContextOffset();
Class_Microsoft_Singularity_Isal_Isa::c_currentCpuOffset
= Struct_Microsoft_Singularity_V1_Services_PlatformService::g_GetProcessorContextOffset();
}
Struct_Microsoft_Singularity_ThreadContext * context =
Class_Microsoft_Singularity_Processor::g_GetCurrentThreadContext();
if (!Struct_Microsoft_Singularity_ThreadContext::m_IsInKernelMode(
context)) {
// fail assertion in uninitialized process mode:
__debugbreak();
}
Struct_Microsoft_Singularity_ThreadContext::m_SetProcessMode(context);
if (threadIndex == -1) {
_cinit();
Class_Microsoft_Singularity_Tracing::g_Initialize();
// Class_Microsoft_Singularity_Tracing::g_Log(0, "RuntimeEntryPoint:Main");
#ifndef NO_MONITORING
Class_Microsoft_Singularity_Monitoring::g_Initialize();
#endif
ret = Class_Microsoft_Singularity_AppRuntime::g_AppStart(brtmainClass);
}
else {
// Class_Microsoft_Singularity_Tracing::g_Log(0, "RuntimeEntryPoint:Thread");
Class_System_Threading_Thread::g_ThreadStub(threadIndex);
}
Struct_Microsoft_Singularity_ThreadContext::m_SetKernelMode(context);
return ret;
}