packages feed

basic-cpuid-0.1.0.0: cbits/cpuid.c

#include "cpuid.h"

void call_cpuid(uint32_t eax, uint32_t ecx, uint32_t *result) {
#if defined(__x86_64__) || defined(__i386__)
    __asm__ __volatile__(
		    "cpuid\r\n"
		    "mov %%eax, %0\r\n"
		    "mov %%ebx, %1\r\n"
		    "mov %%ecx, %2\r\n"
		    "mov %%edx, %3\r\n"
		    : "=g" (result[0]), "=g" (result[1]), "=g" (result[2]), "=g" (result[3])
		    : "a" (eax), "c" (ecx)
		    : "memory", "ebx", "edx", "cc"
		);
#else
    result[0] = 0;
    result[1] = 0;
    result[2] = 0;
    result[3] = 0;
#endif
}

uint64_t call_xgetbv(uint32_t ecx) {
#if defined(__x86_64__) || defined(__i386__)
    uint64_t rax;
    __asm__ __volatile__(
            "xgetbv\r\n"
            "shl $32, %%rdx \r\n"
            "or %%rdx, %%rax \r\n"
            : "=a" (rax)
            : "c" (ecx)
            : "rdx", "cc"
        );
    return rax;
#else
    return 0;
#endif
}