<div dir="ltr"><br><div class="gmail_quote">---<br>
 include/libvirt/virterror.h         |   1 +<br>
 po/POTFILES.in                      |   2 +<br>
 src/jailhouse/<a href="http://Makefile.inc.am" rel="noreferrer" target="_blank">Makefile.inc.am</a>       |  34 ++-<br>
 src/jailhouse/jailhouse.conf        |  10 +<br>
 src/jailhouse/jailhouse_api.c       | 372 ++++++++++++++++++++++++++++<br>
 src/jailhouse/jailhouse_api.h       |  74 ++++++<br>
 src/jailhouse/jailhouse_driver.c    | 302 +++++++++++++++++-----<br>
 src/jailhouse/jailhouse_driver.h    |  51 ++++<br>
 src/jailhouse/meson.build           |   1 +<br>
 src/libvirt.c                       |  10 -<br>
 src/remote/remote_daemon.c          |   4 +<br>
 src/remote/remote_daemon_dispatch.c |   3 +-<br>
 12 files changed, 783 insertions(+), 81 deletions(-)<br>
 create mode 100644 src/jailhouse/jailhouse.conf<br>
 create mode 100644 src/jailhouse/jailhouse_api.c<br>
 create mode 100644 src/jailhouse/jailhouse_api.h<br>
