now RBT is in userland, we can actually use the API instead of hand
rolling the copying of the tree topology.
ok?
Index: lib/libkvm/kvm_proc.c
===================================================================
RCS file: /cvs/src/lib/libkvm/kvm_proc.c,v
retrieving revision 1.58
diff -u -p -r1.58 kvm_proc.c
--- lib/libkvm/kvm_proc.c 7 Nov 2016 00:26:33 -0000 1.58
+++ lib/libkvm/kvm_proc.c 20 Jun 2017 01:03:05 -0000
@@ -77,6 +77,7 @@
#include <sys/ioctl.h>
#include <sys/tty.h>
#include <stdlib.h>
+#include <stddef.h>
#include <string.h>
#include <unistd.h>
#include <nlist.h>
@@ -108,6 +109,9 @@ static int proc_verify(kvm_t *, const st
static void ps_str_a(struct ps_strings *, u_long *, int *);
static void ps_str_e(struct ps_strings *, u_long *, int *);
+RBT_PROTOTYPE(uvm_map_addr, vm_map_entry, daddrs.addr_entry,
+ uvm_mapentry_addrcmp);
+
static struct vm_anon *
_kvm_findanon(kvm_t *kd, struct vm_amap *amapp, int slot)
{
@@ -166,7 +170,6 @@ _kvm_ureadm(kvm_t *kd, const struct kinf
struct vm_anon *anonp, anon;
struct vm_map_entry vme;
struct vm_page pg;
- unsigned long rboff;
if (kd->swapspc == 0) {
kd->swapspc = _kvm_malloc(kd, kd->nbpg);
@@ -174,26 +177,23 @@ _kvm_ureadm(kvm_t *kd, const struct kinf
return (NULL);
}
- rboff = (unsigned long)&vme.daddrs.addr_entry - (unsigned long)&vme;
-
/*
* Look through the address map for the memory object
* that corresponds to the given virtual address.
*/
if (KREAD(kd, (u_long)p->p_vmspace, &vm))
return (NULL);
- addr = (u_long)&vm.vm_map.addr.rbh_root.rbt_root;
+ addr = (u_long)RBT_ROOT(uvm_map_addr, &vm.vm_map.addr);
while (1) {
if (addr == 0)
return (NULL);
- addr -= rboff;
if (KREAD(kd, addr, &vme))
return (NULL);
if (va < vme.start)
- addr = (u_long)vme.daddrs.addr_entry.rbt_left;
+ addr = (u_long)RBT_LEFT(uvm_map_addr, &vme);
else if (va >= vme.end + vme.guard + vme.fspace)
- addr = (u_long)vme.daddrs.addr_entry.rbt_right;
+ addr = (u_long)RBT_RIGHT(uvm_map_addr, &vme);
else if (va >= vme.end)
return (NULL);
else
@@ -543,3 +543,13 @@ kvm_ureadm(kvm_t *kd, const struct kinfo
}
return (ssize_t)(cp - buf);
}
+
+static inline int
+uvm_mapentry_addrcmp(const struct vm_map_entry *e1,
+ const struct vm_map_entry *e2)
+{
+ return e1->start < e2->start ? -1 : e1->start > e2->start;
+}
+
+RBT_GENERATE(uvm_map_addr, vm_map_entry, daddrs.addr_entry,
+ uvm_mapentry_addrcmp);
Index: lib/libkvm/shlib_version
===================================================================
RCS file: /cvs/src/lib/libkvm/shlib_version,v
retrieving revision 1.19
diff -u -p -r1.19 shlib_version
--- lib/libkvm/shlib_version 2 Oct 2016 23:11:55 -0000 1.19
+++ lib/libkvm/shlib_version 20 Jun 2017 01:03:05 -0000
@@ -1,2 +1,2 @@
major=16
-minor=2
+minor=3
Index: usr.sbin/procmap/procmap.c
===================================================================
RCS file: /cvs/src/usr.sbin/procmap/procmap.c,v
retrieving revision 1.63
diff -u -p -r1.63 procmap.c
--- usr.sbin/procmap/procmap.c 16 Sep 2016 04:45:35 -0000 1.63
+++ usr.sbin/procmap/procmap.c 20 Jun 2017 01:03:05 -0000
@@ -580,10 +580,10 @@ load_vm_map_entries(kvm_t *kd, struct vm
/* RBTs point at rb_entries inside nodes */
ld = load_vm_map_entries(kd, RBT_LEFT(uvm_map_addr, result), result);
- result->daddrs.addr_entry.rbt_left = &ld->daddrs.addr_entry;
+ RBT_SET_LEFT(uvm_map_addr, result, ld);
ld = load_vm_map_entries(kd, RBT_RIGHT(uvm_map_addr, result), result);
- result->daddrs.addr_entry.rbt_right = &ld->daddrs.addr_entry;
- result->daddrs.addr_entry.rbt_parent = &parent->daddrs.addr_entry;
+ RBT_SET_RIGHT(uvm_map_addr, result, ld);
+ RBT_SET_PARENT(uvm_map_addr, result, parent);
return result;
}