X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibc.so_src%2Fstub.c;h=9f629ba409502479ab23ecdd2d1421ba3fe9d63f;hb=47e9dfd89189fc6b150bd6b20229cb047c7e0858;hp=a10d9d1114472a8c2742d98e20cb12fb37b50336;hpb=eb80b37c619769496f3fca58d54c4a4b8d8fac4a;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libc.so_src/stub.c b/Usermode/Libraries/libc.so_src/stub.c index a10d9d11..9f629ba4 100644 --- a/Usermode/Libraries/libc.so_src/stub.c +++ b/Usermode/Libraries/libc.so_src/stub.c @@ -2,13 +2,27 @@ * AcessOS Basic C Library */ #include "stdio_int.h" +#include "lib.h" +#define USE_CPUID 0 + +// === PROTOTYPES === +#if USE_CPUID +static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX); +#endif + +// === GLOBALS === extern char **_envp; extern struct sFILE _iob[]; extern struct sFILE *stdin; extern struct sFILE *stdout; extern struct sFILE *stderr; +// --- CPU Features --- +#if USE_CPUID +tCPUID gCPU_Features; +#endif +// === CODE === /** * \fn int SoMain() * \brief Stub Entrypoint @@ -30,5 +44,36 @@ int SoMain(unsigned int BaseAddress, int argc, char **argv, char **envp) stderr = &_iob[2]; stderr->FD = 2; stderr->Flags = FILE_FLAG_MODE_WRITE; + #if USE_CPUID + { + uint32_t ecx, edx; + cpuid(1, NULL, NULL, &edx, &ecx); + gCPU_Features.SSE = edx & (1 << 25); // SSE + gCPU_Features.SSE2 = edx & (1 << 26); // SSE2 + } + #endif + return 1; } + + +#if USE_CPUID +/** + * \brief Call the CPUID opcode + */ +static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX) +{ + uint32_t eax, ebx, edx, ecx; + + __asm__ __volatile__ ( + "cpuid" + : "=a"(eax), "=c"(ecx), "=d"(edx) + : "a"(Num) + ); + + if(EAX) *EAX = eax; + if(EBX) *EBX = ebx; + if(EDX) *EDX = edx; + if(ECX) *ECX = ecx; +} +#endif