<div dir="ltr"><br><div class="gmail_quote">---<br>
 include/libvirt/virterror.h          |   2 +-<br>
 <a href="http://libvirt.spec.in" rel="noreferrer" target="_blank">libvirt.spec.in</a>                      |   7 +<br>
 m4/virt-driver-jailhouse.m4          |  42 +++++<br>
 meson.build                          |   4 +<br>
 meson_options.txt                    |   1 +<br>
 src/conf/domain_conf.c               |   1 +<br>
 src/conf/domain_conf.h               |   1 +<br>
 src/jailhouse/<a href="http://Makefile.inc.am" rel="noreferrer" target="_blank">Makefile.inc.am</a>        |  21 +++<br>
 src/jailhouse/jailhouse_driver.c     | 219 +++++++++++++++++++++++++++<br>
 src/jailhouse/jailhouse_driver.h     |  23 +++<br>
 src/jailhouse/libvirtd_jailhouse.aug |  43 ++++++<br>
 src/jailhouse/meson.build            |  48 ++++++<br>
 src/libvirt.c                        |  10 ++<br>
 src/meson.build                      |   1 +<br>
 src/qemu/qemu_command.c              |   1 +<br>
 src/util/virerror.c                  |   1 +<br>
 16 files changed, 424 insertions(+), 1 deletion(-)<br>
 create mode 100644 m4/virt-driver-jailhouse.m4<br>
 create mode 100644 src/jailhouse/<a href="http://Makefile.inc.am" rel="noreferrer" target="_blank">Makefile.inc.am</a><br>
 create mode 100644 src/jailhouse/jailhouse_driver.c<br>
 create mode 100644 src/jailhouse/jailhouse_driver.h<br>
 create mode 100644 src/jailhouse/libvirtd_jailhouse.aug<br>
 create mode 100644 src/jailhouse/meson.build<br>
