2494fc2800b148373d4adb2853d4fddd02d5cb8d
[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         #if 0   \r
53         {\r
54                  int    i = 0;\r
55                 char    **tmp;\r
56                 _SysDebug("envp = %p", envp);\r
57                 for(tmp = envp; *tmp; tmp++,i++)\r
58                 {\r
59                         _SysDebug("envp[%i] = '%s'", i, *tmp);\r
60                 }\r
61         }\r
62         #endif\r
63         \r
64         // Init FileIO Pointers\r
65         stdin = &_iob[0];\r
66         stdin->FD = 0;  stdin->Flags = FILE_FLAG_MODE_READ;\r
67         stdout = &_iob[1];\r
68         stdout->FD = 1; stdout->Flags = FILE_FLAG_MODE_WRITE;\r
69         stderr = &_iob[2];\r
70         stderr->FD = 2; stderr->Flags = FILE_FLAG_MODE_WRITE;\r
71         \r
72         #if USE_CPUID\r
73         {\r
74                 uint32_t        ecx, edx;\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
78         }\r
79         #endif\r
80         \r
81         // Set Error handler\r
82         _SysSetFaultHandler(ErrorHandler);\r
83         \r
84         return 1;\r
85 }\r
86 \r
87 int ErrorHandler(int Fault)\r
88 {\r
89          int    i;\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
93         {\r
94                 //if(gLoadedLibraries[i].Base == 0)     continue;\r
95         //      fprintf(stderr, "%02i: %p  %s\n", i, gLoadedLibraries[i].Base, gLoadedLibraries[i].Name);\r
96         }\r
97         fprintf(stderr, "\n");\r
98         exit(-1);\r
99         return -1;\r
100 }\r
101 \r
102 #if USE_CPUID\r
103 /**\r
104  * \brief Call the CPUID opcode\r
105  */\r
106 static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX)\r
107 {\r
108         uint32_t        eax, ebx, edx, ecx;\r
109         \r
110         __asm__ __volatile__ (\r
111                 "cpuid"\r
112                 : "=a"(eax), "=c"(ecx), "=d"(edx)\r
113                 : "a"(Num)\r
114                 );\r
115         \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
120 }\r
121 #endif\r

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