@@ -120,6 +120,25 @@ static inline bool virtual_gif_enabled(CPUX86State *env)
120
120
return false;
121
121
}
122
122
123
+ static inline bool virtual_vm_load_save_enabled (CPUX86State * env , uint32_t exit_code , uintptr_t retaddr )
124
+ {
125
+ uint64_t lbr_ctl ;
126
+
127
+ if (likely (env -> hflags & HF_GUEST_MASK )) {
128
+ if (likely (!(env -> hflags2 & HF2_NPT_MASK )) || !(env -> efer & MSR_EFER_LMA )) {
129
+ cpu_vmexit (env , exit_code , 0 , retaddr );
130
+ }
131
+
132
+ lbr_ctl = x86_ldl_phys (env_cpu (env ), env -> vm_vmcb + offsetof(struct vmcb ,
133
+ control .lbr_ctl ));
134
+ return (env -> features [FEAT_SVM ] & CPUID_SVM_V_VMSAVE_VMLOAD )
135
+ && (lbr_ctl & V_VMLOAD_VMSAVE_ENABLED_MASK );
136
+
137
+ }
138
+
139
+ return false;
140
+ }
141
+
123
142
static inline bool virtual_gif_set (CPUX86State * env )
124
143
{
125
144
return !virtual_gif_enabled (env ) || (env -> int_ctl & V_GIF_MASK );
@@ -431,6 +450,7 @@ void helper_vmload(CPUX86State *env, int aflag)
431
450
{
432
451
CPUState * cs = env_cpu (env );
433
452
target_ulong addr ;
453
+ int prot ;
434
454
435
455
cpu_svm_check_intercept_param (env , SVM_EXIT_VMLOAD , 0 , GETPC ());
436
456
@@ -440,6 +460,10 @@ void helper_vmload(CPUX86State *env, int aflag)
440
460
addr = (uint32_t )env -> regs [R_EAX ];
441
461
}
442
462
463
+ if (virtual_vm_load_save_enabled (env , SVM_EXIT_VMLOAD , GETPC ())) {
464
+ addr = get_hphys (cs , addr , MMU_DATA_LOAD , & prot );
465
+ }
466
+
443
467
qemu_log_mask (CPU_LOG_TB_IN_ASM , "vmload! " TARGET_FMT_lx
444
468
"\nFS: %016" PRIx64 " | " TARGET_FMT_lx "\n" ,
445
469
addr , x86_ldq_phys (cs , addr + offsetof(struct vmcb ,
@@ -473,6 +497,7 @@ void helper_vmsave(CPUX86State *env, int aflag)
473
497
{
474
498
CPUState * cs = env_cpu (env );
475
499
target_ulong addr ;
500
+ int prot ;
476
501
477
502
cpu_svm_check_intercept_param (env , SVM_EXIT_VMSAVE , 0 , GETPC ());
478
503
@@ -482,6 +507,10 @@ void helper_vmsave(CPUX86State *env, int aflag)
482
507
addr = (uint32_t )env -> regs [R_EAX ];
483
508
}
484
509
510
+ if (virtual_vm_load_save_enabled (env , SVM_EXIT_VMSAVE , GETPC ())) {
511
+ addr = get_hphys (cs , addr , MMU_DATA_STORE , & prot );
512
+ }
513
+
485
514
qemu_log_mask (CPU_LOG_TB_IN_ASM , "vmsave! " TARGET_FMT_lx
486
515
"\nFS: %016" PRIx64 " | " TARGET_FMT_lx "\n" ,
487
516
addr , x86_ldq_phys (cs ,
0 commit comments