AcesNative+Usermode - libacessnative "works" (for some definitions)
[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 int      _SysSetFaultHandler(int (*Handler)(int));\r
27 \r
28 // === GLOBALS ===\r
29 extern char **_envp;\r
30 extern struct sFILE     _iob[];\r
31 extern struct sFILE     *stdin;\r
32 extern struct sFILE     *stdout;\r
33 extern struct sFILE     *stderr;\r
34 // --- CPU Features ---\r
35 #if USE_CPUID\r
36 tCPUID  gCPU_Features;\r
37 #endif\r
38 \r
39 // === CODE ===\r
40 /**\r
41  * \fn int SoMain()\r
42  * \brief Stub Entrypoint\r
43  * \param BaseAddress   Unused - Load Address of libc\r
44  * \param argc  Unused - Argument Count (0 for current version of ld-acess)\r
45  * \param argv  Unused - Arguments (NULL for current version of ld-acess)\r
46  * \param envp  Environment Pointer\r
47  */\r
48 int SoMain(UNUSED(uintptr_t, BaseAddress), UNUSED(int, argc), UNUSED(char **, argv), char **envp)\r
49 {\r
50         // Init for env.c\r
51         _envp = envp;\r
52 \r
53         #if 0   \r
54         {\r
55                  int    i = 0;\r
56                 char    **tmp;\r
57                 _SysDebug("envp = %p", envp);\r
58                 for(tmp = envp; *tmp; tmp++,i++)\r
59                 {\r
60                         _SysDebug("envp[%i] = '%s'", i, *tmp);\r
61                 }\r
62         }\r
63         #endif\r
64         \r
65         // Init FileIO Pointers\r
66         stdin = &_iob[0];\r
67         stdin->FD = 0;  stdin->Flags = FILE_FLAG_MODE_READ;\r
68         stdout = &_iob[1];\r
69         stdout->FD = 1; stdout->Flags = FILE_FLAG_MODE_WRITE;\r
70         stderr = &_iob[2];\r
71         stderr->FD = 2; stderr->Flags = FILE_FLAG_MODE_WRITE;\r
72         \r
73         #if USE_CPUID\r
74         {\r
75                 uint32_t        ecx, edx;\r
76                 cpuid(1, NULL, NULL, &edx, &ecx);\r
77                 gCPU_Features.SSE  = edx & (1 << 25);   // SSE\r
78                 gCPU_Features.SSE2 = edx & (1 << 26);   // SSE2\r
79         }\r
80         #endif\r
81         \r
82         // Set Error handler\r
83         _SysSetFaultHandler(ErrorHandler);\r
84         \r
85         return 1;\r
86 }\r
87 \r
88 int ErrorHandler(int Fault)\r
89 {\r
90          int    i;\r
91         fprintf(stderr, "ErrorHandler: (Fault = %i)\n", Fault);\r
92         fprintf(stderr, "Loaded Libraries:\n");\r
93         for( i = 0; i < 64; i ++ )\r
94         {\r
95                 //if(gLoadedLibraries[i].Base == 0)     continue;\r
96         //      fprintf(stderr, "%02i: %p  %s\n", i, gLoadedLibraries[i].Base, gLoadedLibraries[i].Name);\r
97         }\r
98         fprintf(stderr, "\n");\r
99         exit(-1);\r
100         return -1;\r
101 }\r
102 \r
103 EXPORT int *libc_geterrno()\r
104 {\r
105         return &_errno;\r
106 }\r
107 \r
108 #if USE_CPUID\r
109 /**\r
110  * \brief Call the CPUID opcode\r
111  */\r
112 static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX)\r
113 {\r
114         uint32_t        eax, ebx, edx, ecx;\r
115         \r
116         __asm__ __volatile__ (\r
117                 "cpuid"\r
118                 : "=a"(eax), "=c"(ecx), "=d"(edx)\r
119                 : "a"(Num)\r
120                 );\r
121         \r
122         if(EAX) *EAX = eax;\r
123         if(EBX) *EBX = ebx;\r
124         if(EDX) *EDX = edx;\r
125         if(ECX) *ECX = ecx;\r
126 }\r
127 #endif\r

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