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

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