--- files/patch-sysdeps_freebsd_procmap.c (revision 520332) +++ files/patch-sysdeps_freebsd_procmap.c (working copy) @@ -1,31 +1,88 @@ ---- sysdeps/freebsd/procmap.c.orig 2015-08-17 18:59:37 UTC -+++ sysdeps/freebsd/procmap.c -@@ -52,6 +52,8 @@ - #include - #include - #include -+#include -+#include - #include - #if (__FreeBSD_version >= 600006) || defined(__FreeBSD_kernel__) - #include -@@ -86,6 +88,8 @@ _glibtop_sysdeps_freebsd_dev_inode (glib - struct cdev_priv priv; - #if __FreeBSD_version < 800039 - struct cdev si; -+#else -+ struct ufsmount um; +--- sysdeps/freebsd/procmap.c.orig 2017-08-07 18:43:41.000000000 -0400 ++++ sysdeps/freebsd/procmap.c 2019-12-17 10:47:46.013150000 -0500 +@@ -66,7 +66,6 @@ + #undef _KERNEL #endif - *inum = 0; -@@ -167,7 +171,9 @@ _glibtop_sysdeps_freebsd_dev_inode (glib +- + #include + #include +@@ -231,6 +230,21 @@ + server->sysdeps.proc_map = _glibtop_sysdeps_proc_map; + } - #if (__FreeBSD_version >= 800039) || (__FreeBSD_kernel_version >= 800039) -- if (kvm_read (server->machine->kd, (gulong) cdev2priv(inode.i_dev), (char *) &priv, -+ if (kvm_read (server->machine->kd, (gulong) inode.i_ump, (char *) &um, -+ sizeof (um)) != sizeof (um) || -+ kvm_read (server->machine->kd, (gulong) cdev2priv(um.um_dev), (char *) &priv, - sizeof (priv)) - #else - if (kvm_read (server->machine->kd, (gulong) inode.i_dev, (char *) &si, ++#if (__FreeBSD_version >= 1300062) ++static int ++procstat_vm_map_reader(void *token, vm_map_entry_t addr, vm_map_entry_t dest) ++{ ++ kvm_t *kd; ++ size_t nbytes = sizeof (*dest); ++ ++ if (nbytes >= SSIZE_MAX) ++ return (0); ++ ++ kd = (kvm_t *) token; ++ return (kvm_read (kd, (unsigned long) addr, dest, nbytes) == nbytes); ++} ++#endif ++ + /* Provides detailed information about a process. */ + + glibtop_map_entry * +@@ -245,6 +259,10 @@ + struct vnode vnode; + int count; + int update = 0; ++#if (__FreeBSD_version >= 1300062) ++ vm_map_entry_t entryp; ++ struct vm_map_entry *entryn; ++#endif + + memset (buf, 0, sizeof (glibtop_proc_map)); + +@@ -273,10 +291,20 @@ + return NULL; + } + ++#if (__FreeBSD_version >= 1300062) ++ entryp = vm_map_entry_read_succ (server->machine->kd, entryn, ++ procstat_vm_map_reader); ++ first = entryn; ++#else + first = vmspace.vm_map.header.next; ++#endif + + if (kvm_read (server->machine->kd, ++#if (__FreeBSD_version >= 1300062) ++ (gulong) entryn, ++#else + (gulong) vmspace.vm_map.header.next, ++#endif + (char *) &entry, sizeof (entry)) != sizeof (entry)) { + glibtop_warn_io_r (server, "kvm_read (entry)"); + glibtop_suid_leave (server); +@@ -299,7 +327,11 @@ + + if (update) { + if (kvm_read (server->machine->kd, ++#if (__FreeBSD_version >= 1300062) ++ (gulong) entryn, ++#else + (gulong) entry.next, ++#endif + (char *) &entry, sizeof (entry)) != sizeof (entry)) { + glibtop_warn_io_r (server, "kvm_read (entry)"); + continue; +@@ -377,7 +409,11 @@ + if (entry.protection & VM_PROT_EXECUTE) + mentry->perm |= GLIBTOP_MAP_PERM_EXECUTE; + ++#if (__FreeBSD_version >= 1300062) ++ } while (entryn != first); ++#else + } while (entry.next != first); ++#endif + + glibtop_suid_leave (server); +