2 * AcessOS Basic C Library
\r
4 #include "stdio_int.h"
\r
7 #include <acess/sys.h>
\r
17 // === PROTOTYPES ===
\r
19 static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX);
\r
21 int ErrorHandler(int Fault);
\r
24 extern tLoadedLib gLoadedLibraries[64];
\r
25 extern int _SysSetFaultHandler(int (*Handler)(int));
\r
28 extern char **_envp;
\r
29 extern struct sFILE _iob[];
\r
30 extern struct sFILE *stdin;
\r
31 extern struct sFILE *stdout;
\r
32 extern struct sFILE *stderr;
\r
33 // --- CPU Features ---
\r
35 tCPUID gCPU_Features;
\r
41 * \brief Stub Entrypoint
\r
42 * \param BaseAddress Unused - Load Address of libc
\r
43 * \param argc Unused - Argument Count (0 for current version of ld-acess)
\r
44 * \param argv Unused - Arguments (NULL for current version of ld-acess)
\r
45 * \param envp Environment Pointer
\r
47 int SoMain(UNUSED(uintptr_t, BaseAddress), UNUSED(int, argc), UNUSED(char **, argv), char **envp)
\r
56 _SysDebug("envp = %p", envp);
\r
57 for(tmp = envp; *tmp; tmp++,i++)
\r
59 _SysDebug("envp[%i] = '%s'", i, *tmp);
\r
64 // Init FileIO Pointers
\r
66 stdin->FD = 0; stdin->Flags = FILE_FLAG_MODE_READ;
\r
68 stdout->FD = 1; stdout->Flags = FILE_FLAG_MODE_WRITE;
\r
70 stderr->FD = 2; stderr->Flags = FILE_FLAG_MODE_WRITE;
\r
75 cpuid(1, NULL, NULL, &edx, &ecx);
\r
76 gCPU_Features.SSE = edx & (1 << 25); // SSE
\r
77 gCPU_Features.SSE2 = edx & (1 << 26); // SSE2
\r
81 // Set Error handler
\r
82 _SysSetFaultHandler(ErrorHandler);
\r
87 int ErrorHandler(int Fault)
\r
90 fprintf(stderr, "ErrorHandler: (Fault = %i)\n", Fault);
\r
91 fprintf(stderr, "Loaded Libraries:\n");
\r
92 for( i = 0; i < 64; i ++ )
\r
94 //if(gLoadedLibraries[i].Base == 0) continue;
\r
95 // fprintf(stderr, "%02i: %p %s\n", i, gLoadedLibraries[i].Base, gLoadedLibraries[i].Name);
\r
97 fprintf(stderr, "\n");
\r
104 * \brief Call the CPUID opcode
\r
106 static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX)
\r
108 uint32_t eax, ebx, edx, ecx;
\r
110 __asm__ __volatile__ (
\r
112 : "=a"(eax), "=c"(ecx), "=d"(edx)
\r
116 if(EAX) *EAX = eax;
\r
117 if(EBX) *EBX = ebx;
\r
118 if(EDX) *EDX = edx;
\r
119 if(ECX) *ECX = ecx;
\r