Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


*** empty log message ***
[palacios.git] / palacios / include / geekos / svm.h
1 #ifndef __SVM_H
2 #define __SVM_H
3
4 #include <geekos/vmm_util.h>
5 #include <geekos/vmm.h>
6 #include <geekos/vmcb.h>
7
8 #define CPUID_FEATURE_IDS 0x80000001
9 #define CPUID_FEATURE_IDS_ecx_svm_avail 0x00000004
10
11 #define CPUID_SVM_REV_AND_FEATURE_IDS 0x8000000a
12 #define CPUID_SVM_REV_AND_FEATURE_IDS_edx_svml 0x00000004
13 #define CPUID_SVM_REV_AND_FEATURE_IDS_edx_np  0x00000001
14
15
16 #define EFER_MSR                 0xc0000080
17 #define EFER_MSR_svm_enable      0x00001000
18
19 /************/
20 /* SVM MSRs */
21 /************/
22 /* AMD Arch Vol 3, sec. 15.28, pg 420 */
23 /************/
24
25 // SVM VM_CR MSR 
26 #define SVM_VM_CR_MSR             0xc0010114
27 #define SVM_VM_CR_MSR_dpd         0x00000001
28 #define SVM_VM_CR_MSR_r_init      0x00000002
29 #define SVM_VM_CR_MSR_dis_a20m    0x00000004
30 #define SVM_VM_CR_MSR_lock        0x00000008
31 #define SVM_VM_CR_MSR_svmdis      0x00000010
32
33 #define SVM_IGNNE_MSR             0xc0010115
34
35 // SMM Signal Control Register 
36 #define SVM_SMM_CTL_MSR           0xc0010116
37 #define SVM_SMM_CTL_MSR_dismiss   0x00000001
38 #define SVM_SMM_CTL_MSR_enter     0x00000002
39 #define SVM_SMM_CTL_MSR_smi_cycle 0x00000004
40 #define SVM_SMM_CTL_MSR_exit      0x00000008
41 #define SVM_SMM_CTL_MSR_rsm_cycle 0x00000010
42
43 #define SVM_VM_HSAVE_PA_MSR      0xc0010117
44
45 #define SVM_KEY_MSR              0xc0010118
46
47 /******/
48
49
50
51 /******************************************/
52 /* SVM Intercept Exit Codes               */
53 /* AMD Arch Vol 3, Appendix C, pg 477-478 */
54 /******************************************/
55 #define VMEXIT_CR_READ_MASK 0xfffffff0
56 #define VMEXIT_CR0_READ   0x00000000
57 #define VMEXIT_CR1_READ   0x00000001
58 #define VMEXIT_CR2_READ   0x00000002
59 #define VMEXIT_CR3_READ   0x00000003
60 #define VMEXIT_CR4_READ   0x00000004
61 #define VMEXIT_CR5_READ   0x00000005
62 #define VMEXIT_CR6_READ   0x00000006
63 #define VMEXIT_CR7_READ   0x00000007
64 #define VMEXIT_CR8_READ   0x00000008
65 #define VMEXIT_CR9_READ   0x00000009
66 #define VMEXIT_CR10_READ  0x0000000a
67 #define VMEXIT_CR11_READ  0x0000000b
68 #define VMEXIT_CR12_READ  0x0000000c
69 #define VMEXIT_CR13_READ  0x0000000d
70 #define VMEXIT_CR14_READ  0x0000000e
71 #define VMEXIT_CR15_READ  0x0000000f
72
73 #define VMEXIT_CR_WRITE_MASK 0xffffffe0
74 #define VMEXIT_CR0_WRITE   0x00000010
75 #define VMEXIT_CR1_WRITE   0x00000011
76 #define VMEXIT_CR2_WRITE   0x00000012
77 #define VMEXIT_CR3_WRITE   0x00000013
78 #define VMEXIT_CR4_WRITE   0x00000014
79 #define VMEXIT_CR5_WRITE   0x00000015
80 #define VMEXIT_CR6_WRITE   0x00000016
81 #define VMEXIT_CR7_WRITE   0x00000017
82 #define VMEXIT_CR8_WRITE   0x00000018
83 #define VMEXIT_CR9_WRITE   0x00000019
84 #define VMEXIT_CR10_WRITE  0x0000001a
85 #define VMEXIT_CR11_WRITE  0x0000001b
86 #define VMEXIT_CR12_WRITE  0x0000001c
87 #define VMEXIT_CR13_WRITE  0x0000001d
88 #define VMEXIT_CR14_WRITE  0x0000001e
89 #define VMEXIT_CR15_WRITE  0x0000001f
90
91 #define VMEXIT_DR_READ_MASK 0xffffffd0
92 #define VMEXIT_DR0_READ   0x00000020
93 #define VMEXIT_DR1_READ   0x00000021
94 #define VMEXIT_DR2_READ   0x00000022
95 #define VMEXIT_DR3_READ   0x00000023
96 #define VMEXIT_DR4_READ   0x00000024
97 #define VMEXIT_DR5_READ   0x00000025
98 #define VMEXIT_DR6_READ   0x00000026
99 #define VMEXIT_DR7_READ   0x00000027
100 #define VMEXIT_DR8_READ   0x00000028
101 #define VMEXIT_DR9_READ   0x00000029
102 #define VMEXIT_DR10_READ  0x0000002a
103 #define VMEXIT_DR11_READ  0x0000002b
104 #define VMEXIT_DR12_READ  0x0000002c
105 #define VMEXIT_DR13_READ  0x0000002d
106 #define VMEXIT_DR14_READ  0x0000002e
107 #define VMEXIT_DR15_READ  0x0000002f
108
109 #define VMEXIT_DR_WRITE_MASK     0xffffffc0
110 #define VMEXIT_DR0_WRITE   0x0000003f
111 #define VMEXIT_DR1_WRITE   0x00000031
112 #define VMEXIT_DR2_WRITE   0x00000032
113 #define VMEXIT_DR3_WRITE   0x00000033
114 #define VMEXIT_DR4_WRITE   0x00000034
115 #define VMEXIT_DR5_WRITE   0x00000035
116 #define VMEXIT_DR6_WRITE   0x00000036
117 #define VMEXIT_DR7_WRITE   0x00000037
118 #define VMEXIT_DR8_WRITE   0x00000038
119 #define VMEXIT_DR9_WRITE   0x00000039
120 #define VMEXIT_DR10_WRITE  0x0000003a
121 #define VMEXIT_DR11_WRITE  0x0000003b
122 #define VMEXIT_DR12_WRITE  0x0000003c
123 #define VMEXIT_DR13_WRITE  0x0000003d
124 #define VMEXIT_DR14_WRITE  0x0000003e
125 #define VMEXIT_DR15_WRITE  0x0000003f
126
127 #define VMEXIT_EXCP_MASK   0xffffffa0
128 #define VMEXIT_EXCP0       0x00000040
129 #define VMEXIT_EXCP1       0x00000041
130 #define VMEXIT_EXCP2       0x00000042
131 #define VMEXIT_EXCP3       0x00000043
132 #define VMEXIT_EXCP4       0x00000044
133 #define VMEXIT_EXCP5       0x00000045
134 #define VMEXIT_EXCP6       0x00000046
135 #define VMEXIT_EXCP7       0x00000047
136 #define VMEXIT_EXCP8       0x00000048
137 #define VMEXIT_EXCP9       0x00000049
138 #define VMEXIT_EXCP10      0x0000004a
139 #define VMEXIT_EXCP11      0x0000004b
140 #define VMEXIT_EXCP12      0x0000004c
141 #define VMEXIT_EXCP13      0x0000004d
142 #define VMEXIT_EXCP14      0x0000004e
143 #define VMEXIT_EXCP15      0x0000004f
144 #define VMEXIT_EXCP16      0x00000050
145 #define VMEXIT_EXCP17      0x00000051
146 #define VMEXIT_EXCP18      0x00000052
147 #define VMEXIT_EXCP19      0x00000053
148 #define VMEXIT_EXCP20      0x00000054
149 #define VMEXIT_EXCP21      0x00000055
150 #define VMEXIT_EXCP22      0x00000056
151 #define VMEXIT_EXCP23      0x00000057
152 #define VMEXIT_EXCP24      0x00000058
153 #define VMEXIT_EXCP25      0x00000059
154 #define VMEXIT_EXCP26      0x0000005a
155 #define VMEXIT_EXCP27      0x0000005b
156 #define VMEXIT_EXCP28      0x0000005c
157 #define VMEXIT_EXCP29      0x0000005d
158 #define VMEXIT_EXCP30      0x0000005e
159 #define VMEXIT_EXCP31      0x0000005f
160
161
162 #define VMEXIT_INTR                 0x00000060
163 #define VMEXIT_NMI                  0x00000061
164 #define VMEXIT_SMI                  0x00000062
165 #define VMEXIT_INIT                 0x00000063
166 #define VMEXIT_VINITR               0x00000064
167 #define VMEXIT_CR0_SEL_WRITE        0x00000065
168 #define VMEXIT_IDTR_READ            0x00000066
169 #define VMEXIT_GDTR_READ            0x00000067
170 #define VMEXIT_LDTR_READ            0x00000068
171 #define VMEXIT_TR_READ              0x00000069
172 #define VMEXIT_IDTR_WRITE           0x0000006a
173 #define VMEXIT_GDTR_WRITE           0x0000006b
174 #define VMEXIT_LDTR_WRITE           0x0000006c
175 #define VMEXIT_TR_WRITE             0x0000006d
176 #define VMEXIT_RDTSC                0x0000006e
177 #define VMEXIT_RDPMC                0x0000006f
178 #define VMEXIT_PUSHF                0x00000070
179 #define VMEXIT_POPF                 0x00000071
180 #define VMEXIT_CPUID                0x00000072
181 #define VMEXIT_RSM                  0x00000073
182 #define VMEXIT_IRET                 0x00000074
183 #define VMEXIT_SWINT                0x00000075
184 #define VMEXIT_INVD                 0x00000076
185 #define VMEXIT_PAUSE                0x00000077
186 #define VMEXIT_HLT                  0x00000078
187 #define VMEXIT_INVLPG               0x00000079
188 #define VMEXIT_INVLPGA              0x0000007a
189 #define VMEXIT_IOIO                 0x0000007b
190 #define VMEXIT_MSR                  0x0000007c
191 #define VMEXIT_TASK_SWITCH          0x0000007d
192 #define VMEXIT_FERR_FREEZE          0x0000007e
193 #define VMEXIT_SHUTDOWN             0x0000007f
194 #define VMEXIT_VMRUN                0x00000080
195 #define VMEXIT_VMMCALL              0x00000081
196 #define VMEXIT_VMLOAD               0x00000082
197 #define VMEXIT_VMSAVE               0x00000083
198 #define VMEXIT_STGI                 0x00000084
199 #define VMEXIT_CLGI                 0x00000085
200 #define VMEXIT_SKINIT               0x00000086
201 #define VMEXIT_RDTSCP               0x00000087
202 #define VMEXIT_ICEBP                0x00000088
203 #define VMEXIT_WBINVD               0x00000089
204 #define VMEXIT_MONITOR              0x0000008a
205 #define VMEXIT_MWAIT                0x0000008b
206 #define VMEXIT_MWAIT_CONDITIONAL    0x0000008c
207
208 #define VMEXIT_INVALID_VMCB         -1
209
210 /******************************************/
211
212
213
214
215 void Init_SVM(struct vmm_ctrl_ops * vmm_ops);
216 int is_svm_capable();
217
218
219 vmcb_t * Allocate_VMCB();
220 void Init_VMCB(vmcb_t * vmcb, guest_info_t vm_info);
221
222 int init_svm_guest(struct guest_info *info);
223 int start_svm_guest(struct guest_info * info);
224
225 int handle_svm_exit(struct VMM_GPRs gprs);
226
227
228 #endif