Skip to content

Commit cc3ed80

Browse files
Maxim Levitskybonzini
authored andcommitted
KVM: nSVM: always use vmcb01 to for vmsave/vmload of guest state
This allows to avoid copying of these fields between vmcb01 and vmcb02 on nested guest entry/exit. Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1 parent fb0c4a4 commit cc3ed80

File tree

2 files changed

+36
-37
lines changed

2 files changed

+36
-37
lines changed

arch/x86/kvm/svm/nested.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,6 @@ int enter_svm_guest_mode(struct kvm_vcpu *vcpu, u64 vmcb12_gpa,
536536

537537
WARN_ON(svm->vmcb == svm->nested.vmcb02.ptr);
538538

539-
nested_svm_vmloadsave(svm->vmcb01.ptr, svm->nested.vmcb02.ptr);
540539
nested_load_control_from_vmcb12(svm, &vmcb12->control);
541540

542541
svm_switch_vmcb(svm, &svm->nested.vmcb02);
@@ -726,8 +725,6 @@ int nested_svm_vmexit(struct vcpu_svm *svm)
726725
vmcb12->control.pause_filter_thresh =
727726
svm->vmcb->control.pause_filter_thresh;
728727

729-
nested_svm_vmloadsave(svm->nested.vmcb02.ptr, svm->vmcb01.ptr);
730-
731728
svm_switch_vmcb(svm, &svm->vmcb01);
732729

733730
/*

arch/x86/kvm/svm/svm.c

Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1589,16 +1589,17 @@ static void svm_clear_vintr(struct vcpu_svm *svm)
15891589
static struct vmcb_seg *svm_seg(struct kvm_vcpu *vcpu, int seg)
15901590
{
15911591
struct vmcb_save_area *save = &to_svm(vcpu)->vmcb->save;
1592+
struct vmcb_save_area *save01 = &to_svm(vcpu)->vmcb01.ptr->save;
15921593

15931594
switch (seg) {
15941595
case VCPU_SREG_CS: return &save->cs;
15951596
case VCPU_SREG_DS: return &save->ds;
15961597
case VCPU_SREG_ES: return &save->es;
1597-
case VCPU_SREG_FS: return &save->fs;
1598-
case VCPU_SREG_GS: return &save->gs;
1598+
case VCPU_SREG_FS: return &save01->fs;
1599+
case VCPU_SREG_GS: return &save01->gs;
15991600
case VCPU_SREG_SS: return &save->ss;
1600-
case VCPU_SREG_TR: return &save->tr;
1601-
case VCPU_SREG_LDTR: return &save->ldtr;
1601+
case VCPU_SREG_TR: return &save01->tr;
1602+
case VCPU_SREG_LDTR: return &save01->ldtr;
16021603
}
16031604
BUG();
16041605
return NULL;
@@ -2648,24 +2649,24 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
26482649

26492650
switch (msr_info->index) {
26502651
case MSR_STAR:
2651-
msr_info->data = svm->vmcb->save.star;
2652+
msr_info->data = svm->vmcb01.ptr->save.star;
26522653
break;
26532654
#ifdef CONFIG_X86_64
26542655
case MSR_LSTAR:
2655-
msr_info->data = svm->vmcb->save.lstar;
2656+
msr_info->data = svm->vmcb01.ptr->save.lstar;
26562657
break;
26572658
case MSR_CSTAR:
2658-
msr_info->data = svm->vmcb->save.cstar;
2659+
msr_info->data = svm->vmcb01.ptr->save.cstar;
26592660
break;
26602661
case MSR_KERNEL_GS_BASE:
2661-
msr_info->data = svm->vmcb->save.kernel_gs_base;
2662+
msr_info->data = svm->vmcb01.ptr->save.kernel_gs_base;
26622663
break;
26632664
case MSR_SYSCALL_MASK:
2664-
msr_info->data = svm->vmcb->save.sfmask;
2665+
msr_info->data = svm->vmcb01.ptr->save.sfmask;
26652666
break;
26662667
#endif
26672668
case MSR_IA32_SYSENTER_CS:
2668-
msr_info->data = svm->vmcb->save.sysenter_cs;
2669+
msr_info->data = svm->vmcb01.ptr->save.sysenter_cs;
26692670
break;
26702671
case MSR_IA32_SYSENTER_EIP:
26712672
msr_info->data = svm->sysenter_eip;
@@ -2850,32 +2851,32 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
28502851
svm->virt_spec_ctrl = data;
28512852
break;
28522853
case MSR_STAR:
2853-
svm->vmcb->save.star = data;
2854+
svm->vmcb01.ptr->save.star = data;
28542855
break;
28552856
#ifdef CONFIG_X86_64
28562857
case MSR_LSTAR:
2857-
svm->vmcb->save.lstar = data;
2858+
svm->vmcb01.ptr->save.lstar = data;
28582859
break;
28592860
case MSR_CSTAR:
2860-
svm->vmcb->save.cstar = data;
2861+
svm->vmcb01.ptr->save.cstar = data;
28612862
break;
28622863
case MSR_KERNEL_GS_BASE:
2863-
svm->vmcb->save.kernel_gs_base = data;
2864+
svm->vmcb01.ptr->save.kernel_gs_base = data;
28642865
break;
28652866
case MSR_SYSCALL_MASK:
2866-
svm->vmcb->save.sfmask = data;
2867+
svm->vmcb01.ptr->save.sfmask = data;
28672868
break;
28682869
#endif
28692870
case MSR_IA32_SYSENTER_CS:
2870-
svm->vmcb->save.sysenter_cs = data;
2871+
svm->vmcb01.ptr->save.sysenter_cs = data;
28712872
break;
28722873
case MSR_IA32_SYSENTER_EIP:
28732874
svm->sysenter_eip = data;
2874-
svm->vmcb->save.sysenter_eip = data;
2875+
svm->vmcb01.ptr->save.sysenter_eip = data;
28752876
break;
28762877
case MSR_IA32_SYSENTER_ESP:
28772878
svm->sysenter_esp = data;
2878-
svm->vmcb->save.sysenter_esp = data;
2879+
svm->vmcb01.ptr->save.sysenter_esp = data;
28792880
break;
28802881
case MSR_TSC_AUX:
28812882
if (!boot_cpu_has(X86_FEATURE_RDTSCP))
@@ -3089,6 +3090,7 @@ static void dump_vmcb(struct kvm_vcpu *vcpu)
30893090
struct vcpu_svm *svm = to_svm(vcpu);
30903091
struct vmcb_control_area *control = &svm->vmcb->control;
30913092
struct vmcb_save_area *save = &svm->vmcb->save;
3093+
struct vmcb_save_area *save01 = &svm->vmcb01.ptr->save;
30923094

30933095
if (!dump_invalid_vmcb) {
30943096
pr_warn_ratelimited("set kvm_amd.dump_invalid_vmcb=1 to dump internal KVM state.\n");
@@ -3151,28 +3153,28 @@ static void dump_vmcb(struct kvm_vcpu *vcpu)
31513153
save->ds.limit, save->ds.base);
31523154
pr_err("%-5s s: %04x a: %04x l: %08x b: %016llx\n",
31533155
"fs:",
3154-
save->fs.selector, save->fs.attrib,
3155-
save->fs.limit, save->fs.base);
3156+
save01->fs.selector, save01->fs.attrib,
3157+
save01->fs.limit, save01->fs.base);
31563158
pr_err("%-5s s: %04x a: %04x l: %08x b: %016llx\n",
31573159
"gs:",
3158-
save->gs.selector, save->gs.attrib,
3159-
save->gs.limit, save->gs.base);
3160+
save01->gs.selector, save01->gs.attrib,
3161+
save01->gs.limit, save01->gs.base);
31603162
pr_err("%-5s s: %04x a: %04x l: %08x b: %016llx\n",
31613163
"gdtr:",
31623164
save->gdtr.selector, save->gdtr.attrib,
31633165
save->gdtr.limit, save->gdtr.base);
31643166
pr_err("%-5s s: %04x a: %04x l: %08x b: %016llx\n",
31653167
"ldtr:",
3166-
save->ldtr.selector, save->ldtr.attrib,
3167-
save->ldtr.limit, save->ldtr.base);
3168+
save01->ldtr.selector, save01->ldtr.attrib,
3169+
save01->ldtr.limit, save01->ldtr.base);
31683170
pr_err("%-5s s: %04x a: %04x l: %08x b: %016llx\n",
31693171
"idtr:",
31703172
save->idtr.selector, save->idtr.attrib,
31713173
save->idtr.limit, save->idtr.base);
31723174
pr_err("%-5s s: %04x a: %04x l: %08x b: %016llx\n",
31733175
"tr:",
3174-
save->tr.selector, save->tr.attrib,
3175-
save->tr.limit, save->tr.base);
3176+
save01->tr.selector, save01->tr.attrib,
3177+
save01->tr.limit, save01->tr.base);
31763178
pr_err("cpl: %d efer: %016llx\n",
31773179
save->cpl, save->efer);
31783180
pr_err("%-15s %016llx %-13s %016llx\n",
@@ -3186,15 +3188,15 @@ static void dump_vmcb(struct kvm_vcpu *vcpu)
31863188
pr_err("%-15s %016llx %-13s %016llx\n",
31873189
"rsp:", save->rsp, "rax:", save->rax);
31883190
pr_err("%-15s %016llx %-13s %016llx\n",
3189-
"star:", save->star, "lstar:", save->lstar);
3191+
"star:", save01->star, "lstar:", save01->lstar);
31903192
pr_err("%-15s %016llx %-13s %016llx\n",
3191-
"cstar:", save->cstar, "sfmask:", save->sfmask);
3193+
"cstar:", save01->cstar, "sfmask:", save01->sfmask);
31923194
pr_err("%-15s %016llx %-13s %016llx\n",
3193-
"kernel_gs_base:", save->kernel_gs_base,
3194-
"sysenter_cs:", save->sysenter_cs);
3195+
"kernel_gs_base:", save01->kernel_gs_base,
3196+
"sysenter_cs:", save01->sysenter_cs);
31953197
pr_err("%-15s %016llx %-13s %016llx\n",
3196-
"sysenter_esp:", save->sysenter_esp,
3197-
"sysenter_eip:", save->sysenter_eip);
3198+
"sysenter_esp:", save01->sysenter_esp,
3199+
"sysenter_eip:", save01->sysenter_eip);
31983200
pr_err("%-15s %016llx %-13s %016llx\n",
31993201
"gpat:", save->g_pat, "dbgctl:", save->dbgctl);
32003202
pr_err("%-15s %016llx %-13s %016llx\n",
@@ -3717,9 +3719,9 @@ static noinstr void svm_vcpu_enter_exit(struct kvm_vcpu *vcpu)
37173719
} else {
37183720
struct svm_cpu_data *sd = per_cpu(svm_data, vcpu->cpu);
37193721

3720-
vmload(svm->vmcb_pa);
3722+
vmload(svm->vmcb01.pa);
37213723
__svm_vcpu_run(svm->vmcb_pa, (unsigned long *)&vcpu->arch.regs);
3722-
vmsave(svm->vmcb_pa);
3724+
vmsave(svm->vmcb01.pa);
37233725

37243726
vmload(__sme_page_pa(sd->save_area));
37253727
}

0 commit comments

Comments
 (0)