libxl: support hvm direct kernel boot

Xen libxl can support Xen HVM direct kernel boot now. To support
Xen HVM direct kernel boot in libvirt, it still needs some changes
to libvirt code: accept HVM direct kernel boot related configuration
in xml, parse those info into virDomainDefPtr, and fill in related
parts of libxl_domain_build_info, so that libxl can handle. This
patch is just to do this.

Signed-off-by: Chunyan Liu <cyliu@suse.com>


Index: libvirt-1.2.5/src/libxl/libxl_conf.c
===================================================================
--- libvirt-1.2.5.orig/src/libxl/libxl_conf.c
+++ libvirt-1.2.5/src/libxl/libxl_conf.c
@@ -729,6 +729,15 @@ libxlMakeDomBuildInfo(virDomainObjPtr vm
             b_info->device_model_version = libxlDomainGetEmulatorType(def);
         }
 
+#ifdef LIBXL_HAVE_BUILDINFO_KERNEL
+        if (VIR_STRDUP(b_info->cmdline, def->os.cmdline) < 0)
+            goto error;
+        if (VIR_STRDUP(b_info->kernel, def->os.kernel) < 0)
+            goto error;
+        if (VIR_STRDUP(b_info->ramdisk, def->os.initrd) < 0)
+            goto error;
+#endif
+
         if (def->nserials) {
             if (def->nserials > 1) {
                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -773,6 +782,14 @@ libxlMakeDomBuildInfo(virDomainObjPtr vm
                   virStringSplit(def->os.bootloaderArgs, " \t\n", 0)))
                 goto error;
         }
+#ifdef LIBXL_HAVE_BUILDINFO_KERNEL
+        if (VIR_STRDUP(b_info->cmdline, def->os.cmdline) < 0)
+            goto error;
+        if (VIR_STRDUP(b_info->kernel, def->os.kernel) < 0)
+            goto error;
+        if (VIR_STRDUP(b_info->ramdisk, def->os.initrd) < 0)
+            goto error;
+#else
         if (VIR_STRDUP(b_info->u.pv.cmdline, def->os.cmdline) < 0)
             goto error;
         if (def->os.kernel) {
@@ -783,6 +800,7 @@ libxlMakeDomBuildInfo(virDomainObjPtr vm
         }
         if (VIR_STRDUP(b_info->u.pv.ramdisk, def->os.initrd) < 0)
             goto error;
+#endif
     }
 
     return 0;
Index: libvirt-1.2.5/src/xenxs/xen_xm.c
===================================================================
--- libvirt-1.2.5.orig/src/xenxs/xen_xm.c
+++ libvirt-1.2.5/src/xenxs/xen_xm.c
@@ -40,6 +40,10 @@
 #include "virstoragefile.h"
 #include "virstring.h"
 
+#if WITH_LIBXL
+# include <libxl.h>
+#endif
+
 /* Convenience method to grab a long int from the config file object */
 static int xenXMConfigGetBool(virConfPtr conf,
                               const char *name,
@@ -248,6 +252,28 @@ xenXMConfigGetUUID(virConfPtr conf, cons
     return 0;
 }
 
+static int
+xenParseCmdline(virConfPtr conf, virDomainDefPtr def)
+{
+    const char *extra, *root;
+
+    if (xenXMConfigGetString(conf, "extra", &extra, NULL) < 0)
+        return -1;
+
+    if (xenXMConfigGetString(conf, "root", &root, NULL) < 0)
+        return -1;
+
+    if (root) {
+        if (virAsprintf(&def->os.cmdline, "root=%s %s", root, extra) < 0)
+            return -1;
+    } else {
+        if (VIR_STRDUP(def->os.cmdline, extra) < 0)
+            return -1;
+    }
+
+    return 0;
+}
+
 #define MAX_VFB 1024
 /*
  * Turn a config record into a lump of XML describing the
@@ -314,9 +340,25 @@ xenParseXM(virConfPtr conf, int xendConf
 
     if (hvm) {
         const char *boot;
-        if (xenXMConfigCopyString(conf, "kernel", &def->os.loader) < 0)
+#ifdef LIBXL_HAVE_BUILDINFO_KERNEL
+        if (xenXMConfigCopyStringOpt(conf, "kernel", &def->os.kernel) < 0)
+            goto cleanup;
+
+        if (def->os.kernel && strstr(def->os.kernel, "hvmloader")) {
+            /* 'kernel' set to 'hvmloader' will be ignored in libxl */
+            VIR_FREE(def->os.kernel);
+        }
+
+        if (xenXMConfigCopyStringOpt(conf, "ramdisk", &def->os.initrd) < 0)
             goto cleanup;
 
+        if (xenParseCmdline(conf, def) < 0)
+            goto cleanup;
+#else
+        if (xenXMConfigCopyStringOpt(conf, "kernel", &def->os.loader) < 0)
+            goto cleanup;
+#endif
+
         if (xenXMConfigGetString(conf, "boot", &boot, "c") < 0)
             goto cleanup;
 
@@ -339,8 +381,6 @@ xenParseXM(virConfPtr conf, int xendConf
             def->os.nBootDevs++;
         }
     } else {
-        const char *extra, *root;
-
         if (xenXMConfigCopyStringOpt(conf, "bootloader", &def->os.bootloader) < 0)
             goto cleanup;
         if (xenXMConfigCopyStringOpt(conf, "bootargs", &def->os.bootloaderArgs) < 0)
@@ -350,18 +390,8 @@ xenParseXM(virConfPtr conf, int xendConf
             goto cleanup;
         if (xenXMConfigCopyStringOpt(conf, "ramdisk", &def->os.initrd) < 0)
             goto cleanup;
-        if (xenXMConfigGetString(conf, "extra", &extra, NULL) < 0)
-            goto cleanup;
-        if (xenXMConfigGetString(conf, "root", &root, NULL) < 0)
+        if (xenParseCmdline(conf, def) < 0)
             goto cleanup;
-
-        if (root) {
-            if (virAsprintf(&def->os.cmdline, "root=%s %s", root, extra) < 0)
-                goto cleanup;
-        } else {
-            if (VIR_STRDUP(def->os.cmdline, extra) < 0)
-                goto cleanup;
-        }
     }
 
     if (xenXMConfigGetULongLong(conf, "memory", &def->mem.cur_balloon,
