On Thu, Jun 18, 2026 at 4:22 PM Philippe Mathieu-Daudé <
[email protected]> wrote:

> On 18/6/26 21:55, Richard Henderson wrote:
> > Reviewed-by: Helge Deller <[email protected]>
> > Reviewed-by: Warner Losh <[email protected]>
> > Signed-off-by: Richard Henderson <[email protected]>
> > ---
> >   common-user/selfmap.c   | 41 ++++++++++++++++++++++++++++++++++++++++-
> >   common-user/meson.build |  5 +++++
> >   2 files changed, 45 insertions(+), 1 deletion(-)
> >
> > diff --git a/common-user/selfmap.c b/common-user/selfmap.c
> > index a1b88dee66..151d066801 100644
> > --- a/common-user/selfmap.c
> > +++ b/common-user/selfmap.c
> > @@ -9,6 +9,10 @@
> >   #include "qemu/osdep.h"
> >   #include "qemu/cutils.h"
> >   #include "user/selfmap.h"
> > +#ifdef __FreeBSD__
> > +#include <libutil.h>
>
> Out of curiosity, what is libutil for?
>

kinfo_getvmmap

My rewrite grabbed the data from the sysctl directly and didn't need this
wrapper.

Warner


> > +#include <sys/user.h>
> > +#endif
> >
> >   IntervalTreeRoot *read_self_maps(void)
> >   {
> > @@ -80,9 +84,44 @@ IntervalTreeRoot *read_self_maps(void)
> >       g_strfreev(lines);
> >       g_free(maps);
> >
> > +    return root;
> > +#elif defined(__FreeBSD__)
> > +    int n = 0;
> > +    struct kinfo_vmentry *entries = kinfo_getvmmap(getpid(), &n);
> > +    IntervalTreeRoot *root;
> > +
> > +    if (!entries) {
> > +        return NULL;
> > +    }
> > +    root = g_new0(IntervalTreeRoot, 1);
> > +
> > +    for (int i = 0; i < n; ++i) {
> > +        struct kinfo_vmentry *k = &entries[i];
> > +        size_t path_len = strnlen(k->kve_path, sizeof(k->kve_path)) + 1;
> > +        MapInfo *e = g_malloc0(sizeof(*e) + path_len);
> > +
> > +        e->itree.start = k->kve_start;
> > +        e->itree.last = k->kve_end - 1;
> > +
> > +        /* ??? The rest of these fields are only used in linux-user. */
> > +        e->dev = k->kve_vn_fsid_freebsd11;
> > +        e->inode = k->kve_vn_fileid;
> > +        e->offset = k->kve_offset;
> > +        e->is_read = k->kve_protection & KVME_PROT_READ;
> > +        e->is_write = k->kve_protection & KVME_PROT_WRITE;
> > +        e->is_exec = k->kve_protection & KVME_PROT_EXEC;
> > +        e->is_priv = k->kve_flags & KVME_FLAG_COW;
> > +        if (path_len) {
> > +            e->path = memcpy(e + 1, k->kve_path, path_len);
> > +        }
> > +
> > +        interval_tree_insert(&e->itree, root);
> > +    }
> > +
> > +    free(entries);
> >       return root;
> >   #else
> > -    return NULL;
> > +# error
> >   #endif
> >   }
> >
> > diff --git a/common-user/meson.build b/common-user/meson.build
> > index 831a7273fb..5e041de55e 100644
> > --- a/common-user/meson.build
> > +++ b/common-user/meson.build
> > @@ -10,3 +10,8 @@ user_ss.add(files(
> >     'safe-syscall-error.c',
> >     'selfmap.c',
> >   ))
> > +
> > +if host_os == 'freebsd'
> > +  libutil = cc.find_library('util', required: true)
> > +  user_ss.add(libutil)
> > +endif
>
>

Reply via email to