Signed-off-by: Gregory Haskins <[EMAIL PROTECTED]> --- drivers/kvm/irqdevice.h | 3 +++ drivers/kvm/kvm.h | 1 + drivers/kvm/lapic.c | 17 +++++++++++++++++ 3 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/drivers/kvm/irqdevice.h b/drivers/kvm/irqdevice.h index 097d179..173313d 100644 --- a/drivers/kvm/irqdevice.h +++ b/drivers/kvm/irqdevice.h @@ -45,12 +45,14 @@ struct kvm_irqsink { #define KVM_IRQACKDATA_VECTOR_VALID (1 << 0) #define KVM_IRQACKDATA_VECTOR_PENDING (1 << 1) +#define KVM_IRQACKDATA_NEXT_VALID (1 << 2) #define KVM_IRQACK_FLAG_PEEK (1 << 0) struct kvm_irqack_data { int flags; int vector; + int next; }; struct kvm_irqdevice { @@ -92,6 +94,7 @@ static inline void kvm_irqdevice_init(struct kvm_irqdevice *dev) * data.flags - * [KVM_IRQACKDATA_VECTOR_VALID - data.vector is valid] * [KVM_IRQACKDATA_VECTOR_PENDING - more vectors are pending] + * [KVM_IRQACKDATA_NEXT_VALID - next-vector is valid] * * Returns: (int) * [-1 = failure] diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h index ef3268e..a9ee8bd 100644 --- a/drivers/kvm/kvm.h +++ b/drivers/kvm/kvm.h @@ -180,6 +180,7 @@ void kvm_lapic_save(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs); void kvm_lapic_restore(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs); void kvm_lapic_reset(struct kvm_vcpu *vcpu); int kvm_lapic_enabled(struct kvm_vcpu *vcpu); +void *kvm_lapic_get_regs(struct kvm_vcpu *vcpu); /* * x86 supports 3 paging modes (4-level 64-bit, 3-level 64-bit, and 2-level diff --git a/drivers/kvm/lapic.c b/drivers/kvm/lapic.c index 9f0ab7e..602e94c 100644 --- a/drivers/kvm/lapic.c +++ b/drivers/kvm/lapic.c @@ -1154,6 +1154,13 @@ int kvm_lapic_enabled(struct kvm_vcpu *vcpu) return ret; } +void *kvm_lapic_get_regs(struct kvm_vcpu *vcpu) +{ + struct kvm_kern_apic *apic = (struct kvm_kern_apic*)vcpu->apic.dev; + return apic->regs; +} +EXPORT_SYMBOL_GPL(kvm_lapic_get_regs); + /* *---------------------------------------------------------------------- * timer interface @@ -1286,6 +1293,16 @@ static int apic_irqdev_ack(struct kvm_irqdevice *this, int flags, if ((irq & 0xf0) > apic_get_reg(apic, APIC_PROCPRI)) data->flags |= KVM_IRQACKDATA_VECTOR_PENDING; + if (irq) { + /* + * We report the next pending vector here so that the system + * can assess TPR thresholds for TPR-shadowing purposes + * (if applicable) + */ + data->next = irq; + data->flags |= KVM_IRQACKDATA_NEXT_VALID; + } + out: spin_unlock_bh(&apic->lock); ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel