2 * AcessOS Basic C Library
\r
4 #include "stdio_int.h"
\r
11 // === PROTOTYPES ===
\r
13 static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX);
\r
15 void ErrorHandler(int Fault);
\r
18 extern char **_envp;
\r
19 extern struct sFILE _iob[];
\r
20 extern struct sFILE *stdin;
\r
21 extern struct sFILE *stdout;
\r
22 extern struct sFILE *stderr;
\r
23 // --- CPU Features ---
\r
25 tCPUID gCPU_Features;
\r
31 * \brief Stub Entrypoint
\r
32 * \param BaseAddress Unused - Load Address of libc
\r
33 * \param argc Unused - Argument Count (0 for current version of ld-acess)
\r
34 * \param argv Unused - Arguments (NULL for current version of ld-acess)
\r
35 * \param envp Environment Pointer
\r
37 int SoMain(unsigned int BaseAddress, int argc, char **argv, char **envp)
\r
42 // Init FileIO Pointers
\r
44 stdin->FD = 0; stdin->Flags = FILE_FLAG_MODE_READ;
\r
46 stdout->FD = 1; stdout->Flags = FILE_FLAG_MODE_WRITE;
\r
48 stderr->FD = 2; stderr->Flags = FILE_FLAG_MODE_WRITE;
\r
53 cpuid(1, NULL, NULL, &edx, &ecx);
\r
54 gCPU_Features.SSE = edx & (1 << 25); // SSE
\r
55 gCPU_Features.SSE2 = edx & (1 << 26); // SSE2
\r
59 _SysSetFaultHandler(ErrorHandler);
\r
64 void ErrorHandler(int Fault)
\r
66 fprintf(stderr, "Fault = %i\n", Fault);
\r
71 * \brief Call the CPUID opcode
\r
73 static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX)
\r
75 uint32_t eax, ebx, edx, ecx;
\r
77 __asm__ __volatile__ (
\r
79 : "=a"(eax), "=c"(ecx), "=d"(edx)
\r