<optional>
<ref name='launchSecurity'/>
</optional>
+ <optional>
+ <ref name='bhyvecmdline'/>
+ </optional>
</interleave>
</element>
</define>
</element>
</define>
+ <!--
+ Optional hypervisor extensions in their own namespace:
+ Bhyve
+ -->
+ <define name="bhyvecmdline">
+ <element name="commandline" ns="http://libvirt.org/schemas/domain/bhyve/1.0">
+ <zeroOrMore>
+ <element name="arg">
+ <attribute name='value'/>
+ </element>
+ </zeroOrMore>
+ </element>
+ </define>
+
<!--
Type library
-->
#include "bhyve_capabilities.h"
#include "bhyve_command.h"
#include "bhyve_domain.h"
+#include "bhyve_conf.h"
#include "bhyve_driver.h"
#include "datatypes.h"
#include "viralloc.h"
if (bhyveBuildConsoleArgStr(def, cmd) < 0)
goto error;
+ if (def->namespaceData) {
+ bhyveDomainCmdlineDefPtr bhyvecmd;
+
+ bhyvecmd = def->namespaceData;
+ for (i = 0; i < bhyvecmd->num_args; i++)
+ virCommandAddArg(cmd, bhyvecmd->args[i]);
+ }
+
virCommandAddArg(cmd, def->name);
return cmd;
#include "virlog.h"
#include "virstring.h"
#include "bhyve_conf.h"
+#include "bhyve_domain.h"
#include "configmake.h"
#define VIR_FROM_THIS VIR_FROM_BHYVE
VIR_FREE(cfg->firmwareDir);
}
+
+void
+bhyveDomainCmdlineDefFree(bhyveDomainCmdlineDefPtr def)
+{
+ size_t i;
+
+ if (!def)
+ return;
+
+ for (i = 0; i < def->num_args; i++)
+ VIR_FREE(def->args[i]);
+
+ VIR_FREE(def->args);
+ VIR_FREE(def);
+}
int virBhyveLoadDriverConfig(virBhyveDriverConfigPtr cfg,
const char *filename);
+typedef struct _bhyveDomainCmdlineDef bhyveDomainCmdlineDef;
+typedef bhyveDomainCmdlineDef *bhyveDomainCmdlineDefPtr;
+struct _bhyveDomainCmdlineDef {
+ size_t num_args;
+ char **args;
+};
+
+void bhyveDomainCmdlineDefFree(bhyveDomainCmdlineDefPtr def);
+
#endif /* LIBVIRT_BHYVE_CONF_H */
#include <config.h>
+#include "bhyve_conf.h"
#include "bhyve_device.h"
#include "bhyve_domain.h"
#include "bhyve_capabilities.h"
#include "viralloc.h"
#include "virlog.h"
+#include <libxml/xpathInternals.h>
+
#define VIR_FROM_THIS VIR_FROM_BHYVE
VIR_LOG_INIT("bhyve.bhyve_domain");
+#define BHYVE_NAMESPACE_HREF "http://libvirt.org/schemas/domain/bhyve/1.0"
+
static void *
bhyveDomainObjPrivateAlloc(void *opaque ATTRIBUTE_UNUSED)
{
virBhyveDriverDomainDefParserConfig.priv = driver;
return virDomainXMLOptionNew(&virBhyveDriverDomainDefParserConfig,
&virBhyveDriverPrivateDataCallbacks,
- NULL, NULL, NULL);
+ &virBhyveDriverDomainXMLNamespace,
+ NULL, NULL);
}
virDomainDefParserConfig virBhyveDriverDomainDefParserConfig = {
.domainPostParseCallback = bhyveDomainDefPostParse,
.assignAddressesCallback = bhyveDomainDefAssignAddresses,
};
+
+static void
+bhyveDomainDefNamespaceFree(void *nsdata)
+{
+ bhyveDomainCmdlineDefPtr cmd = nsdata;
+
+ bhyveDomainCmdlineDefFree(cmd);
+}
+
+static int
+bhyveDomainDefNamespaceParse(xmlDocPtr xml ATTRIBUTE_UNUSED,
+ xmlNodePtr root ATTRIBUTE_UNUSED,
+ xmlXPathContextPtr ctxt,
+ void **data)
+{
+ bhyveDomainCmdlineDefPtr cmd = NULL;
+ xmlNodePtr *nodes = NULL;
+ int n;
+ size_t i;
+ int ret = -1;
+
+ if (xmlXPathRegisterNs(ctxt, BAD_CAST "bhyve", BAD_CAST BHYVE_NAMESPACE_HREF) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Failed to register xml namespace '%s'"),
+ BHYVE_NAMESPACE_HREF);
+ return -1;
+ }
+
+ if (VIR_ALLOC(cmd) < 0)
+ return -1;
+
+ n = virXPathNodeSet("./bhyve:commandline/bhyve:arg", ctxt, &nodes);
+ if (n == 0)
+ ret = 0;
+ if (n <= 0)
+ goto cleanup;
+
+ if (VIR_ALLOC_N(cmd->args, n) < 0)
+ goto cleanup;
+
+ for (i = 0; i < n; i++) {
+ cmd->args[cmd->num_args] = virXMLPropString(nodes[i], "value");
+ if (cmd->args[cmd->num_args] == NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("No bhyve command-line argument specified"));
+ goto cleanup;
+ }
+ cmd->num_args++;
+ }
+
+ VIR_STEAL_PTR(*data, cmd);
+ ret = 0;
+
+ cleanup:
+ VIR_FREE(nodes);
+ bhyveDomainDefNamespaceFree(cmd);
+
+ return ret;
+}
+
+static int
+bhyveDomainDefNamespaceFormatXML(virBufferPtr buf ATTRIBUTE_UNUSED,
+ void *nsdata)
+{
+ bhyveDomainCmdlineDefPtr cmd = nsdata;
+ size_t i;
+
+ if (!cmd->num_args)
+ return 0;
+
+ virBufferAddLit(buf, "<bhyve:commandline>\n");
+ virBufferAdjustIndent(buf, 2);
+
+ for (i = 0; i < cmd->num_args; i++)
+ virBufferEscapeString(buf, "<bhyve:arg value='%s'/>\n",
+ cmd->args[i]);
+
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "</bhyve:commandline>\n");
+
+ return 0;
+}
+
+static const char *
+bhyveDomainDefNamespaceHref(void)
+{
+ return "xmlns:bhyve='" BHYVE_NAMESPACE_HREF "'";
+}
+
+virDomainXMLNamespace virBhyveDriverDomainXMLNamespace = {
+ .parse = bhyveDomainDefNamespaceParse,
+ .free = bhyveDomainDefNamespaceFree,
+ .format = bhyveDomainDefNamespaceFormatXML,
+ .href = bhyveDomainDefNamespaceHref,
+};
extern virDomainXMLPrivateDataCallbacks virBhyveDriverPrivateDataCallbacks;
extern virDomainDefParserConfig virBhyveDriverDomainDefParserConfig;
+extern virDomainXMLNamespace virBhyveDriverDomainXMLNamespace;
#endif /* LIBVIRT_BHYVE_DOMAIN_H */
--- /dev/null
+/usr/sbin/bhyve \
+-c 1 \
+-m 214 \
+-u \
+-H \
+-P \
+-s 0:0,hostbridge \
+-s 2:0,ahci,hd:/tmp/freebsd.img \
+-s 3:0,virtio-net,faketapdev,mac=52:54:00:b9:94:02 ARGUMENT1 ARGUMENT2 bhyve
--- /dev/null
+/usr/sbin/bhyveload \
+-m 214 \
+-d /tmp/freebsd.img bhyve
--- /dev/null
+<domain type='bhyve' xmlns:bhyve="http://libvirt.org/schemas/domain/bhyve/1.0">
+ <name>bhyve</name>
+ <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid>
+ <memory>219136</memory>
+ <vcpu>1</vcpu>
+ <os>
+ <type>hvm</type>
+ </os>
+ <devices>
+ <disk type='file'>
+ <driver name='file' type='raw'/>
+ <source file='/tmp/freebsd.img'/>
+ <target dev='hda' bus='sata'/>
+ <address type='drive' controller='0' bus='0' target='2' unit='0'/>
+ </disk>
+ <interface type='bridge'>
+ <mac address='52:54:00:b9:94:02'/>
+ <model type='virtio'/>
+ <source bridge="virbr0"/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
+ </interface>
+ </devices>
+ <bhyve:commandline>
+ <bhyve:arg value='ARGUMENT1'/>
+ <bhyve:arg value='ARGUMENT2'/>
+ </bhyve:commandline>
+</domain>
DO_TEST("vnc-autoport");
DO_TEST("cputopology");
DO_TEST_FAILURE("cputopology-nvcpu-mismatch");
+ DO_TEST("commandline");
/* Address allocation tests */
DO_TEST("addr-single-sata-disk");
--- /dev/null
+<domain type='bhyve' xmlns:bhyve='http://libvirt.org/schemas/domain/bhyve/1.0'>
+ <name>bhyve</name>
+ <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid>
+ <memory unit='KiB'>219136</memory>
+ <currentMemory unit='KiB'>219136</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <disk type='file' device='disk'>
+ <driver name='file' type='raw'/>
+ <source file='/tmp/freebsd.img'/>
+ <target dev='hda' bus='sata'/>
+ <address type='drive' controller='0' bus='0' target='2' unit='0'/>
+ </disk>
+ <controller type='pci' index='0' model='pci-root'/>
+ <controller type='sata' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+ </controller>
+ <interface type='bridge'>
+ <mac address='52:54:00:b9:94:02'/>
+ <source bridge='virbr0'/>
+ <model type='virtio'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
+ </interface>
+ </devices>
+ <bhyve:commandline>
+ <bhyve:arg value='ARGUMENT1'/>
+ <bhyve:arg value='ARGUMENT2'/>
+ </bhyve:commandline>
+</domain>
DO_TEST_DIFFERENT("vnc-vgaconf-off");
DO_TEST_DIFFERENT("vnc-vgaconf-io");
DO_TEST_DIFFERENT("vnc-autoport");
+ DO_TEST_DIFFERENT("commandline");
/* Address allocation tests */
DO_TEST_DIFFERENT("addr-single-sata-disk");