nVMX: Keep arch.pat in sync on L1-L2 switches
PATCH 1/1 nVMX: Keep arch.pat in sync on L1-L2 switches
From: Jan Kiszka <[email protected]>
When asking vmx to load the PAT MSR for us while switching from L1 to L2 or vice versa, we have to update arch.pat as well as it may later be used again to load or read out the MSR content.
---
Arthur, please add your tested-by also officially.
arch/x86/kvm/vmx.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-)
arch/x86/kvm/vmx.c +6 -3
@@ -7535,9 +7535,10 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)vmcs_write32 (VM_ENTRY_CONTROLS , vmcs12->vm_entry_controls | (vmcs_config.vmentry_ctrl & ~VM_ENTRY_IA32E_MODE )); -if (vmcs12->vm_entry_controls &VM_ENTRY_LOAD_IA32_PAT ) +if (vmcs12->vm_entry_controls &VM_ENTRY_LOAD_IA32_PAT ) {vmcs_write64 (GUEST_IA32_PAT , vmcs12->guest_ia32_pat); -else if (vmcs_config.vmentry_ctrl &VM_ENTRY_LOAD_IA32_PAT ) + vcpu->arch.pat = vmcs12->guest_ia32_pat; + }else if (vmcs_config.vmentry_ctrl &VM_ENTRY_LOAD_IA32_PAT )vmcs_write64 (GUEST_IA32_PAT , vmx->vcpu.arch.pat);
@@ -8025,8 +8026,10 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu,vmcs_writel (GUEST_IDTR_BASE , vmcs12->host_idtr_base);vmcs_writel (GUEST_GDTR_BASE , vmcs12->host_gdtr_base); -if (vmcs12->vm_exit_controls &VM_EXIT_LOAD_IA32_PAT ) +if (vmcs12->vm_exit_controls &VM_EXIT_LOAD_IA32_PAT ) {vmcs_write64 (GUEST_IA32_PAT , vmcs12->host_ia32_pat); + vcpu->arch.pat = vmcs12->host_ia32_pat; + }if (vmcs12->vm_exit_controls &VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL )vmcs_write64 (GUEST_IA32_PERF_GLOBAL_CTRL , vmcs12->host_ia32_perf_global_ctrl);
Signature · 1 line
1.7.3.4
Quoted 10 lines · Jan Kiszka
From: Jan Kiszka <[email protected]>
When asking vmx to load the PAT MSR for us while switching from L1 to L2 or vice versa, we have to update arch.pat as well as it may later be used again to load or read out the MSR content.
Signed-off-by Jan Kiszka <[email protected]>---
Arthur, please add your tested-by also officially.
This patch is generally good expect that we need to add VM_EXIT_LOAD_IA32_PAT/VM_EXIT_SAVE_IA32_PAT to nested_vmx_exit_ctls_high in function nested_vmx_setup_ctls_msrs() to enable these two features. Currently only VM_ENTRY_LOAD_IA32_PAT is enabled while all three are implemented.
Arthur
Quoted 35 lines
arch/x86/kvm/vmx.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-)arch/x86/kvm/vmx.c +6
-4@@ -7535,9 +7535,10 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)vmcs_write32 (VM_ENTRY_CONTROLS , vmcs12->vm_entry_controls | (vmcs_config.vmentry_ctrl & ~VM_ENTRY_IA32E_MODE )); -if (vmcs12->vm_entry_controls &VM_ENTRY_LOAD_IA32_PAT ) +if (vmcs12->vm_entry_controls &VM_ENTRY_LOAD_IA32_PAT ) {vmcs_write64 (GUEST_IA32_PAT , vmcs12->guest_ia32_pat); -else if (vmcs_config.vmentry_ctrl &VM_ENTRY_LOAD_IA32_PAT ) + vcpu->arch.pat = vmcs12->guest_ia32_pat; + }else if (vmcs_config.vmentry_ctrl &VM_ENTRY_LOAD_IA32_PAT )vmcs_write64 (GUEST_IA32_PAT , vmx->vcpu.arch.pat);@@ -8025,8 +8026,10 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu,vmcs_writel (GUEST_IDTR_BASE , vmcs12->host_idtr_base);vmcs_writel (GUEST_GDTR_BASE , vmcs12->host_gdtr_base); -if (vmcs12->vm_exit_controls &VM_EXIT_LOAD_IA32_PAT ) +if (vmcs12->vm_exit_controls &VM_EXIT_LOAD_IA32_PAT ) {vmcs_write64 (GUEST_IA32_PAT , vmcs12->host_ia32_pat); + vcpu->arch.pat = vmcs12->host_ia32_pat; + }if (vmcs12->vm_exit_controls &VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL )vmcs_write64 (GUEST_IA32_PERF_GLOBAL_CTRL , vmcs12->host_ia32_perf_global_ctrl); --1.7.3.4
Quoted 10 lines · Arthur Chunqi Li
Quoted 9 lines · Jan Kiszka
From: Jan Kiszka <[email protected]>
When asking vmx to load the PAT MSR for us while switching from L1 to L2 or vice versa, we have to update arch.pat as well as it may later be used again to load or read out the MSR content.
Signed-off-by Jan Kiszka <[email protected]>---
Quoted 6 lines
Quoted 1 line
Arthur, please add your tested-by also officially.
This patch is generally good expect that we need to add VM_EXIT_LOAD_IA32_PAT/VM_EXIT_SAVE_IA32_PAT to
nested_vmx_exit_ctls_highin functionnested_vmx_setup_ctls_msrs()to enable these two features. Currently onlyVM_ENTRY_LOAD_IA32_PATis enabled while all three are implemented.
Yes, feel free to follow up with a corresponding patch.
Jan
Quoted 7 lines · Jan Kiszka
From: Jan Kiszka <[email protected]>
When asking vmx to load the PAT MSR for us while switching from L1 to L2 or vice versa, we have to update arch.pat as well as it may later be used again to load or read out the MSR content.
Signed-off-by Jan Kiszka <[email protected]>
Quoted 38 lines
---
Arthur, please add your tested-by also officially.
arch/x86/kvm/vmx.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-)arch/x86/kvm/vmx.c +6
-3@@ -7535,9 +7535,10 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)vmcs_write32 (VM_ENTRY_CONTROLS , vmcs12->vm_entry_controls | (vmcs_config.vmentry_ctrl & ~VM_ENTRY_IA32E_MODE )); -if (vmcs12->vm_entry_controls &VM_ENTRY_LOAD_IA32_PAT ) +if (vmcs12->vm_entry_controls &VM_ENTRY_LOAD_IA32_PAT ) {vmcs_write64 (GUEST_IA32_PAT , vmcs12->guest_ia32_pat); -else if (vmcs_config.vmentry_ctrl &VM_ENTRY_LOAD_IA32_PAT ) + vcpu->arch.pat = vmcs12->guest_ia32_pat; + }else if (vmcs_config.vmentry_ctrl &VM_ENTRY_LOAD_IA32_PAT )vmcs_write64 (GUEST_IA32_PAT , vmx->vcpu.arch.pat);@@ -8025,8 +8026,10 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu,vmcs_writel (GUEST_IDTR_BASE , vmcs12->host_idtr_base);vmcs_writel (GUEST_GDTR_BASE , vmcs12->host_gdtr_base); -if (vmcs12->vm_exit_controls &VM_EXIT_LOAD_IA32_PAT ) +if (vmcs12->vm_exit_controls &VM_EXIT_LOAD_IA32_PAT ) {vmcs_write64 (GUEST_IA32_PAT , vmcs12->host_ia32_pat); + vcpu->arch.pat = vmcs12->host_ia32_pat; + }if (vmcs12->vm_exit_controls &VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL )vmcs_write64 (GUEST_IA32_PERF_GLOBAL_CTRL , vmcs12->host_ia32_perf_global_ctrl);Signature · 1 line
1.7.3.4
--
Gleb.
Quoted 7 lines · Jan Kiszka
From: Jan Kiszka <[email protected]>
When asking vmx to load the PAT MSR for us while switching from L1 to L2 or vice versa, we have to update arch.pat as well as it may later be used again to load or read out the MSR content.
Signed-off-by Jan Kiszka <[email protected]>
Should cooperate with patch
http://www.mail-archive.com/[email protected]/msg94349.html,VM_EXIT_SAVE_IA32_PAT and VM_EXIT_LOAD_IA32_PAT should be advertised.
Quoted 38 lines
---
Arthur, please add your tested-by also officially.
arch/x86/kvm/vmx.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-)arch/x86/kvm/vmx.c +6
-4@@ -7535,9 +7535,10 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)vmcs_write32 (VM_ENTRY_CONTROLS , vmcs12->vm_entry_controls | (vmcs_config.vmentry_ctrl & ~VM_ENTRY_IA32E_MODE )); -if (vmcs12->vm_entry_controls &VM_ENTRY_LOAD_IA32_PAT ) +if (vmcs12->vm_entry_controls &VM_ENTRY_LOAD_IA32_PAT ) {vmcs_write64 (GUEST_IA32_PAT , vmcs12->guest_ia32_pat); -else if (vmcs_config.vmentry_ctrl &VM_ENTRY_LOAD_IA32_PAT ) + vcpu->arch.pat = vmcs12->guest_ia32_pat; + }else if (vmcs_config.vmentry_ctrl &VM_ENTRY_LOAD_IA32_PAT )vmcs_write64 (GUEST_IA32_PAT , vmx->vcpu.arch.pat);@@ -8025,8 +8026,10 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu,vmcs_writel (GUEST_IDTR_BASE , vmcs12->host_idtr_base);vmcs_writel (GUEST_GDTR_BASE , vmcs12->host_gdtr_base); -if (vmcs12->vm_exit_controls &VM_EXIT_LOAD_IA32_PAT ) +if (vmcs12->vm_exit_controls &VM_EXIT_LOAD_IA32_PAT ) {vmcs_write64 (GUEST_IA32_PAT , vmcs12->host_ia32_pat); + vcpu->arch.pat = vmcs12->host_ia32_pat; + }if (vmcs12->vm_exit_controls &VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL )vmcs_write64 (GUEST_IA32_PERF_GLOBAL_CTRL , vmcs12->host_ia32_perf_global_ctrl); --1.7.3.4