Halfway through deciding where to put the error handlers, I've settled on libc
[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 \r
26 // === GLOBALS ===\r
27 extern char **_envp;\r
28 extern struct sFILE     _iob[];\r
29 extern struct sFILE     *stdin;\r
30 extern struct sFILE     *stdout;\r
31 extern struct sFILE     *stderr;\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(unsigned int BaseAddress, int argc, char **argv, char **envp)\r
47 {\r
48         // Init for env.c\r
49         _envp = envp;\r
50         \r
51         // Init FileIO Pointers\r
52         stdin = &_iob[0];\r
53         stdin->FD = 0;  stdin->Flags = FILE_FLAG_MODE_READ;\r
54         stdout = &_iob[1];\r
55         stdout->FD = 1; stdout->Flags = FILE_FLAG_MODE_WRITE;\r
56         stderr = &_iob[2];\r
57         stderr->FD = 2; stderr->Flags = FILE_FLAG_MODE_WRITE;\r
58         \r
59         #if USE_CPUID\r
60         {\r
61                 uint32_t        ecx, edx;\r
62                 cpuid(1, NULL, NULL, &edx, &ecx);\r
63                 gCPU_Features.SSE  = edx & (1 << 25);   // SSE\r
64                 gCPU_Features.SSE2 = edx & (1 << 26);   // SSE2\r
65         }\r
66         #endif\r
67         \r
68         // Set Error handler\r
69         _SysSetFaultHandler(ErrorHandler);\r
70         \r
71         return 1;\r
72 }\r
73 \r
74 int ErrorHandler(int Fault)\r
75 {\r
76          int    i;\r
77         fprintf(stderr, "ErrorHandler: (Fault = %i)\n", Fault);\r
78         fprintf(stderr, "Loaded Libraries:\n");\r
79         for( i = 0; i < 64; i ++ )\r
80         {\r
81                 //if(gLoadedLibraries[i].Base == 0)     continue;\r
82         //      fprintf(stderr, "%02i: %p  %s\n", i, gLoadedLibraries[i].Base, gLoadedLibraries[i].Name);\r
83         }\r
84         fprintf(stderr, "\n");\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