1*7687d0d8SRobert Mustacchi#!/usr/bin/ksh 2*7687d0d8SRobert Mustacchi# 3*7687d0d8SRobert Mustacchi# 4*7687d0d8SRobert Mustacchi# This file and its contents are supplied under the terms of the 5*7687d0d8SRobert Mustacchi# Common Development and Distribution License ("CDDL"), version 1.0. 6*7687d0d8SRobert Mustacchi# You may only use this file in accordance with the terms of version 7*7687d0d8SRobert Mustacchi# 1.0 of the CDDL. 8*7687d0d8SRobert Mustacchi# 9*7687d0d8SRobert Mustacchi# A full copy of the text of the CDDL should have accompanied this 10*7687d0d8SRobert Mustacchi# source. A copy of the CDDL is also available via the Internet at 11*7687d0d8SRobert Mustacchi# http://www.illumos.org/license/CDDL. 12*7687d0d8SRobert Mustacchi# 13*7687d0d8SRobert Mustacchi 14*7687d0d8SRobert Mustacchi# 15*7687d0d8SRobert Mustacchi# Copyright 2021 Oxide Computer Company 16*7687d0d8SRobert Mustacchi# 17*7687d0d8SRobert Mustacchi 18*7687d0d8SRobert Mustacchiunalias -a 19*7687d0d8SRobert Mustacchiset -o pipefail 20*7687d0d8SRobert Mustacchi 21*7687d0d8SRobert Mustacchipcieadm_arg0="$(basename $0)" 22*7687d0d8SRobert Mustacchipcieadm_prog="/usr/lib/pci/pcieadm" 23*7687d0d8SRobert Mustacchipcieadm_data="$(dirname $0)/pci" 24*7687d0d8SRobert Mustacchipcieadm_exit=0 25*7687d0d8SRobert Mustacchipcieadm_tmpfile="/tmp/pcieadmtest.$$" 26*7687d0d8SRobert Mustacchi 27*7687d0d8SRobert Mustacchiwarn() 28*7687d0d8SRobert Mustacchi{ 29*7687d0d8SRobert Mustacchi typeset msg="$*" 30*7687d0d8SRobert Mustacchi [[ -z "$msg" ]] && msg="failed" 31*7687d0d8SRobert Mustacchi echo "TEST FAILED: $pcieadm_arg0: $msg" >&2 32*7687d0d8SRobert Mustacchi pcieadm_exit=1 33*7687d0d8SRobert Mustacchi} 34*7687d0d8SRobert Mustacchi 35*7687d0d8SRobert Mustacchipcieadm_bad_args() 36*7687d0d8SRobert Mustacchi{ 37*7687d0d8SRobert Mustacchi if $pcieadm_prog $@ 2>/dev/null 1>/dev/null; then 38*7687d0d8SRobert Mustacchi warn "should have failed with args "$@", but passed" 39*7687d0d8SRobert Mustacchi return 40*7687d0d8SRobert Mustacchi fi 41*7687d0d8SRobert Mustacchi 42*7687d0d8SRobert Mustacchi printf "TEST PASSED: invalid arguments %s\n" "$*" 43*7687d0d8SRobert Mustacchi} 44*7687d0d8SRobert Mustacchi 45*7687d0d8SRobert Mustacchipcieadm_validate_output() 46*7687d0d8SRobert Mustacchi{ 47*7687d0d8SRobert Mustacchi typeset input="$pcieadm_data/$1" 48*7687d0d8SRobert Mustacchi shift 49*7687d0d8SRobert Mustacchi typeset outfile="$pcieadm_data/$1" 50*7687d0d8SRobert Mustacchi shift 51*7687d0d8SRobert Mustacchi typeset expexit=$1 52*7687d0d8SRobert Mustacchi shift 53*7687d0d8SRobert Mustacchi 54*7687d0d8SRobert Mustacchi $pcieadm_prog $@ <$input >"$pcieadm_tmpfile" 2>&1 55*7687d0d8SRobert Mustacchi if (( $? != expexit)); then 56*7687d0d8SRobert Mustacchi warn "$@: mismatched exit status, found $?, expected $expexit" 57*7687d0d8SRobert Mustacchi fi 58*7687d0d8SRobert Mustacchi 59*7687d0d8SRobert Mustacchi if ! diff $outfile $pcieadm_tmpfile; then 60*7687d0d8SRobert Mustacchi warn "$@: output mismatched" 61*7687d0d8SRobert Mustacchi else 62*7687d0d8SRobert Mustacchi printf "TEST PASSED: %s\n" "$*" 63*7687d0d8SRobert Mustacchi fi 64*7687d0d8SRobert Mustacchi} 65*7687d0d8SRobert Mustacchi 66*7687d0d8SRobert Mustacchi 67*7687d0d8SRobert Mustacchiif [[ -n $PCIEADM ]]; then 68*7687d0d8SRobert Mustacchi pcieadm_prog=$PCIEADM 69*7687d0d8SRobert Mustacchifi 70*7687d0d8SRobert Mustacchi 71*7687d0d8SRobert Mustacchi# 72*7687d0d8SRobert Mustacchi# Before we begin execution, set up the environment such that we have a 73*7687d0d8SRobert Mustacchi# standard locale and that umem will help us catch mistakes. 74*7687d0d8SRobert Mustacchi# 75*7687d0d8SRobert Mustacchiexport LC_ALL=C.UTF-8 76*7687d0d8SRobert Mustacchiexport LD_PRELOAD=libumem.so 77*7687d0d8SRobert Mustacchiexport UMEM_DEBUG=default 78*7687d0d8SRobert Mustacchi 79*7687d0d8SRobert Mustacchiif [[ ! -d $pcieadm_data ]]; then 80*7687d0d8SRobert Mustacchi printf "failed to find data directory %s\n" "$pcieadm_data" >&2 81*7687d0d8SRobert Mustacchi exit 1 82*7687d0d8SRobert Mustacchifi 83*7687d0d8SRobert Mustacchi 84*7687d0d8SRobert Mustacchi# 85*7687d0d8SRobert Mustacchi# First work through bad options. 86*7687d0d8SRobert Mustacchi# 87*7687d0d8SRobert Mustacchipcieadm_bad_args 88*7687d0d8SRobert Mustacchipcieadm_bad_args -d 89*7687d0d8SRobert Mustacchipcieadm_bad_args foobar 90*7687d0d8SRobert Mustacchipcieadm_bad_args save-cfgspace 91*7687d0d8SRobert Mustacchipcieadm_bad_args save-cfgspace -a 92*7687d0d8SRobert Mustacchipcieadm_bad_args save-cfgspace -d 93*7687d0d8SRobert Mustacchipcieadm_bad_args save-cfgspace -d final 94*7687d0d8SRobert Mustacchipcieadm_bad_args save-cfgspace -a -d fantasy 95*7687d0d8SRobert Mustacchipcieadm_bad_args show-devs -h 96*7687d0d8SRobert Mustacchipcieadm_bad_args show-devs -p 97*7687d0d8SRobert Mustacchipcieadm_bad_args show-devs -s -o 98*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace 99*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -d -H 100*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -d 101*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -f 102*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -h 103*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -L 104*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -L -n -f "$pcieadm_data/igb.pci" 105*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -L -p -f "$pcieadm_data/igb.pci" 106*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -p -f "$pcieadm_data/igb.pci" 107*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -o foo -f "$pcieadm_data/igb.pci" 108*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -L -o foo -f "$pcieadm_data/igb.pci" 109*7687d0d8SRobert Mustacchi 110*7687d0d8SRobert Mustacchi# 111*7687d0d8SRobert Mustacchi# Test different output cases 112*7687d0d8SRobert Mustacchi# 113*7687d0d8SRobert Mustacchipcieadm_validate_output igb.pci header0-basic.out 0 \ 114*7687d0d8SRobert Mustacchi show-cfgspace -f /dev/stdin header0.vendor header0.device 115*7687d0d8SRobert Mustacchipcieadm_validate_output igb.pci header0-basic-L.out 0 \ 116*7687d0d8SRobert Mustacchi show-cfgspace -L -f /dev/stdin header0.vendor header0.device 117*7687d0d8SRobert Mustacchipcieadm_validate_output igb.pci header0-basic-n.out 0 \ 118*7687d0d8SRobert Mustacchi show-cfgspace -n -f /dev/stdin header0.vendor header0.device 119*7687d0d8SRobert Mustacchipcieadm_validate_output igb.pci header0-basic-LH.out 0 \ 120*7687d0d8SRobert Mustacchi show-cfgspace -L -H -f /dev/stdin header0.vendor header0.device 121*7687d0d8SRobert Mustacchi 122*7687d0d8SRobert Mustacchi# 123*7687d0d8SRobert Mustacchi# Specific filter behavior. We want to validate the following: 124*7687d0d8SRobert Mustacchi# 125*7687d0d8SRobert Mustacchi# o An inexact filter (e.g. a cap or subcap) matches in human mode, 126*7687d0d8SRobert Mustacchi# but not parsable. 127*7687d0d8SRobert Mustacchi# o An exact filter will show its contents in human mode, but not 128*7687d0d8SRobert Mustacchi# parsable. 129*7687d0d8SRobert Mustacchi# o A missing filter causes to exit non-zero, but still show what we 130*7687d0d8SRobert Mustacchi# found with other filters or because of a prefix match. 131*7687d0d8SRobert Mustacchi# 132*7687d0d8SRobert Mustacchipcieadm_validate_output igb.pci igb-ltr.out 0 \ 133*7687d0d8SRobert Mustacchi show-cfgspace -f /dev/stdin ltr 134*7687d0d8SRobert Mustacchipcieadm_validate_output igb.pci igb-ltr-p.out 1 \ 135*7687d0d8SRobert Mustacchi show-cfgspace -p -o short,value -f /dev/stdin ltr 136*7687d0d8SRobert Mustacchipcieadm_validate_output igb.pci header0-parse.out 0 \ 137*7687d0d8SRobert Mustacchi show-cfgspace -p -o short,value -f /dev/stdin header0.vendor header0.device 138*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-ht.out 0 \ 139*7687d0d8SRobert Mustacchi show-cfgspace -f /dev/stdin ht 140*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-ht.out 0 \ 141*7687d0d8SRobert Mustacchi show-cfgspace -f /dev/stdin ht.msi 142*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-ht.out 0 \ 143*7687d0d8SRobert Mustacchi show-cfgspace -f /dev/stdin ht.msi.command 144*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-ht-p.out 1 \ 145*7687d0d8SRobert Mustacchi show-cfgspace -p -o value,short -f /dev/stdin ht 146*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-ht.msi-p.out 1 \ 147*7687d0d8SRobert Mustacchi show-cfgspace -p -o value,short -f /dev/stdin ht.msi 148*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-ht.msi.command-p.out 0 \ 149*7687d0d8SRobert Mustacchi show-cfgspace -p -o value,short -f /dev/stdin ht.msi.command 150*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-efilt.out 1 \ 151*7687d0d8SRobert Mustacchi show-cfgspace -f /dev/stdin pcie.linksts atelier 152*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-efilt-p.out 1 \ 153*7687d0d8SRobert Mustacchi show-cfgspace -p -o short,value -f /dev/stdin pcie.linksts atelier 154*7687d0d8SRobert Mustacchi 155*7687d0d8SRobert Mustacchiif (( pcieadm_exit == 0 )); then 156*7687d0d8SRobert Mustacchi printf "All tests passed successfully!\n" 157*7687d0d8SRobert Mustacchifi 158*7687d0d8SRobert Mustacchi 159*7687d0d8SRobert Mustacchirm -f "$pcieadm_tmpfile" 160*7687d0d8SRobert Mustacchiexit $pcieadm_exit 161