aboutsummaryrefslogtreecommitdiffstats
path: root/xen/include/asm-x86/hvm/vlapic.h
diff options
context:
space:
mode:
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>2006-10-30 10:42:27 +0000
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>2006-10-30 10:42:27 +0000
commit30c8005e6ecce51d0f1b72c799bdcd7f876d7be3 (patch)
treec4a20869c65673fc29e6bd44278ef8bb35081b90 /xen/include/asm-x86/hvm/vlapic.h
parenta75394cc817130ef7dc8d37318c73a08ac3219cc (diff)
downloadxen-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.h25
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,