# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID 33955ca54ec1b04d304c809f2b59ca72a9d580cd
# Parent 7c6aaa106f15c5626141332e38e06d125bdbe5e2
[HVM][SVM] Add cr8 intercept to/from code for SVM.
Add proper vlapic unmapping and freeing in the svm relinquish
resources.
Signed-off-by: Tom Woller <thomas.woller@xxxxxxx>=20
---
xen/arch/x86/hvm/svm/svm.c | 20 +++++++++++++++-----
1 files changed, 15 insertions(+), 5 deletions(-)
diff -r 7c6aaa106f15 -r 33955ca54ec1 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c Tue Sep 19 11:03:12 2006 +0100
+++ b/xen/arch/x86/hvm/svm/svm.c Tue Sep 19 11:03:36 2006 +0100
@@ -56,6 +56,7 @@ extern void do_nmi(struct cpu_user_regs
extern void do_nmi(struct cpu_user_regs *, unsigned long);
extern int inst_copy_from_guest(unsigned char *buf, unsigned long guest_eip,
int inst_len);
+ extern uint32_t vlapic_update_ppr(struct vlapic *vlapic);
extern asmlinkage void do_IRQ(struct cpu_user_regs *);
extern void send_pio_req(struct cpu_user_regs *regs, unsigned long port,
unsigned long count, int size, long value, int dir,
int pvalid);
@@ -896,8 +897,11 @@ static void svm_relinquish_guest_resourc
if ( hvm_apic_support(v->domain) && (VLAPIC(v) != NULL) )
{
kill_timer( &(VLAPIC(v)->vlapic_timer) );
+ unmap_domain_page_global(VLAPIC(v)->regs);
+ free_domheap_page(VLAPIC(v)->regs_page);
xfree(VLAPIC(v));
}
+ hvm_release_assist_channel(v);
}
kill_timer(&d->arch.hvm_domain.pl_time.periodic_tm.timer);
@@ -1599,6 +1603,7 @@ static void mov_from_cr(int cr, int gp,
{
unsigned long value = 0;
struct vcpu *v = current;
+ struct vlapic *vlapic = VLAPIC(v);
struct vmcb_struct *vmcb;
vmcb = v->arch.hvm_svm.vmcb;
@@ -1625,11 +1630,8 @@ static void mov_from_cr(int cr, int gp,
printk( "CR4 read=%lx\n", value );
break;
case 8:
-#if 0
- value = vmcb->m_cr8;
-#else
- ASSERT(0);
-#endif
+ value = (unsigned long)vlapic_get_reg(vlapic, APIC_TASKPRI);
+ value = (value & 0xF0) >> 4;
break;
default:
@@ -1656,6 +1658,7 @@ static int mov_to_cr(int gpreg, int cr,
unsigned long value;
unsigned long old_cr;
struct vcpu *v = current;
+ struct vlapic *vlapic = VLAPIC(v);
struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
ASSERT(vmcb);
@@ -1799,6 +1802,13 @@ static int mov_to_cr(int gpreg, int cr,
set_bit(ARCH_SVM_VMCB_ASSIGN_ASID, &v->arch.hvm_svm.flags);
shadow_update_paging_modes(v);
}
+ break;
+ }
+
+ case 8:
+ {
+ vlapic_set_reg(vlapic, APIC_TASKPRI, ((value & 0x0F) << 4));
+ vlapic_update_ppr(vlapic);
break;
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|