Usermode/libc,libpsocket - Various fixes to psockets and errno
[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 <stdlib.h>\r
8 #include <acess/sys.h>\r
9 \r
10 #define USE_CPUID       0\r
11 \r
12 // === TYPES ===\r
13 typedef struct {\r
14         intptr_t        Base;\r
15         char    *Name;\r
16 }       tLoadedLib;\r
17 \r
18 // === PROTOTYPES ===\r
19 #if USE_CPUID\r
20 static void     cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX);\r
21 #endif\r
22  int    ErrorHandler(int Fault);\r
23 \r
24 // === IMPORTS ===\r
25 extern tLoadedLib       gLoadedLibraries[64];\r
26 extern void     *_crt0_exit_handler;\r
27 extern void     _stdio_init(void);\r
28 extern void     _call_atexit_handlers(void);\r
29 \r
30 // === GLOBALS ===\r
31 extern char **_envp;\r
32 // --- CPU Features ---\r
33 #if USE_CPUID\r
34 tCPUID  gCPU_Features;\r
35 #endif\r
36 \r
37 // === CODE ===\r
38 /**\r
39  * \fn int SoMain()\r
40  * \brief Stub Entrypoint\r
41  * \param BaseAddress   Unused - Load Address of libc\r
42  * \param argc  Unused - Argument Count (0 for current version of ld-acess)\r
43  * \param argv  Unused - Arguments (NULL for current version of ld-acess)\r
44  * \param envp  Environment Pointer\r
45  */\r
46 int SoMain(UNUSED(uintptr_t, BaseAddress), UNUSED(int, argc), UNUSED(char **, argv), char **envp)\r
47 {\r
48         // Init for env.c\r
49         _envp = envp;\r
50 \r
51         #if 0   \r
52         {\r
53                  int    i = 0;\r
54                 char    **tmp;\r
55                 _SysDebug("envp = %p", envp);\r
56                 for(tmp = envp; *tmp; tmp++,i++)\r
57                 {\r
58                         _SysDebug("envp[%i] = '%s'", i, *tmp);\r
59                 }\r
60         }\r
61         #endif\r
62 \r
63         _stdio_init();  \r
64         \r
65         #if USE_CPUID\r
66         {\r
67                 uint32_t        ecx, edx;\r
68                 cpuid(1, NULL, NULL, &edx, &ecx);\r
69                 gCPU_Features.SSE  = edx & (1 << 25);   // SSE\r
70                 gCPU_Features.SSE2 = edx & (1 << 26);   // SSE2\r
71         }\r
72         #endif\r
73         \r
74         _crt0_exit_handler = _call_atexit_handlers;\r
75 \r
76         // Set Error handler\r
77         _SysSetFaultHandler(ErrorHandler);\r
78         \r
79         return 1;\r
80 }\r
81 \r
82 int ErrorHandler(int Fault)\r
83 {\r
84          int    i;\r
85         fprintf(stderr, "ErrorHandler: (Fault = %i)\n", Fault);\r
86         fprintf(stderr, "Loaded Libraries:\n");\r
87         for( i = 0; i < 64; i ++ )\r
88         {\r
89                 //if(gLoadedLibraries[i].Base == 0)     continue;\r
90         //      fprintf(stderr, "%02i: %p  %s\n", i, gLoadedLibraries[i].Base, gLoadedLibraries[i].Name);\r
91         }\r
92         fprintf(stderr, "\n");\r
93         exit(-1);\r
94         return -1;\r
95 }\r
96 \r
97 #if USE_CPUID\r
98 /**\r
99  * \brief Call the CPUID opcode\r
100  */\r
101 static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX)\r
102 {\r
103         uint32_t        eax, ebx, edx, ecx;\r
104         \r
105         __asm__ __volatile__ (\r
106                 "cpuid"\r
107                 : "=a"(eax), "=c"(ecx), "=d"(edx)\r
108                 : "a"(Num)\r
109                 );\r
110         \r
111         if(EAX) *EAX = eax;\r
112         if(EBX) *EBX = ebx;\r
113         if(EDX) *EDX = edx;\r
114         if(ECX) *ECX = ecx;\r
115 }\r
116 #endif\r

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