summaryrefslogtreecommitdiff
path: root/sys/arch/x86/include/specialreg.h
blob: d6d7c0a4f069528389b0b2e7d5c611641acffb1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
/*	$NetBSD: specialreg.h,v 1.206 2023/04/11 06:42:30 msaitoh Exp $	*/

/*
 * Copyright (c) 2014-2020 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * Copyright (c) 1991 The Regents of the University of California.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *	@(#)specialreg.h	7.1 (Berkeley) 5/9/91
 */

/*
 * CR0
 */
#define CR0_PE	0x00000001	/* Protected mode Enable */
#define CR0_MP	0x00000002	/* "Math" Present (NPX or NPX emulator) */
#define CR0_EM	0x00000004	/* EMulate non-NPX coproc. (trap ESC only) */
#define CR0_TS	0x00000008	/* Task Switched (if MP, trap ESC and WAIT) */
#define CR0_ET	0x00000010	/* Extension Type (387 (if set) vs 287) */
#define CR0_NE	0x00000020	/* Numeric Error enable (EX16 vs IRQ13) */
#define CR0_WP	0x00010000	/* Write Protect (honor PTE_W in all modes) */
#define CR0_AM	0x00040000	/* Alignment Mask (set to enable AC flag) */
#define CR0_NW	0x20000000	/* Not Write-through */
#define CR0_CD	0x40000000	/* Cache Disable */
#define CR0_PG	0x80000000	/* PaGing enable */

/*
 * Cyrix 486 DLC special registers, accessible as IO ports
 */
#define CCR0		0xc0	/* configuration control register 0 */
#define CCR0_NC0	0x01	/* first 64K of each 1M memory region is non-cacheable */
#define CCR0_NC1	0x02	/* 640K-1M region is non-cacheable */
#define CCR0_A20M	0x04	/* enables A20M# input pin */
#define CCR0_KEN	0x08	/* enables KEN# input pin */
#define CCR0_FLUSH	0x10	/* enables FLUSH# input pin */
#define CCR0_BARB	0x20	/* flushes internal cache when entering hold state */
#define CCR0_CO		0x40	/* cache org: 1=direct mapped, 0=2x set assoc */
#define CCR0_SUSPEND	0x80	/* enables SUSP# and SUSPA# pins */
#define CCR1		0xc1	/* configuration control register 1 */
#define CCR1_RPL	0x01	/* enables RPLSET and RPLVAL# pins */

/*
 * CR3
 */
#define CR3_PCID		__BITS(11,0)
#define CR3_PA			__BITS(62,12)
#define CR3_NO_TLB_FLUSH	__BIT(63)

/*
 * CR4
 */
#define CR4_VME		0x00000001 /* Virtual 8086 mode extension enable */
#define CR4_PVI		0x00000002 /* Protected mode virtual interrupt enable */
#define CR4_TSD		0x00000004 /* Restrict RDTSC instruction to cpl 0 */
#define CR4_DE		0x00000008 /* Debugging extension */
#define CR4_PSE		0x00000010 /* Large (4MB) page size enable */
#define CR4_PAE		0x00000020 /* Physical address extension enable */
#define CR4_MCE		0x00000040 /* Machine check enable */
#define CR4_PGE		0x00000080 /* Page global enable */
#define CR4_PCE		0x00000100 /* Enable RDPMC instruction for all cpls */
#define CR4_OSFXSR	0x00000200 /* Enable fxsave/fxrestor and SSE */
#define CR4_OSXMMEXCPT	0x00000400 /* Enable unmasked SSE exceptions */
#define CR4_UMIP	0x00000800 /* User Mode Instruction Prevention */
#define CR4_LA57	0x00001000 /* 57-bit linear addresses */
#define CR4_VMXE	0x00002000 /* Enable VMX operations */
#define CR4_SMXE	0x00004000 /* Enable SMX operations */
#define CR4_FSGSBASE	0x00010000 /* Enable *FSBASE and *GSBASE instructions */
#define CR4_PCIDE	0x00020000 /* Enable Process Context IDentifiers */
#define CR4_OSXSAVE	0x00040000 /* Enable xsave and xrestore */
#define CR4_SMEP	0x00100000 /* Enable SMEP support */
#define CR4_SMAP	0x00200000 /* Enable SMAP support */
#define CR4_PKE		0x00400000 /* Enable Protection Keys for user pages */
#define CR4_CET		0x00800000 /* Enable CET */
#define CR4_PKS		0x01000000 /* Enable Protection Keys for kern pages */

/*
 * Extended Control Register XCR0
 */
#define XCR0_X87	__BIT(0)	/* x87 FPU/MMX state */
#define XCR0_SSE	__BIT(1)	/* SSE state */
#define XCR0_YMM_Hi128	__BIT(2)	/* AVX-256 (ymmn registers) */
#define XCR0_BNDREGS	__BIT(3)	/* Memory protection ext bounds */
#define XCR0_BNDCSR	__BIT(4)	/* Memory protection ext state */
#define XCR0_Opmask	__BIT(5)	/* AVX-512 Opmask */
#define XCR0_ZMM_Hi256	__BIT(6)	/* AVX-512 upper 256 bits low regs */
#define XCR0_Hi16_ZMM	__BIT(7)	/* AVX-512 512 bits upper registers */
#define XCR0_PT		__BIT(8)	/* Processor Trace state */
#define XCR0_PKRU	__BIT(9)	/* Protection Key state */
#define XCR0_CET_U	__BIT(11)	/* User CET state */
#define XCR0_CET_S	__BIT(12)	/* Kern CET state */
#define XCR0_HDC	__BIT(13)	/* Hardware Duty Cycle state */
#define XCR0_LBR	__BIT(15)	/* Last Branch Record */
#define XCR0_HWP	__BIT(16)	/* Hardware P-states */

#define XCR0_FLAGS1	"\20"						  \
	"\1" "x87"	"\2" "SSE"	"\3" "AVX"	"\4" "BNDREGS"	  \
	"\5" "BNDCSR"	"\6" "Opmask"	"\7" "ZMM_Hi256" "\10" "Hi16_ZMM" \
	"\11" "PT"	"\12" "PKRU"			"\14" "CET_U"	  \
	"\15" "CET_S"	"\16" "HDC"			"\20" "LBR"	  \
	"\21" "HWP"

/*
 * Known FPU bits, only these get enabled. The save area is sized for all the
 * fields below.
 */
#define XCR0_FPU	(XCR0_X87 | XCR0_SSE | XCR0_YMM_Hi128 | \
			 XCR0_Opmask | XCR0_ZMM_Hi256 | XCR0_Hi16_ZMM)

/*
 * XSAVE component indices, internal to NetBSD.
 */
#define XSAVE_X87	0
#define XSAVE_SSE	1
#define XSAVE_YMM_Hi128	2
#define XSAVE_BNDREGS	3
#define XSAVE_BNDCSR	4
#define XSAVE_Opmask	5
#define XSAVE_ZMM_Hi256	6
#define XSAVE_Hi16_ZMM	7

/*
 * Highest XSAVE component enabled by XCR0_FPU.
 */
#define XSAVE_MAX_COMPONENT XSAVE_Hi16_ZMM

/*
 * "features" bits.
 * CPUID Fn00000001
 */
/* %edx */
#define CPUID_FPU	0x00000001	/* processor has an FPU? */
#define CPUID_VME	0x00000002	/* has virtual mode (%cr4's VME/PVI) */
#define CPUID_DE	0x00000004	/* has debugging extension */
#define CPUID_PSE	0x00000008	/* has 4MB page size extension */
#define CPUID_TSC	0x00000010	/* has time stamp counter */
#define CPUID_MSR	0x00000020	/* has model specific registers */
#define CPUID_PAE	0x00000040	/* has physical address extension */
#define CPUID_MCE	0x00000080	/* has machine check exception */
#define CPUID_CX8	0x00000100	/* has CMPXCHG8B instruction */
#define CPUID_APIC	0x00000200	/* has enabled APIC */
#define CPUID_SEP	0x00000800	/* has SYSENTER/SYSEXIT extension */
#define CPUID_MTRR	0x00001000	/* has memory type range register */
#define CPUID_PGE	0x00002000	/* has page global extension */
#define CPUID_MCA	0x00004000	/* has machine check architecture */
#define CPUID_CMOV	0x00008000	/* has CMOVcc instruction */
#define CPUID_PAT	0x00010000	/* Page Attribute Table */
#define CPUID_PSE36	0x00020000	/* 36-bit PSE */
#define CPUID_PSN	0x00040000	/* Processor Serial Number */
#define CPUID_CLFSH	0x00080000	/* CLFLUSH instruction supported */
#define CPUID_DS	0x00200000	/* Debug Store */
#define CPUID_ACPI	0x00400000	/* ACPI performance modulation regs */
#define CPUID_MMX	0x00800000	/* MMX supported */
#define CPUID_FXSR	0x01000000	/* Fast FP/MMX Save/Restore */
#define CPUID_SSE	0x02000000	/* Streaming SIMD Extensions */
#define CPUID_SSE2	0x04000000	/* Streaming SIMD Extensions #2 */
#define CPUID_SS	0x08000000	/* Self-Snoop */
#define CPUID_HTT	0x10000000	/* Hyper-Threading Technology */
#define CPUID_TM	0x20000000	/* Thermal Monitor (TCC) */
#define CPUID_PBE	0x80000000	/* Pending Break Enable */

#define CPUID_FLAGS1	"\20"						\
	"\1" "FPU"	"\2" "VME"	"\3" "DE"	"\4" "PSE"	\
	"\5" "TSC"	"\6" "MSR"	"\7" "PAE"	"\10" "MCE"	\
	"\11" "CX8"	"\12" "APIC"	"\13" "B10"	"\14" "SEP"	\
	"\15" "MTRR"	"\16" "PGE"	"\17" "MCA"	"\20" "CMOV"	\
	"\21" "PAT"	"\22" "PSE36"	"\23" "PN"	"\24" "CLFSH"	\
	"\25" "B20"	"\26" "DS"	"\27" "ACPI"	"\30" "MMX"	\
	"\31" "FXSR"	"\32" "SSE"	"\33" "SSE2"	"\34" "SS"	\
	"\35" "HTT"	"\36" "TM"	"\37" "IA64"	"\40" "PBE"

/* Blacklists of CPUID flags - used to mask certain features */
#ifdef XENPV
#define CPUID_FEAT_BLACKLIST	 (CPUID_PGE|CPUID_PSE|CPUID_MTRR)
#else
#define CPUID_FEAT_BLACKLIST	 0
#endif

