untitled paste

unlisted ⁨1⁩ ⁨file⁩ 2024-06-13 04:07:27 UTC

cpuid.c

Raw
#include <stdio.h>

// Function to execute cpuid instruction and get the results in the provided registers
void cpuid(int code, unsigned int *a, unsigned int *b, unsigned int *c, unsigned int *d) {
    __asm__ volatile ("cpuid"
                      : "=a" (*a), "=b" (*b), "=c" (*c), "=d" (*d)
                      : "a" (code));
}

void cpuidex(int code, int subleaf, unsigned int *a, unsigned int *b, unsigned int *c, unsigned int *d) {
    __asm__ volatile ("cpuid"
                      : "=a" (*a), "=b" (*b), "=c" (*c), "=d" (*d)
                      : "a" (code), "c" (subleaf));
}

void print_feature_flags() {
    unsigned int eax, ebx, ecx, edx;

    // Call cpuid with eax = 1 to get the main feature flags
    cpuid(1, &eax, &ebx, &ecx, &edx);

    printf("Feature flags from cpuid(1):\n");
    printf("EDX: ");
    if (edx & (1 << 0))  printf("FPU ");
    if (edx & (1 << 1))  printf("VME ");
    if (edx & (1 << 2))  printf("DE ");
    if (edx & (1 << 3))  printf("PSE ");
    if (edx & (1 << 4))  printf("TSC ");
    if (edx & (1 << 5))  printf("MSR ");
    if (edx & (1 << 6))  printf("PAE ");
    if (edx & (1 << 7))  printf("MCE ");
    if (edx & (1 << 8))  printf("CX8 ");
    if (edx & (1 << 9))  printf("APIC ");
    if (edx & (1 << 11)) printf("SEP ");
    if (edx & (1 << 12)) printf("MTRR ");
    if (edx & (1 << 13)) printf("PGE ");
    if (edx & (1 << 14)) printf("MCA ");
    if (edx & (1 << 15)) printf("CMOV ");
    if (edx & (1 << 16)) printf("PAT ");
    if (edx & (1 << 17)) printf("PSE36 ");
    if (edx & (1 << 18)) printf("PSN ");
    if (edx & (1 << 19)) printf("CLFLUSH ");
    if (edx & (1 << 23)) printf("MMX ");
    if (edx & (1 << 24)) printf("FXSR ");
    if (edx & (1 << 25)) printf("SSE ");
    if (edx & (1 << 26)) printf("SSE2 ");
    if (edx & (1 << 27)) printf("SS ");
    if (edx & (1 << 28)) printf("HTT ");
    if (edx & (1 << 29)) printf("TM ");
    if (edx & (1 << 30)) printf("IA64 ");
    if (edx & (1 << 31)) printf("PBE ");
    printf("\n");

    printf("ECX: ");
    if (ecx & (1 << 0))  printf("SSE3 ");
    if (ecx & (1 << 1))  printf("PCLMULQDQ ");
    if (ecx & (1 << 2))  printf("DTES64 ");
    if (ecx & (1 << 3))  printf("MONITOR ");
    if (ecx & (1 << 4))  printf("DS_CPL ");
    if (ecx & (1 << 5))  printf("VMX ");
    if (ecx & (1 << 6))  printf("SMX ");
    if (ecx & (1 << 7))  printf("EST ");
    if (ecx & (1 << 8))  printf("TM2 ");
    if (ecx & (1 << 9))  printf("SSSE3 ");
    if (ecx & (1 << 10)) printf("CNXT_ID ");
    if (ecx & (1 << 11)) printf("SDBG ");
    if (ecx & (1 << 12)) printf("FMA ");
    if (ecx & (1 << 13)) printf("CX16 ");
    if (ecx & (1 << 14)) printf("XTPR ");
    if (ecx & (1 << 15)) printf("PDCM ");
    if (ecx & (1 << 17)) printf("PCID ");
    if (ecx & (1 << 18)) printf("DCA ");
    if (ecx & (1 << 19)) printf("SSE4_1 ");
    if (ecx & (1 << 20)) printf("SSE4_2 ");
    if (ecx & (1 << 21)) printf("X2APIC ");
    if (ecx & (1 << 22)) printf("MOVBE ");
    if (ecx & (1 << 23)) printf("POPCNT ");
    if (ecx & (1 << 24)) printf("TSC_DEADLINE ");
    if (ecx & (1 << 25)) printf("AES ");
    if (ecx & (1 << 26)) printf("XSAVE ");
    if (ecx & (1 << 27)) printf("OSXSAVE ");
    if (ecx & (1 << 28)) printf("AVX ");
    if (ecx & (1 << 29)) printf("F16C ");
    if (ecx & (1 << 30)) printf("RDRAND ");
    if (ecx & (1 << 31)) printf("HYPERVISOR ");
    printf("\n");

    // Call cpuid with eax = 7 and ecx = 0 to get extended feature flags
    cpuidex(7, 0, &eax, &ebx, &ecx, &edx);

    printf("Extended feature flags from cpuid(7, 0):\n");
    printf("EBX: ");
    if (ebx & (1 << 0))  printf("FSGSBASE ");
    if (ebx & (1 << 1))  printf("IA32_TSC_ADJUST ");
    if (ebx & (1 << 2))  printf("SGX ");
    if (ebx & (1 << 3))  printf("BMI1 ");
    if (ebx & (1 << 4))  printf("HLE ");
    if (ebx & (1 << 5))  printf("AVX2 ");
    if (ebx & (1 << 6))  printf("FDP_EXCPTN_ONLY ");
    if (ebx & (1 << 7))  printf("SMEP ");
    if (ebx & (1 << 8))  printf("BMI2 ");
    if (ebx & (1 << 9))  printf("ERMS ");
    if (ebx & (1 << 10)) printf("INVPCID ");
    if (ebx & (1 << 11)) printf("RTM ");
    if (ebx & (1 << 12)) printf("PQM ");
    if (ebx & (1 << 13)) printf("FPU_CS_DS ");
    if (ebx & (1 << 14)) printf("MPX ");
    if (ebx & (1 << 15)) printf("PQE ");
    if (ebx & (1 << 16)) printf("AVX512F ");
    if (ebx & (1 << 17)) printf("AVX512DQ ");
    if (ebx & (1 << 18)) printf("RDSEED ");
    if (ebx & (1 << 19)) printf("ADX ");
    if (ebx & (1 << 20)) printf("SMAP ");
    if (ebx & (1 << 21)) printf("AVX512IFMA ");
    if (ebx & (1 << 22)) printf("PCOMMIT ");
    if (ebx & (1 << 23)) printf("CLFLUSHOPT ");
    if (ebx & (1 << 24)) printf("CLWB ");
    if (ebx & (1 << 25)) printf("INTEL_PT ");
    if (ebx & (1 << 26)) printf("AVX512PF ");
    if (ebx & (1 << 27)) printf("AVX512ER ");
    if (ebx & (1 << 28)) printf("AVX512CD ");
    if (ebx & (1 << 29)) printf("SHA ");
    if (ebx & (1 << 30)) printf("AVX512BW ");
    if (ebx & (1 << 31)) printf("AVX512VL ");
    printf("\n");

    printf("ECX: ");
    if (ecx & (1 << 1))  printf("AVX512VBMI ");
    if (ecx & (1 << 3))  printf("UMIP ");
    if (ecx & (1 << 4))  printf("PKU ");
    if (ecx & (1 << 5))  printf("OSPKE ");
    if (ecx & (1 << 6))  printf("WAITPKG ");
    if (ecx & (1 << 8))  printf("AVX512VBMI2 ");
    if (ecx & (1 << 9))  printf("CET_SS ");
    if (ecx & (1 << 10)) printf("GFNI ");
    if (ecx & (1 << 11)) printf("VAES ");
    if (ecx & (1 << 12)) printf("VPCLMULQDQ ");
    if (ecx & (1 << 14)) printf("AVX512VNNI ");
    if (ecx & (1 << 16)) printf("AVX512BITALG ");
    if (ecx & (1 << 17)) printf("TME ");
    if (ecx & (1 << 18)) printf("AVX512VPOPCNTDQ ");
    if (ecx & (1 << 22)) printf("RDPID ");
    if (ecx & (1 << 30)) printf("SGX_LC ");
    printf("\n");

    printf("EDX: ");
    if (edx & (1 << 2))  printf("AVX512_4VNNIW ");
    if (edx & (1 << 3))  printf("AVX512_4FMAPS ");
    if (edx & (1 << 8))  printf("AVX512_VP2INTERSECT ");
    if (edx & (1 << 14)) printf("MD_CLEAR ");
    if (edx & (1 << 18)) printf("IBT ");
    printf("\n");
}

int main() {
    print_feature_flags();
    return 0;
}