diff options
author | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2006-10-30 10:42:27 +0000 |
---|---|---|
committer | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2006-10-30 10:42:27 +0000 |
commit | 30c8005e6ecce51d0f1b72c799bdcd7f876d7be3 (patch) | |
tree | c4a20869c65673fc29e6bd44278ef8bb35081b90 /xen/include/asm-x86/hvm/vlapic.h | |
parent | a75394cc817130ef7dc8d37318c73a08ac3219cc (diff) | |
download | xen-30c8005e6ecce51d0f1b72c799bdcd7f876d7be3.tar.gz xen-30c8005e6ecce51d0f1b72c799bdcd7f876d7be3.tar.bz2 xen-30c8005e6ecce51d0f1b72c799bdcd7f876d7be3.zip |
[HVM][VMX] Enable VMX TPR shadow feature.
x64 Windows uses CR8 to access TPR very frequently. This patch enables
TPR shadow and allows mov-from/to-CR8 to access it directly; tests
indicates it can boost greatly the performance of x64 Windows 2003.
Signed-off-by: Eddie Dong <eddie.dong@intel.com>
Signed-off-by: Yunhong Jiang <yunhong.jiang@intel.com>
Signed-off-by: Dexuan Cui <dexuan.cui@intel.com>
Diffstat (limited to 'xen/include/asm-x86/hvm/vlapic.h')
-rw-r--r-- | xen/include/asm-x86/hvm/vlapic.h | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/xen/include/asm-x86/hvm/vlapic.h b/xen/include/asm-x86/hvm/vlapic.h index 1da56bd0ca..b57d213775 100644 --- a/xen/include/asm-x86/hvm/vlapic.h +++ b/xen/include/asm-x86/hvm/vlapic.h @@ -107,6 +107,7 @@ struct vlapic { uint32_t timer_divide_count; struct timer vlapic_timer; int intr_pending_count[MAX_VECTOR]; + int flush_tpr_threshold; s_time_t timer_last_update; direct_intr_info_t direct_intr; uint32_t err_status; @@ -117,12 +118,30 @@ struct vlapic { void *regs; }; +static inline int vlapic_test_and_set_irr(int vector, struct vlapic *vlapic) +{ + vlapic->flush_tpr_threshold = 1; + return vlapic_test_and_set_vector(vector, vlapic->regs + APIC_IRR); +} + +static inline void vlapic_set_irr(int vector, struct vlapic *vlapic) +{ + vlapic->flush_tpr_threshold = 1; + vlapic_set_vector(vector, vlapic->regs + APIC_IRR); +} + +static inline void vlapic_clear_irr(int vector, struct vlapic *vlapic) +{ + vlapic->flush_tpr_threshold = 1; + vlapic_clear_vector(vector, vlapic->regs + APIC_IRR); +} + static inline int vlapic_set_irq(struct vlapic *vlapic, uint8_t vec, uint8_t trig) { int ret; - ret = vlapic_test_and_set_vector(vec, vlapic->regs + APIC_IRR); + ret = vlapic_test_and_set_irr(vec, vlapic); if ( trig ) vlapic_set_vector(vec, vlapic->regs + APIC_TMR); @@ -144,6 +163,8 @@ static inline void vlapic_set_reg(struct vlapic *vlapic, void vlapic_post_injection(struct vcpu* v, int vector, int deliver_mode); +extern int vlapic_find_highest_irr(struct vlapic *vlapic); + int cpu_has_apic_interrupt(struct vcpu* v); int cpu_get_apic_interrupt(struct vcpu* v, int *mode); @@ -151,6 +172,8 @@ extern int vlapic_init(struct vcpu *vc); extern void vlapic_msr_set(struct vlapic *vlapic, uint64_t value); +extern uint32_t vlapic_update_ppr(struct vlapic *vlapic); + int vlapic_accept_pic_intr(struct vcpu *v); struct vlapic* apic_round_robin(struct domain *d, |