linux-2.6
15 years agoKVM: fix apic_debug instances
Glauber Costa [Wed, 29 Apr 2009 21:29:09 +0000 (17:29 -0400)] 
KVM: fix apic_debug instances

Apparently nobody turned this on in a while...
setting apic_debug to something compilable, generates
some errors. This patch fixes it.

Signed-off-by: Glauber Costa <glommer@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Trivial format fix in setup_routing_entry()
Chris Wright [Fri, 1 May 2009 21:15:43 +0000 (14:15 -0700)] 
KVM: Trivial format fix in setup_routing_entry()

Remove extra tab.

Signed-off-by: Chris Wright <chrisw@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Disable VMX when system shutdown
Sheng Yang [Wed, 29 Apr 2009 03:09:04 +0000 (11:09 +0800)] 
KVM: VMX: Disable VMX when system shutdown

Intel TXT(Trusted Execution Technology) required VMX off for all cpu to work
when system shutdown.

CC: Joseph Cihula <joseph.cihula@intel.com>
Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Enable snooping control for supported hardware
Sheng Yang [Mon, 27 Apr 2009 12:35:43 +0000 (20:35 +0800)] 
KVM: Enable snooping control for supported hardware

Memory aliases with different memory type is a problem for guest. For the guest
without assigned device, the memory type of guest memory would always been the
same as host(WB); but for the assigned device, some part of memory may be used
as DMA and then set to uncacheable memory type(UC/WC), which would be a conflict of
host memory type then be a potential issue.

Snooping control can guarantee the cache correctness of memory go through the
DMA engine of VT-d.

[avi: fix build on ia64]

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Replace get_mt_mask_shift with get_mt_mask
Sheng Yang [Mon, 27 Apr 2009 12:35:42 +0000 (20:35 +0800)] 
KVM: Replace get_mt_mask_shift with get_mt_mask

Shadow_mt_mask is out of date, now it have only been used as a flag to indicate
if TDP enabled. Get rid of it and use tdp_enabled instead.

Also put memory type logical in kvm_x86_ops->get_mt_mask().

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Wake up waitqueue before calling get_cpu()
Jan Blunck [Tue, 7 Apr 2009 23:58:56 +0000 (23:58 +0000)] 
KVM: Wake up waitqueue before calling get_cpu()

This moves the get_cpu() call down to be called after we wake up the
waiters. Therefore the waitqueue locks can safely be rt mutex.

Signed-off-by: Jan Blunck <jblunck@suse.de>
Signed-off-by: Sven-Thorsten Dietrich <sven@thebigcorporation.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Get rid of get_irq() callback
Gleb Natapov [Tue, 21 Apr 2009 14:45:11 +0000 (17:45 +0300)] 
KVM: Get rid of get_irq() callback

It just returns pending IRQ vector from the queue for VMX/SVM.
Get IRQ directly from the queue before migration and put it back
after.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Fix userspace IRQ chip migration
Gleb Natapov [Tue, 21 Apr 2009 14:45:10 +0000 (17:45 +0300)] 
KVM: Fix userspace IRQ chip migration

Re-put pending IRQ vector into interrupt_bitmap before migration.
Otherwise it will be lost if migration happens in the wrong time.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: SVM: Add NMI injection support
Gleb Natapov [Tue, 21 Apr 2009 14:45:08 +0000 (17:45 +0300)] 
KVM: SVM: Add NMI injection support

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Get rid of arch.interrupt_window_open & arch.nmi_window_open
Gleb Natapov [Tue, 21 Apr 2009 14:45:07 +0000 (17:45 +0300)] 
KVM: Get rid of arch.interrupt_window_open & arch.nmi_window_open

They are recalculated before each use anyway.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Do not report TPR write to userspace if new value bigger or equal to a previous...
Gleb Natapov [Tue, 21 Apr 2009 14:45:06 +0000 (17:45 +0300)] 
KVM: Do not report TPR write to userspace if new value bigger or equal to a previous one.

Saves many exits to userspace in a case of IRQ chip in userspace.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: sync_lapic_to_cr8() should always sync cr8 to V_TPR
Gleb Natapov [Tue, 21 Apr 2009 14:45:05 +0000 (17:45 +0300)] 
KVM: sync_lapic_to_cr8() should always sync cr8 to V_TPR

Even if IRQ chip is in userspace.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Remove kvm_push_irq()
Gleb Natapov [Tue, 21 Apr 2009 14:45:04 +0000 (17:45 +0300)] 
KVM: Remove kvm_push_irq()

No longer used.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Remove inject_pending_vectors() callback
Gleb Natapov [Tue, 21 Apr 2009 14:45:03 +0000 (17:45 +0300)] 
KVM: Remove inject_pending_vectors() callback

It is the same as inject_pending_irq() for VMX/SVM now.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Remove exception_injected() callback.
Gleb Natapov [Tue, 21 Apr 2009 14:45:02 +0000 (17:45 +0300)] 
KVM: Remove exception_injected() callback.

It always return false for VMX/SVM now.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: SVM: Coalesce userspace/kernel irqchip interrupt injection logic
Gleb Natapov [Thu, 23 Apr 2009 14:14:37 +0000 (17:14 +0300)] 
KVM: SVM: Coalesce userspace/kernel irqchip interrupt injection logic

Start to use interrupt/exception queues like VMX does.
This also fix the bug that if exit was caused by a guest
internal exception access to IDT the exception was not
reinjected.

Use EVENTINJ to inject interrupts.  Use VINT only for detecting when IRQ
windows is open again.  EVENTINJ ensures
the interrupt is injected immediately and not delayed.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Use kvm_arch_interrupt_allowed() instead of checking interrupt_window_open directly
Gleb Natapov [Tue, 21 Apr 2009 14:44:59 +0000 (17:44 +0300)] 
KVM: Use kvm_arch_interrupt_allowed() instead of checking interrupt_window_open directly

kvm_arch_interrupt_allowed() also checks IF so drop the check.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Cleanup vmx_intr_assist()
Gleb Natapov [Tue, 21 Apr 2009 14:44:58 +0000 (17:44 +0300)] 
KVM: VMX: Cleanup vmx_intr_assist()

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Consolidate userspace and kernel interrupt injection for VMX
Gleb Natapov [Tue, 21 Apr 2009 14:44:57 +0000 (17:44 +0300)] 
KVM: VMX: Consolidate userspace and kernel interrupt injection for VMX

Use the same callback to inject irq/nmi events no matter what irqchip is
in use. Only from VMX for now.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Make kvm_cpu_(has|get)_interrupt() work for userspace irqchip too
Gleb Natapov [Tue, 21 Apr 2009 14:44:56 +0000 (17:44 +0300)] 
KVM: Make kvm_cpu_(has|get)_interrupt() work for userspace irqchip too

At the vector level, kernel and userspace irqchip are fairly similar.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: MMU: Fix auditing code
Jan Kiszka [Sat, 25 Apr 2009 10:43:21 +0000 (12:43 +0200)] 
KVM: MMU: Fix auditing code

Fix build breakage of hpa lookup in audit_mappings_page. Moreover, make
this function robust against shadow_notrap_nonpresent_pte entries.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: ia64: ia64 vcpu_reset() do not call kmalloc() with irqs disabled
Jes Sorensen [Fri, 17 Apr 2009 14:43:27 +0000 (16:43 +0200)] 
KVM: ia64: ia64 vcpu_reset() do not call kmalloc() with irqs disabled

Restore local irq enabled state before calling kvm_arch_vcpu_init(),
which calls kmalloc(GFP_KERNEL).

Signed-off-by: Jes Sorensen <jes@sgi.com>
Acked-by: Xiantao Zhang <xiantao.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: ia64: preserve int status through call to kvm_insert_vmm_mapping
Jes Sorensen [Thu, 16 Apr 2009 14:53:13 +0000 (16:53 +0200)] 
KVM: ia64: preserve int status through call to kvm_insert_vmm_mapping

Preserve interrupt status around call to kvm_insert_vmm_mappin()
in kvm_vcpu_pre_transition().

Signed-off-by: Jes Sorensen <jes@sgi.com>
Acked-by: Xiantao Zhang <xiantao.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: ia64: restore irq state before calling kvm_vcpu_init
Jes Sorensen [Thu, 16 Apr 2009 14:08:29 +0000 (16:08 +0200)] 
KVM: ia64: restore irq state before calling kvm_vcpu_init

Make sure to restore the psr after calling kvm_insert_vmm_mapping()
which calls ia64_itr_entry() as it disables local interrupts and
kvm_vcpu_init() may sleep.

Avoids a warning from the lock debugging code.

Signed-off-by: Jes Sorensen <jes@sgi.com>
Acked-by : Xiantao Zhang <xiantao.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: ia64: remove empty function vti_vcpu_load()
Jes Sorensen [Thu, 16 Apr 2009 09:24:58 +0000 (11:24 +0200)] 
KVM: ia64: remove empty function vti_vcpu_load()

vti_vcpu_load() doesn't do anything, so lets get rid of it.

Signed-off-by: Jes Sorensen <jes@sgi.com>
Acked-by : Xiantao Zhang<xiantao.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: ia64: Flush all TLBs once guest's memory mapping changes.
Xiantao Zhang [Thu, 16 Apr 2009 09:59:16 +0000 (17:59 +0800)] 
KVM: ia64: Flush all TLBs once guest's memory mapping changes.

Flush all vcpu's TLB entries once changes guest's memory mapping.

Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: x86: check for cr3 validity in ioctl_set_sregs
Marcelo Tosatti [Thu, 16 Apr 2009 11:30:44 +0000 (08:30 -0300)] 
KVM: x86: check for cr3 validity in ioctl_set_sregs

Matt T. Yourst notes that kvm_arch_vcpu_ioctl_set_sregs lacks validity
checking for the new cr3 value:

"Userspace callers of KVM_SET_SREGS can pass a bogus value of cr3 to
the kernel. This will trigger a NULL pointer access in gfn_to_rmap()
when userspace next tries to call KVM_RUN on the affected VCPU and kvm
attempts to activate the new non-existent page table root.

This happens since kvm only validates that cr3 points to a valid guest
physical memory page when code *inside* the guest sets cr3. However, kvm
currently trusts the userspace caller (e.g. QEMU) on the host machine to
always supply a valid page table root, rather than properly validating
it along with the rest of the reloaded guest state."

http://sourceforge.net/tracker/?func=detail&atid=893831&aid=2687641&group_id=180599

Check for a valid cr3 address in kvm_arch_vcpu_ioctl_set_sregs, triple
fault in case of failure.

Cc: stable@kernel.org
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: ia64: Don't hold slots_lock in guest mode
Jes Sorensen [Thu, 16 Apr 2009 08:43:48 +0000 (10:43 +0200)] 
KVM: ia64: Don't hold slots_lock in guest mode

Reorder locking to avoid holding the slots_lock when entering
the guest.

Signed-off-by: Jes Sorensen <jes@sgi.com>
Acked-by : Xiantao Zhang<xiantao.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Replace kvmclock open-coded get_cpu_var() with the real thing
Avi Kivity [Sun, 12 Apr 2009 12:49:07 +0000 (15:49 +0300)] 
KVM: Replace kvmclock open-coded get_cpu_var() with the real thing

Suggested by Ingo Molnar.

Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: SVM: Skip instruction on a task switch only when appropriate
Gleb Natapov [Sun, 12 Apr 2009 10:37:02 +0000 (13:37 +0300)] 
KVM: SVM: Skip instruction on a task switch only when appropriate

If a task switch was initiated because off a task gate in IDT and IDT
was accessed because of an external even the instruction should not
be skipped.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: x86 emulator: Add new mode of instruction emulation: skip
Gleb Natapov [Sun, 12 Apr 2009 10:36:57 +0000 (13:36 +0300)] 
KVM: x86 emulator: Add new mode of instruction emulation: skip

In the new mode instruction is decoded, but not executed. The EIP
is moved to point after the instruction.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: x86 emulator: Decode soft interrupt instructions
Gleb Natapov [Sun, 12 Apr 2009 10:36:52 +0000 (13:36 +0300)] 
KVM: x86 emulator: Decode soft interrupt instructions

Do not emulate them yet.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: x86 emulator: Completely decode in/out at decoding stage
Gleb Natapov [Sun, 12 Apr 2009 10:36:46 +0000 (13:36 +0300)] 
KVM: x86 emulator: Completely decode in/out at decoding stage

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: x86 emulator: Add unsigned byte immediate decode
Gleb Natapov [Sun, 12 Apr 2009 10:36:41 +0000 (13:36 +0300)] 
KVM: x86 emulator: Add unsigned byte immediate decode

Extend "Source operand type" opcode description field to 4 bites
to accommodate new option.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: x86 emulator: Complete decoding of call near in decode stage
Gleb Natapov [Sun, 12 Apr 2009 10:36:36 +0000 (13:36 +0300)] 
KVM: x86 emulator: Complete decoding of call near in decode stage

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: x86 emulator: Complete short/near jcc decoding in decode stage
Gleb Natapov [Sun, 12 Apr 2009 10:36:30 +0000 (13:36 +0300)] 
KVM: x86 emulator: Complete short/near jcc decoding in decode stage

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: x86 emulator: Complete ljmp decoding at decode stage
Gleb Natapov [Sun, 12 Apr 2009 10:36:25 +0000 (13:36 +0300)] 
KVM: x86 emulator: Complete ljmp decoding at decode stage

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: x86 emulator: Add lcall decoding
Gleb Natapov [Sun, 12 Apr 2009 10:36:20 +0000 (13:36 +0300)] 
KVM: x86 emulator: Add lcall decoding

No emulation yet.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: x86 emulator: Add decoding of 16bit second immediate argument
Gleb Natapov [Sun, 12 Apr 2009 10:36:14 +0000 (13:36 +0300)] 
KVM: x86 emulator: Add decoding of 16bit second immediate argument

Such as segment number in lcall/ljmp

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: MMU: remove global page optimization logic
Marcelo Tosatti [Sun, 5 Apr 2009 17:54:47 +0000 (14:54 -0300)] 
KVM: MMU: remove global page optimization logic

Complexity to fix it not worthwhile the gains, as discussed
in http://article.gmane.org/gmane.comp.emulators.kvm.devel/28649.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Make kvm header C++ friendly
nathan binkert [Sat, 28 Mar 2009 04:53:05 +0000 (21:53 -0700)] 
KVM: Make kvm header C++ friendly

Two things needed fixing: 1) g++ does not allow a named structure type
within an anonymous union and 2) Avoid name clash between two padding
fields within the same struct by giving them different names as is
done elsewhere in the header.

Signed-off-by: Nathan Binkert <nate@binkert.org>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: PIT: fix count read and mode 0 handling
Marcelo Tosatti [Wed, 8 Apr 2009 16:14:19 +0000 (13:14 -0300)] 
KVM: PIT: fix count read and mode 0 handling

Commit 46ee278652f4cbd51013471b64c7897ba9bcd1b1 causes Solaris 10
to hang on boot.

Assuming that PIT counter reads should return 0 for an expired timer
is wrong: when it is active, the counter never stops (see comment on
__kpit_elapsed).

