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