+int SoMain(UNUSED(uintptr_t, BaseAddress), UNUSED(int, argc), UNUSED(char **, argv), char **envp)\r
+{\r
+ environ = envp;\r
+\r
+ _stdio_init(); \r
+ \r
+ #if USE_CPUID\r
+ {\r
+ uint32_t ecx, edx;\r
+ cpuid(1, NULL, NULL, &edx, &ecx);\r
+ gCPU_Features.SSE = edx & (1 << 25); // SSE\r
+ gCPU_Features.SSE2 = edx & (1 << 26); // SSE2\r
+ }\r
+ #endif\r
+ \r
+ _crt0_exit_handler = _call_atexit_handlers;\r
+\r
+ // Set Error handler\r
+ _SysSetFaultHandler(ErrorHandler);\r
+ \r
+ return 0;\r
+}\r
+\r
+int ErrorHandler(int Fault)\r
+{\r
+ int i;\r
+\r
+ extern void ldacess_DumpLoadedLibraries(void); \r
+ ldacess_DumpLoadedLibraries();\r
+\r
+ fprintf(stderr, "ErrorHandler: (Fault = %i)\n", Fault);\r
+ fprintf(stderr, "Loaded Libraries:\n");\r
+ for( i = 0; i < 64; i ++ )\r
+ {\r
+ //if(gLoadedLibraries[i].Base == 0) continue;\r
+ // fprintf(stderr, "%02i: %p %s\n", i, gLoadedLibraries[i].Base, gLoadedLibraries[i].Name);\r
+ }\r
+ fprintf(stderr, "\n");\r
+ exit(-1);\r
+ return -1;\r
+}\r
+\r
+#if USE_CPUID\r
+/**\r
+ * \brief Call the CPUID opcode\r
+ */\r
+static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX)\r