Also arm a one shot timer for mode 0.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: ia64: make kvm depend on CONFIG_MODULES.
Zhang, Xiantao [Thu, 9 Apr 2009 13:37:28 +0000 (21:37 +0800)] 
KVM: ia64: make kvm depend on CONFIG_MODULES.

Since kvm-intel modue can't be built-in, make kvm depend on
CONFIG_MODULES.

Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: x86 emulator: fix call near emulation
Gleb Natapov [Thu, 2 Apr 2009 12:51:46 +0000 (15:51 +0300)] 
KVM: x86 emulator: fix call near emulation

The length of pushed on to the stack return address depends on operand
size not address size.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: MMU: Discard reserved bits checking on PDE bit 7-8
Sheng Yang [Thu, 2 Apr 2009 02:28:37 +0000 (10:28 +0800)] 
KVM: MMU: Discard reserved bits checking on PDE bit 7-8

1. It's related to a Linux kernel bug which fixed by Ingo on
07a66d7c53a538e1a9759954a82bb6c07365eff9. The original code exists for quite a
long time, and it would convert a PDE for large page into a normal PDE. But it
fail to fit normal PDE well.  With the code before Ingo's fix, the kernel would
fall reserved bit checking with bit 8 - the remaining global bit of PTE. So the
kernel would receive a double-fault.

2. After discussion, we decide to discard PDE bit 7-8 reserved checking for now.
For this marked as reserved in SDM, but didn't checked by the processor in
fact...

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Fix unneeded instruction skipping during task switching.
Gleb Natapov [Mon, 30 Mar 2009 13:03:29 +0000 (16:03 +0300)] 
KVM: Fix unneeded instruction skipping during task switching.

There is no need to skip instruction if the reason for a task switch
is a task gate in IDT and access to it is caused by an external even.
The problem  is currently solved only for VMX since there is no reliable
way to skip an instruction in SVM. We should emulate it instead.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Fix task switch back link handling.
Gleb Natapov [Mon, 30 Mar 2009 13:03:24 +0000 (16:03 +0300)] 
KVM: Fix task switch back link handling.

Back link is written to a wrong TSS now.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Do not zero idt_vectoring_info in vmx_complete_interrupts().
Gleb Natapov [Mon, 30 Mar 2009 13:03:18 +0000 (16:03 +0300)] 
KVM: VMX: Do not zero idt_vectoring_info in vmx_complete_interrupts().

We will need it later in task_switch().
Code in handle_exception() is dead. is_external_interrupt(vect_info)
will always be false since idt_vectoring_info is zeroed in
vmx_complete_interrupts().

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Rewrite vmx_complete_interrupt()'s twisted maze of if() statements
Gleb Natapov [Mon, 30 Mar 2009 13:03:13 +0000 (16:03 +0300)] 
KVM: VMX: Rewrite vmx_complete_interrupt()'s twisted maze of if() statements

...with a more straightforward switch().

Also fix a bug when NMI could be dropped on exit. Although this should
never happen in practice, since NMIs can only be injected, never triggered
internally by the guest like exceptions.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Fix handling of a fault during NMI unblocked due to IRET
Gleb Natapov [Mon, 30 Mar 2009 13:03:08 +0000 (16:03 +0300)] 
KVM: VMX: Fix handling of a fault during NMI unblocked due to IRET

Bit 12 is undefined in any of the following cases:
 If the VM exit sets the valid bit in the IDT-vectoring information field.
 If the VM exit is due to a double fault.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Use rsvd_bits_mask in load_pdptrs()
Dong, Eddie [Tue, 31 Mar 2009 15:03:45 +0000 (23:03 +0800)] 
KVM: Use rsvd_bits_mask in load_pdptrs()

Also remove bit 5-6 from rsvd_bits_mask per latest SDM.

Signed-off-by: Eddie Dong <Eddie.Dong@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Fix feature testing
Sheng Yang [Wed, 1 Apr 2009 07:52:32 +0000 (15:52 +0800)] 
KVM: VMX: Fix feature testing

The testing of feature is too early now, before vmcs_config complete initialization.

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Clean up Flex Priority related
Sheng Yang [Wed, 1 Apr 2009 07:52:31 +0000 (15:52 +0800)] 
KVM: VMX: Clean up Flex Priority related

And clean paranthes on returns.

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: remove pointless conditional before kfree() in lapic initialization
Wei Yongjun [Tue, 31 Mar 2009 08:47:44 +0000 (16:47 +0800)] 
KVM: remove pointless conditional before kfree() in lapic initialization

Remove pointless conditional before kfree().

Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: MMU: Use different shadows when EFER.NXE changes
Avi Kivity [Tue, 31 Mar 2009 08:31:54 +0000 (11:31 +0300)] 
KVM: MMU: Use different shadows when EFER.NXE changes

A pte that is shadowed when the guest EFER.NXE=1 is not valid when
EFER.NXE=0; if bit 63 is set, the pte should cause a fault, and since the
shadow EFER always has NX enabled, this won't happen.