/* %ecx */
#define CPUID2_SSE3	__BIT(0)	/* Streaming SIMD Extensions 3 */
#define CPUID2_PCLMULQDQ __BIT(1)	/* PCLMULQDQ instructions */
#define CPUID2_DTES64	__BIT(2)	/* 64-bit Debug Trace */
#define CPUID2_MONITOR	__BIT(3)	/* MONITOR/MWAIT instructions */
#define CPUID2_DS_CPL	__BIT(4)	/* CPL Qualified Debug Store */
#define CPUID2_VMX	__BIT(5)	/* Virtual Machine eXtensions */
#define CPUID2_SMX	__BIT(6)	/* Safer Mode eXtensions */
#define CPUID2_EST	__BIT(7)	/* Enhanced SpeedStep Technology */
#define CPUID2_TM2	__BIT(8)	/* Thermal Monitor 2 */
#define CPUID2_SSSE3	__BIT(9)	/* Supplemental SSE3 */
#define CPUID2_CNXTID	__BIT(10)	/* Context ID */
#define CPUID2_SDBG	__BIT(11)	/* Silicon Debug */
#define CPUID2_FMA	__BIT(12)	/* Fused Multiply Add */
#define CPUID2_CX16	__BIT(13)	/* CMPXCHG16B instruction */
#define CPUID2_XTPR	__BIT(14)	/* Task Priority Messages disabled? */
#define CPUID2_PDCM	__BIT(15)	/* Perf/Debug Capability MSR */
/* bit 16 unused	__BIT(16) */
#define CPUID2_PCID	__BIT(17)	/* Process Context ID */
#define CPUID2_DCA	__BIT(18)	/* Direct Cache Access */
#define CPUID2_SSE41	__BIT(19)	/* Streaming SIMD Extensions 4.1 */
#define CPUID2_SSE42	__BIT(20)	/* Streaming SIMD Extensions 4.2 */
#define CPUID2_X2APIC	__BIT(21)	/* xAPIC Extensions */
#define CPUID2_MOVBE	__BIT(22)	/* MOVBE (move after byteswap) */
#define CPUID2_POPCNT	__BIT(23)	/* POPCNT instruction available */
#define CPUID2_DEADLINE	__BIT(24)	/* APIC Timer supports TSC Deadline */
#define CPUID2_AESNI	__BIT(25)	/* AES instructions */
#define CPUID2_XSAVE	__BIT(26)	/* XSAVE instructions */
#define CPUID2_OSXSAVE	__BIT(27)	/* XGETBV/XSETBV instructions */
#define CPUID2_AVX	__BIT(28)	/* AVX instructions */
#define CPUID2_F16C	__BIT(29)	/* half precision conversion */
#define CPUID2_RDRAND	__BIT(30)	/* RDRAND (hardware random number) */
#define CPUID2_RAZ	__BIT(31)	/* RAZ. Indicates guest state. */

#define CPUID2_FLAGS1	"\20"						\
	"\1" "SSE3"	"\2" "PCLMULQDQ" "\3" "DTES64"	"\4" "MONITOR"	\
	"\5" "DS-CPL"	"\6" "VMX"	"\7" "SMX"	"\10" "EST"	\
	"\11" "TM2"	"\12" "SSSE3"	"\13" "CID"	"\14" "SDBG"	\
	"\15" "FMA"	"\16" "CX16"	"\17" "xTPR"	"\20" "PDCM"	\
	"\21" "B16"	"\22" "PCID"	"\23" "DCA"	"\24" "SSE41"	\
	"\25" "SSE42"	"\26" "X2APIC"	"\27" "MOVBE"	"\30" "POPCNT"	\
	"\31" "DEADLINE" "\32" "AES"	"\33" "XSAVE"	"\34" "OSXSAVE"	\
	"\35" "AVX"	"\36" "F16C"	"\37" "RDRAND"	"\40" "RAZ"

/* %eax */
#define CPUID_TO_BASEFAMILY(cpuid)	(((cpuid) >> 8) & 0xf)
#define CPUID_TO_BASEMODEL(cpuid)	(((cpuid) >> 4) & 0xf)
#define CPUID_TO_STEPPING(cpuid)	((cpuid) & 0xf)

/*
 * The Extended family bits should only be inspected when CPUID_TO_BASEFAMILY()
 * returns 15. They are use to encode family value 16 to 270 (add 15).
 * The Extended model bits are the high 4 bits of the model.
 * They are only valid for family >= 15 or family 6 (intel, but all amd
 * family 6 are documented to return zero bits for them).
 */
#define CPUID_TO_EXTFAMILY(cpuid)	(((cpuid) >> 20) & 0xff)
#define CPUID_TO_EXTMODEL(cpuid)	(((cpuid) >> 16) & 0xf)

/* The macros for the Display Family and the Display Model */
#define CPUID_TO_FAMILY(cpuid)	(CPUID_TO_BASEFAMILY(cpuid)	\
	    + ((CPUID_TO_BASEFAMILY(cpuid) != 0x0f)		\
		? 0 : CPUID_TO_EXTFAMILY(cpuid)))
#define CPUID_TO_MODEL(cpuid)	(CPUID_TO_BASEMODEL(cpuid)	\
	    | ((CPUID_TO_BASEFAMILY(cpuid) != 0x0f)		\
		&& (CPUID_TO_BASEFAMILY(cpuid) != 0x06)		\
		? 0 : (CPUID_TO_EXTMODEL(cpuid) << 4)))

/* %ebx */
#define CPUID_BRAND_INDEX	__BITS(7,0)
#define CPUID_CLFLUSH_SIZE	__BITS(15,8)
#define CPUID_HTT_CORES		__BITS(23,16)
#define CPUID_LOCAL_APIC_ID	__BITS(31,24)

/*
 * Intel Deterministic Cache Parameter.
 * CPUID Fn0000_0004
 */

/* %eax */
#define CPUID_DCP_CACHETYPE	__BITS(4, 0)	/* Cache type */
#define CPUID_DCP_CACHETYPE_N	0		/*   NULL */
#define CPUID_DCP_CACHETYPE_D	1		/*   Data cache */
#define CPUID_DCP_CACHETYPE_I	2		/*   Instruction cache */
#define CPUID_DCP_CACHETYPE_U	3		/*   Unified cache */
#define CPUID_DCP_CACHELEVEL	__BITS(7, 5)	/* Cache level (start at 1) */
#define CPUID_DCP_SELFINITCL	__BIT(8)	/* Self initializing cachelvl*/
#define CPUID_DCP_FULLASSOC	__BIT(9)	/* Full associative */
#define CPUID_DCP_SHARING	__BITS(25, 14)	/* sharing */
#define CPUID_DCP_CORE_P_PKG	__BITS(31, 26)	/* Cores/package */

/* %ebx */
#define CPUID_DCP_LINESIZE	__BITS(11, 0)	/* System coherency linesize */
#define CPUID_DCP_PARTITIONS	__BITS(21, 12)	/* Physical line partitions */
#define CPUID_DCP_WAYS		__BITS(31, 22)	/* Ways of associativity */

/* %ecx: Number of sets */

/* %edx */
#define CPUID_DCP_INVALIDATE	__BIT(0)	/* WB invalidate/invalidate */
#define CPUID_DCP_INCLUSIVE	__BIT(1)	/* Cache inclusiveness */
#define CPUID_DCP_COMPLEX	__BIT(2)	/* Complex cache indexing */

/*
 * Intel/AMD MONITOR/MWAIT.
 * CPUID Fn0000_0005
 */
/* %eax */
#define CPUID_MON_MINSIZE	__BITS(15, 0)  /* Smallest monitor-line size */
/* %ebx */
#define CPUID_MON_MAXSIZE	__BITS(15, 0)  /* Largest monitor-line size */
/* %ecx */
#define CPUID_MON_EMX		__BIT(0)       /* MONITOR/MWAIT Extensions */
#define CPUID_MON_IBE		__BIT(1)       /* Interrupt as Break Event */

#define CPUID_MON_FLAGS	"\20" \
	"\1" "EMX"	"\2" "IBE"

/* %edx: number of substates for specific C-state */
#define CPUID_MON_SUBSTATE(edx, cstate) (((edx) >> (cstate * 4)) & 0x0000000f)

/*
 * Intel/AMD Digital Thermal Sensor and Power Management.
 * CPUID Fn0000_0006
 */
/* %eax */
#define CPUID_DSPM_DTS	      __BIT(0)	/* Digital Thermal Sensor */
#define CPUID_DSPM_IDA	      __BIT(1)	/* Intel Dynamic Acceleration */
#define CPUID_DSPM_ARAT	      __BIT(2)	/* Always Running APIC Timer */
#define CPUID_DSPM_PLN	      __BIT(4)	/* Power Limit Notification */
#define CPUID_DSPM_ECMD	      __BIT(5)	/* Clock Modulation Extension */
#define CPUID_DSPM_PTM	      __BIT(6)	/* Package Level Thermal Management */
#define CPUID_DSPM_HWP	      __BIT(7)	/* HWP */
#define CPUID_DSPM_HWP_NOTIFY __BIT(8)	/* HWP Notification */
#define CPUID_DSPM_HWP_ACTWIN __BIT(9)	/* HWP Activity Window */
#define CPUID_DSPM_HWP_EPP    __BIT(10)	/* HWP Energy Performance Preference */
#define CPUID_DSPM_HWP_PLR    __BIT(11)	/* HWP Package Level Request */
#define CPUID_DSPM_HDC	      __BIT(13)	/* Hardware Duty Cycling */
#define CPUID_DSPM_TBMT3      __BIT(14)	/* Turbo Boost Max Technology 3.0 */
#define CPUID_DSPM_HWP_CAP    __BIT(15)	/* HWP Capabilities */
#define CPUID_DSPM_HWP_PECI   __BIT(16)	/* HWP PECI override */
#define CPUID_DSPM_HWP_FLEX   __BIT(17)	/* Flexible HWP */
#define CPUID_DSPM_HWP_FAST   __BIT(18)	/* Fast access for IA32_HWP_REQUEST */
#define CPUID_DSPM_HFI	      __BIT(19) /* Hardware Feedback Interface */
#define CPUID_DSPM_HWP_IGNIDL __BIT(20)	/* Ignore Idle Logical Processor HWP */
#define CPUID_DSPM_TD	      __BIT(23)	/* Thread Director */
#define CPUID_DSPM_THERMI_HFN __BIT(24) /* THERM_INTERRUPT MSR HFN bit */

#define CPUID_DSPM_FLAGS	"\20"					      \
	"\1" "DTS"	"\2" "IDA"	"\3" "ARAT" 			      \
	"\5" "PLN"	"\6" "ECMD"	"\7" "PTM"	"\10" "HWP"	      \
	"\11" "HWP_NOTIFY" "\12" "HWP_ACTWIN" "\13" "HWP_EPP" "\14" "HWP_PLR" \
			"\16" "HDC"	"\17" "TBM3"	"\20" "HWP_CAP"       \
	"\21" "HWP_PECI" "\22" "HWP_FLEX" "\23" "HWP_FAST" "\24HFI"	      \
	"\25" "HWP_IGNIDL"				"\30" "TD"	      \
	"\31" "THERMI_HFN"

/* %ecx */
#define CPUID_DSPM_HWF	__BIT(0)	/* MSR_APERF/MSR_MPERF available */
#define CPUID_DSPM_EPB	__BIT(3)	/* Energy Performance Bias */
#define CPUID_DSPM_NTDC	__BITS(15, 8)	/* Number of Thread Director Classes */

#define CPUID_DSPM_FLAGS1	"\177\20"				\
	"b\0HWF\0"					"b\3EPB\0"	\
	"f\10\10NTDC\0"

/*
 * Intel/AMD Structured Extended Feature.
 * CPUID Fn0000_0007
 * %ecx == 0: Subleaf 0
 *	%eax: The Maximum input value for supported subleaf.
 *	%ebx: Feature bits.
 *	%ecx: Feature bits.
 *	%edx: Feature bits.
 *
 * %ecx == 1: Structure Extendede Feature Enumeration Sub-leaf
 *	%eax: See below.
 */

