boot0/boot0sio have disk serial number compiled-in by default. It is named "version 2" boot block by boot0cfg(8) and this format places 4 byte Disk Serial Number where "version 1" boot block contains options.
Support for disk serial number in boot0/boot0sio is optional, and could be turned off to save some bytes, needed for other options.
boot0cfg(8) properly supports old placement of boot block options, properly detect boot block without disk serial number support and properly prepare options for it.
Problem is, boot0cfg(8) uses "gpart bootcode" command to wriet boot block with new options back to disk.
And gmart_mbr always try to save disk serial number, which kills options if boot block is "version 1":
g_part_mbr_bootcode(struct g_part_table *basetable, struct g_part_parms *gpp)
struct g_part_mbr_table *table;
if (gpp->gpp_codesize != MBRSIZE)
table = (struct g_part_mbr_table *)basetable;
dsn = *(uint32_t *)(table->mbr + DOSDSNOFF);
bcopy(gpp->gpp_codeptr, table->mbr, DOSPARTOFF);
if (dsn != 0)
*(uint32_t *)(table->mbr + DOSDSNOFF) = dsn;
Sometimes, it leads to complete bogus options written which kill boot0/boot0sio (it have invalid slice mask, for example, and is unable to boot at all) and sometimes it simply didn't give user ability to change boot0/boot0sio options.