|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [Patch RFC 07/13] vt-d: If the qi_flag is Set, the domain's vCPUs are not allowed to
entry guest mode and put into the SCHEDOP_yield list.
Signed-off-by: Quan Xu <quan.xu@xxxxxxxxx>
---
xen/arch/x86/hvm/vmx/entry.S | 10 ++++++++++
xen/arch/x86/x86_64/asm-offsets.c | 1 +
xen/common/domain.c | 5 +++++
xen/include/xen/hvm/iommu.h | 2 ++
4 files changed, 18 insertions(+)
diff --git a/xen/arch/x86/hvm/vmx/entry.S b/xen/arch/x86/hvm/vmx/entry.S
index 2a4ed57..53a4c58 100644
--- a/xen/arch/x86/hvm/vmx/entry.S
+++ b/xen/arch/x86/hvm/vmx/entry.S
@@ -66,6 +66,10 @@ ENTRY(vmx_asm_vmexit_handler)
cmp %ecx,(%rdx,%rax,1)
jnz .Lvmx_process_softirqs
+ mov VCPU_domain(%rbx),%rax
+ cmp $0,QI_flag(%rax)
+ jne .Lqi_flushing
+
cmp %cl,VCPU_vmx_emulate(%rbx)
jne .Lvmx_goto_emulator
cmp %cl,VCPU_vmx_realmode(%rbx)
@@ -125,3 +129,9 @@ ENTRY(vmx_asm_do_vmentry)
sti
call do_softirq
jmp .Lvmx_do_vmentry
+
+.Lqi_flushing:
+ sti
+ mov %rax,%rdi
+ call do_qi_flushing
+ jmp .Lvmx_do_vmentry
diff --git a/xen/arch/x86/x86_64/asm-offsets.c
b/xen/arch/x86/x86_64/asm-offsets.c
index 447c650..d26b026 100644
--- a/xen/arch/x86/x86_64/asm-offsets.c
+++ b/xen/arch/x86/x86_64/asm-offsets.c
@@ -116,6 +116,7 @@ void __dummy__(void)
BLANK();
OFFSET(DOMAIN_is_32bit_pv, struct domain, arch.is_32bit_pv);
+ OFFSET(QI_flag, struct domain, arch.hvm_domain.hvm_iommu.qi_flag);
BLANK();
OFFSET(VMCB_rax, struct vmcb_struct, rax);
diff --git a/xen/common/domain.c b/xen/common/domain.c
index 1b9fcfc..1f62e3b 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -1479,6 +1479,11 @@ int continue_hypercall_on_cpu(
return 0;
}
+void do_qi_flushing(struct domain *d)
+{
+ do_sched_op(SCHEDOP_yield, guest_handle_from_ptr(NULL, void));
+}
+
/*
* Local variables:
* mode: C
diff --git a/xen/include/xen/hvm/iommu.h b/xen/include/xen/hvm/iommu.h
index e838905..e40fc7b 100644
--- a/xen/include/xen/hvm/iommu.h
+++ b/xen/include/xen/hvm/iommu.h
@@ -57,6 +57,8 @@ struct hvm_iommu {
DECLARE_BITMAP(features, IOMMU_FEAT_count);
};
+void do_qi_flushing(struct domain *d);
+
#define iommu_set_feature(d, f) set_bit((f), domain_hvm_iommu(d)->features)
#define iommu_clear_feature(d, f) clear_bit((f), domain_hvm_iommu(d)->features)
--
1.8.3.2
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |