From dbbefec6973725d9a16c82747e0c7ce8e5e6c4f2 Mon Sep 17 00:00:00 2001 From: Ahmed Samy Date: Thu, 28 Nov 2013 17:20:23 +0200 Subject: [PATCH 1/1] cpuid: Introduce cpuid_write_info This function writes CPU information to a file. Signed-off-by: Ahmed Samy --- ccan/cpuid/cpuid.c | 316 +++++++++++++++++++++++++++++++++++++++++- ccan/cpuid/cpuid.h | 59 ++++++-- ccan/cpuid/test/run.c | 40 ++---- 3 files changed, 372 insertions(+), 43 deletions(-) diff --git a/ccan/cpuid/cpuid.c b/ccan/cpuid/cpuid.c index ad134b56..d2744102 100644 --- a/ccan/cpuid/cpuid.c +++ b/ccan/cpuid/cpuid.c @@ -29,6 +29,7 @@ #include "cpuid.h" #include +#include enum { CPUID_PROC_BRAND_STRING_INTERNAL0 = 0x80000003, @@ -280,8 +281,8 @@ void cpuid(cpuid_t info, uint32_t *buf) if (info == CPUID_PROC_BRAND_STRING) { static char cached[48] = { 0 }; if (cached[0] == '\0') { - ___cpuid(CPUID_PROC_BRAND_STRING, &buf[0], &buf[1], &buf[2], &buf[3]); - ___cpuid(CPUID_PROC_BRAND_STRING_INTERNAL0, &buf[4], &buf[5], &buf[6], &buf[7]); + ___cpuid(CPUID_PROC_BRAND_STRING, &buf[0], &buf[1], &buf[2], &buf[3] ); + ___cpuid(CPUID_PROC_BRAND_STRING_INTERNAL0, &buf[4], &buf[5], &buf[6], &buf[7] ); ___cpuid(CPUID_PROC_BRAND_STRING_INTERNAL1, &buf[8], &buf[9], &buf[10], &buf[11]); memcpy(cached, buf, sizeof cached); @@ -365,4 +366,315 @@ void cpuid(cpuid_t info, uint32_t *buf) } } +bool cpuid_write_info(uint32_t info, uint32_t featureset, const char *outfile) +{ + FILE *file; + char filename[256]; + char cpu_information[64]; + + if (!cpuid_sprintf_cputype(cpuid_get_cpu_type(), cpu_information)) + return false; + + char brand[48]; + cpuid(CPUID_PROC_BRAND_STRING, (uint32_t *)brand); + + cpu_information[12] = '_'; + memcpy(&cpu_information[13], brand, sizeof brand); + + if (!outfile) + strncpy(filename, cpu_information, sizeof cpu_information); + else + strncpy(filename, outfile, sizeof filename); + + file = fopen(filename, "w"); + if (!file) + return false; + + fprintf(file, "-- CPU Information for CPU: %s --\n\n", cpu_information); + + if (info & CPUID_HIGHEST_EXTENDED_FUNCTION_SUPPORTED) + fprintf(file, "Highest extended function supported: %#010x\n\n", cpuid_highest_ext_func_supported()); + + if (info & CPUID_EXTENDED_L2_CACHE_FEATURES) { + uint32_t l2c[3]; + cpuid(CPUID_EXTENDED_L2_CACHE_FEATURES, l2c); + + fprintf(file, "-- Extended L2 Cache features --\nL2 Line size: %u bytes\nAssociativity: %02xh\nCache Size: %u KB\n\n", + l2c[0], l2c[1], l2c[2]); + } + + if (info & CPUID_VIRT_PHYS_ADDR_SIZES) { + uint32_t phys_virt[2]; + cpuid(CPUID_VIRT_PHYS_ADDR_SIZES, phys_virt); + + fprintf(file, "-- Virtual and Physical address sizes --\n" + "Physical address size: %d\nVirtual address size: %d\n\n", phys_virt[0], phys_virt[1]); + } + + if (info & CPUID_PROCINFO_AND_FEATUREBITS) { + uint32_t procinfo[9]; + cpuid(CPUID_PROCINFO_AND_FEATUREBITS, procinfo); + + fputs("-- Processor information and feature bits --\n", file ); + fprintf(file, "Stepping: %d\nModel: 0x%X\nFamily: %d\nExtended model: %d\nExtended family: %d\n", + procinfo[0], procinfo[1], procinfo[2], procinfo[3], procinfo[4]); + fprintf(file, "\nBrand Index: %d\nCL Flush Line Size: %d\nLogical Processors: %d\nInitial APICID: %d\n\n", + procinfo[5], procinfo[6], procinfo[7], procinfo[8]); + } + + if (featureset != 0) + fputs("-- CPU FEATURES --\n\n", file); + + bool + sse3 = cpuid_has_ecxfeature(CPUID_FEAT_ECX_SSE3), + pclmul = cpuid_has_ecxfeature(CPUID_FEAT_ECX_PCLMUL), + dtes64 = cpuid_has_ecxfeature(CPUID_FEAT_ECX_DTES64), + monitor = cpuid_has_ecxfeature(CPUID_FEAT_ECX_MONITOR), + ds_cpl = cpuid_has_ecxfeature(CPUID_FEAT_ECX_DS_CPL), + vmx = cpuid_has_ecxfeature(CPUID_FEAT_ECX_VMX), + smx = cpuid_has_ecxfeature(CPUID_FEAT_ECX_SMX), + est = cpuid_has_ecxfeature(CPUID_FEAT_ECX_EST), + tm2 = cpuid_has_ecxfeature(CPUID_FEAT_ECX_TM2), + ssse3 = cpuid_has_ecxfeature(CPUID_FEAT_ECX_SSSE3), + cid = cpuid_has_ecxfeature(CPUID_FEAT_ECX_CID), + fma = cpuid_has_ecxfeature(CPUID_FEAT_ECX_FMA), + cx16 = cpuid_has_ecxfeature(CPUID_FEAT_ECX_CX16), + etprd = cpuid_has_ecxfeature(CPUID_FEAT_ECX_ETPRD), + pdcm = cpuid_has_ecxfeature(CPUID_FEAT_ECX_PDCM), + dca = cpuid_has_ecxfeature(CPUID_FEAT_ECX_DCA), + sse4_1 = cpuid_has_ecxfeature(CPUID_FEAT_ECX_SSE4_1), + sse4_2 = cpuid_has_ecxfeature(CPUID_FEAT_ECX_SSE4_2), + x2_apic = cpuid_has_ecxfeature(CPUID_FEAT_ECX_x2APIC), + movbe = cpuid_has_ecxfeature(CPUID_FEAT_ECX_MOVBE), + popcnt = cpuid_has_ecxfeature(CPUID_FEAT_ECX_POPCNT), + aes = cpuid_has_ecxfeature(CPUID_FEAT_ECX_AES), + xsave = cpuid_has_ecxfeature(CPUID_FEAT_ECX_XSAVE), + osxsave = cpuid_has_ecxfeature(CPUID_FEAT_ECX_OSXSAVE), + avx = cpuid_has_ecxfeature(CPUID_FEAT_ECX_AVX); + +#define YON(v) (v) ? "Yes" : "No" + if (featureset & CPUID_FEAT_ECX_ALL) { + fputs("-- ECX Features --\n", file); + fprintf(file, "SSE3: %s\n" + "PCMUL: %s\n" + "DTES64: %s\n" + "MONITOR: %s\n" + "DS_CPL: %s\n" + "VMX: %s\n" + "SMX: %s\n" + "EST: %s\n" + "TM2: %s\n" + "SSSE3: %s\n" + "CID: %s\n" + "FMA: %s\n" + "CX16: %s\n" + "ETPRD: %s\n" + "PDCM: %s\n" + "DCA: %s\n" + "SSE4_1: %s\n" + "SSE$_2: %s\n" + "X2_APIC: %s\n" + "MOVBE: %s\n" + "POPCNT: %s\n" + "AES: %s\n" + "XSAVE: %s\n" + "OSXSAVE: %s\n" + "AVS: %s\n\n", + YON(sse3), YON(pclmul), YON(dtes64), YON(monitor), YON(ds_cpl), + YON(vmx), YON(smx), YON(est), YON(tm2), YON(ssse3), YON(cid), + YON(fma), YON(cx16), YON(etprd), YON(pdcm), YON(dca), YON(sse4_1), + YON(sse4_2), YON(x2_apic), YON(movbe), YON(popcnt), YON(aes), + YON(xsave), YON(osxsave), YON(avx) + ); + } else { + if (featureset & CPUID_FEAT_ECX_SSE3) + fprintf(file, "SSE3: %s\n", YON(sse3)); + if (featureset & CPUID_FEAT_ECX_PCLMUL) + fprintf(file, "PCLMUL: %s\n", YON(pclmul)); + if (featureset & CPUID_FEAT_ECX_DTES64) + fprintf(file, "DTES64: %s\n", YON(dtes64)); + if (featureset & CPUID_FEAT_ECX_MONITOR) + fprintf(file, "Monitor: %s\n", YON(monitor)); + if (featureset & CPUID_FEAT_ECX_DS_CPL) + fprintf(file, "DS CPL: %s\n", YON(ds_cpl)); + if (featureset & CPUID_FEAT_ECX_VMX) + fprintf(file, "VMX: %s\n", YON(vmx)); + if (featureset & CPUID_FEAT_ECX_SMX) + fprintf(file, "SMX: %s\n", YON(smx)); + if (featureset & CPUID_FEAT_ECX_EST) + fprintf(file, "EST: %s\n", YON(est)); + if (featureset & CPUID_FEAT_ECX_TM2) + fprintf(file, "TM2: %s\n", YON(tm2)); + if (featureset & CPUID_FEAT_ECX_SSSE3) + fprintf(file, "SSSE3: %s\n", YON(ssse3)); + if (featureset & CPUID_FEAT_ECX_CID) + fprintf(file, "CID: %s\n", YON(cid)); + if (featureset & CPUID_FEAT_ECX_FMA) + fprintf(file, "FMA: %s\n", YON(fma)); + if (featureset & CPUID_FEAT_ECX_CX16) + fprintf(file, "CX16: %s\n", YON(cx16)); + if (featureset & CPUID_FEAT_ECX_ETPRD) + fprintf(file, "ETPRD: %s\n", YON(etprd)); + if (featureset & CPUID_FEAT_ECX_PDCM) + fprintf(file, "PDCM: %s\n", YON(pdcm)); + if (featureset & CPUID_FEAT_ECX_DCA) + fprintf(file, "DCA: %s\n", YON(dca)); + if (featureset & CPUID_FEAT_ECX_SSE4_1) + fprintf(file, "SSE4_1: %s\n", YON(sse4_1)); + if (featureset & CPUID_FEAT_ECX_SSE4_2) + fprintf(file, "SSE4_2: %s\n", YON(sse4_2)); + if (featureset & CPUID_FEAT_ECX_x2APIC) + fprintf(file, "x2APIC: %s\n", YON(x2_apic)); + if (featureset & CPUID_FEAT_ECX_MOVBE) + fprintf(file, "MOVBE: %s\n", YON(movbe)); + if (featureset & CPUID_FEAT_ECX_POPCNT) + fprintf(file, "POPCNT: %s\n", YON(popcnt)); + if (featureset & CPUID_FEAT_ECX_AES) + fprintf(file, "AES: %s\n", YON(aes)); + if (featureset & CPUID_FEAT_ECX_XSAVE) + fprintf(file, "XSAVE: %s\n", YON(xsave)); + if (featureset & CPUID_FEAT_ECX_OSXSAVE) + fprintf(file, "OSXSAVE: %s\n", YON(osxsave)); + if (featureset & CPUID_FEAT_ECX_AVX) + fprintf(file, "AVX: %s\n", YON(avx)); + } + + bool + fpu = cpuid_has_edxfeature(CPUID_FEAT_EDX_FPU), + vme = cpuid_has_edxfeature(CPUID_FEAT_EDX_VME), + de = cpuid_has_edxfeature(CPUID_FEAT_EDX_DE), + pse = cpuid_has_edxfeature(CPUID_FEAT_EDX_PSE), + tsc = cpuid_has_edxfeature(CPUID_FEAT_EDX_TSC), + msr = cpuid_has_edxfeature(CPUID_FEAT_EDX_MSR), + pae = cpuid_has_edxfeature(CPUID_FEAT_EDX_PAE), + mce = cpuid_has_edxfeature(CPUID_FEAT_EDX_MCE), + cx8 = cpuid_has_edxfeature(CPUID_FEAT_EDX_CX8), + apic = cpuid_has_edxfeature(CPUID_FEAT_EDX_APIC), + sep = cpuid_has_edxfeature(CPUID_FEAT_EDX_SEP), + mtrr = cpuid_has_edxfeature(CPUID_FEAT_EDX_MTRR), + pge = cpuid_has_edxfeature(CPUID_FEAT_EDX_PGE), + mca = cpuid_has_edxfeature(CPUID_FEAT_EDX_MCA), + cmov = cpuid_has_edxfeature(CPUID_FEAT_EDX_CMOV), + pat = cpuid_has_edxfeature(CPUID_FEAT_EDX_PAT), + pse36 = cpuid_has_edxfeature(CPUID_FEAT_EDX_PSE36), + psn = cpuid_has_edxfeature(CPUID_FEAT_EDX_PSN), + clf = cpuid_has_edxfeature(CPUID_FEAT_EDX_CLF), + dtes = cpuid_has_edxfeature(CPUID_FEAT_EDX_DTES), + acpi = cpuid_has_edxfeature(CPUID_FEAT_EDX_ACPI), + mmx = cpuid_has_edxfeature(CPUID_FEAT_EDX_MMX), + fxsr = cpuid_has_edxfeature(CPUID_FEAT_EDX_FXSR), + sse = cpuid_has_edxfeature(CPUID_FEAT_EDX_SSE), + sse2 = cpuid_has_edxfeature(CPUID_FEAT_EDX_SSE2), + ss = cpuid_has_edxfeature(CPUID_FEAT_EDX_SS), + htt = cpuid_has_edxfeature(CPUID_FEAT_EDX_HTT), + tm1 = cpuid_has_edxfeature(CPUID_FEAT_EDX_TM1), + ia64 = cpuid_has_edxfeature(CPUID_FEAT_EDX_IA64), + pbe = cpuid_has_edxfeature(CPUID_FEAT_EDX_PBE); + + if (featureset & CPUID_FEAT_EDX_ALL) { + fputs("-- EDX FEATURES --\n", file); + fprintf(file, "FPU: %s\n" + "VME: %s\n" + "DE: %s\n" + "PSE: %s\n" + "TSC: %s\n" + "MSR: %s\n" + "PAE: %s\n" + "MCE: %s\n" + "CX8: %s\n" + "APIC: %s\n" + "SEP: %s\n" + "MTRR: %s\n" + "PGE: %s\n" + "MCA: %s\n" + "CMOV: %s\n" + "PAT: %s\n" + "PSE36: %s\n" + "PSN: %s\n" + "CLF: %s\n" + "DTES: %s\n" + "ACPI: %s\n" + "MMX: %s\n" + "FXSR: %s\n" + "SSE: %s\n" + "SSE2: %s\n" + "SS: %s\n" + "HTT: %s\n" + "TM1: %s\n" + "IA64: %s\n" + "PBE: %s\n\n", + YON(fpu), YON(vme), YON(de), YON(pse), YON(tsc), YON(msr), + YON(pae), YON(mce), YON(cx8), YON(apic), YON(sep), YON(mtrr), + YON(pge), YON(mca), YON(cmov), YON(pat), YON(pse36), YON(psn), + YON(clf), YON(dtes), YON(acpi), YON(mmx), YON(fxsr), YON(sse), + YON(sse2), YON(ss), YON(htt), YON(tm1), YON(ia64), YON(pbe) + ); + } else { + if (featureset & CPUID_FEAT_EDX_FPU) + fprintf(file, "FPU: %s\n", YON(fpu)); + if (featureset & CPUID_FEAT_EDX_VME) + fprintf(file, "VME: %s\n", YON(vme)); + if (featureset & CPUID_FEAT_EDX_DE) + fprintf(file, "DE: %s\n", YON(de)); + if (featureset & CPUID_FEAT_EDX_PSE) + fprintf(file, "PSE: %s\n", YON(pse)); + if (featureset & CPUID_FEAT_EDX_TSC) + fprintf(file, "TSC: %s\n", YON(tsc)); + if (featureset & CPUID_FEAT_EDX_MSR) + fprintf(file, "MSR: %s\n", YON(msr)); + if (featureset & CPUID_FEAT_EDX_PAE) + fprintf(file, "PAE: %s\n", YON(pae)); + if (featureset & CPUID_FEAT_EDX_MCE) + fprintf(file, "MCE: %s\n", YON(mce)); + if (featureset & CPUID_FEAT_EDX_CX8) + fprintf(file, "CX8: %s\n", YON(cx8)); + if (featureset & CPUID_FEAT_EDX_APIC) + fprintf(file, "APIC: %s\n", YON(apic)); + if (featureset & CPUID_FEAT_EDX_SEP) + fprintf(file, "SEP: %s\n", YON(sep)); + if (featureset & CPUID_FEAT_EDX_MTRR) + fprintf(file, "MTRR: %s\n", YON(mtrr)); + if (featureset & CPUID_FEAT_EDX_PGE) + fprintf(file, "PGE: %s\n", YON(pge)); + if (featureset & CPUID_FEAT_EDX_MCA) + fprintf(file, "MCA: %s\n", YON(mca)); + if (featureset & CPUID_FEAT_EDX_CMOV) + fprintf(file, "CMOV: %s\n", YON(cmov)); + if (featureset & CPUID_FEAT_EDX_PAT) + fprintf(file, "PAT: %s\n", YON(pat)); + if (featureset & CPUID_FEAT_EDX_PSE36) + fprintf(file, "PSE36: %s\n", YON(pse36)); + if (featureset & CPUID_FEAT_EDX_PSN) + fprintf(file, "PSN: %s\n", YON(psn)); + if (featureset & CPUID_FEAT_EDX_CLF) + fprintf(file, "CLF: %s\n", YON(clf)); + if (featureset & CPUID_FEAT_EDX_DTES) + fprintf(file, "DTES:%s\n", YON(dtes)); + if (featureset & CPUID_FEAT_EDX_ACPI) + fprintf(file, "ACPI: %s\n", YON(acpi)); + if (featureset & CPUID_FEAT_EDX_MMX) + fprintf(file, "MMX: %s\n", YON(mmx)); + if (featureset & CPUID_FEAT_EDX_FXSR) + fprintf(file, "FXSR: %s\n", YON(fxsr)); + if (featureset & CPUID_FEAT_EDX_SSE) + fprintf(file, "SSE: %s\n", YON(sse)); + if (featureset & CPUID_FEAT_EDX_SSE2) + fprintf(file, "SSE2: %s\n", YON(sse2)); + if (featureset & CPUID_FEAT_EDX_SS) + fprintf(file, "SS: %s\n", YON(ss)); + if (featureset & CPUID_FEAT_EDX_HTT) + fprintf(file, "HTT: %s\n", YON(htt)); + if (featureset & CPUID_FEAT_EDX_TM1) + fprintf(file, "TM1: %s\n", YON(tm1)); + if (featureset & CPUID_FEAT_EDX_IA64) + fprintf(file, "IA64: %s\n", YON(ia64)); + if (featureset & CPUID_FEAT_EDX_PBE) + fprintf(file, "PBE: %s\n", YON(pbe)); + } +#undef YON + + fclose(file); + return true; +} + #endif diff --git a/ccan/cpuid/cpuid.h b/ccan/cpuid/cpuid.h index b9155661..a3e127e6 100644 --- a/ccan/cpuid/cpuid.h +++ b/ccan/cpuid/cpuid.h @@ -105,6 +105,16 @@ enum { CPUID_FEAT_ECX_OSXSAVE = 1 << 27, CPUID_FEAT_ECX_AVX = 1 << 28, + CPUID_FEAT_ECX_ALL = CPUID_FEAT_ECX_SSE3 | CPUID_FEAT_ECX_PCLMUL | CPUID_FEAT_ECX_DTES64 + | CPUID_FEAT_ECX_MONITOR | CPUID_FEAT_ECX_DS_CPL | CPUID_FEAT_ECX_VMX + | CPUID_FEAT_ECX_SMX | CPUID_FEAT_ECX_EST | CPUID_FEAT_ECX_TM2 + | CPUID_FEAT_ECX_SSSE3 | CPUID_FEAT_ECX_CID | CPUID_FEAT_ECX_FMA + | CPUID_FEAT_ECX_CX16 | CPUID_FEAT_ECX_ETPRD | CPUID_FEAT_ECX_PDCM + | CPUID_FEAT_ECX_DCA | CPUID_FEAT_ECX_SSE4_1 | CPUID_FEAT_ECX_SSE4_2 + | CPUID_FEAT_ECX_x2APIC | CPUID_FEAT_ECX_MOVBE | CPUID_FEAT_ECX_POPCNT + | CPUID_FEAT_ECX_AES | CPUID_FEAT_ECX_XSAVE | CPUID_FEAT_ECX_OSXSAVE + | CPUID_FEAT_ECX_AVX, + CPUID_FEAT_EDX_FPU = 1 << 0, CPUID_FEAT_EDX_VME = 1 << 1, CPUID_FEAT_EDX_DE = 1 << 2, @@ -134,7 +144,18 @@ enum { CPUID_FEAT_EDX_HTT = 1 << 28, CPUID_FEAT_EDX_TM1 = 1 << 29, CPUID_FEAT_EDX_IA64 = 1 << 30, - CPUID_FEAT_EDX_PBE = 1 << 31 + CPUID_FEAT_EDX_PBE = 1 << 31, + + CPUID_FEAT_EDX_ALL = CPUID_FEAT_EDX_FPU | CPUID_FEAT_EDX_VME | CPUID_FEAT_EDX_DE + | CPUID_FEAT_EDX_PSE | CPUID_FEAT_EDX_TSC | CPUID_FEAT_EDX_MSR + | CPUID_FEAT_EDX_PAE | CPUID_FEAT_EDX_MCE | CPUID_FEAT_EDX_CX8 + | CPUID_FEAT_EDX_APIC | CPUID_FEAT_EDX_SEP | CPUID_FEAT_EDX_MTRR + | CPUID_FEAT_EDX_PGE | CPUID_FEAT_EDX_MCA | CPUID_FEAT_EDX_CMOV + | CPUID_FEAT_EDX_PAT | CPUID_FEAT_EDX_PSE36 | CPUID_FEAT_EDX_PSN + | CPUID_FEAT_EDX_CLF | CPUID_FEAT_EDX_DTES | CPUID_FEAT_EDX_ACPI + | CPUID_FEAT_EDX_MMX | CPUID_FEAT_EDX_FXSR | CPUID_FEAT_EDX_SSE + | CPUID_FEAT_EDX_SSE2 | CPUID_FEAT_EDX_SS | CPUID_FEAT_EDX_HTT + | CPUID_FEAT_EDX_TM1 | CPUID_FEAT_EDX_IA64 | CPUID_FEAT_EDX_PBE }; typedef enum cputype { @@ -268,6 +289,25 @@ uint32_t cpuid_highest_ext_func_supported(void); */ void cpuid(cpuid_t info, uint32_t *buf); +/** + * cpuid_write_info - Write specified CPU information to a file. + * @info: Bit set of information to write. + * @featureset: Bit set of features to write. + * @outfile: Output filename (Max 256). + * + * If @outfile is NULL, a name is choosen in the following format: + * CPUVENDOR_PROCESSORBRAND.cpuid + * + * Returns true on success, false otherwise. + * + * Example usage: + * if (!cpuid_write_info(CPUID_VENDORID | CPUID_PROC_BRAND_STRING, + * CPUID_FEAT_ECX_SSE3 | CPUID_FEAT_EDX_FPU, + * "cpuinfo.cpuid")) + * ... error ... + */ +bool cpuid_write_info(uint32_t info, uint32_t featureset, const char *outfile); + /** * cpuid_test_feature - Test if @feature is available * @@ -293,16 +333,17 @@ bool cpuid_has_edxfeature(int feature); #else #include -#define cpuid_get_cpu_type() BUILD_ASSERT_OR_ZERO(0) -#define cpuid_get_cpu_type_string() BUILD_ASSERT_OR_ZERO(0) +#define cpuid_get_cpu_type() BUILD_ASSERT_OR_ZERO(0) +#define cpuid_get_cpu_type_string() BUILD_ASSERT_OR_ZERO(0) -#define cpuid_is_supported() BUILD_ASSERT_OR_ZERO(0) -#define cpuid(info, buf) BUILD_ASSERT_OR_ZERO(0) +#define cpuid_is_supported() BUILD_ASSERT_OR_ZERO(0) +#define cpuid(info, buf) BUILD_ASSERT_OR_ZERO(0) +#define cpuid_write_info(info, featureset, outfile) BUILD_ASSERT_OR_ZERO(0) -#define cpuid_highest_ext_func_supported() BUILD_ASSERT_OR_ZERO(0) -#define cpuid_test_feature(feature) BUILD_ASSERT_OR_ZERO(0) -#define cpuid_has_ecxfeature(feature) BUILD_ASSERT_OR_ZERO(0) -#define cpuid_has_edxfeature(feature) BUILD_ASSERT_OR_ZERO(0) +#define cpuid_highest_ext_func_supported() BUILD_ASSERT_OR_ZERO(0) +#define cpuid_test_feature(feature) BUILD_ASSERT_OR_ZERO(0) +#define cpuid_has_ecxfeature(feature) BUILD_ASSERT_OR_ZERO(0) +#define cpuid_has_edxfeature(feature) BUILD_ASSERT_OR_ZERO(0) #endif #endif diff --git a/ccan/cpuid/test/run.c b/ccan/cpuid/test/run.c index 0d2bebd6..6afb9fa4 100644 --- a/ccan/cpuid/test/run.c +++ b/ccan/cpuid/test/run.c @@ -10,38 +10,14 @@ int main(void) return 1; } - char cputype[12]; - if (cpuid_sprintf_cputype(cpuid_get_cpu_type(), cputype)) - printf ("Vendor ID: %s\n", cputype); - - char buf[48]; - cpuid(CPUID_PROC_BRAND_STRING, (uint32_t *)buf); - printf ("Processor Brand: %s\n", buf); - - uint32_t procinfo[9]; - cpuid(CPUID_PROCINFO_AND_FEATUREBITS, procinfo); - printf("Stepping: %d Model: 0x%X Family: %d extended model: %d extended family: %d\n", - procinfo[0], procinfo[1], procinfo[2], procinfo[3], procinfo[4]); - printf("Brand Index: %d CL Flush Line Size: %d Logical Processors: %d Initial APICID: %d\n", - procinfo[5], procinfo[6], procinfo[7], procinfo[8]); - - printf ("Highest extended function supported: %#010x\n", cpuid_highest_ext_func_supported()); - - uint32_t phys_virt[2]; - cpuid(CPUID_VIRT_PHYS_ADDR_SIZES, phys_virt); - printf ("Physical address size: %d\nVirtual address size: %d\n", phys_virt[0], phys_virt[1]); - - uint32_t extfeatures[2]; - cpuid(CPUID_EXTENDED_PROC_INFO_FEATURE_BITS, extfeatures); - printf ("Extended processor info and feature bits: %d %d\n", extfeatures[0], extfeatures[1]); - - uint32_t l2c[3]; - cpuid(CPUID_EXTENDED_L2_CACHE_FEATURES, l2c); - printf("L2 Line size: %u bytes\tAssociativity: %02xh\tCache Size: %u KB\n", - l2c[0], l2c[1], l2c[2]); + uint32_t info = CPUID_HIGHEST_EXTENDED_FUNCTION_SUPPORTED | CPUID_EXTENDED_L2_CACHE_FEATURES | CPUID_VIRT_PHYS_ADDR_SIZES + | CPUID_PROCINFO_AND_FEATUREBITS; + uint32_t featureset = CPUID_FEAT_ECX_ALL | CPUID_FEAT_EDX_ALL; + if (!cpuid_write_info(info, featureset, NULL)) { + printf("Failed to write CPU information!\n"); + return 1; + } - uint32_t invalid; - cpuid(0x0ffffffUL, &invalid); - printf ("Testing invalid: %#010x\n", invalid); + printf("Wrote CPU information\n"); return 0; } -- 2.39.2