Fix by using a different shadow page table for different EFER.NXE bits.  This
allows vcpus to run correctly with different values of EFER.NXE, and for
transitions on this bit to be handled correctly without requiring a full
flush.

Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: MMU: Emulate #PF error code of reserved bits violation
Dong, Eddie [Mon, 30 Mar 2009 08:21:08 +0000 (16:21 +0800)] 
KVM: MMU: Emulate #PF error code of reserved bits violation

Detect, indicate, and propagate page faults where reserved bits are set.
Take care to handle the different paging modes, each of which has different
sets of reserved bits.

[avi: fix pte reserved bits for efer.nxe=0]

Signed-off-by: Eddie Dong <eddie.dong@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: ia64: enable external interrupt in vmm
Yang Zhang [Mon, 23 Mar 2009 07:31:04 +0000 (03:31 -0400)] 
KVM: ia64: enable external interrupt in vmm

Currently, the interrupt enable bit is cleared when in
the vmm.  This patch sets the bit and the external interrupts can
be dealt with when in the vmm.  This improves the I/O performance.

Signed-off-by: Yang Zhang <yang.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: MMU: Fix comment in page_fault()
Eddie Dong [Thu, 26 Mar 2009 07:28:40 +0000 (15:28 +0800)] 
KVM: MMU: Fix comment in page_fault()

The original one is for the code before refactoring.

Signed-off-by: Yaozu (Eddie) Dong <eddie.dong@intel.com>
Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Correct wrong vmcs field sizes
Sheng Yang [Wed, 25 Mar 2009 02:08:52 +0000 (10:08 +0800)] 
KVM: VMX: Correct wrong vmcs field sizes

EXIT_QUALIFICATION and GUEST_LINEAR_ADDRESS are natural width, not 64-bit.

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Make flexpriority module parameter reflect hardware capability
Avi Kivity [Tue, 24 Mar 2009 12:27:47 +0000 (14:27 +0200)] 
KVM: VMX: Make flexpriority module parameter reflect hardware capability

If the hardware does not support flexpriority, zero the module parameter.

Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Fix interrupt unhalting a vcpu when it shouldn't
Gleb Natapov [Mon, 23 Mar 2009 10:12:11 +0000 (12:12 +0200)] 
KVM: Fix interrupt unhalting a vcpu when it shouldn't

kvm_vcpu_block() unhalts vpu on an interrupt/timer without checking
if interrupt window is actually opened.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Timer event should not unconditionally unhalt vcpu.
Gleb Natapov [Mon, 23 Mar 2009 13:11:44 +0000 (15:11 +0200)] 
KVM: Timer event should not unconditionally unhalt vcpu.

Currently timer events are processed before entering guest mode. Move it
to main vcpu event loop since timer events should be processed even while
vcpu is halted.  Timer may cause interrupt/nmi to be injected and only then
vcpu will be unhalted.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Fold vm_need_ept() into callers
Avi Kivity [Mon, 23 Mar 2009 16:26:32 +0000 (18:26 +0200)] 
KVM: VMX: Fold vm_need_ept() into callers

Trivial.

Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Zero ept module parameter if ept is not present
Avi Kivity [Mon, 23 Mar 2009 16:25:15 +0000 (18:25 +0200)] 
KVM: VMX: Zero ept module parameter if ept is not present

Allows reading back hardware capability.

Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Zero the vpid module parameter if vpid is not supported
Avi Kivity [Mon, 23 Mar 2009 16:01:29 +0000 (18:01 +0200)] 
KVM: VMX: Zero the vpid module parameter if vpid is not supported

This allows reading back how the hardware is configured.

Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Annotate module parameters as __read_mostly
Avi Kivity [Mon, 23 Mar 2009 15:53:37 +0000 (17:53 +0200)] 
KVM: VMX: Annotate module parameters as __read_mostly

Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Simplify module parameter names
Avi Kivity [Mon, 23 Mar 2009 15:39:48 +0000 (17:39 +0200)] 
KVM: VMX: Simplify module parameter names

Instead of 'enable_vpid=1', use a simple 'vpid=1'.

Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Rename kvm_handle_exit() to vmx_handle_exit()
Avi Kivity [Mon, 23 Mar 2009 15:35:17 +0000 (17:35 +0200)] 
KVM: VMX: Rename kvm_handle_exit() to vmx_handle_exit()

It is a static vmx-specific function.

Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: VMX: Make module parameters readable
Avi Kivity [Mon, 23 Mar 2009 13:41:17 +0000 (15:41 +0200)] 
KVM: VMX: Make module parameters readable

Useful to see how the module was loaded.

Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: reuse (pop|push)_irq from svm.c in vmx.c
Gleb Natapov [Mon, 23 Mar 2009 09:23:18 +0000 (11:23 +0200)] 
KVM: reuse (pop|push)_irq from svm.c in vmx.c

The prioritized bit vector manipulation functions are useful in both vmx and
svm.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: SVM: Remove duplicate code in svm_do_inject_vector()
Gleb Natapov [Sun, 22 Mar 2009 10:37:05 +0000 (12:37 +0200)] 
KVM: SVM: Remove duplicate code in svm_do_inject_vector()

svm_do_inject_vector() reimplements pop_irq().

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: x86: Ignore reads to EVNTSEL MSRs
Amit Shah [Fri, 20 Mar 2009 07:09:00 +0000 (12:39 +0530)] 
KVM: x86: Ignore reads to EVNTSEL MSRs

