# HG changeset patch
# User Travis Betak <travis.betak@xxxxxxx>
# Date 1170272264 0
# Node ID 588dd80b56b5411bd9d1860e9e19da39a64e2f5d
# Parent b998ae45c076eb6b32a48ec0e7c49d9a03ec846f
[HVM][SVM] Updated the SVM V_TPR register on MMIO writes to the VLAPIC TPR
The SVM architecture includes a virtual TPR register. This patch
updates this register on MMIO writes to the HVM Virtual APIC.
VT does not have this register as far as I know so a stub is added in
the VT code.
Signed-off-by: Travis Betak <travis.betak@xxxxxxx>
---
xen/arch/x86/hvm/svm/svm.c | 10 ++++++++++
xen/arch/x86/hvm/vlapic.c | 1 +
xen/arch/x86/hvm/vmx/vmx.c | 7 +++++++
xen/include/asm-x86/hvm/hvm.h | 11 +++++++++++
4 files changed, 29 insertions(+)
diff -r b998ae45c076 -r 588dd80b56b5 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c Wed Jan 31 18:15:48 2007 +0000
+++ b/xen/arch/x86/hvm/svm/svm.c Wed Jan 31 19:37:44 2007 +0000
@@ -660,6 +660,13 @@ void svm_update_guest_cr3(struct vcpu *v
v->arch.hvm_svm.vmcb->cr3 = v->arch.hvm_vcpu.hw_cr3;
}
+static void svm_update_vtpr(struct vcpu *v, unsigned long value)
+{
+ struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
+
+ vmcb->vintr.fields.tpr = value & 0x0f;
+}
+
unsigned long svm_get_ctrl_reg(struct vcpu *v, unsigned int num)
{
switch ( num )
@@ -1048,6 +1055,8 @@ int start_svm(void)
hvm_funcs.update_host_cr3 = svm_update_host_cr3;
hvm_funcs.update_guest_cr3 = svm_update_guest_cr3;
+ hvm_funcs.update_vtpr = svm_update_vtpr;
+
hvm_funcs.stts = svm_stts;
hvm_funcs.set_tsc_offset = svm_set_tsc_offset;
@@ -1939,6 +1948,7 @@ static int mov_to_cr(int gpreg, int cr,
case 8:
vlapic_set_reg(vlapic, APIC_TASKPRI, ((value & 0x0F) << 4));
+ vmcb->vintr.fields.tpr = value & 0x0F;
break;
default:
diff -r b998ae45c076 -r 588dd80b56b5 xen/arch/x86/hvm/vlapic.c
--- a/xen/arch/x86/hvm/vlapic.c Wed Jan 31 18:15:48 2007 +0000
+++ b/xen/arch/x86/hvm/vlapic.c Wed Jan 31 19:37:44 2007 +0000
@@ -593,6 +593,7 @@ static void vlapic_write(struct vcpu *v,
{
case APIC_TASKPRI:
vlapic_set_reg(vlapic, APIC_TASKPRI, val & 0xff);
+ hvm_update_vtpr(v, (val >> 4) & 0x0f);
break;
case APIC_EOI:
diff -r b998ae45c076 -r 588dd80b56b5 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c Wed Jan 31 18:15:48 2007 +0000
+++ b/xen/arch/x86/hvm/vmx/vmx.c Wed Jan 31 19:37:44 2007 +0000
@@ -986,6 +986,11 @@ static void vmx_inject_exception(
v->arch.hvm_vmx.cpu_cr2 = cr2;
}
+static void vmx_update_vtpr(struct vcpu *v, unsigned long value)
+{
+ /* VMX doesn't have a V_TPR field */
+}
+
/* Setup HVM interfaces */
static void vmx_setup_hvm_funcs(void)
{
@@ -1010,6 +1015,8 @@ static void vmx_setup_hvm_funcs(void)
hvm_funcs.update_host_cr3 = vmx_update_host_cr3;
hvm_funcs.update_guest_cr3 = vmx_update_guest_cr3;
+
+ hvm_funcs.update_vtpr = vmx_update_vtpr;
hvm_funcs.stts = vmx_stts;
hvm_funcs.set_tsc_offset = vmx_set_tsc_offset;
diff -r b998ae45c076 -r 588dd80b56b5 xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h Wed Jan 31 18:15:48 2007 +0000
+++ b/xen/include/asm-x86/hvm/hvm.h Wed Jan 31 19:37:44 2007 +0000
@@ -115,6 +115,11 @@ struct hvm_function_table {
void (*update_guest_cr3)(struct vcpu *v);
/*
+ * Reflect the virtual APIC's value in the guest's V_TPR register
+ */
+ void (*update_vtpr)(struct vcpu *v, unsigned long value);
+
+ /*
* Update specifics of the guest state:
* 1) TS bit in guest cr0
* 2) TSC offset in guest
@@ -201,6 +206,12 @@ hvm_update_host_cr3(struct vcpu *v)
hvm_update_host_cr3(struct vcpu *v)
{
hvm_funcs.update_host_cr3(v);
+}
+
+static inline void
+hvm_update_vtpr(struct vcpu *v, unsigned long value)
+{
+ hvm_funcs.update_vtpr(v, value);
}
void hvm_update_guest_cr3(struct vcpu *v, unsigned long guest_cr3);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|