xref: /freebsd/sys/x86/x86/identcpu.c (revision 325151a3)
1 /*-
2  * Copyright (c) 1992 Terrence R. Lambert.
3  * Copyright (c) 1982, 1987, 1990 The Regents of the University of California.
4  * Copyright (c) 1997 KATO Takenori.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to Berkeley by
8  * William Jolitz.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *	This product includes software developed by the University of
21  *	California, Berkeley and its contributors.
22  * 4. Neither the name of the University nor the names of its contributors
23  *    may be used to endorse or promote products derived from this software
24  *    without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36  * SUCH DAMAGE.
37  *
38  *	from: Id: machdep.c,v 1.193 1996/06/18 01:22:04 bde Exp
39  */
40 
41 #include <sys/cdefs.h>
42 __FBSDID("$FreeBSD$");
43 
44 #include "opt_cpu.h"
45 
46 #include <sys/param.h>
47 #include <sys/bus.h>
48 #include <sys/cpu.h>
49 #include <sys/eventhandler.h>
50 #include <sys/limits.h>
51 #include <sys/systm.h>
52 #include <sys/kernel.h>
53 #include <sys/sysctl.h>
54 #include <sys/power.h>
55 
56 #include <machine/asmacros.h>
57 #include <machine/clock.h>
58 #include <machine/cputypes.h>
59 #include <machine/frame.h>
60 #include <machine/intr_machdep.h>
61 #include <machine/md_var.h>
62 #include <machine/segments.h>
63 #include <machine/specialreg.h>
64 
65 #include <amd64/vmm/intel/vmx_controls.h>
66 #include <x86/isa/icu.h>
67 #include <x86/vmware.h>
68 
69 #ifdef __i386__
70 #define	IDENTBLUE_CYRIX486	0
71 #define	IDENTBLUE_IBMCPU	1
72 #define	IDENTBLUE_CYRIXM2	2
73 
74 static void identifycyrix(void);
75 static void print_transmeta_info(void);
76 #endif
77 static u_int find_cpu_vendor_id(void);
78 static void print_AMD_info(void);
79 static void print_INTEL_info(void);
80 static void print_INTEL_TLB(u_int data);
81 static void print_hypervisor_info(void);
82 static void print_svm_info(void);
83 static void print_via_padlock_info(void);
84 static void print_vmx_info(void);
85 
86 int	cpu_class;
87 char machine[] = MACHINE;
88 
89 #ifdef __amd64__
90 #ifdef SCTL_MASK32
91 extern int adaptive_machine_arch;
92 #endif
93 
94 static int
95 sysctl_hw_machine(SYSCTL_HANDLER_ARGS)
96 {
97 #ifdef SCTL_MASK32
98 	static const char machine32[] = "i386";
99 #endif
100 	int error;
101 
102 #ifdef SCTL_MASK32
103 	if ((req->flags & SCTL_MASK32) != 0 && adaptive_machine_arch)
104 		error = SYSCTL_OUT(req, machine32, sizeof(machine32));
105 	else
106 #endif
107 		error = SYSCTL_OUT(req, machine, sizeof(machine));
108 	return (error);
109 
110 }
111 SYSCTL_PROC(_hw, HW_MACHINE, machine, CTLTYPE_STRING | CTLFLAG_RD,
112     NULL, 0, sysctl_hw_machine, "A", "Machine class");
113 #else
114 SYSCTL_STRING(_hw, HW_MACHINE, machine, CTLFLAG_RD,
115     machine, 0, "Machine class");
116 #endif
117 
118 static char cpu_model[128];
119 SYSCTL_STRING(_hw, HW_MODEL, model, CTLFLAG_RD,
120     cpu_model, 0, "Machine model");
121 
122 static int hw_clockrate;
123 SYSCTL_INT(_hw, OID_AUTO, clockrate, CTLFLAG_RD,
124     &hw_clockrate, 0, "CPU instruction clock rate");
125 
126 u_int hv_high;
127 char hv_vendor[16];
128 SYSCTL_STRING(_hw, OID_AUTO, hv_vendor, CTLFLAG_RD, hv_vendor, 0,
129     "Hypervisor vendor");
130 
131 static eventhandler_tag tsc_post_tag;
132 
133 static char cpu_brand[48];
134 
135 #ifdef __i386__
136 #define	MAX_BRAND_INDEX	8
137 
138 static const char *cpu_brandtable[MAX_BRAND_INDEX + 1] = {
139 	NULL,			/* No brand */
140 	"Intel Celeron",
141 	"Intel Pentium III",
142 	"Intel Pentium III Xeon",
143 	NULL,
144 	NULL,
145 	NULL,
146 	NULL,
147 	"Intel Pentium 4"
148 };
149 #endif
150 
151 static struct {
152 	char	*cpu_name;
153 	int	cpu_class;
154 } cpus[] = {
155 #ifdef __i386__
156 	{ "Intel 80286",	CPUCLASS_286 },		/* CPU_286   */
157 	{ "i386SX",		CPUCLASS_386 },		/* CPU_386SX */
158 	{ "i386DX",		CPUCLASS_386 },		/* CPU_386   */
159 	{ "i486SX",		CPUCLASS_486 },		/* CPU_486SX */
160 	{ "i486DX",		CPUCLASS_486 },		/* CPU_486   */
161 	{ "Pentium",		CPUCLASS_586 },		/* CPU_586   */
162 	{ "Cyrix 486",		CPUCLASS_486 },		/* CPU_486DLC */
163 	{ "Pentium Pro",	CPUCLASS_686 },		/* CPU_686 */
164 	{ "Cyrix 5x86",		CPUCLASS_486 },		/* CPU_M1SC */
165 	{ "Cyrix 6x86",		CPUCLASS_486 },		/* CPU_M1 */
166 	{ "Blue Lightning",	CPUCLASS_486 },		/* CPU_BLUE */
167 	{ "Cyrix 6x86MX",	CPUCLASS_686 },		/* CPU_M2 */
168 	{ "NexGen 586",		CPUCLASS_386 },		/* CPU_NX586 (XXX) */
169 	{ "Cyrix 486S/DX",	CPUCLASS_486 },		/* CPU_CY486DX */
170 	{ "Pentium II",		CPUCLASS_686 },		/* CPU_PII */
171 	{ "Pentium III",	CPUCLASS_686 },		/* CPU_PIII */
172 	{ "Pentium 4",		CPUCLASS_686 },		/* CPU_P4 */
173 #else
174 	{ "Clawhammer",		CPUCLASS_K8 },		/* CPU_CLAWHAMMER */
175 	{ "Sledgehammer",	CPUCLASS_K8 },		/* CPU_SLEDGEHAMMER */
176 #endif
177 };
178 
179 static struct {
180 	char	*vendor;
181 	u_int	vendor_id;
182 } cpu_vendors[] = {
183 	{ INTEL_VENDOR_ID,	CPU_VENDOR_INTEL },	/* GenuineIntel */
184 	{ AMD_VENDOR_ID,	CPU_VENDOR_AMD },	/* AuthenticAMD */
185 	{ CENTAUR_VENDOR_ID,	CPU_VENDOR_CENTAUR },	/* CentaurHauls */
186 #ifdef __i386__
187 	{ NSC_VENDOR_ID,	CPU_VENDOR_NSC },	/* Geode by NSC */
188 	{ CYRIX_VENDOR_ID,	CPU_VENDOR_CYRIX },	/* CyrixInstead */
189 	{ TRANSMETA_VENDOR_ID,	CPU_VENDOR_TRANSMETA },	/* GenuineTMx86 */
190 	{ SIS_VENDOR_ID,	CPU_VENDOR_SIS },	/* SiS SiS SiS  */
191 	{ UMC_VENDOR_ID,	CPU_VENDOR_UMC },	/* UMC UMC UMC  */
192 	{ NEXGEN_VENDOR_ID,	CPU_VENDOR_NEXGEN },	/* NexGenDriven */
193 	{ RISE_VENDOR_ID,	CPU_VENDOR_RISE },	/* RiseRiseRise */
194 #if 0
195 	/* XXX CPUID 8000_0000h and 8086_0000h, not 0000_0000h */
196 	{ "TransmetaCPU",	CPU_VENDOR_TRANSMETA },
197 #endif
198 #endif
199 };
200 
201 void
202 printcpuinfo(void)
203 {
204 	u_int regs[4], i;
205 	char *brand;
206 
207 	cpu_class = cpus[cpu].cpu_class;
208 	printf("CPU: ");
209 	strncpy(cpu_model, cpus[cpu].cpu_name, sizeof (cpu_model));
210 
211 	/* Check for extended CPUID information and a processor name. */
212 	if (cpu_exthigh >= 0x80000004) {
213 		brand = cpu_brand;
214 		for (i = 0x80000002; i < 0x80000005; i++) {
215 			do_cpuid(i, regs);
216 			memcpy(brand, regs, sizeof(regs));
217 			brand += sizeof(regs);
218 		}
219 	}
220 
221 	switch (cpu_vendor_id) {
222 	case CPU_VENDOR_INTEL:
223 #ifdef __i386__
224 		if ((cpu_id & 0xf00) > 0x300) {
225 			u_int brand_index;
226 
227 			cpu_model[0] = '\0';
228 
229 			switch (cpu_id & 0x3000) {
230 			case 0x1000:
231 				strcpy(cpu_model, "Overdrive ");
232 				break;
233 			case 0x2000:
234 				strcpy(cpu_model, "Dual ");
235 				break;
236 			}
237 
238 			switch (cpu_id & 0xf00) {
239 			case 0x400:
240 				strcat(cpu_model, "i486 ");
241 			        /* Check the particular flavor of 486 */
242 				switch (cpu_id & 0xf0) {
243 				case 0x00:
244 				case 0x10:
245 					strcat(cpu_model, "DX");
246 					break;
247 				case 0x20:
248 					strcat(cpu_model, "SX");
249 					break;
250 				case 0x30:
251 					strcat(cpu_model, "DX2");
252 					break;
253 				case 0x40:
254 					strcat(cpu_model, "SL");
255 					break;
256 				case 0x50:
257 					strcat(cpu_model, "SX2");
258 					break;
259 				case 0x70:
260 					strcat(cpu_model,
261 					    "DX2 Write-Back Enhanced");
262 					break;
263 				case 0x80:
264 					strcat(cpu_model, "DX4");
265 					break;
266 				}
267 				break;
268 			case 0x500:
269 			        /* Check the particular flavor of 586 */
270 			        strcat(cpu_model, "Pentium");
271 			        switch (cpu_id & 0xf0) {
272 				case 0x00:
273 				        strcat(cpu_model, " A-step");
274 					break;
275 				case 0x10:
276 				        strcat(cpu_model, "/P5");
277 					break;
278 				case 0x20:
279 				        strcat(cpu_model, "/P54C");
280 					break;
281 				case 0x30:
282 				        strcat(cpu_model, "/P24T");
283 					break;
284 				case 0x40:
285 				        strcat(cpu_model, "/P55C");
286 					break;
287 				case 0x70:
288 				        strcat(cpu_model, "/P54C");
289 					break;
290 				case 0x80:
291 				        strcat(cpu_model, "/P55C (quarter-micron)");
292 					break;
293 				default:
294 				        /* nothing */
295 					break;
296 				}
297 #if defined(I586_CPU) && !defined(NO_F00F_HACK)
298 				/*
299 				 * XXX - If/when Intel fixes the bug, this
300 				 * should also check the version of the
301 				 * CPU, not just that it's a Pentium.
302 				 */
303 				has_f00f_bug = 1;
304 #endif
305 				break;
306 			case 0x600:
307 			        /* Check the particular flavor of 686 */
308   			        switch (cpu_id & 0xf0) {
309 				case 0x00:
310 				        strcat(cpu_model, "Pentium Pro A-step");
311 					break;
312 				case 0x10:
313 				        strcat(cpu_model, "Pentium Pro");
314 					break;
315 				case 0x30:
316 				case 0x50:
317 				case 0x60:
318 				        strcat(cpu_model,
319 				"Pentium II/Pentium II Xeon/Celeron");
320 					cpu = CPU_PII;
321 					break;
322 				case 0x70:
323 				case 0x80:
324 				case 0xa0:
325 				case 0xb0:
326 				        strcat(cpu_model,
327 					"Pentium III/Pentium III Xeon/Celeron");
328 					cpu = CPU_PIII;
329 					break;
330 				default:
331 				        strcat(cpu_model, "Unknown 80686");
332 					break;
333 				}
334 				break;
335 			case 0xf00:
336 				strcat(cpu_model, "Pentium 4");
337 				cpu = CPU_P4;
338 				break;
339 			default:
340 				strcat(cpu_model, "unknown");
341 				break;
342 			}
343 
344 			/*
345 			 * If we didn't get a brand name from the extended
346 			 * CPUID, try to look it up in the brand table.
347 			 */
348 			if (cpu_high > 0 && *cpu_brand == '\0') {
349 				brand_index = cpu_procinfo & CPUID_BRAND_INDEX;
350 				if (brand_index <= MAX_BRAND_INDEX &&
351 				    cpu_brandtable[brand_index] != NULL)
352 					strcpy(cpu_brand,
353 					    cpu_brandtable[brand_index]);
354 			}
355 		}
356 #else
357 		/* Please make up your mind folks! */
358 		strcat(cpu_model, "EM64T");
359 #endif
360 		break;
361 	case CPU_VENDOR_AMD:
362 		/*
363 		 * Values taken from AMD Processor Recognition
364 		 * http://www.amd.com/K6/k6docs/pdf/20734g.pdf
365 		 * (also describes ``Features'' encodings.
366 		 */
367 		strcpy(cpu_model, "AMD ");
368 #ifdef __i386__
369 		switch (cpu_id & 0xFF0) {
370 		case 0x410:
371 			strcat(cpu_model, "Standard Am486DX");
372 			break;
373 		case 0x430:
374 			strcat(cpu_model, "Enhanced Am486DX2 Write-Through");
375 			break;
376 		case 0x470:
377 			strcat(cpu_model, "Enhanced Am486DX2 Write-Back");
378 			break;
379 		case 0x480:
380 			strcat(cpu_model, "Enhanced Am486DX4/Am5x86 Write-Through");
381 			break;
382 		case 0x490:
383 			strcat(cpu_model, "Enhanced Am486DX4/Am5x86 Write-Back");
384 			break;
385 		case 0x4E0:
386 			strcat(cpu_model, "Am5x86 Write-Through");
387 			break;
388 		case 0x4F0:
389 			strcat(cpu_model, "Am5x86 Write-Back");
390 			break;
391 		case 0x500:
392 			strcat(cpu_model, "K5 model 0");
393 			break;
394 		case 0x510:
395 			strcat(cpu_model, "K5 model 1");
396 			break;
397 		case 0x520:
398 			strcat(cpu_model, "K5 PR166 (model 2)");
399 			break;
400 		case 0x530:
401 			strcat(cpu_model, "K5 PR200 (model 3)");
402 			break;
403 		case 0x560:
404 			strcat(cpu_model, "K6");
405 			break;
406 		case 0x570:
407 			strcat(cpu_model, "K6 266 (model 1)");
408 			break;
409 		case 0x580:
410 			strcat(cpu_model, "K6-2");
411 			break;
412 		case 0x590:
413 			strcat(cpu_model, "K6-III");
414 			break;
415 		case 0x5a0:
416 			strcat(cpu_model, "Geode LX");
417 			break;
418 		default:
419 			strcat(cpu_model, "Unknown");
420 			break;
421 		}
422 #else
423 		if ((cpu_id & 0xf00) == 0xf00)
424 			strcat(cpu_model, "AMD64 Processor");
425 		else
426 			strcat(cpu_model, "Unknown");
427 #endif
428 		break;
429 #ifdef __i386__
430 	case CPU_VENDOR_CYRIX:
431 		strcpy(cpu_model, "Cyrix ");
432 		switch (cpu_id & 0xff0) {
433 		case 0x440:
434 			strcat(cpu_model, "MediaGX");
435 			break;
436 		case 0x520:
437 			strcat(cpu_model, "6x86");
438 			break;
439 		case 0x540:
440 			cpu_class = CPUCLASS_586;
441 			strcat(cpu_model, "GXm");
442 			break;
443 		case 0x600:
444 			strcat(cpu_model, "6x86MX");
445 			break;
446 		default:
447 			/*
448 			 * Even though CPU supports the cpuid
449 			 * instruction, it can be disabled.
450 			 * Therefore, this routine supports all Cyrix
451 			 * CPUs.
452 			 */
453 			switch (cyrix_did & 0xf0) {
454 			case 0x00:
455 				switch (cyrix_did & 0x0f) {
456 				case 0x00:
457 					strcat(cpu_model, "486SLC");
458 					break;
459 				case 0x01:
460 					strcat(cpu_model, "486DLC");
461 					break;
462 				case 0x02:
463 					strcat(cpu_model, "486SLC2");
464 					break;
465 				case 0x03:
466 					strcat(cpu_model, "486DLC2");
467 					break;
468 				case 0x04:
469 					strcat(cpu_model, "486SRx");
470 					break;
471 				case 0x05:
472 					strcat(cpu_model, "486DRx");
473 					break;
474 				case 0x06:
475 					strcat(cpu_model, "486SRx2");
476 					break;
477 				case 0x07:
478 					strcat(cpu_model, "486DRx2");
479 					break;
480 				case 0x08:
481 					strcat(cpu_model, "486SRu");
482 					break;
483 				case 0x09:
484 					strcat(cpu_model, "486DRu");
485 					break;
486 				case 0x0a:
487 					strcat(cpu_model, "486SRu2");
488 					break;
489 				case 0x0b:
490 					strcat(cpu_model, "486DRu2");
491 					break;
492 				default:
493 					strcat(cpu_model, "Unknown");
494 					break;
495 				}
496 				break;
497 			case 0x10:
498 				switch (cyrix_did & 0x0f) {
499 				case 0x00:
500 					strcat(cpu_model, "486S");
501 					break;
502 				case 0x01:
503 					strcat(cpu_model, "486S2");
504 					break;
505 				case 0x02:
506 					strcat(cpu_model, "486Se");
507 					break;
508 				case 0x03:
509 					strcat(cpu_model, "486S2e");
510 					break;
511 				case 0x0a:
512 					strcat(cpu_model, "486DX");
513 					break;
514 				case 0x0b:
515 					strcat(cpu_model, "486DX2");
516 					break;
517 				case 0x0f:
518 					strcat(cpu_model, "486DX4");
519 					break;
520 				default:
521 					strcat(cpu_model, "Unknown");
522 					break;
523 				}
524 				break;
525 			case 0x20:
526 				if ((cyrix_did & 0x0f) < 8)
527 					strcat(cpu_model, "6x86");	/* Where did you get it? */
528 				else
529 					strcat(cpu_model, "5x86");
530 				break;
531 			case 0x30:
532 				strcat(cpu_model, "6x86");
533 				break;
534 			case 0x40:
535 				if ((cyrix_did & 0xf000) == 0x3000) {
536 					cpu_class = CPUCLASS_586;
537 					strcat(cpu_model, "GXm");
538 				} else
539 					strcat(cpu_model, "MediaGX");
540 				break;
541 			case 0x50:
542 				strcat(cpu_model, "6x86MX");
543 				break;
544 			case 0xf0:
545 				switch (cyrix_did & 0x0f) {
546 				case 0x0d:
547 					strcat(cpu_model, "Overdrive CPU");
548 					break;
549 				case 0x0e:
550 					strcpy(cpu_model, "Texas Instruments 486SXL");
551 					break;
552 				case 0x0f:
553 					strcat(cpu_model, "486SLC/DLC");
554 					break;
555 				default:
556 					strcat(cpu_model, "Unknown");
557 					break;
558 				}
559 				break;
560 			default:
561 				strcat(cpu_model, "Unknown");
562 				break;
563 			}
564 			break;
565 		}
566 		break;
567 	case CPU_VENDOR_RISE:
568 		strcpy(cpu_model, "Rise ");
569 		switch (cpu_id & 0xff0) {
570 		case 0x500:	/* 6401 and 6441 (Kirin) */
571 		case 0x520:	/* 6510 (Lynx) */
572 			strcat(cpu_model, "mP6");
573 			break;
574 		default:
575 			strcat(cpu_model, "Unknown");
576 		}
577 		break;
578 #endif
579 	case CPU_VENDOR_CENTAUR:
580 #ifdef __i386__
581 		switch (cpu_id & 0xff0) {
582 		case 0x540:
583 			strcpy(cpu_model, "IDT WinChip C6");
584 			break;
585 		case 0x580:
586 			strcpy(cpu_model, "IDT WinChip 2");
587 			break;
588 		case 0x590:
589 			strcpy(cpu_model, "IDT WinChip 3");
590 			break;
591 		case 0x660:
592 			strcpy(cpu_model, "VIA C3 Samuel");
593 			break;
594 		case 0x670:
595 			if (cpu_id & 0x8)
596 				strcpy(cpu_model, "VIA C3 Ezra");
597 			else
598 				strcpy(cpu_model, "VIA C3 Samuel 2");
599 			break;
600 		case 0x680:
601 			strcpy(cpu_model, "VIA C3 Ezra-T");
602 			break;
603 		case 0x690:
604 			strcpy(cpu_model, "VIA C3 Nehemiah");
605 			break;
606 		case 0x6a0:
607 		case 0x6d0:
608 			strcpy(cpu_model, "VIA C7 Esther");
609 			break;
610 		case 0x6f0:
611 			strcpy(cpu_model, "VIA Nano");
612 			break;
613 		default:
614 			strcpy(cpu_model, "VIA/IDT Unknown");
615 		}
616 #else
617 		strcpy(cpu_model, "VIA ");
618 		if ((cpu_id & 0xff0) == 0x6f0)
619 			strcat(cpu_model, "Nano Processor");
620 		else
621 			strcat(cpu_model, "Unknown");
622 #endif
623 		break;
624 #ifdef __i386__
625 	case CPU_VENDOR_IBM:
626 		strcpy(cpu_model, "Blue Lightning CPU");
627 		break;
628 	case CPU_VENDOR_NSC:
629 		switch (cpu_id & 0xff0) {
630 		case 0x540:
631 			strcpy(cpu_model, "Geode SC1100");
632 			cpu = CPU_GEODE1100;
633 			break;
634 		default:
635 			strcpy(cpu_model, "Geode/NSC unknown");
636 			break;
637 		}
638 		break;
639 #endif
640 	default:
641 		strcat(cpu_model, "Unknown");
642 		break;
643 	}
644 
645 	/*
646 	 * Replace cpu_model with cpu_brand minus leading spaces if
647 	 * we have one.
648 	 */
649 	brand = cpu_brand;
650 	while (*brand == ' ')
651 		++brand;
652 	if (*brand != '\0')
653 		strcpy(cpu_model, brand);
654 
655 	printf("%s (", cpu_model);
656 	if (tsc_freq != 0) {
657 		hw_clockrate = (tsc_freq + 5000) / 1000000;
658 		printf("%jd.%02d-MHz ",
659 		    (intmax_t)(tsc_freq + 4999) / 1000000,
660 		    (u_int)((tsc_freq + 4999) / 10000) % 100);
661 	}
662 	switch(cpu_class) {
663 #ifdef __i386__
664 	case CPUCLASS_286:
665 		printf("286");
666 		break;
667 	case CPUCLASS_386:
668 		printf("386");
669 		break;
670 #if defined(I486_CPU)
671 	case CPUCLASS_486:
672 		printf("486");
673 		break;
674 #endif
675 #if defined(I586_CPU)
676 	case CPUCLASS_586:
677 		printf("586");
678 		break;
679 #endif
680 #if defined(I686_CPU)
681 	case CPUCLASS_686:
682 		printf("686");
683 		break;
684 #endif
685 #else
686 	case CPUCLASS_K8:
687 		printf("K8");
688 		break;
689 #endif
690 	default:
691 		printf("Unknown");	/* will panic below... */
692 	}
693 	printf("-class CPU)\n");
694 	if (*cpu_vendor)
695 		printf("  Origin=\"%s\"", cpu_vendor);
696 	if (cpu_id)
697 		printf("  Id=0x%x", cpu_id);
698 
699 	if (cpu_vendor_id == CPU_VENDOR_INTEL ||
700 	    cpu_vendor_id == CPU_VENDOR_AMD ||
701 	    cpu_vendor_id == CPU_VENDOR_CENTAUR ||
702 #ifdef __i386__
703 	    cpu_vendor_id == CPU_VENDOR_TRANSMETA ||
704 	    cpu_vendor_id == CPU_VENDOR_RISE ||
705 	    cpu_vendor_id == CPU_VENDOR_NSC ||
706 	    (cpu_vendor_id == CPU_VENDOR_CYRIX && ((cpu_id & 0xf00) > 0x500)) ||
707 #endif
708 	    0) {
709 		printf("  Family=0x%x", CPUID_TO_FAMILY(cpu_id));
710 		printf("  Model=0x%x", CPUID_TO_MODEL(cpu_id));
711 		printf("  Stepping=%u", cpu_id & CPUID_STEPPING);
712 #ifdef __i386__
713 		if (cpu_vendor_id == CPU_VENDOR_CYRIX)
714 			printf("\n  DIR=0x%04x", cyrix_did);
715 #endif
716 
717 		/*
718 		 * AMD CPUID Specification
719 		 * http://support.amd.com/us/Embedded_TechDocs/25481.pdf
720 		 *
721 		 * Intel Processor Identification and CPUID Instruction
722 		 * http://www.intel.com/assets/pdf/appnote/241618.pdf
723 		 */
724 		if (cpu_high > 0) {
725 
726 			/*
727 			 * Here we should probably set up flags indicating
728 			 * whether or not various features are available.
729 			 * The interesting ones are probably VME, PSE, PAE,
730 			 * and PGE.  The code already assumes without bothering
731 			 * to check that all CPUs >= Pentium have a TSC and
732 			 * MSRs.
733 			 */
734 			printf("\n  Features=0x%b", cpu_feature,
735 			"\020"
736 			"\001FPU"	/* Integral FPU */
737 			"\002VME"	/* Extended VM86 mode support */
738 			"\003DE"	/* Debugging Extensions (CR4.DE) */
739 			"\004PSE"	/* 4MByte page tables */
740 			"\005TSC"	/* Timestamp counter */
741 			"\006MSR"	/* Machine specific registers */
742 			"\007PAE"	/* Physical address extension */
743 			"\010MCE"	/* Machine Check support */
744 			"\011CX8"	/* CMPEXCH8 instruction */
745 			"\012APIC"	/* SMP local APIC */
746 			"\013oldMTRR"	/* Previous implementation of MTRR */
747 			"\014SEP"	/* Fast System Call */
748 			"\015MTRR"	/* Memory Type Range Registers */
749 			"\016PGE"	/* PG_G (global bit) support */
750 			"\017MCA"	/* Machine Check Architecture */
751 			"\020CMOV"	/* CMOV instruction */
752 			"\021PAT"	/* Page attributes table */
753 			"\022PSE36"	/* 36 bit address space support */
754 			"\023PN"	/* Processor Serial number */
755 			"\024CLFLUSH"	/* Has the CLFLUSH instruction */
756 			"\025<b20>"
757 			"\026DTS"	/* Debug Trace Store */
758 			"\027ACPI"	/* ACPI support */
759 			"\030MMX"	/* MMX instructions */
760 			"\031FXSR"	/* FXSAVE/FXRSTOR */
761 			"\032SSE"	/* Streaming SIMD Extensions */
762 			"\033SSE2"	/* Streaming SIMD Extensions #2 */
763 			"\034SS"	/* Self snoop */
764 			"\035HTT"	/* Hyperthreading (see EBX bit 16-23) */
765 			"\036TM"	/* Thermal Monitor clock slowdown */
766 			"\037IA64"	/* CPU can execute IA64 instructions */
767 			"\040PBE"	/* Pending Break Enable */
768 			);
769 
770 			if (cpu_feature2 != 0) {
771 				printf("\n  Features2=0x%b", cpu_feature2,
772 				"\020"
773 				"\001SSE3"	/* SSE3 */
774 				"\002PCLMULQDQ"	/* Carry-Less Mul Quadword */
775 				"\003DTES64"	/* 64-bit Debug Trace */
776 				"\004MON"	/* MONITOR/MWAIT Instructions */
777 				"\005DS_CPL"	/* CPL Qualified Debug Store */
778 				"\006VMX"	/* Virtual Machine Extensions */
779 				"\007SMX"	/* Safer Mode Extensions */
780 				"\010EST"	/* Enhanced SpeedStep */
781 				"\011TM2"	/* Thermal Monitor 2 */
782 				"\012SSSE3"	/* SSSE3 */
783 				"\013CNXT-ID"	/* L1 context ID available */
784 				"\014SDBG"	/* IA32 silicon debug */
785 				"\015FMA"	/* Fused Multiply Add */
786 				"\016CX16"	/* CMPXCHG16B Instruction */
787 				"\017xTPR"	/* Send Task Priority Messages*/
788 				"\020PDCM"	/* Perf/Debug Capability MSR */
789 				"\021<b16>"
790 				"\022PCID"	/* Process-context Identifiers*/
791 				"\023DCA"	/* Direct Cache Access */
792 				"\024SSE4.1"	/* SSE 4.1 */
793 				"\025SSE4.2"	/* SSE 4.2 */
794 				"\026x2APIC"	/* xAPIC Extensions */
795 				"\027MOVBE"	/* MOVBE Instruction */
796 				"\030POPCNT"	/* POPCNT Instruction */
797 				"\031TSCDLT"	/* TSC-Deadline Timer */
798 				"\032AESNI"	/* AES Crypto */
799 				"\033XSAVE"	/* XSAVE/XRSTOR States */
800 				"\034OSXSAVE"	/* OS-Enabled State Management*/
801 				"\035AVX"	/* Advanced Vector Extensions */
802 				"\036F16C"	/* Half-precision conversions */
803 				"\037RDRAND"	/* RDRAND Instruction */
804 				"\040HV"	/* Hypervisor */
805 				);
806 			}
807 
808 			if (amd_feature != 0) {
809 				printf("\n  AMD Features=0x%b", amd_feature,
810 				"\020"		/* in hex */
811 				"\001<s0>"	/* Same */
812 				"\002<s1>"	/* Same */
813 				"\003<s2>"	/* Same */
814 				"\004<s3>"	/* Same */
815 				"\005<s4>"	/* Same */
816 				"\006<s5>"	/* Same */
817 				"\007<s6>"	/* Same */
818 				"\010<s7>"	/* Same */
819 				"\011<s8>"	/* Same */
820 				"\012<s9>"	/* Same */
821 				"\013<b10>"	/* Undefined */
822 				"\014SYSCALL"	/* Have SYSCALL/SYSRET */
823 				"\015<s12>"	/* Same */
824 				"\016<s13>"	/* Same */
825 				"\017<s14>"	/* Same */
826 				"\020<s15>"	/* Same */
827 				"\021<s16>"	/* Same */
828 				"\022<s17>"	/* Same */
829 				"\023<b18>"	/* Reserved, unknown */
830 				"\024MP"	/* Multiprocessor Capable */
831 				"\025NX"	/* Has EFER.NXE, NX */
832 				"\026<b21>"	/* Undefined */
833 				"\027MMX+"	/* AMD MMX Extensions */
834 				"\030<s23>"	/* Same */
835 				"\031<s24>"	/* Same */
836 				"\032FFXSR"	/* Fast FXSAVE/FXRSTOR */
837 				"\033Page1GB"	/* 1-GB large page support */
838 				"\034RDTSCP"	/* RDTSCP */
839 				"\035<b28>"	/* Undefined */
840 				"\036LM"	/* 64 bit long mode */
841 				"\0373DNow!+"	/* AMD 3DNow! Extensions */
842 				"\0403DNow!"	/* AMD 3DNow! */
843 				);
844 			}
845 
846 			if (amd_feature2 != 0) {
847 				printf("\n  AMD Features2=0x%b", amd_feature2,
848 				"\020"
849 				"\001LAHF"	/* LAHF/SAHF in long mode */
850 				"\002CMP"	/* CMP legacy */
851 				"\003SVM"	/* Secure Virtual Mode */
852 				"\004ExtAPIC"	/* Extended APIC register */
853 				"\005CR8"	/* CR8 in legacy mode */
854 				"\006ABM"	/* LZCNT instruction */
855 				"\007SSE4A"	/* SSE4A */
856 				"\010MAS"	/* Misaligned SSE mode */
857 				"\011Prefetch"	/* 3DNow! Prefetch/PrefetchW */
858 				"\012OSVW"	/* OS visible workaround */
859 				"\013IBS"	/* Instruction based sampling */
860 				"\014XOP"	/* XOP extended instructions */
861 				"\015SKINIT"	/* SKINIT/STGI */
862 				"\016WDT"	/* Watchdog timer */
863 				"\017<b14>"
864 				"\020LWP"	/* Lightweight Profiling */
865 				"\021FMA4"	/* 4-operand FMA instructions */
866 				"\022TCE"	/* Translation Cache Extension */
867 				"\023<b18>"
868 				"\024NodeId"	/* NodeId MSR support */
869 				"\025<b20>"
870 				"\026TBM"	/* Trailing Bit Manipulation */
871 				"\027Topology"	/* Topology Extensions */
872 				"\030PCXC"	/* Core perf count */
873 				"\031PNXC"	/* NB perf count */
874 				"\032<b25>"
875 				"\033DBE"	/* Data Breakpoint extension */
876 				"\034PTSC"	/* Performance TSC */
877 				"\035PL2I"	/* L2I perf count */
878 				"\036<b29>"
879 				"\037<b30>"
880 				"\040<b31>"
881 				);
882 			}
883 
884 			if (cpu_stdext_feature != 0) {
885 				printf("\n  Structured Extended Features=0x%b",
886 				    cpu_stdext_feature,
887 				       "\020"
888 				       /* RDFSBASE/RDGSBASE/WRFSBASE/WRGSBASE */
889 				       "\001FSGSBASE"
890 				       "\002TSCADJ"
891 				       /* Bit Manipulation Instructions */
892 				       "\004BMI1"
893 				       /* Hardware Lock Elision */
894 				       "\005HLE"
895 				       /* Advanced Vector Instructions 2 */
896 				       "\006AVX2"
897 				       /* Supervisor Mode Execution Prot. */
898 				       "\010SMEP"
899 				       /* Bit Manipulation Instructions */
900 				       "\011BMI2"
901 				       "\012ERMS"
902 				       /* Invalidate Processor Context ID */
903 				       "\013INVPCID"
904 				       /* Restricted Transactional Memory */
905 				       "\014RTM"
906 				       "\015PQM"
907 				       "\016NFPUSG"
908 				       "\020PQE"
909 				       /* Intel Memory Protection Extensions */
910 				       "\017MPX"
911 				       /* AVX512 Foundation */
912 				       "\021AVX512F"
913 				       /* Enhanced NRBG */
914 				       "\023RDSEED"
915 				       /* ADCX + ADOX */
916 				       "\024ADX"
917 				       /* Supervisor Mode Access Prevention */
918 				       "\025SMAP"
919 				       "\030CLFLUSHOPT"
920 				       "\032PROCTRACE"
921 				       "\033AVX512PF"
922 				       "\034AVX512ER"
923 				       "\035AVX512CD"
924 				       "\036SHA"
925 				       );
926 			}
927 
928 			if (cpu_stdext_feature2 != 0) {
929 				printf("\n  Structured Extended Features2=0x%b",
930 				    cpu_stdext_feature2,
931 				       "\020"
932 				       "\001PREFETCHWT1"
933 				       "\004PKU"
934 				       "\005OSPKE"
935 				       );
936 			}
937 
938 			if ((cpu_feature2 & CPUID2_XSAVE) != 0) {
939 				cpuid_count(0xd, 0x1, regs);
940 				if (regs[0] != 0) {
941 					printf("\n  XSAVE Features=0x%b",
942 					    regs[0],
943 					    "\020"
944 					    "\001XSAVEOPT"
945 					    "\002XSAVEC"
946 					    "\003XINUSE"
947 					    "\004XSAVES");
948 				}
949 			}
950 
951 			if (via_feature_rng != 0 || via_feature_xcrypt != 0)
952 				print_via_padlock_info();
953 
954 			if (cpu_feature2 & CPUID2_VMX)
955 				print_vmx_info();
956 
957 			if (amd_feature2 & AMDID2_SVM)
958 				print_svm_info();
959 
960 			if ((cpu_feature & CPUID_HTT) &&
961 			    cpu_vendor_id == CPU_VENDOR_AMD)
962 				cpu_feature &= ~CPUID_HTT;
963 
964 			/*
965 			 * If this CPU supports P-state invariant TSC then
966 			 * mention the capability.
967 			 */
968 			if (tsc_is_invariant) {
969 				printf("\n  TSC: P-state invariant");
970 				if (tsc_perf_stat)
971 					printf(", performance statistics");
972 			}
973 		}
974 #ifdef __i386__
975 	} else if (cpu_vendor_id == CPU_VENDOR_CYRIX) {
976 		printf("  DIR=0x%04x", cyrix_did);
977 		printf("  Stepping=%u", (cyrix_did & 0xf000) >> 12);
978 		printf("  Revision=%u", (cyrix_did & 0x0f00) >> 8);
979 #ifndef CYRIX_CACHE_REALLY_WORKS
980 		if (cpu == CPU_M1 && (cyrix_did & 0xff00) < 0x1700)
981 			printf("\n  CPU cache: write-through mode");
982 #endif
983 #endif
984 	}
985 
986 	/* Avoid ugly blank lines: only print newline when we have to. */
987 	if (*cpu_vendor || cpu_id)
988 		printf("\n");
989 
990 	if (bootverbose) {
991 		if (cpu_vendor_id == CPU_VENDOR_AMD)
992 			print_AMD_info();
993 		else if (cpu_vendor_id == CPU_VENDOR_INTEL)
994 			print_INTEL_info();
995 #ifdef __i386__
996 		else if (cpu_vendor_id == CPU_VENDOR_TRANSMETA)
997 			print_transmeta_info();
998 #endif
999 	}
1000 
1001 	print_hypervisor_info();
1002 }
1003 
1004 void
1005 panicifcpuunsupported(void)
1006 {
1007 
1008 #ifdef __i386__
1009 #if !defined(lint)
1010 #if !defined(I486_CPU) && !defined(I586_CPU) && !defined(I686_CPU)
1011 #error This kernel is not configured for one of the supported CPUs
1012 #endif
1013 #else /* lint */
1014 #endif /* lint */
1015 #else /* __amd64__ */
1016 #ifndef HAMMER
1017 #error "You need to specify a cpu type"
1018 #endif
1019 #endif
1020 	/*
1021 	 * Now that we have told the user what they have,
1022 	 * let them know if that machine type isn't configured.
1023 	 */
1024 	switch (cpu_class) {
1025 #ifdef __i386__
1026 	case CPUCLASS_286:	/* a 286 should not make it this far, anyway */
1027 	case CPUCLASS_386:
1028 #if !defined(I486_CPU)
1029 	case CPUCLASS_486:
1030 #endif
1031 #if !defined(I586_CPU)
1032 	case CPUCLASS_586:
1033 #endif
1034 #if !defined(I686_CPU)
1035 	case CPUCLASS_686:
1036 #endif
1037 #else /* __amd64__ */
1038 	case CPUCLASS_X86:
1039 #ifndef HAMMER
1040 	case CPUCLASS_K8:
1041 #endif
1042 #endif
1043 		panic("CPU class not configured");
1044 	default:
1045 		break;
1046 	}
1047 }
1048 
1049 #ifdef __i386__
1050 static	volatile u_int trap_by_rdmsr;
1051 
1052 /*
1053  * Special exception 6 handler.
1054  * The rdmsr instruction generates invalid opcodes fault on 486-class
1055  * Cyrix CPU.  Stacked eip register points the rdmsr instruction in the
1056  * function identblue() when this handler is called.  Stacked eip should
1057  * be advanced.
1058  */
1059 inthand_t	bluetrap6;
1060 #ifdef __GNUCLIKE_ASM
1061 __asm
1062 ("									\n\
1063 	.text								\n\
1064 	.p2align 2,0x90							\n\
1065 	.type	" __XSTRING(CNAME(bluetrap6)) ",@function		\n\
1066 " __XSTRING(CNAME(bluetrap6)) ":					\n\
1067 	ss								\n\
1068 	movl	$0xa8c1d," __XSTRING(CNAME(trap_by_rdmsr)) "		\n\
1069 	addl	$2, (%esp)	/* rdmsr is a 2-byte instruction */	\n\
1070 	iret								\n\
1071 ");
1072 #endif
1073 
1074 /*
1075  * Special exception 13 handler.
1076  * Accessing non-existent MSR generates general protection fault.
1077  */
1078 inthand_t	bluetrap13;
1079 #ifdef __GNUCLIKE_ASM
1080 __asm
1081 ("									\n\
1082 	.text								\n\
1083 	.p2align 2,0x90							\n\
1084 	.type	" __XSTRING(CNAME(bluetrap13)) ",@function		\n\
1085 " __XSTRING(CNAME(bluetrap13)) ":					\n\
1086 	ss								\n\
1087 	movl	$0xa89c4," __XSTRING(CNAME(trap_by_rdmsr)) "		\n\
1088 	popl	%eax		/* discard error code */		\n\
1089 	addl	$2, (%esp)	/* rdmsr is a 2-byte instruction */	\n\
1090 	iret								\n\
1091 ");
1092 #endif
1093 
1094 /*
1095  * Distinguish IBM Blue Lightning CPU from Cyrix CPUs that does not
1096  * support cpuid instruction.  This function should be called after
1097  * loading interrupt descriptor table register.
1098  *
1099  * I don't like this method that handles fault, but I couldn't get
1100  * information for any other methods.  Does blue giant know?
1101  */
1102 static int
1103 identblue(void)
1104 {
1105 
1106 	trap_by_rdmsr = 0;
1107 
1108 	/*
1109 	 * Cyrix 486-class CPU does not support rdmsr instruction.
1110 	 * The rdmsr instruction generates invalid opcode fault, and exception
1111 	 * will be trapped by bluetrap6() on Cyrix 486-class CPU.  The
1112 	 * bluetrap6() set the magic number to trap_by_rdmsr.
1113 	 */
1114 	setidt(IDT_UD, bluetrap6, SDT_SYS386TGT, SEL_KPL,
1115 	    GSEL(GCODE_SEL, SEL_KPL));
1116 
1117 	/*
1118 	 * Certain BIOS disables cpuid instruction of Cyrix 6x86MX CPU.
1119 	 * In this case, rdmsr generates general protection fault, and
1120 	 * exception will be trapped by bluetrap13().
1121 	 */
1122 	setidt(IDT_GP, bluetrap13, SDT_SYS386TGT, SEL_KPL,
1123 	    GSEL(GCODE_SEL, SEL_KPL));
1124 
1125 	rdmsr(0x1002);		/* Cyrix CPU generates fault. */
1126 
1127 	if (trap_by_rdmsr == 0xa8c1d)
1128 		return IDENTBLUE_CYRIX486;
1129 	else if (trap_by_rdmsr == 0xa89c4)
1130 		return IDENTBLUE_CYRIXM2;
1131 	return IDENTBLUE_IBMCPU;
1132 }
1133 
1134 
1135 /*
1136  * identifycyrix() set lower 16 bits of cyrix_did as follows:
1137  *
1138  *  F E D C B A 9 8 7 6 5 4 3 2 1 0
1139  * +-------+-------+---------------+
1140  * |  SID  |  RID  |   Device ID   |
1141  * |    (DIR 1)    |    (DIR 0)    |
1142  * +-------+-------+---------------+
1143  */
1144 static void
1145 identifycyrix(void)
1146 {
1147 	register_t saveintr;
1148 	int	ccr2_test = 0, dir_test = 0;
1149 	u_char	ccr2, ccr3;
1150 
1151 	saveintr = intr_disable();
1152 
1153 	ccr2 = read_cyrix_reg(CCR2);
1154 	write_cyrix_reg(CCR2, ccr2 ^ CCR2_LOCK_NW);
1155 	read_cyrix_reg(CCR2);
1156 	if (read_cyrix_reg(CCR2) != ccr2)
1157 		ccr2_test = 1;
1158 	write_cyrix_reg(CCR2, ccr2);
1159 
1160 	ccr3 = read_cyrix_reg(CCR3);
1161 	write_cyrix_reg(CCR3, ccr3 ^ CCR3_MAPEN3);
1162 	read_cyrix_reg(CCR3);
1163 	if (read_cyrix_reg(CCR3) != ccr3)
1164 		dir_test = 1;					/* CPU supports DIRs. */
1165 	write_cyrix_reg(CCR3, ccr3);
1166 
1167 	if (dir_test) {
1168 		/* Device ID registers are available. */
1169 		cyrix_did = read_cyrix_reg(DIR1) << 8;
1170 		cyrix_did += read_cyrix_reg(DIR0);
1171 	} else if (ccr2_test)
1172 		cyrix_did = 0x0010;		/* 486S A-step */
1173 	else
1174 		cyrix_did = 0x00ff;		/* Old 486SLC/DLC and TI486SXLC/SXL */
1175 
1176 	intr_restore(saveintr);
1177 }
1178 #endif
1179 
1180 /* Update TSC freq with the value indicated by the caller. */
1181 static void
1182 tsc_freq_changed(void *arg __unused, const struct cf_level *level, int status)
1183 {
1184 
1185 	/* If there was an error during the transition, don't do anything. */
1186 	if (status != 0)
1187 		return;
1188 
1189 	/* Total setting for this level gives the new frequency in MHz. */
1190 	hw_clockrate = level->total_set.freq;
1191 }
1192 
1193 static void
1194 hook_tsc_freq(void *arg __unused)
1195 {
1196 
1197 	if (tsc_is_invariant)
1198 		return;
1199 
1200 	tsc_post_tag = EVENTHANDLER_REGISTER(cpufreq_post_change,
1201 	    tsc_freq_changed, NULL, EVENTHANDLER_PRI_ANY);
1202 }
1203 
1204 SYSINIT(hook_tsc_freq, SI_SUB_CONFIGURE, SI_ORDER_ANY, hook_tsc_freq, NULL);
1205 
1206 static const char *const vm_bnames[] = {
1207 	"QEMU",				/* QEMU */
1208 	"Plex86",			/* Plex86 */
1209 	"Bochs",			/* Bochs */
1210 	"Xen",				/* Xen */
1211 	"BHYVE",			/* bhyve */
1212 	"Seabios",			/* KVM */
1213 	NULL
1214 };
1215 
1216 static const char *const vm_pnames[] = {
1217 	"VMware Virtual Platform",	/* VMWare VM */
1218 	"Virtual Machine",		/* Microsoft VirtualPC */
1219 	"VirtualBox",			/* Sun xVM VirtualBox */
1220 	"Parallels Virtual Platform",	/* Parallels VM */
1221 	"KVM",				/* KVM */
1222 	NULL
1223 };
1224 
1225 static void
1226 identify_hypervisor(void)
1227 {
1228 	u_int regs[4];
1229 	char *p;
1230 	int i;
1231 
1232 	/*
1233 	 * [RFC] CPUID usage for interaction between Hypervisors and Linux.
1234 	 * http://lkml.org/lkml/2008/10/1/246
1235 	 *
1236 	 * KB1009458: Mechanisms to determine if software is running in
1237 	 * a VMware virtual machine
1238 	 * http://kb.vmware.com/kb/1009458
1239 	 */
1240 	if (cpu_feature2 & CPUID2_HV) {
1241 		vm_guest = VM_GUEST_VM;
1242 		do_cpuid(0x40000000, regs);
1243 		if (regs[0] >= 0x40000000) {
1244 			hv_high = regs[0];
1245 			((u_int *)&hv_vendor)[0] = regs[1];
1246 			((u_int *)&hv_vendor)[1] = regs[2];
1247 			((u_int *)&hv_vendor)[2] = regs[3];
1248 			hv_vendor[12] = '\0';
1249 			if (strcmp(hv_vendor, "VMwareVMware") == 0)
1250 				vm_guest = VM_GUEST_VMWARE;
1251 		}
1252 		return;
1253 	}
1254 
1255 	/*
1256 	 * Examine SMBIOS strings for older hypervisors.
1257 	 */
1258 	p = kern_getenv("smbios.system.serial");
1259 	if (p != NULL) {
1260 		if (strncmp(p, "VMware-", 7) == 0 || strncmp(p, "VMW", 3) == 0) {
1261 			vmware_hvcall(VMW_HVCMD_GETVERSION, regs);
1262 			if (regs[1] == VMW_HVMAGIC) {
1263 				vm_guest = VM_GUEST_VMWARE;
1264 				freeenv(p);
1265 				return;
1266 			}
1267 		}
1268 		freeenv(p);
1269 	}
1270 
1271 	/*
1272 	 * XXX: Some of these entries may not be needed since they were
1273 	 * added to FreeBSD before the checks above.
1274 	 */
1275 	p = kern_getenv("smbios.bios.vendor");
1276 	if (p != NULL) {
1277 		for (i = 0; vm_bnames[i] != NULL; i++)
1278 			if (strcmp(p, vm_bnames[i]) == 0) {
1279 				vm_guest = VM_GUEST_VM;
1280 				freeenv(p);
1281 				return;
1282 			}
1283 		freeenv(p);
1284 	}
1285 	p = kern_getenv("smbios.system.product");
1286 	if (p != NULL) {
1287 		for (i = 0; vm_pnames[i] != NULL; i++)
1288 			if (strcmp(p, vm_pnames[i]) == 0) {
1289 				vm_guest = VM_GUEST_VM;
1290 				freeenv(p);
1291 				return;
1292 			}
1293 		freeenv(p);
1294 	}
1295 }
1296 
1297 /*
1298  * Clear "Limit CPUID Maxval" bit and return true if the caller should
1299  * get the largest standard CPUID function number again if it is set
1300  * from BIOS.  It is necessary for probing correct CPU topology later
1301  * and for the correct operation of the AVX-aware userspace.
1302  */
1303 bool
1304 intel_fix_cpuid(void)
1305 {
1306 	uint64_t msr;
1307 
1308 	if (cpu_vendor_id != CPU_VENDOR_INTEL)
1309 		return (false);
1310 	if ((CPUID_TO_FAMILY(cpu_id) == 0xf &&
1311 	    CPUID_TO_MODEL(cpu_id) >= 0x3) ||
1312 	    (CPUID_TO_FAMILY(cpu_id) == 0x6 &&
1313 	    CPUID_TO_MODEL(cpu_id) >= 0xe)) {
1314 		msr = rdmsr(MSR_IA32_MISC_ENABLE);
1315 		if ((msr & IA32_MISC_EN_LIMCPUID) != 0) {
1316 			msr &= ~IA32_MISC_EN_LIMCPUID;
1317 			wrmsr(MSR_IA32_MISC_ENABLE, msr);
1318 			return (true);
1319 		}
1320 	}
1321 	return (false);
1322 }
1323 
1324 /*
1325  * Final stage of CPU identification.
1326  */
1327 #ifdef __i386__
1328 void
1329 finishidentcpu(void)
1330 #else
1331 void
1332 identify_cpu(void)
1333 #endif
1334 {
1335 	u_int regs[4], cpu_stdext_disable;
1336 #ifdef __i386__
1337 	u_char ccr3;
1338 #endif
1339 
1340 #ifdef __amd64__
1341 	do_cpuid(0, regs);
1342 	cpu_high = regs[0];
1343 	((u_int *)&cpu_vendor)[0] = regs[1];
1344 	((u_int *)&cpu_vendor)[1] = regs[3];
1345 	((u_int *)&cpu_vendor)[2] = regs[2];
1346 	cpu_vendor[12] = '\0';
1347 
1348 	do_cpuid(1, regs);
1349 	cpu_id = regs[0];
1350 	cpu_procinfo = regs[1];
1351 	cpu_feature = regs[3];
1352 	cpu_feature2 = regs[2];
1353 #endif
1354 
1355 	identify_hypervisor();
1356 	cpu_vendor_id = find_cpu_vendor_id();
1357 
1358 	if (intel_fix_cpuid()) {
1359 		do_cpuid(0, regs);
1360 		cpu_high = regs[0];
1361 	}
1362 
1363 	if (cpu_high >= 5 && (cpu_feature2 & CPUID2_MON) != 0) {
1364 		do_cpuid(5, regs);
1365 		cpu_mon_mwait_flags = regs[2];
1366 		cpu_mon_min_size = regs[0] &  CPUID5_MON_MIN_SIZE;
1367 		cpu_mon_max_size = regs[1] &  CPUID5_MON_MAX_SIZE;
1368 	}
1369 
1370 	if (cpu_high >= 7) {
1371 		cpuid_count(7, 0, regs);
1372 		cpu_stdext_feature = regs[1];
1373 
1374 		/*
1375 		 * Some hypervisors fail to filter out unsupported
1376 		 * extended features.  For now, disable the
1377 		 * extensions, activation of which requires setting a
1378 		 * bit in CR4, and which VM monitors do not support.
1379 		 */
1380 		if (cpu_feature2 & CPUID2_HV) {
1381 			cpu_stdext_disable = CPUID_STDEXT_FSGSBASE |
1382 			    CPUID_STDEXT_SMEP;
1383 		} else
1384 			cpu_stdext_disable = 0;
1385 		TUNABLE_INT_FETCH("hw.cpu_stdext_disable", &cpu_stdext_disable);
1386 		cpu_stdext_feature &= ~cpu_stdext_disable;
1387 		cpu_stdext_feature2 = regs[2];
1388 	}
1389 
1390 #ifdef __i386__
1391 	if (cpu_high > 0 &&
1392 	    (cpu_vendor_id == CPU_VENDOR_INTEL ||
1393 	     cpu_vendor_id == CPU_VENDOR_AMD ||
1394 	     cpu_vendor_id == CPU_VENDOR_TRANSMETA ||
1395 	     cpu_vendor_id == CPU_VENDOR_CENTAUR ||
1396 	     cpu_vendor_id == CPU_VENDOR_NSC)) {
1397 		do_cpuid(0x80000000, regs);
1398 		if (regs[0] >= 0x80000000)
1399 			cpu_exthigh = regs[0];
1400 	}
1401 #else
1402 	if (cpu_vendor_id == CPU_VENDOR_INTEL ||
1403 	    cpu_vendor_id == CPU_VENDOR_AMD ||
1404 	    cpu_vendor_id == CPU_VENDOR_CENTAUR) {
1405 		do_cpuid(0x80000000, regs);
1406 		cpu_exthigh = regs[0];
1407 	}
1408 #endif
1409 	if (cpu_exthigh >= 0x80000001) {
1410 		do_cpuid(0x80000001, regs);
1411 		amd_feature = regs[3] & ~(cpu_feature & 0x0183f3ff);
1412 		amd_feature2 = regs[2];
1413 	}
1414 	if (cpu_exthigh >= 0x80000007) {
1415 		do_cpuid(0x80000007, regs);
1416 		amd_pminfo = regs[3];
1417 	}
1418 	if (cpu_exthigh >= 0x80000008) {
1419 		do_cpuid(0x80000008, regs);
1420 		cpu_maxphyaddr = regs[0] & 0xff;
1421 		cpu_procinfo2 = regs[2];
1422 	} else {
1423 		cpu_maxphyaddr = (cpu_feature & CPUID_PAE) != 0 ? 36 : 32;
1424 	}
1425 
1426 #ifdef __i386__
1427 	if (cpu_vendor_id == CPU_VENDOR_CYRIX) {
1428 		if (cpu == CPU_486) {
1429 			/*
1430 			 * These conditions are equivalent to:
1431 			 *     - CPU does not support cpuid instruction.
1432 			 *     - Cyrix/IBM CPU is detected.
1433 			 */
1434 			if (identblue() == IDENTBLUE_IBMCPU) {
1435 				strcpy(cpu_vendor, "IBM");
1436 				cpu_vendor_id = CPU_VENDOR_IBM;
1437 				cpu = CPU_BLUE;
1438 				return;
1439 			}
1440 		}
1441 		switch (cpu_id & 0xf00) {
1442 		case 0x600:
1443 			/*
1444 			 * Cyrix's datasheet does not describe DIRs.
1445 			 * Therefor, I assume it does not have them
1446 			 * and use the result of the cpuid instruction.
1447 			 * XXX they seem to have it for now at least. -Peter
1448 			 */
1449 			identifycyrix();
1450 			cpu = CPU_M2;
1451 			break;
1452 		default:
1453 			identifycyrix();
1454 			/*
1455 			 * This routine contains a trick.
1456 			 * Don't check (cpu_id & 0x00f0) == 0x50 to detect M2, now.
1457 			 */
1458 			switch (cyrix_did & 0x00f0) {
1459 			case 0x00:
1460 			case 0xf0:
1461 				cpu = CPU_486DLC;
1462 				break;
1463 			case 0x10:
1464 				cpu = CPU_CY486DX;
1465 				break;
1466 			case 0x20:
1467 				if ((cyrix_did & 0x000f) < 8)
1468 					cpu = CPU_M1;
1469 				else
1470 					cpu = CPU_M1SC;
1471 				break;
1472 			case 0x30:
1473 				cpu = CPU_M1;
1474 				break;
1475 			case 0x40:
1476 				/* MediaGX CPU */
1477 				cpu = CPU_M1SC;
1478 				break;
1479 			default:
1480 				/* M2 and later CPUs are treated as M2. */
1481 				cpu = CPU_M2;
1482 
1483 				/*
1484 				 * enable cpuid instruction.
1485 				 */
1486 				ccr3 = read_cyrix_reg(CCR3);
1487 				write_cyrix_reg(CCR3, CCR3_MAPEN0);
1488 				write_cyrix_reg(CCR4, read_cyrix_reg(CCR4) | CCR4_CPUID);
1489 				write_cyrix_reg(CCR3, ccr3);
1490 
1491 				do_cpuid(0, regs);
1492 				cpu_high = regs[0];	/* eax */
1493 				do_cpuid(1, regs);
1494 				cpu_id = regs[0];	/* eax */
1495 				cpu_feature = regs[3];	/* edx */
1496 				break;
1497 			}
1498 		}
1499 	} else if (cpu == CPU_486 && *cpu_vendor == '\0') {
1500 		/*
1501 		 * There are BlueLightning CPUs that do not change
1502 		 * undefined flags by dividing 5 by 2.  In this case,
1503 		 * the CPU identification routine in locore.s leaves
1504 		 * cpu_vendor null string and puts CPU_486 into the
1505 		 * cpu.
1506 		 */
1507 		if (identblue() == IDENTBLUE_IBMCPU) {
1508 			strcpy(cpu_vendor, "IBM");
1509 			cpu_vendor_id = CPU_VENDOR_IBM;
1510 			cpu = CPU_BLUE;
1511 			return;
1512 		}
1513 	}
1514 #else
1515 	/* XXX */
1516 	cpu = CPU_CLAWHAMMER;
1517 #endif
1518 }
1519 
1520 static u_int
1521 find_cpu_vendor_id(void)
1522 {
1523 	int	i;
1524 
1525 	for (i = 0; i < sizeof(cpu_vendors) / sizeof(cpu_vendors[0]); i++)
1526 		if (strcmp(cpu_vendor, cpu_vendors[i].vendor) == 0)
1527 			return (cpu_vendors[i].vendor_id);
1528 	return (0);
1529 }
1530 
1531 static void
1532 print_AMD_assoc(int i)
1533 {
1534 	if (i == 255)
1535 		printf(", fully associative\n");
1536 	else
1537 		printf(", %d-way associative\n", i);
1538 }
1539 
1540 static void
1541 print_AMD_l2_assoc(int i)
1542 {
1543 	switch (i & 0x0f) {
1544 	case 0: printf(", disabled/not present\n"); break;
1545 	case 1: printf(", direct mapped\n"); break;
1546 	case 2: printf(", 2-way associative\n"); break;
1547 	case 4: printf(", 4-way associative\n"); break;
1548 	case 6: printf(", 8-way associative\n"); break;
1549 	case 8: printf(", 16-way associative\n"); break;
1550 	case 15: printf(", fully associative\n"); break;
1551 	default: printf(", reserved configuration\n"); break;
1552 	}
1553 }
1554 
1555 static void
1556 print_AMD_info(void)
1557 {
1558 #ifdef __i386__
1559 	uint64_t amd_whcr;
1560 #endif
1561 	u_int regs[4];
1562 
1563 	if (cpu_exthigh >= 0x80000005) {
1564 		do_cpuid(0x80000005, regs);
1565 		printf("L1 2MB data TLB: %d entries", (regs[0] >> 16) & 0xff);
1566 		print_AMD_assoc(regs[0] >> 24);
1567 
1568 		printf("L1 2MB instruction TLB: %d entries", regs[0] & 0xff);
1569 		print_AMD_assoc((regs[0] >> 8) & 0xff);
1570 
1571 		printf("L1 4KB data TLB: %d entries", (regs[1] >> 16) & 0xff);
1572 		print_AMD_assoc(regs[1] >> 24);
1573 
1574 		printf("L1 4KB instruction TLB: %d entries", regs[1] & 0xff);
1575 		print_AMD_assoc((regs[1] >> 8) & 0xff);
1576 
1577 		printf("L1 data cache: %d kbytes", regs[2] >> 24);
1578 		printf(", %d bytes/line", regs[2] & 0xff);
1579 		printf(", %d lines/tag", (regs[2] >> 8) & 0xff);
1580 		print_AMD_assoc((regs[2] >> 16) & 0xff);
1581 
1582 		printf("L1 instruction cache: %d kbytes", regs[3] >> 24);
1583 		printf(", %d bytes/line", regs[3] & 0xff);
1584 		printf(", %d lines/tag", (regs[3] >> 8) & 0xff);
1585 		print_AMD_assoc((regs[3] >> 16) & 0xff);
1586 	}
1587 
1588 	if (cpu_exthigh >= 0x80000006) {
1589 		do_cpuid(0x80000006, regs);
1590 		if ((regs[0] >> 16) != 0) {
1591 			printf("L2 2MB data TLB: %d entries",
1592 			    (regs[0] >> 16) & 0xfff);
1593 			print_AMD_l2_assoc(regs[0] >> 28);
1594 			printf("L2 2MB instruction TLB: %d entries",
1595 			    regs[0] & 0xfff);
1596 			print_AMD_l2_assoc((regs[0] >> 28) & 0xf);
1597 		} else {
1598 			printf("L2 2MB unified TLB: %d entries",
1599 			    regs[0] & 0xfff);
1600 			print_AMD_l2_assoc((regs[0] >> 28) & 0xf);
1601 		}
1602 		if ((regs[1] >> 16) != 0) {
1603 			printf("L2 4KB data TLB: %d entries",
1604 			    (regs[1] >> 16) & 0xfff);
1605 			print_AMD_l2_assoc(regs[1] >> 28);
1606 
1607 			printf("L2 4KB instruction TLB: %d entries",
1608 			    (regs[1] >> 16) & 0xfff);
1609 			print_AMD_l2_assoc((regs[1] >> 28) & 0xf);
1610 		} else {
1611 			printf("L2 4KB unified TLB: %d entries",
1612 			    (regs[1] >> 16) & 0xfff);
1613 			print_AMD_l2_assoc((regs[1] >> 28) & 0xf);
1614 		}
1615 		printf("L2 unified cache: %d kbytes", regs[2] >> 16);
1616 		printf(", %d bytes/line", regs[2] & 0xff);
1617 		printf(", %d lines/tag", (regs[2] >> 8) & 0x0f);
1618 		print_AMD_l2_assoc((regs[2] >> 12) & 0x0f);
1619 	}
1620 
1621 #ifdef __i386__
1622 	if (((cpu_id & 0xf00) == 0x500)
1623 	    && (((cpu_id & 0x0f0) > 0x80)
1624 		|| (((cpu_id & 0x0f0) == 0x80)
1625 		    && (cpu_id & 0x00f) > 0x07))) {
1626 		/* K6-2(new core [Stepping 8-F]), K6-III or later */
1627 		amd_whcr = rdmsr(0xc0000082);
1628 		if (!(amd_whcr & (0x3ff << 22))) {
1629 			printf("Write Allocate Disable\n");
1630 		} else {
1631 			printf("Write Allocate Enable Limit: %dM bytes\n",
1632 			    (u_int32_t)((amd_whcr & (0x3ff << 22)) >> 22) * 4);
1633 			printf("Write Allocate 15-16M bytes: %s\n",
1634 			    (amd_whcr & (1 << 16)) ? "Enable" : "Disable");
1635 		}
1636 	} else if (((cpu_id & 0xf00) == 0x500)
1637 		   && ((cpu_id & 0x0f0) > 0x50)) {
1638 		/* K6, K6-2(old core) */
1639 		amd_whcr = rdmsr(0xc0000082);
1640 		if (!(amd_whcr & (0x7f << 1))) {
1641 			printf("Write Allocate Disable\n");
1642 		} else {
1643 			printf("Write Allocate Enable Limit: %dM bytes\n",
1644 			    (u_int32_t)((amd_whcr & (0x7f << 1)) >> 1) * 4);
1645 			printf("Write Allocate 15-16M bytes: %s\n",
1646 			    (amd_whcr & 0x0001) ? "Enable" : "Disable");
1647 			printf("Hardware Write Allocate Control: %s\n",
1648 			    (amd_whcr & 0x0100) ? "Enable" : "Disable");
1649 		}
1650 	}
1651 #endif
1652 	/*
1653 	 * Opteron Rev E shows a bug as in very rare occasions a read memory
1654 	 * barrier is not performed as expected if it is followed by a
1655 	 * non-atomic read-modify-write instruction.
1656 	 * As long as that bug pops up very rarely (intensive machine usage
1657 	 * on other operating systems generally generates one unexplainable
1658 	 * crash any 2 months) and as long as a model specific fix would be
1659 	 * impratical at this stage, print out a warning string if the broken
1660 	 * model and family are identified.
1661 	 */
1662 	if (CPUID_TO_FAMILY(cpu_id) == 0xf && CPUID_TO_MODEL(cpu_id) >= 0x20 &&
1663 	    CPUID_TO_MODEL(cpu_id) <= 0x3f)
1664 		printf("WARNING: This architecture revision has known SMP "
1665 		    "hardware bugs which may cause random instability\n");
1666 }
1667 
1668 static void
1669 print_INTEL_info(void)
1670 {
1671 	u_int regs[4];
1672 	u_int rounds, regnum;
1673 	u_int nwaycode, nway;
1674 
1675 	if (cpu_high >= 2) {
1676 		rounds = 0;
1677 		do {
1678 			do_cpuid(0x2, regs);
1679 			if (rounds == 0 && (rounds = (regs[0] & 0xff)) == 0)
1680 				break;	/* we have a buggy CPU */
1681 
1682 			for (regnum = 0; regnum <= 3; ++regnum) {
1683 				if (regs[regnum] & (1<<31))
1684 					continue;
1685 				if (regnum != 0)
1686 					print_INTEL_TLB(regs[regnum] & 0xff);
1687 				print_INTEL_TLB((regs[regnum] >> 8) & 0xff);
1688 				print_INTEL_TLB((regs[regnum] >> 16) & 0xff);
1689 				print_INTEL_TLB((regs[regnum] >> 24) & 0xff);
1690 			}
1691 		} while (--rounds > 0);
1692 	}
1693 
1694 	if (cpu_exthigh >= 0x80000006) {
1695 		do_cpuid(0x80000006, regs);
1696 		nwaycode = (regs[2] >> 12) & 0x0f;
1697 		if (nwaycode >= 0x02 && nwaycode <= 0x08)
1698 			nway = 1 << (nwaycode / 2);
1699 		else
1700 			nway = 0;
1701 		printf("L2 cache: %u kbytes, %u-way associative, %u bytes/line\n",
1702 		    (regs[2] >> 16) & 0xffff, nway, regs[2] & 0xff);
1703 	}
1704 }
1705 
1706 static void
1707 print_INTEL_TLB(u_int data)
1708 {
1709 	switch (data) {
1710 	case 0x0:
1711 	case 0x40:
1712 	default:
1713 		break;
1714 	case 0x1:
1715 		printf("Instruction TLB: 4 KB pages, 4-way set associative, 32 entries\n");
1716 		break;
1717 	case 0x2:
1718 		printf("Instruction TLB: 4 MB pages, fully associative, 2 entries\n");
1719 		break;
1720 	case 0x3:
1721 		printf("Data TLB: 4 KB pages, 4-way set associative, 64 entries\n");
1722 		break;
1723 	case 0x4:
1724 		printf("Data TLB: 4 MB Pages, 4-way set associative, 8 entries\n");
1725 		break;
1726 	case 0x6:
1727 		printf("1st-level instruction cache: 8 KB, 4-way set associative, 32 byte line size\n");
1728 		break;
1729 	case 0x8:
1730 		printf("1st-level instruction cache: 16 KB, 4-way set associative, 32 byte line size\n");
1731 		break;
1732 	case 0x9:
1733 		printf("1st-level instruction cache: 32 KB, 4-way set associative, 64 byte line size\n");
1734 		break;
1735 	case 0xa:
1736 		printf("1st-level data cache: 8 KB, 2-way set associative, 32 byte line size\n");
1737 		break;
1738 	case 0xb:
1739 		printf("Instruction TLB: 4 MByte pages, 4-way set associative, 4 entries\n");
1740 		break;
1741 	case 0xc:
1742 		printf("1st-level data cache: 16 KB, 4-way set associative, 32 byte line size\n");
1743 		break;
1744 	case 0xd:
1745 		printf("1st-level data cache: 16 KBytes, 4-way set associative, 64 byte line size");
1746 		break;
1747 	case 0xe:
1748 		printf("1st-level data cache: 24 KBytes, 6-way set associative, 64 byte line size\n");
1749 		break;
1750 	case 0x1d:
1751 		printf("2nd-level cache: 128 KBytes, 2-way set associative, 64 byte line size\n");
1752 		break;
1753 	case 0x21:
1754 		printf("2nd-level cache: 256 KBytes, 8-way set associative, 64 byte line size\n");
1755 		break;
1756 	case 0x22:
1757 		printf("3rd-level cache: 512 KB, 4-way set associative, sectored cache, 64 byte line size\n");
1758 		break;
1759 	case 0x23:
1760 		printf("3rd-level cache: 1 MB, 8-way set associative, sectored cache, 64 byte line size\n");
1761 		break;
1762 	case 0x24:
1763 		printf("2nd-level cache: 1 MBytes, 16-way set associative, 64 byte line size\n");
1764 		break;
1765 	case 0x25:
1766 		printf("3rd-level cache: 2 MB, 8-way set associative, sectored cache, 64 byte line size\n");
1767 		break;
1768 	case 0x29:
1769 		printf("3rd-level cache: 4 MB, 8-way set associative, sectored cache, 64 byte line size\n");
1770 		break;
1771 	case 0x2c:
1772 		printf("1st-level data cache: 32 KB, 8-way set associative, 64 byte line size\n");
1773 		break;
1774 	case 0x30:
1775 		printf("1st-level instruction cache: 32 KB, 8-way set associative, 64 byte line size\n");
1776 		break;
1777 	case 0x39: /* De-listed in SDM rev. 54 */
1778 		printf("2nd-level cache: 128 KB, 4-way set associative, sectored cache, 64 byte line size\n");
1779 		break;
1780 	case 0x3b: /* De-listed in SDM rev. 54 */
1781 		printf("2nd-level cache: 128 KB, 2-way set associative, sectored cache, 64 byte line size\n");
1782 		break;
1783 	case 0x3c: /* De-listed in SDM rev. 54 */
1784 		printf("2nd-level cache: 256 KB, 4-way set associative, sectored cache, 64 byte line size\n");
1785 		break;
1786 	case 0x41:
1787 		printf("2nd-level cache: 128 KB, 4-way set associative, 32 byte line size\n");
1788 		break;
1789 	case 0x42:
1790 		printf("2nd-level cache: 256 KB, 4-way set associative, 32 byte line size\n");
1791 		break;
1792 	case 0x43:
1793 		printf("2nd-level cache: 512 KB, 4-way set associative, 32 byte line size\n");
1794 		break;
1795 	case 0x44:
1796 		printf("2nd-level cache: 1 MB, 4-way set associative, 32 byte line size\n");
1797 		break;
1798 	case 0x45:
1799 		printf("2nd-level cache: 2 MB, 4-way set associative, 32 byte line size\n");
1800 		break;
1801 	case 0x46:
1802 		printf("3rd-level cache: 4 MB, 4-way set associative, 64 byte line size\n");
1803 		break;
1804 	case 0x47:
1805 		printf("3rd-level cache: 8 MB, 8-way set associative, 64 byte line size\n");
1806 		break;
1807 	case 0x48:
1808 		printf("2nd-level cache: 3MByte, 12-way set associative, 64 byte line size\n");
1809 		break;
1810 	case 0x49:
1811 		if (CPUID_TO_FAMILY(cpu_id) == 0xf &&
1812 		    CPUID_TO_MODEL(cpu_id) == 0x6)
1813 			printf("3rd-level cache: 4MB, 16-way set associative, 64-byte line size\n");
1814 		else
1815 			printf("2nd-level cache: 4 MByte, 16-way set associative, 64 byte line size");
1816 		break;
1817 	case 0x4a:
1818 		printf("3rd-level cache: 6MByte, 12-way set associative, 64 byte line size\n");
1819 		break;
1820 	case 0x4b:
1821 		printf("3rd-level cache: 8MByte, 16-way set associative, 64 byte line size\n");
1822 		break;
1823 	case 0x4c:
1824 		printf("3rd-level cache: 12MByte, 12-way set associative, 64 byte line size\n");
1825 		break;
1826 	case 0x4d:
1827 		printf("3rd-level cache: 16MByte, 16-way set associative, 64 byte line size\n");
1828 		break;
1829 	case 0x4e:
1830 		printf("2nd-level cache: 6MByte, 24-way set associative, 64 byte line size\n");
1831 		break;
1832 	case 0x4f:
1833 		printf("Instruction TLB: 4 KByte pages, 32 entries\n");
1834 		break;
1835 	case 0x50:
1836 		printf("Instruction TLB: 4 KB, 2 MB or 4 MB pages, fully associative, 64 entries\n");
1837 		break;
1838 	case 0x51:
1839 		printf("Instruction TLB: 4 KB, 2 MB or 4 MB pages, fully associative, 128 entries\n");
1840 		break;
1841 	case 0x52:
1842 		printf("Instruction TLB: 4 KB, 2 MB or 4 MB pages, fully associative, 256 entries\n");
1843 		break;
1844 	case 0x55:
1845 		printf("Instruction TLB: 2-MByte or 4-MByte pages, fully associative, 7 entries\n");
1846 		break;
1847 	case 0x56:
1848 		printf("Data TLB0: 4 MByte pages, 4-way set associative, 16 entries\n");
1849 		break;
1850 	case 0x57:
1851 		printf("Data TLB0: 4 KByte pages, 4-way associative, 16 entries\n");
1852 		break;
1853 	case 0x59:
1854 		printf("Data TLB0: 4 KByte pages, fully associative, 16 entries\n");
1855 		break;
1856 	case 0x5a:
1857 		printf("Data TLB0: 2-MByte or 4 MByte pages, 4-way set associative, 32 entries\n");
1858 		break;
1859 	case 0x5b:
1860 		printf("Data TLB: 4 KB or 4 MB pages, fully associative, 64 entries\n");
1861 		break;
1862 	case 0x5c:
1863 		printf("Data TLB: 4 KB or 4 MB pages, fully associative, 128 entries\n");
1864 		break;
1865 	case 0x5d:
1866 		printf("Data TLB: 4 KB or 4 MB pages, fully associative, 256 entries\n");
1867 		break;
1868 	case 0x60:
1869 		printf("1st-level data cache: 16 KB, 8-way set associative, sectored cache, 64 byte line size\n");
1870 		break;
1871 	case 0x61:
1872 		printf("Instruction TLB: 4 KByte pages, fully associative, 48 entries\n");
1873 		break;
1874 	case 0x63:
1875 		printf("Data TLB: 1 GByte pages, 4-way set associative, 4 entries\n");
1876 		break;
1877 	case 0x66:
1878 		printf("1st-level data cache: 8 KB, 4-way set associative, sectored cache, 64 byte line size\n");
1879 		break;
1880 	case 0x67:
1881 		printf("1st-level data cache: 16 KB, 4-way set associative, sectored cache, 64 byte line size\n");
1882 		break;
1883 	case 0x68:
1884 		printf("1st-level data cache: 32 KB, 4 way set associative, sectored cache, 64 byte line size\n");
1885 		break;
1886 	case 0x70:
1887 		printf("Trace cache: 12K-uops, 8-way set associative\n");
1888 		break;
1889 	case 0x71:
1890 		printf("Trace cache: 16K-uops, 8-way set associative\n");
1891 		break;
1892 	case 0x72:
1893 		printf("Trace cache: 32K-uops, 8-way set associative\n");
1894 		break;
1895 	case 0x76:
1896 		printf("Instruction TLB: 2M/4M pages, fully associative, 8 entries\n");
1897 		break;
1898 	case 0x78:
1899 		printf("2nd-level cache: 1 MB, 4-way set associative, 64-byte line size\n");
1900 		break;
1901 	case 0x79:
1902 		printf("2nd-level cache: 128 KB, 8-way set associative, sectored cache, 64 byte line size\n");
1903 		break;
1904 	case 0x7a:
1905 		printf("2nd-level cache: 256 KB, 8-way set associative, sectored cache, 64 byte line size\n");
1906 		break;
1907 	case 0x7b:
1908 		printf("2nd-level cache: 512 KB, 8-way set associative, sectored cache, 64 byte line size\n");
1909 		break;
1910 	case 0x7c:
1911 		printf("2nd-level cache: 1 MB, 8-way set associative, sectored cache, 64 byte line size\n");
1912 		break;
1913 	case 0x7d:
1914 		printf("2nd-level cache: 2-MB, 8-way set associative, 64-byte line size\n");
1915 		break;
1916 	case 0x7f:
1917 		printf("2nd-level cache: 512-KB, 2-way set associative, 64-byte line size\n");
1918 		break;
1919 	case 0x80:
1920 		printf("2nd-level cache: 512 KByte, 8-way set associative, 64-byte line size\n");
1921 		break;
1922 	case 0x82:
1923 		printf("2nd-level cache: 256 KB, 8-way set associative, 32 byte line size\n");
1924 		break;
1925 	case 0x83:
1926 		printf("2nd-level cache: 512 KB, 8-way set associative, 32 byte line size\n");
1927 		break;
1928 	case 0x84:
1929 		printf("2nd-level cache: 1 MB, 8-way set associative, 32 byte line size\n");
1930 		break;
1931 	case 0x85:
1932 		printf("2nd-level cache: 2 MB, 8-way set associative, 32 byte line size\n");
1933 		break;
1934 	case 0x86:
1935 		printf("2nd-level cache: 512 KB, 4-way set associative, 64 byte line size\n");
1936 		break;
1937 	case 0x87:
1938 		printf("2nd-level cache: 1 MB, 8-way set associative, 64 byte line size\n");
1939 		break;
1940 	case 0xa0:
1941 		printf("DTLB: 4k pages, fully associative, 32 entries\n");
1942 		break;
1943 	case 0xb0:
1944 		printf("Instruction TLB: 4 KB Pages, 4-way set associative, 128 entries\n");
1945 		break;
1946 	case 0xb1:
1947 		printf("Instruction TLB: 2M pages, 4-way, 8 entries or 4M pages, 4-way, 4 entries\n");
1948 		break;
1949 	case 0xb2:
1950 		printf("Instruction TLB: 4KByte pages, 4-way set associative, 64 entries\n");
1951 		break;
1952 	case 0xb3:
1953 		printf("Data TLB: 4 KB Pages, 4-way set associative, 128 entries\n");
1954 		break;
1955 	case 0xb4:
1956 		printf("Data TLB1: 4 KByte pages, 4-way associative, 256 entries\n");
1957 		break;
1958 	case 0xb5:
1959 		printf("Instruction TLB: 4KByte pages, 8-way set associative, 64 entries\n");
1960 		break;
1961 	case 0xb6:
1962 		printf("Instruction TLB: 4KByte pages, 8-way set associative, 128 entries\n");
1963 		break;
1964 	case 0xba:
1965 		printf("Data TLB1: 4 KByte pages, 4-way associative, 64 entries\n");
1966 		break;
1967 	case 0xc0:
1968 		printf("Data TLB: 4 KByte and 4 MByte pages, 4-way associative, 8 entries\n");
1969 		break;
1970 	case 0xc1:
1971 		printf("Shared 2nd-Level TLB: 4 KByte/2MByte pages, 8-way associative, 1024 entries\n");
1972 		break;
1973 	case 0xc2:
1974 		printf("DTLB: 4 KByte/2 MByte pages, 4-way associative, 16 entries\n");
1975 		break;
1976 	case 0xc3:
1977 		printf("Shared 2nd-Level TLB: 4 KByte /2 MByte pages, 6-way associative, 1536 entries. Also 1GBbyte pages, 4-way, 16 entries\n");
1978 		break;
1979 	case 0xca:
1980 		printf("Shared 2nd-Level TLB: 4 KByte pages, 4-way associative, 512 entries\n");
1981 		break;
1982 	case 0xd0:
1983 		printf("3rd-level cache: 512 KByte, 4-way set associative, 64 byte line size\n");
1984 		break;
1985 	case 0xd1:
1986 		printf("3rd-level cache: 1 MByte, 4-way set associative, 64 byte line size\n");
1987 		break;
1988 	case 0xd2:
1989 		printf("3rd-level cache: 2 MByte, 4-way set associative, 64 byte line size\n");
1990 		break;
1991 	case 0xd6:
1992 		printf("3rd-level cache: 1 MByte, 8-way set associative, 64 byte line size\n");
1993 		break;
1994 	case 0xd7:
1995 		printf("3rd-level cache: 2 MByte, 8-way set associative, 64 byte line size\n");
1996 		break;
1997 	case 0xd8:
1998 		printf("3rd-level cache: 4 MByte, 8-way set associative, 64 byte line size\n");
1999 		break;
2000 	case 0xdc:
2001 		printf("3rd-level cache: 1.5 MByte, 12-way set associative, 64 byte line size\n");
2002 		break;
2003 	case 0xdd:
2004 		printf("3rd-level cache: 3 MByte, 12-way set associative, 64 byte line size\n");
2005 		break;
2006 	case 0xde:
2007 		printf("3rd-level cache: 6 MByte, 12-way set associative, 64 byte line size\n");
2008 		break;
2009 	case 0xe2:
2010 		printf("3rd-level cache: 2 MByte, 16-way set associative, 64 byte line size\n");
2011 		break;
2012 	case 0xe3:
2013 		printf("3rd-level cache: 4 MByte, 16-way set associative, 64 byte line size\n");
2014 		break;
2015 	case 0xe4:
2016 		printf("3rd-level cache: 8 MByte, 16-way set associative, 64 byte line size\n");
2017 		break;
2018 	case 0xea:
2019 		printf("3rd-level cache: 12MByte, 24-way set associative, 64 byte line size\n");
2020 		break;
2021 	case 0xeb:
2022 		printf("3rd-level cache: 18MByte, 24-way set associative, 64 byte line size\n");
2023 		break;
2024 	case 0xec:
2025 		printf("3rd-level cache: 24MByte, 24-way set associative, 64 byte line size\n");
2026 		break;
2027 	case 0xf0:
2028 		printf("64-Byte prefetching\n");
2029 		break;
2030 	case 0xf1:
2031 		printf("128-Byte prefetching\n");
2032 		break;
2033 	}
2034 }
2035 
2036 static void
2037 print_svm_info(void)
2038 {
2039 	u_int features, regs[4];
2040 	uint64_t msr;
2041 	int comma;
2042 
2043 	printf("\n  SVM: ");
2044 	do_cpuid(0x8000000A, regs);
2045 	features = regs[3];
2046 
2047 	msr = rdmsr(MSR_VM_CR);
2048 	if ((msr & VM_CR_SVMDIS) == VM_CR_SVMDIS)
2049 		printf("(disabled in BIOS) ");
2050 
2051 	if (!bootverbose) {
2052 		comma = 0;
2053 		if (features & (1 << 0)) {
2054 			printf("%sNP", comma ? "," : "");
2055                         comma = 1;
2056 		}
2057 		if (features & (1 << 3)) {
2058 			printf("%sNRIP", comma ? "," : "");
2059                         comma = 1;
2060 		}
2061 		if (features & (1 << 5)) {
2062 			printf("%sVClean", comma ? "," : "");
2063                         comma = 1;
2064 		}
2065 		if (features & (1 << 6)) {
2066 			printf("%sAFlush", comma ? "," : "");
2067                         comma = 1;
2068 		}
2069 		if (features & (1 << 7)) {
2070 			printf("%sDAssist", comma ? "," : "");
2071                         comma = 1;
2072 		}
2073 		printf("%sNAsids=%d", comma ? "," : "", regs[1]);
2074 		return;
2075 	}
2076 
2077 	printf("Features=0x%b", features,
2078 	       "\020"
2079 	       "\001NP"			/* Nested paging */
2080 	       "\002LbrVirt"		/* LBR virtualization */
2081 	       "\003SVML"		/* SVM lock */
2082 	       "\004NRIPS"		/* NRIP save */
2083 	       "\005TscRateMsr"		/* MSR based TSC rate control */
2084 	       "\006VmcbClean"		/* VMCB clean bits */
2085 	       "\007FlushByAsid"	/* Flush by ASID */
2086 	       "\010DecodeAssist"	/* Decode assist */
2087 	       "\011<b8>"
2088 	       "\012<b9>"
2089 	       "\013PauseFilter"	/* PAUSE intercept filter */
2090 	       "\014<b11>"
2091 	       "\015PauseFilterThreshold" /* PAUSE filter threshold */
2092 	       "\016AVIC"		/* virtual interrupt controller */
2093                 );
2094 	printf("\nRevision=%d, ASIDs=%d", regs[0] & 0xff, regs[1]);
2095 }
2096 
2097 #ifdef __i386__
2098 static void
2099 print_transmeta_info(void)
2100 {
2101 	u_int regs[4], nreg = 0;
2102 
2103 	do_cpuid(0x80860000, regs);
2104 	nreg = regs[0];
2105 	if (nreg >= 0x80860001) {
2106 		do_cpuid(0x80860001, regs);
2107 		printf("  Processor revision %u.%u.%u.%u\n",
2108 		       (regs[1] >> 24) & 0xff,
2109 		       (regs[1] >> 16) & 0xff,
2110 		       (regs[1] >> 8) & 0xff,
2111 		       regs[1] & 0xff);
2112 	}
2113 	if (nreg >= 0x80860002) {
2114 		do_cpuid(0x80860002, regs);
2115 		printf("  Code Morphing Software revision %u.%u.%u-%u-%u\n",
2116 		       (regs[1] >> 24) & 0xff,
2117 		       (regs[1] >> 16) & 0xff,
2118 		       (regs[1] >> 8) & 0xff,
2119 		       regs[1] & 0xff,
2120 		       regs[2]);
2121 	}
2122 	if (nreg >= 0x80860006) {
2123 		char info[65];
2124 		do_cpuid(0x80860003, (u_int*) &info[0]);
2125 		do_cpuid(0x80860004, (u_int*) &info[16]);
2126 		do_cpuid(0x80860005, (u_int*) &info[32]);
2127 		do_cpuid(0x80860006, (u_int*) &info[48]);
2128 		info[64] = 0;
2129 		printf("  %s\n", info);
2130 	}
2131 }
2132 #endif
2133 
2134 static void
2135 print_via_padlock_info(void)
2136 {
2137 	u_int regs[4];
2138 
2139 	do_cpuid(0xc0000001, regs);
2140 	printf("\n  VIA Padlock Features=0x%b", regs[3],
2141 	"\020"
2142 	"\003RNG"		/* RNG */
2143 	"\007AES"		/* ACE */
2144 	"\011AES-CTR"		/* ACE2 */
2145 	"\013SHA1,SHA256"	/* PHE */
2146 	"\015RSA"		/* PMM */
2147 	);
2148 }
2149 
2150 static uint32_t
2151 vmx_settable(uint64_t basic, int msr, int true_msr)
2152 {
2153 	uint64_t val;
2154 
2155 	if (basic & (1ULL << 55))
2156 		val = rdmsr(true_msr);
2157 	else
2158 		val = rdmsr(msr);
2159 
2160 	/* Just report the controls that can be set to 1. */
2161 	return (val >> 32);
2162 }
2163 
2164 static void
2165 print_vmx_info(void)
2166 {
2167 	uint64_t basic, msr;
2168 	uint32_t entry, exit, mask, pin, proc, proc2;
2169 	int comma;
2170 
2171 	printf("\n  VT-x: ");
2172 	msr = rdmsr(MSR_IA32_FEATURE_CONTROL);
2173 	if (!(msr & IA32_FEATURE_CONTROL_VMX_EN))
2174 		printf("(disabled in BIOS) ");
2175 	basic = rdmsr(MSR_VMX_BASIC);
2176 	pin = vmx_settable(basic, MSR_VMX_PINBASED_CTLS,
2177 	    MSR_VMX_TRUE_PINBASED_CTLS);
2178 	proc = vmx_settable(basic, MSR_VMX_PROCBASED_CTLS,
2179 	    MSR_VMX_TRUE_PROCBASED_CTLS);
2180 	if (proc & PROCBASED_SECONDARY_CONTROLS)
2181 		proc2 = vmx_settable(basic, MSR_VMX_PROCBASED_CTLS2,
2182 		    MSR_VMX_PROCBASED_CTLS2);
2183 	else
2184 		proc2 = 0;
2185 	exit = vmx_settable(basic, MSR_VMX_EXIT_CTLS, MSR_VMX_TRUE_EXIT_CTLS);
2186 	entry = vmx_settable(basic, MSR_VMX_ENTRY_CTLS, MSR_VMX_TRUE_ENTRY_CTLS);
2187 
2188 	if (!bootverbose) {
2189 		comma = 0;
2190 		if (exit & VM_EXIT_SAVE_PAT && exit & VM_EXIT_LOAD_PAT &&
2191 		    entry & VM_ENTRY_LOAD_PAT) {
2192 			printf("%sPAT", comma ? "," : "");
2193 			comma = 1;
2194 		}
2195 		if (proc & PROCBASED_HLT_EXITING) {
2196 			printf("%sHLT", comma ? "," : "");
2197 			comma = 1;
2198 		}
2199 		if (proc & PROCBASED_MTF) {
2200 			printf("%sMTF", comma ? "," : "");
2201 			comma = 1;
2202 		}
2203 		if (proc & PROCBASED_PAUSE_EXITING) {
2204 			printf("%sPAUSE", comma ? "," : "");
2205 			comma = 1;
2206 		}
2207 		if (proc2 & PROCBASED2_ENABLE_EPT) {
2208 			printf("%sEPT", comma ? "," : "");
2209 			comma = 1;
2210 		}
2211 		if (proc2 & PROCBASED2_UNRESTRICTED_GUEST) {
2212 			printf("%sUG", comma ? "," : "");
2213 			comma = 1;
2214 		}
2215 		if (proc2 & PROCBASED2_ENABLE_VPID) {
2216 			printf("%sVPID", comma ? "," : "");
2217 			comma = 1;
2218 		}
2219 		if (proc & PROCBASED_USE_TPR_SHADOW &&
2220 		    proc2 & PROCBASED2_VIRTUALIZE_APIC_ACCESSES &&
2221 		    proc2 & PROCBASED2_VIRTUALIZE_X2APIC_MODE &&
2222 		    proc2 & PROCBASED2_APIC_REGISTER_VIRTUALIZATION &&
2223 		    proc2 & PROCBASED2_VIRTUAL_INTERRUPT_DELIVERY) {
2224 			printf("%sVID", comma ? "," : "");
2225 			comma = 1;
2226 			if (pin & PINBASED_POSTED_INTERRUPT)
2227 				printf(",PostIntr");
2228 		}
2229 		return;
2230 	}
2231 
2232 	mask = basic >> 32;
2233 	printf("Basic Features=0x%b", mask,
2234 	"\020"
2235 	"\02132PA"		/* 32-bit physical addresses */
2236 	"\022SMM"		/* SMM dual-monitor */
2237 	"\027INS/OUTS"		/* VM-exit info for INS and OUTS */
2238 	"\030TRUE"		/* TRUE_CTLS MSRs */
2239 	);
2240 	printf("\n        Pin-Based Controls=0x%b", pin,
2241 	"\020"
2242 	"\001ExtINT"		/* External-interrupt exiting */
2243 	"\004NMI"		/* NMI exiting */
2244 	"\006VNMI"		/* Virtual NMIs */
2245 	"\007PreTmr"		/* Activate VMX-preemption timer */
2246 	"\010PostIntr"		/* Process posted interrupts */
2247 	);
2248 	printf("\n        Primary Processor Controls=0x%b", proc,
2249 	"\020"
2250 	"\003INTWIN"		/* Interrupt-window exiting */
2251 	"\004TSCOff"		/* Use TSC offsetting */
2252 	"\010HLT"		/* HLT exiting */
2253 	"\012INVLPG"		/* INVLPG exiting */
2254 	"\013MWAIT"		/* MWAIT exiting */
2255 	"\014RDPMC"		/* RDPMC exiting */
2256 	"\015RDTSC"		/* RDTSC exiting */
2257 	"\020CR3-LD"		/* CR3-load exiting */
2258 	"\021CR3-ST"		/* CR3-store exiting */
2259 	"\024CR8-LD"		/* CR8-load exiting */
2260 	"\025CR8-ST"		/* CR8-store exiting */
2261 	"\026TPR"		/* Use TPR shadow */
2262 	"\027NMIWIN"		/* NMI-window exiting */
2263 	"\030MOV-DR"		/* MOV-DR exiting */
2264 	"\031IO"		/* Unconditional I/O exiting */
2265 	"\032IOmap"		/* Use I/O bitmaps */
2266 	"\034MTF"		/* Monitor trap flag */
2267 	"\035MSRmap"		/* Use MSR bitmaps */
2268 	"\036MONITOR"		/* MONITOR exiting */
2269 	"\037PAUSE"		/* PAUSE exiting */
2270 	);
2271 	if (proc & PROCBASED_SECONDARY_CONTROLS)
2272 		printf("\n        Secondary Processor Controls=0x%b", proc2,
2273 		"\020"
2274 		"\001APIC"		/* Virtualize APIC accesses */
2275 		"\002EPT"		/* Enable EPT */
2276 		"\003DT"		/* Descriptor-table exiting */
2277 		"\004RDTSCP"		/* Enable RDTSCP */
2278 		"\005x2APIC"		/* Virtualize x2APIC mode */
2279 		"\006VPID"		/* Enable VPID */
2280 		"\007WBINVD"		/* WBINVD exiting */
2281 		"\010UG"		/* Unrestricted guest */
2282 		"\011APIC-reg"		/* APIC-register virtualization */
2283 		"\012VID"		/* Virtual-interrupt delivery */
2284 		"\013PAUSE-loop"	/* PAUSE-loop exiting */
2285 		"\014RDRAND"		/* RDRAND exiting */
2286 		"\015INVPCID"		/* Enable INVPCID */
2287 		"\016VMFUNC"		/* Enable VM functions */
2288 		"\017VMCS"		/* VMCS shadowing */
2289 		"\020EPT#VE"		/* EPT-violation #VE */
2290 		"\021XSAVES"		/* Enable XSAVES/XRSTORS */
2291 		);
2292 	printf("\n        Exit Controls=0x%b", mask,
2293 	"\020"
2294 	"\003DR"		/* Save debug controls */
2295 				/* Ignore Host address-space size */
2296 	"\015PERF"		/* Load MSR_PERF_GLOBAL_CTRL */
2297 	"\020AckInt"		/* Acknowledge interrupt on exit */
2298 	"\023PAT-SV"		/* Save MSR_PAT */
2299 	"\024PAT-LD"		/* Load MSR_PAT */
2300 	"\025EFER-SV"		/* Save MSR_EFER */
2301 	"\026EFER-LD"		/* Load MSR_EFER */
2302 	"\027PTMR-SV"		/* Save VMX-preemption timer value */
2303 	);
2304 	printf("\n        Entry Controls=0x%b", mask,
2305 	"\020"
2306 	"\003DR"		/* Save debug controls */
2307 				/* Ignore IA-32e mode guest */
2308 				/* Ignore Entry to SMM */
2309 				/* Ignore Deactivate dual-monitor treatment */
2310 	"\016PERF"		/* Load MSR_PERF_GLOBAL_CTRL */
2311 	"\017PAT"		/* Load MSR_PAT */
2312 	"\020EFER"		/* Load MSR_EFER */
2313 	);
2314 	if (proc & PROCBASED_SECONDARY_CONTROLS &&
2315 	    (proc2 & (PROCBASED2_ENABLE_EPT | PROCBASED2_ENABLE_VPID)) != 0) {
2316 		msr = rdmsr(MSR_VMX_EPT_VPID_CAP);
2317 		mask = msr;
2318 		printf("\n        EPT Features=0x%b", mask,
2319 		"\020"
2320 		"\001XO"		/* Execute-only translations */
2321 		"\007PW4"		/* Page-walk length of 4 */
2322 		"\011UC"		/* EPT paging-structure mem can be UC */
2323 		"\017WB"		/* EPT paging-structure mem can be WB */
2324 		"\0212M"		/* EPT PDE can map a 2-Mbyte page */
2325 		"\0221G"		/* EPT PDPTE can map a 1-Gbyte page */
2326 		"\025INVEPT"		/* INVEPT is supported */
2327 		"\026AD"		/* Accessed and dirty flags for EPT */
2328 		"\032single"		/* INVEPT single-context type */
2329 		"\033all"		/* INVEPT all-context type */
2330 		);
2331 		mask = msr >> 32;
2332 		printf("\n        VPID Features=0x%b", mask,
2333 		"\020"
2334 		"\001INVVPID"		/* INVVPID is supported */
2335 		"\011individual"	/* INVVPID individual-address type */
2336 		"\012single"		/* INVVPID single-context type */
2337 		"\013all"		/* INVVPID all-context type */
2338 		 /* INVVPID single-context-retaining-globals type */
2339 		"\014single-globals"
2340 		);
2341 	}
2342 }
2343 
2344 static void
2345 print_hypervisor_info(void)
2346 {
2347 
2348 	if (*hv_vendor)
2349 		printf("Hypervisor: Origin = \"%s\"\n", hv_vendor);
2350 }
2351