Patchwork [RFC,V3,03/12] xen: Introduce --enable-xen command options.

login
register
mail settings
Submitter Anthony PERARD
Date Sept. 17, 2010, 11:14 a.m.
Message ID <1284722107-28550-4-git-send-email-anthony.perard@citrix.com>
Download mbox | patch
Permalink /patch/65060/
State New
Headers show

Comments

Anthony PERARD - Sept. 17, 2010, 11:14 a.m.
From: Anthony PERARD <anthony.perard@citrix.com>

This options will check if the target is build with Xen support.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 Makefile.target |    3 +++
 hw/xen.h        |   10 ++++++++++
 qemu-options.hx |    9 +++++++++
 vl.c            |   16 ++++++++++++++++
 xen-all.c       |   25 +++++++++++++++++++++++++
 xen-stub.c      |   17 +++++++++++++++++
 6 files changed, 80 insertions(+), 0 deletions(-)
 create mode 100644 xen-all.c
 create mode 100644 xen-stub.c
Alexander Graf - Sept. 17, 2010, 11:41 a.m.
On 17.09.2010, at 13:14, Anthony.Perard@citrix.com wrote:

> From: Anthony PERARD <anthony.perard@citrix.com>
> 
> This options will check if the target is build with Xen support.
> 
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> ---
> Makefile.target |    3 +++
> hw/xen.h        |   10 ++++++++++
> qemu-options.hx |    9 +++++++++
> vl.c            |   16 ++++++++++++++++
> xen-all.c       |   25 +++++++++++++++++++++++++
> xen-stub.c      |   17 +++++++++++++++++
> 6 files changed, 80 insertions(+), 0 deletions(-)
> create mode 100644 xen-all.c
> create mode 100644 xen-stub.c
> 
> diff --git a/Makefile.target b/Makefile.target
> index f112e66..1984f58 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -2,6 +2,7 @@
> 
> GENERATED_HEADERS = config-target.h
> CONFIG_NO_KVM = $(if $(subst n,,$(CONFIG_KVM)),n,y)
> +CONFIG_NO_XEN = $(if $(subst n,,$(CONFIG_XEN)),n,y)
> 
> include ../config-host.mak
> include config-devices.mak
> @@ -182,6 +183,8 @@ QEMU_CFLAGS += $(VNC_PNG_CFLAGS)
> 
> # xen backend driver support
> obj-$(CONFIG_XEN) += xen_machine_pv.o xen_domainbuild.o
> +obj-$(CONFIG_XEN) += xen-all.o
> +obj-$(CONFIG_NO_XEN) += xen-stub.o
> 
> # xen full virtualized machine
> obj-$(CONFIG_XEN) += xen_machine_fv.o
> diff --git a/hw/xen.h b/hw/xen.h
> index 780dcf7..14bbb6e 100644
> --- a/hw/xen.h
> +++ b/hw/xen.h
> @@ -18,4 +18,14 @@ enum xen_mode {
> extern uint32_t xen_domid;
> extern enum xen_mode xen_mode;
> 
> +extern int xen_allowed;
> +
> +#if defined CONFIG_XEN
> +#define xen_enabled() (xen_allowed)
> +#else
> +#define xen_enabled() (0)
> +#endif
> +
> +int xen_init(int smp_cpus);
> +
> #endif /* QEMU_HW_XEN_H */
> diff --git a/qemu-options.hx b/qemu-options.hx
> index a0b5ae9..457ca32 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -1904,6 +1904,15 @@ Enable KVM full virtualization support. This option is only available
> if KVM support is enabled when compiling.
> ETEXI
> 
> +DEF("enable-xen", 0, QEMU_OPTION_enable_xen, \
> +    "-enable-xen     enable Xen full virtualization support\n", QEMU_ARCH_ALL)

This is probably a good point in time to switch to something a bit more sophisticated. I was thinking of

  qemu -accel xen,kvm,tcg

which would first try to enable xen support, then kvm support and fall back to tcg if none is available. The default would be pretty much the line above.

That way we could finally get rid of all those -enable-kvm and -enable-whatever switches. We would still need to keep backwards compat for -enable-kvm by mapping it to "-accel kvm" internally. But in the long run an -accel parameter just makes so much more sense.


Alex

Patch

diff --git a/Makefile.target b/Makefile.target
index f112e66..1984f58 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -2,6 +2,7 @@ 
 
 GENERATED_HEADERS = config-target.h
 CONFIG_NO_KVM = $(if $(subst n,,$(CONFIG_KVM)),n,y)
+CONFIG_NO_XEN = $(if $(subst n,,$(CONFIG_XEN)),n,y)
 
 include ../config-host.mak
 include config-devices.mak
@@ -182,6 +183,8 @@  QEMU_CFLAGS += $(VNC_PNG_CFLAGS)
 
 # xen backend driver support
 obj-$(CONFIG_XEN) += xen_machine_pv.o xen_domainbuild.o
+obj-$(CONFIG_XEN) += xen-all.o
+obj-$(CONFIG_NO_XEN) += xen-stub.o
 
 # xen full virtualized machine
 obj-$(CONFIG_XEN) += xen_machine_fv.o
diff --git a/hw/xen.h b/hw/xen.h
index 780dcf7..14bbb6e 100644
--- a/hw/xen.h
+++ b/hw/xen.h
@@ -18,4 +18,14 @@  enum xen_mode {
 extern uint32_t xen_domid;
 extern enum xen_mode xen_mode;
 
+extern int xen_allowed;
+
+#if defined CONFIG_XEN
+#define xen_enabled() (xen_allowed)
+#else
+#define xen_enabled() (0)
+#endif
+
+int xen_init(int smp_cpus);
+
 #endif /* QEMU_HW_XEN_H */
diff --git a/qemu-options.hx b/qemu-options.hx
index a0b5ae9..457ca32 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -1904,6 +1904,15 @@  Enable KVM full virtualization support. This option is only available
 if KVM support is enabled when compiling.
 ETEXI
 
+DEF("enable-xen", 0, QEMU_OPTION_enable_xen, \
+    "-enable-xen     enable Xen full virtualization support\n", QEMU_ARCH_ALL)
+STEXI
+@item -enable-xen
+@findex -enable-xen
+Enable Xen full virtualization support. This option is only available
+if Xen support is enabled when compiling.
+ETEXI
+
 DEF("xen-domid", HAS_ARG, QEMU_OPTION_xen_domid,
     "-xen-domid id   specify xen guest domain id\n", QEMU_ARCH_ALL)
 DEF("xen-create", 0, QEMU_OPTION_xen_create,
diff --git a/vl.c b/vl.c
index 3f45aa9..6948703 100644
--- a/vl.c
+++ b/vl.c
@@ -243,6 +243,7 @@  static NotifierList exit_notifiers =
     NOTIFIER_LIST_INITIALIZER(exit_notifiers);
 
 int kvm_allowed = 0;
+int xen_allowed = 0;
 uint32_t xen_domid;
 enum xen_mode xen_mode = XEN_EMULATE;
 
@@ -2448,6 +2449,9 @@  int main(int argc, char **argv, char **envp)
             case QEMU_OPTION_enable_kvm:
                 kvm_allowed = 1;
                 break;
+            case QEMU_OPTION_enable_xen:
+                xen_allowed = 1;
+                break;
             case QEMU_OPTION_usb:
                 usb_enabled = 1;
                 break;
@@ -2756,6 +2760,18 @@  int main(int argc, char **argv, char **envp)
         }
     }
 
+    if (xen_allowed) {
+        int ret = xen_init(smp_cpus);
+        if (ret < 0) {
+            if (!xen_available()) {
+                printf("Xen not supported for this target\n");
+            } else {
+                fprintf(stderr, "failed to initialize Xen: %s\n", strerror(-ret));
+            }
+            exit(1);
+        }
+    }
+
     if (qemu_init_main_loop()) {
         fprintf(stderr, "qemu_init_main_loop failed\n");
         exit(1);
diff --git a/xen-all.c b/xen-all.c
new file mode 100644
index 0000000..f505563
--- /dev/null
+++ b/xen-all.c
@@ -0,0 +1,25 @@ 
+/*
+ * Copyright (C) 2010       Citrix Ltd.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "config.h"
+
+#include "hw/xen_common.h"
+#include "hw/xen_backend.h"
+
+/* Initialise Xen */
+
+int xen_init(int smp_cpus)
+{
+    xen_xc = xc_interface_open(NULL, NULL, 0);
+    if (xen_xc == NULL) {
+        xen_be_printf(NULL, 0, "can't open xen interface\n");
+        return -1;
+    }
+
+    return 0;
+}
diff --git a/xen-stub.c b/xen-stub.c
new file mode 100644
index 0000000..0fa9c51
--- /dev/null
+++ b/xen-stub.c
@@ -0,0 +1,17 @@ 
+/*
+ * Copyright (C) 2010       Citrix Ltd.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "config.h"
+
+#include "qemu-common.h"
+#include "hw/xen.h"
+
+int xen_init(int smp_cpus)
+{
+    return -ENOSYS;
+}