* AcessOS Basic C Library\r
*/\r
#include "stdio_int.h"\r
+#include "lib.h"\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <acess/sys.h>\r
\r
-extern char **_envp;\r
-extern struct sFILE _iob[];\r
+#define USE_CPUID 0\r
\r
+// === TYPES ===\r
+typedef struct {\r
+ intptr_t Base;\r
+ char *Name;\r
+} tLoadedLib;\r
+\r
+// === PROTOTYPES ===\r
+#if USE_CPUID\r
+static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX);\r
+#endif\r
+ int ErrorHandler(int Fault);\r
+\r
+// === IMPORTS ===\r
+extern tLoadedLib gLoadedLibraries[64];\r
+extern void *_crt0_exit_handler;\r
+extern void _stdio_init(void);\r
+extern void _call_atexit_handlers(void);\r
+\r
+// === GLOBALS ===\r
+extern char **environ;\r
+// --- CPU Features ---\r
+#if USE_CPUID\r
+tCPUID gCPU_Features;\r
+#endif\r
+\r
+// === CODE ===\r
/**\r
* \fn int SoMain()\r
* \brief Stub Entrypoint\r
* \param argv Unused - Arguments (NULL for current version of ld-acess)\r
* \param envp Environment Pointer\r
*/\r
-int SoMain(unsigned int BaseAddress, int argc, char **argv, char **envp)\r
+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
{\r
- // Init for env.c\r
- _envp = envp;\r
+ uint32_t eax, ebx, edx, ecx;\r
\r
- // Init FileIO Pointers\r
- _iob[0].FD = 0; _iob[0].Flags = FILE_FLAG_MODE_READ;\r
- _iob[1].FD = 1; _iob[1].Flags = FILE_FLAG_MODE_WRITE;\r
- _iob[2].FD = 2; _iob[2].Flags = FILE_FLAG_MODE_WRITE;\r
+ __asm__ __volatile__ (\r
+ "cpuid"\r
+ : "=a"(eax), "=c"(ecx), "=d"(edx)\r
+ : "a"(Num)\r
+ );\r
\r
- return 1;\r
+ if(EAX) *EAX = eax;\r
+ if(EBX) *EBX = ebx;\r
+ if(EDX) *EDX = edx;\r
+ if(ECX) *ECX = ecx;\r
}\r
+#endif\r