xref: /freebsd/sys/x86/x86/identcpu.c (revision 5b9c547c)
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 				       /* Intel Memory Protection Extensions */
907 				       "\017MPX"
908 				       /* AVX512 Foundation */
909 				       "\021AVX512F"
910 				       /* Enhanced NRBG */
911 				       "\023RDSEED"
912 				       /* ADCX + ADOX */
913 				       "\024ADX"
914 				       /* Supervisor Mode Access Prevention */
915 				       "\025SMAP"
916 				       "\030CLFLUSHOPT"
917 				       "\032PROCTRACE"
918 				       "\033AVX512PF"
919 				       "\034AVX512ER"
920 				       "\035AVX512CD"
921 				       "\036SHA"
922 				       );
923 			}
924 
925 			if ((cpu_feature2 & CPUID2_XSAVE) != 0) {
926 				cpuid_count(0xd, 0x1, regs);
927 				if (regs[0] != 0) {
928 					printf("\n  XSAVE Features=0x%b",
929 					    regs[0],
930 					    "\020"
931 					    "\001XSAVEOPT"
932 					    "\002XSAVEC"
933 					    "\003XINUSE"
934 					    "\004XSAVES");
935 				}
936 			}
937 
938 			if (via_feature_rng != 0 || via_feature_xcrypt != 0)
939 				print_via_padlock_info();
940 
941 			if (cpu_feature2 & CPUID2_VMX)
942 				print_vmx_info();
943 
944 			if (amd_feature2 & AMDID2_SVM)
945 				print_svm_info();
946 
947 			if ((cpu_feature & CPUID_HTT) &&
948 			    cpu_vendor_id == CPU_VENDOR_AMD)
949 				cpu_feature &= ~CPUID_HTT;
950 
951 			/*
952 			 * If this CPU supports P-state invariant TSC then
953 			 * mention the capability.
954 			 */
955 			if (tsc_is_invariant) {
956 				printf("\n  TSC: P-state invariant");
957 				if (tsc_perf_stat)
958 					printf(", performance statistics");
959 			}
960 		}
961 #ifdef __i386__
962 	} else if (cpu_vendor_id == CPU_VENDOR_CYRIX) {
963 		printf("  DIR=0x%04x", cyrix_did);
964 		printf("  Stepping=%u", (cyrix_did & 0xf000) >> 12);
965 		printf("  Revision=%u", (cyrix_did & 0x0f00) >> 8);
966 #ifndef CYRIX_CACHE_REALLY_WORKS
967 		if (cpu == CPU_M1 && (cyrix_did & 0xff00) < 0x1700)
968 			printf("\n  CPU cache: write-through mode");
969 #endif
970 #endif
971 	}
972 
973 	/* Avoid ugly blank lines: only print newline when we have to. */
974 	if (*cpu_vendor || cpu_id)
975 		printf("\n");
976 
977 	if (bootverbose) {
978 		if (cpu_vendor_id == CPU_VENDOR_AMD)
979 			print_AMD_info();
980 		else if (cpu_vendor_id == CPU_VENDOR_INTEL)
981 			print_INTEL_info();
982 #ifdef __i386__
983 		else if (cpu_vendor_id == CPU_VENDOR_TRANSMETA)
984 			print_transmeta_info();
985 #endif
986 	}
987 
988 	print_hypervisor_info();
989 }
990 
991 void
992 panicifcpuunsupported(void)
993 {
994 
995 #ifdef __i386__
996 #if !defined(lint)
997 #if !defined(I486_CPU) && !defined(I586_CPU) && !defined(I686_CPU)
998 #error This kernel is not configured for one of the supported CPUs
999 #endif
1000 #else /* lint */
1001 #endif /* lint */
1002 #else /* __amd64__ */
1003 #ifndef HAMMER
1004 #error "You need to specify a cpu type"
1005 #endif
1006 #endif
1007 	/*
1008 	 * Now that we have told the user what they have,
1009 	 * let them know if that machine type isn't configured.
1010 	 */
1011 	switch (cpu_class) {
1012 #ifdef __i386__
1013 	case CPUCLASS_286:	/* a 286 should not make it this far, anyway */
1014 	case CPUCLASS_386:
1015 #if !defined(I486_CPU)
1016 	case CPUCLASS_486:
1017 #endif
1018 #if !defined(I586_CPU)
1019 	case CPUCLASS_586:
1020 #endif
1021 #if !defined(I686_CPU)
1022 	case CPUCLASS_686:
1023 #endif
1024 #else /* __amd64__ */
1025 	case CPUCLASS_X86:
1026 #ifndef HAMMER
1027 	case CPUCLASS_K8:
1028 #endif
1029 #endif
1030 		panic("CPU class not configured");
1031 	default:
1032 		break;
1033 	}
1034 }
1035 
1036 #ifdef __i386__
1037 static	volatile u_int trap_by_rdmsr;
1038 
1039 /*
1040  * Special exception 6 handler.
1041  * The rdmsr instruction generates invalid opcodes fault on 486-class
1042  * Cyrix CPU.  Stacked eip register points the rdmsr instruction in the
1043  * function identblue() when this handler is called.  Stacked eip should
1044  * be advanced.
1045  */
1046 inthand_t	bluetrap6;
1047 #ifdef __GNUCLIKE_ASM
1048 __asm
1049 ("									\n\
1050 	.text								\n\
1051 	.p2align 2,0x90							\n\
1052 	.type	" __XSTRING(CNAME(bluetrap6)) ",@function		\n\
1053 " __XSTRING(CNAME(bluetrap6)) ":					\n\
1054 	ss								\n\
1055 	movl	$0xa8c1d," __XSTRING(CNAME(trap_by_rdmsr)) "		\n\
1056 	addl	$2, (%esp)	/* rdmsr is a 2-byte instruction */	\n\
1057 	iret								\n\
1058 ");
1059 #endif
1060 
1061 /*
1062  * Special exception 13 handler.
1063  * Accessing non-existent MSR generates general protection fault.
1064  */
1065 inthand_t	bluetrap13;
1066 #ifdef __GNUCLIKE_ASM
1067 __asm
1068 ("									\n\
1069 	.text								\n\
1070 	.p2align 2,0x90							\n\
1071 	.type	" __XSTRING(CNAME(bluetrap13)) ",@function		\n\
1072 " __XSTRING(CNAME(bluetrap13)) ":					\n\
1073 	ss								\n\
1074 	movl	$0xa89c4," __XSTRING(CNAME(trap_by_rdmsr)) "		\n\
1075 	popl	%eax		/* discard error code */		\n\
1076 	addl	$2, (%esp)	/* rdmsr is a 2-byte instruction */	\n\
1077 	iret								\n\
1078 ");
1079 #endif
1080 
1081 /*
1082  * Distinguish IBM Blue Lightning CPU from Cyrix CPUs that does not
1083  * support cpuid instruction.  This function should be called after
1084  * loading interrupt descriptor table register.
1085  *
1086  * I don't like this method that handles fault, but I couldn't get
1087  * information for any other methods.  Does blue giant know?
1088  */
1089 static int
1090 identblue(void)
1091 {
1092 
1093 	trap_by_rdmsr = 0;
1094 
1095 	/*
1096 	 * Cyrix 486-class CPU does not support rdmsr instruction.
1097 	 * The rdmsr instruction generates invalid opcode fault, and exception
1098 	 * will be trapped by bluetrap6() on Cyrix 486-class CPU.  The
1099 	 * bluetrap6() set the magic number to trap_by_rdmsr.
1100 	 */
1101 	setidt(IDT_UD, bluetrap6, SDT_SYS386TGT, SEL_KPL,
1102 	    GSEL(GCODE_SEL, SEL_KPL));
1103 
1104 	/*
1105 	 * Certain BIOS disables cpuid instruction of Cyrix 6x86MX CPU.
1106 	 * In this case, rdmsr generates general protection fault, and
1107 	 * exception will be trapped by bluetrap13().
1108 	 */
1109 	setidt(IDT_GP, bluetrap13, SDT_SYS386TGT, SEL_KPL,
1110 	    GSEL(GCODE_SEL, SEL_KPL));
1111 
1112 	rdmsr(0x1002);		/* Cyrix CPU generates fault. */
1113 
1114 	if (trap_by_rdmsr == 0xa8c1d)
1115 		return IDENTBLUE_CYRIX486;
1116 	else if (trap_by_rdmsr == 0xa89c4)
1117 		return IDENTBLUE_CYRIXM2;
1118 	return IDENTBLUE_IBMCPU;
1119 }
1120 
1121 
1122 /*
1123  * identifycyrix() set lower 16 bits of cyrix_did as follows:
1124  *
1125  *  F E D C B A 9 8 7 6 5 4 3 2 1 0
1126  * +-------+-------+---------------+
1127  * |  SID  |  RID  |   Device ID   |
1128  * |    (DIR 1)    |    (DIR 0)    |
1129  * +-------+-------+---------------+
1130  */
1131 static void
1132 identifycyrix(void)
1133 {
1134 	register_t saveintr;
1135 	int	ccr2_test = 0, dir_test = 0;
1136 	u_char	ccr2, ccr3;
1137 
1138 	saveintr = intr_disable();
1139 
1140 	ccr2 = read_cyrix_reg(CCR2);
1141 	write_cyrix_reg(CCR2, ccr2 ^ CCR2_LOCK_NW);
1142 	read_cyrix_reg(CCR2);
1143 	if (read_cyrix_reg(CCR2) != ccr2)
1144 		ccr2_test = 1;
1145 	write_cyrix_reg(CCR2, ccr2);
1146 
1147 	ccr3 = read_cyrix_reg(CCR3);
1148 	write_cyrix_reg(CCR3, ccr3 ^ CCR3_MAPEN3);
1149 	read_cyrix_reg(CCR3);
1150 	if (read_cyrix_reg(CCR3) != ccr3)
1151 		dir_test = 1;					/* CPU supports DIRs. */
1152 	write_cyrix_reg(CCR3, ccr3);
1153 
1154 	if (dir_test) {
1155 		/* Device ID registers are available. */
1156 		cyrix_did = read_cyrix_reg(DIR1) << 8;
1157 		cyrix_did += read_cyrix_reg(DIR0);
1158 	} else if (ccr2_test)
1159 		cyrix_did = 0x0010;		/* 486S A-step */
1160 	else
1161 		cyrix_did = 0x00ff;		/* Old 486SLC/DLC and TI486SXLC/SXL */
1162 
1163 	intr_restore(saveintr);
1164 }
1165 #endif
1166 
1167 /* Update TSC freq with the value indicated by the caller. */
1168 static void
1169 tsc_freq_changed(void *arg __unused, const struct cf_level *level, int status)
1170 {
1171 
1172 	/* If there was an error during the transition, don't do anything. */
1173 	if (status != 0)
1174 		return;
1175 
1176 	/* Total setting for this level gives the new frequency in MHz. */
1177 	hw_clockrate = level->total_set.freq;
1178 }
1179 
1180 static void
1181 hook_tsc_freq(void *arg __unused)
1182 {
1183 
1184 	if (tsc_is_invariant)
1185 		return;
1186 
1187 	tsc_post_tag = EVENTHANDLER_REGISTER(cpufreq_post_change,
1188 	    tsc_freq_changed, NULL, EVENTHANDLER_PRI_ANY);
1189 }
1190 
1191 SYSINIT(hook_tsc_freq, SI_SUB_CONFIGURE, SI_ORDER_ANY, hook_tsc_freq, NULL);
1192 
1193 #ifndef XEN
1194 static const char *const vm_bnames[] = {
1195 	"QEMU",				/* QEMU */
1196 	"Plex86",			/* Plex86 */
1197 	"Bochs",			/* Bochs */
1198 	"Xen",				/* Xen */
1199 	"BHYVE",			/* bhyve */
1200 	"Seabios",			/* KVM */
1201 	NULL
1202 };
1203 
1204 static const char *const vm_pnames[] = {
1205 	"VMware Virtual Platform",	/* VMWare VM */
1206 	"Virtual Machine",		/* Microsoft VirtualPC */
1207 	"VirtualBox",			/* Sun xVM VirtualBox */
1208 	"Parallels Virtual Platform",	/* Parallels VM */
1209 	"KVM",				/* KVM */
1210 	NULL
1211 };
1212 
1213 static void
1214 identify_hypervisor(void)
1215 {
1216 	u_int regs[4];
1217 	char *p;
1218 	int i;
1219 
1220 	/*
1221 	 * [RFC] CPUID usage for interaction between Hypervisors and Linux.
1222 	 * http://lkml.org/lkml/2008/10/1/246
1223 	 *
1224 	 * KB1009458: Mechanisms to determine if software is running in
1225 	 * a VMware virtual machine
1226 	 * http://kb.vmware.com/kb/1009458
1227 	 */
1228 	if (cpu_feature2 & CPUID2_HV) {
1229 		vm_guest = VM_GUEST_VM;
1230 		do_cpuid(0x40000000, regs);
1231 		if (regs[0] >= 0x40000000) {
1232 			hv_high = regs[0];
1233 			((u_int *)&hv_vendor)[0] = regs[1];
1234 			((u_int *)&hv_vendor)[1] = regs[2];
1235 			((u_int *)&hv_vendor)[2] = regs[3];
1236 			hv_vendor[12] = '\0';
1237 			if (strcmp(hv_vendor, "VMwareVMware") == 0)
1238 				vm_guest = VM_GUEST_VMWARE;
1239 		}
1240 		return;
1241 	}
1242 
1243 	/*
1244 	 * Examine SMBIOS strings for older hypervisors.
1245 	 */
1246 	p = kern_getenv("smbios.system.serial");
1247 	if (p != NULL) {
1248 		if (strncmp(p, "VMware-", 7) == 0 || strncmp(p, "VMW", 3) == 0) {
1249 			vmware_hvcall(VMW_HVCMD_GETVERSION, regs);
1250 			if (regs[1] == VMW_HVMAGIC) {
1251 				vm_guest = VM_GUEST_VMWARE;
1252 				freeenv(p);
1253 				return;
1254 			}
1255 		}
1256 		freeenv(p);
1257 	}
1258 
1259 	/*
1260 	 * XXX: Some of these entries may not be needed since they were
1261 	 * added to FreeBSD before the checks above.
1262 	 */
1263 	p = kern_getenv("smbios.bios.vendor");
1264 	if (p != NULL) {
1265 		for (i = 0; vm_bnames[i] != NULL; i++)
1266 			if (strcmp(p, vm_bnames[i]) == 0) {
1267 				vm_guest = VM_GUEST_VM;
1268 				freeenv(p);
1269 				return;
1270 			}
1271 		freeenv(p);
1272 	}
1273 	p = kern_getenv("smbios.system.product");
1274 	if (p != NULL) {
1275 		for (i = 0; vm_pnames[i] != NULL; i++)
1276 			if (strcmp(p, vm_pnames[i]) == 0) {
1277 				vm_guest = VM_GUEST_VM;
1278 				freeenv(p);
1279 				return;
1280 			}
1281 		freeenv(p);
1282 	}
1283 }
1284 #endif
1285 
1286 /*
1287  * Final stage of CPU identification.
1288  */
1289 #ifdef __i386__
1290 void
1291 finishidentcpu(void)
1292 #else
1293 void
1294 identify_cpu(void)
1295 #endif
1296 {
1297 	u_int regs[4], cpu_stdext_disable;
1298 #ifdef __i386__
1299 	u_char ccr3;
1300 #endif
1301 
1302 #ifdef __amd64__
1303 	do_cpuid(0, regs);
1304 	cpu_high = regs[0];
1305 	((u_int *)&cpu_vendor)[0] = regs[1];
1306 	((u_int *)&cpu_vendor)[1] = regs[3];
1307 	((u_int *)&cpu_vendor)[2] = regs[2];
1308 	cpu_vendor[12] = '\0';
1309 
1310 	do_cpuid(1, regs);
1311 	cpu_id = regs[0];
1312 	cpu_procinfo = regs[1];
1313 	cpu_feature = regs[3];
1314 	cpu_feature2 = regs[2];
1315 #endif
1316 
1317 #ifndef XEN
1318 	identify_hypervisor();
1319 #endif
1320 	cpu_vendor_id = find_cpu_vendor_id();
1321 
1322 	/*
1323 	 * Clear "Limit CPUID Maxval" bit and get the largest standard CPUID
1324 	 * function number again if it is set from BIOS.  It is necessary
1325 	 * for probing correct CPU topology later.
1326 	 * XXX This is only done on the BSP package.
1327 	 */
1328 	if (cpu_vendor_id == CPU_VENDOR_INTEL && cpu_high > 0 && cpu_high < 4 &&
1329 	    ((CPUID_TO_FAMILY(cpu_id) == 0xf && CPUID_TO_MODEL(cpu_id) >= 0x3) ||
1330 	    (CPUID_TO_FAMILY(cpu_id) == 0x6 && CPUID_TO_MODEL(cpu_id) >= 0xe))) {
1331 		uint64_t msr;
1332 		msr = rdmsr(MSR_IA32_MISC_ENABLE);
1333 		if ((msr & 0x400000ULL) != 0) {
1334 			wrmsr(MSR_IA32_MISC_ENABLE, msr & ~0x400000ULL);
1335 			do_cpuid(0, regs);
1336 			cpu_high = regs[0];
1337 		}
1338 	}
1339 
1340 	if (cpu_high >= 5 && (cpu_feature2 & CPUID2_MON) != 0) {
1341 		do_cpuid(5, regs);
1342 		cpu_mon_mwait_flags = regs[2];
1343 		cpu_mon_min_size = regs[0] &  CPUID5_MON_MIN_SIZE;
1344 		cpu_mon_max_size = regs[1] &  CPUID5_MON_MAX_SIZE;
1345 	}
1346 
1347 	if (cpu_high >= 7) {
1348 		cpuid_count(7, 0, regs);
1349 		cpu_stdext_feature = regs[1];
1350 
1351 		/*
1352 		 * Some hypervisors fail to filter out unsupported
1353 		 * extended features.  For now, disable the
1354 		 * extensions, activation of which requires setting a
1355 		 * bit in CR4, and which VM monitors do not support.
1356 		 */
1357 		if (cpu_feature2 & CPUID2_HV) {
1358 			cpu_stdext_disable = CPUID_STDEXT_FSGSBASE |
1359 			    CPUID_STDEXT_SMEP;
1360 		} else
1361 			cpu_stdext_disable = 0;
1362 		TUNABLE_INT_FETCH("hw.cpu_stdext_disable", &cpu_stdext_disable);
1363 		cpu_stdext_feature &= ~cpu_stdext_disable;
1364 	}
1365 
1366 #ifdef __i386__
1367 	if (cpu_high > 0 &&
1368 	    (cpu_vendor_id == CPU_VENDOR_INTEL ||
1369 	     cpu_vendor_id == CPU_VENDOR_AMD ||
1370 	     cpu_vendor_id == CPU_VENDOR_TRANSMETA ||
1371 	     cpu_vendor_id == CPU_VENDOR_CENTAUR ||
1372 	     cpu_vendor_id == CPU_VENDOR_NSC)) {
1373 		do_cpuid(0x80000000, regs);
1374 		if (regs[0] >= 0x80000000)
1375 			cpu_exthigh = regs[0];
1376 	}
1377 #else
1378 	if (cpu_vendor_id == CPU_VENDOR_INTEL ||
1379 	    cpu_vendor_id == CPU_VENDOR_AMD ||
1380 	    cpu_vendor_id == CPU_VENDOR_CENTAUR) {
1381 		do_cpuid(0x80000000, regs);
1382 		cpu_exthigh = regs[0];
1383 	}
1384 #endif
1385 	if (cpu_exthigh >= 0x80000001) {
1386 		do_cpuid(0x80000001, regs);
1387 		amd_feature = regs[3] & ~(cpu_feature & 0x0183f3ff);
1388 		amd_feature2 = regs[2];
1389 	}
1390 	if (cpu_exthigh >= 0x80000007) {
1391 		do_cpuid(0x80000007, regs);
1392 		amd_pminfo = regs[3];
1393 	}
1394 	if (cpu_exthigh >= 0x80000008) {
1395 		do_cpuid(0x80000008, regs);
1396 		cpu_maxphyaddr = regs[0] & 0xff;
1397 		cpu_procinfo2 = regs[2];
1398 	} else {
1399 		cpu_maxphyaddr = (cpu_feature & CPUID_PAE) != 0 ? 36 : 32;
1400 	}
1401 
1402 #ifdef __i386__
1403 	if (cpu_vendor_id == CPU_VENDOR_CYRIX) {
1404 		if (cpu == CPU_486) {
1405 			/*
1406 			 * These conditions are equivalent to:
1407 			 *     - CPU does not support cpuid instruction.
1408 			 *     - Cyrix/IBM CPU is detected.
1409 			 */
1410 			if (identblue() == IDENTBLUE_IBMCPU) {
1411 				strcpy(cpu_vendor, "IBM");
1412 				cpu_vendor_id = CPU_VENDOR_IBM;
1413 				cpu = CPU_BLUE;
1414 				return;
1415 			}
1416 		}
1417 		switch (cpu_id & 0xf00) {
1418 		case 0x600:
1419 			/*
1420 			 * Cyrix's datasheet does not describe DIRs.
1421 			 * Therefor, I assume it does not have them
1422 			 * and use the result of the cpuid instruction.
1423 			 * XXX they seem to have it for now at least. -Peter
1424 			 */
1425 			identifycyrix();
1426 			cpu = CPU_M2;
1427 			break;
1428 		default:
1429 			identifycyrix();
1430 			/*
1431 			 * This routine contains a trick.
1432 			 * Don't check (cpu_id & 0x00f0) == 0x50 to detect M2, now.
1433 			 */
1434 			switch (cyrix_did & 0x00f0) {
1435 			case 0x00:
1436 			case 0xf0:
1437 				cpu = CPU_486DLC;
1438 				break;
1439 			case 0x10:
1440 				cpu = CPU_CY486DX;
1441 				break;
1442 			case 0x20:
1443 				if ((cyrix_did & 0x000f) < 8)
1444 					cpu = CPU_M1;
1445 				else
1446 					cpu = CPU_M1SC;
1447 				break;
1448 			case 0x30:
1449 				cpu = CPU_M1;
1450 				break;
1451 			case 0x40:
1452 				/* MediaGX CPU */
1453 				cpu = CPU_M1SC;
1454 				break;
1455 			default:
1456 				/* M2 and later CPUs are treated as M2. */
1457 				cpu = CPU_M2;
1458 
1459 				/*
1460 				 * enable cpuid instruction.
1461 				 */
1462 				ccr3 = read_cyrix_reg(CCR3);
1463 				write_cyrix_reg(CCR3, CCR3_MAPEN0);
1464 				write_cyrix_reg(CCR4, read_cyrix_reg(CCR4) | CCR4_CPUID);
1465 				write_cyrix_reg(CCR3, ccr3);
1466 
1467 				do_cpuid(0, regs);
1468 				cpu_high = regs[0];	/* eax */
1469 				do_cpuid(1, regs);
1470 				cpu_id = regs[0];	/* eax */
1471 				cpu_feature = regs[3];	/* edx */
1472 				break;
1473 			}
1474 		}
1475 	} else if (cpu == CPU_486 && *cpu_vendor == '\0') {
1476 		/*
1477 		 * There are BlueLightning CPUs that do not change
1478 		 * undefined flags by dividing 5 by 2.  In this case,
1479 		 * the CPU identification routine in locore.s leaves
1480 		 * cpu_vendor null string and puts CPU_486 into the
1481 		 * cpu.
1482 		 */
1483 		if (identblue() == IDENTBLUE_IBMCPU) {
1484 			strcpy(cpu_vendor, "IBM");
1485 			cpu_vendor_id = CPU_VENDOR_IBM;
1486 			cpu = CPU_BLUE;
1487 			return;
1488 		}
1489 	}
1490 #else
1491 	/* XXX */
1492 	cpu = CPU_CLAWHAMMER;
1493 #endif
1494 }
1495 
1496 static u_int
1497 find_cpu_vendor_id(void)
1498 {
1499 	int	i;
1500 
1501 	for (i = 0; i < sizeof(cpu_vendors) / sizeof(cpu_vendors[0]); i++)
1502 		if (strcmp(cpu_vendor, cpu_vendors[i].vendor) == 0)
1503 			return (cpu_vendors[i].vendor_id);
1504 	return (0);
1505 }
1506 
1507 static void
1508 print_AMD_assoc(int i)
1509 {
1510 	if (i == 255)
1511 		printf(", fully associative\n");
1512 	else
1513 		printf(", %d-way associative\n", i);
1514 }
1515 
1516 static void
1517 print_AMD_l2_assoc(int i)
1518 {
1519 	switch (i & 0x0f) {
1520 	case 0: printf(", disabled/not present\n"); break;
1521 	case 1: printf(", direct mapped\n"); break;
1522 	case 2: printf(", 2-way associative\n"); break;
1523 	case 4: printf(", 4-way associative\n"); break;
1524 	case 6: printf(", 8-way associative\n"); break;
1525 	case 8: printf(", 16-way associative\n"); break;
1526 	case 15: printf(", fully associative\n"); break;
1527 	default: printf(", reserved configuration\n"); break;
1528 	}
1529 }
1530 
1531 static void
1532 print_AMD_info(void)
1533 {
1534 #ifdef __i386__
1535 	uint64_t amd_whcr;
1536 #endif
1537 	u_int regs[4];
1538 
1539 	if (cpu_exthigh >= 0x80000005) {
1540 		do_cpuid(0x80000005, regs);
1541 		printf("L1 2MB data TLB: %d entries", (regs[0] >> 16) & 0xff);
1542 		print_AMD_assoc(regs[0] >> 24);
1543 
1544 		printf("L1 2MB instruction TLB: %d entries", regs[0] & 0xff);
1545 		print_AMD_assoc((regs[0] >> 8) & 0xff);
1546 
1547 		printf("L1 4KB data TLB: %d entries", (regs[1] >> 16) & 0xff);
1548 		print_AMD_assoc(regs[1] >> 24);
1549 
1550 		printf("L1 4KB instruction TLB: %d entries", regs[1] & 0xff);
1551 		print_AMD_assoc((regs[1] >> 8) & 0xff);
1552 
1553 		printf("L1 data cache: %d kbytes", regs[2] >> 24);
1554 		printf(", %d bytes/line", regs[2] & 0xff);
1555 		printf(", %d lines/tag", (regs[2] >> 8) & 0xff);
1556 		print_AMD_assoc((regs[2] >> 16) & 0xff);
1557 
1558 		printf("L1 instruction cache: %d kbytes", regs[3] >> 24);
1559 		printf(", %d bytes/line", regs[3] & 0xff);
1560 		printf(", %d lines/tag", (regs[3] >> 8) & 0xff);
1561 		print_AMD_assoc((regs[3] >> 16) & 0xff);
1562 	}
1563 
1564 	if (cpu_exthigh >= 0x80000006) {
1565 		do_cpuid(0x80000006, regs);
1566 		if ((regs[0] >> 16) != 0) {
1567 			printf("L2 2MB data TLB: %d entries",
1568 			    (regs[0] >> 16) & 0xfff);
1569 			print_AMD_l2_assoc(regs[0] >> 28);
1570 			printf("L2 2MB instruction TLB: %d entries",
1571 			    regs[0] & 0xfff);
1572 			print_AMD_l2_assoc((regs[0] >> 28) & 0xf);
1573 		} else {
1574 			printf("L2 2MB unified TLB: %d entries",
1575 			    regs[0] & 0xfff);
1576 			print_AMD_l2_assoc((regs[0] >> 28) & 0xf);
1577 		}
1578 		if ((regs[1] >> 16) != 0) {
1579 			printf("L2 4KB data TLB: %d entries",
1580 			    (regs[1] >> 16) & 0xfff);
1581 			print_AMD_l2_assoc(regs[1] >> 28);
1582 
1583 			printf("L2 4KB instruction TLB: %d entries",
1584 			    (regs[1] >> 16) & 0xfff);
1585 			print_AMD_l2_assoc((regs[1] >> 28) & 0xf);
1586 		} else {
1587 			printf("L2 4KB unified TLB: %d entries",
1588 			    (regs[1] >> 16) & 0xfff);
1589 			print_AMD_l2_assoc((regs[1] >> 28) & 0xf);
1590 		}
1591 		printf("L2 unified cache: %d kbytes", regs[2] >> 16);
1592 		printf(", %d bytes/line", regs[2] & 0xff);
1593 		printf(", %d lines/tag", (regs[2] >> 8) & 0x0f);
1594 		print_AMD_l2_assoc((regs[2] >> 12) & 0x0f);
1595 	}
1596 
1597 #ifdef __i386__
1598 	if (((cpu_id & 0xf00) == 0x500)
1599 	    && (((cpu_id & 0x0f0) > 0x80)
1600 		|| (((cpu_id & 0x0f0) == 0x80)
1601 		    && (cpu_id & 0x00f) > 0x07))) {
1602 		/* K6-2(new core [Stepping 8-F]), K6-III or later */
1603 		amd_whcr = rdmsr(0xc0000082);
1604 		if (!(amd_whcr & (0x3ff << 22))) {
1605 			printf("Write Allocate Disable\n");
1606 		} else {
1607 			printf("Write Allocate Enable Limit: %dM bytes\n",
1608 			    (u_int32_t)((amd_whcr & (0x3ff << 22)) >> 22) * 4);
1609 			printf("Write Allocate 15-16M bytes: %s\n",
1610 			    (amd_whcr & (1 << 16)) ? "Enable" : "Disable");
1611 		}
1612 	} else if (((cpu_id & 0xf00) == 0x500)
1613 		   && ((cpu_id & 0x0f0) > 0x50)) {
1614 		/* K6, K6-2(old core) */
1615 		amd_whcr = rdmsr(0xc0000082);
1616 		if (!(amd_whcr & (0x7f << 1))) {
1617 			printf("Write Allocate Disable\n");
1618 		} else {
1619 			printf("Write Allocate Enable Limit: %dM bytes\n",
1620 			    (u_int32_t)((amd_whcr & (0x7f << 1)) >> 1) * 4);
1621 			printf("Write Allocate 15-16M bytes: %s\n",
1622 			    (amd_whcr & 0x0001) ? "Enable" : "Disable");
1623 			printf("Hardware Write Allocate Control: %s\n",
1624 			    (amd_whcr & 0x0100) ? "Enable" : "Disable");
1625 		}
1626 	}
1627 #endif
1628 	/*
1629 	 * Opteron Rev E shows a bug as in very rare occasions a read memory
1630 	 * barrier is not performed as expected if it is followed by a
1631 	 * non-atomic read-modify-write instruction.
1632 	 * As long as that bug pops up very rarely (intensive machine usage
1633 	 * on other operating systems generally generates one unexplainable
1634 	 * crash any 2 months) and as long as a model specific fix would be
1635 	 * impratical at this stage, print out a warning string if the broken
1636 	 * model and family are identified.
1637 	 */
1638 	if (CPUID_TO_FAMILY(cpu_id) == 0xf && CPUID_TO_MODEL(cpu_id) >= 0x20 &&
1639 	    CPUID_TO_MODEL(cpu_id) <= 0x3f)
1640 		printf("WARNING: This architecture revision has known SMP "
1641 		    "hardware bugs which may cause random instability\n");
1642 }
1643 
1644 static void
1645 print_INTEL_info(void)
1646 {
1647 	u_int regs[4];
1648 	u_int rounds, regnum;
1649 	u_int nwaycode, nway;
1650 
1651 	if (cpu_high >= 2) {
1652 		rounds = 0;
1653 		do {
1654 			do_cpuid(0x2, regs);
1655 			if (rounds == 0 && (rounds = (regs[0] & 0xff)) == 0)
1656 				break;	/* we have a buggy CPU */
1657 
1658 			for (regnum = 0; regnum <= 3; ++regnum) {
1659 				if (regs[regnum] & (1<<31))
1660 					continue;
1661 				if (regnum != 0)
1662 					print_INTEL_TLB(regs[regnum] & 0xff);
1663 				print_INTEL_TLB((regs[regnum] >> 8) & 0xff);
1664 				print_INTEL_TLB((regs[regnum] >> 16) & 0xff);
1665 				print_INTEL_TLB((regs[regnum] >> 24) & 0xff);
1666 			}
1667 		} while (--rounds > 0);
1668 	}
1669 
1670 	if (cpu_exthigh >= 0x80000006) {
1671 		do_cpuid(0x80000006, regs);
1672 		nwaycode = (regs[2] >> 12) & 0x0f;
1673 		if (nwaycode >= 0x02 && nwaycode <= 0x08)
1674 			nway = 1 << (nwaycode / 2);
1675 		else
1676 			nway = 0;
1677 		printf("L2 cache: %u kbytes, %u-way associative, %u bytes/line\n",
1678 		    (regs[2] >> 16) & 0xffff, nway, regs[2] & 0xff);
1679 	}
1680 }
1681 
1682 static void
1683 print_INTEL_TLB(u_int data)
1684 {
1685 	switch (data) {
1686 	case 0x0:
1687 	case 0x40:
1688 	default:
1689 		break;
1690 	case 0x1:
1691 		printf("Instruction TLB: 4 KB pages, 4-way set associative, 32 entries\n");
1692 		break;
1693 	case 0x2:
1694 		printf("Instruction TLB: 4 MB pages, fully associative, 2 entries\n");
1695 		break;
1696 	case 0x3:
1697 		printf("Data TLB: 4 KB pages, 4-way set associative, 64 entries\n");
1698 		break;
1699 	case 0x4:
1700 		printf("Data TLB: 4 MB Pages, 4-way set associative, 8 entries\n");
1701 		break;
1702 	case 0x6:
1703 		printf("1st-level instruction cache: 8 KB, 4-way set associative, 32 byte line size\n");
1704 		break;
1705 	case 0x8:
1706 		printf("1st-level instruction cache: 16 KB, 4-way set associative, 32 byte line size\n");
1707 		break;
1708 	case 0xa:
1709 		printf("1st-level data cache: 8 KB, 2-way set associative, 32 byte line size\n");
1710 		break;
1711 	case 0xc:
1712 		printf("1st-level data cache: 16 KB, 4-way set associative, 32 byte line size\n");
1713 		break;
1714 	case 0x22:
1715 		printf("3rd-level cache: 512 KB, 4-way set associative, sectored cache, 64 byte line size\n");
1716 		break;
1717 	case 0x23:
1718 		printf("3rd-level cache: 1 MB, 8-way set associative, sectored cache, 64 byte line size\n");
1719 		break;
1720 	case 0x25:
1721 		printf("3rd-level cache: 2 MB, 8-way set associative, sectored cache, 64 byte line size\n");
1722 		break;
1723 	case 0x29:
1724 		printf("3rd-level cache: 4 MB, 8-way set associative, sectored cache, 64 byte line size\n");
1725 		break;
1726 	case 0x2c:
1727 		printf("1st-level data cache: 32 KB, 8-way set associative, 64 byte line size\n");
1728 		break;
1729 	case 0x30:
1730 		printf("1st-level instruction cache: 32 KB, 8-way set associative, 64 byte line size\n");
1731 		break;
1732 	case 0x39:
1733 		printf("2nd-level cache: 128 KB, 4-way set associative, sectored cache, 64 byte line size\n");
1734 		break;
1735 	case 0x3b:
1736 		printf("2nd-level cache: 128 KB, 2-way set associative, sectored cache, 64 byte line size\n");
1737 		break;
1738 	case 0x3c:
1739 		printf("2nd-level cache: 256 KB, 4-way set associative, sectored cache, 64 byte line size\n");
1740 		break;
1741 	case 0x41:
1742 		printf("2nd-level cache: 128 KB, 4-way set associative, 32 byte line size\n");
1743 		break;
1744 	case 0x42:
1745 		printf("2nd-level cache: 256 KB, 4-way set associative, 32 byte line size\n");
1746 		break;
1747 	case 0x43:
1748 		printf("2nd-level cache: 512 KB, 4-way set associative, 32 byte line size\n");
1749 		break;
1750 	case 0x44:
1751 		printf("2nd-level cache: 1 MB, 4-way set associative, 32 byte line size\n");
1752 		break;
1753 	case 0x45:
1754 		printf("2nd-level cache: 2 MB, 4-way set associative, 32 byte line size\n");
1755 		break;
1756 	case 0x46:
1757 		printf("3rd-level cache: 4 MB, 4-way set associative, 64 byte line size\n");
1758 		break;
1759 	case 0x47:
1760 		printf("3rd-level cache: 8 MB, 8-way set associative, 64 byte line size\n");
1761 		break;
1762 	case 0x50:
1763 		printf("Instruction TLB: 4 KB, 2 MB or 4 MB pages, fully associative, 64 entries\n");
1764 		break;
1765 	case 0x51:
1766 		printf("Instruction TLB: 4 KB, 2 MB or 4 MB pages, fully associative, 128 entries\n");
1767 		break;
1768 	case 0x52:
1769 		printf("Instruction TLB: 4 KB, 2 MB or 4 MB pages, fully associative, 256 entries\n");
1770 		break;
1771 	case 0x5b:
1772 		printf("Data TLB: 4 KB or 4 MB pages, fully associative, 64 entries\n");
1773 		break;
1774 	case 0x5c:
1775 		printf("Data TLB: 4 KB or 4 MB pages, fully associative, 128 entries\n");
1776 		break;
1777 	case 0x5d:
1778 		printf("Data TLB: 4 KB or 4 MB pages, fully associative, 256 entries\n");
1779 		break;
1780 	case 0x60:
1781 		printf("1st-level data cache: 16 KB, 8-way set associative, sectored cache, 64 byte line size\n");
1782 		break;
1783 	case 0x66:
1784 		printf("1st-level data cache: 8 KB, 4-way set associative, sectored cache, 64 byte line size\n");
1785 		break;
1786 	case 0x67:
1787 		printf("1st-level data cache: 16 KB, 4-way set associative, sectored cache, 64 byte line size\n");
1788 		break;
1789 	case 0x68:
1790 		printf("1st-level data cache: 32 KB, 4 way set associative, sectored cache, 64 byte line size\n");
1791 		break;
1792 	case 0x70:
1793 		printf("Trace cache: 12K-uops, 8-way set associative\n");
1794 		break;
1795 	case 0x71:
1796 		printf("Trace cache: 16K-uops, 8-way set associative\n");
1797 		break;
1798 	case 0x72:
1799 		printf("Trace cache: 32K-uops, 8-way set associative\n");
1800 		break;
1801 	case 0x78:
1802 		printf("2nd-level cache: 1 MB, 4-way set associative, 64-byte line size\n");
1803 		break;
1804 	case 0x79:
1805 		printf("2nd-level cache: 128 KB, 8-way set associative, sectored cache, 64 byte line size\n");
1806 		break;
1807 	case 0x7a:
1808 		printf("2nd-level cache: 256 KB, 8-way set associative, sectored cache, 64 byte line size\n");
1809 		break;
1810 	case 0x7b:
1811 		printf("2nd-level cache: 512 KB, 8-way set associative, sectored cache, 64 byte line size\n");
1812 		break;
1813 	case 0x7c:
1814 		printf("2nd-level cache: 1 MB, 8-way set associative, sectored cache, 64 byte line size\n");
1815 		break;
1816 	case 0x7d:
1817 		printf("2nd-level cache: 2-MB, 8-way set associative, 64-byte line size\n");
1818 		break;
1819 	case 0x7f:
1820 		printf("2nd-level cache: 512-KB, 2-way set associative, 64-byte line size\n");
1821 		break;
1822 	case 0x82:
1823 		printf("2nd-level cache: 256 KB, 8-way set associative, 32 byte line size\n");
1824 		break;
1825 	case 0x83:
1826 		printf("2nd-level cache: 512 KB, 8-way set associative, 32 byte line size\n");
1827 		break;
1828 	case 0x84:
1829 		printf("2nd-level cache: 1 MB, 8-way set associative, 32 byte line size\n");
1830 		break;
1831 	case 0x85:
1832 		printf("2nd-level cache: 2 MB, 8-way set associative, 32 byte line size\n");
1833 		break;
1834 	case 0x86:
1835 		printf("2nd-level cache: 512 KB, 4-way set associative, 64 byte line size\n");
1836 		break;
1837 	case 0x87:
1838 		printf("2nd-level cache: 1 MB, 8-way set associative, 64 byte line size\n");
1839 		break;
1840 	case 0xb0:
1841 		printf("Instruction TLB: 4 KB Pages, 4-way set associative, 128 entries\n");
1842 		break;
1843 	case 0xb3:
1844 		printf("Data TLB: 4 KB Pages, 4-way set associative, 128 entries\n");
1845 		break;
1846 	}
1847 }
1848 
1849 static void
1850 print_svm_info(void)
1851 {
1852 	u_int features, regs[4];
1853 	uint64_t msr;
1854 	int comma;
1855 
1856 	printf("\n  SVM: ");
1857 	do_cpuid(0x8000000A, regs);
1858 	features = regs[3];
1859 
1860 	msr = rdmsr(MSR_VM_CR);
1861 	if ((msr & VM_CR_SVMDIS) == VM_CR_SVMDIS)
1862 		printf("(disabled in BIOS) ");
1863 
1864 	if (!bootverbose) {
1865 		comma = 0;
1866 		if (features & (1 << 0)) {
1867 			printf("%sNP", comma ? "," : "");
1868                         comma = 1;
1869 		}
1870 		if (features & (1 << 3)) {
1871 			printf("%sNRIP", comma ? "," : "");
1872                         comma = 1;
1873 		}
1874 		if (features & (1 << 5)) {
1875 			printf("%sVClean", comma ? "," : "");
1876                         comma = 1;
1877 		}
1878 		if (features & (1 << 6)) {
1879 			printf("%sAFlush", comma ? "," : "");
1880                         comma = 1;
1881 		}
1882 		if (features & (1 << 7)) {
1883 			printf("%sDAssist", comma ? "," : "");
1884                         comma = 1;
1885 		}
1886 		printf("%sNAsids=%d", comma ? "," : "", regs[1]);
1887 		return;
1888 	}
1889 
1890 	printf("Features=0x%b", features,
1891 	       "\020"
1892 	       "\001NP"			/* Nested paging */
1893 	       "\002LbrVirt"		/* LBR virtualization */
1894 	       "\003SVML"		/* SVM lock */
1895 	       "\004NRIPS"		/* NRIP save */
1896 	       "\005TscRateMsr"		/* MSR based TSC rate control */
1897 	       "\006VmcbClean"		/* VMCB clean bits */
1898 	       "\007FlushByAsid"	/* Flush by ASID */
1899 	       "\010DecodeAssist"	/* Decode assist */
1900 	       "\011<b8>"
1901 	       "\012<b9>"
1902 	       "\013PauseFilter"	/* PAUSE intercept filter */
1903 	       "\014<b11>"
1904 	       "\015PauseFilterThreshold" /* PAUSE filter threshold */
1905 	       "\016AVIC"		/* virtual interrupt controller */
1906                 );
1907 	printf("\nRevision=%d, ASIDs=%d", regs[0] & 0xff, regs[1]);
1908 }
1909 
1910 #ifdef __i386__
1911 static void
1912 print_transmeta_info(void)
1913 {
1914 	u_int regs[4], nreg = 0;
1915 
1916 	do_cpuid(0x80860000, regs);
1917 	nreg = regs[0];
1918 	if (nreg >= 0x80860001) {
1919 		do_cpuid(0x80860001, regs);
1920 		printf("  Processor revision %u.%u.%u.%u\n",
1921 		       (regs[1] >> 24) & 0xff,
1922 		       (regs[1] >> 16) & 0xff,
1923 		       (regs[1] >> 8) & 0xff,
1924 		       regs[1] & 0xff);
1925 	}
1926 	if (nreg >= 0x80860002) {
1927 		do_cpuid(0x80860002, regs);
1928 		printf("  Code Morphing Software revision %u.%u.%u-%u-%u\n",
1929 		       (regs[1] >> 24) & 0xff,
1930 		       (regs[1] >> 16) & 0xff,
1931 		       (regs[1] >> 8) & 0xff,
1932 		       regs[1] & 0xff,
1933 		       regs[2]);
1934 	}
1935 	if (nreg >= 0x80860006) {
1936 		char info[65];
1937 		do_cpuid(0x80860003, (u_int*) &info[0]);
1938 		do_cpuid(0x80860004, (u_int*) &info[16]);
1939 		do_cpuid(0x80860005, (u_int*) &info[32]);
1940 		do_cpuid(0x80860006, (u_int*) &info[48]);
1941 		info[64] = 0;
1942 		printf("  %s\n", info);
1943 	}
1944 }
1945 #endif
1946 
1947 static void
1948 print_via_padlock_info(void)
1949 {
1950 	u_int regs[4];
1951 
1952 	do_cpuid(0xc0000001, regs);
1953 	printf("\n  VIA Padlock Features=0x%b", regs[3],
1954 	"\020"
1955 	"\003RNG"		/* RNG */
1956 	"\007AES"		/* ACE */
1957 	"\011AES-CTR"		/* ACE2 */
1958 	"\013SHA1,SHA256"	/* PHE */
1959 	"\015RSA"		/* PMM */
1960 	);
1961 }
1962 
1963 static uint32_t
1964 vmx_settable(uint64_t basic, int msr, int true_msr)
1965 {
1966 	uint64_t val;
1967 
1968 	if (basic & (1ULL << 55))
1969 		val = rdmsr(true_msr);
1970 	else
1971 		val = rdmsr(msr);
1972 
1973 	/* Just report the controls that can be set to 1. */
1974 	return (val >> 32);
1975 }
1976 
1977 static void
1978 print_vmx_info(void)
1979 {
1980 	uint64_t basic, msr;
1981 	uint32_t entry, exit, mask, pin, proc, proc2;
1982 	int comma;
1983 
1984 	printf("\n  VT-x: ");
1985 	msr = rdmsr(MSR_IA32_FEATURE_CONTROL);
1986 	if (!(msr & IA32_FEATURE_CONTROL_VMX_EN))
1987 		printf("(disabled in BIOS) ");
1988 	basic = rdmsr(MSR_VMX_BASIC);
1989 	pin = vmx_settable(basic, MSR_VMX_PINBASED_CTLS,
1990 	    MSR_VMX_TRUE_PINBASED_CTLS);
1991 	proc = vmx_settable(basic, MSR_VMX_PROCBASED_CTLS,
1992 	    MSR_VMX_TRUE_PROCBASED_CTLS);
1993 	if (proc & PROCBASED_SECONDARY_CONTROLS)
1994 		proc2 = vmx_settable(basic, MSR_VMX_PROCBASED_CTLS2,
1995 		    MSR_VMX_PROCBASED_CTLS2);
1996 	else
1997 		proc2 = 0;
1998 	exit = vmx_settable(basic, MSR_VMX_EXIT_CTLS, MSR_VMX_TRUE_EXIT_CTLS);
1999 	entry = vmx_settable(basic, MSR_VMX_ENTRY_CTLS, MSR_VMX_TRUE_ENTRY_CTLS);
2000 
2001 	if (!bootverbose) {
2002 		comma = 0;
2003 		if (exit & VM_EXIT_SAVE_PAT && exit & VM_EXIT_LOAD_PAT &&
2004 		    entry & VM_ENTRY_LOAD_PAT) {
2005 			printf("%sPAT", comma ? "," : "");
2006 			comma = 1;
2007 		}
2008 		if (proc & PROCBASED_HLT_EXITING) {
2009 			printf("%sHLT", comma ? "," : "");
2010 			comma = 1;
2011 		}
2012 		if (proc & PROCBASED_MTF) {
2013 			printf("%sMTF", comma ? "," : "");
2014 			comma = 1;
2015 		}
2016 		if (proc & PROCBASED_PAUSE_EXITING) {
2017 			printf("%sPAUSE", comma ? "," : "");
2018 			comma = 1;
2019 		}
2020 		if (proc2 & PROCBASED2_ENABLE_EPT) {
2021 			printf("%sEPT", comma ? "," : "");
2022 			comma = 1;
2023 		}
2024 		if (proc2 & PROCBASED2_UNRESTRICTED_GUEST) {
2025 			printf("%sUG", comma ? "," : "");
2026 			comma = 1;
2027 		}
2028 		if (proc2 & PROCBASED2_ENABLE_VPID) {
2029 			printf("%sVPID", comma ? "," : "");
2030 			comma = 1;
2031 		}
2032 		if (proc & PROCBASED_USE_TPR_SHADOW &&
2033 		    proc2 & PROCBASED2_VIRTUALIZE_APIC_ACCESSES &&
2034 		    proc2 & PROCBASED2_VIRTUALIZE_X2APIC_MODE &&
2035 		    proc2 & PROCBASED2_APIC_REGISTER_VIRTUALIZATION &&
2036 		    proc2 & PROCBASED2_VIRTUAL_INTERRUPT_DELIVERY) {
2037 			printf("%sVID", comma ? "," : "");
2038 			comma = 1;
2039 			if (pin & PINBASED_POSTED_INTERRUPT)
2040 				printf(",PostIntr");
2041 		}
2042 		return;
2043 	}
2044 
2045 	mask = basic >> 32;
2046 	printf("Basic Features=0x%b", mask,
2047 	"\020"
2048 	"\02132PA"		/* 32-bit physical addresses */
2049 	"\022SMM"		/* SMM dual-monitor */
2050 	"\027INS/OUTS"		/* VM-exit info for INS and OUTS */
2051 	"\030TRUE"		/* TRUE_CTLS MSRs */
2052 	);
2053 	printf("\n        Pin-Based Controls=0x%b", pin,
2054 	"\020"
2055 	"\001ExtINT"		/* External-interrupt exiting */
2056 	"\004NMI"		/* NMI exiting */
2057 	"\006VNMI"		/* Virtual NMIs */
2058 	"\007PreTmr"		/* Activate VMX-preemption timer */
2059 	"\010PostIntr"		/* Process posted interrupts */
2060 	);
2061 	printf("\n        Primary Processor Controls=0x%b", proc,
2062 	"\020"
2063 	"\003INTWIN"		/* Interrupt-window exiting */
2064 	"\004TSCOff"		/* Use TSC offsetting */
2065 	"\010HLT"		/* HLT exiting */
2066 	"\012INVLPG"		/* INVLPG exiting */
2067 	"\013MWAIT"		/* MWAIT exiting */
2068 	"\014RDPMC"		/* RDPMC exiting */
2069 	"\015RDTSC"		/* RDTSC exiting */
2070 	"\020CR3-LD"		/* CR3-load exiting */
2071 	"\021CR3-ST"		/* CR3-store exiting */
2072 	"\024CR8-LD"		/* CR8-load exiting */
2073 	"\025CR8-ST"		/* CR8-store exiting */
2074 	"\026TPR"		/* Use TPR shadow */
2075 	"\027NMIWIN"		/* NMI-window exiting */
2076 	"\030MOV-DR"		/* MOV-DR exiting */
2077 	"\031IO"		/* Unconditional I/O exiting */
2078 	"\032IOmap"		/* Use I/O bitmaps */
2079 	"\034MTF"		/* Monitor trap flag */
2080 	"\035MSRmap"		/* Use MSR bitmaps */
2081 	"\036MONITOR"		/* MONITOR exiting */
2082 	"\037PAUSE"		/* PAUSE exiting */
2083 	);
2084 	if (proc & PROCBASED_SECONDARY_CONTROLS)
2085 		printf("\n        Secondary Processor Controls=0x%b", proc2,
2086 		"\020"
2087 		"\001APIC"		/* Virtualize APIC accesses */
2088 		"\002EPT"		/* Enable EPT */
2089 		"\003DT"		/* Descriptor-table exiting */
2090 		"\004RDTSCP"		/* Enable RDTSCP */
2091 		"\005x2APIC"		/* Virtualize x2APIC mode */
2092 		"\006VPID"		/* Enable VPID */
2093 		"\007WBINVD"		/* WBINVD exiting */
2094 		"\010UG"		/* Unrestricted guest */
2095 		"\011APIC-reg"		/* APIC-register virtualization */
2096 		"\012VID"		/* Virtual-interrupt delivery */
2097 		"\013PAUSE-loop"	/* PAUSE-loop exiting */
2098 		"\014RDRAND"		/* RDRAND exiting */
2099 		"\015INVPCID"		/* Enable INVPCID */
2100 		"\016VMFUNC"		/* Enable VM functions */
2101 		"\017VMCS"		/* VMCS shadowing */
2102 		"\020EPT#VE"		/* EPT-violation #VE */
2103 		"\021XSAVES"		/* Enable XSAVES/XRSTORS */
2104 		);
2105 	printf("\n        Exit Controls=0x%b", mask,
2106 	"\020"
2107 	"\003DR"		/* Save debug controls */
2108 				/* Ignore Host address-space size */
2109 	"\015PERF"		/* Load MSR_PERF_GLOBAL_CTRL */
2110 	"\020AckInt"		/* Acknowledge interrupt on exit */
2111 	"\023PAT-SV"		/* Save MSR_PAT */
2112 	"\024PAT-LD"		/* Load MSR_PAT */
2113 	"\025EFER-SV"		/* Save MSR_EFER */
2114 	"\026EFER-LD"		/* Load MSR_EFER */
2115 	"\027PTMR-SV"		/* Save VMX-preemption timer value */
2116 	);
2117 	printf("\n        Entry Controls=0x%b", mask,
2118 	"\020"
2119 	"\003DR"		/* Save debug controls */
2120 				/* Ignore IA-32e mode guest */
2121 				/* Ignore Entry to SMM */
2122 				/* Ignore Deactivate dual-monitor treatment */
2123 	"\016PERF"		/* Load MSR_PERF_GLOBAL_CTRL */
2124 	"\017PAT"		/* Load MSR_PAT */
2125 	"\020EFER"		/* Load MSR_EFER */
2126 	);
2127 	if (proc & PROCBASED_SECONDARY_CONTROLS &&
2128 	    (proc2 & (PROCBASED2_ENABLE_EPT | PROCBASED2_ENABLE_VPID)) != 0) {
2129 		msr = rdmsr(MSR_VMX_EPT_VPID_CAP);
2130 		mask = msr;
2131 		printf("\n        EPT Features=0x%b", mask,
2132 		"\020"
2133 		"\001XO"		/* Execute-only translations */
2134 		"\007PW4"		/* Page-walk length of 4 */
2135 		"\011UC"		/* EPT paging-structure mem can be UC */
2136 		"\017WB"		/* EPT paging-structure mem can be WB */
2137 		"\0212M"		/* EPT PDE can map a 2-Mbyte page */
2138 		"\0221G"		/* EPT PDPTE can map a 1-Gbyte page */
2139 		"\025INVEPT"		/* INVEPT is supported */
2140 		"\026AD"		/* Accessed and dirty flags for EPT */
2141 		"\032single"		/* INVEPT single-context type */
2142 		"\033all"		/* INVEPT all-context type */
2143 		);
2144 		mask = msr >> 32;
2145 		printf("\n        VPID Features=0x%b", mask,
2146 		"\020"
2147 		"\001INVVPID"		/* INVVPID is supported */
2148 		"\011individual"	/* INVVPID individual-address type */
2149 		"\012single"		/* INVVPID single-context type */
2150 		"\013all"		/* INVVPID all-context type */
2151 		 /* INVVPID single-context-retaining-globals type */
2152 		"\014single-globals"
2153 		);
2154 	}
2155 }
2156 
2157 static void
2158 print_hypervisor_info(void)
2159 {
2160 
2161 	if (*hv_vendor)
2162 		printf("Hypervisor: Origin = \"%s\"\n", hv_vendor);
2163 }
2164