/* %ecx = 0, %ebx */
#define CPUID_SEF_FSGSBASE    __BIT(0)  /* {RD,WR}{FS,GS}BASE */
#define CPUID_SEF_TSC_ADJUST  __BIT(1)  /* IA32_TSC_ADJUST MSR support */
#define CPUID_SEF_SGX	      __BIT(2)  /* Software Guard Extensions */
#define CPUID_SEF_BMI1	      __BIT(3)  /* Advanced bit manipulation ext. 1st grp */
#define CPUID_SEF_HLE	      __BIT(4)  /* Hardware Lock Elision */
#define CPUID_SEF_AVX2	      __BIT(5)  /* Advanced Vector Extensions 2 */
#define CPUID_SEF_FDPEXONLY   __BIT(6)  /* x87FPU Data ptr updated only on x87exp */
#define CPUID_SEF_SMEP	      __BIT(7)  /* Supervisor-Mode Execution Prevention */
#define CPUID_SEF_BMI2	      __BIT(8)  /* Advanced bit manipulation ext. 2nd grp */
#define CPUID_SEF_ERMS	      __BIT(9)  /* Enhanced REP MOVSB/STOSB */
#define CPUID_SEF_INVPCID     __BIT(10) /* INVPCID instruction */
#define CPUID_SEF_RTM	      __BIT(11) /* Restricted Transactional Memory */
#define CPUID_SEF_QM	      __BIT(12) /* Resource Director Technology Monitoring */
#define CPUID_SEF_FPUCSDS     __BIT(13) /* Deprecate FPU CS and FPU DS values */
#define CPUID_SEF_MPX	      __BIT(14) /* Memory Protection Extensions */
#define CPUID_SEF_PQE	      __BIT(15) /* Resource Director Technology Allocation */
#define CPUID_SEF_AVX512F     __BIT(16) /* AVX-512 Foundation */
#define CPUID_SEF_AVX512DQ    __BIT(17) /* AVX-512 Double/Quadword */
#define CPUID_SEF_RDSEED      __BIT(18) /* RDSEED instruction */
#define CPUID_SEF_ADX	      __BIT(19) /* ADCX/ADOX instructions */
#define CPUID_SEF_SMAP	      __BIT(20) /* Supervisor-Mode Access Prevention */
#define CPUID_SEF_AVX512_IFMA __BIT(21) /* AVX-512 Integer Fused Multiply Add */
/* Bit 22 was PCOMMIT */
#define CPUID_SEF_CLFLUSHOPT  __BIT(23) /* Cache Line FLUSH OPTimized */
#define CPUID_SEF_CLWB	      __BIT(24) /* Cache Line Write Back */
#define CPUID_SEF_PT	      __BIT(25) /* Processor Trace */
#define CPUID_SEF_AVX512PF    __BIT(26) /* AVX-512 PreFetch */
#define CPUID_SEF_AVX512ER    __BIT(27) /* AVX-512 Exponential and Reciprocal */
#define CPUID_SEF_AVX512CD    __BIT(28) /* AVX-512 Conflict Detection */
#define CPUID_SEF_SHA	      __BIT(29) /* SHA Extensions */
#define CPUID_SEF_AVX512BW    __BIT(30) /* AVX-512 Byte and Word */
#define CPUID_SEF_AVX512VL    __BIT(31) /* AVX-512 Vector Length */

#define CPUID_SEF_FLAGS	"\20"						   \
	"\1" "FSGSBASE"	"\2" "TSCADJUST" "\3" "SGX"	"\4" "BMI1"	   \
	"\5" "HLE"	"\6" "AVX2"	"\7" "FDPEXONLY" "\10" "SMEP"	   \
	"\11" "BMI2"	"\12" "ERMS"	"\13" "INVPCID"	"\14" "RTM"	   \
	"\15" "QM"	"\16" "FPUCSDS"	"\17" "MPX"    	"\20" "PQE"	   \
	"\21" "AVX512F"	"\22" "AVX512DQ" "\23" "RDSEED"	"\24" "ADX"	   \
	"\25" "SMAP"	"\26" "AVX512_IFMA"		"\30" "CLFLUSHOPT" \
	"\31" "CLWB"	"\32" "PT"	"\33" "AVX512PF" "\34" "AVX512ER"  \
	"\35" "AVX512CD""\36" "SHA"	"\37" "AVX512BW" "\40" "AVX512VL"

/* %ecx = 0, %ecx */
#define CPUID_SEF_PREFETCHWT1	__BIT(0)  /* PREFETCHWT1 instruction */
#define CPUID_SEF_AVX512_VBMI	__BIT(1)  /* AVX-512 Vector Byte Manipulation */
#define CPUID_SEF_UMIP		__BIT(2)  /* User-Mode Instruction prevention */
#define CPUID_SEF_PKU		__BIT(3)  /* Protection Keys for User-mode pages */
#define CPUID_SEF_OSPKE		__BIT(4)  /* OS has set CR4.PKE to ena. protec. keys */
#define CPUID_SEF_WAITPKG	__BIT(5)  /* TPAUSE,UMONITOR,UMWAIT */
#define CPUID_SEF_AVX512_VBMI2	__BIT(6)  /* AVX-512 Vector Byte Manipulation 2 */
#define CPUID_SEF_CET_SS	__BIT(7)  /* CET Shadow Stack */
#define CPUID_SEF_GFNI		__BIT(8)  /* Galois Field instructions */
#define CPUID_SEF_VAES		__BIT(9)  /* Vector AES instruction set */
#define CPUID_SEF_VPCLMULQDQ	__BIT(10) /* CLMUL instruction set */
#define CPUID_SEF_AVX512_VNNI	__BIT(11) /* Vector Neural Network Instruction */
#define CPUID_SEF_AVX512_BITALG	__BIT(12) /* BITALG instructions */
#define CPUID_SEF_TME_EN	__BIT(13) /* Total Memory Encryption */
#define CPUID_SEF_AVX512_VPOPCNTDQ __BIT(14) /* Vector Population Count D/Q */
#define CPUID_SEF_LA57		__BIT(16) /* 57bit linear addr & 5LVL paging */
#define CPUID_SEF_MAWAU		__BITS(21, 17) /* MAWAU for BND{LD,ST}X */
#define CPUID_SEF_RDPID		__BIT(22) /* RDPID and IA32_TSC_AUX */
#define CPUID_SEF_KL		__BIT(23) /* Key Locker */
#define CPUID_SEF_BUS_LOCK_DETECT __BIT(24) /* OS bus-lock detection */
#define CPUID_SEF_CLDEMOTE	__BIT(25) /* Cache line demote */
#define CPUID_SEF_MOVDIRI	__BIT(27) /* MOVDIRI instruction */
#define CPUID_SEF_MOVDIR64B	__BIT(28) /* MOVDIR64B instruction */
#define CPUID_SEF_ENQCMD	__BIT(29) /* Enqueue Stores */
#define CPUID_SEF_SGXLC		__BIT(30) /* SGX Launch Configuration */
#define CPUID_SEF_PKS		__BIT(31) /* Protection Keys for kern-mode pages */

#define CPUID_SEF_FLAGS1	"\177\20"				      \
	"b\0PREFETCHWT1\0" "b\1AVX512_VBMI\0" "b\2UMIP\0" "b\3PKU\0"	      \
	"b\4OSPKE\0"	"b\5WAITPKG\0"	"b\6AVX512_VBMI2\0" "b\7CET_SS\0"     \
	"b\10GFNI\0"	"b\11VAES\0"	"b\12VPCLMULQDQ\0" "b\13AVX512_VNNI\0"\
	"b\14AVX512_BITALG\0" "b\15TME_EN\0" "b\16AVX512_VPOPCNTDQ\0"	      \
	"b\20LA57\0"							      \
	"f\21\5MAWAU\0"			"b\26RDPID\0"	"b\27KL\0"	      \
	"b\30BUS_LOCK_DETECT" "b\31CLDEMOTE\0"		"b\33MOVDIRI\0"	      \
	"b\34MOVDIR64B\0" "b\35ENQCMD\0" "b\36SGXLC\0"	"b\37PKS\0"

/* %ecx = 0, %edx */
#define CPUID_SEF_SGX_KEYS	__BIT(1)  /* Attestation support for SGX */
#define CPUID_SEF_AVX512_4VNNIW	__BIT(2)  /* AVX512 4-reg Neural Network ins */
#define CPUID_SEF_AVX512_4FMAPS	__BIT(3)  /* AVX512 4-reg Mult Accum Single precision */
#define CPUID_SEF_FSRM		__BIT(4)  /* Fast Short Rep Move */
#define CPUID_SEF_UINTR		__BIT(5)  /* User Interrupts */
#define CPUID_SEF_AVX512_VP2INTERSECT __BIT(8) /* AVX512 VP2INTERSECT */
#define CPUID_SEF_SRBDS_CTRL	__BIT(9)  /* IA32_MCU_OPT_CTRL */
#define CPUID_SEF_MD_CLEAR	__BIT(10) /* VERW clears CPU buffers */
#define CPUID_SEF_RTM_ALWAYS_ABORT __BIT(11) /* XBEGIN immediately abort */
#define CPUID_SEF_RTM_FORCE_ABORT __BIT(13) /* MSR_TSX_FORCE_ABORT bit 0 */
#define CPUID_SEF_SERIALIZE	__BIT(14) /* SERIALIZE instruction */
#define CPUID_SEF_HYBRID	__BIT(15) /* Hybrid part */
#define CPUID_SEF_TSXLDTRK	__BIT(16) /* TSX suspend load addr tracking */
#define CPUID_SEF_PCONFIG	__BIT(18) /* Platform CONFIGuration */
#define CPUID_SEF_ARCH_LBR	__BIT(19) /* Architectural LBR */
#define CPUID_SEF_CET_IBT	__BIT(20) /* CET Indirect Branch Tracking */
#define CPUID_SEF_AMX_BF16	__BIT(22) /* AMX bfloat16 */
#define CPUID_SEF_AVX512_FP16	__BIT(23) /* AVX512 FP16 */
#define CPUID_SEF_AMX_TILE	__BIT(24) /* Tile architecture */
#define CPUID_SEF_AMX_INT8	__BIT(25) /* AMX 8bit interger */
#define CPUID_SEF_IBRS		__BIT(26) /* IBRS / IBPB Speculation Control */
#define CPUID_SEF_STIBP		__BIT(27) /* STIBP Speculation Control */
#define CPUID_SEF_L1D_FLUSH	__BIT(28) /* IA32_FLUSH_CMD MSR */
#define CPUID_SEF_ARCH_CAP	__BIT(29) /* IA32_ARCH_CAPABILITIES */
#define CPUID_SEF_CORE_CAP	__BIT(30) /* IA32_CORE_CAPABILITIES */
#define CPUID_SEF_SSBD		__BIT(31) /* Speculative Store Bypass Disable */

#define CPUID_SEF_FLAGS2	"\20"					      \
			"\2SGX_KEYS" "\3AVX512_4VNNIW"	"\4AVX512_4FMAPS"     \
	"\5FSRM"	"\6UINTR"					      \
	"\11VP2INTERSECT" "\12SRBDS_CTRL" "\13MD_CLEAR"	"\14RTM_ALWAYS_ABORT" \
			"\16RTM_FORCE_ABORT" "\17SERIALIZE" "\20HYBRID"	      \
	"\21" "TSXLDTRK"		"\23" "PCONFIG"	"\24" "ARCH_LBR"      \
	"\25CET_IBT"			"\27AMX_BF16"	"\30AVX512_FP16"      \
	"\31AMX_TILE"	"\32AMX_INT8"	"\33IBRS"	"\34STIBP"	      \
	"\35" "L1D_FLUSH" "\36" "ARCH_CAP" "\37CORE_CAP" "\40" "SSBD"

