From: Brad Smith Subject: Re: UPDATE: QEMU 9.1.0 To: ports@openbsd.org Date: Sun, 27 Oct 2024 18:36:35 -0400 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 > + #include > +@@ -28,6 +27,8 @@ > + #include > + #endif > + #include > ++#include > ++#include > + > + #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 > -+#include > -+#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 > - #endif > -+#ifdef __OpenBSD__ > -+# include > -+# include > -+# include > -+# include > -+#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 > --#ifdef CONFIG_GETAUXVAL > --# include > --#else > --# include "elf.h" > -+#ifdef CONFIG_LINUX > -+# include > -+# ifdef CONFIG_GETAUXVAL > -+# include > -+# 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