Chameleon

Chameleon Svn Source Tree

Root/branches/cparm/i386/libsaio/cpuid.h

1/*
2 * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28/*
29 * @OSF_COPYRIGHT@
30 */
31
32/*
33 * x86 CPU identification
34 *
35 */
36
37#ifndef _MACHINE_CPUID_H_
38#define _MACHINE_CPUID_H_
39
40#include <stdint.h>
41
42#defineCPUID_VID_INTEL"GenuineIntel"
43#defineCPUID_VID_AMD"AuthenticAMD"
44
45#define CPUID_STRING_UNKNOWN "Unknown CPU Typ"
46
47#define _Bit(n)(1ULL << n)
48#define _HBit(n)(1ULL << ((n)+32))
49
50/*
51 * The CPUID_FEATURE_XXX values define 64-bit values
52 * returned in %ecx:%edx to a CPUID request with %eax of 1:
53 */
54#define CPUID_FEATURE_FPU _Bit(0) /* Floating point unit on-chip */
55#define CPUID_FEATURE_VME _Bit(1) /* Virtual Mode Extension */
56#define CPUID_FEATURE_DE _Bit(2) /* Debugging Extension */
57#define CPUID_FEATURE_PSE _Bit(3) /* Page Size Extension */
58#define CPUID_FEATURE_TSC _Bit(4) /* Time Stamp Counter */
59#define CPUID_FEATURE_MSR _Bit(5) /* Model Specific Registers */
60#define CPUID_FEATURE_PAE _Bit(6) /* Physical Address Extension */
61#define CPUID_FEATURE_MCE _Bit(7) /* Machine Check Exception */
62#define CPUID_FEATURE_CX8 _Bit(8) /* CMPXCHG8B */
63#define CPUID_FEATURE_APIC _Bit(9) /* On-chip APIC */
64#define CPUID_FEATURE_SEP _Bit(11) /* Fast System Call */
65#define CPUID_FEATURE_MTRR _Bit(12) /* Memory Type Range Register */
66#define CPUID_FEATURE_PGE _Bit(13) /* Page Global Enable */
67#define CPUID_FEATURE_MCA _Bit(14) /* Machine Check Architecture */
68#define CPUID_FEATURE_CMOV _Bit(15) /* Conditional Move Instruction */
69#define CPUID_FEATURE_PAT _Bit(16) /* Page Attribute Table */
70#define CPUID_FEATURE_PSE36 _Bit(17) /* 36-bit Page Size Extension */
71#define CPUID_FEATURE_PSN _Bit(18) /* Processor Serial Number */
72#define CPUID_FEATURE_CLFSH _Bit(19) /* CLFLUSH Instruction supported */
73#define CPUID_FEATURE_DS _Bit(21) /* Debug Store */
74#define CPUID_FEATURE_ACPI _Bit(22) /* Thermal monitor and Clock Ctrl */
75#define CPUID_FEATURE_MMX _Bit(23) /* MMX supported */
76#define CPUID_FEATURE_FXSR _Bit(24) /* Fast floating pt save/restore */
77#define CPUID_FEATURE_SSE _Bit(25) /* Streaming SIMD extensions */
78#define CPUID_FEATURE_SSE2 _Bit(26) /* Streaming SIMD extensions 2 */
79#define CPUID_FEATURE_SS _Bit(27) /* Self-Snoop */
80#define CPUID_FEATURE_HTT _Bit(28) /* Hyper-Threading Technology */
81#define CPUID_FEATURE_TM _Bit(29) /* Thermal Monitor (TM1) */
82#define CPUID_FEATURE_PBE _Bit(31) /* Pend Break Enable */
83
84#define CPUID_FEATURE_SSE3 _HBit(0) /* Streaming SIMD extensions 3 */
85#define CPUID_FEATURE_PCLMULQDQ _HBit(1) /* PCLMULQDQ instruction */
86#define CPUID_FEATURE_DTES64 _HBit(2) /* 64-bit DS layout */
87#define CPUID_FEATURE_MONITOR _HBit(3) /* Monitor/mwait */
88#define CPUID_FEATURE_DSCPL _HBit(4) /* Debug Store CPL */
89#define CPUID_FEATURE_VMX _HBit(5) /* VMX */
90#define CPUID_FEATURE_SMX _HBit(6) /* SMX */
91#define CPUID_FEATURE_EST _HBit(7) /* Enhanced SpeedsTep (GV3) */
92#define CPUID_FEATURE_TM2 _HBit(8) /* Thermal Monitor 2 */
93#define CPUID_FEATURE_SSSE3 _HBit(9) /* Supplemental SSE3 instructions */
94#define CPUID_FEATURE_CID _HBit(10) /* L1 Context ID */
95#define CPUID_FEATURE_SEGLIM64 _HBit(11) /* 64-bit segment limit checking */
96#define CPUID_FEATURE_CX16 _HBit(13) /* CmpXchg16b instruction */
97#define CPUID_FEATURE_xTPR _HBit(14) /* Send Task PRiority msgs */
98#define CPUID_FEATURE_PDCM _HBit(15) /* Perf/Debug Capability MSR */
99
100#define CPUID_FEATURE_PCID _HBit(17) /* ASID-PCID support */
101#define CPUID_FEATURE_DCA _HBit(18) /* Direct Cache Access */
102#define CPUID_FEATURE_SSE4_1 _HBit(19) /* Streaming SIMD extensions 4.1 */
103#define CPUID_FEATURE_SSE4_2 _HBit(20) /* Streaming SIMD extensions 4.2 */
104#define CPUID_FEATURE_xAPIC _HBit(21) /* Extended APIC Mode */
105#define CPUID_FEATURE_MOVBE _HBit(22) /* MOVBE instruction */
106#define CPUID_FEATURE_POPCNT _HBit(23) /* POPCNT instruction */
107#define CPUID_FEATURE_TSCTMR _HBit(24) /* TSC deadline timer */
108#define CPUID_FEATURE_AES _HBit(25) /* AES instructions */
109#define CPUID_FEATURE_XSAVE _HBit(26) /* XSAVE instructions */
110#define CPUID_FEATURE_OSXSAVE _HBit(27) /* XGETBV/XSETBV instructions */
111#define CPUID_FEATURE_AVX1_0_HBit(28) /* AVX 1.0 instructions */
112#define CPUID_FEATURE_VMM _HBit(31) /* VMM (Hypervisor) present */
113#define CPUID_FEATURE_SEGLIM64 _HBit(11) /* 64-bit segment limit checking */
114#define CPUID_FEATURE_PCID _HBit(17) /* ASID-PCID support */
115#define CPUID_FEATURE_TSCTMR _HBit(24) /* TSC deadline timer */
116#define CPUID_FEATURE_AVX1_0_HBit(28) /* AVX 1.0 instructions */
117#define CPUID_FEATURE_F16C_HBit(29) /* Float16 convert instructions */
118#define CPUID_FEATURE_RDRAND_HBit(30) /* RDRAND instruction */
119
120/*
121 * Leaf 7, subleaf 0 additional features.
122 * Bits returned in %ebx to a CPUID request with {%eax,%ecx} of (0x7,0x0}:
123 */
124#define CPUID_LEAF7_FEATURE_RDWRFSGS _Bit(0)/* FS/GS base read/write */
125#define CPUID_LEAF7_FEATURE_SMEP _Bit(7)/* Supervisor Mode Execute Protect */
126#define CPUID_LEAF7_FEATURE_ENFSTRG _Bit(9)/* ENhanced Fast STRinG copy */
127
128/*
129 * The CPUID_EXTFEATURE_XXX values define 64-bit values
130 * returned in %ecx:%edx to a CPUID request with %eax of 0x80000001:
131 */
132#define CPUID_EXTFEATURE_SYSCALL _Bit(11)/* SYSCALL/sysret */
133#define CPUID_EXTFEATURE_XD _Bit(20)/* eXecute Disable */
134
135#define CPUID_EXTFEATURE_1GBPAGE _Bit(26)/* 1GB pages */
136#define CPUID_EXTFEATURE_RDTSCP _Bit(27)/* RDTSCP */
137#define CPUID_EXTFEATURE_EM64T _Bit(29)/* Extended Mem 64 Technology */
138
139#define CPUID_EXTFEATURE_LAHF _HBit(0)/* LAFH/SAHF instructions */
140
141/*
142 * The CPUID_EXTFEATURE_XXX values define 64-bit values
143 * returned in %ecx:%edx to a CPUID request with %eax of 0x80000007:
144 */
145#define CPUID_EXTFEATURE_TSCI _Bit(8)/* TSC Invariant */
146
147#defineCPUID_CACHE_SIZE16/* Number of descriptor values */
148
149#define CPUID_MWAIT_EXTENSION_Bit(0)/* enumeration of WMAIT extensions */
150#define CPUID_MWAIT_BREAK_Bit(1)/* interrupts are break events */
151
152#define CPUID_MODEL_YONAH0x0E
153#define CPUID_MODEL_MEROM0x0F
154#define CPUID_MODEL_PENRYN0x17
155#define CPUID_MODEL_NEHALEM0x1A
156#define CPUID_MODEL_FIELDS0x1E/* Lynnfield, Clarksfield, Jasper */
157#define CPUID_MODEL_DALES0x1F/* Havendale, Auburndale */
158#define CPUID_MODEL_NEHALEM_EX0x2E
159#define CPUID_MODEL_DALES_32NM0x25/* Clarkdale, Arrandale */
160#define CPUID_MODEL_WESTMERE0x2C/* Gulftown, Westmere-EP, Westmere-WS */
161#define CPUID_MODEL_WESTMERE_EX0x2F
162#define CPUID_MODEL_SANDYBRIDGE0x2A
163#define CPUID_MODEL_JAKETOWN0x2D
164#define CPUID_MODEL_IVYBRIDGE0x3A
165
166typedef enum { eax, ebx, ecx, edx } cpuid_register_t;
167
168#if UNUSED
169static inline void
170cpuid(uint32_t *data)
171{
172asm("cpuid"
173: "=a" (data[eax]),
174 "=b" (data[ebx]),
175 "=c" (data[ecx]),
176 "=d" (data[edx])
177: "a" (data[eax]),
178 "b" (data[ebx]),
179 "c" (data[ecx]),
180 "d" (data[edx]));
181}
182#endif
183
184static inline void
185do_cpuid(uint32_t selector, uint32_t *data)
186{
187asm("cpuid"
188: "=a" (data[0]),
189 "=b" (data[1]),
190 "=c" (data[2]),
191 "=d" (data[3])
192: "a"(selector),
193 "b" (0),
194 "c" (0),
195 "d" (0));
196}
197
198/*
199 * Cache ID descriptor structure, used to parse CPUID leaf 2.
200 * Note: not used in kernel.
201 */
202typedef enum { Lnone, L1I, L1D, L2U, L3U, LCACHE_MAX } cache_type_t ;
203typedef struct {
204unsigned charvalue; /* Descriptor value */
205cache_type_t type; /* Cache type */
206unsigned int size; /* Cache size */
207unsigned int linesize; /* Cache line size */
208#ifdef KERNEL
209const char*description; /* Cache description */
210#endif /* KERNEL */
211} cpuid_cache_desc_t;
212
213#ifdef KERNEL
214#define CACHE_DESC(value,type,size,linesize,text) \
215{ value, type, size, linesize, text }
216#else
217#define CACHE_DESC(value,type,size,linesize,text) \
218{ value, type, size, linesize }
219#endif /* KERNEL */
220
221/* Monitor/mwait Leaf: */
222typedef struct {
223uint32_tlinesize_min;
224uint32_tlinesize_max;
225uint32_textensions;
226uint32_tsub_Cstates;
227} cpuid_mwait_leaf_t;
228
229/* Thermal and Power Management Leaf: */
230typedef struct {
231boolean_tsensor;
232boolean_tdynamic_acceleration;
233boolean_tinvariant_APIC_timer;
234boolean_tcore_power_limits;
235boolean_tfine_grain_clock_mod;
236boolean_tpackage_thermal_intr;
237uint32_tthresholds;
238boolean_tACNT_MCNT;
239boolean_thardware_feedback;
240boolean_tenergy_policy;
241} cpuid_thermal_leaf_t;
242
243
244/* XSAVE Feature Leaf: */
245typedef struct {
246uint32_textended_state[4];/* eax .. edx */
247} cpuid_xsave_leaf_t;
248
249
250/* Architectural Performance Monitoring Leaf: */
251typedef struct {
252uint8_tversion;
253uint8_tnumber;
254uint8_twidth;
255uint8_tevents_number;
256uint32_tevents;
257uint8_tfixed_number;
258uint8_tfixed_width;
259} cpuid_arch_perf_leaf_t;
260
261/* Physical CPU info - this is exported out of the kernel (kexts), so be wary of changes */
262typedef struct {
263charcpuid_vendor[16];
264charcpuid_brand_string[48];
265const char*cpuid_model_string;
266
267cpu_type_tcpuid_type;/* this is *not* a cpu_type_t in our <mach/machine.h> */
268uint8_tcpuid_family;
269uint8_tcpuid_model;
270uint8_tcpuid_extmodel;
271uint8_tcpuid_extfamily;
272uint8_tcpuid_stepping;
273uint64_tcpuid_features;
274uint64_tcpuid_extfeatures;
275uint32_tcpuid_signature;
276uint8_t cpuid_brand;
277 uint8_tcpuid_processor_flag;
278
279uint32_tcache_size[LCACHE_MAX];
280uint32_tcache_linesize;
281
282uint8_tcache_info[64]; /* list of cache descriptors */
283
284uint32_tcpuid_cores_per_package;
285uint32_tcpuid_logical_per_package;
286uint32_tcache_sharing[LCACHE_MAX];
287uint32_tcache_partitions[LCACHE_MAX];
288
289cpu_type_tcpuid_cpu_type;/* <mach/machine.h> */
290cpu_subtype_tcpuid_cpu_subtype;/* <mach/machine.h> */
291
292/* Per-vendor info */
293cpuid_mwait_leaf_tcpuid_mwait_leaf;
294#define cpuid_mwait_linesize_maxcpuid_mwait_leaf.linesize_max
295#define cpuid_mwait_linesize_mincpuid_mwait_leaf.linesize_min
296#define cpuid_mwait_extensionscpuid_mwait_leaf.extensions
297#define cpuid_mwait_sub_Cstatescpuid_mwait_leaf.sub_Cstates
298cpuid_thermal_leaf_tcpuid_thermal_leaf;
299cpuid_arch_perf_leaf_tcpuid_arch_perf_leaf;
300cpuid_xsave_leaf_tcpuid_xsave_leaf;
301
302/* Cache details: */
303uint32_tcpuid_cache_linesize;
304uint32_tcpuid_cache_L2_associativity;
305uint32_tcpuid_cache_size;
306
307/* Virtual and physical address aize: */
308uint32_tcpuid_address_bits_physical;
309uint32_tcpuid_address_bits_virtual;
310
311uint32_tcpuid_microcode_version;
312
313/* Numbers of tlbs per processor [i|d, small|large, level0|level1] */
314uint32_tcpuid_tlb[2][2][2];
315#defineTLB_INST0
316#defineTLB_DATA1
317#defineTLB_SMALL0
318#defineTLB_LARGE1
319uint32_tcpuid_stlb;
320
321uint32_tcore_count;
322uint32_tthread_count;
323
324/* Max leaf ids available from CPUID */
325uint32_tcpuid_max_basic;
326uint32_tcpuid_max_ext;
327
328/* Family-specific info links */
329uint32_tcpuid_cpufamily;
330cpuid_mwait_leaf_t*cpuid_mwait_leafp;
331cpuid_thermal_leaf_t*cpuid_thermal_leafp;
332cpuid_arch_perf_leaf_t*cpuid_arch_perf_leafp;
333cpuid_xsave_leaf_t*cpuid_xsave_leafp;
334 uint32_tcpuid_leaf7_features;
335} i386_cpu_info_t;
336
337
338#endif /* _MACHINE_CPUID_H_ */
339

Archive Download this file

Revision: 2057