Fixes and Cleanup
[tpg/acess2.git] / Usermode / Libraries / libc.so_src / stub.c
index a10d9d1..0233b97 100644 (file)
@@ -2,13 +2,21 @@
  * AcessOS Basic C Library\r
  */\r
 #include "stdio_int.h"\r
+#include "lib.h"\r
 \r
+// === PROTOTYPES ===\r
+static void    cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX);\r
+\r
+// === GLOBALS ===\r
 extern char **_envp;\r
 extern struct sFILE    _iob[];\r
 extern struct sFILE    *stdin;\r
 extern struct sFILE    *stdout;\r
 extern struct sFILE    *stderr;\r
+// --- CPU Features ---\r
+tCPUID gCPU_Features;\r
 \r
+// === CODE ===\r
 /**\r
  * \fn int SoMain()\r
  * \brief Stub Entrypoint\r
@@ -30,5 +38,34 @@ int SoMain(unsigned int BaseAddress, int argc, char **argv, char **envp)
        stderr = &_iob[2];\r
        stderr->FD = 2; stderr->Flags = FILE_FLAG_MODE_WRITE;\r
        \r
+       /*\r
+       {\r
+               uint32_t        ecx, edx;\r
+               cpuid(1, NULL, NULL, &edx, &ecx);\r
+               gCPU_Features.SSE  = edx & (1 << 25);   // SSE\r
+               gCPU_Features.SSE2 = edx & (1 << 26);   // SSE2\r
+       }\r
+       */\r
+       \r
        return 1;\r
 }\r
+\r
+\r
+/**\r
+ * \brief Call the CPUID opcode\r
+ */\r
+static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX)\r
+{\r
+       uint32_t        eax, ebx, edx, ecx;\r
+       \r
+       __asm__ __volatile__ (\r
+               "cpuid"\r
+               : "=a"(eax), "=c"(ecx), "=d"(edx)\r
+               : "a"(Num)\r
+               );\r
+       \r
+       if(EAX) *EAX = eax;\r
+       if(EBX) *EBX = ebx;\r
+       if(EDX) *EDX = edx;\r
+       if(ECX) *ECX = ecx;\r
+}\r

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