/* %ecx = 1, %eax */
#define CPUID_SEF_AVXVNNI	__BIT(4)  /* AVX version of VNNI */
#define CPUID_SEF_AVX512_BF16	__BIT(5)
#define CPUID_SEF_FZLRMS	__BIT(10) /* fast zero-length REP MOVSB */
#define CPUID_SEF_FSRSB		__BIT(11) /* fast short REP STOSB */
#define CPUID_SEF_FSRCS		__BIT(12) /* fast short REP CMPSB, REP SCASB */
#define CPUID_SEF_HRESET	__BIT(22) /* HREST & IA32_HRESET_ENABLE MSR */
#define CPUID_SEF_LAM		__BIT(26) /* Linear Address Masking */

#define CPUID_SEF1_FLAGS_A	"\20"					\
	"\5" "AVXVNNI"	"\6" "AVX512_BF16"				\
					"\13" "FZLRMS"	"\14" "FSRSB"	\
	"\15" "FSRCS"			"\27" "HRESET"			\
	"\31" "LAM"

/* %ecx = 1, %ebx */
#define CPUID_SEF_INTEL_PPIN	__BIT(0)  /* IA32_PPIN & IA32_PPIN_CTL MSRs */

#define CPUID_SEF1_FLAGS_B	"\20"				\
				"\1" "PPIN"

/* %ecx = 1, %edx */
#define CPUID_SEF_CET_SSS	__BIT(18)  /* CET Supervisor Shadow Stack */

#define CPUID_SEF1_FLAGS_D	"\20"				\
				"\23CET_SSS"

/* %ecx = 2, %edx */
#define CPUID_SEF_PSFD		__BIT(0)  /* Fast Forwarding Predictor Dis. */
#define CPUID_SEF_IPRED_CTRL	__BIT(1)  /* IPRED_DIS */
#define CPUID_SEF_RRSBA_CTRL	__BIT(2)  /* RRSBA for CPL3 */
#define CPUID_SEF_DDPD_U	__BIT(3)  /* Data Dependent Prefetcher */
#define CPUID_SEF_BHI_CTRL	__BIT(4)  /* BHI_DIS_S */
#define CPUID_SEF_MCDT_NO	__BIT(5)  /* !MXCSR Config Dependent Timing */

#define CPUID_SEF2_FLAGS_D	"\20"				\
	"\1PSFD"	"\2IPRED_CTRL"	"\3RRSBA_CTRL"	"\4DDPD_U"	\
	"\5BHI_CTRL"	"\6MCDT_NO"

/*
 * Intel CPUID Architectural Performance Monitoring.
 * CPUID Fn0000000a
 *
 * See also src/usr.sbin/tprof/arch/tprof_x86.c
 */

/* %eax */
#define CPUID_PERF_VERSION	__BITS(7, 0)   /* Version ID */
#define CPUID_PERF_NGPPC	__BITS(15, 8)  /* Num of G.P. perf counter */
#define CPUID_PERF_NBWGPPC	__BITS(23, 16) /* Bit width of G.P. perfcnt */
#define CPUID_PERF_BVECLEN	__BITS(31, 24) /* Length of EBX bit vector */

#define CPUID_PERF_FLAGS0	"\177\20"	\
	"f\0\10VERSION\0" "f\10\10GPCounter\0"	\
	"f\20\10GPBitwidth\0" "f\30\10Vectorlen\0"

/* %ebx */
#define CPUID_PERF_CORECYCL	__BIT(0)       /* No core cycle */
#define CPUID_PERF_INSTRETRY	__BIT(1)       /* No instruction retried */
#define CPUID_PERF_REFCYCL	__BIT(2)       /* No reference cycles */
#define CPUID_PERF_LLCREF	__BIT(3)       /* No LLCache reference */
#define CPUID_PERF_LLCMISS	__BIT(4)       /* No LLCache miss */
#define CPUID_PERF_BRINSRETR	__BIT(5)       /* No branch inst. retried */
#define CPUID_PERF_BRMISPRRETR	__BIT(6)       /* No branch mispredict retry */
#define CPUID_PERF_TOPDOWNSLOT	__BIT(7)       /* No top-down slots */

#define CPUID_PERF_FLAGS1	"\177\20"				      \
	"b\0CORECYCL\0"	"b\1INST\0"	"b\2REFCYCL\0"	"b\3LLCREF\0"	      \
	"b\4LLCMISS\0"	"b\5BRINST\0"	"b\6BRMISPR\0"	"b\7TOPDOWNSLOT\0"

/* %ecx */

#define CPUID_PERF_FLAGS2	"\177\20"				      \
	"b\0INST\0" "b\1CLK_CORETHREAD\0" "b\2CLK_REF_TSC\0" "b\3TOPDOWNSLOT\0"

/* %edx */
#define CPUID_PERF_NFFPC	__BITS(4, 0)   /* Num of fixed-funct perfcnt */
#define CPUID_PERF_NBWFFPC	__BITS(12, 5)  /* Bit width of fixed-func pc */
#define CPUID_PERF_ANYTHREADDEPR __BIT(15)     /* Any Thread deprecation */

#define CPUID_PERF_FLAGS3	"\177\20"				\
	"f\0\5FixedFunc\0" "f\5\10FFBitwidth\0" "b\17ANYTHREADDEPR\0"

/*
 * Intel/AMD CPUID Extended Topology Enumeration.
 * CPUID Fn0000000b
 * %ecx == level number
 *	%eax: See below.
 *	%ebx: Number of logical processors at this level.
 *	%ecx: See below.
 *	%edx: x2APIC ID of the current logical processor.
 */
/* %eax */
#define CPUID_TOP_SHIFTNUM	__BITS(4, 0) /* Topology ID shift value */
/* %ecx */
#define CPUID_TOP_LVLNUM	__BITS(7, 0) /* Level number */
#define CPUID_TOP_LVLTYPE	__BITS(15, 8) /* Level type */
#define CPUID_TOP_LVLTYPE_INVAL	0	 	/* Invalid */
#define CPUID_TOP_LVLTYPE_SMT	1	 	/* SMT */
#define CPUID_TOP_LVLTYPE_CORE	2	 	/* Core */

/*
 * Intel/AMD CPUID Processor extended state Enumeration.
 * CPUID Fn0000000d
 *
 * %ecx == 0: supported features info:
 *	%eax: Valid bits of lower 32bits of XCR0
 *	%ebx: Maximum save area size for features enabled in XCR0
 *	%ecx: Maximum save area size for all cpu features
 *	%edx: Valid bits of upper 32bits of XCR0
 *
 * %ecx == 1:
 *	%eax: See below
 *	%ebx: Save area size for features enabled by XCR0 | IA32_XSS
 *	%ecx: Valid bits of lower 32bits of IA32_XSS
 *	%edx: Valid bits of upper 32bits of IA32_XSS
 *
 * %ecx >= 2: Save area details for XCR0 bit n
 *	%eax: size of save area for this feature
 *	%ebx: offset of save area for this feature
 *	%ecx, %edx: reserved
 *	All of %eax, %ebx, %ecx and %edx are zero for unsupported features.
 */

/* %ecx = 1, %eax */
#define CPUID_PES1_XSAVEOPT	__BIT(0)	/* xsaveopt instruction */
#define CPUID_PES1_XSAVEC	__BIT(1)	/* xsavec & compacted XRSTOR */
#define CPUID_PES1_XGETBV	__BIT(2)	/* xgetbv with ECX = 1 */
#define CPUID_PES1_XSAVES	__BIT(3)	/* xsaves/xrstors, IA32_XSS */
#define CPUID_PES1_XFD		__BIT(4)	/* eXtened Feature Disable */

#define CPUID_PES1_FLAGS	"\20"					\
	"\1XSAVEOPT"	"\2XSAVEC"	"\3XGETBV"	"\4XSAVES"	\
	"\5XFD"

/*
 * Intel Deterministic Address Translation Parameter.
 * CPUID Fn0000_0018
 */

/* %ecx=0 %eax __BITS(31, 0): the maximum input value of supported sub-leaf */

/* %ebx */
#define CPUID_DATP_PGSIZE	__BITS(3, 0)	/* page size */
#define CPUID_DATP_PGSIZE_4KB	__BIT(0)	/* 4KB page support */
#define CPUID_DATP_PGSIZE_2MB	__BIT(1)	/* 2MB page support */
#define CPUID_DATP_PGSIZE_4MB	__BIT(2)	/* 4MB page support */
#define CPUID_DATP_PGSIZE_1GB	__BIT(3)	/* 1GB page support */
#define CPUID_DATP_PARTITIONING	__BITS(10, 8)	/* Partitioning */
#define CPUID_DATP_WAYS		__BITS(31, 16)	/* Ways of associativity */

/* Number of sets: %ecx */

/* %edx */
#define CPUID_DATP_TCTYPE	__BITS(4, 0)	/* Translation Cache type */
#define CPUID_DATP_TCTYPE_N	0		/*   NULL (not valid) */
#define CPUID_DATP_TCTYPE_D	1		/*   Data TLB */
#define CPUID_DATP_TCTYPE_I	2		/*   Instruction TLB */
#define CPUID_DATP_TCTYPE_U	3		/*   Unified TLB */
#define CPUID_DATP_TCTYPE_L	4		/*   Load only TLB */
#define CPUID_DATP_TCTYPE_S	5		/*   Store only TLB */
#define CPUID_DATP_TCLEVEL	__BITS(7, 5)	/* TLB level (start at 1) */
#define CPUID_DATP_FULLASSOC	__BIT(8)	/* Full associative */
#define CPUID_DATP_SHARING	__BITS(25, 14)	/* sharing */

/*
 * Intel Native Model ID Information Enumeration.
 * CPUID Fn0000_001a
 */
/* %eax */
#define CPUID_HYBRID_NATIVEID	__BITS(23, 0)	/* Native model ID */
#define CPUID_HYBRID_CORETYPE	__BITS(31, 24)	/* Core type */
#define   CPUID_HYBRID_CORETYPE_ATOM	0x20		/* Atom */
#define   CPUID_HYBRID_CORETYPE_CORE	0x40		/* Core */

/*
 * Intel Tile Information
 * CPUID Fn0000_001d
 * %ecx == 0: Main leaf
 *	%eax: max_palette
 * %ecx == 1: Tile Palette1 Sub-leaf
 *	Tile palette 1
 */

/* %ecx */
#define CPUID_TILE_P1_TOTAL_B	__BITS(15, 0)
#define CPUID_TILE_P1_B_PERTILE	__BITS(31, 16)
#define CPUID_TILE_P1_B_PERLOW	__BITS(15, 0)
#define CPUID_TILE_P1_MAXNAMES	__BITS(31, 16)
#define CPUID_TILE_P1_MAXROWS	__BITS(15, 0)

/*
 * Intel TMUL Information
 * CPUID Fn0000_001e
 */

/* %ebx */
#define CPUID_TMUL_MAXK	__BITS(7, 0)	/* Rows or columns */
#define CPUID_TMUL_MAXN	__BITS(23, 8)	/* Column bytes */

/*
 * Intel extended features.
 * CPUID Fn80000001
 */
/* %edx */
#define CPUID_SYSCALL	__BIT(11)	/* SYSCALL/SYSRET */
#define CPUID_XD	__BIT(20)	/* Execute Disable (like CPUID_NOX) */
#define CPUID_PAGE1GB	__BIT(26)	/* 1GB Large Page Support */
#define CPUID_RDTSCP	__BIT(27)	/* Read TSC Pair Instruction */
#define CPUID_EM64T	__BIT(29)	/* Intel EM64T */

#define CPUID_INTEL_EXT_FLAGS	"\20"			     \
	"\14" "SYSCALL/SYSRET"	"\25" "XD"	"\33" "P1GB" \
	"\34" "RDTSCP"	"\36" "EM64T"

/* %ecx */
#define CPUID_LAHF	__BIT(0)       /* LAHF/SAHF in IA-32e mode, 64bit sub*/
		/*	__BIT(5) */	/* LZCNT. Same as AMD's CPUID_ABM */
#define CPUID_PREFETCHW	__BIT(8)	/* PREFETCHW */

#define CPUID_INTEL_FLAGS4	"\20"				\
	"\1" "LAHF"	"\02" "B01"	"\03" "B02"		\
			"\06" "LZCNT"				\
	"\11" "PREFETCHW"


/*
 * AMD/VIA extended features.
 * CPUID Fn80000001
 */
/* %edx */
/*	CPUID_SYSCALL			   SYSCALL/SYSRET */
#define CPUID_MPC	0x00080000	/* Multiprocessing Capable */
#define CPUID_NOX	0x00100000	/* No Execute Page Protection */
#define CPUID_MMXX	0x00400000	/* AMD MMX Extensions */
/*	CPUID_MMX			   MMX supported */
/*	CPUID_FXSR			   fast FP/MMX save/restore */
#define CPUID_FFXSR	0x02000000	/* FXSAVE/FXSTOR Extensions */
/*	CPUID_PAGE1GB			   1GB Large Page Support */
/*	CPUID_RDTSCP			   Read TSC Pair Instruction */
/*	CPUID_EM64T			   Long mode */
#define CPUID_3DNOW2	0x40000000	/* 3DNow! Instruction Extension */
#define CPUID_3DNOW	0x80000000	/* 3DNow! Instructions */

#define CPUID_EXT_FLAGS	"\20"						\
						"\14" "SYSCALL/SYSRET"	\
							"\24" "MPC"	\
	"\25" "NOX"			"\27" "MMXX"	"\30" "MMX"	\
	"\31" "FXSR"	"\32" "FFXSR"	"\33" "P1GB"	"\34" "RDTSCP"	\
			"\36" "LONG"	"\37" "3DNOW2"	"\40" "3DNOW"

/* %ecx (AMD) */
/* 	CPUID_LAHF			   LAHF/SAHF instruction */
#define CPUID_CMPLEGACY	  __BIT(1)	/* Compare Legacy */
#define CPUID_SVM	  __BIT(2)	/* Secure Virtual Machine */
#define CPUID_EAPIC	  __BIT(3)	/* Extended APIC space */
#define CPUID_ALTMOVCR0	  __BIT(4)	/* Lock Mov Cr0 */
#define CPUID_ABM	  __BIT(5)	/* LZCNT instruction */
#define CPUID_SSE4A	  __BIT(6)	/* SSE4A instruction set */
#define CPUID_MISALIGNSSE __BIT(7)	/* Misaligned SSE */
#define CPUID_3DNOWPF	  __BIT(8)	/* 3DNow Prefetch */
#define CPUID_OSVW	  __BIT(9)	/* OS visible workarounds */
#define CPUID_IBS	  __BIT(10)	/* Instruction Based Sampling */
#define CPUID_XOP	  __BIT(11)	/* XOP instruction set */
#define CPUID_SKINIT	  __BIT(12)	/* SKINIT */
#define CPUID_WDT	  __BIT(13)	/* watchdog timer support */
#define CPUID_LWP	  __BIT(15)	/* Light Weight Profiling */
#define CPUID_FMA4	  __BIT(16)	/* FMA4 instructions */
#define CPUID_TCE	  __BIT(17)	/* Translation cache Extension */
#define CPUID_NODEID	  __BIT(19)	/* NodeID MSR available */
#define CPUID_TBM	  __BIT(21)	/* TBM instructions */
#define CPUID_TOPOEXT	  __BIT(22)	/* cpuid Topology Extension */
#define CPUID_PCEC	  __BIT(23)	/* Perf Ctr Ext Core */
#define CPUID_PCENB	  __BIT(24)	/* Perf Ctr Ext NB */
#define CPUID_SPM	  __BIT(25)	/* Stream Perf Mon */
#define CPUID_DBE	  __BIT(26)	/* Data Breakpoint Extension */
#define CPUID_PTSC	  __BIT(27)	/* PerfTsc */
#define CPUID_L2IPERFC	  __BIT(28)	/* L2I performance counter Extension */
#define CPUID_MWAITX	  __BIT(29)	/* MWAITX/MONITORX support */
#define CPUID_ADDRMASKEXT __BIT(30)	/* Breakpoint Addressing Mask ext. */

#define CPUID_AMD_FLAGS4	"\20"					    \
	"\1" "LAHF"	"\2" "CMPLEGACY" "\3" "SVM"	"\4" "EAPIC"	    \
	"\5" "ALTMOVCR0" "\6" "LZCNT"	"\7" "SSE4A"	"\10" "MISALIGNSSE" \
	"\11" "3DNOWPREFETCH"						    \
			"\12" "OSVW"	"\13" "IBS"	"\14" "XOP"	    \
	"\15" "SKINIT"	"\16" "WDT"	"\17" "B14"	"\20" "LWP"	    \
	"\21" "FMA4"	"\22" "TCE"	"\23" "B18"	"\24" "NodeID"	    \
	"\25" "B20"	"\26" "TBM"	"\27" "TopoExt"	"\30" "PCExtC"	    \
	"\31" "PCExtNB"	"\32" "StrmPM"	"\33" "DBExt"	"\34" "PerfTsc"	    \
	"\35" "L2IPERFC" "\36" "MWAITX"	"\37" "AddrMaskExt" "\40" "B31"

/*
 * Advanced Power Management and RAS.
 * CPUID Fn8000_0007
 *
 * Only ITSC is for both Intel and AMD. Others are only for AMD.
 *
 *	%ebx: RAS capabilities. See below.
 *	%ecx: Processor Power Monitoring Interface.
 *	%edx: See below.
 *
 */
/* %ebx */
#define CPUID_RAS_OVFL_RECOV __BIT(0) /* MCA Overflow Recovery */
#define CPUID_RAS_SUCCOR  __BIT(1) /* Sw UnCorr. err. COntainment & Recovery */
#define CPUID_RAS_MCAX	  __BIT(3) /* MCA Extension */

#define CPUID_RAS_FLAGS		"\20"					      \
	"\1OVFL_RECOV"	"\2SUCCOR"		"\4" "MCAX"

/* %edx */
#define CPUID_APM_TS	   __BIT(0)	/* Temperature Sensor */
#define CPUID_APM_FID	   __BIT(1)	/* Frequency ID control */
#define CPUID_APM_VID	   __BIT(2)	/* Voltage ID control */
#define CPUID_APM_TTP	   __BIT(3)	/* THERMTRIP (PCI F3xE4 register) */
#define CPUID_APM_HTC	   __BIT(4)	/* Hardware thermal control (HTC) */
#define CPUID_APM_STC	   __BIT(5)	/* Software thermal control (STC) */
#define CPUID_APM_100	   __BIT(6)	/* 100MHz multiplier control */
#define CPUID_APM_HWP	   __BIT(7)	/* HW P-State control */
#define CPUID_APM_ITSC	   __BIT(8)	/* Invariant TSC */
#define CPUID_APM_CPB	   __BIT(9)	/* Core Performance Boost */
#define CPUID_APM_EFF	   __BIT(10)	/* Effective Frequency (read-only) */
#define CPUID_APM_PROCFI   __BIT(11)	/* Processor Feedback Interface */
#define CPUID_APM_PROCPR   __BIT(12)	/* Processor Power Reporting */
#define CPUID_APM_CONNSTBY __BIT(13)	/* Connected Standby */
#define CPUID_APM_RAPL	   __BIT(14)	/* Running Average Power Limit */

#define CPUID_APM_FLAGS		"\20"					      \
	"\1" "TS"	"\2" "FID"	"\3" "VID"	"\4" "TTP"	      \
	"\5" "HTC"	"\6" "STC"	"\7" "100"	"\10" "HWP"	      \
	"\11" "ITSC"	"\12" "CPB"	"\13" "EffFreq"	"\14" "PROCFI"	      \
	"\15" "PROCPR"	"\16" "CONNSTBY" "\17" "RAPL"

/*
 * AMD Processor Capacity Parameters and Extended Features.
 * CPUID Fn8000_0008
 * %eax: Long Mode Size Identifiers
 * %ebx: Extended Feature Identifiers
 * %ecx: Size Identifiers
 * %edx: RDPRU Register Identifier Range
 */

/* %ebx */
#define CPUID_CAPEX_CLZERO	   __BIT(0)  /* CLZERO instruction */
#define CPUID_CAPEX_IRPERF	   __BIT(1)  /* InstRetCntMsr */
#define CPUID_CAPEX_XSAVEERPTR	   __BIT(2)  /* RstrFpErrPtrs by XRSTOR */
#define CPUID_CAPEX_INVLPGB	   __BIT(3)  /* INVLPGB instruction */
#define CPUID_CAPEX_RDPRU	   __BIT(4)  /* RDPRU instruction */
#define CPUID_CAPEX_MBE		   __BIT(6)  /* Memory Bandwidth Enforcement */
#define CPUID_CAPEX_MCOMMIT	   __BIT(8)  /* MCOMMIT instruction */
#define CPUID_CAPEX_WBNOINVD	   __BIT(9)  /* WBNOINVD instruction */
#define CPUID_CAPEX_IBPB	   __BIT(12) /* Speculation Control IBPB */
#define CPUID_CAPEX_INT_WBINVD	   __BIT(13) /* Interruptable WB[NO]INVD */
#define CPUID_CAPEX_IBRS	   __BIT(14) /* Speculation Control IBRS */
#define CPUID_CAPEX_STIBP	   __BIT(15) /* Speculation Control STIBP */
#define CPUID_CAPEX_IBRS_ALWAYSON  __BIT(16) /* IBRS always on mode */
#define CPUID_CAPEX_STIBP_ALWAYSON __BIT(17) /* STIBP always on mode */
#define CPUID_CAPEX_PREFER_IBRS	   __BIT(18) /* IBRS preferred */
#define CPUID_CAPEX_IBRS_SAMEMODE  __BIT(19) /* IBRS same speculation limits */
#define CPUID_CAPEX_EFER_LSMSLE_UN __BIT(20) /* EFER.LMSLE is unsupported */
#define CPUID_CAPEX_AMD_PPIN	   __BIT(23) /* Protected Processor Inventory Number */
#define CPUID_CAPEX_SSBD	   __BIT(24) /* Speculation Control SSBD */
#define CPUID_CAPEX_VIRT_SSBD	   __BIT(25) /* Virt Spec Control SSBD */
#define CPUID_CAPEX_SSB_NO	   __BIT(26) /* SSBD not required */
#define CPUID_CAPEX_CPPC	   __BIT(27) /* Collaborative Processor Perf. Control */
#define CPUID_CAPEX_PSFD	   __BIT(28) /* Predictive Store Forward Dis */
#define CPUID_CAPEX_BTC_NO	   __BIT(29) /* Branch Type Confusion NO */

