Adding ifcpuhvm.c32
authorErwan Velu <erwan.velu@free.fr>
Fri, 27 Nov 2009 21:12:40 +0000 (22:12 +0100)
committerErwan Velu <erwan.velu@free.fr>
Fri, 4 Dec 2009 09:11:15 +0000 (10:11 +0100)
Impact: new module to boot hvm systems

This module allow users to define a boot entry regarding if the cpu is
supporting hvm (vmx|svm). This could used to boot xen, or any hypervisor

com32/modules/Makefile
com32/modules/ifcpuhvm.c [new file with mode: 0644]

index 52327b6..05408bc 100644 (file)
@@ -21,7 +21,7 @@ include ../MCONFIG
 MODULES          = chain.c32 config.c32 ethersel.c32 dmitest.c32 cpuidtest.c32 \
            disk.c32 pcitest.c32 elf.c32 linux.c32 reboot.c32 pmload.c32 \
            meminfo.c32 sdi.c32 sanboot.c32 ifcpu64.c32 vesainfo.c32 \
-           kbdmap.c32 cmd.c32 vpdtest.c32 gpxecmd.c32
+           kbdmap.c32 cmd.c32 vpdtest.c32 gpxecmd.c32 ifcpuhvm.c32
 
 TESTFILES =
 
diff --git a/com32/modules/ifcpuhvm.c b/com32/modules/ifcpuhvm.c
new file mode 100644 (file)
index 0000000..be50887
--- /dev/null
@@ -0,0 +1,90 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2009 Erwan Velu - All Rights Reserved
+ *
+ *   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, Inc., 51 Franklin St, Fifth Floor,
+ *   Boston MA 02110-1301, USA; either version 2 of the License, or
+ *   (at your option) any later version; incorporated herein by reference.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * ifcpuhvm.c
+ *
+ * Run one command if the CPU has hardware virtualisation support,
+ * and another if it doesn't.
+ * Eventually this and other features should get folded into some kind
+ * of scripting engine.
+ *
+ * Usage:
+ *
+ *    label boot_kernel
+ *        kernel ifvhm.c32
+ *        append boot_kernel_xen -- boot_kernel_regular
+ *    label boot_kernel_xen
+ *       kernel mboot.c32
+ *        append xen.gz dom0_mem=262144 -- vmlinuz-xen console=tty0 root=/dev/hda1 ro --- initrd.img-xen
+ *    label boot_kernel_regular
+ *        kernel vmlinuz_64
+ *        append ...
+ */
+
+#include <alloca.h>
+#include <stdlib.h>
+#include <string.h>
+#include <cpuid.h>
+#include <syslinux/boot.h>
+
+/* XXX: this really should be librarized */
+static void boot_args(char **args)
+{
+    int len = 0;
+    char **pp;
+    const char *p;
+    char c, *q, *str;
+
+    for (pp = args; *pp; pp++)
+       len += strlen(*pp);
+
+    q = str = alloca(len + 1);
+    for (pp = args; *pp; pp++) {
+       p = *pp;
+       while ((c = *p++))
+           *q++ = c;
+    }
+    *q = '\0';
+
+    if (!str[0])
+       syslinux_run_default();
+    else
+       syslinux_run_command(str);
+}
+
+int main(int argc, char *argv[])
+{
+    char **args[3];
+    int i;
+    int n;
+    s_cpu cpu;
+    detect_cpu(&cpu);
+
+    args[0] = &argv[1];
+    n = 1;
+    for (i = 1; i < argc; i++) {
+       if (!strcmp(argv[i], "--")) {
+           argv[i] = NULL;
+           args[n++] = &argv[i + 1];
+       }
+       if (n >= 3)
+           break;
+    }
+    while (n < 3) {
+       args[n] = args[n - 1];
+       n++;
+    }
+
+    boot_args((cpu.flags.vmx || cpu.flags.svm) ? args[0] : args[1]);
+    return -1;
+}