[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH 15/23] X86/vioapic: Hook interrupt delivery of vIOAPIC
On 2017年04月17日 22:43, Konrad Rzeszutek Wilk wrote: > On Fri, Mar 17, 2017 at 07:27:15PM +0800, Lan Tianyu wrote: >> From: Chao Gao <chao.gao@xxxxxxxxx> >> >> When irq remapping enabled, IOAPIC Redirection Entry maybe is in remapping >> format. If that, generate a irq_remapping_request and send it to domain. >> >> Signed-off-by: Chao Gao <chao.gao@xxxxxxxxx> >> Signed-off-by: Lan Tianyu <tianyu.lan@xxxxxxxxx> >> --- >> xen/arch/x86/Makefile | 1 + >> xen/arch/x86/hvm/vioapic.c | 10 ++++++++++ >> xen/arch/x86/viommu.c | 30 ++++++++++++++++++++++++++++++ >> xen/include/asm-x86/viommu.h | 3 +++ >> xen/include/public/arch-x86/hvm/save.h | 1 + >> 5 files changed, 45 insertions(+) >> create mode 100644 xen/arch/x86/viommu.c >> >> diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile >> index f75eca0..d49f8c8 100644 >> --- a/xen/arch/x86/Makefile >> +++ b/xen/arch/x86/Makefile >> @@ -66,6 +66,7 @@ obj-y += usercopy.o >> obj-y += x86_emulate.o >> obj-$(CONFIG_TBOOT) += tboot.o >> obj-y += hpet.o >> +obj-y += viommu.o >> obj-y += vm_event.o >> obj-y += xstate.o >> >> diff --git a/xen/arch/x86/hvm/vioapic.c b/xen/arch/x86/hvm/vioapic.c >> index fdbb21f..6a00644 100644 >> --- a/xen/arch/x86/hvm/vioapic.c >> +++ b/xen/arch/x86/hvm/vioapic.c >> @@ -30,6 +30,7 @@ >> #include <xen/lib.h> >> #include <xen/errno.h> >> #include <xen/sched.h> >> +#include <xen/viommu.h> >> #include <public/hvm/ioreq.h> >> #include <asm/hvm/io.h> >> #include <asm/hvm/vpic.h> >> @@ -285,9 +286,18 @@ static void vioapic_deliver(struct hvm_hw_vioapic >> *vioapic, int irq) >> struct domain *d = vioapic_domain(vioapic); >> struct vlapic *target; >> struct vcpu *v; >> + struct irq_remapping_request request; >> >> ASSERT(spin_is_locked(&d->arch.hvm_domain.irq_lock)); >> >> + if ( vioapic->redirtbl[irq].ir.format ) >> + { >> + irq_request_ioapic_fill(&request, vioapic->id, >> + vioapic->redirtbl[irq].bits); >> + viommu_handle_irq_request(d, &request); >> + return; >> + } >> + >> HVM_DBG_LOG(DBG_LEVEL_IOAPIC, >> "dest=%x dest_mode=%x delivery_mode=%x " >> "vector=%x trig_mode=%x", >> diff --git a/xen/arch/x86/viommu.c b/xen/arch/x86/viommu.c >> new file mode 100644 >> index 0000000..ef78d3b >> --- /dev/null >> +++ b/xen/arch/x86/viommu.c >> @@ -0,0 +1,30 @@ >> +/* >> + * viommu.c >> + * >> + * virtualize IOMMU. >> + * >> + * Copyright (C) 2017 Chao Gao, Intel Corporation. >> + * >> + * This program is free software; you can redistribute it and/or >> + * modify it under the terms and conditions of the GNU General Public >> + * License, version 2, as published by the Free Software Foundation. >> + * >> + * This program is distributed in the hope that it will be useful, >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> + * General Public License for more details. >> + * >> + * You should have received a copy of the GNU General Public >> + * License along with this program; If not, see >> <http://www.gnu.org/licenses/>. >> + */ >> + >> +#include <xen/viommu.h> >> + >> +void irq_request_ioapic_fill(struct irq_remapping_request *req, >> + uint32_t ioapic_id, uint64_t rte) >> +{ >> + ASSERT(req); >> + req->type = VIOMMU_REQUEST_IRQ_APIC; >> + req->source_id = ioapic_id; >> + req->msg.rte = rte; > > Considering we get 'req' from the stack and it may have garbage, would > it be good to fill out the rest of the entries with sensible values? Or > is there no need for that? Both AMD and Intel will use the function to pass interrupt remapping request. I am afraid different vendors may have different IOAPIC remapping format. How about to parse and check remapping request data in the vendor vIOMMU device module(E,G vvtd)? :) >> +} > > This being a new file, you should probably include the nice > editor configuration block. OK. Will add it. > >> diff --git a/xen/include/asm-x86/viommu.h b/xen/include/asm-x86/viommu.h >> index 0b25f34..fcf3c24 100644 >> --- a/xen/include/asm-x86/viommu.h >> +++ b/xen/include/asm-x86/viommu.h >> @@ -49,6 +49,9 @@ struct irq_remapping_request >> } msg; >> }; >> >> +void irq_request_ioapic_fill(struct irq_remapping_request *req, >> + uint32_t ioapic_id, uint64_t rte); >> + >> static inline const struct viommu_ops *viommu_get_ops(void) >> { >> /* >> diff --git a/xen/include/public/arch-x86/hvm/save.h >> b/xen/include/public/arch-x86/hvm/save.h >> index 6127f89..06be4a5 100644 >> --- a/xen/include/public/arch-x86/hvm/save.h >> +++ b/xen/include/public/arch-x86/hvm/save.h >> @@ -401,6 +401,7 @@ struct hvm_hw_vioapic { >> uint8_t reserved[4]; >> uint8_t dest_id; >> } fields; >> + struct ir_ioapic_rte ir; >> } redirtbl[VIOAPIC_NUM_PINS]; >> }; >> >> -- >> 1.8.3.1 >> >> >> _______________________________________________ >> Xen-devel mailing list >> Xen-devel@xxxxxxxxxxxxx >> https://lists.xen.org/xen-devel -- Best regards Tianyu Lan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |