summaryrefslogtreecommitdiff
path: root/include/arch/x86_64/asm/svm.h
blob: 76c309706cefe2c09c1fc669280382b2058cccbd (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
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef __SVM_H
#define __SVM_H

#define SVM_EXIT_READ_CR0		   0x000
#define SVM_EXIT_READ_CR2		   0x002
#define SVM_EXIT_READ_CR3		   0x003
#define SVM_EXIT_READ_CR4		   0x004
#define SVM_EXIT_READ_CR8		   0x008
#define SVM_EXIT_WRITE_CR0		   0x010
#define SVM_EXIT_WRITE_CR2		   0x012
#define SVM_EXIT_WRITE_CR3		   0x013
#define SVM_EXIT_WRITE_CR4		   0x014
#define SVM_EXIT_WRITE_CR8		   0x018
#define SVM_EXIT_READ_DR0		   0x020
#define SVM_EXIT_READ_DR1		   0x021
#define SVM_EXIT_READ_DR2		   0x022
#define SVM_EXIT_READ_DR3		   0x023
#define SVM_EXIT_READ_DR4		   0x024
#define SVM_EXIT_READ_DR5		   0x025
#define SVM_EXIT_READ_DR6		   0x026
#define SVM_EXIT_READ_DR7		   0x027
#define SVM_EXIT_WRITE_DR0		   0x030
#define SVM_EXIT_WRITE_DR1		   0x031
#define SVM_EXIT_WRITE_DR2		   0x032
#define SVM_EXIT_WRITE_DR3		   0x033
#define SVM_EXIT_WRITE_DR4		   0x034
#define SVM_EXIT_WRITE_DR5		   0x035
#define SVM_EXIT_WRITE_DR6		   0x036
#define SVM_EXIT_WRITE_DR7		   0x037
#define SVM_EXIT_EXCP_BASE		   0x040
#define SVM_EXIT_LAST_EXCP		   0x05f
#define SVM_EXIT_INTR			   0x060
#define SVM_EXIT_NMI			   0x061
#define SVM_EXIT_SMI			   0x062
#define SVM_EXIT_INIT			   0x063
#define SVM_EXIT_VINTR			   0x064
#define SVM_EXIT_CR0_SEL_WRITE		   0x065
#define SVM_EXIT_IDTR_READ		   0x066
#define SVM_EXIT_GDTR_READ		   0x067
#define SVM_EXIT_LDTR_READ		   0x068
#define SVM_EXIT_TR_READ		   0x069
#define SVM_EXIT_IDTR_WRITE		   0x06a
#define SVM_EXIT_GDTR_WRITE		   0x06b
#define SVM_EXIT_LDTR_WRITE		   0x06c
#define SVM_EXIT_TR_WRITE		   0x06d
#define SVM_EXIT_RDTSC			   0x06e
#define SVM_EXIT_RDPMC			   0x06f
#define SVM_EXIT_PUSHF			   0x070
#define SVM_EXIT_POPF			   0x071
#define SVM_EXIT_CPUID			   0x072
#define SVM_EXIT_RSM			   0x073
#define SVM_EXIT_IRET			   0x074
#define SVM_EXIT_SWINT			   0x075
#define SVM_EXIT_INVD			   0x076
#define SVM_EXIT_PAUSE			   0x077
#define SVM_EXIT_HLT			   0x078
#define SVM_EXIT_INVLPG			   0x079
#define SVM_EXIT_INVLPGA		   0x07a
#define SVM_EXIT_IOIO			   0x07b
#define SVM_EXIT_MSR			   0x07c
#define SVM_EXIT_TASK_SWITCH		   0x07d
#define SVM_EXIT_FERR_FREEZE		   0x07e
#define SVM_EXIT_SHUTDOWN		   0x07f
#define SVM_EXIT_VMRUN			   0x080
#define SVM_EXIT_VMMCALL		   0x081
#define SVM_EXIT_VMLOAD			   0x082
#define SVM_EXIT_VMSAVE			   0x083
#define SVM_EXIT_STGI			   0x084
#define SVM_EXIT_CLGI			   0x085
#define SVM_EXIT_SKINIT			   0x086
#define SVM_EXIT_RDTSCP			   0x087
#define SVM_EXIT_ICEBP			   0x088
#define SVM_EXIT_WBINVD			   0x089
#define SVM_EXIT_MONITOR		   0x08a
#define SVM_EXIT_MWAIT			   0x08b
#define SVM_EXIT_MWAIT_COND		   0x08c
#define SVM_EXIT_XSETBV			   0x08d
#define SVM_EXIT_RDPRU			   0x08e
#define SVM_EXIT_EFER_WRITE_TRAP	   0x08f
#define SVM_EXIT_CR0_WRITE_TRAP		   0x090
#define SVM_EXIT_CR1_WRITE_TRAP		   0x091
#define SVM_EXIT_CR2_WRITE_TRAP		   0x092
#define SVM_EXIT_CR3_WRITE_TRAP		   0x093
#define SVM_EXIT_CR4_WRITE_TRAP		   0x094
#define SVM_EXIT_CR5_WRITE_TRAP		   0x095
#define SVM_EXIT_CR6_WRITE_TRAP		   0x096
#define SVM_EXIT_CR7_WRITE_TRAP		   0x097
#define SVM_EXIT_CR8_WRITE_TRAP		   0x098
#define SVM_EXIT_CR9_WRITE_TRAP		   0x099
#define SVM_EXIT_CR10_WRITE_TRAP	   0x09a
#define SVM_EXIT_CR11_WRITE_TRAP	   0x09b
#define SVM_EXIT_CR12_WRITE_TRAP	   0x09c
#define SVM_EXIT_CR13_WRITE_TRAP	   0x09d
#define SVM_EXIT_CR14_WRITE_TRAP	   0x09e
#define SVM_EXIT_CR15_WRITE_TRAP	   0x09f
#define SVM_EXIT_INVPCID		   0x0a2
#define SVM_EXIT_BUS_LOCK		   0x0a5
#define SVM_EXIT_IDLE_HLT		   0x0a6
#define SVM_EXIT_NPF			   0x400
#define SVM_EXIT_AVIC_INCOMPLETE_IPI	   0x401
#define SVM_EXIT_AVIC_UNACCELERATED_ACCESS 0x402
#define SVM_EXIT_VMGEXIT		   0x403

/* SEV-ES software-defined VMGEXIT events */
#define SVM_VMGEXIT_MMIO_READ	      0x80000001
#define SVM_VMGEXIT_MMIO_WRITE	      0x80000002
#define SVM_VMGEXIT_NMI_COMPLETE      0x80000003
#define SVM_VMGEXIT_AP_HLT_LOOP	      0x80000004
#define SVM_VMGEXIT_AP_JUMP_TABLE     0x80000005
#define SVM_VMGEXIT_SET_AP_JUMP_TABLE 0
#define SVM_VMGEXIT_GET_AP_JUMP_TABLE 1
#define SVM_VMGEXIT_PSC		      0x80000010
#define SVM_VMGEXIT_GUEST_REQUEST     0x80000011
#define SVM_VMGEXIT_EXT_GUEST_REQUEST 0x80000012
#define SVM_VMGEXIT_AP_CREATION	      0x80000013
#define SVM_VMGEXIT_AP_CREATE_ON_INIT 0
#define SVM_VMGEXIT_AP_CREATE	      1
#define SVM_VMGEXIT_AP_DESTROY	      2
#define SVM_VMGEXIT_SNP_RUN_VMPL      0x80000018
#define SVM_VMGEXIT_HV_FEATURES	      0x8000fffd
#define SVM_VMGEXIT_TERM_REQUEST      0x8000fffe
#define SVM_VMGEXIT_TERM_REASON(reason_set, reason_code)        \
	/* SW_EXITINFO1[3:0] */                                 \
	(((((u64)reason_set) & 0xf)) | /* SW_EXITINFO1[11:4] */ \
	 ((((u64)reason_code) & 0xff) << 4))
#define SVM_VMGEXIT_UNSUPPORTED_EVENT 0x8000ffff

/* Exit code reserved for hypervisor/software use */
#define SVM_EXIT_SW 0xf0000000

#define SVM_EXIT_ERR -1

#define SVM_EXIT_REASONS                                                      \
	{ SVM_EXIT_READ_CR0, "read_cr0" }, { SVM_EXIT_READ_CR2, "read_cr2" }, \
		{ SVM_EXIT_READ_CR3, "read_cr3" },                            \
		{ SVM_EXIT_READ_CR4, "read_cr4" },                            \
		{ SVM_EXIT_READ_CR8, "read_cr8" },                            \
		{ SVM_EXIT_WRITE_CR0, "write_cr0" },                          \
		{ SVM_EXIT_WRITE_CR2, "write_cr2" },                          \
		{ SVM_EXIT_WRITE_CR3, "write_cr3" },                          \
		{ SVM_EXIT_WRITE_CR4, "write_cr4" },                          \
		{ SVM_EXIT_WRITE_CR8, "write_cr8" },                          \
		{ SVM_EXIT_READ_DR0, "read_dr0" },                            \
		{ SVM_EXIT_READ_DR1, "read_dr1" },                            \
		{ SVM_EXIT_READ_DR2, "read_dr2" },                            \
		{ SVM_EXIT_READ_DR3, "read_dr3" },                            \
		{ SVM_EXIT_READ_DR4, "read_dr4" },                            \
		{ SVM_EXIT_READ_DR5, "read_dr5" },                            \
		{ SVM_EXIT_READ_DR6, "read_dr6" },                            \
		{ SVM_EXIT_READ_DR7, "read_dr7" },                            \
		{ SVM_EXIT_WRITE_DR0, "write_dr0" },                          \
		{ SVM_EXIT_WRITE_DR1, "write_dr1" },                          \
		{ SVM_EXIT_WRITE_DR2, "write_dr2" },                          \
		{ SVM_EXIT_WRITE_DR3, "write_dr3" },                          \
		{ SVM_EXIT_WRITE_DR4, "write_dr4" },                          \
		{ SVM_EXIT_WRITE_DR5, "write_dr5" },                          \
		{ SVM_EXIT_WRITE_DR6, "write_dr6" },                          \
		{ SVM_EXIT_WRITE_DR7, "write_dr7" },                          \
		{ SVM_EXIT_EXCP_BASE + DE_VECTOR, "DE excp" },                \
		{ SVM_EXIT_EXCP_BASE + DB_VECTOR, "DB excp" },                \
		{ SVM_EXIT_EXCP_BASE + BP_VECTOR, "BP excp" },                \
		{ SVM_EXIT_EXCP_BASE + OF_VECTOR, "OF excp" },                \
		{ SVM_EXIT_EXCP_BASE + BR_VECTOR, "BR excp" },                \
		{ SVM_EXIT_EXCP_BASE + UD_VECTOR, "UD excp" },                \
		{ SVM_EXIT_EXCP_BASE + NM_VECTOR, "NM excp" },                \
		{ SVM_EXIT_EXCP_BASE + DF_VECTOR, "DF excp" },                \
		{ SVM_EXIT_EXCP_BASE + TS_VECTOR, "TS excp" },                \
		{ SVM_EXIT_EXCP_BASE + NP_VECTOR, "NP excp" },                \
		{ SVM_EXIT_EXCP_BASE + SS_VECTOR, "SS excp" },                \
		{ SVM_EXIT_EXCP_BASE + GP_VECTOR, "GP excp" },                \
		{ SVM_EXIT_EXCP_BASE + PF_VECTOR, "PF excp" },                \
		{ SVM_EXIT_EXCP_BASE + MF_VECTOR, "MF excp" },                \
		{ SVM_EXIT_EXCP_BASE + AC_VECTOR, "AC excp" },                \
		{ SVM_EXIT_EXCP_BASE + MC_VECTOR, "MC excp" },                \
		{ SVM_EXIT_EXCP_BASE + XM_VECTOR, "XF excp" },                \
		{ SVM_EXIT_INTR, "interrupt" }, { SVM_EXIT_NMI, "nmi" },      \
		{ SVM_EXIT_SMI, "smi" }, { SVM_EXIT_INIT, "init" },           \
		{ SVM_EXIT_VINTR, "vintr" },                                  \
		{ SVM_EXIT_CR0_SEL_WRITE, "cr0_sel_write" },                  \
		{ SVM_EXIT_IDTR_READ, "read_idtr" },                          \
		{ SVM_EXIT_GDTR_READ, "read_gdtr" },                          \
		{ SVM_EXIT_LDTR_READ, "read_ldtr" },                          \
		{ SVM_EXIT_TR_READ, "read_rt" },                              \
		{ SVM_EXIT_IDTR_WRITE, "write_idtr" },                        \
		{ SVM_EXIT_GDTR_WRITE, "write_gdtr" },                        \
		{ SVM_EXIT_LDTR_WRITE, "write_ldtr" },                        \
		{ SVM_EXIT_TR_WRITE, "write_rt" },                            \
		{ SVM_EXIT_RDTSC, "rdtsc" }, { SVM_EXIT_RDPMC, "rdpmc" },     \
		{ SVM_EXIT_PUSHF, "pushf" }, { SVM_EXIT_POPF, "popf" },       \
		{ SVM_EXIT_CPUID, "cpuid" }, { SVM_EXIT_RSM, "rsm" },         \
		{ SVM_EXIT_IRET, "iret" }, { SVM_EXIT_SWINT, "swint" },       \
		{ SVM_EXIT_INVD, "invd" }, { SVM_EXIT_PAUSE, "pause" },       \
		{ SVM_EXIT_HLT, "hlt" }, { SVM_EXIT_INVLPG, "invlpg" },       \
		{ SVM_EXIT_INVLPGA, "invlpga" }, { SVM_EXIT_IOIO, "io" },     \
		{ SVM_EXIT_MSR, "msr" },                                      \
		{ SVM_EXIT_TASK_SWITCH, "task_switch" },                      \
		{ SVM_EXIT_FERR_FREEZE, "ferr_freeze" },                      \
		{ SVM_EXIT_SHUTDOWN, "shutdown" },                            \
		{ SVM_EXIT_VMRUN, "vmrun" },                                  \
		{ SVM_EXIT_VMMCALL, "hypercall" },                            \
		{ SVM_EXIT_VMLOAD, "vmload" }, { SVM_EXIT_VMSAVE, "vmsave" }, \
		{ SVM_EXIT_STGI, "stgi" }, { SVM_EXIT_CLGI, "clgi" },         \
		{ SVM_EXIT_SKINIT, "skinit" }, { SVM_EXIT_RDTSCP, "rdtscp" }, \
		{ SVM_EXIT_ICEBP, "icebp" }, { SVM_EXIT_WBINVD, "wbinvd" },   \
		{ SVM_EXIT_MONITOR, "monitor" }, { SVM_EXIT_MWAIT, "mwait" }, \
		{ SVM_EXIT_XSETBV, "xsetbv" },                                \
		{ SVM_EXIT_EFER_WRITE_TRAP, "write_efer_trap" },              \
		{ SVM_EXIT_CR0_WRITE_TRAP, "write_cr0_trap" },                \
		{ SVM_EXIT_CR4_WRITE_TRAP, "write_cr4_trap" },                \
		{ SVM_EXIT_CR8_WRITE_TRAP, "write_cr8_trap" },                \
		{ SVM_EXIT_INVPCID, "invpcid" },                              \
		{ SVM_EXIT_BUS_LOCK, "buslock" },                             \
		{ SVM_EXIT_IDLE_HLT, "idle-halt" }, { SVM_EXIT_NPF, "npf" },  \
		{ SVM_EXIT_AVIC_INCOMPLETE_IPI, "avic_incomplete_ipi" },      \
		{ SVM_EXIT_AVIC_UNACCELERATED_ACCESS,                         \
		  "avic_unaccelerated_access" },                              \
		{ SVM_EXIT_VMGEXIT, "vmgexit" },                              \
		{ SVM_VMGEXIT_MMIO_READ, "vmgexit_mmio_read" },               \
		{ SVM_VMGEXIT_MMIO_WRITE, "vmgexit_mmio_write" },             \
		{ SVM_VMGEXIT_NMI_COMPLETE, "vmgexit_nmi_complete" },         \
		{ SVM_VMGEXIT_AP_HLT_LOOP, "vmgexit_ap_hlt_loop" },           \
		{ SVM_VMGEXIT_AP_JUMP_TABLE, "vmgexit_ap_jump_table" },       \
		{ SVM_VMGEXIT_PSC, "vmgexit_page_state_change" },             \
		{ SVM_VMGEXIT_GUEST_REQUEST, "vmgexit_guest_request" },       \
		{ SVM_VMGEXIT_EXT_GUEST_REQUEST,                              \
		  "vmgexit_ext_guest_request" },                              \
		{ SVM_VMGEXIT_AP_CREATION, "vmgexit_ap_creation" },           \
		{ SVM_VMGEXIT_HV_FEATURES, "vmgexit_hypervisor_feature" },    \
		{ SVM_EXIT_ERR, "invalid_guest_state" }

#endif /* __SVM_H */