* 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
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