From owner-freebsd-current@FreeBSD.ORG Tue Jan 21 19:03:21 2014 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id CBA09562; Tue, 21 Jan 2014 19:03:21 +0000 (UTC) Received: from bigwig.baldwin.cx (bigwig.baldwin.cx [IPv6:2001:470:1f11:75::1]) (using TLSv1 with cipher ADH-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id A0E531E15; Tue, 21 Jan 2014 19:03:21 +0000 (UTC) Received: from jhbbsd.localnet (unknown [209.249.190.124]) by bigwig.baldwin.cx (Postfix) with ESMTPSA id 5EBAEB946; Tue, 21 Jan 2014 14:03:20 -0500 (EST) From: John Baldwin To: Roger Pau Monne Subject: Re: [PATCH RFC 05/13] xen: implement Xen IO APIC ops Date: Tue, 21 Jan 2014 13:55:13 -0500 User-Agent: KMail/1.13.5 (FreeBSD/8.4-CBSD-20130906; KDE/4.5.5; amd64; ; ) References: <1387884062-41154-1-git-send-email-roger.pau@citrix.com> <1387884062-41154-6-git-send-email-roger.pau@citrix.com> In-Reply-To: <1387884062-41154-6-git-send-email-roger.pau@citrix.com> MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-15" Content-Transfer-Encoding: 7bit Message-Id: <201401211355.13800.jhb@freebsd.org> X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.7 (bigwig.baldwin.cx); Tue, 21 Jan 2014 14:03:20 -0500 (EST) Cc: julien.grall@citrix.com, freebsd-xen@freebsd.org, freebsd-current@freebsd.org, kib@freebsd.org, xen-devel@lists.xenproject.org, gibbs@freebsd.org X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jan 2014 19:03:22 -0000 On Tuesday, December 24, 2013 6:20:54 am Roger Pau Monne wrote: > Implement a different set of hooks for IO APIC to use when running > under Xen Dom0. > --- > sys/x86/xen/pv.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 44 insertions(+), 0 deletions(-) > > diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c > index ab4afba..e5ad200 100644 > --- a/sys/x86/xen/pv.c > +++ b/sys/x86/xen/pv.c > @@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$"); > #include > #include > > +#include > #include > #include > #include > @@ -58,6 +59,7 @@ __FBSDID("$FreeBSD$"); > #include > #include > #include > +#include > > #include > > @@ -73,6 +75,11 @@ static caddr_t xen_pv_parse_preload_data(u_int64_t); > static void xen_pv_parse_memmap(caddr_t, vm_paddr_t *, int *); > > static void xen_pv_set_init_ops(void); > + > +static u_int xen_pv_ioapic_read(volatile ioapic_t *, int); > +static void xen_pv_ioapic_write(volatile ioapic_t *, int, u_int); > +static void xen_pv_ioapic_register_intr(struct ioapic_intsrc *); > + > /*---------------------------- Extern Declarations ---------------------------*/ > /* Variables used by amd64 mp_machdep to start APs */ > extern struct mtx ap_boot_mtx; > @@ -92,6 +99,13 @@ struct init_ops xen_init_ops = { > .parse_memmap = xen_pv_parse_memmap, > }; > > +/* Xen ioapic_ops implementation */ > +struct ioapic_ops xen_ioapic_ops = { > + .read = xen_pv_ioapic_read, > + .write = xen_pv_ioapic_write, > + .register_intr = xen_pv_ioapic_register_intr, > +}; > + > static struct > { > const char *ev; > @@ -342,6 +356,34 @@ xen_pv_parse_memmap(caddr_t kmdp, vm_paddr_t *physmap, int *physmap_idx) > bios_add_smap_entries(xen_smap, size, physmap, physmap_idx); > } > > +static u_int > +xen_pv_ioapic_read(volatile ioapic_t *apic, int reg) > +{ > + struct physdev_apic apic_op; > + int rc; > + > + mtx_assert(&icu_lock, MA_OWNED); > + > + apic_op.apic_physbase = pmap_kextract((vm_offset_t) apic); Seems a shame to have to do this. I wouldn't mind if you changed the read/write callbacks to take 'struct ioapic *' instead and then use the 'io_paddr' member. I do think that would be cleaner. > + apic_op.reg = reg; > + rc = HYPERVISOR_physdev_op(PHYSDEVOP_apic_read, &apic_op); > + if (rc) > + panic("apic_read operation failed"); > + > + return (apic_op.value); > +} > + > +static void > +xen_pv_ioapic_write(volatile ioapic_t *apic, int reg, u_int val) > +{ > +} I guess not allowing writes is on purpose? > + > +static void > +xen_pv_ioapic_register_intr(struct ioapic_intsrc *pin) > +{ > + xen_register_pirq(pin->io_irq, pin->io_activehi, pin->io_edgetrigger); > +} > + > static void > xen_pv_set_init_ops(void) > { > @@ -349,4 +391,6 @@ xen_pv_set_init_ops(void) > init_ops = xen_init_ops; > /* Disable lapic */ > lapic_disabled = true; > + /* IOAPIC ops for Xen PV */ > + ioapic_ops = xen_ioapic_ops; > } > -- > 1.7.7.5 (Apple Git-26) > > -- John Baldwin