<br>
diff --git a/include/libvirt/virterror.h b/include/libvirt/virterror.h<br>
index 97f2ac16d8..9f1bca2684 100644<br>
--- a/include/libvirt/virterror.h<br>
+++ b/include/libvirt/virterror.h<br>
@@ -137,6 +137,7 @@ typedef enum {<br>
     VIR_FROM_TPM = 70,          /* Error from TPM */<br>
     VIR_FROM_BPF = 71,          /* Error from BPF code */<br>
     VIR_FROM_JAILHOUSE = 72,    /* Error from Jailhouse driver */<br>
+<br>
 # ifdef VIR_ENUM_SENTINELS<br>
     VIR_ERR_DOMAIN_LAST<br>
 # endif<br>
diff --git a/po/POTFILES.in b/po/POTFILES.in<br>
index 3d6c20c55f..a94285817f 100644<br>
--- a/po/POTFILES.in<br>
+++ b/po/POTFILES.in<br>
@@ -85,6 +85,8 @@<br>
 @SRCDIR@src/interface/interface_backend_netcf.c<br>
 @SRCDIR@src/interface/interface_backend_udev.c<br>
 @SRCDIR@src/internal.h<br>
+@SRCDIR@src/jailhouse/jailhouse_api.c<br>
+@SRCDIR@src/jailhouse/jailhouse_driver.c<br>
 @SRCDIR@src/libvirt-domain-checkpoint.c<br>
 @SRCDIR@src/libvirt-domain-snapshot.c<br>
 @SRCDIR@src/libvirt-domain.c<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>
index 02822b2ea1..324c3b1b16 100644<br>
--- a/src/jailhouse/<a href="http://Makefile.inc.am" rel="noreferrer" target="_blank">Makefile.inc.am</a><br>
+++ b/src/jailhouse/<a href="http://Makefile.inc.am" rel="noreferrer" target="_blank">Makefile.inc.am</a><br>
@@ -1,8 +1,11 @@<br>
 # vim: filetype=automake<br>
<br>
+<br>
 JAILHOUSE_DRIVER_SOURCES = \<br>
        jailhouse/jailhouse_driver.c \<br>
        jailhouse/jailhouse_driver.h \<br>
+       jailhouse/jailhouse_api.c \<br>
+       jailhouse/jailhouse_api.h \<br>
        $(NULL)<br>
<br>
<br>
@@ -11,11 +14,34 @@ DRIVER_SOURCE_FILES += $(addprefix $(srcdir)/,$(JAILHOUSE_DRIVER_SOURCES))<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>
+<br>
+noinst_LTLIBRARIES += <a href="http://libvirt_driver_jailhouse_impl.la" rel="noreferrer" target="_blank">libvirt_driver_jailhouse_impl.la</a><br>
+libvirt_driver_jailhouse_la_SOURCES =<br>
+libvirt_driver_jailhouse_la_LIBADD = \<br>
+       <a href="http://libvirt_driver_jailhouse_impl.la" rel="noreferrer" target="_blank">libvirt_driver_jailhouse_impl.la</a> \<br>
+       <a href="http://libvirt.la" rel="noreferrer" target="_blank">libvirt.la</a> \<br>
+       $(GLIB_LIBS) \<br>
+       $(NULL)<br>
+mod_LTLIBRARIES += <a href="http://libvirt_driver_jailhouse.la" rel="noreferrer" target="_blank">libvirt_driver_jailhouse.la</a><br>
+libvirt_driver_jailhouse_la_LDFLAGS = $(AM_LDFLAGS_MOD_NOUNDEF)<br>
+<br>
+libvirt_driver_jailhouse_impl_la_CFLAGS = \<br>
        -I$(srcdir)/conf \<br>
        $(AM_CFLAGS) \<br>
        $(NULL)<br>
-libvirt_driver_jailhouse_la_SOURCES = $(JAILHOUSE_DRIVER_SOURCES)<br>
+libvirt_driver_jailhouse_impl_la_SOURCES = \<br>
+       $(JAILHOUSE_DRIVER_SOURCES)<br>
+<br>
+sbin_PROGRAMS += virtjailhoused<br>
+<br>
+virtjailhoused_SOURCES = $(REMOTE_DAEMON_SOURCES)<br>
+nodist_virtjailhoused_SOURCES = $(REMOTE_DAEMON_GENERATED)<br>
+virtjailhoused_CFLAGS = \<br>
+       $(REMOTE_DAEMON_CFLAGS) \<br>
+       -DDAEMON_NAME="\"virtjailhoused\"" \<br>
+       -DMODULE_NAME="\"jailhouse\"" \<br>
+       $(NULL)<br>
+virtjailhoused_LDFLAGS = $(REMOTE_DAEMON_LD_FLAGS)<br>
+virtjailhoused_LDADD = $(REMOTE_DAEMON_LD_ADD)<br>
+<br>
 endif WITH_JAILHOUSE<br>
diff --git a/src/jailhouse/jailhouse.conf b/src/jailhouse/jailhouse.conf<br>
new file mode 100644<br>
index 0000000000..587068b9d0<br>
--- /dev/null<br>
+++ b/src/jailhouse/jailhouse.conf<br>
@@ -0,0 +1,10 @@<br>
+# Configuration for the Jailhouse driver.<br>
+<br>
+# Jailhouse system configuration file to enable the Jailhouse hypervisor on the<br>
+# system. This is a required configuration parameter for the driver.<br>
+#system_config = "/etc/libvirt/jailhouse/qemu-x86.cell"<br>
+<br>
+# Specify a directory which contains all the non-root cell configurations which<br>
+# should be created by the driver at the startup. This is optional. Default<br>
+# value of "/etc/libvirt/jailhouse/cells/" will be used if left empty.<br>
+#non_root_cells_dir = "/etc/libvirt/jailhouse/cells/"<br>
diff --git a/src/jailhouse/jailhouse_api.c b/src/jailhouse/jailhouse_api.c<br>
new file mode 100644<br>
index 0000000000..cda00b50e7<br>
--- /dev/null<br>
+++ b/src/jailhouse/jailhouse_api.c<br>
@@ -0,0 +1,372 @@<br>
+/*<br>
+ * jailhouse_api.c: Jailhouse API<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>
+<br>
+#include <config.h><br>
+#include <stdio.h><br>
+#include <stdlib.h><br>
+#include <string.h><br>
+#include <dirent.h><br>
+#include <fcntl.h><br>
+#include <unistd.h><br>
+#include <errno.h><br>
+#include <sys/types.h><br>
+#include <sys/ioctl.h><br>
+#include <sys/stat.h><br>
+#include <linux/types.h><br>
+<br>
+#include "viralloc.h"<br>
+#include "virerror.h"<br>
+#include "virfile.h"<br>
+#include "virlog.h"<br>
+#include "virstring.h"<br>
+#include "jailhouse_api.h"<br>
+<br>
+#define JAILHOUSE_DEVICE                        "/dev/jailhouse"<br>
+#define JAILHOUSE_CELLS                         "/sys/devices/jailhouse/cells"<br>
+#define MAX_JAILHOUSE_SYS_CONFIG_FILE_SIZE      1024*1024<br>
+#define MAX_JAILHOUSE_CELL_CONFIG_FILE_SIZE     1024<br>
+<br>
+<br>
+#define JAILHOUSE_ENABLE               _IOW(0, 0, void *)<br>
+#define JAILHOUSE_DISABLE              _IO(0, 1)<br>
+#define JAILHOUSE_CELL_CREATE          _IOW(0, 2, virJailhouseCellCreate)<br>
+#define JAILHOUSE_CELL_DESTROY         _IOW(0, 5, virJailhouseCellId)<br>
+<br>
+#define VIR_FROM_THIS VIR_FROM_JAILHOUSE<br>
+<br>
+VIR_LOG_INIT("jailhouse.jailhouse_api");<br>
+<br>
+#define JAILHOUSE_CELL_FILE_EXTENSION ".cell"<br>
+<br>
+/* Forward declarations */<br>
+<br>
+/* Open the Jailhouse device for ioctl APIs */<br>
+int openDev(void);<br>
+<br>
+/* Reads cell's property given by 'entry' using sysfs API */<br>
+char *readSysfsCellString(const unsigned int id, const char *entry);<br>
+<br>
+int cell_match(const struct dirent *dirent);<br>
+<br>
+int createCell(const char *conf_file);<br>
+<br>
+int destroyCell(virJailhouseCellId cell_id);<br>
+<br>
+int getCellInfo(const unsigned int id,<br>
+                virJailhouseCellInfoPtr * cell_info);<br>
+<br>
+int<br>
+jailhouseEnable(const char *sys_conf_file_path)<br>
+{<br>
+    int err = -1, len;<br>
+    g_autofree char *buffer = NULL;<br>
+    VIR_AUTOCLOSE fd = -1;<br>
+<br>
+    if (!virFileExists(sys_conf_file_path))<br>
+        return 0;<br>
+<br>
+    len = virFileReadAll(sys_conf_file_path, MAX_JAILHOUSE_SYS_CONFIG_FILE_SIZE, &buffer);<br>
+    if (len < 0 || !buffer) {<br>
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
+                      "%s", _("Failed to read the system configuration file"));<br>
+        return -1;<br>
+    }<br>
+<br>
+    fd = openDev();<br>
+<br>
+    err = ioctl(fd, JAILHOUSE_ENABLE, buffer);<br>
+    if (err) {<br>
+        virReportSystemError(errno, "%s", _("Failed to enable jailhouse"));<br>
+        return err;<br>
+    }<br>
+<br>
+    VIR_DEBUG("Jailhouse hypervisor is enabled");<br>
+<br>
+    return 1;<br>
+}<br>
+<br>
+int<br>
+jailhouseDisable(void)<br>
+{<br>
+    int err = -1;<br>
+    VIR_AUTOCLOSE fd = -1;<br>
+<br>
+    fd = openDev();<br>
+<br>
+    err = ioctl(fd, JAILHOUSE_DISABLE);<br>
+    if (err)<br>
+        virReportSystemError(errno,<br>
+                             "%s",<br>
+                             _("Failed to disable jailhouse: %s"));<br>
+<br>
+    VIR_DEBUG("Jailhouse hypervisor is disabled");<br>
+<br>
+    return err;<br>
+}<br>
+<br>
+int<br>
+cell_match(const struct dirent *dirent)<br>
+{<br>
+    char *ext = strrchr(dirent->d_name, '.');<br>
+<br>
+    return dirent->d_name[0] != '.'<br>
+        && (STREQ(ext, JAILHOUSE_CELL_FILE_EXTENSION) == 0);<br>
+}<br>
+<br>
+int<br>
+createJailhouseCells(const char *dir_path)<br>
+{<br>
+<br>
+    struct dirent **namelist;<br>
+    int num_entries, ret = -1;<br>
+    size_t i;<br>
+<br>
+    if (strlen(dir_path) == 0)<br>
+        return ret;<br>
+<br>
+    num_entries = scandir(dir_path, &namelist, cell_match, alphasort);<br>
+    if (num_entries == -1) {<br>
+        if (errno == ENOENT) {<br>
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
+                           _("No cells found in %s, scandir failed."),<br>
+                           dir_path);<br>
+            goto fail;<br>
+        }<br>
+<br>
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
+                       _("Error reading cell configurations in %s."),<br>
+                       dir_path);<br>
+        goto fail;<br>
+    }<br>
+<br>
+<br>
+    for (i = 0; i < num_entries; i++) {<br>
+        g_autofree char *file_path = g_strdup_printf("%s/%s", dir_path, namelist[i]->d_name);<br>
+<br>
+        if (createCell(file_path) != 0) {<br>
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
+                           _("Cell creation failed with conf found in  %s."),<br>
+                           namelist[i]->d_name);<br>
+            goto fail;<br>
+        }<br>
+    }<br>
+<br>
+    ret = 0;<br>
+<br>
+ fail:<br>
+    VIR_FREE(namelist);<br>
+    return ret;<br>
+}<br>
+<br>
+int<br>
+openDev(void)<br>
+{<br>
+    int fd;<br>
+<br>
+    fd = open(JAILHOUSE_DEVICE, O_RDWR);<br>
+    if (fd < 0) {<br>
+        virReportSystemError(errno,<br>
+                             _("Error opening jailhouse device %s"),<br>
+                             JAILHOUSE_DEVICE);<br>
+    }<br>
+    return fd;<br>
+}<br>
+<br>
+int<br>
+createCell(const char *conf_file)<br>
+{<br>
+    virJailhouseCellCreate cell_create;<br>
+    int err = -1, len;<br>
+    g_autofree char *buffer = NULL;<br>
+    VIR_AUTOCLOSE fd = -1;<br>
+<br>
+    if (strlen(conf_file) == 0)<br>
+        return err;<br>
+<br>
+    len = virFileReadAll(conf_file, MAX_JAILHOUSE_CELL_CONFIG_FILE_SIZE, &buffer);<br>
+    if (len < 0 || !buffer) {<br>
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
+                      "%s", _("Failed to read the system configuration file"));<br>
+        return err;<br>
+    }<br>
+<br>
+    cell_create.config_address = (unsigned long) buffer;<br>
+    cell_create.config_size = len;<br>
+<br>
+    fd = openDev();<br>
+<br>
+    err = ioctl(fd, JAILHOUSE_CELL_CREATE, &cell_create);<br>
+    if (err)<br>
+        virReportSystemError(errno,<br>
+                             "%s",<br>
+                             _("Cell creation failed: %s"));<br>
+<br>
+    return err;<br>
+}<br>
+<br>
+void<br>
+cellInfoFree(virJailhouseCellInfoPtr cell_info)<br>
+{<br>
+    VIR_FREE(cell_info->state);<br>
+    VIR_FREE(cell_info->cpus_assigned_list);<br>
+    VIR_FREE(cell_info->cpus_failed_list);<br>
+    VIR_FREE(cell_info);<br>
+}<br>
+<br>
+char *<br>
+readSysfsCellString(const unsigned int id, const char *entry)<br>
+{<br>
+    g_autofree char *buffer = NULL;<br>
+    g_autofree char *file_path = NULL;<br>
+    int len = -1;<br>
+<br>
+    file_path = g_strdup_printf(JAILHOUSE_CELLS "%u/%s", id, entry);<br>
+<br>
+    len = virFileReadAll(file_path, 1024, &buffer);<br>
+    if (len < 0 || !buffer) {<br>
+        virReportError(VIR_ERR_INTERNAL_ERROR,<br>
+                       _("Error reading cell(%u) %s from %s failed"),<br>
+                       id, entry, file_path);<br>
+        return NULL;<br>
+    }<br>
+<br>
+    virTrimSpaces(buffer, NULL);<br>
+<br>
+    return buffer;<br>
+}<br>
+<br>
+int<br>
+getCellInfo(const unsigned int id, virJailhouseCellInfoPtr * cell_info_ptr)<br>
+{<br>
+    char *tmp;<br>
+<br>
+    if (VIR_ALLOC(*cell_info_ptr) < 0)<br>
+        return -1;<br>
+<br>
+    virJailhouseCellInfoPtr cell_info = *cell_info_ptr;<br>
+<br>
+    /* set cell id */<br>
+    cell_info-><a href="http://id.id" rel="noreferrer" target="_blank">id.id</a> = id;<br>
+<br>
+    /* get cell name */<br>
+    tmp = readSysfsCellString(id, "name");<br>
+    if (virStrncpy(cell_info-><a href="http://id.name" rel="noreferrer" target="_blank">id.name</a>, tmp, JAILHOUSE_CELL_ID_NAMELEN, JAILHOUSE_CELL_ID_NAMELEN) < 0) {<br>
+        virReportError(VIR_ERR_INTERNAL_ERROR,<br>
+                       _("Cell ID %s too long to be copied to the cell info"),<br>
+                       tmp);<br>
+        return -1;<br>
+    }<br>
+<br>
+    cell_info-><a href="http://id.name" rel="noreferrer" target="_blank">id.name</a>[JAILHOUSE_CELL_ID_NAMELEN] = 0;<br>
+    VIR_FREE(tmp);<br>
+<br>
+    /* get cell state */<br>
+    cell_info->state = readSysfsCellString(id, "state");<br>
+<br>
+    /* get assigned cpu list */<br>
+    cell_info->cpus_assigned_list =<br>
+        readSysfsCellString(id, "cpus_assigned_list");<br>
+<br>
+    /* get failed cpu list */<br>
+    cell_info->cpus_failed_list =<br>
+        readSysfsCellString(id, "cpus_failed_list");<br>
+<br>
+    return 0;<br>
+}<br>
+<br>
+virJailhouseCellInfoPtr *<br>
+getJailhouseCellsInfo(void)<br>
+{<br>
+    struct dirent **namelist;<br>
+    virJailhouseCellInfoPtr *cell_info_list;<br>
+    unsigned int id;<br>
+    int num_entries;<br>
+    size_t i;<br>
+<br>
+    num_entries =<br>
+        scandir(JAILHOUSE_CELLS, &namelist, cell_match, alphasort);<br>
+    if (num_entries == -1) {<br>
+        if (errno == ENOENT) {<br>
+            virReportError(VIR_ERR_INTERNAL_ERROR,<br>
+                           _("No cells found in %s, scandir failed."),<br>
+                           JAILHOUSE_CELLS);<br>
+            return NULL;<br>
+        }<br>
+<br>
+        virReportError(VIR_ERR_INTERNAL_ERROR,<br>
+                       _("Error reading cell IDs in %s."),<br>
+                       JAILHOUSE_CELLS);<br>
+        return NULL;<br>
+    }<br>
+<br>
+    /* Allocate memory for 1 more than num_entries and make the last entry NULL. */<br>
+    if (VIR_ALLOC_N(cell_info_list, num_entries + 1) < 0) {<br>
+        virReportError(VIR_ERR_INTERNAL_ERROR,<br>
+                       "%s",<br>
+                       _("Insufficient memory for cells info list"));<br>
+    }<br>
+<br>
+    /* Set the last entry to NULL. */<br>
+    cell_info_list[num_entries] = NULL;<br>
+<br>
+    for (i = 0; i < num_entries; i++) {<br>
+        if (virStrToLong_ui(namelist[i]->d_name, NULL, 10, &id) < 0) {<br>
+            virReportError(VIR_ERR_INTERNAL_ERROR,<br>
+                           _("Cell ID %s could not be converted to a long"),<br>
+                           namelist[i]->d_name);<br>
+            continue;<br>
+        }<br>
+<br>
+        /* get the cell's information(name, state etc.) using sysfs */<br>
+        getCellInfo(id, &cell_info_list[i]);<br>
+        VIR_FREE(namelist[i]);<br>
+    }<br>
+<br>
+    VIR_FREE(namelist);<br>
+    return cell_info_list;<br>
+}<br>
+<br>
+int<br>
+destroyCell(virJailhouseCellId cell_id)<br>
+{<br>
+    int err = -1;<br>
+    VIR_AUTOCLOSE fd = -1;<br>
+<br>
+    fd = openDev();<br>
+<br>
+    err = ioctl(fd, JAILHOUSE_CELL_DESTROY, &cell_id);<br>
+    if (err)<br>
+        virReportSystemError(errno,<br>
+                             _("Destroying cell %d failed"),<br>
+                             <a href="http://cell_id.id" rel="noreferrer" target="_blank">cell_id.id</a>);<br>
+<br>
+    return err;<br>
+}<br>
+<br>
+int<br>
+destroyJailhouseCells(virJailhouseCellInfoPtr *cell_info_list G_GNUC_UNUSED)<br>
+{<br>
+<br>
+    /* Iterate over all cells in cell_info_list and destroy each cell */<br>
+    // TODO: Not implemented yet.<br>
+<br>
+    return 0;<br>
+}<br>
diff --git a/src/jailhouse/jailhouse_api.h b/src/jailhouse/jailhouse_api.h<br>
new file mode 100644<br>
index 0000000000..8362cb3d0f<br>
--- /dev/null<br>
+++ b/src/jailhouse/jailhouse_api.h<br>
@@ -0,0 +1,74 @@<br>
+/*<br>
+ * jailhouse_api.h: Jailhouse hypervisor API implementation<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>
+#define JAILHOUSE_CELL_ID_NAMELEN       31<br>
+<br>
+typedef struct _virJailhouseCellId virJailhouseCellId;<br>
+<br>
+struct _virJailhouseCellId {<br>
+    __s32 id;<br>
+    __u32 padding;<br>
+    char name[JAILHOUSE_CELL_ID_NAMELEN + 1];<br>
+};<br>
+<br>
+typedef struct _virJailhouseCellInfo virJailhouseCellInfo;<br>
+typedef virJailhouseCellInfo *virJailhouseCellInfoPtr;<br>
+<br>
+struct _virJailhouseCellInfo {<br>
+    struct _virJailhouseCellId id;<br>
+    char *state;<br>
+    char *cpus_assigned_list;<br>
+    char *cpus_failed_list;<br>
+};<br>
+<br>
+typedef struct _virJailhouseCellCreate virJailhouseCellCreate;<br>
+<br>
+struct _virJailhouseCellCreate {<br>
+    __u64 config_address;<br>
+    __u32 config_size;<br>
+    __u32 padding;<br>
+};<br>
+<br>
+// Enables the Jailhouse hypervisor by reading the hypervisor system<br>
+// configuration from the given file and calls the ioctl API to<br>
+// enable the hypervisor.<br>
+int jailhouseEnable(const char *sys_conf_file_path);<br>
+<br>
+// Disables the Jailhouse hypervisor.<br>
+int jailhouseDisable(void);<br>
+<br>
+/* Cell API methods */<br>
+<br>
+// Creates Jailhouse cells using the cells configurations<br>
+// provided in the dir_name.<br>
+int createJailhouseCells(const char *dir_path);<br>
+<br>
+// Destroys Jailhouse cells using the cell IDs provided in<br>
+// the cell_info_list.<br>
+int destroyJailhouseCells(virJailhouseCellInfoPtr *cell_info_list);<br>
+<br>
+// Returns cell's information in a null-terminated array of<br>
+// virJailhouseCellInfoPtr for all the Jailhouse cells.<br>
+virJailhouseCellInfoPtr *getJailhouseCellsInfo(void);<br>
+<br>
+// Free the cell info object.<br>
+void cellInfoFree(virJailhouseCellInfoPtr cell_info);<br>
diff --git a/src/jailhouse/jailhouse_driver.c b/src/jailhouse/jailhouse_driver.c<br>
index 0175ba771b..ac9da4c85d 100644<br>
--- a/src/jailhouse/jailhouse_driver.c<br>
+++ b/src/jailhouse/jailhouse_driver.c<br>
@@ -16,43 +16,228 @@<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>
<br>
 #include <config.h><br>
