aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2010-10-24KVM: x86: Rename timer functionZachary Amsden2-7/+7
This just changes some names to better reflect the usage they will be given. Separated out to keep confusion to a minimum. Signed-off-by: Zachary Amsden <[email protected]> Signed-off-by: Marcelo Tosatti <[email protected]>
2010-10-24KVM: x86: Make math work for other scalesZachary Amsden1-12/+18
The math in kvm_get_time_scale relies on the fact that NSEC_PER_SEC < 2^32. To use the same function to compute arbitrary time scales, we must extend the first reduction step to shrink the base rate to a 32-bit value, and possibly reduce the scaled rate into a 32-bit as well. Note we must take care to avoid an arithmetic overflow when scaling up the tps32 value (this could not happen with the fixed scaled value of NSEC_PER_SEC, but can happen with scaled rates above 2^31. Signed-off-by: Zachary Amsden <[email protected]> Signed-off-by: Marcelo Tosatti <[email protected]>
2010-10-24KVM: cpu_relax() during spin waiting for rebootAvi Kivity1-1/+1
It doesn't really matter, but if we spin, we should spin in a more relaxed manner. This way, if something goes wrong at least it won't contribute to global warming. Signed-off-by: Avi Kivity <[email protected]> Signed-off-by: Marcelo Tosatti <[email protected]>
2010-10-24KVM: VMX: Respect interrupt window in big real modeAvi Kivity1-0/+9
If an interrupt is pending, we need to stop emulation so we can inject it. Signed-off-by: Avi Kivity <[email protected]> Signed-off-by: Marcelo Tosatti <[email protected]>
2010-10-24KVM: VMX: Emulated real mode interrupt injectionMohammed Gamal1-59/+6
Replace the inject-as-software-interrupt hack we currently have with emulated injection. Signed-off-by: Mohammed Gamal <[email protected]> Signed-off-by: Avi Kivity <[email protected]> Signed-off-by: Marcelo Tosatti <[email protected]>
2010-10-24KVM: Add kvm_inject_realmode_interrupt() wrapperMohammed Gamal2-0/+30
This adds a wrapper function kvm_inject_realmode_interrupt() around the emulator function emulate_int_real() to allow real mode interrupt injection. [avi: initialize operand and address sizes before emulating interrupts] [avi: initialize rip for real mode interrupt injection] [avi: clear interrupt pending flag after emulating interrupt injection] Signed-off-by: Mohammed Gamal <[email protected]> Signed-off-by: Avi Kivity <[email protected]> Signed-off-by: Marcelo Tosatti <[email protected]>
2010-10-24KVM: x86 emulator: Expose emulate_int_real()Mohammed Gamal1-1/+2
Signed-off-by: Mohammed Gamal <[email protected]> Signed-off-by: Avi Kivity <[email protected]> Signed-off-by: Marcelo Tosatti <[email protected]>
2010-10-24KVM: MMU: fix counting of rmap entries in rmap_add()Hillf Danton1-1/+2
It seems that rmap entries are under counted. Signed-off-by: Hillf Danton <[email protected]> Signed-off-by: Marcelo Tosatti <[email protected]>
2010-10-24KVM: document 'kvm.mmu_audit' parameterXiao Guangrong1-0/+4
Document this parameter into Documentation/kernel-parameters.txt Signed-off-by: Xiao Guangrong <[email protected]> Signed-off-by: Marcelo Tosatti <[email protected]>
2010-10-24KVM: fix the description of kvm-amd.nested in documentationXiao Guangrong1-1/+1
The default state of 'kvm-amd.nested' is enabled now, so fix the documentation Signed-off-by: Xiao Guangrong <[email protected]> Signed-off-by: Marcelo Tosatti <[email protected]>
2010-10-24KVM: SVM: do not generate "external interrupt exit" if other exit is pendingGleb Natapov1-0/+8
Nested SVM checks for external interrupt after injecting nested exception. In case there is external interrupt pending the code generates "external interrupt exit" and overwrites previous exit info. If previously injected exception already generated exit it will be lost. Signed-off-by: Gleb Natapov <[email protected]> Acked-by: Joerg Roedel <[email protected]> Signed-off-by: Marcelo Tosatti <[email protected]>
2010-10-24KVM: Convert PIC lock from raw spinlock to ordinary spinlockAvi Kivity3-8/+8
The PIC code used to be called from preempt_disable() context, which wasn't very good for PREEMPT_RT. That is no longer the case, so move back from raw_spinlock_t to spinlock_t. Signed-off-by: Avi Kivity <[email protected]> Acked-by: Thomas Gleixner <[email protected]> Signed-off-by: Marcelo Tosatti <[email protected]>
2010-10-24KVM: x86: Fix kvmclock bugZachary Amsden1-0/+1
If preempted after kvmclock values are updated, but before hardware virtualization is entered, the last tsc time as read by the guest is never set. It underflows the next time kvmclock is updated if there has not yet been a successful entry / exit into hardware virt. Fix this by simply setting last_tsc to the newly read tsc value so that any computed nsec advance of kvmclock is nulled. Signed-off-by: Zachary Amsden <[email protected]> Signed-off-by: Marcelo Tosatti <[email protected]>
2010-10-24KVM: MMU: Don't track nested fault info in error-codeJoerg Roedel3-11/+5
This patch moves the detection whether a page-fault was nested or not out of the error code and moves it into a separate variable in the fault struct. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: VMX: Move fixup_rmode_irq() to avoid forward declarationAvi Kivity1-24/+23
No code changes. Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: Non-atomic interrupt injectionAvi Kivity4-20/+40
Change the interrupt injection code to work from preemptible, interrupts enabled context. This works by adding a ->cancel_injection() operation that undoes an injection in case we were not able to actually enter the guest (this condition could never happen with atomic injection). Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: VMX: Parameterize vmx_complete_interrupts() for both exit and entryAvi Kivity1-13/+21
Currently vmx_complete_interrupts() can decode event information from vmx exit fields into the generic kvm event queues. Make it able to decode the information from the entry fields as well by parametrizing it. Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: VMX: Move real-mode interrupt injection fixup to vmx_complete_interrupts()Avi Kivity1-3/+6
This allows reuse of vmx_complete_interrupts() for cancelling injections. Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: VMX: Split up vmx_complete_interrupts()Avi Kivity1-12/+27
vmx_complete_interrupts() does too much, split it up: - vmx_vcpu_run() gets the "cache important vmcs fields" part - a new vmx_complete_atomic_exit() gets the parts that must be done atomically - a new vmx_recover_nmi_blocking() does what its name says - vmx_complete_interrupts() retains the event injection recovery code This helps in reducing the work done in atomic context. Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: Check for pending events before attempting injectionAvi Kivity6-12/+58
Instead of blindly attempting to inject an event before each guest entry, check for a possible event first in vcpu->requests. Sites that can trigger event injection are modified to set KVM_REQ_EVENT: - interrupt, nmi window opening - ppr updates - i8259 output changes - local apic irr changes - rflags updates - gif flag set - event set on exit This improves non-injecting entry performance, and sets the stage for non-atomic injection. Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Fix regression with ept memory types merged into non-ept page tablesAvi Kivity1-1/+1
Commit "KVM: MMU: Make tdp_enabled a mmu-context parameter" made real-mode set ->direct_map, and changed the code that merges in the memory type depend on direct_map instead of tdp_enabled. However, in this case what really matters is tdp, not direct_map, since tdp changes the pte format regardless of whether the mapping is direct or not. As a result, real-mode shadow mappings got corrupted with ept memory types. The result was a huge slowdown, likely due to the cache being disabled. Change it back as the simplest fix for the regression (real fix is to move all that to vmx code, and not use tdp_enabled as a synonym for ept). Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: Document that KVM_GET_SUPPORTED_CPUID may return emulated valuesAvi Kivity1-2/+3
Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: X86: Report SVM bit to userspace only when supportedJoerg Roedel2-1/+5
This patch fixes a bug in KVM where it _always_ reports the support of the SVM feature to userspace. But KVM only supports SVM on AMD hardware and only when it is enabled in the kernel module. This patch fixes the wrong reporting. Cc: [email protected] Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: SVM: Report Nested Paging support to userspaceJoerg Roedel1-0/+4
This patch implements the reporting of the nested paging feature support to userspace. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: SVM: Expect two more candiates for exit_int_infoJoerg Roedel1-1/+2
This patch adds INTR and NMI intercepts to the list of expected intercepts with an exit_int_info set. While this can't happen on bare metal it is architectural legal and may happen with KVMs SVM emulation. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: SVM: Initialize Nested Nested MMU context on VMRUNJoerg Roedel2-9/+42
This patch adds code to initialize the Nested Nested Paging MMU context when the L1 guest executes a VMRUN instruction and has nested paging enabled in its VMCB. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: SVM: Implement MMU helper functions for Nested Nested PagingJoerg Roedel1-0/+30
This patch adds the helper functions which will be used in the mmu context for handling nested nested page faults. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Track NX state in struct kvm_mmuJoerg Roedel3-3/+19
With Nested Paging emulation the NX state between the two MMU contexts may differ. To make sure that always the right fault error code is recorded this patch moves the NX state into struct kvm_mmu so that the code can distinguish between L1 and L2 NX state. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Allow long mode shadows for legacy page tablesJoerg Roedel2-8/+53
Currently the KVM softmmu implementation can not shadow a 32 bit legacy or PAE page table with a long mode page table. This is a required feature for nested paging emulation because the nested page table must alway be in host format. So this patch implements the missing pieces to allow long mode page tables for page table types. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Refactor mmu_alloc_roots functionJoerg Roedel1-22/+60
This patch factors out the direct-mapping paths of the mmu_alloc_roots function into a seperate function. This makes it a lot easier to avoid all the unnecessary checks done in the shadow path which may break when running direct. In fact, this patch already fixes a problem when running PAE guests on a PAE shadow page table. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Introduce kvm_pdptr_read_mmuJoerg Roedel3-2/+9
This function is implemented to load the pdptr pointers of the currently running guest (l1 or l2 guest). Therefore it takes care about the current paging mode and can read pdptrs out of l2 guest physical memory. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Add kvm_mmu parameter to load_pdptrs functionJoerg Roedel5-24/+27
This function need to be able to load the pdptrs from any mmu context currently in use. So change this function to take an kvm_mmu parameter to fit these needs. As a side effect this patch also moves the cached pdptrs from vcpu_arch into the kvm_mmu struct. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: X86: Propagate fetch faultsJoerg Roedel2-0/+7
KVM currently ignores fetch faults in the instruction emulator. With nested-npt we could have such faults. This patch adds the code to handle these. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Propagate the right fault back to the guest after gva_to_gpaJoerg Roedel2-1/+18
This patch implements logic to make sure that either a page-fault/page-fault-vmexit or a nested-page-fault-vmexit is propagated back to the guest. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Introduce init_kvm_nested_mmu()Joerg Roedel3-1/+54
This patch introduces the init_kvm_nested_mmu() function which is used to re-initialize the nested mmu when the l2 guest changes its paging mode. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Introduce kvm_read_nested_guest_page()Joerg Roedel1-3/+16
This patch introduces the kvm_read_guest_page_x86 function which reads from the physical memory of the guest. If the guest is running in guest-mode itself with nested paging enabled it will read from the guest's guest physical memory instead. The patch also changes changes the code to use this function where it is necessary. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Make walk_addr_generic capable for two-level walkingJoerg Roedel1-7/+23
This patch uses kvm_read_guest_page_tdp to make the walk_addr_generic functions suitable for two-level page table walking. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: X86: Add kvm_read_guest_page_mmu functionJoerg Roedel2-0/+26
This patch adds a function which can read from the guests physical memory or from the guest's guest physical memory. This will be used in the two-dimensional page table walker. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Implement nested gva_to_gpa functionsJoerg Roedel4-0/+54
This patch adds the functions to do a nested l2_gva to l1_gpa page table walk. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: X86: Introduce pointer to mmu context used for gva_to_gpaJoerg Roedel3-12/+28
This patch introduces the walk_mmu pointer which points to the mmu-context currently used for gva_to_gpa translations. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Add infrastructure for two-level page walkerJoerg Roedel3-0/+12
This patch introduces a mmu-callback to translate gpa addresses in the walk_addr code. This is later used to translate l2_gpa addresses into l1_gpa addresses. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Introduce generic walk_addr functionJoerg Roedel1-8/+18
This is the first patch in the series towards a generic walk_addr implementation which could walk two-dimensional page tables in the end. In this first step the walk_addr function is renamed into walk_addr_generic which takes a mmu context as an additional parameter. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Track page fault data in struct vcpuJoerg Roedel6-31/+38
This patch introduces a struct with two new fields in vcpu_arch for x86: * fault.address * fault.error_code This will be used to correctly propagate page faults back into the guest when we could have either an ordinary page fault or a nested page fault. In the case of a nested page fault the fault-address is different from the original address that should be walked. So we need to keep track about the real fault-address. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Let is_rsvd_bits_set take mmu context instead of vcpuJoerg Roedel2-6/+7
This patch changes is_rsvd_bits_set() function prototype to take only a kvm_mmu context instead of a full vcpu. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Introduce kvm_init_shadow_mmu helper functionJoerg Roedel2-25/+36
Some logic of the init_kvm_softmmu function is required to build the Nested Nested Paging context. So factor the required logic into a seperate function and export it. Also make the whole init path suitable for more than one mmu context. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Introduce inject_page_fault function pointerJoerg Roedel2-1/+6
This patch introduces an inject_page_fault function pointer into struct kvm_mmu which will be used to inject a page fault. This will be used later when Nested Nested Paging is implemented. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Introduce get_cr3 function pointerJoerg Roedel3-3/+11
This function pointer in the MMU context is required to implement Nested Nested Paging. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: X86: Introduce a tdp_set_cr3 functionJoerg Roedel4-10/+19
This patch introduces a special set_tdp_cr3 function pointer in kvm_x86_ops which is only used for tpd enabled mmu contexts. This allows to remove some hacks from svm code. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Make set_cr3 a function pointer in kvm_mmuJoerg Roedel2-2/+5
This is necessary to implement Nested Nested Paging. As a side effect this allows some cleanups in the SVM nested paging code. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
2010-10-24KVM: MMU: Make tdp_enabled a mmu-context parameterJoerg Roedel2-8/+15
This patch changes the tdp_enabled flag from its global meaning to the mmu-context and renames it to direct_map there. This is necessary for Nested SVM with emulation of Nested Paging where we need an extra MMU context to shadow the Nested Nested Page Table. Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Avi Kivity <[email protected]>