Usermode build system overhaul
[tpg/acess2.git] / Usermode / Libraries / libc.so_src / stub.c
1 /*\r
2  * AcessOS Basic C Library\r
3  */\r
4 #include "stdio_int.h"\r
5 #include "lib.h"\r
6 #include <stdio.h>\r
7 #include <sys/sys.h>\r
8 \r
9 #define USE_CPUID       0\r
10 \r
11 // === TYPES ===\r
12 typedef struct {\r
13         intptr_t        Base;\r
14         char    *Name;\r
15 }       tLoadedLib;\r
16 \r
17 // === PROTOTYPES ===\r
18 #if USE_CPUID\r
19 static void     cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX);\r
20 #endif\r
21  int    ErrorHandler(int Fault);\r
22 \r
23 // === IMPORTS ===\r
24 extern tLoadedLib       gLoadedLibraries[64];\r
25 extern int      _SysSetFaultHandler(int (*Handler)(int));\r
26 \r
27 // === GLOBALS ===\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
34 #if USE_CPUID\r
35 tCPUID  gCPU_Features;\r
36 #endif\r
37 \r
38 // === CODE ===\r
39 /**\r
40  * \fn int SoMain()\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
46  */\r
47 int SoMain(unsigned int BaseAddress, int argc, char **argv, char **envp)\r
48 {\r
49         // Init for env.c\r
50         _envp = envp;\r
51         \r
52         // Init FileIO Pointers\r
53         stdin = &_iob[0];\r
54         stdin->FD = 0;  stdin->Flags = FILE_FLAG_MODE_READ;\r
55         stdout = &_iob[1];\r
56         stdout->FD = 1; stdout->Flags = FILE_FLAG_MODE_WRITE;\r
57         stderr = &_iob[2];\r
58         stderr->FD = 2; stderr->Flags = FILE_FLAG_MODE_WRITE;\r
59         \r
60         #if USE_CPUID\r
61         {\r
62                 uint32_t        ecx, edx;\r
63                 cpuid(1, NULL, NULL, &edx, &ecx);\r
64                 gCPU_Features.SSE  = edx & (1 << 25);   // SSE\r
65                 gCPU_Features.SSE2 = edx & (1 << 26);   // SSE2\r
66         }\r
67         #endif\r
68         \r
69         // Set Error handler\r
70         _SysSetFaultHandler(ErrorHandler);\r
71         \r
72         return 1;\r
73 }\r
74 \r
75 int ErrorHandler(int Fault)\r
76 {\r
77          int    i;\r
78         fprintf(stderr, "ErrorHandler: (Fault = %i)\n", Fault);\r
79         fprintf(stderr, "Loaded Libraries:\n");\r
80         for( i = 0; i < 64; i ++ )\r
81         {\r
82                 //if(gLoadedLibraries[i].Base == 0)     continue;\r
83         //      fprintf(stderr, "%02i: %p  %s\n", i, gLoadedLibraries[i].Base, gLoadedLibraries[i].Name);\r
84         }\r
85         fprintf(stderr, "\n");\r
86         return -1;\r
87 }\r
88 \r
89 #if USE_CPUID\r
90 /**\r
91  * \brief Call the CPUID opcode\r
92  */\r
93 static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX)\r
94 {\r
95         uint32_t        eax, ebx, edx, ecx;\r
96         \r
97         __asm__ __volatile__ (\r
98                 "cpuid"\r
99                 : "=a"(eax), "=c"(ecx), "=d"(edx)\r
100                 : "a"(Num)\r
101                 );\r
102         \r
103         if(EAX) *EAX = eax;\r
104         if(EBX) *EBX = ebx;\r
105         if(EDX) *EDX = edx;\r
106         if(ECX) *ECX = ecx;\r
107 }\r
108 #endif\r

UCC git Repository :: git.ucc.asn.au