Re: [PATCH v7 14/19] xen: introduce a dummy pvcpu device

2013-12-24 Thread John Baldwin
On Thursday, December 19, 2013 1:54:51 pm Roger Pau Monne wrote:
> Since Xen PVH guests doesn't have ACPI, we need to create a dummy
> pvcpu device that will be used to fill the pcpu->pc_device field.

Rather than have this hang directly off of nexus0, it might be better to 
create some sort of 'xenov0' device that takes the place of acpi0 and have the 
CPUs hang off of that.  This is how the non-ACPI case works in the native case 
where the default nexus creates a 'legacy0' device that sits at the same spot 
in the device tree as acpi0.  In sys/x86/legacy.c we create CPU devices that 
are a child of legacy0.

In general the way the native code handes ACPI vs non-ACPI is to have a 
different nexus (as you've adopted) create a specific child bus (acpi0 vs 
legacy0).  Drivers that want to only attach in one of the cases at the top-
level then attach as children of those rather than children of 'nexus0'.  This
just adds an extra layer of protection to avoid the possibility of a top-level 
driver that is ACPI or non-ACPI specific being probed in the "wrong" case.  
Right now, all drivers that attach to 'nexus' aside from the top-level busses 
(acpi0 vs legacy0) are intended to work on any machine.

I think the CPU driver itself looks fine, I would just encourage you to 
consider a xenpv0 device and to move anything PV specific to hang off of that 
rather than directly attaching to nexus0.

-- 
John Baldwin
___
freebsd-xen@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-xen
To unsubscribe, send any mail to "freebsd-xen-unsubscr...@freebsd.org"


[PATCH v7 14/19] xen: introduce a dummy pvcpu device

2013-12-19 Thread Roger Pau Monne
Since Xen PVH guests doesn't have ACPI, we need to create a dummy
pvcpu device that will be used to fill the pcpu->pc_device field.
---
 sys/conf/files.amd64 |1 +
 sys/x86/xen/pvcpu.c  |   84 ++
 2 files changed, 85 insertions(+), 0 deletions(-)
 create mode 100644 sys/x86/xen/pvcpu.c

diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 3bdc05e..4a3f612 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -569,3 +569,4 @@ x86/xen/hvm.c   optionalxenhvm
 x86/xen/xen_intr.c optionalxen | xenhvm
 x86/xen/pv.c   optionalxenhvm
 x86/xen/mptable.c  optionalxenhvm
+x86/xen/pvcpu.coptionalxenhvm
diff --git a/sys/x86/xen/pvcpu.c b/sys/x86/xen/pvcpu.c
new file mode 100644
index 000..8725e76
--- /dev/null
+++ b/sys/x86/xen/pvcpu.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2013 Roger Pau Monné 
+ * 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 
+__FBSDID("$FreeBSD$");
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+
+/*
+ * 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 int
+xenpvcpu_probe(device_t dev)
+{
+   if (!xen_pv_domain())
+   return (ENXIO);
+
+   device_set_desc(dev, "Xen PV CPU");
+   return (0);
+}
+
+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_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, nexus, xenpvcpu_driver, xenpvcpu_devclass, 0, 0);
+MODULE_DEPEND(xenpvcpu, nexus, 1, 1, 1);
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-xen@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-xen
To unsubscribe, send any mail to "freebsd-xen-unsubscr...@freebsd.org"