@@ -183,7 +183,16 @@ static void save_world_ctx(struct run_context *context)
183
183
context -> vmx_cr4 = exec_vmread (VMX_GUEST_CR4 );
184
184
context -> dr7 = exec_vmread (VMX_GUEST_DR7 );
185
185
context -> ia32_debugctl = exec_vmread64 (VMX_GUEST_IA32_DEBUGCTL_FULL );
186
- context -> ia32_pat = exec_vmread64 (VMX_GUEST_IA32_PAT_FULL );
186
+
187
+ /*
188
+ * Similar to CR0 and CR4, the actual value of guest's IA32_PAT MSR
189
+ * (represented by context->vmx_ia32_pat) could be different from the
190
+ * value that guest reads (represented by context->ia32_pat).
191
+ *
192
+ * the wrmsr handler keeps track of 'ia32_pat', and we only
193
+ * need to load 'vmx_ia32_pat' here.
194
+ */
195
+ context -> vmx_ia32_pat = exec_vmread (VMX_GUEST_IA32_PAT_FULL );
187
196
context -> ia32_efer = exec_vmread64 (VMX_GUEST_IA32_EFER_FULL );
188
197
context -> ia32_sysenter_cs = exec_vmread (VMX_GUEST_IA32_SYSENTER_CS );
189
198
context -> ia32_sysenter_esp = exec_vmread (VMX_GUEST_IA32_SYSENTER_ESP );
@@ -229,7 +238,7 @@ static void load_world_ctx(struct run_context *context)
229
238
exec_vmwrite (VMX_GUEST_RFLAGS , context -> rflags );
230
239
exec_vmwrite (VMX_GUEST_DR7 , context -> dr7 );
231
240
exec_vmwrite64 (VMX_GUEST_IA32_DEBUGCTL_FULL , context -> ia32_debugctl );
232
- exec_vmwrite64 (VMX_GUEST_IA32_PAT_FULL , context -> ia32_pat );
241
+ exec_vmwrite64 (VMX_GUEST_IA32_PAT_FULL , context -> vmx_ia32_pat );
233
242
exec_vmwrite64 (VMX_GUEST_IA32_EFER_FULL , context -> ia32_efer );
234
243
exec_vmwrite (VMX_GUEST_IA32_SYSENTER_CS , context -> ia32_sysenter_cs );
235
244
exec_vmwrite (VMX_GUEST_IA32_SYSENTER_ESP , context -> ia32_sysenter_esp );
@@ -362,17 +371,18 @@ static bool init_secure_world_env(struct vcpu *vcpu,
362
371
vcpu -> arch_vcpu .contexts [SECURE_WORLD ].tsc_offset = 0 ;
363
372
364
373
vcpu -> arch_vcpu .contexts [SECURE_WORLD ].cr0 =
365
- vcpu -> arch_vcpu .contexts [NORMAL_WORLD ].cr0 =
366
- exec_vmread (VMX_CR0_READ_SHADOW );
374
+ vcpu -> arch_vcpu .contexts [NORMAL_WORLD ].cr0 ;
367
375
vcpu -> arch_vcpu .contexts [SECURE_WORLD ].cr4 =
368
- vcpu -> arch_vcpu .contexts [NORMAL_WORLD ].cr4 =
369
- exec_vmread (VMX_CR4_READ_SHADOW );
376
+ vcpu -> arch_vcpu .contexts [NORMAL_WORLD ].cr4 ;
370
377
vcpu -> arch_vcpu .contexts [SECURE_WORLD ].vmx_cr0 =
371
- vcpu -> arch_vcpu .contexts [NORMAL_WORLD ].vmx_cr0 =
372
- exec_vmread (VMX_GUEST_CR0 );
378
+ vcpu -> arch_vcpu .contexts [NORMAL_WORLD ].vmx_cr0 ;
373
379
vcpu -> arch_vcpu .contexts [SECURE_WORLD ].vmx_cr4 =
374
- vcpu -> arch_vcpu .contexts [NORMAL_WORLD ].vmx_cr4 =
375
- exec_vmread (VMX_GUEST_CR4 );
380
+ vcpu -> arch_vcpu .contexts [NORMAL_WORLD ].vmx_cr4 ;
381
+
382
+ vcpu -> arch_vcpu .contexts [SECURE_WORLD ].ia32_pat =
383
+ vcpu -> arch_vcpu .contexts [NORMAL_WORLD ].ia32_pat ;
384
+ vcpu -> arch_vcpu .contexts [SECURE_WORLD ].vmx_ia32_pat =
385
+ vcpu -> arch_vcpu .contexts [NORMAL_WORLD ].vmx_ia32_pat ;
376
386
377
387
exec_vmwrite (VMX_GUEST_RSP ,
378
388
TRUSTY_EPT_REBASE_GPA + size );
0 commit comments