Date: Mon, 16 Jun 2014 08:54:05 +0000 (UTC) From: Roger Pau Monné <royger@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r267536 - in head/sys: dev/xen/pvcpu x86/xen xen Message-ID: <201406160854.s5G8s5fI079109@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: royger Date: Mon Jun 16 08:54:04 2014 New Revision: 267536 URL: http://svnweb.freebsd.org/changeset/base/267536 Log: xen: add missing files Commit missing files that actually belong to previous commits. Sponsored by: Citrix Systems R&D Approved by: gibbs Added: head/sys/dev/xen/pvcpu/ head/sys/dev/xen/pvcpu/pvcpu.c (contents, props changed) head/sys/x86/xen/xen_apic.c (contents, props changed) head/sys/x86/xen/xen_nexus.c (contents, props changed) head/sys/x86/xen/xenpv.c (contents, props changed) head/sys/xen/xen_pv.h (contents, props changed) Added: head/sys/dev/xen/pvcpu/pvcpu.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/dev/xen/pvcpu/pvcpu.c Mon Jun 16 08:54:04 2014 (r267536) @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2013 Roger Pau Monné <roger.pau@citrix.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/bus.h> +#include <sys/kernel.h> +#include <sys/module.h> +#include <sys/pcpu.h> +#include <sys/smp.h> + +#include <xen/xen-os.h> + +/* + * Dummy Xen cpu device + * + * Since there's no ACPI on PVH guests, we need to create a dummy + * CPU device in order to fill the pcpu->pc_device field. + */ + +static void +xenpvcpu_identify(driver_t *driver, device_t parent) +{ + int i; + + /* Only attach to PV guests, HVM guests use the ACPI CPU devices */ + if (!xen_pv_domain()) + return; + + CPU_FOREACH(i) { + if (BUS_ADD_CHILD(parent, 0, "pvcpu", i) == NULL) + panic("Unable to add Xen PV CPU device."); + } +} + +static int +xenpvcpu_probe(device_t dev) +{ + + device_set_desc(dev, "Xen PV CPU"); + return (BUS_PROBE_NOWILDCARD); +} + +static int +xenpvcpu_attach(device_t dev) +{ + struct pcpu *pc; + int cpu; + + cpu = device_get_unit(dev); + pc = pcpu_find(cpu); + pc->pc_device = dev; + return (0); +} + +static device_method_t xenpvcpu_methods[] = { + DEVMETHOD(device_identify, xenpvcpu_identify), + DEVMETHOD(device_probe, xenpvcpu_probe), + DEVMETHOD(device_attach, xenpvcpu_attach), + + DEVMETHOD_END +}; + +static driver_t xenpvcpu_driver = { + "pvcpu", + xenpvcpu_methods, + 0, +}; + +devclass_t xenpvcpu_devclass; + +DRIVER_MODULE(xenpvcpu, xenpv, xenpvcpu_driver, xenpvcpu_devclass, 0, 0); +MODULE_DEPEND(xenpvcpu, xenpv, 1, 1, 1); Added: head/sys/x86/xen/xen_apic.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/x86/xen/xen_apic.c Mon Jun 16 08:54:04 2014 (r267536) @@ -0,0 +1,546 @@ +/* + * Copyright (c) 2014 Roger Pau Monné <roger.pau@citrix.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/bus.h> +#include <sys/kernel.h> +#include <sys/malloc.h> +#include <sys/proc.h> +#include <sys/smp.h> +#include <sys/systm.h> + +#include <vm/vm.h> +#include <vm/pmap.h> + +#include <machine/cpufunc.h> +#include <machine/cpu.h> +#include <machine/smp.h> + +#include <x86/apicreg.h> + +#include <xen/xen-os.h> +#include <xen/features.h> +#include <xen/gnttab.h> +#include <xen/hypervisor.h> +#include <xen/hvm.h> +#include <xen/xen_intr.h> + +#include <xen/interface/vcpu.h> + +/*--------------------------------- Macros -----------------------------------*/ + +#define XEN_APIC_UNSUPPORTED \ + panic("%s: not available in Xen PV port.", __func__) + + +/*--------------------------- Forward Declarations ---------------------------*/ +#ifdef SMP +static driver_filter_t xen_smp_rendezvous_action; +static driver_filter_t xen_invltlb; +static driver_filter_t xen_invlpg; +static driver_filter_t xen_invlrng; +static driver_filter_t xen_invlcache; +#ifdef __i386__ +static driver_filter_t xen_lazypmap; +#endif +static driver_filter_t xen_ipi_bitmap_handler; +static driver_filter_t xen_cpustop_handler; +static driver_filter_t xen_cpususpend_handler; +static driver_filter_t xen_cpustophard_handler; +#endif + +/*---------------------------- Extern Declarations ---------------------------*/ +/* Variables used by mp_machdep to perform the MMU related IPIs */ +#ifdef __i386__ +extern void pmap_lazyfix_action(void); +#endif +#ifdef __amd64__ +extern int pmap_pcid_enabled; +#endif + +extern int xen_vector_callback_enabled; + +/*---------------------------------- Macros ----------------------------------*/ +#define IPI_TO_IDX(ipi) ((ipi) - APIC_IPI_INTS) + +/*--------------------------------- Xen IPIs ---------------------------------*/ +#ifdef SMP +struct xen_ipi_handler +{ + driver_filter_t *filter; + const char *description; +}; + +static struct xen_ipi_handler xen_ipis[] = +{ + [IPI_TO_IDX(IPI_RENDEZVOUS)] = { xen_smp_rendezvous_action, "r" }, + [IPI_TO_IDX(IPI_INVLTLB)] = { xen_invltlb, "itlb"}, + [IPI_TO_IDX(IPI_INVLPG)] = { xen_invlpg, "ipg" }, + [IPI_TO_IDX(IPI_INVLRNG)] = { xen_invlrng, "irg" }, + [IPI_TO_IDX(IPI_INVLCACHE)] = { xen_invlcache, "ic" }, +#ifdef __i386__ + [IPI_TO_IDX(IPI_LAZYPMAP)] = { xen_lazypmap, "lp" }, +#endif + [IPI_TO_IDX(IPI_BITMAP_VECTOR)] = { xen_ipi_bitmap_handler, "b" }, + [IPI_TO_IDX(IPI_STOP)] = { xen_cpustop_handler, "st" }, + [IPI_TO_IDX(IPI_SUSPEND)] = { xen_cpususpend_handler, "sp" }, + [IPI_TO_IDX(IPI_STOP_HARD)] = { xen_cpustophard_handler, "sth" }, +}; +#endif + +/*------------------------------- Per-CPU Data -------------------------------*/ +#ifdef SMP +DPCPU_DEFINE(xen_intr_handle_t, ipi_handle[nitems(xen_ipis)]); +#endif + +/*------------------------------- Xen PV APIC --------------------------------*/ + +static void +xen_pv_lapic_create(u_int apic_id, int boot_cpu) +{ +#ifdef SMP + cpu_add(apic_id, boot_cpu); +#endif +} + +static void +xen_pv_lapic_init(vm_paddr_t addr) +{ + +} + +static void +xen_pv_lapic_setup(int boot) +{ + +} + +static void +xen_pv_lapic_dump(const char *str) +{ + + printf("cpu%d %s XEN PV LAPIC\n", PCPU_GET(cpuid), str); +} + +static void +xen_pv_lapic_disable(void) +{ + +} + +static void +xen_pv_lapic_eoi(void) +{ + + XEN_APIC_UNSUPPORTED; +} + +static int +xen_pv_lapic_id(void) +{ + + return (PCPU_GET(apic_id)); +} + +static int +xen_pv_lapic_intr_pending(u_int vector) +{ + + XEN_APIC_UNSUPPORTED; + return (0); +} + +static u_int +xen_pv_apic_cpuid(u_int apic_id) +{ +#ifdef SMP + return (apic_cpuids[apic_id]); +#else + return (0); +#endif +} + +static u_int +xen_pv_apic_alloc_vector(u_int apic_id, u_int irq) +{ + + XEN_APIC_UNSUPPORTED; + return (0); +} + +static u_int +xen_pv_apic_alloc_vectors(u_int apic_id, u_int *irqs, u_int count, u_int align) +{ + + XEN_APIC_UNSUPPORTED; + return (0); +} + +static void +xen_pv_apic_disable_vector(u_int apic_id, u_int vector) +{ + + XEN_APIC_UNSUPPORTED; +} + +static void +xen_pv_apic_enable_vector(u_int apic_id, u_int vector) +{ + + XEN_APIC_UNSUPPORTED; +} + +static void +xen_pv_apic_free_vector(u_int apic_id, u_int vector, u_int irq) +{ + + XEN_APIC_UNSUPPORTED; +} + +static void +xen_pv_lapic_set_logical_id(u_int apic_id, u_int cluster, u_int cluster_id) +{ + + XEN_APIC_UNSUPPORTED; +} + +static int +xen_pv_lapic_enable_pmc(void) +{ + + XEN_APIC_UNSUPPORTED; + return (0); +} + +static void +xen_pv_lapic_disable_pmc(void) +{ + + XEN_APIC_UNSUPPORTED; +} + +static void +xen_pv_lapic_reenable_pmc(void) +{ + + XEN_APIC_UNSUPPORTED; +} + +static void +xen_pv_lapic_enable_cmc(void) +{ + +} + +static void +xen_pv_lapic_ipi_raw(register_t icrlo, u_int dest) +{ + + XEN_APIC_UNSUPPORTED; +} + +static void +xen_pv_lapic_ipi_vectored(u_int vector, int dest) +{ + xen_intr_handle_t *ipi_handle; + int ipi_idx, to_cpu, self; + + ipi_idx = IPI_TO_IDX(vector); + if (ipi_idx > nitems(xen_ipis)) + panic("IPI out of range"); + + switch(dest) { + case APIC_IPI_DEST_SELF: + ipi_handle = DPCPU_GET(ipi_handle); + xen_intr_signal(ipi_handle[ipi_idx]); + break; + case APIC_IPI_DEST_ALL: + CPU_FOREACH(to_cpu) { + ipi_handle = DPCPU_ID_GET(to_cpu, ipi_handle); + xen_intr_signal(ipi_handle[ipi_idx]); + } + break; + case APIC_IPI_DEST_OTHERS: + self = PCPU_GET(cpuid); + CPU_FOREACH(to_cpu) { + if (to_cpu != self) { + ipi_handle = DPCPU_ID_GET(to_cpu, ipi_handle); + xen_intr_signal(ipi_handle[ipi_idx]); + } + } + break; + default: + to_cpu = apic_cpuid(dest); + ipi_handle = DPCPU_ID_GET(to_cpu, ipi_handle); + xen_intr_signal(ipi_handle[ipi_idx]); + break; + } +} + +static int +xen_pv_lapic_ipi_wait(int delay) +{ + + XEN_APIC_UNSUPPORTED; + return (0); +} + +static int +xen_pv_lapic_set_lvt_mask(u_int apic_id, u_int lvt, u_char masked) +{ + + XEN_APIC_UNSUPPORTED; + return (0); +} + +static int +xen_pv_lapic_set_lvt_mode(u_int apic_id, u_int lvt, uint32_t mode) +{ + + XEN_APIC_UNSUPPORTED; + return (0); +} + +static int +xen_pv_lapic_set_lvt_polarity(u_int apic_id, u_int lvt, enum intr_polarity pol) +{ + + XEN_APIC_UNSUPPORTED; + return (0); +} + +static int +xen_pv_lapic_set_lvt_triggermode(u_int apic_id, u_int lvt, + enum intr_trigger trigger) +{ + + XEN_APIC_UNSUPPORTED; + return (0); +} + +/* Xen apic_ops implementation */ +struct apic_ops xen_apic_ops = { + .create = xen_pv_lapic_create, + .init = xen_pv_lapic_init, + .setup = xen_pv_lapic_setup, + .dump = xen_pv_lapic_dump, + .disable = xen_pv_lapic_disable, + .eoi = xen_pv_lapic_eoi, + .id = xen_pv_lapic_id, + .intr_pending = xen_pv_lapic_intr_pending, + .set_logical_id = xen_pv_lapic_set_logical_id, + .cpuid = xen_pv_apic_cpuid, + .alloc_vector = xen_pv_apic_alloc_vector, + .alloc_vectors = xen_pv_apic_alloc_vectors, + .enable_vector = xen_pv_apic_enable_vector, + .disable_vector = xen_pv_apic_disable_vector, + .free_vector = xen_pv_apic_free_vector, + .enable_pmc = xen_pv_lapic_enable_pmc, + .disable_pmc = xen_pv_lapic_disable_pmc, + .reenable_pmc = xen_pv_lapic_reenable_pmc, + .enable_cmc = xen_pv_lapic_enable_cmc, + .ipi_raw = xen_pv_lapic_ipi_raw, + .ipi_vectored = xen_pv_lapic_ipi_vectored, + .ipi_wait = xen_pv_lapic_ipi_wait, + .set_lvt_mask = xen_pv_lapic_set_lvt_mask, + .set_lvt_mode = xen_pv_lapic_set_lvt_mode, + .set_lvt_polarity = xen_pv_lapic_set_lvt_polarity, + .set_lvt_triggermode = xen_pv_lapic_set_lvt_triggermode, +}; + +#ifdef SMP +/*---------------------------- XEN PV IPI Handlers ---------------------------*/ +/* + * These are C clones of the ASM functions found in apic_vector. + */ +static int +xen_ipi_bitmap_handler(void *arg) +{ + struct trapframe *frame; + + frame = arg; + ipi_bitmap_handler(*frame); + return (FILTER_HANDLED); +} + +static int +xen_smp_rendezvous_action(void *arg) +{ +#ifdef COUNT_IPIS + (*ipi_rendezvous_counts[PCPU_GET(cpuid)])++; +#endif /* COUNT_IPIS */ + + smp_rendezvous_action(); + return (FILTER_HANDLED); +} + +static int +xen_invltlb(void *arg) +{ + + invltlb_handler(); + return (FILTER_HANDLED); +} + +#ifdef __amd64__ +static int +xen_invltlb_pcid(void *arg) +{ + + invltlb_pcid_handler(); + return (FILTER_HANDLED); +} +#endif + +static int +xen_invlpg(void *arg) +{ + + invlpg_handler(); + return (FILTER_HANDLED); +} + +#ifdef __amd64__ +static int +xen_invlpg_pcid(void *arg) +{ + + invlpg_pcid_handler(); + return (FILTER_HANDLED); +} +#endif + +static int +xen_invlrng(void *arg) +{ + + invlrng_handler(); + return (FILTER_HANDLED); +} + +static int +xen_invlcache(void *arg) +{ + + invlcache_handler(); + return (FILTER_HANDLED); +} + +#ifdef __i386__ +static int +xen_lazypmap(void *arg) +{ + + pmap_lazyfix_action(); + return (FILTER_HANDLED); +} +#endif + +static int +xen_cpustop_handler(void *arg) +{ + + cpustop_handler(); + return (FILTER_HANDLED); +} + +static int +xen_cpususpend_handler(void *arg) +{ + + cpususpend_handler(); + return (FILTER_HANDLED); +} + +static int +xen_cpustophard_handler(void *arg) +{ + + ipi_nmi_handler(); + return (FILTER_HANDLED); +} + +/*----------------------------- XEN PV IPI setup -----------------------------*/ +/* + * Those functions are provided outside of the Xen PV APIC implementation + * so PVHVM guests can also use PV IPIs without having an actual Xen PV APIC, + * because on PVHVM there's an emulated LAPIC provided by Xen. + */ +static void +xen_cpu_ipi_init(int cpu) +{ + xen_intr_handle_t *ipi_handle; + const struct xen_ipi_handler *ipi; + device_t dev; + int idx, rc; + + ipi_handle = DPCPU_ID_GET(cpu, ipi_handle); + dev = pcpu_find(cpu)->pc_device; + KASSERT((dev != NULL), ("NULL pcpu device_t")); + + for (ipi = xen_ipis, idx = 0; idx < nitems(xen_ipis); ipi++, idx++) { + + if (ipi->filter == NULL) { + ipi_handle[idx] = NULL; + continue; + } + + rc = xen_intr_alloc_and_bind_ipi(dev, cpu, ipi->filter, + INTR_TYPE_TTY, &ipi_handle[idx]); + if (rc != 0) + panic("Unable to allocate a XEN IPI port"); + xen_intr_describe(ipi_handle[idx], "%s", ipi->description); + } +} + +static void +xen_setup_cpus(void) +{ + int i; + + if (!xen_vector_callback_enabled) + return; + +#ifdef __amd64__ + if (pmap_pcid_enabled) { + xen_ipis[IPI_TO_IDX(IPI_INVLTLB)].filter = xen_invltlb_pcid; + xen_ipis[IPI_TO_IDX(IPI_INVLPG)].filter = xen_invlpg_pcid; + } +#endif + CPU_FOREACH(i) + xen_cpu_ipi_init(i); + + /* Set the xen pv ipi ops to replace the native ones */ + if (xen_hvm_domain()) + apic_ops.ipi_vectored = xen_pv_lapic_ipi_vectored; +} + +/* We need to setup IPIs before APs are started */ +SYSINIT(xen_setup_cpus, SI_SUB_SMP-1, SI_ORDER_FIRST, xen_setup_cpus, NULL); +#endif /* SMP */ Added: head/sys/x86/xen/xen_nexus.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/x86/xen/xen_nexus.c Mon Jun 16 08:54:04 2014 (r267536) @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2013 Roger Pau Monné <roger.pau@citrix.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/bus.h> +#include <sys/kernel.h> +#include <sys/module.h> +#include <sys/sysctl.h> +#include <sys/systm.h> +#include <sys/smp.h> + +#include <machine/nexusvar.h> + +#include <xen/xen-os.h> + +/* + * Xen nexus(4) driver. + */ +static int +nexus_xen_probe(device_t dev) +{ + + if (!xen_pv_domain()) + return (ENXIO); + + return (BUS_PROBE_DEFAULT); +} + +static int +nexus_xen_attach(device_t dev) +{ + + nexus_init_resources(); + bus_generic_probe(dev); + bus_generic_attach(dev); + + return (0); +} + +static device_method_t nexus_xen_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, nexus_xen_probe), + DEVMETHOD(device_attach, nexus_xen_attach), + + { 0, 0 } +}; + +DEFINE_CLASS_1(nexus, nexus_xen_driver, nexus_xen_methods, 1, nexus_driver); +static devclass_t nexus_devclass; + +DRIVER_MODULE(nexus_xen, root, nexus_xen_driver, nexus_devclass, 0, 0); Added: head/sys/x86/xen/xenpv.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/x86/xen/xenpv.c Mon Jun 16 08:54:04 2014 (r267536) @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2014 Roger Pau Monné <roger.pau@citrix.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/bus.h> +#include <sys/kernel.h> +#include <sys/module.h> +#include <sys/pcpu.h> +#include <sys/smp.h> + +#include <xen/xen-os.h> +#include <xen/gnttab.h> + +static devclass_t xenpv_devclass; + +static void +xenpv_identify(driver_t *driver, device_t parent) +{ + if (!xen_domain()) + return; + + /* Make sure there's only one xenpv device. */ + if (devclass_get_device(xenpv_devclass, 0)) + return; + + if (BUS_ADD_CHILD(parent, 0, "xenpv", 0) == NULL) + panic("Unable to attach xenpv bus."); +} + +static int +xenpv_probe(device_t dev) +{ + + device_set_desc(dev, "Xen PV bus"); + return (BUS_PROBE_NOWILDCARD); +} + +static int +xenpv_attach(device_t dev) +{ + device_t child; + int error; + + /* Initialize grant table before any Xen specific device is attached */ + error = gnttab_init(dev); + if (error != 0) { + device_printf(dev, "error initializing grant table: %d\n", + error); + return (error); + } + + /* + * Let our child drivers identify any child devices that they + * can find. Once that is done attach any devices that we + * found. + */ + bus_generic_probe(dev); + bus_generic_attach(dev); + + if (!devclass_get_device(devclass_find("isa"), 0)) { + child = BUS_ADD_CHILD(dev, 0, "isa", 0); + if (child == NULL) + panic("Failed to attach ISA bus."); + device_probe_and_attach(child); + } + + return (0); +} + +static device_method_t xenpv_methods[] = { + /* Device interface */ + DEVMETHOD(device_identify, xenpv_identify), + DEVMETHOD(device_probe, xenpv_probe), + DEVMETHOD(device_attach, xenpv_attach), + DEVMETHOD(device_suspend, bus_generic_suspend), + DEVMETHOD(device_resume, bus_generic_resume), + + /* Bus interface */ + DEVMETHOD(bus_add_child, bus_generic_add_child), + DEVMETHOD(bus_alloc_resource, bus_generic_alloc_resource), + DEVMETHOD(bus_release_resource, bus_generic_release_resource), + DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), + DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + + DEVMETHOD_END +}; + +static driver_t xenpv_driver = { + "xenpv", + xenpv_methods, + 0, +}; + +DRIVER_MODULE(xenpv, nexus, xenpv_driver, xenpv_devclass, 0, 0); Added: head/sys/xen/xen_pv.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/xen/xen_pv.h Mon Jun 16 08:54:04 2014 (r267536) @@ -0,0 +1,34 @@ +/*- + * Copyright (c) 2014 Roger Pau Monné <roger.pau@citrix.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef __XEN_PV_H__ +#define __XEN_PV_H__ + +extern struct apic_ops xen_apic_ops; + +#endif
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201406160854.s5G8s5fI079109>