xref: /illumos-gate/usr/src/uts/intel/sys/controlregs.h (revision 651a12cb584eebf7e5b356edf2efff591ac7eb65)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5ee88d2b9Skchow  * Common Development and Distribution License (the "License").
6ee88d2b9Skchow  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*
227af88ac7SKuriakose Kuruvilla  * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
2374ecdb51SJohn Levon  * Copyright 2018, Joyent, Inc.
24e3092845SStuart Maybee  * Copyright 2022 Tintri by DDN, Inc. All rights reserved.
25*651a12cbSRobert Mustacchi  * Copyright 2023 Oxide Computer Company
267c478bd9Sstevel@tonic-gate  */
277c478bd9Sstevel@tonic-gate 
287c478bd9Sstevel@tonic-gate #ifndef	_SYS_CONTROLREGS_H
297c478bd9Sstevel@tonic-gate #define	_SYS_CONTROLREGS_H
307c478bd9Sstevel@tonic-gate 
317c478bd9Sstevel@tonic-gate #ifndef _ASM
327c478bd9Sstevel@tonic-gate #include <sys/types.h>
337c478bd9Sstevel@tonic-gate #endif
347c478bd9Sstevel@tonic-gate 
357c478bd9Sstevel@tonic-gate #ifdef __cplusplus
367c478bd9Sstevel@tonic-gate extern "C" {
377c478bd9Sstevel@tonic-gate #endif
387c478bd9Sstevel@tonic-gate 
397c478bd9Sstevel@tonic-gate /*
407c478bd9Sstevel@tonic-gate  * This file describes the x86 architecture control registers which
417c478bd9Sstevel@tonic-gate  * are part of the privileged architecture.
427c478bd9Sstevel@tonic-gate  *
437c478bd9Sstevel@tonic-gate  * Many of these definitions are shared between IA-32-style and
447c478bd9Sstevel@tonic-gate  * AMD64-style processors.
457c478bd9Sstevel@tonic-gate  */
467c478bd9Sstevel@tonic-gate 
477c478bd9Sstevel@tonic-gate /* CR0 Register */
487c478bd9Sstevel@tonic-gate 
497c478bd9Sstevel@tonic-gate #define	CR0_PG	0x80000000		/* paging enabled	*/
507c478bd9Sstevel@tonic-gate #define	CR0_CD	0x40000000		/* cache disable	*/
517c478bd9Sstevel@tonic-gate #define	CR0_NW	0x20000000		/* not writethrough	*/
527c478bd9Sstevel@tonic-gate #define	CR0_AM	0x00040000		/* alignment mask	*/
537c478bd9Sstevel@tonic-gate #define	CR0_WP	0x00010000		/* write protect	*/
547c478bd9Sstevel@tonic-gate #define	CR0_NE	0x00000020		/* numeric error	*/
557c478bd9Sstevel@tonic-gate #define	CR0_ET	0x00000010		/* extension type	*/
567c478bd9Sstevel@tonic-gate #define	CR0_TS	0x00000008		/* task switch		*/
577c478bd9Sstevel@tonic-gate #define	CR0_EM	0x00000004		/* emulation		*/
587c478bd9Sstevel@tonic-gate #define	CR0_MP	0x00000002		/* monitor coprocessor	*/
597c478bd9Sstevel@tonic-gate #define	CR0_PE	0x00000001		/* protection enabled	*/
607c478bd9Sstevel@tonic-gate 
617c478bd9Sstevel@tonic-gate /* XX64 eliminate these compatibility defines */
627c478bd9Sstevel@tonic-gate 
637c478bd9Sstevel@tonic-gate #define	CR0_CE	CR0_CD
647c478bd9Sstevel@tonic-gate #define	CR0_WT	CR0_NW
657c478bd9Sstevel@tonic-gate 
667c478bd9Sstevel@tonic-gate #define	FMT_CR0	\
677c478bd9Sstevel@tonic-gate 	"\20\40pg\37cd\36nw\35am\21wp\6ne\5et\4ts\3em\2mp\1pe"
687c478bd9Sstevel@tonic-gate 
69ae115bc7Smrj /*
70ae115bc7Smrj  * Set the FPU-related control bits to explain to the processor that
71ae115bc7Smrj  * we're managing FPU state:
72ae115bc7Smrj  * - set monitor coprocessor (allow TS bit to control FPU)
73ae115bc7Smrj  * - set numeric exception (disable IGNNE# mechanism)
74ae115bc7Smrj  * - set task switch (#nm on first fp instruction)
75ae115bc7Smrj  * - clear emulate math bit (cause we're not emulating!)
76ae115bc7Smrj  */
77ae115bc7Smrj #define	CR0_ENABLE_FPU_FLAGS(cr)	\
78ae115bc7Smrj 	(((cr) | CR0_MP | CR0_NE | CR0_TS) & (uint32_t)~CR0_EM)
79ae115bc7Smrj 
80ae115bc7Smrj /*
81ae115bc7Smrj  * Set the FPU-related control bits to explain to the processor that
82ae115bc7Smrj  * we're -not- managing FPU state:
83ae115bc7Smrj  * - set emulate (all fp instructions cause #nm)
84ae115bc7Smrj  * - clear monitor coprocessor (so fwait/wait doesn't #nm)
85ae115bc7Smrj  */
86ae115bc7Smrj #define	CR0_DISABLE_FPU_FLAGS(cr)	\
87ae115bc7Smrj 	(((cr) | CR0_EM) & (uint32_t)~CR0_MP)
88ae115bc7Smrj 
897c478bd9Sstevel@tonic-gate /* CR3 Register */
907c478bd9Sstevel@tonic-gate 
917c478bd9Sstevel@tonic-gate #define	CR3_PCD	0x00000010		/* cache disable		*/
927c478bd9Sstevel@tonic-gate #define	CR3_PWT 0x00000008		/* write through		*/
9374ecdb51SJohn Levon #if defined(_ASM)
9474ecdb51SJohn Levon #define	CR3_NOINVL_BIT	0x8000000000000000
9574ecdb51SJohn Levon #else
9674ecdb51SJohn Levon #define	CR3_NOINVL_BIT	0x8000000000000000ULL /* no invalidation	*/
9774ecdb51SJohn Levon #endif
9874ecdb51SJohn Levon #define	PCID_NONE	0x000		/* generic PCID			*/
9974ecdb51SJohn Levon #define	PCID_KERNEL	0x000		/* kernel's PCID		*/
10074ecdb51SJohn Levon #define	PCID_USER	0x001		/* user-space PCID		*/
1017c478bd9Sstevel@tonic-gate 
1027c478bd9Sstevel@tonic-gate /* CR4 Register */
1037c478bd9Sstevel@tonic-gate 
1047c478bd9Sstevel@tonic-gate #define	CR4_VME		0x0001		/* virtual-8086 mode extensions	*/
1057c478bd9Sstevel@tonic-gate #define	CR4_PVI		0x0002		/* protected-mode virtual interrupts */
1067c478bd9Sstevel@tonic-gate #define	CR4_TSD		0x0004		/* time stamp disable		*/
1077c478bd9Sstevel@tonic-gate #define	CR4_DE		0x0008		/* debugging extensions		*/
1087c478bd9Sstevel@tonic-gate #define	CR4_PSE		0x0010		/* page size extensions		*/
1097c478bd9Sstevel@tonic-gate #define	CR4_PAE		0x0020		/* physical address extension	*/
1107c478bd9Sstevel@tonic-gate #define	CR4_MCE		0x0040		/* machine check enable		*/
1117c478bd9Sstevel@tonic-gate #define	CR4_PGE		0x0080		/* page global enable		*/
1127c478bd9Sstevel@tonic-gate #define	CR4_PCE		0x0100		/* perf-monitoring counter enable */
1137c478bd9Sstevel@tonic-gate #define	CR4_OSFXSR	0x0200		/* OS fxsave/fxrstor support	*/
1147c478bd9Sstevel@tonic-gate #define	CR4_OSXMMEXCPT	0x0400		/* OS unmasked exception support */
1159c3024a3SHans Rosenfeld #define	CR4_UMIP	0x0800		/* user-mode instruction prevention */
116e3092845SStuart Maybee #define	CR4_LA57	0x1000		/* enable 57 bit Logical addressing */
1179c3024a3SHans Rosenfeld #define	CR4_VMXE	0x2000		/* VMX enable */
1189c3024a3SHans Rosenfeld #define	CR4_SMXE	0x4000		/* SMX enable */
1199c3024a3SHans Rosenfeld 					/* 0x8000 reserved */
1209c3024a3SHans Rosenfeld #define	CR4_FSGSBASE	0x10000		/* FSGSBASE enable */
121399ca3a7SJohn Levon #define	CR4_PCIDE	0x20000		/* PCID enable */
1227af88ac7SKuriakose Kuruvilla #define	CR4_OSXSAVE	0x40000		/* OS xsave/xrestore support	*/
123799823bbSRobert Mustacchi #define	CR4_SMEP	0x100000	/* NX for user pages in kernel */
1243ce2fcdcSRobert Mustacchi #define	CR4_SMAP	0x200000	/* kernel can't access user pages */
1259c3024a3SHans Rosenfeld #define	CR4_PKE		0x400000	/* protection key enable */
1267c478bd9Sstevel@tonic-gate 
1277c478bd9Sstevel@tonic-gate #define	FMT_CR4						\
1289c3024a3SHans Rosenfeld 	"\20\27pke\26smap\25smep\23osxsav"		\
129e3092845SStuart Maybee 	"\22pcide\21fsgsbase\17smxe\16vmxe"		\
130e3092845SStuart Maybee 	"\15la57\14umip\13xmme\12fxsr\11pce\10pge"	\
131ae115bc7Smrj 	"\7mce\6pae\5pse\4de\3tsd\2pvi\1vme"
132ae115bc7Smrj 
133ae115bc7Smrj /*
134ae115bc7Smrj  * Enable the SSE-related control bits to explain to the processor that
135ae115bc7Smrj  * we're managing XMM state and exceptions
136ae115bc7Smrj  */
137ae115bc7Smrj #define	CR4_ENABLE_SSE_FLAGS(cr)	\
138ae115bc7Smrj 	((cr) | CR4_OSFXSR | CR4_OSXMMEXCPT)
139ae115bc7Smrj 
140ae115bc7Smrj /*
141ae115bc7Smrj  * Disable the SSE-related control bits to explain to the processor
142ae115bc7Smrj  * that we're NOT managing XMM state
143ae115bc7Smrj  */
144ae115bc7Smrj #define	CR4_DISABLE_SSE_FLAGS(cr)	\
145ae115bc7Smrj 	((cr) & ~(uint32_t)(CR4_OSFXSR | CR4_OSXMMEXCPT))
1467c478bd9Sstevel@tonic-gate 
1477c478bd9Sstevel@tonic-gate /* Intel's SYSENTER configuration registers */
1487c478bd9Sstevel@tonic-gate 
1497c478bd9Sstevel@tonic-gate #define	MSR_INTC_SEP_CS	0x174		/* kernel code selector MSR */
1507c478bd9Sstevel@tonic-gate #define	MSR_INTC_SEP_ESP 0x175		/* kernel esp MSR */
1517c478bd9Sstevel@tonic-gate #define	MSR_INTC_SEP_EIP 0x176		/* kernel eip MSR */
1527c478bd9Sstevel@tonic-gate 
1532449e17fSsherrym /* Intel's microcode registers */
1542449e17fSsherrym #define	MSR_INTC_UCODE_WRITE		0x79	/* microcode write */
1552449e17fSsherrym #define	MSR_INTC_UCODE_REV		0x8b	/* microcode revision */
1562449e17fSsherrym #define	INTC_UCODE_REV_SHIFT		32	/* Bits 63:32 */
1572449e17fSsherrym 
1582449e17fSsherrym /* Intel's platform identification */
1592449e17fSsherrym #define	MSR_INTC_PLATFORM_ID		0x17
1602449e17fSsherrym #define	INTC_PLATFORM_ID_SHIFT		50	/* Bit 52:50 */
1612449e17fSsherrym #define	INTC_PLATFORM_ID_MASK		0x7
1622449e17fSsherrym 
1637c478bd9Sstevel@tonic-gate /* AMD's EFER register */
1647c478bd9Sstevel@tonic-gate 
1657c478bd9Sstevel@tonic-gate #define	MSR_AMD_EFER	0xc0000080	/* extended feature enable MSR */
1667c478bd9Sstevel@tonic-gate 
167*651a12cbSRobert Mustacchi #define	AMD_EFER_AIBRSE	0x200000	/* Automatic IBRS Enable */
168*651a12cbSRobert Mustacchi #define	AMD_EFER_UAIE	0x100000	/* upper address ignore enable */
169*651a12cbSRobert Mustacchi #define	AMD_EFER_INTWB	0x040000	/* interruptible wbinvd / wbnoinvd */
170*651a12cbSRobert Mustacchi #define	AMD_EFER_MCOMMIT	0x020000 /* enable mcommit instr */
171*651a12cbSRobert Mustacchi #define	AMD_EFER_TCE	0x008000	/* translation cache extension */
172*651a12cbSRobert Mustacchi #define	AMD_EFER_FFXSR	0x004000	/* fast fxsave/fxrstor		*/
173*651a12cbSRobert Mustacchi #define	AMD_EFER_LMSLE	0x002000	/* long mode segment limit enable */
174*651a12cbSRobert Mustacchi #define	AMD_EFER_SVME	0x001000	/* svm enable			*/
175*651a12cbSRobert Mustacchi #define	AMD_EFER_NXE	0x000800	/* no-execute enable		*/
176*651a12cbSRobert Mustacchi #define	AMD_EFER_LMA	0x000400	/* long mode active (read-only)	*/
177*651a12cbSRobert Mustacchi #define	AMD_EFER_LME	0x000100	/* long mode enable		*/
178*651a12cbSRobert Mustacchi #define	AMD_EFER_SCE	0x000001	/* system call extensions	*/
1797c478bd9Sstevel@tonic-gate 
1807c478bd9Sstevel@tonic-gate /* AMD's SYSCFG register */
1817c478bd9Sstevel@tonic-gate 
1827c478bd9Sstevel@tonic-gate #define	MSR_AMD_SYSCFG	0xc0000010	/* system configuration MSR */
1837c478bd9Sstevel@tonic-gate 
1847c478bd9Sstevel@tonic-gate #define	AMD_SYSCFG_TOM2	0x200000	/* MtrrTom2En */
1857c478bd9Sstevel@tonic-gate #define	AMD_SYSCFG_MVDM	0x100000	/* MtrrVarDramEn */
1867c478bd9Sstevel@tonic-gate #define	AMD_SYSCFG_MFDM	0x080000	/* MtrrFixDramModEn */
1877c478bd9Sstevel@tonic-gate #define	AMD_SYSCFG_MFDE	0x040000	/* MtrrFixDramEn */
1887c478bd9Sstevel@tonic-gate 
1897c478bd9Sstevel@tonic-gate #define	FMT_AMD_SYSCFG \
1907c478bd9Sstevel@tonic-gate 	"\20\26tom2\25mvdm\24mfdm\23mfde"
1917c478bd9Sstevel@tonic-gate 
1927c478bd9Sstevel@tonic-gate /* AMD's syscall/sysret MSRs */
1937c478bd9Sstevel@tonic-gate 
1947c478bd9Sstevel@tonic-gate #define	MSR_AMD_STAR	0xc0000081	/* %cs:%ss:%cs:%ss:%eip for syscall */
1957c478bd9Sstevel@tonic-gate #define	MSR_AMD_LSTAR	0xc0000082	/* target %rip of 64-bit syscall */
1967c478bd9Sstevel@tonic-gate #define	MSR_AMD_CSTAR	0xc0000083	/* target %rip of 32-bit syscall */
1977c478bd9Sstevel@tonic-gate #define	MSR_AMD_SFMASK	0xc0000084	/* syscall flag mask */
1987c478bd9Sstevel@tonic-gate 
1997c478bd9Sstevel@tonic-gate /* AMD's FS.base and GS.base MSRs */
2007c478bd9Sstevel@tonic-gate 
2017c478bd9Sstevel@tonic-gate #define	MSR_AMD_FSBASE	0xc0000100	/* 64-bit base address for %fs */
2027c478bd9Sstevel@tonic-gate #define	MSR_AMD_GSBASE	0xc0000101	/* 64-bit base address for %gs */
2037c478bd9Sstevel@tonic-gate #define	MSR_AMD_KGSBASE	0xc0000102	/* swapgs swaps this with gsbase */
204ae115bc7Smrj #define	MSR_AMD_TSCAUX	0xc0000103	/* %ecx value on rdtscp insn */
2057c478bd9Sstevel@tonic-gate 
206761dea5eSPatrick Mooney 
207761dea5eSPatrick Mooney /* AMD's SVM MSRs */
208761dea5eSPatrick Mooney 
209761dea5eSPatrick Mooney #define	MSR_AMD_VM_CR		0xc0010114 /* SVM global control */
210761dea5eSPatrick Mooney #define	MSR_AMD_VM_HSAVE_PA	0xc0010117 /* SVM host save area address */
211761dea5eSPatrick Mooney 
212761dea5eSPatrick Mooney #define	AMD_VM_CR_DPD		(1 << 0)
213761dea5eSPatrick Mooney #define	AMD_VM_CR_R_INIT	(1 << 1)
214761dea5eSPatrick Mooney #define	AMD_VM_CR_DIS_A20M	(1 << 2)
215761dea5eSPatrick Mooney #define	AMD_VM_CR_LOCK		(1 << 3)
216761dea5eSPatrick Mooney #define	AMD_VM_CR_SVMDIS	(1 << 4)
217761dea5eSPatrick Mooney 
2187c478bd9Sstevel@tonic-gate /* AMD's configuration MSRs, weakly documented in the revision guide */
2197c478bd9Sstevel@tonic-gate 
2207c478bd9Sstevel@tonic-gate #define	MSR_AMD_DC_CFG	0xc0011022
2217c478bd9Sstevel@tonic-gate 
2227c478bd9Sstevel@tonic-gate #define	AMD_DC_CFG_DIS_CNV_WC_SSO	(UINT64_C(1) << 3)
2237c478bd9Sstevel@tonic-gate #define	AMD_DC_CFG_DIS_SMC_CHK_BUF	(UINT64_C(1) << 10)
2247c478bd9Sstevel@tonic-gate 
2257c478bd9Sstevel@tonic-gate /* AMD's HWCR MSR */
2262201b277Skucharsk 
2277c478bd9Sstevel@tonic-gate #define	MSR_AMD_HWCR	0xc0010015
2287c478bd9Sstevel@tonic-gate 
229512cf780Skchow #define	AMD_HWCR_TLBCACHEDIS		(UINT64_C(1) << 3)
2307aec1d6eScindi #define	AMD_HWCR_FFDIS			0x00040	/* disable TLB Flush Filter */
2317aec1d6eScindi #define	AMD_HWCR_MCI_STATUS_WREN	0x40000	/* enable write of MCi_STATUS */
2327c478bd9Sstevel@tonic-gate 
2332201b277Skucharsk /* AMD's NorthBridge Config MSR, SHOULD ONLY BE WRITTEN TO BY BIOS */
2342201b277Skucharsk 
2352201b277Skucharsk #define	MSR_AMD_NB_CFG	0xc001001f
2362201b277Skucharsk 
2372201b277Skucharsk #define	AMD_NB_CFG_SRQ_HEARTBEAT	(UINT64_C(1) << 20)
238cb9f16ebSkchow #define	AMD_NB_CFG_SRQ_SPR		(UINT64_C(1) << 32)
2392201b277Skucharsk 
240512cf780Skchow #define	MSR_AMD_BU_CFG	0xc0011023
241512cf780Skchow 
242512cf780Skchow #define	AMD_BU_CFG_E298			(UINT64_C(1) << 1)
243512cf780Skchow 
244da2b26b1SPatrick Mooney /*
245da2b26b1SPatrick Mooney  * This MSR exists on families, 10h, 12h+ for AMD. This controls instruction
246da2b26b1SPatrick Mooney  * decoding. Most notably, for the AMD variant of retpolines, we must improve
247da2b26b1SPatrick Mooney  * the serializability of lfence for the lfence based method to work.
248da2b26b1SPatrick Mooney  */
2495e54b56dSHans Rosenfeld #define	MSR_AMD_DE_CFG	0xc0011029
2505e54b56dSHans Rosenfeld 
251da2b26b1SPatrick Mooney #define	AMD_DE_CFG_E721			(1UL << 0)
252da2b26b1SPatrick Mooney #define	AMD_DE_CFG_LFENCE_DISPATCH	(1UL << 1)
2535e54b56dSHans Rosenfeld 
254512cf780Skchow /* AMD's osvw MSRs */
255512cf780Skchow #define	MSR_AMD_OSVW_ID_LEN		0xc0010140
256512cf780Skchow #define	MSR_AMD_OSVW_STATUS		0xc0010141
257512cf780Skchow 
258512cf780Skchow 
259512cf780Skchow #define	OSVW_ID_LEN_MASK		0xffffULL
260512cf780Skchow #define	OSVW_ID_CNT_PER_MSR		64
261512cf780Skchow 
262f78a91cdSjjc /*
263f78a91cdSjjc  * Enable PCI Extended Configuration Space (ECS) on Greyhound
264f78a91cdSjjc  */
265f78a91cdSjjc #define	AMD_GH_NB_CFG_EN_ECS		(UINT64_C(1) << 46)
266f78a91cdSjjc 
267adc586deSMark Johnson /* AMD microcode patch loader */
2687c478bd9Sstevel@tonic-gate #define	MSR_AMD_PATCHLEVEL	0x8b
269adc586deSMark Johnson #define	MSR_AMD_PATCHLOADER	0xc0010020
2707c478bd9Sstevel@tonic-gate 
2717c478bd9Sstevel@tonic-gate #ifdef __cplusplus
2727c478bd9Sstevel@tonic-gate }
2737c478bd9Sstevel@tonic-gate #endif
2747c478bd9Sstevel@tonic-gate 
2757c478bd9Sstevel@tonic-gate #endif	/* !_SYS_CONTROLREGS_H */
276