Index | Thread | Search

From:
Brad Smith <brad@comstyle.com>
Subject:
Re: UPDATE: QEMU 9.1.0
To:
ports@openbsd.org
Date:
Sun, 27 Oct 2024 18:36:35 -0400

Download raw body.

Thread
ping.

On 2024-10-02 10:06 p.m., Brad Smith wrote:
> Here is an update to QEMU 9.1.0.
>
>
> https://wiki.qemu.org/ChangeLog/9.1
>
>
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/emulators/qemu/Makefile,v
> retrieving revision 1.242
> diff -u -p -u -p -r1.242 Makefile
> --- Makefile	26 Jul 2024 11:49:01 -0000	1.242
> +++ Makefile	3 Oct 2024 02:03:36 -0000
> @@ -6,7 +6,7 @@ USE_NOBTCFI=	Yes
>   COMMENT-main=	multi system emulator
>   COMMENT-ga=	QEMU guest agent
>   
> -VERSION=	9.0.2
> +VERSION=	9.1.0
>   DISTNAME=	qemu-${VERSION}
>   CATEGORIES=	emulators
>   SITES=		https://download.qemu.org/
> @@ -70,8 +70,8 @@ LIB_DEPENDS-ga=	${LIB_DEPENDS}
>   MAKE_ENV=	V=1
>   FAKE_FLAGS=	qemu_confdir=${PREFIX}/share/examples/qemu
>   
> -CFLAGS+=	-I${LOCALBASE}/include -I${X11BASE}/include
> -LDFLAGS+=	-L${LOCALBASE}/lib -L${X11BASE}/lib
> +CFLAGS+=	-I${LOCALBASE}/include
> +LDFLAGS+=	-L${LOCALBASE}/lib
>   
>   # until the system headers are fixed properly.
>   CFLAGS+=	-Wno-redundant-decls
> Index: distinfo
> ===================================================================
> RCS file: /cvs/ports/emulators/qemu/distinfo,v
> retrieving revision 1.75
> diff -u -p -u -p -r1.75 distinfo
> --- distinfo	26 Jul 2024 11:49:01 -0000	1.75
> +++ distinfo	3 Oct 2024 02:03:36 -0000
> @@ -1,2 +1,2 @@
> -SHA256 (qemu-9.0.2.tar.xz) = qMP1lq7Olto7AMr7dLqvoNFFFer7jtHuP39cLQ6/ArY=
> -SIZE (qemu-9.0.2.tar.xz) = 132387528
> +SHA256 (qemu-9.1.0.tar.xz) = gWtwIqi6fCrDDi4M+XPoJva8yFBTOWAyEsXt6OlNeDQ=
> +SIZE (qemu-9.1.0.tar.xz) = 132478356
> Index: patches/patch-contrib_plugins_Makefile
> ===================================================================
> RCS file: patches/patch-contrib_plugins_Makefile
> diff -N patches/patch-contrib_plugins_Makefile
> --- /dev/null	1 Jan 1970 00:00:00 -0000
> +++ patches/patch-contrib_plugins_Makefile	3 Oct 2024 02:03:36 -0000
> @@ -0,0 +1,18 @@
> +- contrib/plugins: ensure build does not pick up a system copy of plugin header
> +
> +Index: contrib/plugins/Makefile
> +--- contrib/plugins/Makefile.orig
> ++++ contrib/plugins/Makefile
> +@@ -41,9 +41,10 @@ SONAMES := $(addsuffix $(SO_SUFFIX),$(addprefix lib,$(
> +
> + # The main QEMU uses Glib extensively so it is perfectly fine to use it
> + # in plugins (which many example do).
> +-PLUGIN_CFLAGS := $(shell $(PKG_CONFIG) --cflags glib-2.0)
> +-PLUGIN_CFLAGS += -fPIC -Wall
> ++GLIB_CFLAGS := $(shell $(PKG_CONFIG) --cflags glib-2.0)
> + PLUGIN_CFLAGS += -I$(TOP_SRC_PATH)/include/qemu
> ++PLUGIN_CFLAGS += $(GLIB_CFLAGS)
> ++PLUGIN_CFLAGS += -fPIC -Wall
> +
> + # Helper that honours V=1 so we get some output when compiling
> + quiet-@ = $(if $(V),,@$(if $1,printf "  %-7s %s\n" "$(strip $1)" "$(strip $2)" && ))
> Index: patches/patch-meson_build
> ===================================================================
> RCS file: /cvs/ports/emulators/qemu/patches/patch-meson_build,v
> retrieving revision 1.13
> diff -u -p -u -p -r1.13 patch-meson_build
> --- patches/patch-meson_build	28 May 2024 13:57:37 -0000	1.13
> +++ patches/patch-meson_build	3 Oct 2024 02:03:36 -0000
> @@ -4,7 +4,7 @@
>   Index: meson.build
>   --- meson.build.orig
>   +++ meson.build
> -@@ -2156,7 +2156,7 @@ config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_
> +@@ -2253,7 +2253,7 @@ config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_
>    config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
>    config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
>    config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
> @@ -13,7 +13,7 @@ Index: meson.build
>    config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
>    config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
>    
> -@@ -4226,9 +4226,6 @@ else
> +@@ -4293,9 +4293,6 @@ else
>      summary_info += {'Objective-C compiler': false}
>    endif
>    option_cflags = (get_option('debug') ? ['-g'] : [])
> Index: patches/patch-qga_commands-bsd_c
> ===================================================================
> RCS file: patches/patch-qga_commands-bsd_c
> diff -N patches/patch-qga_commands-bsd_c
> --- /dev/null	1 Jan 1970 00:00:00 -0000
> +++ patches/patch-qga_commands-bsd_c	3 Oct 2024 02:03:36 -0000
> @@ -0,0 +1,307 @@
> +Adapted from https://github.com/aborche/qemu-guest-agent
> +
> +Adds support for "guest-get-fsinfo" and "guest-get-vcpus"
> +
> +Index: qga/commands-bsd.c
> +--- qga/commands-bsd.c.orig
> ++++ qga/commands-bsd.c
> +@@ -11,10 +11,9 @@
> +  */
> +
> + #include "qemu/osdep.h"
> ++#include "qapi/error.h"
> + #include "qga-qapi-commands.h"
> + #include "qapi/qmp/qerror.h"
> +-#include "qapi/error.h"
> +-#include "qemu/queue.h"
> + #include "commands-common.h"
> + #include <sys/ioctl.h>
> + #include <sys/param.h>
> +@@ -28,6 +27,8 @@
> + #include <net/ethernet.h>
> + #endif
> + #include <paths.h>
> ++#include <sys/sysctl.h>
> ++#include <sys/statvfs.h>
> +
> + #if defined(CONFIG_FSFREEZE) || defined(CONFIG_FSTRIM)
> + bool build_fs_mount_list(FsMountList *mounts, Error **errp)
> +@@ -179,3 +180,278 @@ bool guest_get_hw_addr(struct ifaddrs *ifa, unsigned c
> +     return true;
> + }
> + #endif /* HAVE_GETIFADDRS */
> ++
> ++GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp)
> ++{
> ++    GuestLogicalProcessorList *head, **tail;
> ++    int64_t current;
> ++    long sc_max;
> ++    Error *local_err = NULL;
> ++    int Query[2];
> ++    int NumCpu = 0;
> ++    size_t Length = sizeof(NumCpu);
> ++
> ++    Query[0] = CTL_HW;
> ++#ifdef HW_NCPUONLINE
> ++    Query[1] = HW_NCPUONLINE;
> ++#else
> ++    Query[1] = HW_NCPU;
> ++#endif
> ++
> ++    current = 0;
> ++    head = NULL;
> ++    tail = &head;
> ++    if (sysctl(Query, 2, &NumCpu, &Length, NULL, 0) == -1) {
> ++        error_setg(errp, "sysctl get CTL_HW.HW_NCPU failed");
> ++    }
> ++    sc_max = NumCpu;
> ++
> ++    while (local_err == NULL && current < sc_max) {
> ++        GuestLogicalProcessor *vcpu;
> ++        int64_t id = current++;
> ++        vcpu = g_malloc0(sizeof *vcpu);
> ++        vcpu->logical_id = id;
> ++        vcpu->has_can_offline = false; /* lolspeak ftw */
> ++        vcpu->online = true;
> ++        vcpu->can_offline = false;
> ++        QAPI_LIST_APPEND(tail, vcpu);
> ++    }
> ++
> ++    if (local_err == NULL) {
> ++        /* there's no guest with zero VCPUs */
> ++        g_assert(head != NULL);
> ++        return head;
> ++    }
> ++
> ++    qapi_free_GuestLogicalProcessorList(head);
> ++    error_propagate(errp, local_err);
> ++    return NULL;
> ++}
> ++
> ++typedef struct FsMount {
> ++    char *dirname;
> ++    char *devtype;
> ++    char *size;
> ++    char *used;
> ++    char *free;
> ++    char *load;
> ++    char *mntpoint;
> ++    unsigned int devmajor, devminor;
> ++    QTAILQ_ENTRY(FsMount) next;
> ++} FsMount;
> ++
> ++typedef QTAILQ_HEAD(FsMountList, FsMount) FsMountList;
> ++
> ++static void free_fs_mount_list(FsMountList *mounts)
> ++{
> ++     FsMount *mount, *temp;
> ++
> ++     if (!mounts) {
> ++         return;
> ++     }
> ++
> ++     QTAILQ_FOREACH_SAFE(mount, mounts, next, temp) {
> ++         QTAILQ_REMOVE(mounts, mount, next);
> ++         g_free(mount->dirname);
> ++         g_free(mount->devtype);
> ++         g_free(mount->size);
> ++         g_free(mount->used);
> ++         g_free(mount->free);
> ++         g_free(mount->load);
> ++         g_free(mount->mntpoint);
> ++         g_free(mount);
> ++     }
> ++}
> ++
> ++static void build_fs_mount_list(FsMountList *mounts, Error **errp)
> ++{
> ++    FsMount *mount;
> ++#ifdef __OpenBSD__
> ++    char const *dfcmd = "/bin/df";
> ++#else // defined(__OpenBSD__)
> ++    char const *dfcmd = "/bin/df -hT";
> ++#endif // defined(__OpenBSD__)
> ++
> ++    FILE *fp;
> ++    char *line = NULL;
> ++    size_t n;
> ++    int ret;
> ++    char dev_name[128], size[12], used[12], free[12], load[10], mounted[128];
> ++#ifndef __OpenBSD__
> ++    char fstype[12] = "";
> ++#endif // !defined(__OpenBSD__)
> ++
> ++    if ((fp = popen(dfcmd, "r")) == NULL) {
> ++        g_debug("Cannot open '%s'!!\n", dfcmd);
> ++        error_setg_errno(errp, errno,
> ++                         "failed to create child process for command: %s",
> ++                         dfcmd);
> ++        return;
> ++    }
> ++
> ++    while (getline(&line, &n, fp) != -1) {
> ++        //g_debug("line '%s'", line);
> ++#ifdef __OpenBSD__
> ++        ret = sscanf(line, "%127s%11s%11s%11s%9s%127s",
> ++                     dev_name, size, used, free, load, mounted);
> ++#else // defined(__OpenBSD__)
> ++        ret = sscanf(line, "%127s%11s%11s%11s%11s%9s%127s",
> ++                     dev_name, fstype, size, used, free, load, mounted);
> ++        //g_debug("ret %d, dev_name '%s', fstype '%s', size '%s', used '%s', free '%s', load '%s', mounted '%s'",
> ++        //        ret, dev_name, fstype, size, used, free, load, mounted);
> ++#endif // defined(__OpenBSD__)
> ++        if (g_str_equal(dev_name, "Filesystem")
> ++#ifndef __OpenBSD__
> ++                ||g_str_equal(fstype,"devfs")
> ++                ||g_str_equal(fstype,"procfs")
> ++                ||g_str_equal(fstype,"fdescfs")
> ++#endif // !defined(__OpenBSD__)
> ++          ) {
> ++            continue;
> ++        }
> ++
> ++#ifdef __OpenBSD__
> ++        if (ret < 6) {
> ++#else // defined(__OpenBSD__)
> ++        if (ret < 7) {
> ++#endif // defined(__OpenBSD__)
> ++            continue;
> ++        }
> ++
> ++        mount = g_new0(FsMount, 1);
> ++        mount->dirname = g_strdup(dev_name);
> ++#ifndef __OpenBSD__
> ++        mount->devtype = g_strdup(fstype);
> ++#endif // defined(__OpenBSD__)
> ++        mount->free = g_strdup(free);
> ++        mount->load = g_strdup(load);
> ++        mount->size = g_strdup(size);
> ++        mount->used = g_strdup(used);
> ++        mount->mntpoint = g_strdup(mounted);
> ++        mount->devmajor = 0;
> ++        mount->devminor = 0;
> ++
> ++        QTAILQ_INSERT_TAIL(mounts, mount, next);
> ++    }
> ++    g_free(line);
> ++
> ++    fclose(fp);
> ++}
> ++
> ++#ifdef __OpenBSD__
> ++static void add_type_fs_mount_list(FsMountList *mounts, Error **errp)
> ++{
> ++    FILE *fp;
> ++    char const *mountcmd = "/sbin/mount";
> ++    char *line = NULL;
> ++    size_t n;
> ++    int ret;
> ++    char mnt_fsname[128], mnt_dir[128], mnt_type[32], mnt_opts[128];
> ++    struct FsMount *mount;
> ++
> ++    // get mounts from mount command
> ++    if ((fp = popen(mountcmd, "r")) == NULL) {
> ++        g_debug("Cannot open '%s'!!\n", mountcmd);
> ++        error_setg_errno(errp, errno, "failed to create child process for command: %s", mountcmd);
> ++        return;
> ++    }
> ++
> ++    // loop through mounts from mount command
> ++    while (getline(&line, &n, fp) != -1) {
> ++        //g_debug("line '%s'", line);
> ++
> ++        ret = sscanf(line, "%127s on %127s type %31s (%127s)",
> ++                     mnt_fsname, mnt_dir, mnt_type, mnt_opts);
> ++        //g_debug("ret %d, fsname '%s', dir '%s', type '%s', opts '%s'",
> ++        //        ret, mnt_fsname, mnt_dir, mnt_type, mnt_opts);
> ++
> ++        if (4 != ret ||
> ++            '/' != mnt_fsname[0] ||
> ++            '/' != mnt_dir[0] ||
> ++            g_str_equal("smbfs", mnt_type) ||
> ++            g_str_equal("cifs", mnt_type)) {
> ++            continue;
> ++        }
> ++
> ++        // find mount in supplied mounts list and update device type
> ++        QTAILQ_FOREACH(mount, mounts, next) {
> ++            if (NULL == mount->devtype && g_str_equal(mount->dirname, mnt_fsname)) {
> ++                mount->devtype = g_strdup(mnt_type);
> ++                break;
> ++            }
> ++        }
> ++    }
> ++    g_free(line);
> ++
> ++    fclose(fp);
> ++}
> ++#endif // defined(__OpenBSD__)
> ++
> ++/* Return a list of the disk device(s)' info which @mount lies on */
> ++static GuestFilesystemInfo *build_guest_fsinfo(struct FsMount *mount,
> ++                                               Error **errp)
> ++{
> ++    GuestFilesystemInfo *fs = g_malloc0(sizeof(*fs));
> ++    struct statvfs buf;
> ++    unsigned long used, nonroot_total, fr_size;
> ++
> ++    fs->name = g_strdup(mount->dirname);
> ++    fs->mountpoint = g_strdup(mount->mntpoint);
> ++    fs->type = g_strdup(mount->devtype);
> ++
> ++    if (statvfs(fs->mountpoint, &buf) == 0) {
> ++        fr_size = buf.f_frsize;
> ++        used = buf.f_blocks - buf.f_bfree;
> ++        nonroot_total = used + buf.f_bavail;
> ++        fs->used_bytes = used * fr_size;
> ++        fs->total_bytes = nonroot_total * fr_size;
> ++
> ++        fs->has_total_bytes = true;
> ++        fs->has_used_bytes = true;
> ++    }
> ++
> ++    return fs;
> ++}
> ++
> ++GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp)
> ++{
> ++    FsMountList mounts;
> ++    struct FsMount *mount;
> ++    GuestFilesystemInfoList *new, *ret = NULL;
> ++    Error *local_err = NULL;
> ++
> ++    QTAILQ_INIT(&mounts);
> ++
> ++    g_debug("Entering to guest_get_fsinfo");
> ++    build_fs_mount_list(&mounts, &local_err);
> ++    if (local_err) {
> ++        error_propagate(errp, local_err);
> ++        return NULL;
> ++    }
> ++
> ++#ifdef __OpenBSD__
> ++    add_type_fs_mount_list(&mounts, &local_err);
> ++    if (local_err) {
> ++        error_propagate(errp, local_err);
> ++        return NULL;
> ++    }
> ++#endif // defined(__OpenBSD__)
> ++
> ++    QTAILQ_FOREACH(mount, &mounts, next) {
> ++        //g_debug("Building guest fsinfo for '%s'", mount->dirname);
> ++        //g_debug("Devtype '%s'", mount->devtype);
> ++        new = g_malloc0(sizeof(*ret));
> ++        new->value = build_guest_fsinfo(mount, &local_err);
> ++        new->next = ret;
> ++        ret = new;
> ++        if (local_err) {
> ++            error_propagate(errp, local_err);
> ++            qapi_free_GuestFilesystemInfoList(ret);
> ++            ret = NULL;
> ++            break;
> ++        }
> ++    }
> ++
> ++    free_fs_mount_list(&mounts);
> ++    return ret;
> ++}
> Index: patches/patch-qga_commands-posix_c
> ===================================================================
> RCS file: patches/patch-qga_commands-posix_c
> diff -N patches/patch-qga_commands-posix_c
> --- patches/patch-qga_commands-posix_c	28 May 2024 13:57:37 -0000	1.10
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,416 +0,0 @@
> -Adapted from https://github.com/aborche/qemu-guest-agent
> -
> -Adds support for "guest-get-fsinfo" and "guest-get-vcpus"
> -
> -Index: qga/commands-posix.c
> ---- qga/commands-posix.c.orig
> -+++ qga/commands-posix.c
> -@@ -59,6 +59,11 @@
> - #endif
> - #endif
> -
> -+#ifdef __OpenBSD__
> -+#include <sys/sysctl.h>
> -+#include <sys/statvfs.h>
> -+#endif
> -+
> - static void ga_wait_child(pid_t pid, int *status, Error **errp)
> - {
> -     pid_t rpid;
> -@@ -2750,7 +2755,7 @@ GuestCpuStatsList *qmp_guest_get_cpustats(Error **errp
> -     return head;
> - }
> -
> --#else /* defined(__linux__) */
> -+#elif defined(CONFIG_BSD)
> -
> - void qmp_guest_suspend_disk(Error **errp)
> - {
> -@@ -2769,10 +2774,99 @@ void qmp_guest_suspend_hybrid(Error **errp)
> -
> - GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp)
> - {
> -+    int64_t current;
> -+    GuestLogicalProcessorList *head, **tail;
> -+    long sc_max;
> -+    Error *local_err = NULL;
> -+    int Query[2];
> -+    int NumCpu = 0;
> -+    size_t Length = sizeof(NumCpu);
> -+
> -+    Query[0] = CTL_HW;
> -+#ifdef HW_NCPUONLINE
> -+    Query[1] = HW_NCPUONLINE;
> -+#else
> -+    Query[1] = HW_NCPU;
> -+#endif
> -+
> -+    current = 0;
> -+    head = NULL;
> -+    tail = &head;
> -+    if (sysctl(Query, 2, &NumCpu, &Length, NULL, 0) == -1) {
> -+        error_setg(errp, "sysctl get CTL_HW.HW_NCPU failed");
> -+    }
> -+    sc_max = NumCpu;
> -+
> -+    while (local_err == NULL && current < sc_max) {
> -+        GuestLogicalProcessor *vcpu;
> -+        int64_t id = current++;
> -+        vcpu = g_malloc0(sizeof *vcpu);
> -+        vcpu->logical_id = id;
> -+        vcpu->has_can_offline = false; /* lolspeak ftw */
> -+        vcpu->online = true;
> -+        vcpu->can_offline = false;
> -+        QAPI_LIST_APPEND(tail, vcpu);
> -+    }
> -+
> -+    if (local_err == NULL) {
> -+        /* there's no guest with zero VCPUs */
> -+        g_assert(head != NULL);
> -+        return head;
> -+    }
> -+
> -+    qapi_free_GuestLogicalProcessorList(head);
> -+    error_propagate(errp, local_err);
> -+    return NULL;
> -+}
> -+
> -+int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error **errp)
> -+{
> -     error_setg(errp, QERR_UNSUPPORTED);
> -+    return -1;
> -+}
> -+
> -+GuestMemoryBlockList *qmp_guest_get_memory_blocks(Error **errp)
> -+{
> -+    error_setg(errp, QERR_UNSUPPORTED);
> -     return NULL;
> - }
> -
> -+GuestMemoryBlockResponseList *
> -+qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks, Error **errp)
> -+{
> -+    error_setg(errp, QERR_UNSUPPORTED);
> -+    return NULL;
> -+}
> -+
> -+GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error **errp)
> -+{
> -+    error_setg(errp, QERR_UNSUPPORTED);
> -+    return NULL;
> -+}
> -+
> -+#else /* defined(CONFIG_BSD) */
> -+
> -+void qmp_guest_suspend_disk(Error **errp)
> -+{
> -+    error_setg(errp, QERR_UNSUPPORTED);
> -+}
> -+
> -+void qmp_guest_suspend_ram(Error **errp)
> -+{
> -+    error_setg(errp, QERR_UNSUPPORTED);
> -+}
> -+
> -+void qmp_guest_suspend_hybrid(Error **errp)
> -+{
> -+    error_setg(errp, QERR_UNSUPPORTED);
> -+}
> -+
> -+GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp)
> -+{
> -+    error_setg(errp, QERR_UNSUPPORTED);
> -+    return NULL;
> -+}
> -+
> - int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error **errp)
> - {
> -     error_setg(errp, QERR_UNSUPPORTED);
> -@@ -3067,11 +3161,245 @@ GuestNetworkInterfaceList *qmp_guest_network_get_inter
> -
> - #if !defined(CONFIG_FSFREEZE)
> -
> -+#ifdef CONFIG_BSD
> -+typedef struct FsMount {
> -+    char *dirname;
> -+    char *devtype;
> -+    char *size;
> -+    char *used;
> -+    char *free;
> -+    char *load;
> -+    char *mntpoint;
> -+    unsigned int devmajor, devminor;
> -+    QTAILQ_ENTRY(FsMount) next;
> -+} FsMount;
> -+
> -+typedef QTAILQ_HEAD(FsMountList, FsMount) FsMountList;
> -+
> -+static void free_fs_mount_list(FsMountList *mounts)
> -+{
> -+     FsMount *mount, *temp;
> -+
> -+     if (!mounts) {
> -+         return;
> -+     }
> -+
> -+     QTAILQ_FOREACH_SAFE(mount, mounts, next, temp) {
> -+         QTAILQ_REMOVE(mounts, mount, next);
> -+         g_free(mount->dirname);
> -+         g_free(mount->devtype);
> -+         g_free(mount->size);
> -+         g_free(mount->used);
> -+		 g_free(mount->free);
> -+		 g_free(mount->load);
> -+		 g_free(mount->mntpoint);
> -+         g_free(mount);
> -+     }
> -+}
> -+
> -+static void build_fs_mount_list(FsMountList *mounts, Error **errp)
> -+{
> -+    FsMount *mount;
> -+#ifdef __OpenBSD__
> -+    char const *dfcmd = "/bin/df";
> -+#else // defined(__OpenBSD__)
> -+    char const *dfcmd = "/bin/df -hT";
> -+#endif // defined(__OpenBSD__)
> -+
> -+    FILE *fp;
> -+    char *line = NULL;
> -+    size_t n;
> -+    int ret;
> -+    char dev_name[128], size[12], used[12], free[12], load[10], mounted[128];
> -+#ifndef __OpenBSD__
> -+    char fstype[12] = "";
> -+#endif // !defined(__OpenBSD__)
> -+
> -+    if ((fp = popen(dfcmd, "r")) == NULL) {
> -+        g_debug("Cannot open '%s'!!\n", dfcmd);
> -+        error_setg_errno(errp, errno,
> -+                         "failed to create child process for command: %s",
> -+                         dfcmd);
> -+        return;
> -+    }
> -+
> -+    while (getline(&line, &n, fp) != -1) {
> -+        //g_debug("line '%s'", line);
> -+#ifdef __OpenBSD__
> -+        ret = sscanf(line, "%127s%11s%11s%11s%9s%127s",
> -+                     dev_name, size, used, free, load, mounted);
> -+#else // defined(__OpenBSD__)
> -+        ret = sscanf(line, "%127s%11s%11s%11s%11s%9s%127s",
> -+                     dev_name, fstype, size, used, free, load, mounted);
> -+        //g_debug("ret %d, dev_name '%s', fstype '%s', size '%s', used '%s', free '%s', load '%s', mounted '%s'",
> -+        //        ret, dev_name, fstype, size, used, free, load, mounted);
> -+#endif // defined(__OpenBSD__)
> -+        if (g_str_equal(dev_name, "Filesystem")
> -+#ifndef __OpenBSD__
> -+                ||g_str_equal(fstype,"devfs")
> -+                ||g_str_equal(fstype,"procfs")
> -+                ||g_str_equal(fstype,"fdescfs")
> -+#endif // !defined(__OpenBSD__)
> -+          ) {
> -+            continue;
> -+        }
> -+
> -+#ifdef __OpenBSD__
> -+        if (ret < 6) {
> -+#else // defined(__OpenBSD__)
> -+        if (ret < 7) {
> -+#endif // defined(__OpenBSD__)
> -+            continue;
> -+        }
> -+
> -+        mount = g_new0(FsMount, 1);
> -+        mount->dirname = g_strdup(dev_name);
> -+#ifndef __OpenBSD__
> -+        mount->devtype = g_strdup(fstype);
> -+#endif // defined(__OpenBSD__)
> -+        mount->free = g_strdup(free);
> -+        mount->load = g_strdup(load);
> -+        mount->size = g_strdup(size);
> -+        mount->used = g_strdup(used);
> -+        mount->mntpoint = g_strdup(mounted);
> -+        mount->devmajor = 0;
> -+        mount->devminor = 0;
> -+
> -+        QTAILQ_INSERT_TAIL(mounts, mount, next);
> -+    }
> -+    g_free(line);
> -+
> -+    fclose(fp);
> -+}
> -+
> -+#ifdef __OpenBSD__
> -+
> -+static void add_type_fs_mount_list(FsMountList *mounts, Error **errp)
> -+{
> -+    FILE *fp;
> -+    char const *mountcmd = "/sbin/mount";
> -+    char *line = NULL;
> -+    size_t n;
> -+    int ret;
> -+    char mnt_fsname[128], mnt_dir[128], mnt_type[32], mnt_opts[128];
> -+    struct FsMount *mount;
> -+
> -+    // get mounts from mount command
> -+    if ((fp = popen(mountcmd, "r")) == NULL) {
> -+        g_debug("Cannot open '%s'!!\n", mountcmd);
> -+        error_setg_errno(errp, errno, "failed to create child process for command: %s", mountcmd);
> -+        return;
> -+    }
> -+
> -+    // loop through mounts from mount command
> -+    while (getline(&line, &n, fp) != -1) {
> -+        //g_debug("line '%s'", line);
> -+
> -+        ret = sscanf(line, "%127s on %127s type %31s (%127s)",
> -+                     mnt_fsname, mnt_dir, mnt_type, mnt_opts);
> -+        //g_debug("ret %d, fsname '%s', dir '%s', type '%s', opts '%s'",
> -+        //        ret, mnt_fsname, mnt_dir, mnt_type, mnt_opts);
> -+
> -+        if (4 != ret ||
> -+            '/' != mnt_fsname[0] ||
> -+            '/' != mnt_dir[0] ||
> -+            g_str_equal("smbfs", mnt_type) ||
> -+            g_str_equal("cifs", mnt_type)) {
> -+            continue;
> -+        }
> -+
> -+        // find mount in supplied mounts list and update device type
> -+        QTAILQ_FOREACH(mount, mounts, next) {
> -+            if (NULL == mount->devtype && g_str_equal(mount->dirname, mnt_fsname)) {
> -+                mount->devtype = g_strdup(mnt_type);
> -+                break;
> -+            }
> -+        }
> -+    }
> -+    g_free(line);
> -+
> -+    fclose(fp);
> -+}
> -+
> -+#endif // defined(__OpenBSD__)
> -+
> -+/* Return a list of the disk device(s)' info which @mount lies on */
> -+static GuestFilesystemInfo *build_guest_fsinfo(struct FsMount *mount,
> -+                                               Error **errp)
> -+{
> -+    GuestFilesystemInfo *fs = g_malloc0(sizeof(*fs));
> -+    struct statvfs buf;
> -+    unsigned long used, nonroot_total, fr_size;
> -+
> -+    fs->name = g_strdup(mount->dirname);
> -+    fs->mountpoint = g_strdup(mount->mntpoint);
> -+    fs->type = g_strdup(mount->devtype);
> -+
> -+    if (statvfs(fs->mountpoint, &buf) == 0) {
> -+        fr_size = buf.f_frsize;
> -+        used = buf.f_blocks - buf.f_bfree;
> -+        nonroot_total = used + buf.f_bavail;
> -+        fs->used_bytes = used * fr_size;
> -+        fs->total_bytes = nonroot_total * fr_size;
> -+
> -+        fs->has_total_bytes = true;
> -+        fs->has_used_bytes = true;
> -+    }
> -+
> -+    //g_free(devpath);
> -+
> -+    return fs;
> -+}
> -+
> - GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp)
> - {
> -+    FsMountList mounts;
> -+    struct FsMount *mount;
> -+    GuestFilesystemInfoList *new, *ret = NULL;
> -+    Error *local_err = NULL;
> -+
> -+    QTAILQ_INIT(&mounts);
> -+
> -+    g_debug("Entering to guest_get_fsinfo");
> -+    build_fs_mount_list(&mounts, &local_err);
> -+    if (local_err) {
> -+        error_propagate(errp, local_err);
> -+        return NULL;
> -+    }
> -+
> -+#ifdef __OpenBSD__
> -+    add_type_fs_mount_list(&mounts, &local_err);
> -+    if (local_err) {
> -+        error_propagate(errp, local_err);
> -+        return NULL;
> -+    }
> -+#endif // defined(__OpenBSD__)
> -+
> -+    QTAILQ_FOREACH(mount, &mounts, next) {
> -+        //g_debug("Building guest fsinfo for '%s'", mount->dirname);
> -+        //g_debug("Devtype '%s'", mount->devtype);
> -+        new = g_malloc0(sizeof(*ret));
> -+        new->value = build_guest_fsinfo(mount, &local_err);
> -+        new->next = ret;
> -+        ret = new;
> -+        if (local_err) {
> -+            error_propagate(errp, local_err);
> -+            qapi_free_GuestFilesystemInfoList(ret);
> -+            ret = NULL;
> -+            break;
> -+        }
> -+    }
> -+
> -+    free_fs_mount_list(&mounts);
> -+    return ret;
> -+}
> -+#else
> -+GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp)
> -+{
> -     error_setg(errp, QERR_UNSUPPORTED);
> -     return NULL;
> - }
> -+#endif /* CONFIG_BSD */
> -
> - GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error **errp)
> - {
> -@@ -3137,12 +3465,21 @@ GList *ga_command_init_blockedrpcs(GList *blockedrpcs)
> - {
> - #if !defined(__linux__)
> -     {
> -+#ifdef CONFIG_BSD
> -         const char *list[] = {
> -             "guest-suspend-disk", "guest-suspend-ram",
> -+            "guest-suspend-hybrid", "guest-set-vcpus",
> -+            "guest-get-memory-blocks", "guest-set-memory-blocks",
> -+            "guest-get-memory-block-size", "guest-get-memory-block-info",
> -+            NULL};
> -+#else
> -+        const char *list[] = {
> -+            "guest-suspend-disk", "guest-suspend-ram",
> -             "guest-suspend-hybrid", "guest-get-vcpus", "guest-set-vcpus",
> -             "guest-get-memory-blocks", "guest-set-memory-blocks",
> -             "guest-get-memory-block-size", "guest-get-memory-block-info",
> -             NULL};
> -+#endif /* CONFIG_BSD */
> -         char **p = (char **)list;
> -
> -         while (*p) {
> -@@ -3158,11 +3495,19 @@ GList *ga_command_init_blockedrpcs(GList *blockedrpcs)
> -
> - #if !defined(CONFIG_FSFREEZE)
> -     {
> -+#ifdef CONFIG_BSD
> -         const char *list[] = {
> -+            "guest-fsfreeze-status",
> -+            "guest-fsfreeze-freeze", "guest-fsfreeze-freeze-list",
> -+            "guest-fsfreeze-thaw",
> -+            "guest-get-disks", NULL};
> -+#else
> -+        const char *list[] = {
> -             "guest-get-fsinfo", "guest-fsfreeze-status",
> -             "guest-fsfreeze-freeze", "guest-fsfreeze-freeze-list",
> -             "guest-fsfreeze-thaw", "guest-get-fsinfo",
> -             "guest-get-disks", NULL};
> -+#endif /* CONFIG_BSD */
> -         char **p = (char **)list;
> -
> -         while (*p) {
> Index: patches/patch-qga_main_c
> ===================================================================
> RCS file: /cvs/ports/emulators/qemu/patches/patch-qga_main_c,v
> retrieving revision 1.8
> diff -u -p -u -p -r1.8 patch-qga_main_c
> --- patches/patch-qga_main_c	26 Feb 2024 13:30:18 -0000	1.8
> +++ patches/patch-qga_main_c	3 Oct 2024 02:03:36 -0000
> @@ -15,7 +15,7 @@ Index: qga/main.c
>    #define QGA_STATE_RELATIVE_DIR  "run"
>    #else
>    #define QGA_VIRTIO_PATH_DEFAULT "\\\\.\\Global\\org.qemu.guest_agent.0"
> -@@ -1597,7 +1601,11 @@ int main(int argc, char **argv)
> +@@ -1601,7 +1605,11 @@ int main(int argc, char **argv)
>        }
>    
>        if (config->method == NULL) {
> Index: patches/patch-qga_qapi-schema_json
> ===================================================================
> RCS file: patches/patch-qga_qapi-schema_json
> diff -N patches/patch-qga_qapi-schema_json
> --- /dev/null	1 Jan 1970 00:00:00 -0000
> +++ patches/patch-qga_qapi-schema_json	3 Oct 2024 02:03:36 -0000
> @@ -0,0 +1,79 @@
> +Adapted from https://github.com/aborche/qemu-guest-agent
> +
> +Adds support for "guest-get-fsinfo" and "guest-get-vcpus"
> +
> +Index: qga/qapi-schema.json
> +--- qga/qapi-schema.json.orig
> ++++ qga/qapi-schema.json
> +@@ -767,7 +767,7 @@
> +   'data': {'logical-id': 'int',
> +            'online': 'bool',
> +            '*can-offline': 'bool'},
> +-  'if': { 'any': ['CONFIG_LINUX', 'CONFIG_WIN32'] } }
> ++  'if': { 'any': ['CONFIG_LINUX', 'CONFIG_WIN32', 'CONFIG_BSD'] } }
> +
> + ##
> + # @guest-get-vcpus:
> +@@ -783,7 +783,7 @@
> + ##
> + { 'command': 'guest-get-vcpus',
> +   'returns': ['GuestLogicalProcessor'],
> +-  'if': { 'any': ['CONFIG_LINUX', 'CONFIG_WIN32'] } }
> ++  'if': { 'any': ['CONFIG_LINUX', 'CONFIG_WIN32', 'CONFIG_BSD'] } }
> +
> + ##
> + # @guest-set-vcpus:
> +@@ -879,7 +879,7 @@
> +   'data': [ 'ide', 'fdc', 'scsi', 'virtio', 'xen', 'usb', 'uml', 'sata',
> +             'sd', 'unknown', 'ieee1394', 'ssa', 'fibre', 'raid', 'iscsi',
> +             'sas', 'mmc', 'virtual', 'file-backed-virtual', 'nvme' ],
> +-  'if': { 'any': [ 'CONFIG_WIN32', 'CONFIG_LINUX' ] } }
> ++  'if': { 'any': [ 'CONFIG_WIN32', 'CONFIG_LINUX', 'CONFIG_BSD' ] } }
> +
> +
> + ##
> +@@ -898,7 +898,7 @@
> + { 'struct': 'GuestPCIAddress',
> +   'data': {'domain': 'int', 'bus': 'int',
> +            'slot': 'int', 'function': 'int'},
> +-  'if': { 'any': [ 'CONFIG_WIN32', 'CONFIG_LINUX' ] } }
> ++  'if': { 'any': [ 'CONFIG_WIN32', 'CONFIG_LINUX', 'CONFIG_BSD' ] } }
> +
> + ##
> + # @GuestCCWAddress:
> +@@ -918,7 +918,7 @@
> +            'ssid': 'int',
> +            'subchno': 'int',
> +            'devno': 'int'},
> +-  'if': { 'any': [ 'CONFIG_WIN32', 'CONFIG_LINUX' ] } }
> ++  'if': { 'any': [ 'CONFIG_WIN32', 'CONFIG_LINUX', 'CONFIG_BSD' ] } }
> +
> + ##
> + # @GuestDiskAddress:
> +@@ -948,7 +948,7 @@
> +            'bus': 'int', 'target': 'int', 'unit': 'int',
> +            '*serial': 'str', '*dev': 'str',
> +            '*ccw-address': 'GuestCCWAddress'},
> +-  'if': { 'any': [ 'CONFIG_WIN32', 'CONFIG_LINUX' ] } }
> ++  'if': { 'any': [ 'CONFIG_WIN32', 'CONFIG_LINUX', 'CONFIG_BSD' ] } }
> +
> + ##
> + # @GuestNVMeSmart:
> +@@ -1068,7 +1068,7 @@
> +   'data': {'name': 'str', 'mountpoint': 'str', 'type': 'str',
> +            '*used-bytes': 'uint64', '*total-bytes': 'uint64',
> +            '*total-bytes-privileged': 'uint64', 'disk': ['GuestDiskAddress']},
> +-  'if': { 'any': [ 'CONFIG_WIN32', 'CONFIG_LINUX' ] } }
> ++  'if': { 'any': [ 'CONFIG_WIN32', 'CONFIG_LINUX', 'CONFIG_BSD' ] } }
> +
> + ##
> + # @guest-get-fsinfo:
> +@@ -1082,7 +1082,7 @@
> + ##
> + { 'command': 'guest-get-fsinfo',
> +   'returns': ['GuestFilesystemInfo'],
> +-  'if': { 'any': [ 'CONFIG_WIN32', 'CONFIG_LINUX' ] } }
> ++  'if': { 'any': [ 'CONFIG_WIN32', 'CONFIG_LINUX', 'CONFIG_BSD' ] } }
> +
> + ##
> + # @guest-set-user-password:
> Index: patches/patch-tcg_riscv_tcg-target_c_inc
> ===================================================================
> RCS file: patches/patch-tcg_riscv_tcg-target_c_inc
> diff -N patches/patch-tcg_riscv_tcg-target_c_inc
> --- patches/patch-tcg_riscv_tcg-target_c_inc	15 Jul 2024 11:13:29 -0000	1.3
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,21 +0,0 @@
> -util/cpuinfo-riscv: Support OpenBSD signal frame
> -adc028428a6da5ea8d6a688085966a33be4c97c7
> -
> -Index: tcg/riscv/tcg-target.c.inc
> ---- tcg/riscv/tcg-target.c.inc.orig
> -+++ tcg/riscv/tcg-target.c.inc
> -@@ -2116,7 +2116,14 @@ static void sigill_handler(int signo, siginfo_t *si, v
> - {
> -     /* Skip the faulty instruction */
> -     ucontext_t *uc = (ucontext_t *)data;
> -+
> -+#ifdef __linux__
> -     uc->uc_mcontext.__gregs[REG_PC] += 4;
> -+#elif defined(__OpenBSD__)
> -+    uc->sc_sepc += 4;
> -+#else
> -+# error Unsupported OS
> -+#endif
> -
> -     got_sigill = 1;
> - }
> Index: patches/patch-util_cpuinfo-aarch64_c
> ===================================================================
> RCS file: patches/patch-util_cpuinfo-aarch64_c
> diff -N patches/patch-util_cpuinfo-aarch64_c
> --- patches/patch-util_cpuinfo-aarch64_c	15 Jul 2024 11:13:29 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,56 +0,0 @@
> -util/cpuinfo-aarch64: Add OpenBSD support
> -ab089908b42f22e7edfa0d40db963c136ab35419
> -
> -Index: util/cpuinfo-aarch64.c
> ---- util/cpuinfo-aarch64.c.orig
> -+++ util/cpuinfo-aarch64.c
> -@@ -20,6 +20,12 @@
> - #ifdef CONFIG_DARWIN
> - # include <sys/sysctl.h>
> - #endif
> -+#ifdef __OpenBSD__
> -+# include <machine/armreg.h>
> -+# include <machine/cpu.h>
> -+# include <sys/types.h>
> -+# include <sys/sysctl.h>
> -+#endif
> -
> - unsigned cpuinfo;
> -
> -@@ -71,6 +77,36 @@ unsigned __attribute__((constructor)) cpuinfo_init(voi
> -     info |= sysctl_for_bool("hw.optional.arm.FEAT_AES") * CPUINFO_AES;
> -     info |= sysctl_for_bool("hw.optional.arm.FEAT_PMULL") * CPUINFO_PMULL;
> -     info |= sysctl_for_bool("hw.optional.arm.FEAT_BTI") * CPUINFO_BTI;
> -+#endif
> -+#ifdef __OpenBSD__
> -+    int mib[2];
> -+    uint64_t isar0;
> -+    uint64_t pfr1;
> -+    size_t len;
> -+
> -+    mib[0] = CTL_MACHDEP;
> -+    mib[1] = CPU_ID_AA64ISAR0;
> -+    len = sizeof(isar0);
> -+    if (sysctl(mib, 2, &isar0, &len, NULL, 0) != -1) {
> -+        if (ID_AA64ISAR0_ATOMIC(isar0) >= ID_AA64ISAR0_ATOMIC_IMPL) {
> -+            info |= CPUINFO_LSE;
> -+        }
> -+        if (ID_AA64ISAR0_AES(isar0) >= ID_AA64ISAR0_AES_BASE) {
> -+            info |= CPUINFO_AES;
> -+        }
> -+        if (ID_AA64ISAR0_AES(isar0) >= ID_AA64ISAR0_AES_PMULL) {
> -+            info |= CPUINFO_PMULL;
> -+        }
> -+    }
> -+
> -+    mib[0] = CTL_MACHDEP;
> -+    mib[1] = CPU_ID_AA64PFR1;
> -+    len = sizeof(pfr1);
> -+    if (sysctl(mib, 2, &pfr1, &len, NULL, 0) != -1) {
> -+        if (ID_AA64PFR1_BT(pfr1) >= ID_AA64PFR1_BT_IMPL) {
> -+            info |= CPUINFO_BTI;
> -+        }
> -+    }
> - #endif
> -
> -     cpuinfo = info;
> Index: patches/patch-util_cpuinfo-ppc_c
> ===================================================================
> RCS file: patches/patch-util_cpuinfo-ppc_c
> diff -N patches/patch-util_cpuinfo-ppc_c
> --- patches/patch-util_cpuinfo-ppc_c	15 Jul 2024 11:13:29 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,54 +0,0 @@
> -util/cpuinfo-ppc: Fix building on OpenBSD
> -272d3decc19aebe87955f4ec6d0c6cc8790471f1
> -
> -Index: util/cpuinfo-ppc.c
> ---- util/cpuinfo-ppc.c.orig
> -+++ util/cpuinfo-ppc.c
> -@@ -6,11 +6,13 @@
> - #include "qemu/osdep.h"
> - #include "host/cpuinfo.h"
> -
> --#include <asm/cputable.h>
> --#ifdef CONFIG_GETAUXVAL
> --# include <sys/auxv.h>
> --#else
> --# include "elf.h"
> -+#ifdef CONFIG_LINUX
> -+# include <asm/cputable.h>
> -+# ifdef CONFIG_GETAUXVAL
> -+#  include <sys/auxv.h>
> -+# else
> -+#  include "elf.h"
> -+# endif
> - #endif
> -
> - unsigned cpuinfo;
> -@@ -19,16 +21,17 @@ unsigned cpuinfo;
> - unsigned __attribute__((constructor)) cpuinfo_init(void)
> - {
> -     unsigned info = cpuinfo;
> --    unsigned long hwcap, hwcap2;
> -
> -     if (info) {
> -         return info;
> -     }
> -
> --    hwcap = qemu_getauxval(AT_HWCAP);
> --    hwcap2 = qemu_getauxval(AT_HWCAP2);
> -     info = CPUINFO_ALWAYS;
> -
> -+#ifdef CONFIG_LINUX
> -+    unsigned long hwcap = qemu_getauxval(AT_HWCAP);
> -+    unsigned long hwcap2 = qemu_getauxval(AT_HWCAP2);
> -+
> -     /* Version numbers are monotonic, and so imply all lower versions. */
> -     if (hwcap2 & PPC_FEATURE2_ARCH_3_1) {
> -         info |= CPUINFO_V3_1 | CPUINFO_V3_0 | CPUINFO_V2_07 | CPUINFO_V2_06;
> -@@ -58,6 +61,7 @@ unsigned __attribute__((constructor)) cpuinfo_init(voi
> -             }
> -         }
> -     }
> -+#endif
> -
> -     cpuinfo = info;
> -     return info;
> Index: pkg/PLIST-main
> ===================================================================
> RCS file: /cvs/ports/emulators/qemu/pkg/PLIST-main,v
> retrieving revision 1.17
> diff -u -p -u -p -r1.17 PLIST-main
> --- pkg/PLIST-main	28 May 2024 13:57:38 -0000	1.17
> +++ pkg/PLIST-main	3 Oct 2024 02:03:36 -0000
> @@ -21,7 +21,6 @@
>   @bin bin/qemu-system-mips64
>   @bin bin/qemu-system-mips64el
>   @bin bin/qemu-system-mipsel
> -@bin bin/qemu-system-nios2
>   @bin bin/qemu-system-or1k
>   @bin bin/qemu-system-ppc
>   @bin bin/qemu-system-ppc64
> @@ -110,6 +109,7 @@ share/doc/qemu/devel/clocks.html
>   share/doc/qemu/devel/code-of-conduct.html
>   share/doc/qemu/devel/conflict-resolution.html
>   share/doc/qemu/devel/control-flow-integrity.html
> +share/doc/qemu/devel/crypto.html
>   share/doc/qemu/devel/decodetree.html
>   share/doc/qemu/devel/docs.html
>   share/doc/qemu/devel/ebpf_rss.html
> @@ -122,6 +122,7 @@ share/doc/qemu/devel/index-tcg.html
>   share/doc/qemu/devel/index.html
>   share/doc/qemu/devel/kconfig.html
>   share/doc/qemu/devel/loads-stores.html
> +share/doc/qemu/devel/luks-detached-header.html
>   share/doc/qemu/devel/maintainers.html
>   share/doc/qemu/devel/memory.html
>   share/doc/qemu/devel/migration/
> @@ -134,6 +135,8 @@ share/doc/qemu/devel/migration/index.htm
>   share/doc/qemu/devel/migration/main.html
>   share/doc/qemu/devel/migration/mapped-ram.html
>   share/doc/qemu/devel/migration/postcopy.html
> +share/doc/qemu/devel/migration/qpl-compression.html
> +share/doc/qemu/devel/migration/uadk-compression.html
>   share/doc/qemu/devel/migration/vfio.html
>   share/doc/qemu/devel/migration/virtio.html
>   share/doc/qemu/devel/modules.html
> @@ -176,7 +179,10 @@ share/doc/qemu/interop/dbus-vmstate.html
>   share/doc/qemu/interop/dbus.html
>   share/doc/qemu/interop/index.html
>   share/doc/qemu/interop/live-block-operations.html
> +share/doc/qemu/interop/nbd.html
> +share/doc/qemu/interop/parallels.html
>   share/doc/qemu/interop/pr-helper.html
> +share/doc/qemu/interop/prl-xml.html
>   share/doc/qemu/interop/qemu-qmp-ref.html
>   share/doc/qemu/interop/qemu-storage-daemon-qmp-ref.html
>   share/doc/qemu/interop/qmp-spec.html
> @@ -211,7 +217,10 @@ share/doc/qemu/specs/ppc-spapr-uv-hcalls
>   share/doc/qemu/specs/ppc-spapr-xive.html
>   share/doc/qemu/specs/ppc-xive.html
>   share/doc/qemu/specs/pvpanic.html
> +share/doc/qemu/specs/rapl-msr.html
> +share/doc/qemu/specs/rocker.html
>   share/doc/qemu/specs/sev-guest-firmware.html
> +share/doc/qemu/specs/spdm.html
>   share/doc/qemu/specs/standard-vga.html
>   share/doc/qemu/specs/tpm.html
>   share/doc/qemu/specs/virt-ctlr.html
> @@ -255,6 +264,7 @@ share/doc/qemu/system/arm/vexpress.html
>   share/doc/qemu/system/arm/virt.html
>   share/doc/qemu/system/arm/xenpvh.html
>   share/doc/qemu/system/arm/xlnx-versal-virt.html
> +share/doc/qemu/system/arm/xlnx-zynq.html
>   share/doc/qemu/system/arm/xscale.html
>   share/doc/qemu/system/authz.html
>   share/doc/qemu/system/barrier.html
> @@ -363,6 +373,7 @@ share/doc/qemu/tools/qemu-nbd.html
>   share/doc/qemu/tools/qemu-pr-helper.html
>   share/doc/qemu/tools/qemu-storage-daemon.html
>   share/doc/qemu/tools/qemu-trace-stap.html
> +share/doc/qemu/tools/qemu-vmsr-helper.html
>   share/doc/qemu/tools/virtfs-proxy-helper.html
>   share/doc/qemu/user/
>   share/doc/qemu/user/index.html
> @@ -413,6 +424,8 @@ share/qemu/edk2-i386-code.fd
>   share/qemu/edk2-i386-secure-code.fd
>   share/qemu/edk2-i386-vars.fd
>   share/qemu/edk2-licenses.txt
> +share/qemu/edk2-riscv-code.fd
> +share/qemu/edk2-riscv-vars.fd
>   share/qemu/edk2-x86_64-code.fd
>   share/qemu/edk2-x86_64-secure-code.fd
>   share/qemu/efi-e1000.rom