#define CPUID_CAPEX_FLAGS	"\20"					   \
	"\1CLZERO"	"\2IRPERF"	"\3XSAVEERPTR"	"\4INVLPGB"	   \
	"\5RDPRU"			"\7MBE"				   \
	"\11MCOMMIT"	"\12WBNOINVD"	"\13B10"			   \
	"\15IBPB"	"\16INT_WBINVD"	"\17IBRS"	"\20STIBP"	   \
	"\21IBRS_ALWAYSON" "\22STIBP_ALWAYSON" "\23PREFER_IBRS"		   \
							"\24IBRS_SAMEMODE" \
	"\25EFER_LSMSLE_UN"				"\30PPIN"	   \
	"\31SSBD"	"\32VIRT_SSBD"	"\33SSB_NO"	"\34CPPC"	   \
	"\35PSFD"	"\36BTC_NO"

/* %ecx */
#define CPUID_CAPEX_PerfTscSize	__BITS(17,16)	/* Perf. tstamp counter size */
#define CPUID_CAPEX_ApicIdSize	__BITS(15,12)	/* APIC ID Size */
#define CPUID_CAPEX_NC		__BITS(7,0)	/* Number of threads - 1 */

/*
 * AMD SVM Revision and Feature.
 * CPUID Fn8000_000a
 */

/* %eax: SVM revision */
#define CPUID_AMD_SVM_REV		__BITS(7,0)

/* %edx: SVM features */
#define CPUID_AMD_SVM_NP	      __BIT(0)  /* Nested Paging */
#define CPUID_AMD_SVM_LbrVirt	      __BIT(1)  /* LBR virtualization */
#define CPUID_AMD_SVM_SVML	      __BIT(2)  /* SVM Lock */
#define CPUID_AMD_SVM_NRIPS	      __BIT(3)  /* NRIP Save on #VMEXIT */
#define CPUID_AMD_SVM_TSCRateCtrl     __BIT(4)  /* MSR-based TSC rate ctrl */
#define CPUID_AMD_SVM_VMCBCleanBits   __BIT(5)  /* VMCB Clean Bits support */
#define CPUID_AMD_SVM_FlushByASID     __BIT(6)  /* Flush by ASID */
#define CPUID_AMD_SVM_DecodeAssist    __BIT(7)  /* Decode Assists support */
#define CPUID_AMD_SVM_PauseFilter     __BIT(10) /* PAUSE intercept filter */
#define CPUID_AMD_SVM_PFThreshold     __BIT(12) /* PAUSE filter threshold */
#define CPUID_AMD_SVM_AVIC	      __BIT(13) /* Advanced Virt. Intr. Ctrl */
#define CPUID_AMD_SVM_V_VMSAVE_VMLOAD __BIT(15) /* Virtual VM{SAVE/LOAD} */
#define CPUID_AMD_SVM_vGIF	      __BIT(16) /* Virtualized GIF */
#define CPUID_AMD_SVM_GMET	      __BIT(17) /* Guest Mode Execution Trap */
#define CPUID_AMD_SVM_X2AVIC	      __BIT(18) /* Virt. Intr. Ctrl 4 x2APIC */
#define CPUID_AMD_SVM_SSSCHECK	      __BIT(19)  /* Shadow Stack restrictions */
#define CPUID_AMD_SVM_SPEC_CTRL	      __BIT(20) /* SPEC_CTRL virtualization */
#define CPUID_AMD_SVM_ROGPT	      __BIT(21) /* Read-Only Guest PTable */
#define CPUID_AMD_SVM_HOST_MCE_OVERRIDE __BIT(23) /* #MC intercept */
#define CPUID_AMD_SVM_TLBICTL	      __BIT(24) /* TLB Intercept Control */
#define CPUID_AMD_SVM_VNMI	      __BIT(25) /* NMI Virtualization */
#define CPUID_AMD_SVM_IBSVIRT	      __BIT(26) /* IBS Virtualization */
#define CPUID_AMD_SVM_XLVTOFFFLTCHG   __BIT(27) /* Ext LVToffset FLT changed */
#define CPUID_AMD_SVM_VMCBADRCHKCHG   __BIT(28) /* VMCB addr check changed */


#define CPUID_AMD_SVM_FLAGS	 "\20"					\
	"\1" "NP"	"\2" "LbrVirt"	"\3" "SVML"	"\4" "NRIPS"	\
	"\5" "TSCRate"	"\6" "VMCBCleanBits" 				\
			        "\7" "FlushByASID" "\10" "DecodeAssist"	\
	"\11" "B08"	"\12" "B09"	"\13" "PauseFilter" "\14" "B11"	\
	"\15" "PFThreshold" "\16" "AVIC" "\17" "B14"			\
						"\20" "V_VMSAVE_VMLOAD"	\
	"\21" "VGIF"	"\22" "GMET"	"\23x2AVIC"	"\24SSSCHECK"	\
	"\25" "SPEC_CTRL" "\26" "ROGPT"		"\30HOST_MCE_OVERRIDE"	\
	"\31" "TLBICTL"	"\32VNMI" "\33IBSVIRT" "\34ExtLvtOffsetFaultChg" \
	"\35VmcbAddrChkChg"

/*
 * AMD Instruction-Based Sampling Capabilities.
 * CPUID Fn8000_001b
 */
/* %eax */
#define CPUID_IBS_FFV		__BIT(0)  /* Feature Flags Valid */
#define CPUID_IBS_FETCHSUM	__BIT(1)  /* Fetch Sampling */
#define CPUID_IBS_OPSAM		__BIT(2)  /* execution SAMpling */
#define CPUID_IBS_RDWROPCNT	__BIT(3)  /* Read Write of Op Counter */
#define CPUID_IBS_OPCNT		__BIT(4)  /* OP CouNTing mode */
#define CPUID_IBS_BRNTRGT	__BIT(5)  /* Branch Target */
#define CPUID_IBS_OPCNTEXT	__BIT(6)  /* OpCurCnt and OpMaxCnt extended */
#define CPUID_IBS_RIPINVALIDCHK	__BIT(7)  /* Invalid RIP indication */
#define CPUID_IBS_OPBRNFUSE	__BIT(8)  /* Fused branch micro-op indicate */
#define CPUID_IBS_FETCHCTLEXTD	__BIT(9)  /* IC_IBS_EXTD_CTL MSR */
#define CPUID_IBS_OPDATA4	__BIT(10) /* IBS op data 4 MSR */
#define CPUID_IBS_L3MISSFILT	__BIT(11) /* L3 Miss Filtering */

#define CPUID_IBS_FLAGS	 "\20"						   \
	"\1IBSFFV"	"\2FetchSam"	"\3OpSam"	"\4RdWrOpCnt"	   \
	"\5OpCnt"	"\6BrnTrgt"	"\7OpCntExt"	"\10RipInvalidChk" \
	"\11OpBrnFuse" "\12IbsFetchCtlExtd" "\13IbsOpData4"		   \
						   "\14IbsL3MissFiltering"

/*
 * AMD Cache Topology Information.
 * CPUID Fn8000_001d
 * It's almost the same as Intel Deterministic Cache Parameter Leaf(0x04)
 * except the following:
 *	No Cores/package (%eax bit 31..26)
 *	No Complex cache indexing (%edx bit 2)
 */

/*
 * AMD Processor Topology Information.
 * CPUID Fn8000_001e
 * %eax: Extended APIC ID.
 * %ebx: Core Identifiers.
 * %ecx: Node Identifiers.
 */

/* %ebx */
#define CPUID_AMD_PROCT_COREID		   __BITS(7,0)	/* Core ID */
#define CPUID_AMD_PROCT_THREADS_PER_CORE   __BITS(15,8)	/* Threads/Core - 1 */

/* %ecx */
#define CPUID_AMD_PROCT_NODEID		   __BITS(7,0)	/* Node ID */
#define CPUID_AMD_PROCT_NODE_PER_PROCESSOR __BITS(10,8)	/* Node/Processor -1 */

/*
 * AMD Encrypted Memory Capabilities.
 * CPUID Fn8000_001f
 * %eax: flags
 * %ebx:  5-0: Cbit Position
 *       11-6: PhysAddrReduction
 *      15-12: NumVMPL
 * %ecx: 31-0: NumEncryptedGuests
 * %edx: 31-0: MinSevNoEsAsid
 */
#define CPUID_AMD_ENCMEM_SME	__BIT(0)   /* Secure Memory Encryption */
#define CPUID_AMD_ENCMEM_SEV	__BIT(1)   /* Secure Encrypted Virtualiz. */
#define CPUID_AMD_ENCMEM_PGFLMSR __BIT(2)  /* Page Flush MSR */
#define CPUID_AMD_ENCMEM_SEVES	__BIT(3)   /* SEV Encrypted State */
#define CPUID_AMD_ENCMEM_SEV_SNP __BIT(4)  /* Secure Nested Paging */
#define CPUID_AMD_ENCMEM_VMPL	__BIT(5)   /* Virtual Machine Privilege Lvl */
#define CPUID_AMD_ENCMEM_RPMQUERY __BIT(6) /* RMPQUERY instruction */
#define CPUID_AMD_ENCMEM_VMPLSSS __BIT(7)  /* VMPL Secure Shadow Stack */
#define CPUID_AMD_ENCMEM_SECTSC	__BIT(8)   /* Secure TSC */
#define CPUID_AMD_ENCMEM_TSCAUX_V __BIT(9)  /* TSC AUX Virtualization */
#define CPUID_AMD_ENCMEM_HECC	__BIT(10) /* HW Enf Cache Coh across enc dom */
#define CPUID_AMD_ENCMEM_64BH	__BIT(11)  /* 64Bit Host */
#define CPUID_AMD_ENCMEM_RSTRINJ __BIT(12) /* Restricted Injection */
#define CPUID_AMD_ENCMEM_ALTINJ	__BIT(13)  /* Alternate Injection */
#define CPUID_AMD_ENCMEM_DBGSWAP __BIT(14) /* Debug Swap */
#define CPUID_AMD_ENCMEM_PREVHOSTIBS __BIT(15) /* Prevent Host IBS */
#define CPUID_AMD_ENCMEM_VTE	__BIT(16)  /* Virtual Transparent Encryption */

#define CPUID_AMD_ENCMEM_VMGEXITP __BIT(17) /* VMGEXIT Parameter */
#define CPUID_AMD_ENCMEM_VIRTTOM __BIT(18)  /* Virtual TOM MSR */
#define CPUID_AMD_ENCMEM_IBSVGUEST __BIT(19) /* IBS Virt. for SEV-ES guest */
#define CPUID_AMD_ENCMEM_VMSA_REGPROT __BIT(24) /* VmsaRegProt */
#define CPUID_AMD_ENCMEM_SMTPROTECT __BIT(25) /* SMT Protection */
#define CPUID_AMD_ENCMEM_SVSM_COMMPAGE __BIT(28) /* SVSM Communication Page */
#define CPUID_AMD_ENCMEM_NESTED_VSMP __BIT(29) /* VIRT_{RMPUPDATE,PSMASH} */

#define CPUID_AMD_ENCMEM_FLAGS	 "\20"					      \
	"\1" "SME"	"\2" "SEV"	"\3" "PageFlushMsr"	"\4" "SEV-ES" \
	"\5" "SEV-SNP"	"\6" "VMPL"	"\7RMPQUERY"	"\10VmplSSS"	      \
	"\11SecureTSC"	"\12TscAuxVirt"	"\13HwEnfCacheCoh"  "\14" "64BitHost" \
	"\15" "RSTRINJ"	"\16" "ALTINJ"	"\17" "DebugSwap" "\20PreventHostIbs" \
	"\21VTE"      "\22VmgexitParam" "\23VirtualTomMsr" "\24IbsVirtGuest"  \
	"\31VmsaRegProt" "\32SmtProtection"				      \
	"\35SvsmCommPageMSR" "\36NestedVirtSnpMsr"