+#include <string.h><br>
<br>
+#include "configmake.h"<br>
+#include "datatypes.h"<br>
+#include "domain_conf.h"<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 "virlog.h"<br>
 #include "vircommand.h"<br>
-#include <string.h><br>
+#include "virpidfile.h"<br>
<br>
-#define UNUSED(x) (void)(x)<br>
+#define VIR_FROM_THIS VIR_FROM_JAILHOUSE<br>
+<br>
+VIR_LOG_INIT("jailhouse.jailhouse_driver");<br>
+<br>
+static virClassPtr virJailhouseDriverConfigClass;<br>
+static void virJailhouseDriverConfigDispose(void *obj);<br>
+<br>
+static virJailhouseDriverPtr jailhouse_driver;<br>
+<br>
+static int virJailhouseConfigOnceInit(void)<br>
+{<br>
+    if (!VIR_CLASS_NEW(virJailhouseDriverConfig, virClassForObject()))<br>
+        return -1;<br>
+<br>
+    return 0;<br>
+}<br>
+<br>
+VIR_ONCE_GLOBAL_INIT(virJailhouseConfig);<br>
+<br>
+<br>
+static virJailhouseDriverConfigPtr<br>
+virJailhouseDriverConfigNew(void)<br>
+{<br>
+    virJailhouseDriverConfigPtr cfg;<br>
+<br>
+    // TODO: Check if the following has to be uncommented.<br>
+    if (virJailhouseConfigInitialize() < 0)<br>
+        return NULL;<br>
+<br>
+    if (!(cfg = virObjectNew(virJailhouseDriverConfigClass)))<br>
+        return NULL;<br>
+<br>
+    cfg->stateDir = g_strdup(JAILHOUSE_STATE_DIR);<br>
+<br>
+    cfg->sys_config_file_path = g_strdup(DATADIR "/jailhouse/system.cell");<br>
+<br>
+    cfg->cell_config_dir = g_strdup(DATADIR "/jailhouse/cells");<br>
+<br>
+    return cfg;<br>
+}<br>
+<br>
+static void virJailhouseDriverConfigDispose(void *obj)<br>
+{<br>
+<br>
+    virJailhouseDriverConfigPtr cfg = obj;<br>
+<br>
+    VIR_FREE(cfg->stateDir);<br>
+    VIR_FREE(cfg->sys_config_file_path);<br>
+    VIR_FREE(cfg->cell_config_dir);<br>
+}<br>
+<br>
+static int<br>
+jailhouseLoadConf(virJailhouseDriverConfigPtr config)<br>
+{<br>
+    g_autoptr(virConf) conf = NULL;<br>
+<br>
+    if (!virFileExists(JAILHOUSE_CONFIG_FILE))<br>
+        return 0;<br>
+<br>
+    if (!(conf = virConfReadFile(JAILHOUSE_CONFIG_FILE, 0)))<br>
+        return -1;<br>
+<br>
+    if (virConfGetValueString(conf, "system_config",<br>
+                              &config->sys_config_file_path) < 0)<br>
+        return -1;<br>
+<br>
+    if (virConfGetValueString(conf, "non_root_cells_dir",<br>
+                              &config->cell_config_dir) < 0)<br>
+        return -1;<br>
+<br>
+    return 1;<br>
+}<br>
+<br>
+static int<br>
+jailhouseCreateAndLoadCells(virJailhouseDriverPtr driver)<br>
+{<br>
+    if (!driver->config ||<br>
+        !driver->config->cell_config_dir ||<br>
+        strlen(driver->config->cell_config_dir) == 0)<br>
+        return -1;<br>
+<br>
+    // Create all cells in the hypervisor.<br>
+    if (createJailhouseCells(driver->config->cell_config_dir) < 0)<br>
+        return -1;<br>
+<br>
+    // Get all cells created above.<br>
+    driver->cell_info_list = getJailhouseCellsInfo();<br>
+<br>
+    return 0;<br>
+}<br>
+<br>
+static void<br>
+jailhouseFreeDriver(virJailhouseDriverPtr driver)<br>
+{<br>
+    if (!driver)<br>
+        return;<br>
+<br>
+    virMutexDestroy(&driver->lock);<br>
+    virObjectUnref(driver->config);<br>
+    VIR_FREE(driver);<br>
+}<br>
<br>
 static virDrvOpenStatus<br>
 jailhouseConnectOpen(virConnectPtr conn,<br>
-                     virConnectAuthPtr auth,<br>
-                     virConfPtr conf,<br>
-                     unsigned int flags)<br>
+                     virConnectAuthPtr auth G_GNUC_UNUSED,<br>
+                     virConfPtr conf G_GNUC_UNUSED, unsigned int flags)<br>
 {<br>
-    UNUSED(conn);<br>
-    UNUSED(auth);<br>
-    UNUSED(conf);<br>
-    UNUSED(flags);<br>
-    return 0;<br>
+    uid_t uid = geteuid();<br>
+<br>
+    virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);<br>
+<br>
+    if (!virConnectValidateURIPath(conn->uri->path, "jailhouse", uid == 0))<br>
+        return VIR_DRV_OPEN_ERROR;<br>
+<br>
+    if (!jailhouse_driver) {<br>
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",<br>
+                       _("Jailhouse driver state is not initialized."));<br>
+        return VIR_DRV_OPEN_ERROR;<br>
+    }<br>
+<br>
+    conn->privateData = jailhouse_driver;<br>
+<br>
+    return VIR_DRV_OPEN_SUCCESS;<br>
 }<br>