<br>
diff --git a/include/libvirt/virterror.h b/include/libvirt/virterror.h<br>
index 0f1c32283d..97f2ac16d8 100644<br>
--- a/include/libvirt/virterror.h<br>
+++ b/include/libvirt/virterror.h<br>
@@ -136,7 +136,7 @@ typedef enum {<br>
<br>
     VIR_FROM_TPM = 70,          /* Error from TPM */<br>
     VIR_FROM_BPF = 71,          /* Error from BPF code */<br>
-<br>
+    VIR_FROM_JAILHOUSE = 72,    /* Error from Jailhouse driver */<br>
 # ifdef VIR_ENUM_SENTINELS<br>
     VIR_ERR_DOMAIN_LAST<br>
 # endif<br>
diff --git a/<a href="http://libvirt.spec.in" rel="noreferrer" target="_blank">libvirt.spec.in</a> b/<a href="http://libvirt.spec.in" rel="noreferrer" target="_blank">libvirt.spec.in</a><br>
index bb74443484..074410eaa1 100644<br>
--- a/<a href="http://libvirt.spec.in" rel="noreferrer" target="_blank">libvirt.spec.in</a><br>
+++ b/<a href="http://libvirt.spec.in" rel="noreferrer" target="_blank">libvirt.spec.in</a><br>
@@ -17,6 +17,7 @@<br>
 %define with_lxc           0%{!?_without_lxc:1}<br>
 %define with_libxl         0%{!?_without_libxl:1}<br>
 %define with_vbox          0%{!?_without_vbox:1}<br>
+%define with_jailhouse     0%{!?_without_jailhouse:1}<br>
<br>
 %define with_qemu_tcg      %{with_qemu}<br>
<br>
@@ -1045,6 +1046,12 @@ exit 1<br>
     %define arg_vmware -Ddriver_vmware=disabled<br>
 %endif<br>
<br>
+%if %{with_jailhouse}<br>
+    %define arg_jailhouse --with-jailhouse<br>
+%else<br>
+    %define arg_jailhouse --without-jailhouse<br>
+%endif<br>
+<br>
 %if %{with_storage_rbd}<br>
     %define arg_storage_rbd -Dstorage_rbd=enabled<br>
 %else<br>
diff --git a/m4/virt-driver-jailhouse.m4 b/m4/virt-driver-jailhouse.m4<br>
new file mode 100644<br>
index 0000000000..9008c6ce30<br>
--- /dev/null<br>
+++ b/m4/virt-driver-jailhouse.m4<br>
@@ -0,0 +1,42 @@<br>
+dnl The Jailhouse driver<br>
+dnl<br>
+dnl Copyright (C) 2016 Red Hat, Inc.<br>
+dnl<br>
+dnl This library is free software; you can redistribute it and/or<br>
+dnl modify it under the terms of the GNU Lesser General Public<br>
+dnl License as published by the Free Software Foundation; either<br>
+dnl version 2.1 of the License, or (at your option) any later version.<br>
+dnl<br>
+dnl This library is distributed in the hope that it will be useful,<br>
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU<br>
+dnl Lesser General Public License for more details.<br>
+dnl<br>
+dnl You should have received a copy of the GNU Lesser General Public<br>
+dnl License along with this library.  If not, see<br>
+dnl <<a href="http://www.gnu.org/licenses/" rel="noreferrer" target="_blank">http://www.gnu.org/licenses/</a>>.<br>
+dnl<br>
+<br>
+AC_DEFUN([LIBVIRT_DRIVER_ARG_JAILHOUSE], [<br>
+  LIBVIRT_ARG_WITH_FEATURE([JAILHOUSE], [Jailhouse], [check])<br>
+])<br>
+<br>
+AC_DEFUN([LIBVIRT_DRIVER_CHECK_JAILHOUSE], [<br>
+  if test "$with_jailhouse" = "check"; then<br>
+    with_jailhouse=$with_linux<br>
+  fi<br>
+<br>
+  if test "$with_jailhouse" = "yes" && test "$with_linux" = "no"; then<br>
+    AC_MSG_ERROR([The Jailhouse driver can be enabled on Linux only.])<br>
+  fi<br>
+<br>
+  if test "$with_jailhouse" = "yes"; then<br>
+    AC_DEFINE_UNQUOTED([WITH_JAILHOUSE], 1, [whether Jailhouse driver is enabled])<br>
+  fi<br>
+<br>
+  AM_CONDITIONAL([WITH_JAILHOUSE], [test "$with_jailhouse" = "yes"])<br>
+])<br>
+<br>
+AC_DEFUN([LIBVIRT_DRIVER_RESULT_JAILHOUSE], [<br>
+  LIBVIRT_RESULT([Jailhouse], [$with_jailhouse])<br>
+])<br>
diff --git a/meson.build b/meson.build<br>
index dabd4196e6..d0f31f916b 100644<br>
--- a/meson.build<br>
+++ b/meson.build<br>
@@ -1889,6 +1889,10 @@ elif get_option('secdriver_selinux').enabled()<br>
   error('You must install the libselinux development package in order to compile libvirt.')<br>
 endif<br>
<br>
+if get_option('driver_jailhouse').enabled()<br>
+  conf.set('WITH_JAILHOUSE', 1)<br>
+endif<br>
+<br>
 if conf.has('WITH_QEMU') or conf.has('WITH_LXC') or conf.has('WITH_NETWORK')<br>
   conf.set('WITH_BRIDGE', 1)<br>
 endif<br>
diff --git a/meson_options.txt b/meson_options.txt<br>
index 79554c3186..c1f2b51427 100644<br>
--- a/meson_options.txt<br>
+++ b/meson_options.txt<br>
@@ -68,6 +68,7 @@ option('driver_vbox', type: 'feature', value: 'enabled', description: 'VirtualBo<br>
 option('vbox_xpcomc_dir', type: 'string', value: '', description: 'Location of directory containing VirtualBox XPCOMC library')<br>
 option('driver_vmware', type: 'feature', value: 'enabled', description: 'VMware driver')<br>
 option('driver_vz', type: 'feature', value: 'auto', description: 'Virtuozzo driver')<br>
+option('driver_jailhouse', type: 'feature', value: 'auto', description: 'Jailhouse driver')<br>
<br>
 option('secdriver_apparmor', type: 'feature', value: 'auto', description: 'use AppArmor security driver')<br>
 option('apparmor_profiles', type: 'boolean', value: false, description: 'install apparmor profiles')<br>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c<br>
index 5d3ae8bb28..cb946d5e87 100644<br>
--- a/src/conf/domain_conf.c<br>
+++ b/src/conf/domain_conf.c<br>
@@ -130,6 +130,7 @@ VIR_ENUM_IMPL(virDomainVirt,<br>
               "parallels",<br>
               "bhyve",<br>
               "vz",<br>
+              "jailhouse",<br>
 );<br>
<br>
 VIR_ENUM_IMPL(virDomainOS,<br>
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h<br>
index 8a0f26f5c0..cc51547bc2 100644<br>
--- a/src/conf/domain_conf.h<br>
+++ b/src/conf/domain_conf.h<br>
@@ -139,6 +139,7 @@ typedef enum {<br>
     VIR_DOMAIN_VIRT_PARALLELS,<br>
     VIR_DOMAIN_VIRT_BHYVE,<br>
     VIR_DOMAIN_VIRT_VZ,<br>
+    VIR_DOMAIN_VIRT_JAILHOUSE,<br>
<br>
     VIR_DOMAIN_VIRT_LAST<br>
 } virDomainVirtType;<br>
diff --git a/src/jailhouse/<a href="http://Makefile.inc.am" rel="noreferrer" target="_blank">Makefile.inc.am</a> b/src/jailhouse/<a href="http://Makefile.inc.am" rel="noreferrer" target="_blank">Makefile.inc.am</a><br>
new file mode 100644<br>
index 0000000000..02822b2ea1<br>
--- /dev/null<br>
+++ b/src/jailhouse/<a href="http://Makefile.inc.am" rel="noreferrer" target="_blank">Makefile.inc.am</a><br>
@@ -0,0 +1,21 @@<br>
+# vim: filetype=automake<br>
+<br>
+JAILHOUSE_DRIVER_SOURCES = \<br>
+       jailhouse/jailhouse_driver.c \<br>
+       jailhouse/jailhouse_driver.h \<br>
+       $(NULL)<br>
+<br>
+<br>
+DRIVER_SOURCE_FILES += $(addprefix $(srcdir)/,$(JAILHOUSE_DRIVER_SOURCES))<br>
+<br>
+EXTRA_DIST += $(JAILHOUSE_DRIVER_SOURCES)<br>
+<br>
+if WITH_JAILHOUSE<br>
+noinst_LTLIBRARIES += <a href="http://libvirt_driver_jailhouse.la" rel="noreferrer" target="_blank">libvirt_driver_jailhouse.la</a><br>
+libvirt_la_BUILT_LIBADD += <a href="http://libvirt_driver_jailhouse.la" rel="noreferrer" target="_blank">libvirt_driver_jailhouse.la</a><br>
+libvirt_driver_jailhouse_la_CFLAGS = \<br>
+       -I$(srcdir)/conf \<br>
+       $(AM_CFLAGS) \<br>
+       $(NULL)<br>
+libvirt_driver_jailhouse_la_SOURCES = $(JAILHOUSE_DRIVER_SOURCES)<br>
+endif WITH_JAILHOUSE<br>
diff --git a/src/jailhouse/jailhouse_driver.c b/src/jailhouse/jailhouse_driver.c<br>
new file mode 100644<br>
index 0000000000..0175ba771b<br>
--- /dev/null<br>
+++ b/src/jailhouse/jailhouse_driver.c<br>
@@ -0,0 +1,219 @@<br>
+/*<br>
+ * jailhouse_driver.c: Implementation of driver for Jailhouse hypervisor<br>
+ *<br>
+ * Copyright (C) 2020 Prakhar Bansal<br>
+ *<br>
+ * This library is free software; you can redistribute it and/or<br>
+ * modify it under the terms of the GNU Lesser General Public<br>
+ * License as published by the Free Software Foundation; either<br>
+ * version 2.1 of the License, or (at your option) any later version.<br>
+ *<br>
+ * This library is distributed in the hope that it will be useful,<br>
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU<br>
+ * Lesser General Public License for more details.<br>
+ *<br>
+ * You should have received a copy of the GNU Lesser General Public<br>
+ * License along with this library.  If not, see<br>
+ * <<a href="http://www.gnu.org/licenses/" rel="noreferrer" target="_blank">http://www.gnu.org/licenses/</a>>.<br>
+ */<br>
+<br>
+#include <config.h><br>
+<br>
+#include "jailhouse_driver.h"<br>
+#include "virtypedparam.h"<br>
+#include "virerror.h"<br>
+#include "virstring.h"<br>
+#include "viralloc.h"<br>
+#include "domain_conf.h"<br>
+#include "virfile.h"<br>
+#include "datatypes.h"<br>
+#include "vircommand.h"<br>
+#include <string.h><br>
+<br>
+#define UNUSED(x) (void)(x)<br>
+<br>
+static virDrvOpenStatus<br>
+jailhouseConnectOpen(virConnectPtr conn,<br>
+                     virConnectAuthPtr auth,<br>
+                     virConfPtr conf,<br>
+                     unsigned int flags)<br>
+{<br>
+    UNUSED(conn);<br>
+    UNUSED(auth);<br>
+    UNUSED(conf);<br>
+    UNUSED(flags);<br>
+    return 0;<br>
+}<br>
+<br>
+static int<br>
+jailhouseConnectClose(virConnectPtr conn)<br>
+{<br>
+    UNUSED(conn);<br>
+    return 0;<br>
+}<br>
+<br>
+static const char *<br>
+jailhouseConnectGetType(virConnectPtr conn)<br>
+{<br>
+    UNUSED(conn);<br>
+    return NULL;<br>
+<br>
+}<br>
+<br>
+static char *<br>
+jailhouseConnectGetHostname(virConnectPtr conn)<br>
+{<br>
+    UNUSED(conn);<br>
+    return NULL;<br>
+}<br>
+<br>
+static int<br>
+jailhouseNodeGetInfo(virConnectPtr conn,<br>
+                     virNodeInfoPtr info)<br>
+{<br>
+    UNUSED(conn);<br>
+    UNUSED(info);<br>
+    return -1;<br>
+}<br>
+<br>
+static int<br>
+jailhouseConnectListDomains(virConnectPtr conn,<br>
+                            int *ids,<br>
+                            int maxids)<br>
+{<br>
+    UNUSED(conn);<br>
+    UNUSED(ids);<br>
+    UNUSED(maxids);<br>
+    return -1;<br>
+}<br>
+<br>
+static int<br>
+jailhouseConnectNumOfDomains(virConnectPtr conn)<br>
+{<br>
+    UNUSED(conn);<br>
+    return -1;<br>
+}<br>
+<br>
+static int<br>
+jailhouseConnectListAllDomains(virConnectPtr conn,<br>
+                               virDomainPtr **domain,<br>
+                               unsigned int flags)<br>
+{<br>
+    UNUSED(conn);<br>
+    UNUSED(domain);<br>
+    UNUSED(flags);<br>
+    return -1;<br>
+}<br>
+<br>
+static virDomainPtr<br>
+jailhouseDomainLookupByID(virConnectPtr conn,<br>
+                          int id)<br>
+{<br>
+    UNUSED(conn);<br>
+    UNUSED(id);<br>
+    return NULL;<br>
+}<br>
+<br>
+static virDomainPtr<br>
+jailhouseDomainLookupByName(virConnectPtr conn,<br>
+                            const char *name)<br>
+{<br>
+    UNUSED(conn);<br>
+    UNUSED(name);<br>
+    return NULL;<br>
+}<br>
+<br>
+static virDomainPtr<br>
+jailhouseDomainLookupByUUID(virConnectPtr conn,<br>
+                            const unsigned char *uuid)<br>
+{<br>
+    UNUSED(conn);<br>
+    UNUSED(uuid);<br>
+    return NULL;<br>
+}<br>
+<br>
+static int<br>
+jailhouseDomainCreate(virDomainPtr domain)<br>
+{<br>
+    UNUSED(domain);<br>
+    return -1;<br>
+<br>
+}<br>
+<br>
+static int<br>
+jailhouseDomainShutdown(virDomainPtr domain)<br>
+{<br>
+    UNUSED(domain);<br>
+    return -1;<br>
+}<br>
+<br>
+<br>
+static int<br>
+jailhouseDomainDestroy(virDomainPtr domain)<br>
+{<br>
+    UNUSED(domain);<br>
+    return -1;<br>
+}<br>
+<br>
+static int<br>
+jailhouseDomainGetInfo(virDomainPtr domain,<br>
+                       virDomainInfoPtr info)<br>
+{<br>
+    UNUSED(domain);<br>
+    UNUSED(info);<br>
+    return -1;<br>
+}<br>
+<br>
+static int<br>
+jailhouseDomainGetState(virDomainPtr domain,<br>
+                        int *state,<br>
+                        int *reason,<br>
+                        unsigned int flags)<br>
+{<br>
+    UNUSED(domain);<br>
+    UNUSED(state);<br>
+    UNUSED(reason);<br>
+    UNUSED(flags);<br>
+    return -1;<br>
+}<br>
+<br>
+static char *<br>
+jailhouseDomainGetXMLDesc(virDomainPtr domain,<br>
+                          unsigned int flags)<br>
+{<br>
+    UNUSED(domain);<br>
+    UNUSED(flags);<br>
+    return NULL;<br>
+}<br>
+<br>
+static virHypervisorDriver jailhouseHypervisorDriver = {<br>
+    .name = "JAILHOUSE",<br>
+    .connectOpen = jailhouseConnectOpen, /* 6.3.0 */<br>
+    .connectClose = jailhouseConnectClose, /* 6.3.0 */<br>
+    .connectListDomains = jailhouseConnectListDomains, /* 6.3.0 */<br>
+    .connectNumOfDomains = jailhouseConnectNumOfDomains, /* 6.3.0 */<br>
+    .connectListAllDomains = jailhouseConnectListAllDomains, /* 6.3.0 */<br>
+    .domainLookupByID = jailhouseDomainLookupByID, /* 6.3.0 */<br>
+    .domainLookupByUUID = jailhouseDomainLookupByUUID, /* 6.3.0 */<br>
+    .domainLookupByName = jailhouseDomainLookupByName, /* 6.3.0 */<br>
+    .domainGetXMLDesc = jailhouseDomainGetXMLDesc, /* 6.3.0 */<br>
+    .domainCreate = jailhouseDomainCreate, /* 6.3.0 */<br>
+    .connectGetType = jailhouseConnectGetType, /* 6.3.0 */<br>
+    .connectGetHostname = jailhouseConnectGetHostname, /* 6.3.0 */<br>
+    .nodeGetInfo = jailhouseNodeGetInfo, /* 6.3.0 */<br>
+    .domainShutdown = jailhouseDomainShutdown, /* 6.3.0 */<br>
+    .domainDestroy = jailhouseDomainDestroy, /* 6.3.0 */<br>
+    .domainGetInfo = jailhouseDomainGetInfo, /* 6.3.0 */<br>
+    .domainGetState = jailhouseDomainGetState, /* 6.3.0 */<br>
+};<br>
+<br>
+static virConnectDriver jailhouseConnectDriver = {<br>
+    .hypervisorDriver = &jailhouseHypervisorDriver,<br>
+};<br>
+<br>
+int<br>
+jailhouseRegister(void)<br>
+{<br>
+    return virRegisterConnectDriver(&jailhouseConnectDriver, false);<br>
+}<br>
diff --git a/src/jailhouse/jailhouse_driver.h b/src/jailhouse/jailhouse_driver.h<br>
new file mode 100644<br>
index 0000000000..b0dbc8d033<br>
--- /dev/null<br>
+++ b/src/jailhouse/jailhouse_driver.h<br>
@@ -0,0 +1,23 @@<br>
+/*<br>
+ * jailhouse_driver.h: Libvirt driver for Jailhouse hypervisor<br>
+ *<br>
+ * Copyright (C) 2020 Prakhar Bansal<br>
+ *<br>
+ * This library is free software; you can redistribute it and/or<br>
+ * modify it under the terms of the GNU Lesser General Public<br>
+ * License as published by the Free Software Foundation; either<br>
+ * version 2.1 of the License, or (at your option) any later version.<br>
+ *<br>
+ * This library is distributed in the hope that it will be useful,<br>
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU<br>
+ * Lesser General Public License for more details.<br>
+ *<br>
+ * You should have received a copy of the GNU Lesser General Public<br>
+ * License along with this library.  If not, see<br>
+ * <<a href="http://www.gnu.org/licenses/" rel="noreferrer" target="_blank">http://www.gnu.org/licenses/</a>>.<br>
+ */<br>
+<br>
+#pragma once<br>
+<br>
+int jailhouseRegister(void);<br>
diff --git a/src/jailhouse/libvirtd_jailhouse.aug b/src/jailhouse/libvirtd_jailhouse.aug<br>
new file mode 100644<br>
index 0000000000..96a186eae2<br>
--- /dev/null<br>
+++ b/src/jailhouse/libvirtd_jailhouse.aug<br>
@@ -0,0 +1,43 @@<br>
+(* /etc/libvirt/jailhouse.conf *)<br>
+<br>
+module Libvirtd_jailhouse =<br>
+   autoload xfm<br>
+<br>
+   let eol   = del /[ \t]*\n/ "\n"<br>
+   let value_sep   = del /[ \t]*=[ \t]*/  " = "<br>
+   let indent = del /[ \t]*/ ""<br>
+<br>
+   let array_sep  = del /,[ \t\n]*/ ", "<br>
+   let array_start = del /\[[ \t\n]*/ "[ "<br>
+   let array_end = del /\]/ "]"<br>
+<br>
+   let str_val = del /\"/ "\"" . store /[^\"]*/ . del /\"/ "\""<br>
+   let bool_val = store /0|1/<br>
+   let int_val = store /[0-9]+/<br>
+   let str_array_element = [ seq "el" . str_val ] . del /[ \t\n]*/ ""<br>
+   let str_array_val = counter "el" . array_start . ( str_array_element . ( array_sep . str_array_element ) * ) ? . array_end<br>
+<br>
+   let str_entry       (kw:string) = [ key kw . value_sep . str_val ]<br>
+   let bool_entry      (kw:string) = [ key kw . value_sep . bool_val ]<br>
+   let int_entry       (kw:string) = [ key kw . value_sep . int_val ]<br>
+   let str_array_entry (kw:string) = [ key kw . value_sep . str_array_val ]<br>
+<br>
+   (* Config entry grouped by function - same order as example config *)<br>
+   let log_entry = bool_entry "log_with_libvirtd"<br>
+                 | str_entry "security_driver"<br>
+                 | bool_entry "security_default_confined"<br>
+                 | bool_entry "security_require_confined"<br>
+<br>
+   (* Each entry in the config is one of the following three ... *)<br>
+   let entry = log_entry<br>
+   let comment = [ label "#comment" . del /#[ \t]*/ "# " .  store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ]<br>
+   let empty = [ label "#empty" . eol ]<br>
+<br>
+   let record = indent . entry . eol<br>
+<br>
+   let lns = ( record | comment | empty ) *<br>
+<br>
+   let filter = incl "/etc/libvirt/jailhouse.conf"<br>
+              . Util.stdexcl<br>
+<br>
+   let xfm = transform lns filter<br>
diff --git a/src/jailhouse/meson.build b/src/jailhouse/meson.build<br>
new file mode 100644<br>
index 0000000000..45ceeecca3<br>
--- /dev/null<br>
+++ b/src/jailhouse/meson.build<br>
@@ -0,0 +1,48 @@<br>
+jailhouse_sources = files(<br>
+  'jailhouse_driver.c',<br>
+)<br>
+<br>
+driver_source_files += jailhouse_sources<br>
+stateful_driver_source_files += jailhouse_sources<br>
+<br>
+if conf.has('WITH_JAILHOUSE')<br>
+  jailhouse_driver_impl = static_library(<br>
+    'virt_driver_jailhouse_impl',<br>
+    [<br>
+      jailhouse_sources,<br>
+    ],<br>
+    dependencies: [<br>
+      access_dep,<br>
+      src_dep,<br>
+    ],<br>
+    include_directories: [<br>
+      conf_inc_dir,<br>
+      hypervisor_inc_dir,<br>
+    ],<br>
+  )<br>
+<br>
+  virt_modules += {<br>
+    'name': 'virt_driver_jailhouse',<br>
+    'link_whole': [<br>
+      jailhouse_driver_impl,<br>
+    ],<br>
+    'link_args': [<br>
+      libvirt_no_undefined,<br>
+    ],<br>
+  }<br>
+<br>
+  virt_daemons += {<br>
+    'name': 'virtjailhoused',<br>
+    'c_args': [<br>
+      '-DDAEMON_NAME="virtjailhoused"',<br>
+      '-DMODULE_NAME="jailhouse"'<br>
+    ],<br>
+  }<br>
+<br>
+  virt_conf_files += files('jailhouse.conf')<br>
+  virt_aug_files += files('libvirtd_jailhouse.aug')<br>
+<br>
+  virt_daemon_confs += {<br>
+    'name': 'virtjailhoused',<br>
+  }<br>
+endif<br>
diff --git a/src/libvirt.c b/src/libvirt.c<br>
index b2d0ba3d23..59b75c6f7b 100644<br>
--- a/src/libvirt.c<br>
+++ b/src/libvirt.c<br>
@@ -75,6 +75,9 @@<br>
 #ifdef WITH_BHYVE<br>
 # include "bhyve/bhyve_driver.h"<br>
 #endif<br>
+#ifdef WITH_JAILHOUSE<br>
+# include "jailhouse/jailhouse_driver.h"<br>
+#endif<br>
 #include "access/viraccessmanager.h"<br>
<br>
 #define VIR_FROM_THIS VIR_FROM_NONE<br>
@@ -271,6 +274,10 @@ virGlobalInit(void)<br>
     if (hypervRegister() == -1)<br>
         goto error;<br>
 #endif<br>
+#ifdef WITH_JAILHOUSE<br>
+    if (jailhouseRegister() == -1)<br>
+        goto error;<br>
+#endif<br>
 #ifdef WITH_REMOTE<br>
     if (remoteRegister() == -1)<br>
         goto error;<br>
@@ -1003,6 +1010,9 @@ virConnectOpenInternal(const char *name,<br>
 #endif<br>
 #ifndef WITH_VZ<br>
              STRCASEEQ(ret->uri->scheme, "parallels") ||<br>
+#endif<br>
+#ifndef WITH_JAILHOUSE<br>
+             STRCASEEQ(ret->uri->scheme, "jailhouse") ||<br>
 #endif<br>
              false)) {<br>
             virReportErrorHelper(VIR_FROM_NONE, VIR_ERR_CONFIG_UNSUPPORTED,<br>
diff --git a/src/meson.build b/src/meson.build<br>
index 5d8deaf548..7188dc623e 100644<br>
--- a/src/meson.build<br>
+++ b/src/meson.build<br>
@@ -268,6 +268,7 @@ subdir('security')<br>
 subdir('storage')<br>
<br>
 subdir('bhyve')<br>
+subdir('jailhouse')<br>
 subdir('esx')<br>
 subdir('hyperv')<br>
 subdir('libxl')<br>
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c<br>
index 6798febf8d..f750270230 100644<br>
--- a/src/qemu/qemu_command.c<br>
+++ b/src/qemu/qemu_command.c<br>
@@ -6819,6 +6819,7 @@ qemuBuildMachineCommandLine(virCommandPtr cmd,<br>
     case VIR_DOMAIN_VIRT_PHYP:<br>
     case VIR_DOMAIN_VIRT_PARALLELS:<br>
     case VIR_DOMAIN_VIRT_BHYVE:<br>
+    case VIR_DOMAIN_VIRT_JAILHOUSE:<br>
     case VIR_DOMAIN_VIRT_VZ:<br>
     case VIR_DOMAIN_VIRT_NONE:<br>
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
diff --git a/src/util/virerror.c b/src/util/virerror.c<br>
index 507a29f50f..8caf24a5f2 100644<br>
--- a/src/util/virerror.c<br>
+++ b/src/util/virerror.c<br>
@@ -134,6 +134,7 @@ VIR_ENUM_IMPL(virErrorDomain,<br>
               "Thread jobs",<br>
               "Admin Interface",<br>
               "Log Manager",<br>
+              "Jailhouse Driver",<br>
               "Xen XL Config",<br>
<br>
               "Perf", /* 65 */<br>
-- <br>
2.17.1<br>
<br>
</div></div>