/* * Copyright 2008 Veselin Georgiev, * anrieffNOSPAM @ mgail_DOT.com (convert to gmail) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __CPUID_H__ #define __CPUID_H__ #ifdef __x86_64__ #define VENDOR_STR_MAX 16 #define BRAND_STR_MAX 64 #define CPU_FLAGS_MAX 128 #define MAX_CPUID_LEVEL 32 #define MAX_EXT_CPUID_LEVEL 32 #define MAX_INTELFN4_LEVEL 4 typedef enum { PROC_BIGENDIAN_GENERIC = 1, PROC_LITENDIAN_GENERIC, PROC_X64_INTEL, PROC_X64_AMD } proc_type_t; typedef struct { int sse_level; int sse_sub_level; int avx_level; int xop_avail; proc_type_t proc_type; } processor_info_t; /** * This contains only the most basic CPU data, required to do identification * and feature recognition. Every processor should be identifiable using this * data only. */ struct cpu_raw_data_t { /** contains results of CPUID for eax = 0, 1, ...*/ uint32_t basic_cpuid[MAX_CPUID_LEVEL][4]; /** contains results of CPUID for eax = 0x80000000, 0x80000001, ...*/ uint32_t ext_cpuid[MAX_EXT_CPUID_LEVEL][4]; /** when the CPU is intel and it supports deterministic cache information: this contains the results of CPUID for eax = 4 and ecx = 0, 1, ... */ uint32_t intel_fn4[MAX_INTELFN4_LEVEL][4]; char vendor_str[VENDOR_STR_MAX]; }; void exec_cpuid(uint32_t *regs); void cpuid_get_raw_data(struct cpu_raw_data_t* data); void cpuid_basic_identify(processor_info_t *pc); #endif /* __x86_64__ */ #endif /* __CPUID_H__ */