<br>
+#define UNUSED(x) (void)(x)<br>
+<br>
 static int<br>
 jailhouseConnectClose(virConnectPtr conn)<br>
 {<br>
-    UNUSED(conn);<br>
+   conn->privateData = NULL;<br>
+<br>
+   return 0;<br>
+}<br>
+<br>
+static int<br>
+jailhouseStateCleanup(void)<br>
+{<br>
+    if (!jailhouse_driver)<br>
+       return -1;<br>
+<br>
+    if (jailhouse_driver->lockFD != -1)<br>
+        virPidFileRelease(jailhouse_driver->config->stateDir,<br>
+                          "driver", jailhouse_driver->lockFD);<br>
+<br>
+    virMutexDestroy(&jailhouse_driver->lock);<br>
+<br>
+    jailhouseFreeDriver(jailhouse_driver);<br>
     return 0;<br>
 }<br>
<br>
+static int<br>
+jailhouseStateInitialize(bool privileged G_GNUC_UNUSED,<br>
+                         const char *root G_GNUC_UNUSED,<br>
+                         virStateInhibitCallback callback G_GNUC_UNUSED,<br>
+                         void *opaque G_GNUC_UNUSED)<br>
+{<br>
+    virJailhouseDriverConfigPtr cfg = NULL;<br>
+    int rc;<br>
+<br>
+    jailhouse_driver = g_new0(virJailhouseDriver, 1);<br>
+    jailhouse_driver->lockFD = -1;<br>
+<br>
+    if (virMutexInit(&jailhouse_driver->lock) < 0) {<br>
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",<br>
+                       _("cannot initialize mutex"));<br>
+        VIR_FREE(jailhouse_driver);<br>
+        return VIR_DRV_STATE_INIT_ERROR;<br>
+    }<br>
+<br>
+    if (!(cfg = virJailhouseDriverConfigNew()))<br>
+        goto error;<br>
+<br>
+    jailhouse_driver->config = cfg;<br>
+<br>
+    if (jailhouseLoadConf(cfg) < 0)<br>
+        goto error;<br>
+<br>
+    if (virFileMakePath(cfg->stateDir) < 0) {<br>
+        virReportSystemError(errno, _("Failed to create state dir %s"),<br>
+                             cfg->stateDir);<br>
+        goto error;<br>
+    }<br>
+<br>
+    if ((jailhouse_driver->lockFD = virPidFileAcquire(cfg->stateDir,<br>
+                                                      "driver", false, getpid())) < 0)<br>
+        goto error;<br>
+<br>
+    if ((rc = jailhouseEnable(cfg->sys_config_file_path)) < 0)<br>
+        goto error;<br>
+    else if (rc == 0)<br>
+        return VIR_DRV_STATE_INIT_SKIPPED;<br>
+<br>
+    if (jailhouseCreateAndLoadCells(jailhouse_driver) < 0)<br>
+        goto error;<br>
+<br>
+    return VIR_DRV_STATE_INIT_COMPLETE;<br>
+<br>
+ error:<br>
+    jailhouseStateCleanup();<br>
+    return VIR_DRV_STATE_INIT_ERROR;<br>
+<br>
+}<br>
 static const char *<br>
 jailhouseConnectGetType(virConnectPtr conn)<br>
 {<br>
@@ -69,36 +254,16 @@ jailhouseConnectGetHostname(virConnectPtr conn)<br>
 }<br>
