* [Qemu-devel] [PATCH] linux-user: remove nmi.c and fw-path-provider.c
@ 2017-11-03 19:38 Laurent Vivier
2017-11-06 0:44 ` Alexey Kardashevskiy
2017-11-07 12:48 ` Paolo Bonzini
0 siblings, 2 replies; 5+ messages in thread
From: Laurent Vivier @ 2017-11-03 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Alexey Kardashevskiy, Riku Voipio, Laurent Vivier
linux-user binaries don't need firmware and NMI,
so don't add them in this case, move QDEV
firmware functions to qdev-fw.c
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
hw/core/Makefile.objs | 5 +--
hw/core/qdev-fw.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++
hw/core/qdev.c | 77 -----------------------------------------
3 files changed, 99 insertions(+), 79 deletions(-)
create mode 100644 hw/core/qdev-fw.c
diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs
index f8d7a4aaed..1240728c87 100644
--- a/hw/core/Makefile.objs
+++ b/hw/core/Makefile.objs
@@ -1,11 +1,12 @@
# core qdev-related obj files, also used by *-user:
common-obj-y += qdev.o qdev-properties.o
common-obj-y += bus.o reset.o
-common-obj-y += fw-path-provider.o
+common-obj-$(CONFIG_SOFTMMU) += qdev-fw.o
+common-obj-$(CONFIG_SOFTMMU) += fw-path-provider.o
# irq.o needed for qdev GPIO handling:
common-obj-y += irq.o
common-obj-y += hotplug.o
-common-obj-y += nmi.o
+common-obj-$(CONFIG_SOFTMMU) += nmi.o
common-obj-$(CONFIG_EMPTY_SLOT) += empty_slot.o
common-obj-$(CONFIG_XILINX_AXI) += stream.o
diff --git a/hw/core/qdev-fw.c b/hw/core/qdev-fw.c
new file mode 100644
index 0000000000..aa35e9d0ac
--- /dev/null
+++ b/hw/core/qdev-fw.c
@@ -0,0 +1,96 @@
+/*
+ * qdev fw helpers
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License,
+ * or (at your option) any later version.
+ *
+ * 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 "qemu/osdep.h"
+#include "hw/qdev.h"
+#include "hw/fw-path-provider.h"
+
+const char *qdev_fw_name(DeviceState *dev)
+{
+ DeviceClass *dc = DEVICE_GET_CLASS(dev);
+
+ if (dc->fw_name) {
+ return dc->fw_name;
+ }
+
+ return object_get_typename(OBJECT(dev));
+}
+
+static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
+{
+ BusClass *bc = BUS_GET_CLASS(bus);
+
+ if (bc->get_fw_dev_path) {
+ return bc->get_fw_dev_path(dev);
+ }
+
+ return NULL;
+}
+
+static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
+{
+ Object *obj = OBJECT(dev);
+ char *d = NULL;
+
+ while (!d && obj->parent) {
+ obj = obj->parent;
+ d = fw_path_provider_try_get_dev_path(obj, bus, dev);
+ }
+ return d;
+}
+
+char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
+{
+ Object *obj = OBJECT(dev);
+
+ return fw_path_provider_try_get_dev_path(obj, bus, dev);
+}
+
+static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
+{
+ int l = 0;
+
+ if (dev && dev->parent_bus) {
+ char *d;
+ l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
+ d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
+ if (!d) {
+ d = bus_get_fw_dev_path(dev->parent_bus, dev);
+ }
+ if (d) {
+ l += snprintf(p + l, size - l, "%s", d);
+ g_free(d);
+ } else {
+ return l;
+ }
+ }
+ l += snprintf(p + l , size - l, "/");
+
+ return l;
+}
+
+char *qdev_get_fw_dev_path(DeviceState *dev)
+{
+ char path[128];
+ int l;
+
+ l = qdev_get_fw_dev_path_helper(dev, path, 128);
+
+ path[l - 1] = '\0';
+
+ return g_strdup(path);
+}
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 11112951a5..49df62ba8c 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -27,7 +27,6 @@
#include "qemu/osdep.h"
#include "hw/qdev.h"
-#include "hw/fw-path-provider.h"
#include "sysemu/sysemu.h"
#include "qapi/qmp/qerror.h"
#include "qapi/visitor.h"
@@ -48,17 +47,6 @@ const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
return dc->vmsd;
}
-const char *qdev_fw_name(DeviceState *dev)
-{
- DeviceClass *dc = DEVICE_GET_CLASS(dev);
-
- if (dc->fw_name) {
- return dc->fw_name;
- }
-
- return object_get_typename(OBJECT(dev));
-}
-
static void bus_remove_child(BusState *bus, DeviceState *child)
{
BusChild *kid;
@@ -619,71 +607,6 @@ DeviceState *qdev_find_recursive(BusState *bus, const char *id)
return NULL;
}
-static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
-{
- BusClass *bc = BUS_GET_CLASS(bus);
-
- if (bc->get_fw_dev_path) {
- return bc->get_fw_dev_path(dev);
- }
-
- return NULL;
-}
-
-static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
-{
- Object *obj = OBJECT(dev);
- char *d = NULL;
-
- while (!d && obj->parent) {
- obj = obj->parent;
- d = fw_path_provider_try_get_dev_path(obj, bus, dev);
- }
- return d;
-}
-
-char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
-{
- Object *obj = OBJECT(dev);
-
- return fw_path_provider_try_get_dev_path(obj, bus, dev);
-}
-
-static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
-{
- int l = 0;
-
- if (dev && dev->parent_bus) {
- char *d;
- l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
- d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
- if (!d) {
- d = bus_get_fw_dev_path(dev->parent_bus, dev);
- }
- if (d) {
- l += snprintf(p + l, size - l, "%s", d);
- g_free(d);
- } else {
- return l;
- }
- }
- l += snprintf(p + l , size - l, "/");
-
- return l;
-}
-
-char* qdev_get_fw_dev_path(DeviceState *dev)
-{
- char path[128];
- int l;
-
- l = qdev_get_fw_dev_path_helper(dev, path, 128);
-
- path[l-1] = '\0';
-
- return g_strdup(path);
-}
-
char *qdev_get_dev_path(DeviceState *dev)
{
BusClass *bc;
--
2.13.6
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH] linux-user: remove nmi.c and fw-path-provider.c
2017-11-03 19:38 [Qemu-devel] [PATCH] linux-user: remove nmi.c and fw-path-provider.c Laurent Vivier
@ 2017-11-06 0:44 ` Alexey Kardashevskiy
2017-11-06 10:15 ` Laurent Vivier
2017-11-07 12:48 ` Paolo Bonzini
1 sibling, 1 reply; 5+ messages in thread
From: Alexey Kardashevskiy @ 2017-11-06 0:44 UTC (permalink / raw)
To: Laurent Vivier, qemu-devel; +Cc: Paolo Bonzini, Riku Voipio
On 04/11/17 06:38, Laurent Vivier wrote:
> linux-user binaries don't need firmware and NMI,
> so don't add them in this case, move QDEV
> firmware functions to qdev-fw.c
When configured with --target-list=ppc64-linux-user , config-host.mak gets
TARGET_DIRS=ppc64-linux-user and I would expect CONFIG_SOFTMMU to be
disabled in Makefile#27 and qdev.c not to be compiled at all but this is
not happening, I wonder why...
>
> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
> ---
> hw/core/Makefile.objs | 5 +--
> hw/core/qdev-fw.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++
> hw/core/qdev.c | 77 -----------------------------------------
> 3 files changed, 99 insertions(+), 79 deletions(-)
> create mode 100644 hw/core/qdev-fw.c
>
> diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs
> index f8d7a4aaed..1240728c87 100644
> --- a/hw/core/Makefile.objs
> +++ b/hw/core/Makefile.objs
> @@ -1,11 +1,12 @@
> # core qdev-related obj files, also used by *-user:
> common-obj-y += qdev.o qdev-properties.o
> common-obj-y += bus.o reset.o
> -common-obj-y += fw-path-provider.o
> +common-obj-$(CONFIG_SOFTMMU) += qdev-fw.o
> +common-obj-$(CONFIG_SOFTMMU) += fw-path-provider.o
> # irq.o needed for qdev GPIO handling:
> common-obj-y += irq.o
> common-obj-y += hotplug.o
> -common-obj-y += nmi.o
> +common-obj-$(CONFIG_SOFTMMU) += nmi.o
>
> common-obj-$(CONFIG_EMPTY_SLOT) += empty_slot.o
> common-obj-$(CONFIG_XILINX_AXI) += stream.o
--
Alexey
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH] linux-user: remove nmi.c and fw-path-provider.c
2017-11-06 0:44 ` Alexey Kardashevskiy
@ 2017-11-06 10:15 ` Laurent Vivier
2017-11-07 0:31 ` Alexey Kardashevskiy
0 siblings, 1 reply; 5+ messages in thread
From: Laurent Vivier @ 2017-11-06 10:15 UTC (permalink / raw)
To: Alexey Kardashevskiy, qemu-devel; +Cc: Paolo Bonzini, Riku Voipio
Le 06/11/2017 à 01:44, Alexey Kardashevskiy a écrit :
> On 04/11/17 06:38, Laurent Vivier wrote:
>> linux-user binaries don't need firmware and NMI,
>> so don't add them in this case, move QDEV
>> firmware functions to qdev-fw.c
>
>
> When configured with --target-list=ppc64-linux-user , config-host.mak gets
> TARGET_DIRS=ppc64-linux-user and I would expect CONFIG_SOFTMMU to be
> disabled in Makefile#27 and qdev.c not to be compiled at all but this is
> not happening, I wonder why...
this is driven by config-target.mak and config-target.h which are target
specific.
for ppc64-linux-user, you have ppc64-linux-user/config-target.mak:
...
CONFIG_LINUX_USER=y
...
for ppc64-softmmu/config-target.mak:
...
CONFIG_SOFTMMU=y
...
Thanks,
Laurent
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH] linux-user: remove nmi.c and fw-path-provider.c
2017-11-06 10:15 ` Laurent Vivier
@ 2017-11-07 0:31 ` Alexey Kardashevskiy
0 siblings, 0 replies; 5+ messages in thread
From: Alexey Kardashevskiy @ 2017-11-07 0:31 UTC (permalink / raw)
To: Laurent Vivier, qemu-devel, Paolo Bonzini; +Cc: Riku Voipio
On 06/11/17 21:15, Laurent Vivier wrote:
> Le 06/11/2017 à 01:44, Alexey Kardashevskiy a écrit :
>> On 04/11/17 06:38, Laurent Vivier wrote:
>>> linux-user binaries don't need firmware and NMI,
>>> so don't add them in this case, move QDEV
>>> firmware functions to qdev-fw.c
>>
>>
>> When configured with --target-list=ppc64-linux-user , config-host.mak gets
>> TARGET_DIRS=ppc64-linux-user and I would expect CONFIG_SOFTMMU to be
>> disabled in Makefile#27 and qdev.c not to be compiled at all but this is
>> not happening, I wonder why...
>
> this is driven by config-target.mak and config-target.h which are target
> specific.
>
> for ppc64-linux-user, you have ppc64-linux-user/config-target.mak:
> ...
> CONFIG_LINUX_USER=y
> ...
>
> for ppc64-softmmu/config-target.mak:
> ...
> CONFIG_SOFTMMU=y
> ...
Ah, I get it, Makefile.objs includes:
common-obj-y += hw/
and hw/Makefile.objs includes:
devices-dirs-y += core/
and hw/core/Makefile.objs includes:
common-obj-y += qdev.o
and nowhere it checks that CONFIG_SOFTMMU is not set as hw/core/* files
still export symbols needed by qom/cpu.c and TCG so doing as below does not
help. I'd suggest moving shared stuff out of hw/ and stop including hw/ in
linus-user builds (basically, apply the patch below and resolve
compile/link errors) but I suspect it is not that easy (or even correct)
but if it is correct, I could give it a try.
Paolo?
diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs
index f8d7a4aaed..be8d89dc0a 100644
--- a/hw/core/Makefile.objs
+++ b/hw/core/Makefile.objs
@@ -1,6 +1,6 @@
# core qdev-related obj files, also used by *-user:
-common-obj-y += qdev.o qdev-properties.o
-common-obj-y += bus.o reset.o
+obj-$(CONFIG_SOFTMMU) += qdev.o qdev-properties.o bus.o
+common-obj-y += reset.o
common-obj-y += fw-path-provider.o
# irq.o needed for qdev GPIO handling:
common-obj-y += irq.o
diff --git a/qom/Makefile.objs b/qom/Makefile.objs
index 516349eec3..479929705a 100644
--- a/qom/Makefile.objs
+++ b/qom/Makefile.objs
@@ -1,4 +1,4 @@
qom-obj-y = object.o container.o qom-qobject.o
qom-obj-y += object_interfaces.o
-common-obj-y = cpu.o
+obj-$(CONFIG_SOFTMMU) = cpu.o
--
Alexey
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH] linux-user: remove nmi.c and fw-path-provider.c
2017-11-03 19:38 [Qemu-devel] [PATCH] linux-user: remove nmi.c and fw-path-provider.c Laurent Vivier
2017-11-06 0:44 ` Alexey Kardashevskiy
@ 2017-11-07 12:48 ` Paolo Bonzini
1 sibling, 0 replies; 5+ messages in thread
From: Paolo Bonzini @ 2017-11-07 12:48 UTC (permalink / raw)
To: Laurent Vivier, qemu-devel; +Cc: Alexey Kardashevskiy, Riku Voipio
On 03/11/2017 20:38, Laurent Vivier wrote:
> linux-user binaries don't need firmware and NMI,
> so don't add them in this case, move QDEV
> firmware functions to qdev-fw.c
>
> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> hw/core/Makefile.objs | 5 +--
> hw/core/qdev-fw.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++
> hw/core/qdev.c | 77 -----------------------------------------
> 3 files changed, 99 insertions(+), 79 deletions(-)
> create mode 100644 hw/core/qdev-fw.c
>
> diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs
> index f8d7a4aaed..1240728c87 100644
> --- a/hw/core/Makefile.objs
> +++ b/hw/core/Makefile.objs
> @@ -1,11 +1,12 @@
> # core qdev-related obj files, also used by *-user:
> common-obj-y += qdev.o qdev-properties.o
> common-obj-y += bus.o reset.o
> -common-obj-y += fw-path-provider.o
> +common-obj-$(CONFIG_SOFTMMU) += qdev-fw.o
> +common-obj-$(CONFIG_SOFTMMU) += fw-path-provider.o
> # irq.o needed for qdev GPIO handling:
> common-obj-y += irq.o
> common-obj-y += hotplug.o
> -common-obj-y += nmi.o
> +common-obj-$(CONFIG_SOFTMMU) += nmi.o
>
> common-obj-$(CONFIG_EMPTY_SLOT) += empty_slot.o
> common-obj-$(CONFIG_XILINX_AXI) += stream.o
> diff --git a/hw/core/qdev-fw.c b/hw/core/qdev-fw.c
> new file mode 100644
> index 0000000000..aa35e9d0ac
> --- /dev/null
> +++ b/hw/core/qdev-fw.c
> @@ -0,0 +1,96 @@
> +/*
> + * qdev fw helpers
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License,
> + * or (at your option) any later version.
> + *
> + * 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 "qemu/osdep.h"
> +#include "hw/qdev.h"
> +#include "hw/fw-path-provider.h"
> +
> +const char *qdev_fw_name(DeviceState *dev)
> +{
> + DeviceClass *dc = DEVICE_GET_CLASS(dev);
> +
> + if (dc->fw_name) {
> + return dc->fw_name;
> + }
> +
> + return object_get_typename(OBJECT(dev));
> +}
> +
> +static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
> +{
> + BusClass *bc = BUS_GET_CLASS(bus);
> +
> + if (bc->get_fw_dev_path) {
> + return bc->get_fw_dev_path(dev);
> + }
> +
> + return NULL;
> +}
> +
> +static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
> +{
> + Object *obj = OBJECT(dev);
> + char *d = NULL;
> +
> + while (!d && obj->parent) {
> + obj = obj->parent;
> + d = fw_path_provider_try_get_dev_path(obj, bus, dev);
> + }
> + return d;
> +}
> +
> +char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
> +{
> + Object *obj = OBJECT(dev);
> +
> + return fw_path_provider_try_get_dev_path(obj, bus, dev);
> +}
> +
> +static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
> +{
> + int l = 0;
> +
> + if (dev && dev->parent_bus) {
> + char *d;
> + l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
> + d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
> + if (!d) {
> + d = bus_get_fw_dev_path(dev->parent_bus, dev);
> + }
> + if (d) {
> + l += snprintf(p + l, size - l, "%s", d);
> + g_free(d);
> + } else {
> + return l;
> + }
> + }
> + l += snprintf(p + l , size - l, "/");
> +
> + return l;
> +}
> +
> +char *qdev_get_fw_dev_path(DeviceState *dev)
> +{
> + char path[128];
> + int l;
> +
> + l = qdev_get_fw_dev_path_helper(dev, path, 128);
> +
> + path[l - 1] = '\0';
> +
> + return g_strdup(path);
> +}
> diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> index 11112951a5..49df62ba8c 100644
> --- a/hw/core/qdev.c
> +++ b/hw/core/qdev.c
> @@ -27,7 +27,6 @@
>
> #include "qemu/osdep.h"
> #include "hw/qdev.h"
> -#include "hw/fw-path-provider.h"
> #include "sysemu/sysemu.h"
> #include "qapi/qmp/qerror.h"
> #include "qapi/visitor.h"
> @@ -48,17 +47,6 @@ const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
> return dc->vmsd;
> }
>
> -const char *qdev_fw_name(DeviceState *dev)
> -{
> - DeviceClass *dc = DEVICE_GET_CLASS(dev);
> -
> - if (dc->fw_name) {
> - return dc->fw_name;
> - }
> -
> - return object_get_typename(OBJECT(dev));
> -}
> -
> static void bus_remove_child(BusState *bus, DeviceState *child)
> {
> BusChild *kid;
> @@ -619,71 +607,6 @@ DeviceState *qdev_find_recursive(BusState *bus, const char *id)
> return NULL;
> }
>
> -static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
> -{
> - BusClass *bc = BUS_GET_CLASS(bus);
> -
> - if (bc->get_fw_dev_path) {
> - return bc->get_fw_dev_path(dev);
> - }
> -
> - return NULL;
> -}
> -
> -static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
> -{
> - Object *obj = OBJECT(dev);
> - char *d = NULL;
> -
> - while (!d && obj->parent) {
> - obj = obj->parent;
> - d = fw_path_provider_try_get_dev_path(obj, bus, dev);
> - }
> - return d;
> -}
> -
> -char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
> -{
> - Object *obj = OBJECT(dev);
> -
> - return fw_path_provider_try_get_dev_path(obj, bus, dev);
> -}
> -
> -static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
> -{
> - int l = 0;
> -
> - if (dev && dev->parent_bus) {
> - char *d;
> - l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
> - d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
> - if (!d) {
> - d = bus_get_fw_dev_path(dev->parent_bus, dev);
> - }
> - if (d) {
> - l += snprintf(p + l, size - l, "%s", d);
> - g_free(d);
> - } else {
> - return l;
> - }
> - }
> - l += snprintf(p + l , size - l, "/");
> -
> - return l;
> -}
> -
> -char* qdev_get_fw_dev_path(DeviceState *dev)
> -{
> - char path[128];
> - int l;
> -
> - l = qdev_get_fw_dev_path_helper(dev, path, 128);
> -
> - path[l-1] = '\0';
> -
> - return g_strdup(path);
> -}
> -
> char *qdev_get_dev_path(DeviceState *dev)
> {
> BusClass *bc;
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2017-11-07 12:48 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-03 19:38 [Qemu-devel] [PATCH] linux-user: remove nmi.c and fw-path-provider.c Laurent Vivier
2017-11-06 0:44 ` Alexey Kardashevskiy
2017-11-06 10:15 ` Laurent Vivier
2017-11-07 0:31 ` Alexey Kardashevskiy
2017-11-07 12:48 ` Paolo Bonzini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).