We ignore writes to the performance counters and performance event
selector registers already. Kaspersky antivirus reads the eventsel
MSR causing it to crash with the current behaviour.

Return 0 as data when the eventsel registers are read to stop the
crash.

Signed-off-by: Amit Shah <amit.shah@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: MMU: do not free active mmu pages in free_mmu_pages()
Gleb Natapov [Thu, 19 Mar 2009 10:20:36 +0000 (12:20 +0200)] 
KVM: MMU: do not free active mmu pages in free_mmu_pages()

free_mmu_pages() should only undo what alloc_mmu_pages() does.
Free mmu pages from the generic VM destruction function, kvm_destroy_vm().

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Device assignment framework rework
Sheng Yang [Thu, 12 Mar 2009 13:45:39 +0000 (21:45 +0800)] 
KVM: Device assignment framework rework

After discussion with Marcelo, we decided to rework device assignment framework
together. The old problems are kernel logic is unnecessary complex. So Marcelo
suggest to split it into a more elegant way:

1. Split host IRQ assign and guest IRQ assign. And userspace determine the
combination. Also discard msi2intx parameter, userspace can specific
KVM_DEV_IRQ_HOST_MSI | KVM_DEV_IRQ_GUEST_INTX in assigned_irq->flags to
enable MSI to INTx convertion.

2. Split assign IRQ and deassign IRQ. Import two new ioctls:
KVM_ASSIGN_DEV_IRQ and KVM_DEASSIGN_DEV_IRQ.

This patch also fixed the reversed _IOR vs _IOW in definition(by deprecated the
old interface).

[avi: replace homemade bitcount() by hweight_long()]

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: make 'lapic_timer_ops' and 'kpit_ops' static
Hannes Eder [Tue, 10 Mar 2009 21:51:09 +0000 (22:51 +0100)] 
KVM: make 'lapic_timer_ops' and 'kpit_ops' static

Fix this sparse warnings:
  arch/x86/kvm/lapic.c:916:22: warning: symbol 'lapic_timer_ops' was not declared. Should it be static?
  arch/x86/kvm/i8254.c:268:22: warning: symbol 'kpit_ops' was not declared. Should it be static?

Signed-off-by: Hannes Eder <hannes@hanneseder.net>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: ia64: Drop in SN2 replacement of fast path ITC emulation fault handler
Jes Sorensen [Wed, 25 Feb 2009 16:38:55 +0000 (10:38 -0600)] 
KVM: ia64: Drop in SN2 replacement of fast path ITC emulation fault handler

Copy in SN2 RTC based ITC emulation for fast exit. The two versions
have the same size, so a dropin is simpler than patching the branch
instruction to hit the SN2 version.

Signed-off-by: Jes Sorensen <jes@sgi.com>
Acked-by: Xiantao Zhang <xiantao.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: ia64: SN2 adjust emulated ITC frequency to match RTC frequency
Jes Sorensen [Wed, 25 Feb 2009 16:38:54 +0000 (10:38 -0600)] 
KVM: ia64: SN2 adjust emulated ITC frequency to match RTC frequency

On SN2 do not pass down the real ITC frequency, but rather patch the
values to match the SN2 RTC frequency.

Signed-off-by: Jes Sorensen <jes@sgi.com>
Acked-by: Xiantao Zhang <xiantao.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: ia64: Create inline function kvm_get_itc() to centralize ITC reading.
Jes Sorensen [Wed, 25 Feb 2009 16:38:53 +0000 (10:38 -0600)] 
KVM: ia64: Create inline function kvm_get_itc() to centralize ITC reading.

Move all reading of special register 'AR_ITC' into two functions, one
in the kernel and one in the VMM module. When running on SN2, base the
result on the RTC rather the system ITC, as the ITC isn't
synchronized.

Signed-off-by: Jes Sorensen <jes@sgi.com>
Acked-by: Xiantao Zhang <xiantao.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: ia64: Map in SN2 RTC registers to the VMM module
Jes Sorensen [Wed, 25 Feb 2009 16:38:52 +0000 (10:38 -0600)] 
KVM: ia64: Map in SN2 RTC registers to the VMM module

On SN2, map in the SN2 RTC registers to the VMM module, needed for ITC
emulation.

Signed-off-by: Jes Sorensen <jes@sgi.com>
Acked-by: Xiantao Zhang <xiantao.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: APIC: get rid of deliver_bitmask
Gleb Natapov [Thu, 5 Mar 2009 14:35:04 +0000 (16:35 +0200)] 
KVM: APIC: get rid of deliver_bitmask

Deliver interrupt during destination matching loop.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Acked-by: Xiantao Zhang <xiantao.zhang@intel.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
15 years agoKVM: change the way how lowest priority vcpu is calculated
Gleb Natapov [Thu, 5 Mar 2009 14:34:59 +0000 (16:34 +0200)] 
KVM: change the way how lowest priority vcpu is calculated

The new way does not require additional loop over vcpus to calculate
the one with lowest priority as one is chosen during delivery bitmap
construction.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
15 years agoKVM: consolidate ioapic/ipi interrupt delivery logic
Gleb Natapov [Thu, 5 Mar 2009 14:34:54 +0000 (16:34 +0200)] 
KVM: consolidate ioapic/ipi interrupt delivery logic

Use kvm_apic_match_dest() in kvm_get_intr_delivery_bitmask() instead
of duplicating the same code. Use kvm_get_intr_delivery_bitmask() in
apic_send_ipi() to figure out ipi destination instead of reimplementing
the logic.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
15 years agoKVM: ioapic/msi interrupt delivery consolidation
Gleb Natapov [Thu, 5 Mar 2009 14:34:49 +0000 (16:34 +0200)] 
KVM: ioapic/msi interrupt delivery consolidation

ioapic_deliver() and kvm_set_msi() have code duplication. Move
the code into ioapic_deliver_entry() function and call it from
both places.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
15 years agoKVM: APIC: kvm_apic_set_irq deliver all kinds of interrupts
Gleb Natapov [Thu, 5 Mar 2009 14:34:44 +0000 (16:34 +0200)] 
KVM: APIC: kvm_apic_set_irq deliver all kinds of interrupts

Get rid of ioapic_inj_irq() and ioapic_inj_nmi() functions.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
15 years agoKVM: MMU: remove call to kvm_mmu_pte_write from walk_addr
Joerg Roedel [Thu, 5 Mar 2009 12:12:29 +0000 (13:12 +0100)] 
KVM: MMU: remove call to kvm_mmu_pte_write from walk_addr

There is no reason to update the shadow pte here because the guest pte
is only changed to dirty state.

Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
15 years agoKVM: Merge kvm_ioapic_get_delivery_bitmask into kvm_get_intr_delivery_bitmask
Sheng Yang [Wed, 4 Mar 2009 05:33:02 +0000 (13:33 +0800)] 
KVM: Merge kvm_ioapic_get_delivery_bitmask into kvm_get_intr_delivery_bitmask

Gleb fixed bitmap ops usage in kvm_ioapic_get_delivery_bitmask.

Sheng merged two functions, as well as fixed several issues in
kvm_get_intr_delivery_bitmask
1. deliver_bitmask is a bitmap rather than a unsigned long intereger.
2. Lowest priority target bitmap wrong calculated by mistake.
3. Prevent potential NULL reference.
4. Declaration in include/kvm_host.h caused powerpc compilation warning.
5. Add warning for guest broadcast interrupt with lowest priority delivery mode.
6. Removed duplicate bitmap clean up in caller of kvm_get_intr_delivery_bitmask.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
15 years agoKVM: ia64: fix compilation error in kvm_get_lowest_prio_vcpu
Yang Zhang [Tue, 3 Mar 2009 03:06:41 +0000 (22:06 -0500)] 
KVM: ia64: fix compilation error in kvm_get_lowest_prio_vcpu

Modify the arg of kvm_get_lowest_prio_vcpu().
Make it consistent with its declaration.

Signed-off-by: Yang Zhang <yang.zhang@intel.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
15 years agoKVM: unify part of generic timer handling
Marcelo Tosatti [Mon, 23 Feb 2009 13:57:41 +0000 (10:57 -0300)] 
KVM: unify part of generic timer handling

Hide the internals of vcpu awakening / injection from the in-kernel
emulated timers. This makes future changes in this logic easier and
decreases the distance to more generic timer handling.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: PIT: remove usage of count_load_time for channel 0
Marcelo Tosatti [Mon, 23 Feb 2009 13:57:40 +0000 (10:57 -0300)] 
KVM: PIT: remove usage of count_load_time for channel 0

We can infer elapsed time from hrtimer_expires_remaining.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: PIT: remove unused scheduled variable
Marcelo Tosatti [Mon, 23 Feb 2009 13:57:39 +0000 (10:57 -0300)] 
KVM: PIT: remove unused scheduled variable

Unused.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: declare ioapic functions only on affected hardware
Christian Borntraeger [Thu, 26 Feb 2009 12:55:33 +0000 (13:55 +0100)] 
KVM: declare ioapic functions only on affected hardware

Since "KVM: Unify the delivery of IOAPIC and MSI interrupts"
I get the following warnings:

  CC [M]  arch/s390/kvm/kvm-s390.o
In file included from arch/s390/kvm/kvm-s390.c:22:
include/linux/kvm_host.h:357: warning: 'struct kvm_ioapic' declared inside parameter list
include/linux/kvm_host.h:357: warning: its scope is only this definition or declaration, which is probably not what you want

This patch limits IOAPIC functions for architectures that have one.

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: x86: paravirt skip pit-through-ioapic boot check
Marcelo Tosatti [Thu, 12 Feb 2009 00:45:42 +0000 (22:45 -0200)] 
KVM: x86: paravirt skip pit-through-ioapic boot check

Skip the test which checks if the PIT is properly routed when
using the IOAPIC, aimed at buggy hardware.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: x86: silence preempt warning on kvm_write_guest_time
Matt T. Yourst [Tue, 24 Feb 2009 18:28:00 +0000 (15:28 -0300)] 
KVM: x86: silence preempt warning on kvm_write_guest_time

