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

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