Usermode/libc - Makefile update, move stdin/... to .data for R_*_COPY to work
[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 **environ;\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         environ = envp;\r
49 \r
50         _stdio_init();  \r
51         \r
52         #if USE_CPUID\r
53         {\r
54                 uint32_t        ecx, edx;\r
55                 cpuid(1, NULL, NULL, &edx, &ecx);\r
56                 gCPU_Features.SSE  = edx & (1 << 25);   // SSE\r
57                 gCPU_Features.SSE2 = edx & (1 << 26);   // SSE2\r
58         }\r
59         #endif\r
60         \r
61         _crt0_exit_handler = _call_atexit_handlers;\r
62 \r
63         // Set Error handler\r
64         _SysSetFaultHandler(ErrorHandler);\r
65         \r
66         return 0;\r
67 }\r
68 \r
69 int ErrorHandler(int Fault)\r
70 {\r
71          int    i;\r
72 \r
73         extern void ldacess_DumpLoadedLibraries(void);  \r
74         ldacess_DumpLoadedLibraries();\r
75 \r
76         fprintf(stderr, "ErrorHandler: (Fault = %i)\n", Fault);\r
77         fprintf(stderr, "Loaded Libraries:\n");\r
78         for( i = 0; i < 64; i ++ )\r
79         {\r
80                 //if(gLoadedLibraries[i].Base == 0)     continue;\r
81         //      fprintf(stderr, "%02i: %p  %s\n", i, gLoadedLibraries[i].Base, gLoadedLibraries[i].Name);\r
82         }\r
83         fprintf(stderr, "\n");\r
84         exit(-1);\r
85         return -1;\r
86 }\r
87 \r
88 #if USE_CPUID\r
89 /**\r
90  * \brief Call the CPUID opcode\r
91  */\r
92 static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX)\r
93 {\r
94         uint32_t        eax, ebx, edx, ecx;\r
95         \r
96         __asm__ __volatile__ (\r
97                 "cpuid"\r
98                 : "=a"(eax), "=c"(ecx), "=d"(edx)\r
99                 : "a"(Num)\r
100                 );\r
101         \r
102         if(EAX) *EAX = eax;\r
103         if(EBX) *EBX = ebx;\r
104         if(EDX) *EDX = edx;\r
105         if(ECX) *ECX = ecx;\r
106 }\r
107 #endif\r

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