xref: /illumos-gate/usr/src/test/util-tests/tests/mdb/sou/tst.anon.ksh (revision 8b184c19c5f61fa8890900f7bab686bf19b543d3)
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