/*
 * AMD Extended Features 2.
 * CPUID Fn8000_0021
 */

/* %eax */
#define CPUID_AMDEXT2_NONESTEDDBP __BIT(0) /* No nested data breakpoints */
#define CPUID_AMDEXT2_FGKBNOSERIAL __BIT(1) /* {FS,GS,K}BASE WRMSR !serializ */
#define CPUID_AMDEXT2_LFENCESERIAL __BIT(2) /* LFENCE always serializing */
#define CPUID_AMDEXT2_SMMPGCFGLCK __BIT(3) /* SMM Paging configuration lock */
#define CPUID_AMDEXT2_NULLSELCLRB __BIT(6) /* Null segment selector clr base */
#define CPUID_AMDEXT2_UPADDRIGN	  __BIT(7) /* Upper Address Ignore */
#define CPUID_AMDEXT2_AUTOIBRS	  __BIT(8) /* Automatic IBRS */
#define CPUID_AMDEXT2_NOSMMCTL	  __BIT(9) /* SMM_CTL MSR is not supported */
#define CPUID_AMDEXT2_FSRS	  __BIT(10) /* Fast Short Rep Stosb */
#define CPUID_AMDEXT2_FSRC	  __BIT(11) /* Fast Short Rep Cmpsb */
#define CPUID_AMDEXT2_PREFETCHCTL __BIT(13) /* Prefetch control MSR */
#define CPUID_AMDEXT2_CPUIDUSRDIS __BIT(17) /* CPUID dis. for non-priv. soft */
#define CPUID_AMDEXT2_EPSF	  __BIT(18) /* Enhanced Predictive Store Fwd */

#define CPUID_AMDEXT2_FLAGS	 "\20"					      \
	"\1NoNestedDataBp" "\2FsGsKernelGsBaseNonSerializing"		      \
				"\3LfenceAlwaysSerialize" "\4SmmPgCfgLock"    \
			     "\7NullSelectClearsBase" "\10UpperAddressIgnore" \
	"\11AutomaticIBRS" "\12NoSmmCtlMSR"	"\13FSRS"	"\14FSRC"     \
			"\16PrefetchCtlMSR"				      \
			"\22CpuidUserDis"	"\23EPSF"

/*
 * AMD Extended Performance Monitoring and Debug
 * CPUID Fn8000_0022
 */

/* %eax */
#define CPUID_AXPERF_PERFMONV2	__BIT(0)  /* Version 2 */
#define CPUID_AXPERF_LBRSTACK	__BIT(1)  /* Last Branch Record Stack */
#define CPUID_AXPERF_LBRPMCFREEZE __BIT(2) /* Freezing LBR and PMC */

#define CPUID_AXPERF_FLAGS	 "\20"					      \
	"\1PerfMonV2"	"\2LbrStack"	"\3LbrAndPmcFreeze"

/* %ebx */
#define CPUID_AXPERF_NCPC      __BITS(3, 0)	/* Num of Core PMC counters */
#define CPUID_AXPERF_NLBRSTACK __BITS(9, 4)	/* Num of LBR Stack entries */
#define CPUID_AXPERF_NNBPC     __BITS(15, 10)	/* Num of NorthBridge PMCs */
#define CPUID_AXPERF_NUMCPC    __BITS(21, 16)	/* Num of UMC PMCs */

/*
 * Centaur Extended Feature flags.
 * CPUID FnC000_0001
 */
#define CPUID_VIA_HAS_RNG	__BIT(2)	/* Random number generator */
#define CPUID_VIA_DO_RNG	__BIT(3)
#define CPUID_VIA_HAS_ACE	__BIT(6)	/* AES Encryption */
#define CPUID_VIA_DO_ACE	__BIT(7)
#define CPUID_VIA_HAS_ACE2	__BIT(8)	/* AES+CTR instructions */
#define CPUID_VIA_DO_ACE2	__BIT(9)
#define CPUID_VIA_HAS_PHE	__BIT(10)	/* SHA1+SHA256 HMAC */
#define CPUID_VIA_DO_PHE	__BIT(11)
#define CPUID_VIA_HAS_PMM	__BIT(12)	/* RSA Instructions */
#define CPUID_VIA_DO_PMM	__BIT(13)

#define CPUID_FLAGS_PADLOCK	"\20"					    \
	"\3" "RNG"	"\7" "AES"	"\11" "AES/CTR"	"\13" "SHA1/SHA256" \
	"\15" "RSA"

/*
 * Model-Specific Registers
 */
#define MSR_TSC			0x010
#define MSR_IA32_PLATFORM_ID	0x017
#define MSR_APICBASE		0x01b
#define 	APICBASE_BSP		0x00000100	/* boot processor */
#define 	APICBASE_EXTD		0x00000400	/* x2APIC mode */
#define 	APICBASE_EN		0x00000800	/* software enable */
/*
 * APICBASE_PHYSADDR is actually variable-sized on some CPUs. But we're
 * only interested in the initial value, which is guaranteed to fit the
 * first 32 bits. So this macro is fine.
 */
#define 	APICBASE_PHYSADDR	0xfffff000	/* physical address */
#define MSR_EBL_CR_POWERON	0x02a
#define MSR_EBC_FREQUENCY_ID	0x02c	/* PIV only */
#define MSR_IA32_SPEC_CTRL	0x048
#define 	IA32_SPEC_CTRL_IBRS	0x01
#define 	IA32_SPEC_CTRL_STIBP	0x02
#define 	IA32_SPEC_CTRL_SSBD	0x04
#define MSR_IA32_PRED_CMD	0x049
#define 	IA32_PRED_CMD_IBPB	0x01
#define MSR_BIOS_UPDT_TRIG	0x079
#define MSR_BIOS_SIGN		0x08b
#define MSR_PERFCTR0		0x0c1
#define MSR_PERFCTR1		0x0c2
#define MSR_FSB_FREQ		0x0cd	/* Core Duo/Solo only */
#define MSR_MPERF		0x0e7
#define MSR_APERF		0x0e8
#define MSR_IA32_EXT_CONFIG	0x0ee	/* Undocumented. Core Solo/Duo only */
#define MSR_MTRRcap		0x0fe
#define MSR_IA32_ARCH_CAPABILITIES 0x10a
#define 	IA32_ARCH_RDCL_NO	0x01
#define 	IA32_ARCH_IBRS_ALL	0x02
#define 	IA32_ARCH_RSBA		0x04
#define 	IA32_ARCH_SKIP_L1DFL_VMENTRY 0x08
#define 	IA32_ARCH_SSB_NO	0x10
#define 	IA32_ARCH_MDS_NO	0x20
#define 	IA32_ARCH_IF_PSCHANGE_MC_NO 0x40
#define 	IA32_ARCH_TSX_CTRL	0x80
#define 	IA32_ARCH_TAA_NO	0x100
#define MSR_IA32_FLUSH_CMD	0x10b
#define 	IA32_FLUSH_CMD_L1D_FLUSH 0x01
#define MSR_TSX_FORCE_ABORT	0x10f
#define MSR_IA32_TSX_CTRL	0x122
#define 	IA32_TSX_CTRL_RTM_DISABLE	__BIT(0)
#define 	IA32_TSX_CTRL_TSX_CPUID_CLEAR	__BIT(1)
#define MSR_SYSENTER_CS		0x174	/* PII+ only */
#define MSR_SYSENTER_ESP	0x175	/* PII+ only */
#define MSR_SYSENTER_EIP	0x176	/* PII+ only */
#define MSR_MCG_CAP		0x179
#define MSR_MCG_STATUS		0x17a
#define MSR_MCG_CTL		0x17b
#define MSR_EVNTSEL0		0x186
#define MSR_EVNTSEL1		0x187
#define MSR_PERF_STATUS		0x198	/* Pentium M */
#define MSR_PERF_CTL		0x199	/* Pentium M */
#define MSR_THERM_CONTROL	0x19a
#define MSR_THERM_INTERRUPT	0x19b
#define MSR_THERM_STATUS	0x19c
#define MSR_THERM2_CTL		0x19d	/* Pentium M */
#define MSR_MISC_ENABLE		0x1a0
#define 	IA32_MISC_FAST_STR_EN	__BIT(0)
#define 	IA32_MISC_ATCC_EN	__BIT(3)
#define 	IA32_MISC_PERFMON_EN	__BIT(7)
#define 	IA32_MISC_BTS_UNAVAIL	__BIT(11)
#define 	IA32_MISC_PEBS_UNAVAIL	__BIT(12)
#define 	IA32_MISC_EISST_EN	__BIT(16)
#define 	IA32_MISC_MWAIT_EN	__BIT(18)
#define 	IA32_MISC_LIMIT_CPUID	__BIT(22)
#define 	IA32_MISC_XTPR_DIS	__BIT(23)
#define 	IA32_MISC_XD_DIS	__BIT(34)
#define MSR_TEMPERATURE_TARGET	0x1a2
#define MSR_DEBUGCTLMSR		0x1d9
#define MSR_LASTBRANCHFROMIP	0x1db
#define MSR_LASTBRANCHTOIP	0x1dc
#define MSR_LASTINTFROMIP	0x1dd
#define MSR_LASTINTTOIP		0x1de
#define MSR_ROB_CR_BKUPTMPDR6	0x1e0
#define MSR_MTRRphysBase0	0x200
#define MSR_MTRRphysMask0	0x201
#define MSR_MTRRphysBase1	0x202
#define MSR_MTRRphysMask1	0x203
#define MSR_MTRRphysBase2	0x204
#define MSR_MTRRphysMask2	0x205
#define MSR_MTRRphysBase3	0x206
#define MSR_MTRRphysMask3	0x207
#define MSR_MTRRphysBase4	0x208
#define MSR_MTRRphysMask4	0x209
#define MSR_MTRRphysBase5	0x20a
#define MSR_MTRRphysMask5	0x20b
#define MSR_MTRRphysBase6	0x20c
#define MSR_MTRRphysMask6	0x20d
#define MSR_MTRRphysBase7	0x20e
#define MSR_MTRRphysMask7	0x20f
#define MSR_MTRRphysBase8	0x210
#define MSR_MTRRphysMask8	0x211
#define MSR_MTRRphysBase9	0x212
#define MSR_MTRRphysMask9	0x213
#define MSR_MTRRphysBase10	0x214
#define MSR_MTRRphysMask10	0x215
#define MSR_MTRRphysBase11	0x216
#define MSR_MTRRphysMask11	0x217
#define MSR_MTRRphysBase12	0x218
#define MSR_MTRRphysMask12	0x219
#define MSR_MTRRphysBase13	0x21a
#define MSR_MTRRphysMask13	0x21b
#define MSR_MTRRphysBase14	0x21c
#define MSR_MTRRphysMask14	0x21d
#define MSR_MTRRphysBase15	0x21e
#define MSR_MTRRphysMask15	0x21f
#define MSR_MTRRfix64K_00000	0x250
#define MSR_MTRRfix16K_80000	0x258
#define MSR_MTRRfix16K_A0000	0x259
#define MSR_MTRRfix4K_C0000	0x268
#define MSR_MTRRfix4K_C8000	0x269
#define MSR_MTRRfix4K_D0000	0x26a
#define MSR_MTRRfix4K_D8000	0x26b
#define MSR_MTRRfix4K_E0000	0x26c
#define MSR_MTRRfix4K_E8000	0x26d
#define MSR_MTRRfix4K_F0000	0x26e
#define MSR_MTRRfix4K_F8000	0x26f
#define MSR_CR_PAT		0x277
#define MSR_MTRRdefType		0x2ff
#define MSR_MC0_CTL		0x400
#define MSR_MC0_STATUS		0x401
#define MSR_MC0_ADDR		0x402
#define MSR_MC0_MISC		0x403
#define MSR_MC1_CTL		0x404
#define MSR_MC1_STATUS		0x405
#define MSR_MC1_ADDR		0x406
#define MSR_MC1_MISC		0x407
#define MSR_MC2_CTL		0x408
#define MSR_MC2_STATUS		0x409
#define MSR_MC2_ADDR		0x40a
#define MSR_MC2_MISC		0x40b
#define MSR_MC3_CTL		0x40c
#define MSR_MC3_STATUS		0x40d
#define MSR_MC3_ADDR		0x40e
#define MSR_MC3_MISC		0x40f
#define MSR_MC4_CTL		0x410
#define MSR_MC4_STATUS		0x411
#define MSR_MC4_ADDR		0x412
#define MSR_MC4_MISC		0x413
				/* 0x480 - 0x490 VMX */
