XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESystem

【Rust】XFE系统,基于Rust和汇编

公开
关注 0 Fork 0 Star 0
UTF-8
#include "NativePal.h"

// Initialisation sequence derived from .NET's MIT-licensed v10.0.12
// src/coreclr/nativeaot/Bootstrap/main.cpp. The complete Microsoft GC/EH runtime
// remains external; this bridge does not claim those components are self-written.
extern "C" bool RhInitialize(bool isDll);
extern "C" bool RhRegisterOSModule(void*,void*,uint32_t,void*,uint32_t,void**,uint32_t);
extern "C" void InitializeModules(void*,void**,int,void**,int);
extern "C" int __managed__Main(int,char**);
extern "C" void* __start___modules[];
extern "C" void* __stop___modules[];
extern "C" char __start___managedcode, __stop___managedcode;
extern "C" char __start___unbox, __stop___unbox;
extern "C" char __xfe_kernel_start;
extern "C" void (*__init_array_start[])();
extern "C" void (*__init_array_end[])();
extern "C" void GetRuntimeException(),RuntimeFailFast(),AppendExceptionStackFrame(),GetSystemArrayEEType(),OnFirstChanceException(),OnUnhandledException();
extern "C" size_t ThreadEntryPoint(void*);
extern "C" void* XfeRuntimeTlsCurrent();
extern "C" int XfeRuntimeTlsInitialize();
template<size_t N> static void stage(const char (&text)[N]) { XfeRuntimeGetPal()->write(text,N-1); }

extern "C" int XfeRuntimeStart()
{
    static bool started;
    if (started) return -7;
    if (!XfeRuntimePalInstalled()) return -2;
    stage("XFE_DOTNET_START\n");
    if (!XfeRuntimeTlsCurrent() && !XfeRuntimeTlsInitialize()) return -6;
    stage("XFE_DOTNET_TLS_OK\n");
    started=true;
    for(auto constructor=__init_array_start;constructor<__init_array_end;constructor++)
        if(*constructor)(*constructor)();
    stage("XFE_DOTNET_CONSTRUCTORS_OK\n");
    if (!RhInitialize(false)) return -3;
    stage("XFE_DOTNET_RH_INITIALIZE_OK\n");
    void* functions[] = { (void*)&GetRuntimeException,(void*)&RuntimeFailFast,(void*)&ThreadEntryPoint,
        (void*)&AppendExceptionStackFrame,nullptr,(void*)&GetSystemArrayEEType,
        (void*)&OnFirstChanceException,(void*)&OnUnhandledException,nullptr,nullptr,nullptr,nullptr };
    void* module=&__xfe_kernel_start;
    size_t code=(uintptr_t)&__stop___managedcode-(uintptr_t)&__start___managedcode;
    size_t unbox=(uintptr_t)&__stop___unbox-(uintptr_t)&__start___unbox;
    size_t count=__stop___modules-__start___modules;
    if(code>UINT32_MAX || unbox>UINT32_MAX || count>INT32_MAX)return -4;
    if(!RhRegisterOSModule(module,&__start___managedcode,(uint32_t)code,&__start___unbox,(uint32_t)unbox,functions,12))return -5;
    InitializeModules(module,__start___modules,(int)count,functions,12);
    stage("XFE_DOTNET_MODULES_OK\n");
    char name[]="XFESystem.Kernel";char* argv[]={name,nullptr};
    return __managed__Main(1,argv);
}