import NVIDIA-FreeBSD-x86-180.29
[nvidia.git] / obj / nvidia-bug-report.sh
1 #!/bin/sh
2
3 # NVIDIA Graphics Driver bug reporting shell script.  This shell
4 # script will generate a log file named "nvidia-bug-report.log", which
5 # should be attached when emailing bug reports to NVIDIA.
6
7
8
9 LOG_FILENAME=nvidia-bug-report.log
10
11
12 PATH="/sbin:/usr/sbin:$PATH"
13
14
15 NVIDIA_BUG_REPORT_CHANGE="$Change: 1833133 $"
16 NVIDIA_BUG_REPORT_VERSION=`echo $NVIDIA_BUG_REPORT_CHANGE | tr -c -d [:digit:]`
17
18 #
19 # append() - append the contents of the specified file to the log
20 #
21
22 append() {
23     echo "____________________________________________" >> $LOG_FILENAME
24     echo ""                                             >> $LOG_FILENAME
25
26     if [ ! -f "$1" ]; then
27         echo "$1 does not exist"                        >> $LOG_FILENAME
28     elif [ ! -r "$1" ]; then
29         echo "$1 is not readable"                       >> $LOG_FILENAME
30     else
31         echo "$1"                                       >> $LOG_FILENAME
32         cat  "$1"                                       >> $LOG_FILENAME
33     fi
34     echo ""                                             >> $LOG_FILENAME
35 }
36
37 #
38 # append_silent() - same as append(), but don't print anything
39 # if the file does not exist
40 #
41
42 append_silent() {
43     if [ -f "$1" -a -r "$1" ]; then
44         echo "____________________________________________" >> $LOG_FILENAME
45         echo ""                                             >> $LOG_FILENAME
46         echo "$1"                                           >> $LOG_FILENAME
47         cat  "$1"                                           >> $LOG_FILENAME
48         echo ""                                             >> $LOG_FILENAME
49     fi
50 }
51
52 #
53 # append_glob() - use the shell to expand a list of files, and invoke
54 # append() for each of them
55 #
56
57 append_glob() {
58     for i in `ls $1 2> /dev/null;`; do
59         append "$i"
60     done
61 }
62
63 #
64 # append_sysctl() - use sysctl to retrieve the value of interesting
65 # kernel or driver state variables.
66 #
67
68 append_sysctl() {
69     echo "____________________________________________" >> $LOG_FILENAME
70     echo ""                                             >> $LOG_FILENAME
71
72     sysctl=`which sysctl 2> /dev/null | head -n 1`
73     if [ $? -eq 0 -a "$sysctl" ]; then
74         value=`$sysctl $1 2> /dev/null`
75         if [ $? -eq 0 -a "$value" ]; then
76             echo "$value"                               >> $LOG_FILENAME
77         else
78             echo "$1 does not exist"                    >> $LOG_FILENAME
79         fi
80     else
81         echo "sysctl not found"                         >> $LOG_FILENAME
82     fi
83 }
84
85
86 #
87 # Start of script
88 #
89
90
91 # check that we are root (needed for `lspci -vxxx` and potentially for
92 # accessing kernel log files)
93
94 if [ `id -u` -ne 0 ]; then
95     echo "ERROR: Please run $(basename $0) as root."
96     exit 1
97 fi
98
99
100 # move any old log file out of the way
101
102 if [ -f $LOG_FILENAME ]; then
103     mv $LOG_FILENAME ${LOG_FILENAME}.old
104 fi
105
106
107 # make sure what we can write to the log file
108
109 touch $LOG_FILENAME 2> /dev/null
110
111 if [ $? -ne 0 ]; then
112     echo
113     echo "ERROR: Working directory is not writable; please cd to a directory"
114     echo "       where you have write permission so that the $LOG_FILENAME"
115     echo "       file can be written."
116     echo
117     exit 1
118 fi
119
120
121 # print a start message to stdout
122
123 echo ""
124 echo -n "Running $(basename $0)...";
125
126
127 # print prologue to the log file
128
129 echo "____________________________________________"                >> $LOG_FILENAME
130 echo ""                                                            >> $LOG_FILENAME
131 echo "Start of NVIDIA bug report log file.  Please send this"      >> $LOG_FILENAME
132 echo "report along with a description of your bug, to"             >> $LOG_FILENAME
133 echo "freebsd-gfx-bugs@nvidia.com."                                >> $LOG_FILENAME  
134 echo ""                                                            >> $LOG_FILENAME
135 echo "nvidia-bug-report.sh Version: $NVIDIA_BUG_REPORT_VERSION"    >> $LOG_FILENAME
136 echo ""                                                            >> $LOG_FILENAME
137 echo "Date: `date`"                                                >> $LOG_FILENAME
138 echo "uname: `uname -a`"                                           >> $LOG_FILENAME
139 echo ""                                                            >> $LOG_FILENAME
140
141
142 # append useful sysctl keys
143
144 append_sysctl "hw.nvidia.version"
145 append_sysctl "hw.nvidia.cards"
146 append_sysctl "hw.nvidia.agp"
147 append_sysctl "hw.nvidia.registry"
148
149 append_sysctl "vm.vmtotal"
150 append_sysctl "kern.version"
151 append_sysctl "kern.smp"
152
153 # append useful files
154
155 append "/etc/motd"
156
157
158 # append the X log; also, extract the config file named in the X log
159 # and append it
160
161 for i in /var/log/XFree86.0.log /var/log/Xorg.0.log ; do
162     append "$i"
163     if [ -f $i -a -r $i ]; then
164         j=`grep "Using config file" $i | cut -f 2 -d \"`
165         append "$j"
166     fi
167 done
168
169 # append vmstat info
170
171 vmstat=`which vmstat 2> /dev/null | head -n 1`
172
173 echo "____________________________________________"                    >> $LOG_FILENAME
174 echo ""                                                                >> $LOG_FILENAME
175
176 if [ $? -eq 0 -a "$vmstat" ]; then
177     echo "$vmstat"                                                     >> $LOG_FILENAME
178     echo ""                                                            >> $LOG_FILENAME
179     ( $vmstat >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
180     echo ""                                                            >> $LOG_FILENAME
181     echo "____________________________________________"                >> $LOG_FILENAME
182     echo ""                                                            >> $LOG_FILENAME
183     echo "$vmstat -a -i"                                               >> $LOG_FILENAME
184     echo ""                                                            >> $LOG_FILENAME
185     ( $vmstat -a -i >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
186     echo ""                                                            >> $LOG_FILENAME
187 else
188     echo "Skipping vmstat output (vmstat not found)"                   >> $LOG_FILENAME
189     echo ""                                                            >> $LOG_FILENAME
190 fi
191
192 # append kldstat info
193
194 kldstat=`which kldstat 2> /dev/null | head -n 1`
195
196 echo "____________________________________________"                    >> $LOG_FILENAME
197 echo ""                                                                >> $LOG_FILENAME
198
199 if [ $? -eq 0 -a "$kldstat" ]; then
200     echo "$kldstat -v"                                                 >> $LOG_FILENAME
201     echo ""                                                            >> $LOG_FILENAME
202     ( $kldstat -v >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
203     echo ""                                                            >> $LOG_FILENAME
204 else
205     echo "Skipping kldstat output (kldstat not found)"                 >> $LOG_FILENAME
206     echo ""                                                            >> $LOG_FILENAME
207 fi
208
209
210 # append ldd info
211
212 glxinfo=`which glxinfo 2> /dev/null | head -n 1`
213
214 echo "____________________________________________"                    >> $LOG_FILENAME
215 echo ""                                                                >> $LOG_FILENAME
216
217 if [ $? -eq 0 -a "$glxinfo" ]; then
218     echo "ldd $glxinfo"                                                >> $LOG_FILENAME
219     echo ""                                                            >> $LOG_FILENAME
220     ( ldd $glxinfo >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
221     echo ""                                                            >> $LOG_FILENAME
222 else
223     echo "Skipping ldd output (glxinfo not found)"                     >> $LOG_FILENAME
224     echo ""                                                            >> $LOG_FILENAME
225 fi
226
227 # pciconf information
228
229 pciconf=`which pciconf 2> /dev/null | head -n 1`
230
231 echo "____________________________________________"                    >> $LOG_FILENAME
232 echo ""                                                                >> $LOG_FILENAME
233
234 if [ $? -eq 0 -a "$pciconf" ]; then
235     echo "$pciconf -l -v"                                              >> $LOG_FILENAME
236     echo ""                                                            >> $LOG_FILENAME
237     ( $pciconf -l -v >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
238     echo ""                                                            >> $LOG_FILENAME
239 else
240     echo "Skipping pciconf output (pciconf not found)"                 >> $LOG_FILENAME
241     echo ""                                                            >> $LOG_FILENAME
242 fi
243
244 # get any relevant kernel messages
245
246 echo "____________________________________________"                    >> $LOG_FILENAME
247 echo ""                                                                >> $LOG_FILENAME
248 echo "Scanning kernel log files for NVRM messages:"                    >> $LOG_FILENAME
249 echo ""                                                                >> $LOG_FILENAME
250
251 for i in /var/log/messages /var/log/kernel.log ; do
252     if [ -f $i ]; then
253         echo "  $i:"                                                   >> $LOG_FILENAME
254         ( cat $i | grep NVRM >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
255     fi
256 done
257
258 # append dmesg output
259
260 echo ""                                                                >> $LOG_FILENAME
261 echo "____________________________________________"                    >> $LOG_FILENAME
262 echo ""                                                                >> $LOG_FILENAME
263 echo "dmesg:"                                                          >> $LOG_FILENAME
264 echo ""                                                                >> $LOG_FILENAME
265 ( dmesg >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
266
267 which gcc >/dev/null 2>&1
268 if [ $? -eq 0 ]; then
269     echo "____________________________________________"                >> $LOG_FILENAME
270     echo ""                                                            >> $LOG_FILENAME
271     ( gcc -v 2>> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
272 fi
273
274 which g++ >/dev/null 2>&1
275 if [ $? -eq 0 ]; then
276     echo "____________________________________________"                >> $LOG_FILENAME
277     echo ""                                                            >> $LOG_FILENAME
278     ( g++ -v 2>> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
279 fi
280
281 echo "____________________________________________"                    >> $LOG_FILENAME
282 echo ""                                                                >> $LOG_FILENAME
283 echo "xset -q:"                                                        >> $LOG_FILENAME
284 echo ""                                                                >> $LOG_FILENAME
285
286 ( xset -q >> $LOG_FILENAME & sleep 1 ; kill -9 $! ) > /dev/null 2>&1
287
288 if [ $? -eq 0 ]; then
289     # The xset process is still there.
290     echo "xset could not connect to an X server"                       >> $LOG_FILENAME
291 fi
292
293 echo "____________________________________________"                    >> $LOG_FILENAME
294 echo ""                                                                >> $LOG_FILENAME
295 echo "nvidia-settings -q all:"                                         >> $LOG_FILENAME
296 echo ""                                                                >> $LOG_FILENAME
297
298 ( nvidia-settings -q all >> $LOG_FILENAME & sleep 1 ; kill -9 $! ) > /dev/null 2>&1
299
300 if [ $? -eq 0 ]; then
301     # The nvidia-settings process is still there.
302     echo "nvidia-settings could not connect to an X server"            >> $LOG_FILENAME
303 fi
304 echo "____________________________________________"                    >> $LOG_FILENAME
305
306 # print epilogue to log file
307
308 echo ""                                                                >> $LOG_FILENAME
309 echo "End of NVIDIA bug report log file."                              >> $LOG_FILENAME
310
311
312 # Done
313
314 echo " complete."
315 echo ""
316 echo "The file $LOG_FILENAME has been created; please send this"
317 echo "report, along with a description of your bug, to"
318 echo "freebsd-gfx-bugs@nvidia.com."
319 echo ""