#define MSR_X2APIC_BASE		0x800	/* 0x800 - 0xBFF */
#define  MSR_X2APIC_ID			0x002	/* x2APIC ID. (RO) */
#define  MSR_X2APIC_VERS		0x003	/* Version. (RO) */
#define  MSR_X2APIC_TPRI		0x008	/* Task Prio. (RW) */
#define  MSR_X2APIC_PPRI		0x00a	/* Processor prio. (RO) */
#define  MSR_X2APIC_EOI			0x00b	/* End Int. (W) */
#define  MSR_X2APIC_LDR			0x00d	/* Logical dest. (RO) */
#define  MSR_X2APIC_SVR			0x00f	/* Spurious intvec (RW) */
#define  MSR_X2APIC_ISR			0x010	/* In-Service Status (RO) */
#define  MSR_X2APIC_TMR			0x018	/* Trigger Mode (RO) */
#define  MSR_X2APIC_IRR			0x020	/* Interrupt Req (RO) */
#define  MSR_X2APIC_ESR			0x028	/* Err status. (RW) */
#define  MSR_X2APIC_LVT_CMCI		0x02f	/* LVT CMCI (RW) */
#define  MSR_X2APIC_ICRLO		0x030	/* Int. cmd. (RW64) */
#define  MSR_X2APIC_LVTT		0x032	/* Loc.vec.(timer) (RW) */
#define  MSR_X2APIC_TMINT		0x033	/* Loc.vec (Thermal) (RW) */
#define  MSR_X2APIC_PCINT		0x034	/* Loc.vec (Perf Mon) (RW) */
#define  MSR_X2APIC_LVINT0		0x035	/* Loc.vec (LINT0) (RW) */
#define  MSR_X2APIC_LVINT1		0x036	/* Loc.vec (LINT1) (RW) */
#define  MSR_X2APIC_LVERR		0x037	/* Loc.vec (ERROR) (RW) */
#define  MSR_X2APIC_ICR_TIMER		0x038	/* Initial count (RW) */
#define  MSR_X2APIC_CCR_TIMER		0x039	/* Current count (RO) */
#define  MSR_X2APIC_DCR_TIMER		0x03e	/* Divisor config (RW) */
#define  MSR_X2APIC_SELF_IPI		0x03f	/* SELF IPI (W) */

/*
 * VIA "Nehemiah" MSRs
 */
#define MSR_VIA_RNG		0x0000110b
#define MSR_VIA_RNG_ENABLE	0x00000040
#define MSR_VIA_RNG_NOISE_MASK	0x00000300
#define MSR_VIA_RNG_NOISE_A	0x00000000
#define MSR_VIA_RNG_NOISE_B	0x00000100
#define MSR_VIA_RNG_2NOISE	0x00000300
#define MSR_VIA_ACE		0x00001107
#define 	VIA_ACE_ALTINST	0x00000001
#define 	VIA_ACE_ECX8	0x00000002
#define 	VIA_ACE_ENABLE	0x10000000

/*
 * VIA "Eden" MSRs
 */
#define MSR_VIA_FCR		MSR_VIA_ACE

/*
 * AMD K6/K7 MSRs.
 */
#define MSR_K6_UWCCR		0xc0000085
#define MSR_K7_EVNTSEL0		0xc0010000
#define MSR_K7_EVNTSEL1		0xc0010001
#define MSR_K7_EVNTSEL2		0xc0010002
#define MSR_K7_EVNTSEL3		0xc0010003
#define MSR_K7_PERFCTR0		0xc0010004
#define MSR_K7_PERFCTR1		0xc0010005
#define MSR_K7_PERFCTR2		0xc0010006
#define MSR_K7_PERFCTR3		0xc0010007

/*
 * AMD K8 (Opteron) MSRs.
 */
#define MSR_SYSCFG	0xc0010010

#define MSR_EFER	0xc0000080		/* Extended feature enable */
#define 	EFER_SCE	0x00000001	/* SYSCALL extension */
#define 	EFER_LME	0x00000100	/* Long Mode Enable */
#define 	EFER_LMA	0x00000400	/* Long Mode Active */
#define 	EFER_NXE	0x00000800	/* No-Execute Enabled */
#define 	EFER_SVME	0x00001000	/* Secure Virtual Machine En. */
#define 	EFER_LMSLE	0x00002000	/* Long Mode Segment Limit E. */
#define 	EFER_FFXSR	0x00004000	/* Fast FXSAVE/FXRSTOR En. */
#define 	EFER_TCE	0x00008000	/* Translation Cache Ext. */

#define MSR_STAR	0xc0000081		/* 32 bit syscall gate addr */
#define MSR_LSTAR	0xc0000082		/* 64 bit syscall gate addr */
#define MSR_CSTAR	0xc0000083		/* compat syscall gate addr */
#define MSR_SFMASK	0xc0000084		/* flags to clear on syscall */

#define MSR_FSBASE	0xc0000100		/* 64bit offset for fs: */
#define MSR_GSBASE	0xc0000101		/* 64bit offset for gs: */
#define MSR_KERNELGSBASE 0xc0000102		/* storage for swapgs ins */

#define MSR_VMCR	0xc0010114	/* Virtual Machine Control Register */
#define 	VMCR_DPD	0x00000001	/* Debug port disable */
#define 	VMCR_RINIT	0x00000002	/* intercept init */
#define 	VMCR_DISA20	0x00000004	/* Disable A20 masking */
#define 	VMCR_LOCK	0x00000008	/* SVM Lock */
#define 	VMCR_SVMED	0x00000010	/* SVME Disable */
#define MSR_SVMLOCK	0xc0010118	/* SVM Lock key */

/*
 * These require a 'passcode' for access.  See cpufunc.h.
 */
#define MSR_HWCR	0xc0010015
#define 	HWCR_TLBCACHEDIS	0x00000008
#define 	HWCR_FFDIS		0x00000040

#define MSR_NB_CFG	0xc001001f
#define 	NB_CFG_DISIOREQLOCK	0x0000000000000008ULL
#define 	NB_CFG_DISDATMSK	0x0000001000000000ULL
#define 	NB_CFG_INITAPICCPUIDLO	(1ULL << 54)

#define MSR_LS_CFG	0xc0011020
#define 	LS_CFG_ERRATA_1033	__BIT(4)
#define 	LS_CFG_ERRATA_793	__BIT(15)
#define 	LS_CFG_ERRATA_1095	__BIT(57)
#define 	LS_CFG_DIS_LS2_SQUISH	0x02000000
#define 	LS_CFG_DIS_SSB_F15H	0x0040000000000000ULL
#define 	LS_CFG_DIS_SSB_F16H	0x0000000200000000ULL
#define 	LS_CFG_DIS_SSB_F17H	0x0000000000000400ULL

#define MSR_IC_CFG	0xc0011021
#define 	IC_CFG_DIS_SEQ_PREFETCH	0x00000800
#define 	IC_CFG_DIS_IND		0x00004000
#define 	IC_CFG_ERRATA_776	__BIT(26)

#define MSR_DC_CFG	0xc0011022
#define 	DC_CFG_DIS_CNV_WC_SSO	0x00000008
#define 	DC_CFG_DIS_SMC_CHK_BUF	0x00000400
#define 	DC_CFG_ERRATA_261	0x01000000

#define MSR_BU_CFG	0xc0011023
#define 	BU_CFG_ERRATA_298	0x0000000000000002ULL
#define 	BU_CFG_ERRATA_254	0x0000000000200000ULL
#define 	BU_CFG_ERRATA_309	0x0000000000800000ULL
#define 	BU_CFG_THRL2IDXCMPDIS	0x0000080000000000ULL
#define 	BU_CFG_WBPFSMCCHKDIS	0x0000200000000000ULL
#define 	BU_CFG_WBENHWSBDIS	0x0001000000000000ULL

#define MSR_FP_CFG	0xc0011028
#define 	FP_CFG_ERRATA_1049	__BIT(4)

#define MSR_DE_CFG	0xc0011029
#define 	DE_CFG_ERRATA_721	0x00000001
#define 	DE_CFG_LFENCE_SERIALIZE	__BIT(1)
#define 	DE_CFG_ERRATA_1021	__BIT(13)

#define MSR_BU_CFG2	0xc001102a
#define 	BU_CFG2_CWPLUS_DIS	__BIT(24)

#define MSR_LS_CFG2	0xc001102d
#define 	LS_CFG2_ERRATA_1091	__BIT(34)

/* AMD Family10h MSRs */
#define MSR_OSVW_ID_LENGTH		0xc0010140
#define MSR_OSVW_STATUS			0xc0010141
#define MSR_UCODE_AMD_PATCHLEVEL	0x0000008b
#define MSR_UCODE_AMD_PATCHLOADER	0xc0010020

/* X86 MSRs */
#define MSR_RDTSCP_AUX			0xc0000103

/*
 * Constants related to MTRRs
 */
#define MTRR_N64K		8	/* numbers of fixed-size entries */
#define MTRR_N16K		16
#define MTRR_N4K		64

/*
 * the following four 3-byte registers control the non-cacheable regions.
 * These registers must be written as three separate bytes.
 *
 * NCRx+0: A31-A24 of starting address
 * NCRx+1: A23-A16 of starting address
 * NCRx+2: A15-A12 of starting address | NCR_SIZE_xx.
 *
 * The non-cacheable region's starting address must be aligned to the
 * size indicated by the NCR_SIZE_xx field.
 */
#define NCR1	0xc4
#define NCR2	0xc7
#define NCR3	0xca
#define NCR4	0xcd

#define NCR_SIZE_0K	0
#define NCR_SIZE_4K	1
#define NCR_SIZE_8K	2
#define NCR_SIZE_16K	3
#define NCR_SIZE_32K	4
#define NCR_SIZE_64K	5
#define NCR_SIZE_128K	6
#define NCR_SIZE_256K	7
#define NCR_SIZE_512K	8
#define NCR_SIZE_1M	9
#define NCR_SIZE_2M	10
#define NCR_SIZE_4M	11
#define NCR_SIZE_8M	12
#define NCR_SIZE_16M	13
#define NCR_SIZE_32M	14
#define NCR_SIZE_4G	15