Can someone with a FreeBSD 15 or 16 -CURRENT armv7 machine test if they're also getting segfaults when running gpart show? Or better yet, if someone has a test machine to lend me.

On 12/28/25 17:06, Mark Millard wrote:
[minherit(0x2051e000,1100,INHERIT_ZERO)           = 0 (0x0)
might be involoved?]

On Dec 28, 2025, at 00:23, Mark Millard <[email protected]> wrote:

On Dec 27, 2025, at 23:55, Mark Millard <[email protected]> wrote:

[Turns out: works on aarch64 kernel's armv7 support, fails
on the armv7 native kernel, exact same world files on the
exact same media.]

I got that wrong: a large part of the output occurs before a
segmentation fault on the Windows Dev Kit 2023. But it has a
very different backtrace and the output before that has numerical
garbage values showing.


On Dec 27, 2025, at 23:35, Mark Millard <[email protected]> wrote:

On Dec 27, 2025, at 22:03, Mark Millard <[email protected]> wrote:

Context:

# uname -apKU
FreeBSD OPiP2E-RPi2v1p1 16.0-CURRENT FreeBSD 16.0-CURRENT 
main-n282732-939ac0c8fde2 GENERIC-NODEBUG arm armv7 1600007 1600007

That is an official pkgbase distribution that I installed, not
a personal build. pkgbase for main has world being a debug
build, no matter which of the kernels one choses to boot.
For pkgbase, 939ac0c8fde2 would be correct(?) for the kernel
but might not be exact for the world: /usr/src/sys/ and
/usr/src/ (without sys/) are from different times, last I
knew anyway. Changes can happen between.

During boot, the time on the Orange Pi Plus 2ed is bad so:

# ls -lodT /gpart.core
-rw-------  1 root wheel nodump 3174400 Jan  1 00:01:01 2010 /gpart.core

Also, for pkgbase, a source file distributed can be newer
for its time stamp than the program distributed that was
based on the source file. Such happens below.



