1*8b184c19SRobert Mustacchi#!/usr/bin/ksh 2*8b184c19SRobert Mustacchi# 3*8b184c19SRobert Mustacchi# This file and its contents are supplied under the terms of the 4*8b184c19SRobert Mustacchi# Common Development and Distribution License ("CDDL"), version 1.0. 5*8b184c19SRobert Mustacchi# You may only use this file in accordance with the terms of version 6*8b184c19SRobert Mustacchi# 1.0 of the CDDL. 7*8b184c19SRobert Mustacchi# 8*8b184c19SRobert Mustacchi# A full copy of the text of the CDDL should have accompanied this 9*8b184c19SRobert Mustacchi# source. A copy of the CDDL is also available via the Internet at 10*8b184c19SRobert Mustacchi# http://www.illumos.org/license/CDDL. 11*8b184c19SRobert Mustacchi# 12*8b184c19SRobert Mustacchi 13*8b184c19SRobert Mustacchi# 14*8b184c19SRobert Mustacchi# Copyright 2025 Oxide Computer Company 15*8b184c19SRobert Mustacchi# 16*8b184c19SRobert Mustacchi 17*8b184c19SRobert Mustacchi# 18*8b184c19SRobert Mustacchi# Test our ability to recurse through and print information about anonymous 19*8b184c19SRobert Mustacchi# structs and unions. Effectively, this is about the resolution capabilities of 20*8b184c19SRobert Mustacchi# various dcmds. This is paired with the "anon" program. Note, we have to be 21*8b184c19SRobert Mustacchi# very careful to avoid printing addresses into the output data we're comparing 22*8b184c19SRobert Mustacchi# against. Make sure to use ::printf for strings rather than ::print or './s' 23*8b184c19SRobert Mustacchi# 24*8b184c19SRobert Mustacchi 25*8b184c19SRobert Mustacchiset -o pipefail 26*8b184c19SRobert Mustacchi 27*8b184c19SRobert Mustacchitst_root="$(dirname $0)/.." 28*8b184c19SRobert Mustacchitst_prog="$tst_root/progs/anon" 29*8b184c19SRobert Mustacchi 30*8b184c19SRobert Mustacchicat </dev/null > $ODIR/stdout 31*8b184c19SRobert Mustacchi 32*8b184c19SRobert Mustacchi# 33*8b184c19SRobert Mustacchi# Begin with basic offsetof logic on types. This ensures that embedded anonymous 34*8b184c19SRobert Mustacchi# entities are at the correct offset. 35*8b184c19SRobert Mustacchi# 36*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct foo foo" $tst_prog >> $ODIR/stdout 37*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct bar bar" $tst_prog >> $ODIR/stdout 38*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct bar bar_foo" $tst_prog >> $ODIR/stdout 39*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct bar bar_int" $tst_prog >> $ODIR/stdout 40*8b184c19SRobert Mustacchi 41*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct baz baz_str" $tst_prog >> $ODIR/stdout 42*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct baz baz_anon" $tst_prog >> $ODIR/stdout 43*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct baz baz_int" $tst_prog >> $ODIR/stdout 44*8b184c19SRobert Mustacchi 45*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct foobar foobar_int" $tst_prog >> $ODIR/stdout 46*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct foobar foo" $tst_prog >> $ODIR/stdout 47*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct foobar bar" $tst_prog >> $ODIR/stdout 48*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct foobar baz" $tst_prog >> $ODIR/stdout 49*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct foobar foobar_anon" $tst_prog >> $ODIR/stdout 50*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct foobar a" $tst_prog >> $ODIR/stdout 51*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct foobar b" $tst_prog >> $ODIR/stdout 52*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct foobar c" $tst_prog >> $ODIR/stdout 53*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct foobar d" $tst_prog >> $ODIR/stdout 54*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct foobar e" $tst_prog >> $ODIR/stdout 55*8b184c19SRobert Mustacchi$MDB -e "::offsetof struct foobar f" $tst_prog >> $ODIR/stdout 56*8b184c19SRobert Mustacchi 57*8b184c19SRobert Mustacchi# 58*8b184c19SRobert Mustacchi# Print ::sizeof to make sure that this aligns with offsetof data. 59*8b184c19SRobert Mustacchi# 60*8b184c19SRobert Mustacchi$MDB -e "::sizeof struct foo" $tst_prog >> $ODIR/stdout 61*8b184c19SRobert Mustacchi$MDB -e "::sizeof struct bar" $tst_prog >> $ODIR/stdout 62*8b184c19SRobert Mustacchi$MDB -e "::sizeof struct baz" $tst_prog >> $ODIR/stdout 63*8b184c19SRobert Mustacchi$MDB -e "::sizeof struct foobar" $tst_prog >> $ODIR/stdout 64*8b184c19SRobert Mustacchi 65*8b184c19SRobert Mustacchi# 66*8b184c19SRobert Mustacchi# Print the overall structure to make sure we get the <anon> entries we expect. 67*8b184c19SRobert Mustacchi# 68*8b184c19SRobert Mustacchi$MDB -e "foo::print" $tst_prog >> $ODIR/stdout 69*8b184c19SRobert Mustacchi$MDB -e "foo::print foo" $tst_prog >> $ODIR/stdout 70*8b184c19SRobert Mustacchi$MDB -e "bar::printf \"%s\\n\" struct bar bar" $tst_prog >> $ODIR/stdout 71*8b184c19SRobert Mustacchi$MDB -e "bar::print bar_foo" $tst_prog >> $ODIR/stdout 72*8b184c19SRobert Mustacchi$MDB -e "bar::print bar_foo.foo" $tst_prog >> $ODIR/stdout 73*8b184c19SRobert Mustacchi$MDB -e "bar::print bar_foo.foo bar_int" $tst_prog >> $ODIR/stdout 74*8b184c19SRobert Mustacchi$MDB -e "baz::printf \"%s\\n\" struct baz baz_str" $tst_prog >> $ODIR/stdout 75*8b184c19SRobert Mustacchi$MDB -e "baz::printf \"0x%x 0x%x\\n\" struct baz baz_anon baz_int" \ 76*8b184c19SRobert Mustacchi $tst_prog >> $ODIR/stdout 77*8b184c19SRobert Mustacchi$MDB -e "foobar::printf \"0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\\n\" struct foobar \ 78*8b184c19SRobert Mustacchi a b c d e f" $tst_prog >> $ODIR/stdout 79*8b184c19SRobert Mustacchi$MDB -e "foobar::printf \"%s %s\\n\" struct foobar bar.bar baz.baz_str " \ 80*8b184c19SRobert Mustacchi $tst_prog >> $ODIR/stdout 81*8b184c19SRobert Mustacchi$MDB -e "foobar::print struct foobar foobar_int" $tst_prog >> $ODIR/stdout 82*8b184c19SRobert Mustacchi$MDB -e "foobar::printf \"0x%x 0x%x 0x%x 0x%x\\n\" struct foobar bar.bar_foo.foo \ 83*8b184c19SRobert Mustacchi bar.bar_int baz.baz_anon foobar_anon" $tst_prog >> $ODIR/stdout 84*8b184c19SRobert Mustacchi 85*8b184c19SRobert Mustacchi# 86*8b184c19SRobert Mustacchi# The stringless structure has no strings, so we can print it without worrying 87*8b184c19SRobert Mustacchi# about addresses and make sure we get the appropriate anon names. 88*8b184c19SRobert Mustacchi# 89*8b184c19SRobert Mustacchi$MDB -e "stringless::print" $tst_prog >> $ODIR/stdout 90*8b184c19SRobert Mustacchi$MDB -e "stringless::print -t" $tst_prog >> $ODIR/stdout 91*8b184c19SRobert Mustacchi 92*8b184c19SRobert Mustacchi# 93*8b184c19SRobert Mustacchi# Use the direct offset specification syntax to print a few things as 94*8b184c19SRobert Mustacchi# well. This only works with ::print. 95*8b184c19SRobert Mustacchi# 96*8b184c19SRobert Mustacchi$MDB -e "bar::print \$[8]" $tst_prog >> $ODIR/stdout 97*8b184c19SRobert Mustacchi$MDB -e "foobar::print \$[20] \$[2c]" $tst_prog >> $ODIR/stdout 98