This issue just appeared in kvm-84 when running on 2.6.28.7 (x86-64)
with PREEMPT enabled.

We're getting syslog warnings like this many (but not all) times qemu
tells KVM to run the VCPU:

BUG: using smp_processor_id() in preemptible [00000000] code:
qemu-system-x86/28938
caller is kvm_arch_vcpu_ioctl_run+0x5d1/0xc70 [kvm]
Pid: 28938, comm: qemu-system-x86 2.6.28.7-mtyrel-64bit
Call Trace:
debug_smp_processor_id+0xf7/0x100
kvm_arch_vcpu_ioctl_run+0x5d1/0xc70 [kvm]
? __wake_up+0x4e/0x70
? wake_futex+0x27/0x40
kvm_vcpu_ioctl+0x2e9/0x5a0 [kvm]
enqueue_hrtimer+0x8a/0x110
_spin_unlock_irqrestore+0x27/0x50
vfs_ioctl+0x31/0xa0
do_vfs_ioctl+0x74/0x480
sys_futex+0xb4/0x140
sys_ioctl+0x99/0xa0
system_call_fastpath+0x16/0x1b

As it turns out, the call trace is messed up due to gcc's inlining, but
I isolated the problem anyway: kvm_write_guest_time() is being used in a
non-thread-safe manner on preemptable kernels.

Basically kvm_write_guest_time()'s body needs to be surrounded by
preempt_disable() and preempt_enable(), since the kernel won't let us
query any per-CPU data (indirectly using smp_processor_id()) without
preemption disabled. The attached patch fixes this issue by disabling
preemption inside kvm_write_guest_time().

[marcelo: surround only __get_cpu_var calls since the warning
is harmless]

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Enable MSI-X for KVM assigned device
Sheng Yang [Wed, 25 Feb 2009 09:22:28 +0000 (17:22 +0800)] 
KVM: Enable MSI-X for KVM assigned device

This patch finally enable MSI-X.

What we need for MSI-X:
1. Intercept one page in MMIO region of device. So that we can get guest desired
MSI-X table and set up the real one. Now this have been done by guest, and
transfer to kernel using ioctl KVM_SET_MSIX_NR and KVM_SET_MSIX_ENTRY.

2. Information for incoming interrupt. Now one device can have more than one
interrupt, and they are all handled by one workqueue structure. So we need to
identify them. The previous patch enable gsi_msg_pending_bitmap get this done.

3. Mapping from host IRQ to guest gsi as well as guest gsi to real MSI/MSI-X
message address/data. We used same entry number for the host and guest here, so
that it's easy to find the correlated guest gsi.

What we lack for now:
1. The PCI spec said nothing can existed with MSI-X table in the same page of
MMIO region, except pending bits. The patch ignore pending bits as the first
step (so they are always 0 - no pending).

2. The PCI spec allowed to change MSI-X table dynamically. That means, the OS
can enable MSI-X, then mask one MSI-X entry, modify it, and unmask it. The patch
didn't support this, and Linux also don't work in this way.

3. The patch didn't implement MSI-X mask all and mask single entry. I would
implement the former in driver/pci/msi.c later. And for single entry, userspace
should have reposibility to handle it.

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Add MSI-X interrupt injection logic
Sheng Yang [Wed, 25 Feb 2009 09:22:27 +0000 (17:22 +0800)] 
KVM: Add MSI-X interrupt injection logic

We have to handle more than one interrupt with one handler for MSI-X. Avi
suggested to use a flag to indicate the pending. So here is it.

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Ioctls for init MSI-X entry
Sheng Yang [Wed, 25 Feb 2009 09:22:26 +0000 (17:22 +0800)] 
KVM: Ioctls for init MSI-X entry

Introduce KVM_SET_MSIX_NR and KVM_SET_MSIX_ENTRY two ioctls.

This two ioctls are used by userspace to specific guest device MSI-X entry
number and correlate MSI-X entry with GSI during the initialization stage.

MSI-X should be well initialzed before enabling.

Don't support change MSI-X entry number for now.

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: bit ops for deliver_bitmap
Sheng Yang [Wed, 11 Feb 2009 08:03:40 +0000 (16:03 +0800)] 
KVM: bit ops for deliver_bitmap

It's also convenient when we extend KVM supported vcpu number in the future.

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Update intr delivery func to accept unsigned long* bitmap
Sheng Yang [Wed, 11 Feb 2009 08:03:39 +0000 (16:03 +0800)] 
KVM: Update intr delivery func to accept unsigned long* bitmap

Would be used with bit ops, and would be easily extended if KVM_MAX_VCPUS is
increased.

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Change API of kvm_ioapic_get_delivery_bitmask
Sheng Yang [Wed, 11 Feb 2009 08:03:38 +0000 (16:03 +0800)] 
KVM: Change API of kvm_ioapic_get_delivery_bitmask

In order to use with bit ops.

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
15 years agoKVM: Unify the delivery of IOAPIC and MSI interrupts
Sheng Yang [Wed, 11 Feb 2009 08:03:37 +0000 (16:03 +0800)] 
KVM: Unify the delivery of IOAPIC and MSI interrupts

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>