Core was generated by `gpart show'.
Program terminated with signal SIGSEGV, Segmentation fault.
Address not mapped to object.
#0  xo_format_string_direct (xop=xop@entry=0x2009b120, xbp=xbp@entry=0x2009b150, 
flags=flags@entry=4096, wcp=0x0, cp=0x6e480000 <error: Cannot access memory at 
address 0x6e480000>, len=-1, max=-1,
need_enc=3, have_enc=2) at /usr/src/contrib/libxo/libxo/libxo.c:2715

warning: Source file is more recent than executable.
2715    if (*cp == '\0')
(gdb) bt
#0  xo_format_string_direct (xop=xop@entry=0x2009b120, xbp=xbp@entry=0x2009b150, 
flags=flags@entry=4096, wcp=0x0, cp=0x6e480000 <error: Cannot access memory at 
address 0x6e480000>, len=-1, max=-1,
need_enc=3, have_enc=2) at /usr/src/contrib/libxo/libxo/libxo.c:2715
#1  0x20150908 in xo_format_string (xop=0x2009b120, xbp=0x2009b150, flags=4096, 
xfp=0xbfbfd280) at /usr/src/contrib/libxo/libxo/libxo.c:2982
#2  xo_do_format_field (xop=<optimized out>, xop@entry=0x2009b120, xbp=0x2009b150, 
fmt=fmt@entry=0x20130635 "%s", flen=flen@entry=2, flags=4096) at 
/usr/src/contrib/libxo/libxo/libxo.c:3503
#3  0x2014c69c in xo_simple_field (xop=0x2009b120, encode_only=0, value=0x0, vlen=0, 
fmt=0x20130635 "%s", flen=2, flags=<optimized out>) at 
/usr/src/contrib/libxo/libxo/libxo.c:3817
#4  xo_format_value (xop=<optimized out>, xop@entry=0x2009b120, name=<optimized out>, 
name@entry=0x204bf931 "state}\n", nlen=<optimized out>, nlen@entry=5, value=0x0, vlen=0, 
fmt=0x20130635 "%s",
flen=2, encoding=0x0, elen=0, flags=<optimized out>) at 
/usr/src/contrib/libxo/libxo/libxo.c:4373
#5  0x20148710 in xo_do_emit_fields (xop=<optimized out>, xop@entry=0x2009b120, 
fields=<optimized out>, fields@entry=0xbfbfd7e8, max_fields=max_fields@entry=17, 
fmt=<optimized out>)
at /usr/src/contrib/libxo/libxo/libxo.c:6372
#6  0x201476a0 in xo_do_emit (xop=xop@entry=0x2009b120, flags=<optimized out>, 
fmt=fmt@entry=0x204bf8e3 "=>{t:start/%*jd}  {t:sectors/%*jd}  {t:name/%*s}  {:scheme}  
({h:size/%ld}){t:state}\n")
at /usr/src/contrib/libxo/libxo/libxo.c:6551
#7  0x20147840 in xo_emit (fmt=0x204bf8e3 "=>{t:start/%*jd}  {t:sectors/%*jd}  
{t:name/%*s}  {:scheme}  ({h:size/%ld}){t:state}\n") at 
/usr/src/contrib/libxo/libxo/libxo.c:6622
#8  0x204d1fd4 in gpart_show_geom (gp=gp@entry=0x20089168, 
element=element@entry=0x204bfe51 "type", show_providers=show_providers@entry=0) 
at /usr/src/lib/geom/part/geom_part.c:654
#9  0x204d1048 in gpart_show (req=0x20089000, fl=<optimized out>) at 
/usr/src/lib/geom/part/geom_part.c:793
#10 0x000230dc in run_command (argc=0, argv=<optimized out>) at 
/usr/src/sbin/geom/core/geom.c:497
#11 0x00022308 in main (argc=1, argv=0xbfbfed90) at 
/usr/src/sbin/geom/core/geom.c:861
(gdb) list
2710    for (;;) {
2711 if (len == 0)
2712    break;
2713
2714 if (cp) {
2715    if (*cp == '\0')
2716 break;
2717    if ((flags & XFF_UNESCAPE) && (*cp == '\\' || *cp == '%')) {
2718 cp += 1;
2719 len -= 1;
(gdb) up
#1  0x20150908 in xo_format_string (xop=0x2009b120, xbp=0x2009b150, flags=4096, 
xfp=0xbfbfd280) at /usr/src/contrib/libxo/libxo/libxo.c:2982
2982    cols = xo_format_string_direct(xop, xbp, flags, wcp, cp, len,
(gdb) list
2977
2978    return rc;
2979 }
2980    }
2981
2982    cols = xo_format_string_direct(xop, xbp, flags, wcp, cp, len,
2983   xfp->xf_width[XF_WIDTH_MAX],
2984   need_enc, xfp->xf_enc);
2985    if (cols < 0)
2986 goto bail;
(gdb) list
3498
3499 xf.xf_enc = (xf.xf_fc == 'm') ? XF_ENC_UTF8
3500    : (xf.xf_lflag || (xf.xf_fc == 'S')) ? XF_ENC_WIDE
3501    : xf.xf_hflag ? XF_ENC_LOCALE : XF_ENC_UTF8;
3502
3503 rc = xo_format_string(xop, xbp, flags, &xf);
3504
3505 if ((flags & XFF_TRIM_WS) && xo_style_is_encoding(xop))
3506    rc = xo_trim_ws(xbp, rc);
3507
(gdb) up
#3  0x2014c69c in xo_simple_field (xop=0x2009b120, encode_only=0, value=0x0, vlen=0, 
fmt=0x20130635 "%s", flen=2, flags=<optimized out>) at 
/usr/src/contrib/libxo/libxo/libxo.c:3817
3817 xo_do_format_field(xop, NULL, fmt, flen, flags);
(gdb) list
3812 {
3813    if (encode_only)
3814 flags |= XFF_NO_OUTPUT;
3815
3816    if (vlen == 0)
3817 xo_do_format_field(xop, NULL, fmt, flen, flags);
3818    else if (!encode_only)
3819 xo_data_append_content(xop, value, vlen, flags);
3820 }
3821
(gdb) up
#4  xo_format_value (xop=<optimized out>, xop@entry=0x2009b120, name=<optimized out>, 
name@entry=0x204bf931 "state}\n", nlen=<optimized out>, nlen@entry=5, value=0x0, vlen=0, 
fmt=0x20130635 "%s",
flen=2, encoding=0x0, elen=0, flags=<optimized out>) at 
/usr/src/contrib/libxo/libxo/libxo.c:4373
4373 xo_simple_field(xop, FALSE, value, vlen, fmt, flen, flags);
(gdb) list
4368
4369 save.xhs_offset = xbp->xb_curp - xbp->xb_bufp;
4370 save.xhs_columns = xop->xo_columns;
4371 save.xhs_anchor_columns = xop->xo_anchor_columns;
4372
4373 xo_simple_field(xop, FALSE, value, vlen, fmt, flen, flags);
4374
4375 if (flags & XFF_HUMANIZE)
4376    xo_format_humanize(xop, xbp, &save, flags);
4377 break;
(gdb) up
#5  0x20148710 in xo_do_emit_fields (xop=<optimized out>, xop@entry=0x2009b120, 
fields=<optimized out>, fields@entry=0xbfbfd7e8, max_fields=max_fields@entry=17, 
fmt=<optimized out>)
at /usr/src/contrib/libxo/libxo/libxo.c:6372
6372    xo_format_value(xop, content, clen, NULL, 0,
(gdb) list
6367 flags &= ~XFF_WS; /* Prevent later handling of this flag */
6368    }
6369 }
6370
6371 if (ftype == 'V')
6372    xo_format_value(xop, content, clen, NULL, 0,
6373    xfip->xfi_format, xfip->xfi_flen,
6374    xfip->xfi_encoding, xfip->xfi_elen, flags);
6375 else if (ftype == '[')
6376    xo_anchor_start(xop, xfip, content, clen);
(gdb) up
#6  0x201476a0 in xo_do_emit (xop=xop@entry=0x2009b120, flags=<optimized out>, 
fmt=fmt@entry=0x204bf8e3 "=>{t:start/%*jd}  {t:sectors/%*jd}  {t:name/%*s}  {:scheme}  
({h:size/%ld}){t:state}\n")
at /usr/src/contrib/libxo/libxo/libxo.c:6551
6551    return xo_do_emit_fields(xop, fields, max_fields, fmt);
(gdb) list
6546    /* Retain the info */
6547    xo_retain_add(fmt, fields, max_fields);
6548 }
6549    }
6550
6551    return xo_do_emit_fields(xop, fields, max_fields, fmt);
6552 }
6553
6554 /*
6555 * Rebuild a format string in a gettext-friendly format.  This function
(gdb) up
#7  0x20147840 in xo_emit (fmt=0x204bf8e3 "=>{t:start/%*jd}  {t:sectors/%*jd}  
{t:name/%*s}  {:scheme}  ({h:size/%ld}){t:state}\n") at 
/usr/src/contrib/libxo/libxo/libxo.c:6622
6622    rc = xo_do_emit(xop, 0, fmt);
(gdb) list
6617 {
6618    xo_handle_t *xop = xo_default(NULL);
6619    ssize_t rc;
6620
6621    va_start(xop->xo_vap, fmt);
6622    rc = xo_do_emit(xop, 0, fmt);
6623    va_end(xop->xo_vap);
6624    bzero(&xop->xo_vap, sizeof(xop->xo_vap));
6625
6626    return rc;
(gdb) up
#8  0x204d1fd4 in gpart_show_geom (gp=gp@entry=0x20089168, 
element=element@entry=0x204bfe51 "type", show_providers=show_providers@entry=0) 
at /usr/src/lib/geom/part/geom_part.c:654
warning: Source file is more recent than executable.
654 xo_emit("=>{t:start/%*jd}  {t:sectors/%*jd}  {t:name/%*s}  {:scheme}  
({h:size/%ld}){t:state}\n",
(gdb) list
649 }
650 wname = wmax;
651 pp = LIST_FIRST(&gp->lg_consumer)->lg_provider;
652 secsz = pp->lg_sectorsize;
653 xo_open_instance("part");
654 xo_emit("=>{t:start/%*jd}  {t:sectors/%*jd}  {t:name/%*s}  {:scheme}  
({h:size/%ld}){t:state}\n",
655 wblocks, (intmax_t)first, wblocks, (intmax_t)(last - first + 1),
656 wname, gp->lg_name,
657 scheme, pp->lg_mediasize,
658 s ? " [CORRUPT]": "");
(gdb) up
#9  0x204d1048 in gpart_show (req=0x20089000, fl=<optimized out>) at 
/usr/src/lib/geom/part/geom_part.c:793
793 gpart_show_geom(gp, element, show_providers);
(gdb) list
788 else
789 errx(EXIT_FAILURE, "No such geom: %s.", name);
790 }
791 } else {
792 LIST_FOREACH(gp, &classp->lg_geom, lg_geom) {
793 gpart_show_geom(gp, element, show_providers);
794 }
795 }
796 xo_close_list(name);
797 geom_deletetree(&mesh);
(gdb) up
#10 0x000230dc in run_command (argc=0, argv=<optimized out>) at 
/usr/src/sbin/geom/core/geom.c:497
warning: Source file is more recent than executable.
497 cmd->gc_func(req, flags);
(gdb) list
492 buf[0] = '\0';
493 if (cmd->gc_func != NULL) {
494 unsigned flags;
495
496 flags = set_flags(cmd);
497 cmd->gc_func(req, flags);
498 errstr = req->error;
499 } else {
500 gctl_add_param(req, "output", sizeof(buf), buf,
501    GCTL_PARAM_WR | GCTL_PARAM_ASCII);
(gdb) up
#11 0x00022308 in main (argc=1, argv=0xbfbfed90) at 
/usr/src/sbin/geom/core/geom.c:861
861 run_command(argc, argv);
(gdb) list
856 show_tree();
857 return (0);
858 }
859
860 get_class(&argc, &argv);
861 run_command(argc, argv);
862 /* NOTREACHED */
863
864 exit(EXIT_FAILURE);
865 }


For reference:

# ls -lodT /usr/src/contrib/libxo/libxo/libxo.c 
/usr/src/lib/geom/part/geom_part.c /usr/src/sbin/geom/core/geom.c /sbin/gpart
-r-xr-xr-x  17 root wheel -  30720 Dec 18 07:22:59 2025 /sbin/gpart
-rw-r--r--   1 root wheel - 211505 Dec 24 08:29:29 2025 
/usr/src/contrib/libxo/libxo/libxo.c
-rw-r--r--   1 root wheel -  35380 Dec 24 08:29:29 2025 
/usr/src/lib/geom/part/geom_part.c
-rw-r--r--   1 root wheel -  36298 Dec 24 08:29:29 2025 
/usr/src/sbin/geom/core/geom.c

That explains the "warning: Source file is more recent than executable"
messages.

Additional context notes:

) On the Cortex-A7 SUT the above is repeatable at the
shell prompt when logged in: just try "gpart show",
including via gdb use. "/rescue/gpart show" also
core dumps.

) In a armv7 chroot on a aarch64 system (the Windows
Dev Kit 2023), the "gpart show" works just fine.

But the vintages could well be a little different.
(Tracing to git commits for pkgbase is problematical.)


I'll note:

Johan Söllvander <js_at_FreeBSD.org>
Date: Thu, 18 Dec 2025 15:23:29 UTC
The branch main has been updated by js:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=4f809ffec69cd6ede3e7be9a5bc876b2e5931028

commit 4f809ffec69cd6ede3e7be9a5bc876b2e5931028
Author: Johan Söllvander <[email protected]>
AuthorDate: 2025-12-18 15:06:09 +0000
Commit: Johan Söllvander <[email protected]>
CommitDate: 2025-12-18 15:22:59 +0000

gpart: add libxo support for "show" subcommand + man page updates

Added libxo support to `gpart show`, also updated the man
pages for geom and gpart to show where you can expect
libxo formatted output.

PR: 290629
MFC after: 1 week
Sponsored by: ConnectWise
Reviewed by: asomers, mckusick, phil
Approved by: asomers (mentor)
Differential Revision: https://reviews.freebsd.org/D53950
---
. . .


Note: Dec 18 07:22:59 2025 /sbin/gpart for my time zone
would be 2025-12-18 15:22:59 +0000 (the CommitDate) UTC.


I shut down the OPi+2e and mounted the boot media
on the Windows Dev Kit 2023 and then did a chroot
into that boot media and tried "gpart show":

"gpart show" worked just fine.

What matters is which kernel it runs on for the
exact same world files on the exact same media.


I got that wrong: a large part of the output occurs before
a segmentation fault on the Windows Dev Kit 2023. But it has a
very different backtrace. Also, note all the "517M" that make no
sense --and the "0" and "2" junk as well:

# gpart show
=>        34  1000215149  nda0  GPT  (2)(null)
          34        2014        - free -  (2)
        2048      532480     1  efi  (517M)
      534528       32768     2  ms-reserved  (517M)
      567296   997287936     3  ms-basic-data  (517M)
   997855232     2359296     4  ms-recovery  (517M)
  1000214528         655        - free -  (2)

=>        34  2930277101  da0  GPT  (0)(null)
          34       32734       - free -  (0)
       32768      501760    1  efi  (517M)
      534528    20971520    2  freebsd-swap  (517M)
    21506048    29360128    3  freebsd-swap  (517M)
    50866176    33554432    4  freebsd-swap  (517M)
    84420608    67108864    5  freebsd-swap  (517M)
   151529472    96468992    6  freebsd-swap  (517M)
   247998464   268435456    7  freebsd-swap  (517M)
   516433920     7340032    8  freebsd-swap  (517M)
   523773952    13096960       - free -  (0)
   536870912  2357198848    9  freebsd-ufs  (517M)
  2894069760    36207375       - free -  (0)

=>        40  1953525088  da1  GPT  (0)(null)
          40      532480    1  efi  (517M)
      532520        2008       - free -  (0)
      534528     3563520    2  freebsd-swap  (517M)
     4098048     6504448       - free -  (0)
    10602496  1740636160    4  freebsd-ufs  (517M)
  1751238656     7546880    3  freebsd-swap  (517M)
  1758785536   194739592       - free -  (0)

Segmentation fault (core dumped)

As for gdb's backtrace:

Program terminated with signal SIGSEGV, Segmentation fault.
Address not mapped to object.
#0  0x200c5ef0 in delete_config (gp=0x2053e224) at 
/usr/src/lib/libgeom/geom_xml2tree.c:502

warning: Source file is more recent than executable.
502 LIST_REMOVE(cf, lg_config);
(gdb) bt
#0  0x200c5ef0 in delete_config (gp=0x2053e224) at 
/usr/src/lib/libgeom/geom_xml2tree.c:502
#1  geom_deletetree (gmp=gmp@entry=0xffffcb48) at 
/usr/src/lib/libgeom/geom_xml2tree.c:524
#2  0x204d2064 in gpart_show (req=<optimized out>, fl=<optimized out>) at 
/usr/src/lib/geom/part/geom_part.c:797
#3  0x000230dc in run_command (argc=0, argv=<optimized out>) at 
/usr/src/sbin/geom/core/geom.c:497
#4  0x00022308 in main (argc=1, argv=0xffffdc70) at 
/usr/src/sbin/geom/core/geom.c:861


(I need to get some sleep.)

Back to the Cortex-A7 context (armv7 without aatch64)
for that same media . . .

The tail of a truss output from a run looks like
(note the "minherit(0x2051e000,1100,INHERIT_ZERO)"?):

. . .
modfind("g_part")                                = 190 (0xbe)
mmap(0x0,20480,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
 = 537432064 (0x20089000)
mmap(0x0,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0) 
= 537452544 (0x2008e000)
mmap(0x0,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0) 
= 537456640 (0x2008f000)
mmap(0x0,12288,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
 = 542076928 (0x204f7000)
mmap(0x0,20480,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
 = 542089216 (0x204fa000)
mmap(0x0,12288,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
 = 542109696 (0x204ff000)
mmap(0x0,28672,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
 = 542121984 (0x20502000)
__sysctl("sysctl.name2oid 
kern.geom.confxml",2,0xbfbfdbb8,0xbfbfdbb0,0x200b4716,17) = 0 (0x0)
__sysctl("kern.geom.confxml",3,0x0,0xbfbfdbb4,0x0,0) = 0 (0x0)
mmap(0x0,24576,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
 = 542150656 (0x20509000)
__sysctl("kern.geom.confxml",3,0x20509180,0xbfbfdbb4,0x0,0) = 0 (0x0)
mmap(0x0,20480,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
 = 542175232 (0x2050f000)
mmap(0x0,20480,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
 = 542195712 (0x20514000)
mmap(0x0,20480,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
 = 542216192 (0x20519000)
mmap(0x0,1100,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 542236672 
(0x2051e000)
minherit(0x2051e000,1100,INHERIT_ZERO)           = 0 (0x0)
getrandom("\M-,\M-;\M^P\^Rl\^VHP\M->'\M-v"...,40,0) = 40 (0x28)
mmap(0x0,20480,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
 = 542240768 (0x2051f000)
mmap(0x0,28672,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
 = 542261248 (0x20524000)
mmap(0x0,12288,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
 = 542289920 (0x2052b000)
mmap(0x0,20480,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
 = 542302208 (0x2052e000)
mmap(0x0,12288,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
 = 542322688 (0x20533000)
mmap(0x0,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0) 
= 542334976 (0x20536000)
mmap(0x0,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0) 
= 542339072 (0x20537000)
mmap(0x0,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0) 
= 542343168 (0x20538000)
SIGNAL 11 (SIGSEGV) code=SEGV_MAPERR trapno=5 addr=0x6e480000
process killed, signal = 11 (core dumped)


Given recent work on anonymous zeroed pages, I note for
minherit:

QUOTE
        INHERIT_ZERO This option causes the address space in question to be
mapped as new anonymous pages, which would be initial-
ized to all zero bytes, in the child process.
END QUOTE

Not that I've any specific evidence of it being an issue.

I'll note that trying the official debug kernel did not report
anything special and got the same behavior.


===
Mark Millard
marklmi at yahoo.com



Reply via email to