Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 12 Jan 2020 22:24:46 +0000 (UTC)
From:      Koop Mast <kwm@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r522841 - in head/devel/libgtop: . files
Message-ID:  <202001122224.00CMOkki046338@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kwm
Date: Sun Jan 12 22:24:46 2020
New Revision: 522841
URL: https://svnweb.freebsd.org/changeset/ports/522841

Log:
  Fix build on 13-CURRENT >= 1300062
  
  Changes to the virtual memory subsystem in 13.0-CURRENT r355491 has changed
  the API, as it is no longer a circular array. This broke the devel/libgtop
  port on these systems.
  
  Submitted by:	Neel Chauhan <neel AT neelc DOT org> (based on patch by dougm)
  Reviewed by:	koobs
  Differential Revision:	https://reviews.freebsd.org/D22929

Modified:
  head/devel/libgtop/Makefile
  head/devel/libgtop/files/patch-sysdeps_freebsd_procmap.c

Modified: head/devel/libgtop/Makefile
==============================================================================
--- head/devel/libgtop/Makefile	Sun Jan 12 21:10:45 2020	(r522840)
+++ head/devel/libgtop/Makefile	Sun Jan 12 22:24:46 2020	(r522841)
@@ -3,7 +3,7 @@
 
 PORTNAME=	libgtop
 PORTVERSION=	2.38.0
-PORTREVISION=	1
+PORTREVISION=	2
 CATEGORIES=	devel gnome
 MASTER_SITES=	GNOME
 DIST_SUBDIR=	gnome2

Modified: head/devel/libgtop/files/patch-sysdeps_freebsd_procmap.c
==============================================================================
--- head/devel/libgtop/files/patch-sysdeps_freebsd_procmap.c	Sun Jan 12 21:10:45 2020	(r522840)
+++ head/devel/libgtop/files/patch-sysdeps_freebsd_procmap.c	Sun Jan 12 22:24:46 2020	(r522841)
@@ -1,5 +1,5 @@
---- sysdeps/freebsd/procmap.c.orig	2015-08-17 18:59:37 UTC
-+++ sysdeps/freebsd/procmap.c
+--- sysdeps/freebsd/procmap.c.orig	2017-08-07 18:43:41.000000000 -0400
++++ sysdeps/freebsd/procmap.c	2019-12-26 16:37:29.791528000 -0500
 @@ -52,6 +52,8 @@
  #include <sys/mount.h>
  #include <ufs/ufs/quota.h>
@@ -9,7 +9,7 @@
  #include <fs/devfs/devfs.h>
  #if (__FreeBSD_version >= 600006) || defined(__FreeBSD_kernel__)
  #include <fs/devfs/devfs_int.h>
-@@ -86,6 +88,8 @@ _glibtop_sysdeps_freebsd_dev_inode (glib
+@@ -95,6 +97,8 @@
          struct cdev_priv priv;
  #if __FreeBSD_version < 800039
          struct cdev si;
@@ -18,14 +18,107 @@
  #endif
  
          *inum = 0;
-@@ -167,7 +171,9 @@ _glibtop_sysdeps_freebsd_dev_inode (glib
+@@ -231,6 +235,32 @@
+         server->sysdeps.proc_map = _glibtop_sysdeps_proc_map;
+ }
  
++static int
++vm_map_reader(void *token, vm_map_entry_t addr, vm_map_entry_t dest)
++{
++	kvm_t *kd;
++
++	kd = (kvm_t *)token;
++	return (kvm_read (kd, (gulong) addr, dest, sizeof(*dest)) == sizeof(*dest));
++}
++
++#if (__FreeBSD_version < 1300062)
++typedef int vm_map_entry_reader(void *token, vm_map_entry_t addr,
++    vm_map_entry_t dest);
++
++static inline vm_map_entry_t
++vm_map_entry_read_succ(void *token, struct vm_map_entry *const clone,
++     vm_map_entry_reader reader)
++{
++	vm_map_entry_t next;
++
++	next = clone->next;
++	if (!reader (token, next, clone))
++		return (NULL);
++	return (next);
++}
++#endif
++
+ /* Provides detailed information about a process. */
  
- #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,
+ glibtop_map_entry *
+@@ -238,13 +268,12 @@
+                         pid_t pid)
+ {
+         struct kinfo_proc *pinfo;
+-        struct vm_map_entry entry, *first;
++        struct vm_map_entry entry;
+         struct vmspace vmspace;
+         struct vm_object object;
+         GArray *maps;
+         struct vnode vnode;
+-        int count;
+-        int update = 0;
++        int i, count;
+ 
+         memset (buf, 0, sizeof (glibtop_proc_map));
+ 
+@@ -273,16 +302,6 @@
+                 return NULL;
+         }
+ 
+-        first = vmspace.vm_map.header.next;
+-
+-        if (kvm_read (server->machine->kd,
+-                        (gulong) vmspace.vm_map.header.next,
+-                        (char *) &entry, sizeof (entry)) != sizeof (entry)) {
+-                glibtop_warn_io_r (server, "kvm_read (entry)");
+-		glibtop_suid_leave (server);
+-                return NULL;
+-        }
+-
+         /* Walk through the `vm_map_entry' list ... */
+ 
+         /* I tested this a few times with `mmap'; as soon as you write
+@@ -292,21 +311,17 @@
+         maps = g_array_sized_new(FALSE, FALSE, sizeof(glibtop_map_entry),
+                                  vmspace.vm_map.nentries);
+ 
+-        do {
++	entry = vmspace.vm_map.header;
++        for (i = 0; i < vmspace.vm_map.nentries; i++) {
+                 glibtop_map_entry *mentry;
+                 guint64 inum, dev;
+                 guint len;
+ 
+-                if (update) {
+-                        if (kvm_read (server->machine->kd,
+-                                        (gulong) entry.next,
+-                                        (char *) &entry, sizeof (entry)) != sizeof (entry)) {
+-                                glibtop_warn_io_r (server, "kvm_read (entry)");
+-                                continue;
+-                        }
+-                } else {
+-                        update = 1;
+-                }
++		if (!vm_map_entry_read_succ(server->machine->kd, &entry, vm_map_reader)) {
++			glibtop_warn_io_r (server, "kvm_read (entry)");
++			glibtop_suid_leave (server);
++			return NULL;
++		}
+ 
+                 if (entry.eflags & (MAP_ENTRY_IS_SUB_MAP))
+                         continue;
+@@ -377,7 +392,7 @@
+                 if (entry.protection & VM_PROT_EXECUTE)
+                         mentry->perm |= GLIBTOP_MAP_PERM_EXECUTE;
+ 
+-        } while (entry.next != first);
++        }
+ 
+         glibtop_suid_leave (server);
+ 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202001122224.00CMOkki046338>