<br>
 static int<br>
-jailhouseNodeGetInfo(virConnectPtr conn,<br>
-                     virNodeInfoPtr info)<br>
+jailhouseNodeGetInfo(virConnectPtr conn, 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>
+                               virDomainPtr ** domain, unsigned int flags)<br>
 {<br>
     UNUSED(conn);<br>
     UNUSED(domain);<br>
@@ -107,8 +272,7 @@ jailhouseConnectListAllDomains(virConnectPtr conn,<br>
 }<br>
<br>
 static virDomainPtr<br>
-jailhouseDomainLookupByID(virConnectPtr conn,<br>
-                          int id)<br>
+jailhouseDomainLookupByID(virConnectPtr conn, int id)<br>
 {<br>
     UNUSED(conn);<br>
     UNUSED(id);<br>
@@ -116,8 +280,7 @@ jailhouseDomainLookupByID(virConnectPtr conn,<br>
 }<br>
<br>
 static virDomainPtr<br>
-jailhouseDomainLookupByName(virConnectPtr conn,<br>
-                            const char *name)<br>
+jailhouseDomainLookupByName(virConnectPtr conn, const char *name)<br>
 {<br>
     UNUSED(conn);<br>
     UNUSED(name);<br>
@@ -125,8 +288,7 @@ jailhouseDomainLookupByName(virConnectPtr conn,<br>
 }<br>
<br>
 static virDomainPtr<br>
-jailhouseDomainLookupByUUID(virConnectPtr conn,<br>
-                            const unsigned char *uuid)<br>
+jailhouseDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid)<br>
 {<br>
     UNUSED(conn);<br>
     UNUSED(uuid);<br>
@@ -157,8 +319,7 @@ jailhouseDomainDestroy(virDomainPtr domain)<br>
 }<br>
<br>
 static int<br>
-jailhouseDomainGetInfo(virDomainPtr domain,<br>
-                       virDomainInfoPtr info)<br>
+jailhouseDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)<br>
 {<br>
     UNUSED(domain);<br>
     UNUSED(info);<br>
@@ -167,9 +328,7 @@ jailhouseDomainGetInfo(virDomainPtr domain,<br>
<br>
 static int<br>
 jailhouseDomainGetState(virDomainPtr domain,<br>
-                        int *state,<br>
-                        int *reason,<br>
-                        unsigned int flags)<br>
+                        int *state, int *reason, unsigned int flags)<br>
 {<br>
     UNUSED(domain);<br>
     UNUSED(state);<br>
@@ -179,8 +338,7 @@ jailhouseDomainGetState(virDomainPtr domain,<br>
 }<br>
<br>
 static char *<br>
-jailhouseDomainGetXMLDesc(virDomainPtr domain,<br>
-                          unsigned int flags)<br>
+jailhouseDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)<br>
 {<br>
     UNUSED(domain);<br>
     UNUSED(flags);<br>
@@ -189,31 +347,43 @@ jailhouseDomainGetXMLDesc(virDomainPtr domain,<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>
+    .connectOpen = jailhouseConnectOpen,        /* 6.3.0 */<br>
+    .connectClose = jailhouseConnectClose,      /* 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>
+<br>
 static virConnectDriver jailhouseConnectDriver = {<br>
+    .localOnly = true,<br>
+    .uriSchemes = (const char *[]){ "jailhouse", NULL },<br>
     .hypervisorDriver = &jailhouseHypervisorDriver,<br>
 };<br>
<br>
+<br>
+static virStateDriver jailhouseStateDriver = {<br>
+    .name = "JAILHOUSE",<br>
+    .stateInitialize = jailhouseStateInitialize,<br>
+    .stateCleanup = jailhouseStateCleanup,<br>
+};<br>
+<br>
 int<br>
 jailhouseRegister(void)<br>
 {<br>
-    return virRegisterConnectDriver(&jailhouseConnectDriver, false);<br>
+    if (virRegisterConnectDriver(&jailhouseConnectDriver, false) < 0)<br>
+        return -1;<br>
+    if (virRegisterStateDriver(&jailhouseStateDriver) < 0)<br>
+        return -1;<br>
+    return 0;<br>
 }<br>
diff --git a/src/jailhouse/jailhouse_driver.h b/src/jailhouse/jailhouse_driver.h<br>
index b0dbc8d033..8a0e111676 100644<br>
--- a/src/jailhouse/jailhouse_driver.h<br>
+++ b/src/jailhouse/jailhouse_driver.h<br>
@@ -20,4 +20,55 @@<br>
<br>
 #pragma once<br>
<br>
+#include <linux/types.h><br>
+<br>
+#include "jailhouse_api.h"<br>
+<br>
 int jailhouseRegister(void);<br>
+<br>
+#define JAILHOUSE_CONFIG_FILE SYSCONFDIR "/libvirt/jailhouse/jailhouse.conf"<br>
+#define JAILHOUSE_STATE_DIR RUNSTATEDIR "/libvirt/jailhouse"<br>
+<br>
+#define JAILHOUSE_DEV "/dev/jailhouse"<br>
+<br>
+#define JAILHOUSE_SYSFS_DEV "/sys/devices/jailhouse/"<br>
+<br>
+typedef struct _virJailhouseDriver virJailhouseDriver;<br>
+typedef virJailhouseDriver *virJailhouseDriverPtr;<br>
+<br>
+typedef struct _virJailhouseDriverConfig virJailhouseDriverConfig;<br>
+typedef virJailhouseDriverConfig *virJailhouseDriverConfigPtr;<br>
+<br>
+struct _virJailhouseDriverConfig {<br>
+    virObject parent;<br>
+<br>
+    char *stateDir;<br>
+<br>
+    // File path of the jailhouse system configuration<br>
+    // for jailhouse enable/disable.<br>
+    char *sys_config_file_path;<br>
+<br>
+    // Config directory where all jailhouse cell configurations<br>
+    // are stored.<br>
+    char *cell_config_dir;<br>
+};<br>
+<br>
+struct _virJailhouseDriver {<br>
+    virMutex lock;<br>
+<br>
+    // Jailhouse configuration read from the jailhouse.conf<br>
+    virJailhouseDriverConfigPtr config;<br>
+<br>
+    /* pid file FD, ensures two copies of the driver can't use the same root */<br>
+    int lockFD;<br>
+<br>
+    // All the cells created during connect open on the hypervisor.<br>
+    virJailhouseCellInfoPtr *cell_info_list;<br>
+};<br>
+<br>
+struct _jailhouseCell {<br>
+    __s32 id;<br>
+    char *state;<br>
+    char *cpus_assigned_list;<br>
+    char *cpus_failed_list;<br>
+};<br>
diff --git a/src/jailhouse/meson.build b/src/jailhouse/meson.build<br>
index 45ceeecca3..a706985169 100644<br>
--- a/src/jailhouse/meson.build<br>
+++ b/src/jailhouse/meson.build<br>
@@ -1,5 +1,6 @@<br>
 jailhouse_sources = files(<br>
   'jailhouse_driver.c',<br>
+  'jailhouse_api.c',<br>
 )<br>
<br>
 driver_source_files += jailhouse_sources<br>
diff --git a/src/libvirt.c b/src/libvirt.c<br>
index 59b75c6f7b..b2d0ba3d23 100644<br>
--- a/src/libvirt.c<br>
+++ b/src/libvirt.c<br>
@@ -75,9 +75,6 @@<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>
@@ -274,10 +271,6 @@ 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>
@@ -1010,9 +1003,6 @@ 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/remote/remote_daemon.c b/src/remote/remote_daemon.c<br>
index 1aa9bfc0d2..9d1b208a38 100644<br>
--- a/src/remote/remote_daemon.c<br>
+++ b/src/remote/remote_daemon.c<br>
@@ -145,6 +145,10 @@ static int daemonInitialize(void)<br>
     if (virDriverLoadModule("interface", "interfaceRegister", false) < 0)<br>
         return -1;<br>
 # endif<br>
+# ifdef WITH_JAILHOUSE<br>
+    if (virDriverLoadModule("jailhouse", "jailhouseRegister", false) < 0)<br>
+        return -1;<br>
+# endif<br>
 # ifdef WITH_SECRETS<br>
     if (virDriverLoadModule("secret", "secretRegister", false) < 0)<br>
         return -1;<br>
diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c<br>
index 53d17a8f4a..06d8fe6098 100644<br>
--- a/src/remote/remote_daemon_dispatch.c<br>
+++ b/src/remote/remote_daemon_dispatch.c<br>
@@ -2115,7 +2115,8 @@ remoteDispatchConnectOpen(virNetServerPtr server G_GNUC_UNUSED,<br>
         STREQ(type, "VBOX") ||<br>
         STREQ(type, "bhyve") ||<br>
         STREQ(type, "vz") ||<br>
-        STREQ(type, "Parallels")) {<br>
+        STREQ(type, "Parallels") ||<br>
+        STREQ(type, "JAILHOUSE")) {<br>
         VIR_DEBUG("Hypervisor driver found, setting URIs for secondary drivers");<br>
         if (getuid() == 0) {<br>
             priv->interfaceURI = "interface:///system";<br>
-- <br>
2.17.1<br>
<br>
</div></div>