Cleanup and Bugfixes
[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 \r
7 #define USE_CPUID       0\r
8 \r
9 // === PROTOTYPES ===\r
10 #if USE_CPUID\r
11 static void     cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX);\r
12 #endif\r
13 \r
14 // === GLOBALS ===\r
15 extern char **_envp;\r
16 extern struct sFILE     _iob[];\r
17 extern struct sFILE     *stdin;\r
18 extern struct sFILE     *stdout;\r
19 extern struct sFILE     *stderr;\r
20 // --- CPU Features ---\r
21 #if USE_CPUID\r
22 tCPUID  gCPU_Features;\r
23 #endif\r
24 \r
25 // === CODE ===\r
26 /**\r
27  * \fn int SoMain()\r
28  * \brief Stub Entrypoint\r
29  * \param BaseAddress   Unused - Load Address of libc\r
30  * \param argc  Unused - Argument Count (0 for current version of ld-acess)\r
31  * \param argv  Unused - Arguments (NULL for current version of ld-acess)\r
32  * \param envp  Environment Pointer\r
33  */\r
34 int SoMain(unsigned int BaseAddress, int argc, char **argv, char **envp)\r
35 {\r
36         // Init for env.c\r
37         _envp = envp;\r
38         \r
39         // Init FileIO Pointers\r
40         stdin = &_iob[0];\r
41         stdin->FD = 0;  stdin->Flags = FILE_FLAG_MODE_READ;\r
42         stdout = &_iob[1];\r
43         stdout->FD = 1; stdout->Flags = FILE_FLAG_MODE_WRITE;\r
44         stderr = &_iob[2];\r
45         stderr->FD = 2; stderr->Flags = FILE_FLAG_MODE_WRITE;\r
46         \r
47         #if USE_CPUID\r
48         {\r
49                 uint32_t        ecx, edx;\r
50                 cpuid(1, NULL, NULL, &edx, &ecx);\r
51                 gCPU_Features.SSE  = edx & (1 << 25);   // SSE\r
52                 gCPU_Features.SSE2 = edx & (1 << 26);   // SSE2\r
53         }\r
54         #endif\r
55         \r
56         return 1;\r
57 }\r
58 \r
59 \r
60 #if USE_CPUID\r
61 /**\r
62  * \brief Call the CPUID opcode\r
63  */\r
64 static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX)\r
65 {\r
66         uint32_t        eax, ebx, edx, ecx;\r
67         \r
68         __asm__ __volatile__ (\r
69                 "cpuid"\r
70                 : "=a"(eax), "=c"(ecx), "=d"(edx)\r
71                 : "a"(Num)\r
72                 );\r
73         \r
74         if(EAX) *EAX = eax;\r
75         if(EBX) *EBX = ebx;\r
76         if(EDX) *EDX = edx;\r
77         if(ECX) *ECX = ecx;\r
78 }\r
79 #endif\r

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