Implement freebsd-specific vm walker.
diff --git a/src/os-freebsd.c b/src/os-freebsd.c
index 15ce3d4..77fb267 100644
--- a/src/os-freebsd.c
+++ b/src/os-freebsd.c
@@ -24,8 +24,11 @@
#ifndef UNW_REMOTE_ONLY
+#include <sys/types.h>
+#include <sys/user.h>
#include <dlfcn.h>
#include <unistd.h>
+#include <libutil.h>
#include "libunwind_i.h"
@@ -33,9 +36,27 @@
tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
unsigned long *segbase, unsigned long *mapoff)
{
+ struct kinfo_vmentry *freep, *kve;
+ int cnt, rc, i;
- /* XXXKIB */
- return (0);
+ freep = kinfo_getvmmap(pid, &cnt);
+ if (freep == NULL)
+ return (-1);
+ for (i = 0; i < cnt; i++) {
+ kve = &freep[i];
+ if (ip < kve->kve_start || ip >= kve->kve_end)
+ continue;
+ if (kve->kve_type != KVME_TYPE_VNODE) {
+ free(freep);
+ return (-1);
+ }
+ segbase = kve->kve_start;
+ mapoff = kve->kve_offset;
+ rc = elf_map_image(ei, kve->kve_path);
+ free(freep);
+ return (rc);
+ }
+ return (-1);
}
#endif /* UNW_REMOTE_ONLY */