Linux 3.15-rc2
[linux-2.6-block.git] / tools / testing / ktest / ktest.pl
CommitLineData
2545eb61 1#!/usr/bin/perl -w
d6ce2a0b 2#
cce1dac8 3# Copyright 2010 - Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
d6ce2a0b
SR
4# Licensed under the terms of the GNU GPL License version 2
5#
2545eb61
SR
6
7use strict;
8use IPC::Open2;
9use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
7faafbd6
SR
10use File::Path qw(mkpath);
11use File::Copy qw(cp);
2545eb61
SR
12use FileHandle;
13
e48c5293
SR
14my $VERSION = "0.2";
15
2545eb61
SR
16$| = 1;
17
18my %opt;
a57419b3
SR
19my %repeat_tests;
20my %repeats;
c75d22d9 21my %evals;
2545eb61
SR
22
23#default opts
4f43e0dc
SR
24my %default = (
25 "NUM_TESTS" => 1,
26 "TEST_TYPE" => "build",
27 "BUILD_TYPE" => "randconfig",
28 "MAKE_CMD" => "make",
5a5d8e48 29 "CLOSE_CONSOLE_SIGNAL" => "INT",
4f43e0dc
SR
30 "TIMEOUT" => 120,
31 "TMP_DIR" => "/tmp/ktest/\${MACHINE}",
32 "SLEEP_TIME" => 60, # sleep time between tests
33 "BUILD_NOCLEAN" => 0,
34 "REBOOT_ON_ERROR" => 0,
35 "POWEROFF_ON_ERROR" => 0,
36 "REBOOT_ON_SUCCESS" => 1,
37 "POWEROFF_ON_SUCCESS" => 0,
38 "BUILD_OPTIONS" => "",
39 "BISECT_SLEEP_TIME" => 60, # sleep time between bisects
40 "PATCHCHECK_SLEEP_TIME" => 60, # sleep time between patch checks
41 "CLEAR_LOG" => 0,
42 "BISECT_MANUAL" => 0,
43 "BISECT_SKIP" => 1,
961d9cac 44 "BISECT_TRIES" => 1,
ccc513b6 45 "MIN_CONFIG_TYPE" => "boot",
4f43e0dc
SR
46 "SUCCESS_LINE" => "login:",
47 "DETECT_TRIPLE_FAULT" => 1,
48 "NO_INSTALL" => 0,
49 "BOOTED_TIMEOUT" => 1,
50 "DIE_ON_FAILURE" => 1,
51 "SSH_EXEC" => "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND",
52 "SCP_TO_TARGET" => "scp \$SRC_FILE \$SSH_USER\@\$MACHINE:\$DST_FILE",
02ad2617 53 "SCP_TO_TARGET_INSTALL" => "\${SCP_TO_TARGET}",
4f43e0dc
SR
54 "REBOOT" => "ssh \$SSH_USER\@\$MACHINE reboot",
55 "STOP_AFTER_SUCCESS" => 10,
56 "STOP_AFTER_FAILURE" => 60,
57 "STOP_TEST_AFTER" => 600,
407b95b7 58 "MAX_MONITOR_WAIT" => 1800,
a15ba913 59 "GRUB_REBOOT" => "grub2-reboot",
7786954c
SR
60 "SYSLINUX" => "extlinux",
61 "SYSLINUX_PATH" => "/boot/extlinux",
600bbf0a
SR
62
63# required, and we will ask users if they don't have them but we keep the default
64# value something that is common.
4f43e0dc
SR
65 "REBOOT_TYPE" => "grub",
66 "LOCALVERSION" => "-test",
67 "SSH_USER" => "root",
68 "BUILD_TARGET" => "arch/x86/boot/bzImage",
69 "TARGET_IMAGE" => "/boot/vmlinuz-test",
9cc9e091
SR
70
71 "LOG_FILE" => undef,
72 "IGNORE_UNUSED" => 0,
4f43e0dc 73);
2545eb61 74
8d1491ba 75my $ktest_config;
2545eb61 76my $version;
683a3e64 77my $have_version = 0;
a75fecec 78my $machine;
df5f7c66 79my $last_machine;
e48c5293 80my $ssh_user;
a75fecec
SR
81my $tmpdir;
82my $builddir;
83my $outputdir;
51ad1dd1 84my $output_config;
a75fecec 85my $test_type;
7faafbd6 86my $build_type;
a75fecec 87my $build_options;
921ed4c7
SR
88my $final_post_ktest;
89my $pre_ktest;
90my $post_ktest;
91my $pre_test;
92my $post_test;
0bd6c1a3
SR
93my $pre_build;
94my $post_build;
95my $pre_build_die;
96my $post_build_die;
a75fecec
SR
97my $reboot_type;
98my $reboot_script;
99my $power_cycle;
e48c5293 100my $reboot;
a75fecec 101my $reboot_on_error;
bc7c5803
SR
102my $switch_to_good;
103my $switch_to_test;
a75fecec 104my $poweroff_on_error;
648a182c 105my $reboot_on_success;
a75fecec 106my $die_on_failure;
576f627c
SR
107my $powercycle_after_reboot;
108my $poweroff_after_halt;
407b95b7 109my $max_monitor_wait;
e48c5293
SR
110my $ssh_exec;
111my $scp_to_target;
02ad2617 112my $scp_to_target_install;
a75fecec
SR
113my $power_off;
114my $grub_menu;
752d9665 115my $last_grub_menu;
a15ba913 116my $grub_file;
2545eb61 117my $grub_number;
a15ba913 118my $grub_reboot;
7786954c
SR
119my $syslinux;
120my $syslinux_path;
121my $syslinux_label;
2545eb61
SR
122my $target;
123my $make;
e5c2ec11 124my $pre_install;
8b37ca8c 125my $post_install;
e0a8742e 126my $no_install;
5c42fc5b 127my $noclean;
5f9b6ced 128my $minconfig;
4c4ab120 129my $start_minconfig;
35ce5952 130my $start_minconfig_defined;
4c4ab120 131my $output_minconfig;
ccc513b6 132my $minconfig_type;
43de3316 133my $use_output_minconfig;
4283b169 134my $warnings_file;
4c4ab120 135my $ignore_config;
be405f95 136my $ignore_errors;
2b7d9b21 137my $addconfig;
5f9b6ced 138my $in_bisect = 0;
b5f4aea6 139my $bisect_bad_commit = "";
d6ce2a0b 140my $reverse_bisect;
c960bb9f 141my $bisect_manual;
c23dca7c 142my $bisect_skip;
961d9cac 143my $bisect_tries;
30f75da5 144my $config_bisect_good;
c5dacb88
SR
145my $bisect_ret_good;
146my $bisect_ret_bad;
147my $bisect_ret_skip;
148my $bisect_ret_abort;
149my $bisect_ret_default;
6c5ee0be 150my $in_patchcheck = 0;
5a391fbf 151my $run_test;
6c5ee0be 152my $redirect;
7faafbd6 153my $buildlog;
a9dd5d63 154my $testlog;
7faafbd6
SR
155my $dmesg;
156my $monitor_fp;
157my $monitor_pid;
158my $monitor_cnt = 0;
a75fecec
SR
159my $sleep_time;
160my $bisect_sleep_time;
27d934b2 161my $patchcheck_sleep_time;
1990207d 162my $ignore_warnings;
a75fecec 163my $store_failures;
de5b6e3b 164my $store_successes;
9064af52 165my $test_name;
a75fecec
SR
166my $timeout;
167my $booted_timeout;
f1a5b962 168my $detect_triplefault;
a75fecec 169my $console;
5a5d8e48 170my $close_console_signal;
2b803365 171my $reboot_success_line;
a75fecec 172my $success_line;
1c8a617a
SR
173my $stop_after_success;
174my $stop_after_failure;
2d01b26a 175my $stop_test_after;
a75fecec
SR
176my $build_target;
177my $target_image;
b5f4aea6 178my $checkout;
a75fecec 179my $localversion;
576f627c 180my $iteration = 0;
e48c5293 181my $successes = 0;
2545eb61 182
b5f4aea6
SR
183my $bisect_good;
184my $bisect_bad;
185my $bisect_type;
186my $bisect_start;
187my $bisect_replay;
188my $bisect_files;
189my $bisect_reverse;
190my $bisect_check;
191
192my $config_bisect;
193my $config_bisect_type;
b0918612 194my $config_bisect_check;
b5f4aea6
SR
195
196my $patchcheck_type;
197my $patchcheck_start;
198my $patchcheck_end;
199
165708b2 200# set when a test is something other that just building or install
bb8474b1
SR
201# which would require more options.
202my $buildonly = 1;
203
4283b169
SRRH
204# tell build not to worry about warnings, even when WARNINGS_FILE is set
205my $warnings_ok = 0;
206
dbd3783b
SR
207# set when creating a new config
208my $newconfig = 0;
209
8d1491ba
SR
210my %entered_configs;
211my %config_help;
77d942ce 212my %variable;
cf79fab6
SR
213
214# force_config is the list of configs that we force enabled (or disabled)
215# in a .config file. The MIN_CONFIG and ADD_CONFIG configs.
fcb3f16a 216my %force_config;
8d1491ba 217
4ab1cce5
SR
218# do not force reboots on config problems
219my $no_reboot = 1;
220
759a3cc6
SR
221# reboot on success
222my $reboot_success = 0;
223
9cc9e091
SR
224my %option_map = (
225 "MACHINE" => \$machine,
226 "SSH_USER" => \$ssh_user,
227 "TMP_DIR" => \$tmpdir,
228 "OUTPUT_DIR" => \$outputdir,
229 "BUILD_DIR" => \$builddir,
230 "TEST_TYPE" => \$test_type,
921ed4c7
SR
231 "PRE_KTEST" => \$pre_ktest,
232 "POST_KTEST" => \$post_ktest,
233 "PRE_TEST" => \$pre_test,
234 "POST_TEST" => \$post_test,
9cc9e091
SR
235 "BUILD_TYPE" => \$build_type,
236 "BUILD_OPTIONS" => \$build_options,
237 "PRE_BUILD" => \$pre_build,
238 "POST_BUILD" => \$post_build,
239 "PRE_BUILD_DIE" => \$pre_build_die,
240 "POST_BUILD_DIE" => \$post_build_die,
241 "POWER_CYCLE" => \$power_cycle,
242 "REBOOT" => \$reboot,
243 "BUILD_NOCLEAN" => \$noclean,
244 "MIN_CONFIG" => \$minconfig,
245 "OUTPUT_MIN_CONFIG" => \$output_minconfig,
246 "START_MIN_CONFIG" => \$start_minconfig,
ccc513b6 247 "MIN_CONFIG_TYPE" => \$minconfig_type,
43de3316 248 "USE_OUTPUT_MIN_CONFIG" => \$use_output_minconfig,
4283b169 249 "WARNINGS_FILE" => \$warnings_file,
9cc9e091
SR
250 "IGNORE_CONFIG" => \$ignore_config,
251 "TEST" => \$run_test,
252 "ADD_CONFIG" => \$addconfig,
253 "REBOOT_TYPE" => \$reboot_type,
254 "GRUB_MENU" => \$grub_menu,
a15ba913
SR
255 "GRUB_FILE" => \$grub_file,
256 "GRUB_REBOOT" => \$grub_reboot,
7786954c
SR
257 "SYSLINUX" => \$syslinux,
258 "SYSLINUX_PATH" => \$syslinux_path,
259 "SYSLINUX_LABEL" => \$syslinux_label,
e5c2ec11 260 "PRE_INSTALL" => \$pre_install,
9cc9e091
SR
261 "POST_INSTALL" => \$post_install,
262 "NO_INSTALL" => \$no_install,
263 "REBOOT_SCRIPT" => \$reboot_script,
264 "REBOOT_ON_ERROR" => \$reboot_on_error,
265 "SWITCH_TO_GOOD" => \$switch_to_good,
266 "SWITCH_TO_TEST" => \$switch_to_test,
267 "POWEROFF_ON_ERROR" => \$poweroff_on_error,
648a182c 268 "REBOOT_ON_SUCCESS" => \$reboot_on_success,
9cc9e091
SR
269 "DIE_ON_FAILURE" => \$die_on_failure,
270 "POWER_OFF" => \$power_off,
271 "POWERCYCLE_AFTER_REBOOT" => \$powercycle_after_reboot,
272 "POWEROFF_AFTER_HALT" => \$poweroff_after_halt,
407b95b7 273 "MAX_MONITOR_WAIT" => \$max_monitor_wait,
9cc9e091
SR
274 "SLEEP_TIME" => \$sleep_time,
275 "BISECT_SLEEP_TIME" => \$bisect_sleep_time,
276 "PATCHCHECK_SLEEP_TIME" => \$patchcheck_sleep_time,
277 "IGNORE_WARNINGS" => \$ignore_warnings,
be405f95 278 "IGNORE_ERRORS" => \$ignore_errors,
9cc9e091
SR
279 "BISECT_MANUAL" => \$bisect_manual,
280 "BISECT_SKIP" => \$bisect_skip,
961d9cac 281 "BISECT_TRIES" => \$bisect_tries,
9cc9e091
SR
282 "CONFIG_BISECT_GOOD" => \$config_bisect_good,
283 "BISECT_RET_GOOD" => \$bisect_ret_good,
284 "BISECT_RET_BAD" => \$bisect_ret_bad,
285 "BISECT_RET_SKIP" => \$bisect_ret_skip,
286 "BISECT_RET_ABORT" => \$bisect_ret_abort,
287 "BISECT_RET_DEFAULT" => \$bisect_ret_default,
288 "STORE_FAILURES" => \$store_failures,
289 "STORE_SUCCESSES" => \$store_successes,
290 "TEST_NAME" => \$test_name,
291 "TIMEOUT" => \$timeout,
292 "BOOTED_TIMEOUT" => \$booted_timeout,
293 "CONSOLE" => \$console,
5a5d8e48 294 "CLOSE_CONSOLE_SIGNAL" => \$close_console_signal,
9cc9e091
SR
295 "DETECT_TRIPLE_FAULT" => \$detect_triplefault,
296 "SUCCESS_LINE" => \$success_line,
297 "REBOOT_SUCCESS_LINE" => \$reboot_success_line,
298 "STOP_AFTER_SUCCESS" => \$stop_after_success,
299 "STOP_AFTER_FAILURE" => \$stop_after_failure,
300 "STOP_TEST_AFTER" => \$stop_test_after,
301 "BUILD_TARGET" => \$build_target,
302 "SSH_EXEC" => \$ssh_exec,
303 "SCP_TO_TARGET" => \$scp_to_target,
02ad2617 304 "SCP_TO_TARGET_INSTALL" => \$scp_to_target_install,
9cc9e091
SR
305 "CHECKOUT" => \$checkout,
306 "TARGET_IMAGE" => \$target_image,
307 "LOCALVERSION" => \$localversion,
308
309 "BISECT_GOOD" => \$bisect_good,
310 "BISECT_BAD" => \$bisect_bad,
311 "BISECT_TYPE" => \$bisect_type,
312 "BISECT_START" => \$bisect_start,
313 "BISECT_REPLAY" => \$bisect_replay,
314 "BISECT_FILES" => \$bisect_files,
315 "BISECT_REVERSE" => \$bisect_reverse,
316 "BISECT_CHECK" => \$bisect_check,
317
318 "CONFIG_BISECT" => \$config_bisect,
319 "CONFIG_BISECT_TYPE" => \$config_bisect_type,
b0918612 320 "CONFIG_BISECT_CHECK" => \$config_bisect_check,
9cc9e091
SR
321
322 "PATCHCHECK_TYPE" => \$patchcheck_type,
323 "PATCHCHECK_START" => \$patchcheck_start,
324 "PATCHCHECK_END" => \$patchcheck_end,
325);
326
327# Options may be used by other options, record them.
328my %used_options;
329
7bf51073
SR
330# default variables that can be used
331chomp ($variable{"PWD"} = `pwd`);
332
8d1491ba
SR
333$config_help{"MACHINE"} = << "EOF"
334 The machine hostname that you will test.
bb8474b1 335 For build only tests, it is still needed to differentiate log files.
8d1491ba
SR
336EOF
337 ;
338$config_help{"SSH_USER"} = << "EOF"
339 The box is expected to have ssh on normal bootup, provide the user
340 (most likely root, since you need privileged operations)
341EOF
342 ;
343$config_help{"BUILD_DIR"} = << "EOF"
344 The directory that contains the Linux source code (full path).
0e7a22de
SR
345 You can use \${PWD} that will be the path where ktest.pl is run, or use
346 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
8d1491ba
SR
347EOF
348 ;
349$config_help{"OUTPUT_DIR"} = << "EOF"
350 The directory that the objects will be built (full path).
351 (can not be same as BUILD_DIR)
0e7a22de
SR
352 You can use \${PWD} that will be the path where ktest.pl is run, or use
353 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
8d1491ba
SR
354EOF
355 ;
356$config_help{"BUILD_TARGET"} = << "EOF"
357 The location of the compiled file to copy to the target.
358 (relative to OUTPUT_DIR)
359EOF
360 ;
dbd3783b
SR
361$config_help{"BUILD_OPTIONS"} = << "EOF"
362 Options to add to \"make\" when building.
363 i.e. -j20
364EOF
365 ;
8d1491ba
SR
366$config_help{"TARGET_IMAGE"} = << "EOF"
367 The place to put your image on the test machine.
368EOF
369 ;
370$config_help{"POWER_CYCLE"} = << "EOF"
371 A script or command to reboot the box.
372
373 Here is a digital loggers power switch example
374 POWER_CYCLE = wget --no-proxy -O /dev/null -q --auth-no-challenge 'http://admin:admin\@power/outlet?5=CCL'
375
376 Here is an example to reboot a virtual box on the current host
377 with the name "Guest".
378 POWER_CYCLE = virsh destroy Guest; sleep 5; virsh start Guest
379EOF
380 ;
381$config_help{"CONSOLE"} = << "EOF"
382 The script or command that reads the console
383
384 If you use ttywatch server, something like the following would work.
385CONSOLE = nc -d localhost 3001
386
387 For a virtual machine with guest name "Guest".
388CONSOLE = virsh console Guest
389EOF
390 ;
391$config_help{"LOCALVERSION"} = << "EOF"
392 Required version ending to differentiate the test
393 from other linux builds on the system.
394EOF
395 ;
396$config_help{"REBOOT_TYPE"} = << "EOF"
397 Way to reboot the box to the test kernel.
7786954c 398 Only valid options so far are "grub", "grub2", "syslinux", and "script".
8d1491ba
SR
399
400 If you specify grub, it will assume grub version 1
401 and will search in /boot/grub/menu.lst for the title \$GRUB_MENU
402 and select that target to reboot to the kernel. If this is not
403 your setup, then specify "script" and have a command or script
404 specified in REBOOT_SCRIPT to boot to the target.
405
406 The entry in /boot/grub/menu.lst must be entered in manually.
407 The test will not modify that file.
a15ba913
SR
408
409 If you specify grub2, then you also need to specify both \$GRUB_MENU
410 and \$GRUB_FILE.
7786954c
SR
411
412 If you specify syslinux, then you may use SYSLINUX to define the syslinux
413 command (defaults to extlinux), and SYSLINUX_PATH to specify the path to
414 the syslinux install (defaults to /boot/extlinux). But you have to specify
415 SYSLINUX_LABEL to define the label to boot to for the test kernel.
8d1491ba
SR
416EOF
417 ;
418$config_help{"GRUB_MENU"} = << "EOF"
419 The grub title name for the test kernel to boot
a15ba913 420 (Only mandatory if REBOOT_TYPE = grub or grub2)
8d1491ba
SR
421
422 Note, ktest.pl will not update the grub menu.lst, you need to
423 manually add an option for the test. ktest.pl will search
424 the grub menu.lst for this option to find what kernel to
425 reboot into.
426
427 For example, if in the /boot/grub/menu.lst the test kernel title has:
428 title Test Kernel
429 kernel vmlinuz-test
430 GRUB_MENU = Test Kernel
a15ba913
SR
431
432 For grub2, a search of \$GRUB_FILE is performed for the lines
433 that begin with "menuentry". It will not detect submenus. The
434 menu must be a non-nested menu. Add the quotes used in the menu
435 to guarantee your selection, as the first menuentry with the content
436 of \$GRUB_MENU that is found will be used.
437EOF
438 ;
439$config_help{"GRUB_FILE"} = << "EOF"
440 If grub2 is used, the full path for the grub.cfg file is placed
441 here. Use something like /boot/grub2/grub.cfg to search.
8d1491ba
SR
442EOF
443 ;
7786954c
SR
444$config_help{"SYSLINUX_LABEL"} = << "EOF"
445 If syslinux is used, the label that boots the target kernel must
446 be specified with SYSLINUX_LABEL.
447EOF
448 ;
8d1491ba
SR
449$config_help{"REBOOT_SCRIPT"} = << "EOF"
450 A script to reboot the target into the test kernel
451 (Only mandatory if REBOOT_TYPE = script)
452EOF
453 ;
454
c75d22d9
SRRH
455sub _logit {
456 if (defined($opt{"LOG_FILE"})) {
457 open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}";
458 print OUT @_;
459 close(OUT);
460 }
461}
462
463sub logit {
464 if (defined($opt{"LOG_FILE"})) {
465 _logit @_;
466 } else {
467 print @_;
468 }
469}
470
471sub doprint {
472 print @_;
473 _logit @_;
474}
475
dad98754
SR
476sub read_prompt {
477 my ($cancel, $prompt) = @_;
35ce5952
SR
478
479 my $ans;
480
481 for (;;) {
dad98754
SR
482 if ($cancel) {
483 print "$prompt [y/n/C] ";
484 } else {
485 print "$prompt [Y/n] ";
486 }
35ce5952
SR
487 $ans = <STDIN>;
488 chomp $ans;
489 if ($ans =~ /^\s*$/) {
dad98754
SR
490 if ($cancel) {
491 $ans = "c";
492 } else {
493 $ans = "y";
494 }
35ce5952
SR
495 }
496 last if ($ans =~ /^y$/i || $ans =~ /^n$/i);
dad98754
SR
497 if ($cancel) {
498 last if ($ans =~ /^c$/i);
499 print "Please answer either 'y', 'n' or 'c'.\n";
500 } else {
501 print "Please answer either 'y' or 'n'.\n";
502 }
503 }
504 if ($ans =~ /^c/i) {
505 exit;
35ce5952
SR
506 }
507 if ($ans !~ /^y$/i) {
508 return 0;
509 }
510 return 1;
511}
8d1491ba 512
dad98754
SR
513sub read_yn {
514 my ($prompt) = @_;
515
516 return read_prompt 0, $prompt;
517}
518
519sub read_ync {
520 my ($prompt) = @_;
521
522 return read_prompt 1, $prompt;
523}
524
8d1491ba
SR
525sub get_ktest_config {
526 my ($config) = @_;
815e2bd7 527 my $ans;
8d1491ba
SR
528
529 return if (defined($opt{$config}));
530
531 if (defined($config_help{$config})) {
532 print "\n";
533 print $config_help{$config};
534 }
535
536 for (;;) {
537 print "$config = ";
dbd3783b 538 if (defined($default{$config}) && length($default{$config})) {
8d1491ba
SR
539 print "\[$default{$config}\] ";
540 }
815e2bd7
SR
541 $ans = <STDIN>;
542 $ans =~ s/^\s*(.*\S)\s*$/$1/;
543 if ($ans =~ /^\s*$/) {
8d1491ba 544 if ($default{$config}) {
815e2bd7 545 $ans = $default{$config};
8d1491ba
SR
546 } else {
547 print "Your answer can not be blank\n";
548 next;
549 }
550 }
0e7a22de 551 $entered_configs{$config} = ${ans};
8d1491ba
SR
552 last;
553 }
554}
555
556sub get_ktest_configs {
557 get_ktest_config("MACHINE");
8d1491ba
SR
558 get_ktest_config("BUILD_DIR");
559 get_ktest_config("OUTPUT_DIR");
bb8474b1 560
dbd3783b
SR
561 if ($newconfig) {
562 get_ktest_config("BUILD_OPTIONS");
563 }
564
bb8474b1
SR
565 # options required for other than just building a kernel
566 if (!$buildonly) {
165708b2
SR
567 get_ktest_config("POWER_CYCLE");
568 get_ktest_config("CONSOLE");
569 }
570
571 # options required for install and more
572 if ($buildonly != 1) {
bb8474b1
SR
573 get_ktest_config("SSH_USER");
574 get_ktest_config("BUILD_TARGET");
575 get_ktest_config("TARGET_IMAGE");
bb8474b1
SR
576 }
577
8d1491ba
SR
578 get_ktest_config("LOCALVERSION");
579
bb8474b1
SR
580 return if ($buildonly);
581
8d1491ba
SR
582 my $rtype = $opt{"REBOOT_TYPE"};
583
584 if (!defined($rtype)) {
585 if (!defined($opt{"GRUB_MENU"})) {
586 get_ktest_config("REBOOT_TYPE");
587 $rtype = $entered_configs{"REBOOT_TYPE"};
588 } else {
589 $rtype = "grub";
590 }
591 }
592
593 if ($rtype eq "grub") {
594 get_ktest_config("GRUB_MENU");
8d1491ba 595 }
a15ba913
SR
596
597 if ($rtype eq "grub2") {
598 get_ktest_config("GRUB_MENU");
599 get_ktest_config("GRUB_FILE");
600 }
7786954c
SR
601
602 if ($rtype eq "syslinux") {
603 get_ktest_config("SYSLINUX_LABEL");
604 }
8d1491ba
SR
605}
606
77d942ce 607sub process_variables {
8d735212 608 my ($value, $remove_undef) = @_;
77d942ce
SR
609 my $retval = "";
610
611 # We want to check for '\', and it is just easier
612 # to check the previous characet of '$' and not need
613 # to worry if '$' is the first character. By adding
614 # a space to $value, we can just check [^\\]\$ and
615 # it will still work.
616 $value = " $value";
617
618 while ($value =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
619 my $begin = $1;
620 my $var = $2;
621 my $end = $3;
622 # append beginning of value to retval
623 $retval = "$retval$begin";
624 if (defined($variable{$var})) {
625 $retval = "$retval$variable{$var}";
8d735212
SR
626 } elsif (defined($remove_undef) && $remove_undef) {
627 # for if statements, any variable that is not defined,
628 # we simple convert to 0
629 $retval = "${retval}0";
77d942ce
SR
630 } else {
631 # put back the origin piece.
632 $retval = "$retval\$\{$var\}";
9cc9e091
SR
633 # This could be an option that is used later, save
634 # it so we don't warn if this option is not one of
635 # ktests options.
636 $used_options{$var} = 1;
77d942ce
SR
637 }
638 $value = $end;
639 }
640 $retval = "$retval$value";
641
642 # remove the space added in the beginning
643 $retval =~ s/ //;
644
645 return "$retval"
646}
647
a57419b3 648sub set_value {
3d1cc414 649 my ($lvalue, $rvalue, $override, $overrides, $name) = @_;
a57419b3 650
cad96669
SR
651 my $prvalue = process_variables($rvalue);
652
653 if ($buildonly && $lvalue =~ /^TEST_TYPE(\[.*\])?$/ && $prvalue ne "build") {
bb8474b1
SR
654 # Note if a test is something other than build, then we
655 # will need other manditory options.
319ab14f
SRRH
656 if ($prvalue ne "install") {
657 # for bisect, we need to check BISECT_TYPE
658 if ($prvalue ne "bisect") {
659 $buildonly = 0;
660 }
661 } else {
662 # install still limits some manditory options.
663 $buildonly = 2;
664 }
665 }
666
667 if ($buildonly && $lvalue =~ /^BISECT_TYPE(\[.*\])?$/ && $prvalue ne "build") {
cad96669 668 if ($prvalue ne "install") {
165708b2
SR
669 $buildonly = 0;
670 } else {
671 # install still limits some manditory options.
672 $buildonly = 2;
673 }
bb8474b1
SR
674 }
675
a57419b3 676 if (defined($opt{$lvalue})) {
3d1cc414
SR
677 if (!$override || defined(${$overrides}{$lvalue})) {
678 my $extra = "";
679 if ($override) {
680 $extra = "In the same override section!\n";
681 }
682 die "$name: $.: Option $lvalue defined more than once!\n$extra";
683 }
cad96669 684 ${$overrides}{$lvalue} = $prvalue;
a57419b3 685 }
21a9679f
SR
686 if ($rvalue =~ /^\s*$/) {
687 delete $opt{$lvalue};
688 } else {
cad96669 689 $opt{$lvalue} = $prvalue;
21a9679f 690 }
a57419b3
SR
691}
692
c75d22d9
SRRH
693sub set_eval {
694 my ($lvalue, $rvalue, $name) = @_;
695
696 my $prvalue = process_variables($rvalue);
697 my $arr;
698
699 if (defined($evals{$lvalue})) {
700 $arr = $evals{$lvalue};
701 } else {
702 $arr = [];
703 $evals{$lvalue} = $arr;
704 }
705
706 push @{$arr}, $rvalue;
707}
708
77d942ce
SR
709sub set_variable {
710 my ($lvalue, $rvalue) = @_;
711
712 if ($rvalue =~ /^\s*$/) {
713 delete $variable{$lvalue};
714 } else {
715 $rvalue = process_variables($rvalue);
716 $variable{$lvalue} = $rvalue;
717 }
718}
719
ab7a3f52
SR
720sub process_compare {
721 my ($lval, $cmp, $rval) = @_;
722
723 # remove whitespace
724
725 $lval =~ s/^\s*//;
726 $lval =~ s/\s*$//;
727
728 $rval =~ s/^\s*//;
729 $rval =~ s/\s*$//;
730
731 if ($cmp eq "==") {
732 return $lval eq $rval;
733 } elsif ($cmp eq "!=") {
734 return $lval ne $rval;
8fddbe9b
SR
735 } elsif ($cmp eq "=~") {
736 return $lval =~ m/$rval/;
737 } elsif ($cmp eq "!~") {
738 return $lval !~ m/$rval/;
ab7a3f52
SR
739 }
740
741 my $statement = "$lval $cmp $rval";
742 my $ret = eval $statement;
743
744 # $@ stores error of eval
745 if ($@) {
746 return -1;
747 }
748
749 return $ret;
750}
751
9900b5dc
SR
752sub value_defined {
753 my ($val) = @_;
754
755 return defined($variable{$2}) ||
756 defined($opt{$2});
757}
758
8d735212
SR
759my $d = 0;
760sub process_expression {
761 my ($name, $val) = @_;
762
763 my $c = $d++;
764
765 while ($val =~ s/\(([^\(]*?)\)/\&\&\&\&VAL\&\&\&\&/) {
766 my $express = $1;
767
768 if (process_expression($name, $express)) {
769 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 1 /;
770 } else {
771 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 0 /;
772 }
773 }
774
775 $d--;
776 my $OR = "\\|\\|";
777 my $AND = "\\&\\&";
45d73a5d 778
8d735212
SR
779 while ($val =~ s/^(.*?)($OR|$AND)//) {
780 my $express = $1;
781 my $op = $2;
782
783 if (process_expression($name, $express)) {
784 if ($op eq "||") {
785 return 1;
786 }
787 } else {
788 if ($op eq "&&") {
789 return 0;
790 }
791 }
792 }
45d73a5d 793
8fddbe9b 794 if ($val =~ /(.*)(==|\!=|>=|<=|>|<|=~|\!~)(.*)/) {
ab7a3f52
SR
795 my $ret = process_compare($1, $2, $3);
796 if ($ret < 0) {
797 die "$name: $.: Unable to process comparison\n";
798 }
799 return $ret;
800 }
801
9900b5dc
SR
802 if ($val =~ /^\s*(NOT\s*)?DEFINED\s+(\S+)\s*$/) {
803 if (defined $1) {
804 return !value_defined($2);
805 } else {
806 return value_defined($2);
807 }
808 }
809
45d73a5d
SR
810 if ($val =~ /^\s*0\s*$/) {
811 return 0;
812 } elsif ($val =~ /^\s*\d+\s*$/) {
813 return 1;
814 }
815
9900b5dc 816 die ("$name: $.: Undefined content $val in if statement\n");
8d735212
SR
817}
818
819sub process_if {
820 my ($name, $value) = @_;
821
822 # Convert variables and replace undefined ones with 0
823 my $val = process_variables($value, 1);
824 my $ret = process_expression $name, $val;
825
826 return $ret;
45d73a5d
SR
827}
828
2ed3b161
SR
829sub __read_config {
830 my ($config, $current_test_num) = @_;
2545eb61 831
2ed3b161
SR
832 my $in;
833 open($in, $config) || die "can't read file $config";
2545eb61 834
a57419b3
SR
835 my $name = $config;
836 $name =~ s,.*/(.*),$1,;
837
2ed3b161 838 my $test_num = $$current_test_num;
a57419b3
SR
839 my $default = 1;
840 my $repeat = 1;
841 my $num_tests_set = 0;
842 my $skip = 0;
843 my $rest;
a9f84424 844 my $line;
0df213ca 845 my $test_case = 0;
45d73a5d
SR
846 my $if = 0;
847 my $if_set = 0;
3d1cc414
SR
848 my $override = 0;
849
850 my %overrides;
a57419b3 851
2ed3b161 852 while (<$in>) {
2545eb61
SR
853
854 # ignore blank lines and comments
855 next if (/^\s*$/ || /\s*\#/);
856
0050b6bb 857 if (/^\s*(TEST_START|DEFAULTS)\b(.*)/) {
a57419b3 858
0050b6bb
SR
859 my $type = $1;
860 $rest = $2;
a9f84424 861 $line = $2;
a57419b3 862
0050b6bb
SR
863 my $old_test_num;
864 my $old_repeat;
3d1cc414 865 $override = 0;
0050b6bb
SR
866
867 if ($type eq "TEST_START") {
868
869 if ($num_tests_set) {
870 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
871 }
a57419b3 872
0050b6bb
SR
873 $old_test_num = $test_num;
874 $old_repeat = $repeat;
a57419b3 875
0050b6bb
SR
876 $test_num += $repeat;
877 $default = 0;
878 $repeat = 1;
879 } else {
880 $default = 1;
881 }
a57419b3 882
a9f84424
SR
883 # If SKIP is anywhere in the line, the command will be skipped
884 if ($rest =~ s/\s+SKIP\b//) {
a57419b3
SR
885 $skip = 1;
886 } else {
0df213ca 887 $test_case = 1;
a57419b3
SR
888 $skip = 0;
889 }
890
a9f84424
SR
891 if ($rest =~ s/\sELSE\b//) {
892 if (!$if) {
893 die "$name: $.: ELSE found with out matching IF section\n$_";
894 }
895 $if = 0;
896
897 if ($if_set) {
898 $skip = 1;
899 } else {
900 $skip = 0;
3d1cc414 901 }
a57419b3
SR
902 }
903
a9f84424 904 if ($rest =~ s/\sIF\s+(.*)//) {
45d73a5d
SR
905 if (process_if($name, $1)) {
906 $if_set = 1;
907 } else {
908 $skip = 1;
909 }
910 $if = 1;
911 } else {
912 $if = 0;
a9f84424
SR
913 $if_set = 0;
914 }
915
916 if (!$skip) {
917 if ($type eq "TEST_START") {
918 if ($rest =~ s/\s+ITERATE\s+(\d+)//) {
919 $repeat = $1;
920 $repeat_tests{"$test_num"} = $repeat;
921 }
922 } elsif ($rest =~ s/\sOVERRIDE\b//) {
923 # DEFAULT only
924 $override = 1;
925 # Clear previous overrides
926 %overrides = ();
927 }
a57419b3
SR
928 }
929
a9f84424 930 if (!$skip && $rest !~ /^\s*$/) {
0050b6bb 931 die "$name: $.: Gargbage found after $type\n$_";
a57419b3
SR
932 }
933
0050b6bb 934 if ($skip && $type eq "TEST_START") {
a57419b3 935 $test_num = $old_test_num;
e48c5293 936 $repeat = $old_repeat;
a57419b3
SR
937 }
938
ab7a3f52 939 } elsif (/^\s*ELSE\b(.*)$/) {
45d73a5d
SR
940 if (!$if) {
941 die "$name: $.: ELSE found with out matching IF section\n$_";
942 }
943 $rest = $1;
944 if ($if_set) {
945 $skip = 1;
ab7a3f52 946 $rest = "";
45d73a5d
SR
947 } else {
948 $skip = 0;
949
ab7a3f52 950 if ($rest =~ /\sIF\s+(.*)/) {
45d73a5d 951 # May be a ELSE IF section.
95f57838
SR
952 if (process_if($name, $1)) {
953 $if_set = 1;
954 } else {
45d73a5d
SR
955 $skip = 1;
956 }
ab7a3f52 957 $rest = "";
45d73a5d
SR
958 } else {
959 $if = 0;
960 }
961 }
962
ab7a3f52
SR
963 if ($rest !~ /^\s*$/) {
964 die "$name: $.: Gargbage found after DEFAULTS\n$_";
965 }
966
2ed3b161
SR
967 } elsif (/^\s*INCLUDE\s+(\S+)/) {
968
969 next if ($skip);
970
971 if (!$default) {
972 die "$name: $.: INCLUDE can only be done in default sections\n$_";
973 }
974
975 my $file = process_variables($1);
976
977 if ($file !~ m,^/,) {
978 # check the path of the config file first
979 if ($config =~ m,(.*)/,) {
980 if (-f "$1/$file") {
981 $file = "$1/$file";
982 }
983 }
984 }
985
986 if ( ! -r $file ) {
987 die "$name: $.: Can't read file $file\n$_";
988 }
989
990 if (__read_config($file, \$test_num)) {
991 $test_case = 1;
992 }
993
c75d22d9
SRRH
994 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=~\s*(.*?)\s*$/) {
995
996 next if ($skip);
997
998 my $lvalue = $1;
999 my $rvalue = $2;
1000
1001 if ($default || $lvalue =~ /\[\d+\]$/) {
1002 set_eval($lvalue, $rvalue, $name);
1003 } else {
1004 my $val = "$lvalue\[$test_num\]";
1005 set_eval($val, $rvalue, $name);
1006 }
1007
a57419b3
SR
1008 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) {
1009
1010 next if ($skip);
1011
2545eb61
SR
1012 my $lvalue = $1;
1013 my $rvalue = $2;
1014
a57419b3
SR
1015 if (!$default &&
1016 ($lvalue eq "NUM_TESTS" ||
1017 $lvalue eq "LOG_FILE" ||
1018 $lvalue eq "CLEAR_LOG")) {
1019 die "$name: $.: $lvalue must be set in DEFAULTS section\n";
1020 }
1021
1022 if ($lvalue eq "NUM_TESTS") {
1023 if ($test_num) {
1024 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
1025 }
1026 if (!$default) {
1027 die "$name: $.: NUM_TESTS must be set in default section\n";
1028 }
1029 $num_tests_set = 1;
1030 }
1031
1032 if ($default || $lvalue =~ /\[\d+\]$/) {
3d1cc414 1033 set_value($lvalue, $rvalue, $override, \%overrides, $name);
a57419b3
SR
1034 } else {
1035 my $val = "$lvalue\[$test_num\]";
3d1cc414 1036 set_value($val, $rvalue, $override, \%overrides, $name);
a57419b3
SR
1037
1038 if ($repeat > 1) {
1039 $repeats{$val} = $repeat;
1040 }
a75fecec 1041 }
77d942ce
SR
1042 } elsif (/^\s*([A-Z_\[\]\d]+)\s*:=\s*(.*?)\s*$/) {
1043 next if ($skip);
1044
1045 my $lvalue = $1;
1046 my $rvalue = $2;
1047
1048 # process config variables.
1049 # Config variables are only active while reading the
1050 # config and can be defined anywhere. They also ignore
1051 # TEST_START and DEFAULTS, but are skipped if they are in
1052 # on of these sections that have SKIP defined.
1053 # The save variable can be
1054 # defined multiple times and the new one simply overrides
1055 # the prevous one.
1056 set_variable($lvalue, $rvalue);
1057
a57419b3
SR
1058 } else {
1059 die "$name: $.: Garbage found in config\n$_";
2545eb61
SR
1060 }
1061 }
1062
a57419b3
SR
1063 if ($test_num) {
1064 $test_num += $repeat - 1;
1065 $opt{"NUM_TESTS"} = $test_num;
1066 }
1067
2ed3b161
SR
1068 close($in);
1069
1070 $$current_test_num = $test_num;
1071
1072 return $test_case;
1073}
1074
c4261d0f
SR
1075sub get_test_case {
1076 print "What test case would you like to run?\n";
1077 print " (build, install or boot)\n";
1078 print " Other tests are available but require editing the config file\n";
1079 my $ans = <STDIN>;
1080 chomp $ans;
1081 $default{"TEST_TYPE"} = $ans;
1082}
1083
2ed3b161
SR
1084sub read_config {
1085 my ($config) = @_;
1086
1087 my $test_case;
1088 my $test_num = 0;
1089
1090 $test_case = __read_config $config, \$test_num;
1091
8d1491ba
SR
1092 # make sure we have all mandatory configs
1093 get_ktest_configs;
1094
0df213ca
SR
1095 # was a test specified?
1096 if (!$test_case) {
1097 print "No test case specified.\n";
c4261d0f 1098 get_test_case;
0df213ca
SR
1099 }
1100
a75fecec
SR
1101 # set any defaults
1102
1103 foreach my $default (keys %default) {
1104 if (!defined($opt{$default})) {
1105 $opt{$default} = $default{$default};
1106 }
1107 }
9cc9e091
SR
1108
1109 if ($opt{"IGNORE_UNUSED"} == 1) {
1110 return;
1111 }
1112
1113 my %not_used;
1114
1115 # check if there are any stragglers (typos?)
1116 foreach my $option (keys %opt) {
1117 my $op = $option;
1118 # remove per test labels.
1119 $op =~ s/\[.*\]//;
1120 if (!exists($option_map{$op}) &&
1121 !exists($default{$op}) &&
1122 !exists($used_options{$op})) {
1123 $not_used{$op} = 1;
1124 }
1125 }
1126
1127 if (%not_used) {
1128 my $s = "s are";
1129 $s = " is" if (keys %not_used == 1);
1130 print "The following option$s not used; could be a typo:\n";
1131 foreach my $option (keys %not_used) {
1132 print "$option\n";
1133 }
1134 print "Set IGRNORE_UNUSED = 1 to have ktest ignore unused variables\n";
1135 if (!read_yn "Do you want to continue?") {
1136 exit -1;
1137 }
1138 }
2545eb61
SR
1139}
1140
23715c3c 1141sub __eval_option {
04262be3 1142 my ($name, $option, $i) = @_;
23715c3c
SR
1143
1144 # Add space to evaluate the character before $
1145 $option = " $option";
1146 my $retval = "";
f9dfb65b
RV
1147 my $repeated = 0;
1148 my $parent = 0;
1149
1150 foreach my $test (keys %repeat_tests) {
1151 if ($i >= $test &&
1152 $i < $test + $repeat_tests{$test}) {
1153
1154 $repeated = 1;
1155 $parent = $test;
1156 last;
1157 }
1158 }
23715c3c
SR
1159
1160 while ($option =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
1161 my $start = $1;
1162 my $var = $2;
1163 my $end = $3;
1164
1165 # Append beginning of line
1166 $retval = "$retval$start";
1167
1168 # If the iteration option OPT[$i] exists, then use that.
1169 # otherwise see if the default OPT (without [$i]) exists.
1170
1171 my $o = "$var\[$i\]";
f9dfb65b 1172 my $parento = "$var\[$parent\]";
23715c3c 1173
04262be3
SRRH
1174 # If a variable contains itself, use the default var
1175 if (($var eq $name) && defined($opt{$var})) {
1176 $o = $opt{$var};
1177 $retval = "$retval$o";
1178 } elsif (defined($opt{$o})) {
23715c3c
SR
1179 $o = $opt{$o};
1180 $retval = "$retval$o";
f9dfb65b
RV
1181 } elsif ($repeated && defined($opt{$parento})) {
1182 $o = $opt{$parento};
1183 $retval = "$retval$o";
23715c3c
SR
1184 } elsif (defined($opt{$var})) {
1185 $o = $opt{$var};
1186 $retval = "$retval$o";
8e80bf05
SRRH
1187 } elsif ($var eq "KERNEL_VERSION" && defined($make)) {
1188 # special option KERNEL_VERSION uses kernel version
1189 get_version();
1190 $retval = "$retval$version";
23715c3c
SR
1191 } else {
1192 $retval = "$retval\$\{$var\}";
1193 }
1194
1195 $option = $end;
1196 }
1197
1198 $retval = "$retval$option";
1199
1200 $retval =~ s/^ //;
1201
1202 return $retval;
1203}
1204
c75d22d9
SRRH
1205sub process_evals {
1206 my ($name, $option, $i) = @_;
1207
1208 my $option_name = "$name\[$i\]";
1209 my $ev;
1210
1211 my $old_option = $option;
1212
1213 if (defined($evals{$option_name})) {
1214 $ev = $evals{$option_name};
1215 } elsif (defined($evals{$name})) {
1216 $ev = $evals{$name};
1217 } else {
1218 return $option;
1219 }
1220
1221 for my $e (@{$ev}) {
1222 eval "\$option =~ $e";
1223 }
1224
1225 if ($option ne $old_option) {
1226 doprint("$name changed from '$old_option' to '$option'\n");
1227 }
1228
1229 return $option;
1230}
1231
23715c3c 1232sub eval_option {
04262be3 1233 my ($name, $option, $i) = @_;
23715c3c
SR
1234
1235 my $prev = "";
1236
1237 # Since an option can evaluate to another option,
1238 # keep iterating until we do not evaluate any more
1239 # options.
1240 my $r = 0;
1241 while ($prev ne $option) {
1242 # Check for recursive evaluations.
1243 # 100 deep should be more than enough.
1244 if ($r++ > 100) {
1245 die "Over 100 evaluations accurred with $option\n" .
1246 "Check for recursive variables\n";
1247 }
1248 $prev = $option;
04262be3 1249 $option = __eval_option($name, $option, $i);
23715c3c
SR
1250 }
1251
c75d22d9 1252 $option = process_evals($name, $option, $i);
23715c3c 1253
c75d22d9 1254 return $option;
5f9b6ced
SR
1255}
1256
7faafbd6 1257sub run_command;
2728be41
AJ
1258sub start_monitor;
1259sub end_monitor;
1260sub wait_for_monitor;
7faafbd6
SR
1261
1262sub reboot {
2728be41
AJ
1263 my ($time) = @_;
1264
a4968722
SR
1265 # Make sure everything has been written to disk
1266 run_ssh("sync");
1267
2b803365
SR
1268 if (defined($time)) {
1269 start_monitor;
1270 # flush out current monitor
1271 # May contain the reboot success line
1272 wait_for_monitor 1;
1273 }
1274
7faafbd6 1275 # try to reboot normally
e48c5293 1276 if (run_command $reboot) {
576f627c
SR
1277 if (defined($powercycle_after_reboot)) {
1278 sleep $powercycle_after_reboot;
1279 run_command "$power_cycle";
1280 }
1281 } else {
7faafbd6 1282 # nope? power cycle it.
a75fecec 1283 run_command "$power_cycle";
7faafbd6 1284 }
2728be41
AJ
1285
1286 if (defined($time)) {
4c0b67a2
SRRH
1287
1288 # We only want to get to the new kernel, don't fail
1289 # if we stumble over a call trace.
1290 my $save_ignore_errors = $ignore_errors;
1291 $ignore_errors = 1;
1292
d6845536
SRRH
1293 # Look for the good kernel to boot
1294 if (wait_for_monitor($time, "Linux version")) {
407b95b7 1295 # reboot got stuck?
8a80c727 1296 doprint "Reboot did not finish. Forcing power cycle\n";
407b95b7
SR
1297 run_command "$power_cycle";
1298 }
d6845536 1299
4c0b67a2
SRRH
1300 $ignore_errors = $save_ignore_errors;
1301
d6845536
SRRH
1302 # Still need to wait for the reboot to finish
1303 wait_for_monitor($time, $reboot_success_line);
1304
2728be41
AJ
1305 end_monitor;
1306 }
7faafbd6
SR
1307}
1308
bc7c5803
SR
1309sub reboot_to_good {
1310 my ($time) = @_;
1311
1312 if (defined($switch_to_good)) {
1313 run_command $switch_to_good;
bc7c5803
SR
1314 }
1315
1316 reboot $time;
1317}
1318
576f627c
SR
1319sub do_not_reboot {
1320 my $i = $iteration;
1321
4ab1cce5 1322 return $test_type eq "build" || $no_reboot ||
576f627c
SR
1323 ($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") ||
1324 ($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build");
1325}
1326
5c42fc5b 1327sub dodie {
5a391fbf 1328 doprint "CRITICAL FAILURE... ", @_, "\n";
5c42fc5b 1329
576f627c
SR
1330 my $i = $iteration;
1331
1332 if ($reboot_on_error && !do_not_reboot) {
1333
75c3fda7 1334 doprint "REBOOTING\n";
bc7c5803 1335 reboot_to_good;
75c3fda7 1336
a75fecec 1337 } elsif ($poweroff_on_error && defined($power_off)) {
5c42fc5b 1338 doprint "POWERING OFF\n";
a75fecec 1339 `$power_off`;
5c42fc5b 1340 }
75c3fda7 1341
f80802cb
SR
1342 if (defined($opt{"LOG_FILE"})) {
1343 print " See $opt{LOG_FILE} for more info.\n";
1344 }
1345
576f627c 1346 die @_, "\n";
5c42fc5b
SR
1347}
1348
7faafbd6
SR
1349sub open_console {
1350 my ($fp) = @_;
1351
1352 my $flags;
1353
a75fecec
SR
1354 my $pid = open($fp, "$console|") or
1355 dodie "Can't open console $console";
7faafbd6
SR
1356
1357 $flags = fcntl($fp, F_GETFL, 0) or
576f627c 1358 dodie "Can't get flags for the socket: $!";
7faafbd6 1359 $flags = fcntl($fp, F_SETFL, $flags | O_NONBLOCK) or
576f627c 1360 dodie "Can't set flags for the socket: $!";
7faafbd6
SR
1361
1362 return $pid;
1363}
1364
1365sub close_console {
1366 my ($fp, $pid) = @_;
1367
1368 doprint "kill child process $pid\n";
5a5d8e48 1369 kill $close_console_signal, $pid;
7faafbd6
SR
1370
1371 print "closing!\n";
1372 close($fp);
1373}
1374
1375sub start_monitor {
1376 if ($monitor_cnt++) {
1377 return;
1378 }
1379 $monitor_fp = \*MONFD;
1380 $monitor_pid = open_console $monitor_fp;
a75fecec
SR
1381
1382 return;
1383
1384 open(MONFD, "Stop perl from warning about single use of MONFD");
7faafbd6
SR
1385}
1386
1387sub end_monitor {
319ab14f 1388 return if (!defined $console);
7faafbd6
SR
1389 if (--$monitor_cnt) {
1390 return;
1391 }
1392 close_console($monitor_fp, $monitor_pid);
1393}
1394
1395sub wait_for_monitor {
2b803365
SR
1396 my ($time, $stop) = @_;
1397 my $full_line = "";
7faafbd6 1398 my $line;
2b803365 1399 my $booted = 0;
407b95b7 1400 my $start_time = time;
8a80c727
SR
1401 my $skip_call_trace = 0;
1402 my $bug = 0;
1403 my $bug_ignored = 0;
407b95b7 1404 my $now;
7faafbd6 1405
a75fecec 1406 doprint "** Wait for monitor to settle down **\n";
7faafbd6
SR
1407
1408 # read the monitor and wait for the system to calm down
2b803365 1409 while (!$booted) {
7faafbd6 1410 $line = wait_for_input($monitor_fp, $time);
2b803365
SR
1411 last if (!defined($line));
1412 print "$line";
1413 $full_line .= $line;
1414
1415 if (defined($stop) && $full_line =~ /$stop/) {
1416 doprint "wait for monitor detected $stop\n";
1417 $booted = 1;
1418 }
1419
8a80c727
SR
1420 if ($full_line =~ /\[ backtrace testing \]/) {
1421 $skip_call_trace = 1;
1422 }
1423
1424 if ($full_line =~ /call trace:/i) {
1425 if (!$bug && !$skip_call_trace) {
1426 if ($ignore_errors) {
1427 $bug_ignored = 1;
1428 } else {
1429 $bug = 1;
1430 }
1431 }
1432 }
1433
1434 if ($full_line =~ /\[ end of backtrace testing \]/) {
1435 $skip_call_trace = 0;
1436 }
1437
1438 if ($full_line =~ /Kernel panic -/) {
1439 $bug = 1;
1440 }
1441
2b803365
SR
1442 if ($line =~ /\n/) {
1443 $full_line = "";
1444 }
407b95b7
SR
1445 $now = time;
1446 if ($now - $start_time >= $max_monitor_wait) {
1447 doprint "Exiting monitor flush due to hitting MAX_MONITOR_WAIT\n";
1448 return 1;
1449 }
2b803365 1450 }
a75fecec 1451 print "** Monitor flushed **\n";
8a80c727 1452 return $bug;
7faafbd6
SR
1453}
1454
de5b6e3b
RV
1455sub save_logs {
1456 my ($result, $basedir) = @_;
1457 my @t = localtime;
1458 my $date = sprintf "%04d%02d%02d%02d%02d%02d",
1459 1900+$t[5],$t[4],$t[3],$t[2],$t[1],$t[0];
1460
1461 my $type = $build_type;
1462 if ($type =~ /useconfig/) {
1463 $type = "useconfig";
1464 }
1465
1466 my $dir = "$machine-$test_type-$type-$result-$date";
1467
1468 $dir = "$basedir/$dir";
1469
1470 if (!-d $dir) {
1471 mkpath($dir) or
1472 die "can't create $dir";
1473 }
1474
1475 my %files = (
1476 "config" => $output_config,
1477 "buildlog" => $buildlog,
1478 "dmesg" => $dmesg,
1479 "testlog" => $testlog,
1480 );
1481
1482 while (my ($name, $source) = each(%files)) {
1483 if (-f "$source") {
1484 cp "$source", "$dir/$name" or
1485 die "failed to copy $source";
1486 }
1487 }
1488
1489 doprint "*** Saved info to $dir ***\n";
1490}
1491
2b7d9b21
SR
1492sub fail {
1493
921ed4c7
SR
1494 if (defined($post_test)) {
1495 run_command $post_test;
1496 }
1497
a75fecec 1498 if ($die_on_failure) {
2b7d9b21
SR
1499 dodie @_;
1500 }
1501
a75fecec 1502 doprint "FAILED\n";
7faafbd6 1503
576f627c
SR
1504 my $i = $iteration;
1505
a75fecec 1506 # no need to reboot for just building.
576f627c 1507 if (!do_not_reboot) {
a75fecec 1508 doprint "REBOOTING\n";
bc7c5803 1509 reboot_to_good $sleep_time;
a75fecec 1510 }
7faafbd6 1511
9064af52
SR
1512 my $name = "";
1513
1514 if (defined($test_name)) {
1515 $name = " ($test_name)";
1516 }
1517
576f627c
SR
1518 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1519 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
9064af52 1520 doprint "KTEST RESULT: TEST $i$name Failed: ", @_, "\n";
576f627c
SR
1521 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1522 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
a75fecec 1523
de5b6e3b
RV
1524 if (defined($store_failures)) {
1525 save_logs "fail", $store_failures;
1526 }
7faafbd6 1527
2b7d9b21
SR
1528 return 1;
1529}
1530
2545eb61
SR
1531sub run_command {
1532 my ($command) = @_;
d6ce2a0b
SR
1533 my $dolog = 0;
1534 my $dord = 0;
1535 my $pid;
1536
e48c5293
SR
1537 $command =~ s/\$SSH_USER/$ssh_user/g;
1538 $command =~ s/\$MACHINE/$machine/g;
1539
d6ce2a0b
SR
1540 doprint("$command ... ");
1541
1542 $pid = open(CMD, "$command 2>&1 |") or
2b7d9b21 1543 (fail "unable to exec $command" and return 0);
2545eb61
SR
1544
1545 if (defined($opt{"LOG_FILE"})) {
d6ce2a0b
SR
1546 open(LOG, ">>$opt{LOG_FILE}") or
1547 dodie "failed to write to log";
1548 $dolog = 1;
6c5ee0be
SR
1549 }
1550
1551 if (defined($redirect)) {
d6ce2a0b
SR
1552 open (RD, ">$redirect") or
1553 dodie "failed to write to redirect $redirect";
1554 $dord = 1;
2545eb61
SR
1555 }
1556
d6ce2a0b
SR
1557 while (<CMD>) {
1558 print LOG if ($dolog);
1559 print RD if ($dord);
1560 }
2545eb61 1561
d6ce2a0b 1562 waitpid($pid, 0);
2545eb61
SR
1563 my $failed = $?;
1564
d6ce2a0b
SR
1565 close(CMD);
1566 close(LOG) if ($dolog);
1567 close(RD) if ($dord);
1568
2545eb61
SR
1569 if ($failed) {
1570 doprint "FAILED!\n";
1571 } else {
1572 doprint "SUCCESS\n";
1573 }
1574
5f9b6ced
SR
1575 return !$failed;
1576}
1577
e48c5293
SR
1578sub run_ssh {
1579 my ($cmd) = @_;
1580 my $cp_exec = $ssh_exec;
1581
1582 $cp_exec =~ s/\$SSH_COMMAND/$cmd/g;
1583 return run_command "$cp_exec";
1584}
1585
1586sub run_scp {
02ad2617 1587 my ($src, $dst, $cp_scp) = @_;
e48c5293
SR
1588
1589 $cp_scp =~ s/\$SRC_FILE/$src/g;
1590 $cp_scp =~ s/\$DST_FILE/$dst/g;
1591
1592 return run_command "$cp_scp";
1593}
1594
02ad2617
SR
1595sub run_scp_install {
1596 my ($src, $dst) = @_;
1597
1598 my $cp_scp = $scp_to_target_install;
1599
1600 return run_scp($src, $dst, $cp_scp);
1601}
1602
1603sub run_scp_mod {
1604 my ($src, $dst) = @_;
1605
1606 my $cp_scp = $scp_to_target;
1607
1608 return run_scp($src, $dst, $cp_scp);
1609}
1610
a15ba913
SR
1611sub get_grub2_index {
1612
752d9665 1613 return if (defined($grub_number) && defined($last_grub_menu) &&
df5f7c66
SRRH
1614 $last_grub_menu eq $grub_menu && defined($last_machine) &&
1615 $last_machine eq $machine);
a15ba913
SR
1616
1617 doprint "Find grub2 menu ... ";
1618 $grub_number = -1;
1619
1620 my $ssh_grub = $ssh_exec;
1621 $ssh_grub =~ s,\$SSH_COMMAND,cat $grub_file,g;
1622
1623 open(IN, "$ssh_grub |")
1624 or die "unable to get $grub_file";
1625
1626 my $found = 0;
1627
1628 while (<IN>) {
1629 if (/^menuentry.*$grub_menu/) {
1630 $grub_number++;
1631 $found = 1;
1632 last;
1633 } elsif (/^menuentry\s/) {
1634 $grub_number++;
1635 }
1636 }
1637 close(IN);
1638
1639 die "Could not find '$grub_menu' in $grub_file on $machine"
1640 if (!$found);
1641 doprint "$grub_number\n";
752d9665 1642 $last_grub_menu = $grub_menu;
df5f7c66 1643 $last_machine = $machine;
a15ba913
SR
1644}
1645
5f9b6ced
SR
1646sub get_grub_index {
1647
a15ba913
SR
1648 if ($reboot_type eq "grub2") {
1649 get_grub2_index;
1650 return;
1651 }
1652
a75fecec
SR
1653 if ($reboot_type ne "grub") {
1654 return;
1655 }
752d9665 1656 return if (defined($grub_number) && defined($last_grub_menu) &&
df5f7c66
SRRH
1657 $last_grub_menu eq $grub_menu && defined($last_machine) &&
1658 $last_machine eq $machine);
5f9b6ced
SR
1659
1660 doprint "Find grub menu ... ";
1661 $grub_number = -1;
e48c5293
SR
1662
1663 my $ssh_grub = $ssh_exec;
1664 $ssh_grub =~ s,\$SSH_COMMAND,cat /boot/grub/menu.lst,g;
1665
1666 open(IN, "$ssh_grub |")
5f9b6ced 1667 or die "unable to get menu.lst";
e48c5293 1668
eaa1fe25
SR
1669 my $found = 0;
1670
5f9b6ced 1671 while (<IN>) {
a75fecec 1672 if (/^\s*title\s+$grub_menu\s*$/) {
5f9b6ced 1673 $grub_number++;
eaa1fe25 1674 $found = 1;
5f9b6ced
SR
1675 last;
1676 } elsif (/^\s*title\s/) {
1677 $grub_number++;
1678 }
1679 }
1680 close(IN);
1681
a75fecec 1682 die "Could not find '$grub_menu' in /boot/grub/menu on $machine"
eaa1fe25 1683 if (!$found);
5f9b6ced 1684 doprint "$grub_number\n";
752d9665 1685 $last_grub_menu = $grub_menu;
df5f7c66 1686 $last_machine = $machine;
2545eb61
SR
1687}
1688
2545eb61
SR
1689sub wait_for_input
1690{
1691 my ($fp, $time) = @_;
1692 my $rin;
1693 my $ready;
1694 my $line;
1695 my $ch;
1696
1697 if (!defined($time)) {
1698 $time = $timeout;
1699 }
1700
1701 $rin = '';
1702 vec($rin, fileno($fp), 1) = 1;
319ab14f 1703 ($ready, $time) = select($rin, undef, undef, $time);
2545eb61
SR
1704
1705 $line = "";
1706
1707 # try to read one char at a time
1708 while (sysread $fp, $ch, 1) {
1709 $line .= $ch;
1710 last if ($ch eq "\n");
1711 }
1712
1713 if (!length($line)) {
1714 return undef;
1715 }
1716
1717 return $line;
1718}
1719
75c3fda7 1720sub reboot_to {
bc7c5803
SR
1721 if (defined($switch_to_test)) {
1722 run_command $switch_to_test;
1723 }
1724
a75fecec 1725 if ($reboot_type eq "grub") {
c54367f9 1726 run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'";
a15ba913
SR
1727 } elsif ($reboot_type eq "grub2") {
1728 run_ssh "$grub_reboot $grub_number";
7786954c
SR
1729 } elsif ($reboot_type eq "syslinux") {
1730 run_ssh "$syslinux --once \\\"$syslinux_label\\\" $syslinux_path";
96f6a0df
SR
1731 } elsif (defined $reboot_script) {
1732 run_command "$reboot_script";
a75fecec 1733 }
96f6a0df 1734 reboot;
2545eb61
SR
1735}
1736
a57419b3
SR
1737sub get_sha1 {
1738 my ($commit) = @_;
1739
1740 doprint "git rev-list --max-count=1 $commit ... ";
1741 my $sha1 = `git rev-list --max-count=1 $commit`;
1742 my $ret = $?;
1743
1744 logit $sha1;
1745
1746 if ($ret) {
1747 doprint "FAILED\n";
1748 dodie "Failed to get git $commit";
1749 }
1750
1751 print "SUCCESS\n";
1752
1753 chomp $sha1;
1754
1755 return $sha1;
1756}
1757
5a391fbf 1758sub monitor {
2545eb61
SR
1759 my $booted = 0;
1760 my $bug = 0;
6ca996cc 1761 my $bug_ignored = 0;
5c42fc5b 1762 my $skip_call_trace = 0;
2b7d9b21 1763 my $loops;
2545eb61 1764
7faafbd6 1765 wait_for_monitor 5;
2545eb61
SR
1766
1767 my $line;
1768 my $full_line = "";
1769
7faafbd6
SR
1770 open(DMESG, "> $dmesg") or
1771 die "unable to write to $dmesg";
2545eb61 1772
75c3fda7 1773 reboot_to;
2545eb61 1774
1c8a617a
SR
1775 my $success_start;
1776 my $failure_start;
2d01b26a
SR
1777 my $monitor_start = time;
1778 my $done = 0;
f1a5b962 1779 my $version_found = 0;
1c8a617a 1780
2d01b26a 1781 while (!$done) {
2545eb61 1782
ecaf8e52
SR
1783 if ($bug && defined($stop_after_failure) &&
1784 $stop_after_failure >= 0) {
1785 my $time = $stop_after_failure - (time - $failure_start);
1786 $line = wait_for_input($monitor_fp, $time);
1787 if (!defined($line)) {
1788 doprint "bug timed out after $booted_timeout seconds\n";
1789 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
1790 last;
1791 }
1792 } elsif ($booted) {
a75fecec 1793 $line = wait_for_input($monitor_fp, $booted_timeout);
cd4f1d53
SR
1794 if (!defined($line)) {
1795 my $s = $booted_timeout == 1 ? "" : "s";
1796 doprint "Successful boot found: break after $booted_timeout second$s\n";
1797 last;
1798 }
2b7d9b21 1799 } else {
7faafbd6 1800 $line = wait_for_input($monitor_fp);
cd4f1d53
SR
1801 if (!defined($line)) {
1802 my $s = $timeout == 1 ? "" : "s";
1803 doprint "Timed out after $timeout second$s\n";
1804 last;
1805 }
2b7d9b21 1806 }
2545eb61 1807
2545eb61 1808 doprint $line;
7faafbd6 1809 print DMESG $line;
2545eb61
SR
1810
1811 # we are not guaranteed to get a full line
1812 $full_line .= $line;
1813
a75fecec 1814 if ($full_line =~ /$success_line/) {
2545eb61 1815 $booted = 1;
1c8a617a
SR
1816 $success_start = time;
1817 }
1818
1819 if ($booted && defined($stop_after_success) &&
1820 $stop_after_success >= 0) {
1821 my $now = time;
1822 if ($now - $success_start >= $stop_after_success) {
1823 doprint "Test forced to stop after $stop_after_success seconds after success\n";
1824 last;
1825 }
2545eb61
SR
1826 }
1827
5c42fc5b
SR
1828 if ($full_line =~ /\[ backtrace testing \]/) {
1829 $skip_call_trace = 1;
1830 }
1831
2545eb61 1832 if ($full_line =~ /call trace:/i) {
6ca996cc
SR
1833 if (!$bug && !$skip_call_trace) {
1834 if ($ignore_errors) {
1835 $bug_ignored = 1;
1836 } else {
1837 $bug = 1;
1838 $failure_start = time;
1839 }
1c8a617a
SR
1840 }
1841 }
1842
1843 if ($bug && defined($stop_after_failure) &&
1844 $stop_after_failure >= 0) {
1845 my $now = time;
1846 if ($now - $failure_start >= $stop_after_failure) {
1847 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
1848 last;
1849 }
5c42fc5b
SR
1850 }
1851
1852 if ($full_line =~ /\[ end of backtrace testing \]/) {
1853 $skip_call_trace = 0;
1854 }
1855
1856 if ($full_line =~ /Kernel panic -/) {
10abf118 1857 $failure_start = time;
2545eb61
SR
1858 $bug = 1;
1859 }
1860
f1a5b962
SR
1861 # Detect triple faults by testing the banner
1862 if ($full_line =~ /\bLinux version (\S+).*\n/) {
1863 if ($1 eq $version) {
1864 $version_found = 1;
1865 } elsif ($version_found && $detect_triplefault) {
1866 # We already booted into the kernel we are testing,
1867 # but now we booted into another kernel?
1868 # Consider this a triple fault.
8b513d0c 1869 doprint "Already booted in Linux kernel $version, but now\n";
f1a5b962
SR
1870 doprint "we booted into Linux kernel $1.\n";
1871 doprint "Assuming that this is a triple fault.\n";
1872 doprint "To disable this: set DETECT_TRIPLE_FAULT to 0\n";
1873 last;
1874 }
1875 }
1876
2545eb61
SR
1877 if ($line =~ /\n/) {
1878 $full_line = "";
1879 }
2d01b26a
SR
1880
1881 if ($stop_test_after > 0 && !$booted && !$bug) {
1882 if (time - $monitor_start > $stop_test_after) {
4d62bf51 1883 doprint "STOP_TEST_AFTER ($stop_test_after seconds) timed out\n";
2d01b26a
SR
1884 $done = 1;
1885 }
1886 }
2545eb61
SR
1887 }
1888
7faafbd6 1889 close(DMESG);
2545eb61 1890
a75fecec 1891 if ($bug) {
2b7d9b21 1892 return 0 if ($in_bisect);
576f627c 1893 fail "failed - got a bug report" and return 0;
2545eb61
SR
1894 }
1895
a75fecec 1896 if (!$booted) {
2b7d9b21 1897 return 0 if ($in_bisect);
576f627c 1898 fail "failed - never got a boot prompt." and return 0;
2545eb61 1899 }
5f9b6ced 1900
6ca996cc
SR
1901 if ($bug_ignored) {
1902 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
1903 }
1904
2b7d9b21 1905 return 1;
2545eb61
SR
1906}
1907
2b29b2f8
SR
1908sub eval_kernel_version {
1909 my ($option) = @_;
1910
1911 $option =~ s/\$KERNEL_VERSION/$version/g;
1912
1913 return $option;
1914}
1915
db05cfef
SR
1916sub do_post_install {
1917
1918 return if (!defined($post_install));
1919
2b29b2f8 1920 my $cp_post_install = eval_kernel_version $post_install;
db05cfef
SR
1921 run_command "$cp_post_install" or
1922 dodie "Failed to run post install";
1923}
1924
e1a6c3d7
SR
1925# Sometimes the reboot fails, and will hang. We try to ssh to the box
1926# and if we fail, we force another reboot, that should powercycle it.
1927sub test_booted {
1928 if (!run_ssh "echo testing connection") {
1929 reboot $sleep_time;
1930 }
1931}
1932
2545eb61
SR
1933sub install {
1934
e0a8742e
SR
1935 return if ($no_install);
1936
e5c2ec11
SR
1937 if (defined($pre_install)) {
1938 my $cp_pre_install = eval_kernel_version $pre_install;
1939 run_command "$cp_pre_install" or
1940 dodie "Failed to run pre install";
1941 }
1942
2b29b2f8
SR
1943 my $cp_target = eval_kernel_version $target_image;
1944
e1a6c3d7
SR
1945 test_booted;
1946
02ad2617 1947 run_scp_install "$outputdir/$build_target", "$cp_target" or
5c42fc5b 1948 dodie "failed to copy image";
2545eb61 1949
5f9b6ced 1950 my $install_mods = 0;
2545eb61 1951
5f9b6ced
SR
1952 # should we process modules?
1953 $install_mods = 0;
51ad1dd1 1954 open(IN, "$output_config") or dodie("Can't read config file");
5f9b6ced
SR
1955 while (<IN>) {
1956 if (/CONFIG_MODULES(=y)?/) {
8bc5e4ea
SR
1957 if (defined($1)) {
1958 $install_mods = 1;
1959 last;
1960 }
5c42fc5b 1961 }
5f9b6ced
SR
1962 }
1963 close(IN);
5c42fc5b 1964
5f9b6ced 1965 if (!$install_mods) {
db05cfef 1966 do_post_install;
5f9b6ced
SR
1967 doprint "No modules needed\n";
1968 return;
1969 }
2545eb61 1970
627977d8 1971 run_command "$make INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=$tmpdir modules_install" or
5f9b6ced 1972 dodie "Failed to install modules";
5c42fc5b 1973
5f9b6ced 1974 my $modlib = "/lib/modules/$version";
a57419b3 1975 my $modtar = "ktest-mods.tar.bz2";
5c42fc5b 1976
e48c5293 1977 run_ssh "rm -rf $modlib" or
5f9b6ced 1978 dodie "failed to remove old mods: $modlib";
5c42fc5b 1979
5f9b6ced 1980 # would be nice if scp -r did not follow symbolic links
a75fecec 1981 run_command "cd $tmpdir && tar -cjf $modtar lib/modules/$version" or
5f9b6ced
SR
1982 dodie "making tarball";
1983
02ad2617 1984 run_scp_mod "$tmpdir/$modtar", "/tmp" or
5f9b6ced
SR
1985 dodie "failed to copy modules";
1986
a75fecec 1987 unlink "$tmpdir/$modtar";
5f9b6ced 1988
e7b13441 1989 run_ssh "'(cd / && tar xjf /tmp/$modtar)'" or
5f9b6ced 1990 dodie "failed to tar modules";
2545eb61 1991
e48c5293 1992 run_ssh "rm -f /tmp/$modtar";
8b37ca8c 1993
db05cfef 1994 do_post_install;
2545eb61
SR
1995}
1996
ddf607e5
SR
1997sub get_version {
1998 # get the release name
683a3e64 1999 return if ($have_version);
ddf607e5
SR
2000 doprint "$make kernelrelease ... ";
2001 $version = `$make kernelrelease | tail -1`;
2002 chomp($version);
2003 doprint "$version\n";
683a3e64 2004 $have_version = 1;
ddf607e5
SR
2005}
2006
2007sub start_monitor_and_boot {
9f7424cc 2008 # Make sure the stable kernel has finished booting
319ab14f
SRRH
2009
2010 # Install bisects, don't need console
2011 if (defined $console) {
2012 start_monitor;
2013 wait_for_monitor 5;
2014 end_monitor;
2015 }
9f7424cc 2016
ddf607e5
SR
2017 get_grub_index;
2018 get_version;
2019 install;
2020
319ab14f 2021 start_monitor if (defined $console);
ddf607e5
SR
2022 return monitor;
2023}
2024
4283b169
SRRH
2025my $check_build_re = ".*:.*(warning|error|Error):.*";
2026my $utf8_quote = "\\x{e2}\\x{80}(\\x{98}|\\x{99})";
2027
7328735c
SRRH
2028sub process_warning_line {
2029 my ($line) = @_;
2030
2031 chomp $line;
2032
2033 # for distcc heterogeneous systems, some compilers
2034 # do things differently causing warning lines
2035 # to be slightly different. This makes an attempt
2036 # to fixe those issues.
2037
2038 # chop off the index into the line
2039 # using distcc, some compilers give different indexes
2040 # depending on white space
2041 $line =~ s/^(\s*\S+:\d+:)\d+/$1/;
2042
2043 # Some compilers use UTF-8 extended for quotes and some don't.
2044 $line =~ s/$utf8_quote/'/g;
2045
2046 return $line;
2047}
2048
4283b169
SRRH
2049# Read buildlog and check against warnings file for any
2050# new warnings.
2051#
2052# Returns 1 if OK
2053# 0 otherwise
6c5ee0be 2054sub check_buildlog {
4283b169
SRRH
2055 return 1 if (!defined $warnings_file);
2056
2057 my %warnings_list;
2058
2059 # Failed builds should not reboot the target
2060 my $save_no_reboot = $no_reboot;
2061 $no_reboot = 1;
2062
2063 if (-f $warnings_file) {
2064 open(IN, $warnings_file) or
2065 dodie "Error opening $warnings_file";
2066
2067 while (<IN>) {
2068 if (/$check_build_re/) {
7328735c
SRRH
2069 my $warning = process_warning_line $_;
2070
2071 $warnings_list{$warning} = 1;
4283b169
SRRH
2072 }
2073 }
2074 close(IN);
2075 }
2076
2077 # If warnings file didn't exist, and WARNINGS_FILE exist,
2078 # then we fail on any warning!
2079
2080 open(IN, $buildlog) or dodie "Can't open $buildlog";
2081 while (<IN>) {
2082 if (/$check_build_re/) {
7328735c 2083 my $warning = process_warning_line $_;
4283b169 2084
7328735c 2085 if (!defined $warnings_list{$warning}) {
4283b169
SRRH
2086 fail "New warning found (not in $warnings_file)\n$_\n";
2087 $no_reboot = $save_no_reboot;
2088 return 0;
2089 }
2090 }
2091 }
2092 $no_reboot = $save_no_reboot;
2093 close(IN);
2094}
2095
2096sub check_patch_buildlog {
6c5ee0be
SR
2097 my ($patch) = @_;
2098
6c5ee0be
SR
2099 my @files = `git show $patch | diffstat -l`;
2100
35275685
SRRH
2101 foreach my $file (@files) {
2102 chomp $file;
2103 }
2104
6c5ee0be
SR
2105 open(IN, "git show $patch |") or
2106 dodie "failed to show $patch";
2107 while (<IN>) {
2108 if (m,^--- a/(.*),) {
2109 chomp $1;
2110 $files[$#files] = $1;
2111 }
2112 }
2113 close(IN);
2114
2115 open(IN, $buildlog) or dodie "Can't open $buildlog";
2116 while (<IN>) {
2117 if (/^\s*(.*?):.*(warning|error)/) {
2118 my $err = $1;
2119 foreach my $file (@files) {
a75fecec 2120 my $fullpath = "$builddir/$file";
6c5ee0be 2121 if ($file eq $err || $fullpath eq $err) {
2b7d9b21 2122 fail "$file built with warnings" and return 0;
6c5ee0be
SR
2123 }
2124 }
2125 }
2126 }
2127 close(IN);
2b7d9b21
SR
2128
2129 return 1;
6c5ee0be
SR
2130}
2131
fcb3f16a
SR
2132sub apply_min_config {
2133 my $outconfig = "$output_config.new";
2134
2135 # Read the config file and remove anything that
2136 # is in the force_config hash (from minconfig and others)
2137 # then add the force config back.
2138
2139 doprint "Applying minimum configurations into $output_config.new\n";
2140
2141 open (OUT, ">$outconfig") or
2142 dodie "Can't create $outconfig";
2143
2144 if (-f $output_config) {
2145 open (IN, $output_config) or
2146 dodie "Failed to open $output_config";
2147 while (<IN>) {
2148 if (/^(# )?(CONFIG_[^\s=]*)/) {
2149 next if (defined($force_config{$2}));
2150 }
2151 print OUT;
2152 }
2153 close IN;
2154 }
2155 foreach my $config (keys %force_config) {
2156 print OUT "$force_config{$config}\n";
2157 }
2158 close OUT;
2159
2160 run_command "mv $outconfig $output_config";
2161}
2162
612b9e9b 2163sub make_oldconfig {
612b9e9b 2164
4c4ab120
SR
2165 my @force_list = keys %force_config;
2166
2167 if ($#force_list >= 0) {
2168 apply_min_config;
2169 }
fcb3f16a 2170
fb16d891
AL
2171 if (!run_command "$make olddefconfig") {
2172 # Perhaps olddefconfig doesn't exist in this version of the kernel
18925170
SR
2173 # try oldnoconfig
2174 doprint "olddefconfig failed, trying make oldnoconfig\n";
2175 if (!run_command "$make oldnoconfig") {
2176 doprint "oldnoconfig failed, trying yes '' | make oldconfig\n";
2177 # try a yes '' | oldconfig
2178 run_command "yes '' | $make oldconfig" or
2179 dodie "failed make config oldconfig";
2180 }
612b9e9b
SR
2181 }
2182}
2183
fcb3f16a
SR
2184# read a config file and use this to force new configs.
2185sub load_force_config {
2186 my ($config) = @_;
2187
cf79fab6 2188 doprint "Loading force configs from $config\n";
fcb3f16a
SR
2189 open(IN, $config) or
2190 dodie "failed to read $config";
2191 while (<IN>) {
2192 chomp;
2193 if (/^(CONFIG[^\s=]*)(\s*=.*)/) {
2194 $force_config{$1} = $_;
2195 } elsif (/^# (CONFIG_\S*) is not set/) {
2196 $force_config{$1} = $_;
2197 }
2198 }
2199 close IN;
2200}
2201
2545eb61
SR
2202sub build {
2203 my ($type) = @_;
5c42fc5b 2204
7faafbd6
SR
2205 unlink $buildlog;
2206
4ab1cce5
SR
2207 # Failed builds should not reboot the target
2208 my $save_no_reboot = $no_reboot;
2209 $no_reboot = 1;
2210
683a3e64
SR
2211 # Calculate a new version from here.
2212 $have_version = 0;
2213
0bd6c1a3
SR
2214 if (defined($pre_build)) {
2215 my $ret = run_command $pre_build;
2216 if (!$ret && defined($pre_build_die) &&
2217 $pre_build_die) {
2218 dodie "failed to pre_build\n";
2219 }
2220 }
2221
75c3fda7 2222 if ($type =~ /^useconfig:(.*)/) {
51ad1dd1 2223 run_command "cp $1 $output_config" or
75c3fda7 2224 dodie "could not copy $1 to .config";
5f9b6ced 2225
75c3fda7
SR
2226 $type = "oldconfig";
2227 }
2228
5c42fc5b
SR
2229 # old config can ask questions
2230 if ($type eq "oldconfig") {
fb16d891 2231 $type = "olddefconfig";
75c3fda7
SR
2232
2233 # allow for empty configs
51ad1dd1 2234 run_command "touch $output_config";
75c3fda7 2235
13488231
AJ
2236 if (!$noclean) {
2237 run_command "mv $output_config $outputdir/config_temp" or
2238 dodie "moving .config";
2545eb61 2239
13488231 2240 run_command "$make mrproper" or dodie "make mrproper";
2545eb61 2241
13488231
AJ
2242 run_command "mv $outputdir/config_temp $output_config" or
2243 dodie "moving config_temp";
2244 }
5c42fc5b
SR
2245
2246 } elsif (!$noclean) {
51ad1dd1 2247 unlink "$output_config";
5f9b6ced 2248 run_command "$make mrproper" or
5c42fc5b 2249 dodie "make mrproper";
5c42fc5b 2250 }
2545eb61
SR
2251
2252 # add something to distinguish this build
a75fecec
SR
2253 open(OUT, "> $outputdir/localversion") or dodie("Can't make localversion file");
2254 print OUT "$localversion\n";
2545eb61
SR
2255 close(OUT);
2256
5f9b6ced 2257 if (defined($minconfig)) {
fcb3f16a 2258 load_force_config($minconfig);
2545eb61
SR
2259 }
2260
fb16d891 2261 if ($type ne "olddefconfig") {
fcb3f16a 2262 run_command "$make $type" or
612b9e9b
SR
2263 dodie "failed make config";
2264 }
fcb3f16a
SR
2265 # Run old config regardless, to enforce min configurations
2266 make_oldconfig;
2545eb61 2267
a75fecec 2268 $redirect = "$buildlog";
0bd6c1a3
SR
2269 my $build_ret = run_command "$make $build_options";
2270 undef $redirect;
2271
2272 if (defined($post_build)) {
683a3e64
SR
2273 # Because a post build may change the kernel version
2274 # do it now.
2275 get_version;
0bd6c1a3
SR
2276 my $ret = run_command $post_build;
2277 if (!$ret && defined($post_build_die) &&
2278 $post_build_die) {
2279 dodie "failed to post_build\n";
2280 }
2281 }
2282
2283 if (!$build_ret) {
5f9b6ced 2284 # bisect may need this to pass
4ab1cce5
SR
2285 if ($in_bisect) {
2286 $no_reboot = $save_no_reboot;
2287 return 0;
2288 }
2b7d9b21 2289 fail "failed build" and return 0;
2545eb61 2290 }
5f9b6ced 2291
4ab1cce5
SR
2292 $no_reboot = $save_no_reboot;
2293
2b7d9b21 2294 return 1;
2545eb61
SR
2295}
2296
75c3fda7 2297sub halt {
e48c5293 2298 if (!run_ssh "halt" or defined($power_off)) {
576f627c
SR
2299 if (defined($poweroff_after_halt)) {
2300 sleep $poweroff_after_halt;
2301 run_command "$power_off";
2302 }
2303 } else {
75c3fda7 2304 # nope? the zap it!
a75fecec 2305 run_command "$power_off";
75c3fda7
SR
2306 }
2307}
2308
5f9b6ced
SR
2309sub success {
2310 my ($i) = @_;
2311
921ed4c7
SR
2312 if (defined($post_test)) {
2313 run_command $post_test;
2314 }
2315
e48c5293
SR
2316 $successes++;
2317
9064af52
SR
2318 my $name = "";
2319
2320 if (defined($test_name)) {
2321 $name = " ($test_name)";
2322 }
2323
5f9b6ced
SR
2324 doprint "\n\n*******************************************\n";
2325 doprint "*******************************************\n";
9064af52 2326 doprint "KTEST RESULT: TEST $i$name SUCCESS!!!! **\n";
5f9b6ced
SR
2327 doprint "*******************************************\n";
2328 doprint "*******************************************\n";
2329
de5b6e3b
RV
2330 if (defined($store_successes)) {
2331 save_logs "success", $store_successes;
2332 }
2333
576f627c 2334 if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) {
a75fecec 2335 doprint "Reboot and wait $sleep_time seconds\n";
bc7c5803 2336 reboot_to_good $sleep_time;
5f9b6ced
SR
2337 }
2338}
2339
c960bb9f
SR
2340sub answer_bisect {
2341 for (;;) {
2342 doprint "Pass or fail? [p/f]";
2343 my $ans = <STDIN>;
2344 chomp $ans;
2345 if ($ans eq "p" || $ans eq "P") {
2346 return 1;
2347 } elsif ($ans eq "f" || $ans eq "F") {
2348 return 0;
2349 } else {
2350 print "Please answer 'P' or 'F'\n";
2351 }
2352 }
2353}
2354
5a391fbf 2355sub child_run_test {
7faafbd6 2356 my $failed = 0;
5a391fbf 2357
7faafbd6 2358 # child should have no power
a75fecec
SR
2359 $reboot_on_error = 0;
2360 $poweroff_on_error = 0;
2361 $die_on_failure = 1;
7faafbd6 2362
a9dd5d63 2363 $redirect = "$testlog";
7faafbd6 2364 run_command $run_test or $failed = 1;
a9dd5d63
RV
2365 undef $redirect;
2366
5a391fbf
SR
2367 exit $failed;
2368}
2369
2370my $child_done;
2371
2372sub child_finished {
2373 $child_done = 1;
2374}
2375
2376sub do_run_test {
2377 my $child_pid;
2378 my $child_exit;
5a391fbf
SR
2379 my $line;
2380 my $full_line;
2381 my $bug = 0;
9b1d367d 2382 my $bug_ignored = 0;
5a391fbf 2383
7faafbd6 2384 wait_for_monitor 1;
5a391fbf 2385
7faafbd6 2386 doprint "run test $run_test\n";
5a391fbf
SR
2387
2388 $child_done = 0;
2389
2390 $SIG{CHLD} = qw(child_finished);
2391
2392 $child_pid = fork;
2393
2394 child_run_test if (!$child_pid);
2395
2396 $full_line = "";
2397
2398 do {
7faafbd6 2399 $line = wait_for_input($monitor_fp, 1);
5a391fbf
SR
2400 if (defined($line)) {
2401
2402 # we are not guaranteed to get a full line
2403 $full_line .= $line;
8ea0e063 2404 doprint $line;
5a391fbf
SR
2405
2406 if ($full_line =~ /call trace:/i) {
9b1d367d
SR
2407 if ($ignore_errors) {
2408 $bug_ignored = 1;
2409 } else {
2410 $bug = 1;
2411 }
5a391fbf
SR
2412 }
2413
2414 if ($full_line =~ /Kernel panic -/) {
2415 $bug = 1;
2416 }
2417
2418 if ($line =~ /\n/) {
2419 $full_line = "";
2420 }
2421 }
2422 } while (!$child_done && !$bug);
2423
9b1d367d
SR
2424 if (!$bug && $bug_ignored) {
2425 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
2426 }
2427
5a391fbf 2428 if ($bug) {
8ea0e063
SR
2429 my $failure_start = time;
2430 my $now;
2431 do {
2432 $line = wait_for_input($monitor_fp, 1);
2433 if (defined($line)) {
2434 doprint $line;
2435 }
2436 $now = time;
2437 if ($now - $failure_start >= $stop_after_failure) {
2438 last;
2439 }
2440 } while (defined($line));
2441
5a391fbf
SR
2442 doprint "Detected kernel crash!\n";
2443 # kill the child with extreme prejudice
2444 kill 9, $child_pid;
2445 }
2446
2447 waitpid $child_pid, 0;
2448 $child_exit = $?;
2449
c5dacb88
SR
2450 if (!$bug && $in_bisect) {
2451 if (defined($bisect_ret_good)) {
2452 if ($child_exit == $bisect_ret_good) {
2453 return 1;
2454 }
2455 }
2456 if (defined($bisect_ret_skip)) {
2457 if ($child_exit == $bisect_ret_skip) {
2458 return -1;
2459 }
2460 }
2461 if (defined($bisect_ret_abort)) {
2462 if ($child_exit == $bisect_ret_abort) {
2463 fail "test abort" and return -2;
2464 }
2465 }
2466 if (defined($bisect_ret_bad)) {
2467 if ($child_exit == $bisect_ret_skip) {
2468 return 0;
2469 }
2470 }
2471 if (defined($bisect_ret_default)) {
2472 if ($bisect_ret_default eq "good") {
2473 return 1;
2474 } elsif ($bisect_ret_default eq "bad") {
2475 return 0;
2476 } elsif ($bisect_ret_default eq "skip") {
2477 return -1;
2478 } elsif ($bisect_ret_default eq "abort") {
2479 return -2;
2480 } else {
2481 fail "unknown default action: $bisect_ret_default"
2482 and return -2;
2483 }
2484 }
2485 }
2486
5a391fbf 2487 if ($bug || $child_exit) {
2b7d9b21
SR
2488 return 0 if $in_bisect;
2489 fail "test failed" and return 0;
5a391fbf 2490 }
2b7d9b21 2491 return 1;
5a391fbf
SR
2492}
2493
a75fecec
SR
2494sub run_git_bisect {
2495 my ($command) = @_;
2496
2497 doprint "$command ... ";
2498
2499 my $output = `$command 2>&1`;
2500 my $ret = $?;
2501
2502 logit $output;
2503
2504 if ($ret) {
2505 doprint "FAILED\n";
2506 dodie "Failed to git bisect";
2507 }
2508
2509 doprint "SUCCESS\n";
2510 if ($output =~ m/^(Bisecting: .*\(roughly \d+ steps?\))\s+\[([[:xdigit:]]+)\]/) {
2511 doprint "$1 [$2]\n";
2512 } elsif ($output =~ m/^([[:xdigit:]]+) is the first bad commit/) {
b5f4aea6 2513 $bisect_bad_commit = $1;
a75fecec
SR
2514 doprint "Found bad commit... $1\n";
2515 return 0;
2516 } else {
2517 # we already logged it, just print it now.
2518 print $output;
2519 }
2520
2521 return 1;
2522}
2523
c23dca7c
SR
2524sub bisect_reboot {
2525 doprint "Reboot and sleep $bisect_sleep_time seconds\n";
bc7c5803 2526 reboot_to_good $bisect_sleep_time;
c23dca7c
SR
2527}
2528
2529# returns 1 on success, 0 on failure, -1 on skip
0a05c769
SR
2530sub run_bisect_test {
2531 my ($type, $buildtype) = @_;
5f9b6ced 2532
2b7d9b21 2533 my $failed = 0;
5f9b6ced
SR
2534 my $result;
2535 my $output;
2536 my $ret;
2537
0a05c769
SR
2538 $in_bisect = 1;
2539
2540 build $buildtype or $failed = 1;
5f9b6ced
SR
2541
2542 if ($type ne "build") {
c23dca7c
SR
2543 if ($failed && $bisect_skip) {
2544 $in_bisect = 0;
2545 return -1;
2546 }
7faafbd6 2547 dodie "Failed on build" if $failed;
5f9b6ced
SR
2548
2549 # Now boot the box
ddf607e5 2550 start_monitor_and_boot or $failed = 1;
5f9b6ced
SR
2551
2552 if ($type ne "boot") {
c23dca7c
SR
2553 if ($failed && $bisect_skip) {
2554 end_monitor;
2555 bisect_reboot;
2556 $in_bisect = 0;
2557 return -1;
2558 }
7faafbd6 2559 dodie "Failed on boot" if $failed;
5a391fbf 2560
2b7d9b21 2561 do_run_test or $failed = 1;
5f9b6ced 2562 }
7faafbd6 2563 end_monitor;
5f9b6ced
SR
2564 }
2565
2566 if ($failed) {
0a05c769 2567 $result = 0;
5f9b6ced 2568 } else {
0a05c769
SR
2569 $result = 1;
2570 }
4025bc62
SR
2571
2572 # reboot the box to a kernel we can ssh to
2573 if ($type ne "build") {
2574 bisect_reboot;
2575 }
0a05c769
SR
2576 $in_bisect = 0;
2577
2578 return $result;
2579}
2580
2581sub run_bisect {
2582 my ($type) = @_;
2583 my $buildtype = "oldconfig";
2584
2585 # We should have a minconfig to use?
2586 if (defined($minconfig)) {
2587 $buildtype = "useconfig:$minconfig";
5f9b6ced
SR
2588 }
2589
961d9cac
SRRH
2590 # If the user sets bisect_tries to less than 1, then no tries
2591 # is a success.
2592 my $ret = 1;
0a05c769 2593
961d9cac
SRRH
2594 # Still let the user manually decide that though.
2595 if ($bisect_tries < 1 && $bisect_manual) {
c960bb9f
SR
2596 $ret = answer_bisect;
2597 }
0a05c769 2598
961d9cac
SRRH
2599 for (my $i = 0; $i < $bisect_tries; $i++) {
2600 if ($bisect_tries > 1) {
2601 my $t = $i + 1;
2602 doprint("Running bisect trial $t of $bisect_tries:\n");
2603 }
2604 $ret = run_bisect_test $type, $buildtype;
2605
2606 if ($bisect_manual) {
2607 $ret = answer_bisect;
2608 }
2609
2610 last if (!$ret);
2611 }
2612
d6ce2a0b 2613 # Are we looking for where it worked, not failed?
5158ba3e 2614 if ($reverse_bisect && $ret >= 0) {
0a05c769 2615 $ret = !$ret;
d6ce2a0b
SR
2616 }
2617
c23dca7c 2618 if ($ret > 0) {
0a05c769 2619 return "good";
c23dca7c 2620 } elsif ($ret == 0) {
0a05c769 2621 return "bad";
c23dca7c
SR
2622 } elsif ($bisect_skip) {
2623 doprint "HIT A BAD COMMIT ... SKIPPING\n";
2624 return "skip";
0a05c769 2625 }
5f9b6ced
SR
2626}
2627
dad98754
SR
2628sub update_bisect_replay {
2629 my $tmp_log = "$tmpdir/ktest_bisect_log";
2630 run_command "git bisect log > $tmp_log" or
2631 die "can't create bisect log";
2632 return $tmp_log;
2633}
2634
5f9b6ced
SR
2635sub bisect {
2636 my ($i) = @_;
2637
2638 my $result;
2639
b5f4aea6
SR
2640 die "BISECT_GOOD[$i] not defined\n" if (!defined($bisect_good));
2641 die "BISECT_BAD[$i] not defined\n" if (!defined($bisect_bad));
2642 die "BISECT_TYPE[$i] not defined\n" if (!defined($bisect_type));
5f9b6ced 2643
b5f4aea6
SR
2644 my $good = $bisect_good;
2645 my $bad = $bisect_bad;
2646 my $type = $bisect_type;
2647 my $start = $bisect_start;
2648 my $replay = $bisect_replay;
2649 my $start_files = $bisect_files;
3410f6fd
SR
2650
2651 if (defined($start_files)) {
2652 $start_files = " -- " . $start_files;
2653 } else {
2654 $start_files = "";
2655 }
5f9b6ced 2656
a57419b3
SR
2657 # convert to true sha1's
2658 $good = get_sha1($good);
2659 $bad = get_sha1($bad);
2660
b5f4aea6 2661 if (defined($bisect_reverse) && $bisect_reverse == 1) {
d6ce2a0b
SR
2662 doprint "Performing a reverse bisect (bad is good, good is bad!)\n";
2663 $reverse_bisect = 1;
2664 } else {
2665 $reverse_bisect = 0;
2666 }
2667
a75fecec
SR
2668 # Can't have a test without having a test to run
2669 if ($type eq "test" && !defined($run_test)) {
2670 $type = "boot";
2671 }
2672
dad98754
SR
2673 # Check if a bisect was running
2674 my $bisect_start_file = "$builddir/.git/BISECT_START";
2675
b5f4aea6 2676 my $check = $bisect_check;
dad98754
SR
2677 my $do_check = defined($check) && $check ne "0";
2678
2679 if ( -f $bisect_start_file ) {
2680 print "Bisect in progress found\n";
2681 if ($do_check) {
2682 print " If you say yes, then no checks of good or bad will be done\n";
2683 }
2684 if (defined($replay)) {
2685 print "** BISECT_REPLAY is defined in config file **";
2686 print " Ignore config option and perform new git bisect log?\n";
2687 if (read_ync " (yes, no, or cancel) ") {
2688 $replay = update_bisect_replay;
2689 $do_check = 0;
2690 }
2691 } elsif (read_yn "read git log and continue?") {
2692 $replay = update_bisect_replay;
2693 $do_check = 0;
2694 }
2695 }
2696
2697 if ($do_check) {
a75fecec
SR
2698
2699 # get current HEAD
a57419b3 2700 my $head = get_sha1("HEAD");
a75fecec
SR
2701
2702 if ($check ne "good") {
2703 doprint "TESTING BISECT BAD [$bad]\n";
2704 run_command "git checkout $bad" or
2705 die "Failed to checkout $bad";
2706
2707 $result = run_bisect $type;
2708
2709 if ($result ne "bad") {
2710 fail "Tested BISECT_BAD [$bad] and it succeeded" and return 0;
2711 }
2712 }
2713
2714 if ($check ne "bad") {
2715 doprint "TESTING BISECT GOOD [$good]\n";
2716 run_command "git checkout $good" or
2717 die "Failed to checkout $good";
2718
2719 $result = run_bisect $type;
2720
2721 if ($result ne "good") {
2722 fail "Tested BISECT_GOOD [$good] and it failed" and return 0;
2723 }
2724 }
2725
2726 # checkout where we started
2727 run_command "git checkout $head" or
2728 die "Failed to checkout $head";
2729 }
2730
3410f6fd 2731 run_command "git bisect start$start_files" or
a75fecec 2732 dodie "could not start bisect";
5f9b6ced
SR
2733
2734 run_command "git bisect good $good" or
a75fecec 2735 dodie "could not set bisect good to $good";
5f9b6ced 2736
a75fecec
SR
2737 run_git_bisect "git bisect bad $bad" or
2738 dodie "could not set bisect bad to $bad";
5f9b6ced 2739
a75fecec
SR
2740 if (defined($replay)) {
2741 run_command "git bisect replay $replay" or
2742 dodie "failed to run replay";
5a391fbf
SR
2743 }
2744
a75fecec
SR
2745 if (defined($start)) {
2746 run_command "git checkout $start" or
2747 dodie "failed to checkout $start";
2748 }
2749
2750 my $test;
5f9b6ced
SR
2751 do {
2752 $result = run_bisect $type;
a75fecec
SR
2753 $test = run_git_bisect "git bisect $result";
2754 } while ($test);
5f9b6ced
SR
2755
2756 run_command "git bisect log" or
2757 dodie "could not capture git bisect log";
2758
2759 run_command "git bisect reset" or
2760 dodie "could not reset git bisect";
2761
b5f4aea6 2762 doprint "Bad commit was [$bisect_bad_commit]\n";
5f9b6ced 2763
0a05c769
SR
2764 success $i;
2765}
2766
cf79fab6
SR
2767# config_ignore holds the configs that were set (or unset) for
2768# a good config and we will ignore these configs for the rest
2769# of a config bisect. These configs stay as they were.
0a05c769 2770my %config_ignore;
cf79fab6
SR
2771
2772# config_set holds what all configs were set as.
0a05c769
SR
2773my %config_set;
2774
cf79fab6
SR
2775# config_off holds the set of configs that the bad config had disabled.
2776# We need to record them and set them in the .config when running
fb16d891 2777# olddefconfig, because olddefconfig keeps the defaults.
cf79fab6
SR
2778my %config_off;
2779
2780# config_off_tmp holds a set of configs to turn off for now
2781my @config_off_tmp;
2782
2783# config_list is the set of configs that are being tested
0a05c769
SR
2784my %config_list;
2785my %null_config;
2786
2787my %dependency;
2788
4c4ab120
SR
2789sub assign_configs {
2790 my ($hash, $config) = @_;
0a05c769
SR
2791
2792 open (IN, $config)
2793 or dodie "Failed to read $config";
2794
2795 while (<IN>) {
9bf71749 2796 if (/^((CONFIG\S*)=.*)/) {
4c4ab120 2797 ${$hash}{$2} = $1;
0a05c769
SR
2798 }
2799 }
2800
2801 close(IN);
2802}
2803
4c4ab120
SR
2804sub process_config_ignore {
2805 my ($config) = @_;
2806
2807 assign_configs \%config_ignore, $config;
2808}
2809
0a05c769
SR
2810sub read_current_config {
2811 my ($config_ref) = @_;
2812
2813 %{$config_ref} = ();
2814 undef %{$config_ref};
2815
2816 my @key = keys %{$config_ref};
2817 if ($#key >= 0) {
2818 print "did not delete!\n";
2819 exit;
2820 }
2821 open (IN, "$output_config");
2822
2823 while (<IN>) {
2824 if (/^(CONFIG\S+)=(.*)/) {
2825 ${$config_ref}{$1} = $2;
2826 }
2827 }
2828 close(IN);
2829}
2830
2831sub get_dependencies {
2832 my ($config) = @_;
2833
2834 my $arr = $dependency{$config};
2835 if (!defined($arr)) {
2836 return ();
2837 }
2838
2839 my @deps = @{$arr};
2840
2841 foreach my $dep (@{$arr}) {
2842 print "ADD DEP $dep\n";
2843 @deps = (@deps, get_dependencies $dep);
2844 }
2845
2846 return @deps;
2847}
2848
2849sub create_config {
2850 my @configs = @_;
2851
2852 open(OUT, ">$output_config") or dodie "Can not write to $output_config";
2853
2854 foreach my $config (@configs) {
2855 print OUT "$config_set{$config}\n";
2856 my @deps = get_dependencies $config;
2857 foreach my $dep (@deps) {
2858 print OUT "$config_set{$dep}\n";
2859 }
2860 }
2861
cf79fab6
SR
2862 # turn off configs to keep off
2863 foreach my $config (keys %config_off) {
2864 print OUT "# $config is not set\n";
2865 }
2866
2867 # turn off configs that should be off for now
2868 foreach my $config (@config_off_tmp) {
2869 print OUT "# $config is not set\n";
2870 }
2871
0a05c769
SR
2872 foreach my $config (keys %config_ignore) {
2873 print OUT "$config_ignore{$config}\n";
2874 }
2875 close(OUT);
2876
fcb3f16a 2877 make_oldconfig;
0a05c769
SR
2878}
2879
2880sub compare_configs {
2881 my (%a, %b) = @_;
2882
2883 foreach my $item (keys %a) {
2884 if (!defined($b{$item})) {
2885 print "diff $item\n";
2886 return 1;
2887 }
2888 delete $b{$item};
2889 }
2890
2891 my @keys = keys %b;
2892 if ($#keys) {
2893 print "diff2 $keys[0]\n";
2894 }
2895 return -1 if ($#keys >= 0);
2896
2897 return 0;
2898}
2899
2900sub run_config_bisect_test {
2901 my ($type) = @_;
2902
2903 return run_bisect_test $type, "oldconfig";
2904}
2905
2906sub process_passed {
2907 my (%configs) = @_;
2908
2909 doprint "These configs had no failure: (Enabling them for further compiles)\n";
2910 # Passed! All these configs are part of a good compile.
2911 # Add them to the min options.
2912 foreach my $config (keys %configs) {
2913 if (defined($config_list{$config})) {
2914 doprint " removing $config\n";
2915 $config_ignore{$config} = $config_list{$config};
2916 delete $config_list{$config};
2917 }
2918 }
f1a27850
SR
2919 doprint "config copied to $outputdir/config_good\n";
2920 run_command "cp -f $output_config $outputdir/config_good";
0a05c769
SR
2921}
2922
2923sub process_failed {
2924 my ($config) = @_;
2925
2926 doprint "\n\n***************************************\n";
2927 doprint "Found bad config: $config\n";
2928 doprint "***************************************\n\n";
2929}
2930
2931sub run_config_bisect {
2932
2933 my @start_list = keys %config_list;
2934
2935 if ($#start_list < 0) {
2936 doprint "No more configs to test!!!\n";
2937 return -1;
2938 }
2939
2940 doprint "***** RUN TEST ***\n";
b5f4aea6 2941 my $type = $config_bisect_type;
0a05c769
SR
2942 my $ret;
2943 my %current_config;
2944
2945 my $count = $#start_list + 1;
2946 doprint " $count configs to test\n";
2947
2948 my $half = int($#start_list / 2);
2949
2950 do {
2951 my @tophalf = @start_list[0 .. $half];
2952
cf79fab6
SR
2953 # keep the bottom half off
2954 if ($half < $#start_list) {
2955 @config_off_tmp = @start_list[$half + 1 .. $#start_list];
2956 } else {
2957 @config_off_tmp = ();
2958 }
2959
0a05c769
SR
2960 create_config @tophalf;
2961 read_current_config \%current_config;
2962
2963 $count = $#tophalf + 1;
2964 doprint "Testing $count configs\n";
2965 my $found = 0;
2966 # make sure we test something
2967 foreach my $config (@tophalf) {
2968 if (defined($current_config{$config})) {
2969 logit " $config\n";
2970 $found = 1;
2971 }
2972 }
2973 if (!$found) {
2974 # try the other half
2975 doprint "Top half produced no set configs, trying bottom half\n";
cf79fab6
SR
2976
2977 # keep the top half off
2978 @config_off_tmp = @tophalf;
4c8cc55b 2979 @tophalf = @start_list[$half + 1 .. $#start_list];
cf79fab6 2980
0a05c769
SR
2981 create_config @tophalf;
2982 read_current_config \%current_config;
2983 foreach my $config (@tophalf) {
2984 if (defined($current_config{$config})) {
2985 logit " $config\n";
2986 $found = 1;
2987 }
2988 }
2989 if (!$found) {
2990 doprint "Failed: Can't make new config with current configs\n";
2991 foreach my $config (@start_list) {
2992 doprint " CONFIG: $config\n";
2993 }
2994 return -1;
2995 }
2996 $count = $#tophalf + 1;
2997 doprint "Testing $count configs\n";
2998 }
2999
3000 $ret = run_config_bisect_test $type;
c960bb9f
SR
3001 if ($bisect_manual) {
3002 $ret = answer_bisect;
3003 }
0a05c769
SR
3004 if ($ret) {
3005 process_passed %current_config;
3006 return 0;
3007 }
3008
3009 doprint "This config had a failure.\n";
3010 doprint "Removing these configs that were not set in this config:\n";
f1a27850
SR
3011 doprint "config copied to $outputdir/config_bad\n";
3012 run_command "cp -f $output_config $outputdir/config_bad";
0a05c769
SR
3013
3014 # A config exists in this group that was bad.
3015 foreach my $config (keys %config_list) {
3016 if (!defined($current_config{$config})) {
3017 doprint " removing $config\n";
3018 delete $config_list{$config};
3019 }
3020 }
3021
3022 @start_list = @tophalf;
3023
3024 if ($#start_list == 0) {
3025 process_failed $start_list[0];
3026 return 1;
3027 }
3028
3029 # remove half the configs we are looking at and see if
3030 # they are good.
3031 $half = int($#start_list / 2);
4c8cc55b 3032 } while ($#start_list > 0);
0a05c769 3033
c960bb9f
SR
3034 # we found a single config, try it again unless we are running manually
3035
3036 if ($bisect_manual) {
3037 process_failed $start_list[0];
3038 return 1;
3039 }
3040
0a05c769
SR
3041 my @tophalf = @start_list[0 .. 0];
3042
3043 $ret = run_config_bisect_test $type;
3044 if ($ret) {
3045 process_passed %current_config;
3046 return 0;
3047 }
3048
3049 process_failed $start_list[0];
3050 return 1;
3051}
3052
3053sub config_bisect {
3054 my ($i) = @_;
3055
b5f4aea6 3056 my $start_config = $config_bisect;
0a05c769
SR
3057
3058 my $tmpconfig = "$tmpdir/use_config";
3059
30f75da5
SR
3060 if (defined($config_bisect_good)) {
3061 process_config_ignore $config_bisect_good;
3062 }
3063
0a05c769
SR
3064 # Make the file with the bad config and the min config
3065 if (defined($minconfig)) {
3066 # read the min config for things to ignore
3067 run_command "cp $minconfig $tmpconfig" or
3068 dodie "failed to copy $minconfig to $tmpconfig";
3069 } else {
3070 unlink $tmpconfig;
3071 }
3072
0a05c769 3073 if (-f $tmpconfig) {
fcb3f16a 3074 load_force_config($tmpconfig);
0a05c769
SR
3075 process_config_ignore $tmpconfig;
3076 }
3077
3078 # now process the start config
3079 run_command "cp $start_config $output_config" or
3080 dodie "failed to copy $start_config to $output_config";
3081
3082 # read directly what we want to check
3083 my %config_check;
3084 open (IN, $output_config)
f9dee311 3085 or dodie "failed to open $output_config";
0a05c769
SR
3086
3087 while (<IN>) {
3088 if (/^((CONFIG\S*)=.*)/) {
3089 $config_check{$2} = $1;
3090 }
3091 }
3092 close(IN);
3093
250bae8b 3094 # Now run oldconfig with the minconfig
fcb3f16a 3095 make_oldconfig;
0a05c769
SR
3096
3097 # check to see what we lost (or gained)
3098 open (IN, $output_config)
3099 or dodie "Failed to read $start_config";
3100
3101 my %removed_configs;
3102 my %added_configs;
3103
3104 while (<IN>) {
3105 if (/^((CONFIG\S*)=.*)/) {
3106 # save off all options
3107 $config_set{$2} = $1;
3108 if (defined($config_check{$2})) {
3109 if (defined($config_ignore{$2})) {
3110 $removed_configs{$2} = $1;
3111 } else {
3112 $config_list{$2} = $1;
3113 }
3114 } elsif (!defined($config_ignore{$2})) {
3115 $added_configs{$2} = $1;
3116 $config_list{$2} = $1;
3117 }
cf79fab6
SR
3118 } elsif (/^# ((CONFIG\S*).*)/) {
3119 # Keep these configs disabled
3120 $config_set{$2} = $1;
3121 $config_off{$2} = $1;
0a05c769
SR
3122 }
3123 }
3124 close(IN);
3125
3126 my @confs = keys %removed_configs;
3127 if ($#confs >= 0) {
3128 doprint "Configs overridden by default configs and removed from check:\n";
3129 foreach my $config (@confs) {
3130 doprint " $config\n";
3131 }
3132 }
3133 @confs = keys %added_configs;
3134 if ($#confs >= 0) {
3135 doprint "Configs appearing in make oldconfig and added:\n";
3136 foreach my $config (@confs) {
3137 doprint " $config\n";
3138 }
3139 }
3140
3141 my %config_test;
3142 my $once = 0;
3143
cf79fab6
SR
3144 @config_off_tmp = ();
3145
0a05c769
SR
3146 # Sometimes kconfig does weird things. We must make sure
3147 # that the config we autocreate has everything we need
3148 # to test, otherwise we may miss testing configs, or
3149 # may not be able to create a new config.
3150 # Here we create a config with everything set.
3151 create_config (keys %config_list);
3152 read_current_config \%config_test;
3153 foreach my $config (keys %config_list) {
3154 if (!defined($config_test{$config})) {
3155 if (!$once) {
3156 $once = 1;
3157 doprint "Configs not produced by kconfig (will not be checked):\n";
3158 }
3159 doprint " $config\n";
3160 delete $config_list{$config};
3161 }
3162 }
3163 my $ret;
b0918612
SR
3164
3165 if (defined($config_bisect_check) && $config_bisect_check) {
3166 doprint " Checking to make sure bad config with min config fails\n";
3167 create_config keys %config_list;
3168 $ret = run_config_bisect_test $config_bisect_type;
3169 if ($ret) {
3170 doprint " FAILED! Bad config with min config boots fine\n";
3171 return -1;
3172 }
3173 doprint " Bad config with min config fails as expected\n";
3174 }
3175
0a05c769
SR
3176 do {
3177 $ret = run_config_bisect;
3178 } while (!$ret);
3179
3180 return $ret if ($ret < 0);
5f9b6ced
SR
3181
3182 success $i;
3183}
3184
27d934b2
SR
3185sub patchcheck_reboot {
3186 doprint "Reboot and sleep $patchcheck_sleep_time seconds\n";
bc7c5803 3187 reboot_to_good $patchcheck_sleep_time;
27d934b2
SR
3188}
3189
6c5ee0be
SR
3190sub patchcheck {
3191 my ($i) = @_;
3192
3193 die "PATCHCHECK_START[$i] not defined\n"
b5f4aea6 3194 if (!defined($patchcheck_start));
6c5ee0be 3195 die "PATCHCHECK_TYPE[$i] not defined\n"
b5f4aea6 3196 if (!defined($patchcheck_type));
6c5ee0be 3197
b5f4aea6 3198 my $start = $patchcheck_start;
6c5ee0be
SR
3199
3200 my $end = "HEAD";
b5f4aea6
SR
3201 if (defined($patchcheck_end)) {
3202 $end = $patchcheck_end;
6c5ee0be
SR
3203 }
3204
a57419b3
SR
3205 # Get the true sha1's since we can use things like HEAD~3
3206 $start = get_sha1($start);
3207 $end = get_sha1($end);
3208
b5f4aea6 3209 my $type = $patchcheck_type;
6c5ee0be
SR
3210
3211 # Can't have a test without having a test to run
3212 if ($type eq "test" && !defined($run_test)) {
3213 $type = "boot";
3214 }
3215
3216 open (IN, "git log --pretty=oneline $end|") or
3217 dodie "could not get git list";
3218
3219 my @list;
3220
3221 while (<IN>) {
3222 chomp;
3223 $list[$#list+1] = $_;
3224 last if (/^$start/);
3225 }
3226 close(IN);
3227
3228 if ($list[$#list] !~ /^$start/) {
2b7d9b21 3229 fail "SHA1 $start not found";
6c5ee0be
SR
3230 }
3231
3232 # go backwards in the list
3233 @list = reverse @list;
3234
3235 my $save_clean = $noclean;
1990207d
SR
3236 my %ignored_warnings;
3237
3238 if (defined($ignore_warnings)) {
3239 foreach my $sha1 (split /\s+/, $ignore_warnings) {
3240 $ignored_warnings{$sha1} = 1;
3241 }
3242 }
6c5ee0be
SR
3243
3244 $in_patchcheck = 1;
3245 foreach my $item (@list) {
3246 my $sha1 = $item;
3247 $sha1 =~ s/^([[:xdigit:]]+).*/$1/;
3248
3249 doprint "\nProcessing commit $item\n\n";
3250
3251 run_command "git checkout $sha1" or
3252 die "Failed to checkout $sha1";
3253
3254 # only clean on the first and last patch
3255 if ($item eq $list[0] ||
3256 $item eq $list[$#list]) {
3257 $noclean = $save_clean;
3258 } else {
3259 $noclean = 1;
3260 }
3261
3262 if (defined($minconfig)) {
2b7d9b21 3263 build "useconfig:$minconfig" or return 0;
6c5ee0be
SR
3264 } else {
3265 # ?? no config to use?
2b7d9b21 3266 build "oldconfig" or return 0;
6c5ee0be
SR
3267 }
3268
4283b169
SRRH
3269 # No need to do per patch checking if warnings file exists
3270 if (!defined($warnings_file) && !defined($ignored_warnings{$sha1})) {
3271 check_patch_buildlog $sha1 or return 0;
1990207d 3272 }
6c5ee0be 3273
4283b169
SRRH
3274 check_buildlog or return 0;
3275
6c5ee0be
SR
3276 next if ($type eq "build");
3277
7faafbd6
SR
3278 my $failed = 0;
3279
ddf607e5 3280 start_monitor_and_boot or $failed = 1;
7faafbd6
SR
3281
3282 if (!$failed && $type ne "boot"){
3283 do_run_test or $failed = 1;
3284 }
3285 end_monitor;
3286 return 0 if ($failed);
3287
27d934b2
SR
3288 patchcheck_reboot;
3289
6c5ee0be
SR
3290 }
3291 $in_patchcheck = 0;
3292 success $i;
2b7d9b21
SR
3293
3294 return 1;
6c5ee0be
SR
3295}
3296
b9066f6c 3297my %depends;
ac6974c7 3298my %depcount;
b9066f6c
SR
3299my $iflevel = 0;
3300my @ifdeps;
3301
3302# prevent recursion
3303my %read_kconfigs;
3304
ac6974c7
SR
3305sub add_dep {
3306 # $config depends on $dep
3307 my ($config, $dep) = @_;
3308
3309 if (defined($depends{$config})) {
3310 $depends{$config} .= " " . $dep;
3311 } else {
3312 $depends{$config} = $dep;
3313 }
3314
3315 # record the number of configs depending on $dep
3316 if (defined $depcount{$dep}) {
3317 $depcount{$dep}++;
3318 } else {
3319 $depcount{$dep} = 1;
3320 }
3321}
3322
b9066f6c
SR
3323# taken from streamline_config.pl
3324sub read_kconfig {
3325 my ($kconfig) = @_;
3326
3327 my $state = "NONE";
3328 my $config;
3329 my @kconfigs;
3330
3331 my $cont = 0;
3332 my $line;
3333
3334
3335 if (! -f $kconfig) {
3336 doprint "file $kconfig does not exist, skipping\n";
3337 return;
3338 }
3339
3340 open(KIN, "$kconfig")
3341 or die "Can't open $kconfig";
3342 while (<KIN>) {
3343 chomp;
3344
3345 # Make sure that lines ending with \ continue
3346 if ($cont) {
3347 $_ = $line . " " . $_;
3348 }
3349
3350 if (s/\\$//) {
3351 $cont = 1;
3352 $line = $_;
3353 next;
3354 }
3355
3356 $cont = 0;
3357
3358 # collect any Kconfig sources
3359 if (/^source\s*"(.*)"/) {
3360 $kconfigs[$#kconfigs+1] = $1;
3361 }
3362
3363 # configs found
3364 if (/^\s*(menu)?config\s+(\S+)\s*$/) {
3365 $state = "NEW";
3366 $config = $2;
3367
3368 for (my $i = 0; $i < $iflevel; $i++) {
ac6974c7 3369 add_dep $config, $ifdeps[$i];
b9066f6c
SR
3370 }
3371
3372 # collect the depends for the config
3373 } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
3374
ac6974c7 3375 add_dep $config, $1;
b9066f6c
SR
3376
3377 # Get the configs that select this config
ac6974c7
SR
3378 } elsif ($state eq "NEW" && /^\s*select\s+(\S+)/) {
3379
3380 # selected by depends on config
3381 add_dep $1, $config;
b9066f6c
SR
3382
3383 # Check for if statements
3384 } elsif (/^if\s+(.*\S)\s*$/) {
3385 my $deps = $1;
3386 # remove beginning and ending non text
3387 $deps =~ s/^[^a-zA-Z0-9_]*//;
3388 $deps =~ s/[^a-zA-Z0-9_]*$//;
3389
3390 my @deps = split /[^a-zA-Z0-9_]+/, $deps;
3391
3392 $ifdeps[$iflevel++] = join ':', @deps;
3393
3394 } elsif (/^endif/) {
3395
3396 $iflevel-- if ($iflevel);
3397
3398 # stop on "help"
3399 } elsif (/^\s*help\s*$/) {
3400 $state = "NONE";
3401 }
3402 }
3403 close(KIN);
3404
3405 # read in any configs that were found.
3406 foreach $kconfig (@kconfigs) {
3407 if (!defined($read_kconfigs{$kconfig})) {
3408 $read_kconfigs{$kconfig} = 1;
3409 read_kconfig("$builddir/$kconfig");
3410 }
3411 }
3412}
3413
3414sub read_depends {
3415 # find out which arch this is by the kconfig file
3416 open (IN, $output_config)
3417 or dodie "Failed to read $output_config";
3418 my $arch;
3419 while (<IN>) {
3420 if (m,Linux/(\S+)\s+\S+\s+Kernel Configuration,) {
3421 $arch = $1;
3422 last;
3423 }
3424 }
3425 close IN;
3426
3427 if (!defined($arch)) {
3428 doprint "Could not find arch from config file\n";
3429 doprint "no dependencies used\n";
3430 return;
3431 }
3432
3433 # arch is really the subarch, we need to know
3434 # what directory to look at.
3435 if ($arch eq "i386" || $arch eq "x86_64") {
3436 $arch = "x86";
3437 } elsif ($arch =~ /^tile/) {
3438 $arch = "tile";
3439 }
3440
3441 my $kconfig = "$builddir/arch/$arch/Kconfig";
3442
3443 if (! -f $kconfig && $arch =~ /\d$/) {
3444 my $orig = $arch;
3445 # some subarchs have numbers, truncate them
3446 $arch =~ s/\d*$//;
3447 $kconfig = "$builddir/arch/$arch/Kconfig";
3448 if (! -f $kconfig) {
3449 doprint "No idea what arch dir $orig is for\n";
3450 doprint "no dependencies used\n";
3451 return;
3452 }
3453 }
3454
3455 read_kconfig($kconfig);
3456}
3457
4c4ab120
SR
3458sub read_config_list {
3459 my ($config) = @_;
3460
3461 open (IN, $config)
3462 or dodie "Failed to read $config";
3463
3464 while (<IN>) {
3465 if (/^((CONFIG\S*)=.*)/) {
3466 if (!defined($config_ignore{$2})) {
3467 $config_list{$2} = $1;
3468 }
3469 }
3470 }
3471
3472 close(IN);
3473}
3474
3475sub read_output_config {
3476 my ($config) = @_;
3477
3478 assign_configs \%config_ignore, $config;
3479}
3480
3481sub make_new_config {
3482 my @configs = @_;
3483
3484 open (OUT, ">$output_config")
3485 or dodie "Failed to write $output_config";
3486
3487 foreach my $config (@configs) {
3488 print OUT "$config\n";
3489 }
3490 close OUT;
3491}
3492
ac6974c7
SR
3493sub chomp_config {
3494 my ($config) = @_;
3495
3496 $config =~ s/CONFIG_//;
3497
3498 return $config;
3499}
3500
b9066f6c
SR
3501sub get_depends {
3502 my ($dep) = @_;
3503
ac6974c7 3504 my $kconfig = chomp_config $dep;
b9066f6c
SR
3505
3506 $dep = $depends{"$kconfig"};
3507
3508 # the dep string we have saves the dependencies as they
3509 # were found, including expressions like ! && ||. We
3510 # want to split this out into just an array of configs.
3511
3512 my $valid = "A-Za-z_0-9";
3513
3514 my @configs;
3515
3516 while ($dep =~ /[$valid]/) {
3517
3518 if ($dep =~ /^[^$valid]*([$valid]+)/) {
3519 my $conf = "CONFIG_" . $1;
3520
3521 $configs[$#configs + 1] = $conf;
3522
3523 $dep =~ s/^[^$valid]*[$valid]+//;
3524 } else {
3525 die "this should never happen";
3526 }
3527 }
3528
3529 return @configs;
3530}
3531
3532my %min_configs;
3533my %keep_configs;
43d1b651 3534my %save_configs;
b9066f6c
SR
3535my %processed_configs;
3536my %nochange_config;
3537
3538sub test_this_config {
3539 my ($config) = @_;
3540
3541 my $found;
3542
3543 # if we already processed this config, skip it
3544 if (defined($processed_configs{$config})) {
3545 return undef;
3546 }
3547 $processed_configs{$config} = 1;
3548
3549 # if this config failed during this round, skip it
3550 if (defined($nochange_config{$config})) {
3551 return undef;
3552 }
3553
ac6974c7 3554 my $kconfig = chomp_config $config;
b9066f6c
SR
3555
3556 # Test dependencies first
3557 if (defined($depends{"$kconfig"})) {
3558 my @parents = get_depends $config;
3559 foreach my $parent (@parents) {
3560 # if the parent is in the min config, check it first
3561 next if (!defined($min_configs{$parent}));
3562 $found = test_this_config($parent);
3563 if (defined($found)) {
3564 return $found;
3565 }
3566 }
3567 }
3568
3569 # Remove this config from the list of configs
fb16d891 3570 # do a make olddefconfig and then read the resulting
b9066f6c
SR
3571 # .config to make sure it is missing the config that
3572 # we had before
3573 my %configs = %min_configs;
3574 delete $configs{$config};
3575 make_new_config ((values %configs), (values %keep_configs));
3576 make_oldconfig;
3577 undef %configs;
3578 assign_configs \%configs, $output_config;
3579
3580 return $config if (!defined($configs{$config}));
3581
3582 doprint "disabling config $config did not change .config\n";
3583
3584 $nochange_config{$config} = 1;
3585
3586 return undef;
3587}
3588
4c4ab120
SR
3589sub make_min_config {
3590 my ($i) = @_;
3591
ccc513b6
SR
3592 my $type = $minconfig_type;
3593 if ($type ne "boot" && $type ne "test") {
3594 fail "Invalid MIN_CONFIG_TYPE '$minconfig_type'\n" .
3595 " make_min_config works only with 'boot' and 'test'\n" and return;
3596 }
3597
4c4ab120
SR
3598 if (!defined($output_minconfig)) {
3599 fail "OUTPUT_MIN_CONFIG not defined" and return;
3600 }
35ce5952
SR
3601
3602 # If output_minconfig exists, and the start_minconfig
3603 # came from min_config, than ask if we should use
3604 # that instead.
3605 if (-f $output_minconfig && !$start_minconfig_defined) {
3606 print "$output_minconfig exists\n";
43de3316
SR
3607 if (!defined($use_output_minconfig)) {
3608 if (read_yn " Use it as minconfig?") {
3609 $start_minconfig = $output_minconfig;
3610 }
3611 } elsif ($use_output_minconfig > 0) {
3612 doprint "Using $output_minconfig as MIN_CONFIG\n";
35ce5952 3613 $start_minconfig = $output_minconfig;
43de3316
SR
3614 } else {
3615 doprint "Set to still use MIN_CONFIG as starting point\n";
35ce5952
SR
3616 }
3617 }
3618
4c4ab120
SR
3619 if (!defined($start_minconfig)) {
3620 fail "START_MIN_CONFIG or MIN_CONFIG not defined" and return;
3621 }
3622
35ce5952
SR
3623 my $temp_config = "$tmpdir/temp_config";
3624
4c4ab120
SR
3625 # First things first. We build an allnoconfig to find
3626 # out what the defaults are that we can't touch.
3627 # Some are selections, but we really can't handle selections.
3628
3629 my $save_minconfig = $minconfig;
3630 undef $minconfig;
3631
3632 run_command "$make allnoconfig" or return 0;
3633
b9066f6c
SR
3634 read_depends;
3635
4c4ab120 3636 process_config_ignore $output_config;
b9066f6c 3637
43d1b651 3638 undef %save_configs;
b9066f6c 3639 undef %min_configs;
4c4ab120
SR
3640
3641 if (defined($ignore_config)) {
3642 # make sure the file exists
3643 `touch $ignore_config`;
43d1b651 3644 assign_configs \%save_configs, $ignore_config;
4c4ab120
SR
3645 }
3646
43d1b651
SR
3647 %keep_configs = %save_configs;
3648
4c4ab120
SR
3649 doprint "Load initial configs from $start_minconfig\n";
3650
3651 # Look at the current min configs, and save off all the
3652 # ones that were set via the allnoconfig
4c4ab120
SR
3653 assign_configs \%min_configs, $start_minconfig;
3654
3655 my @config_keys = keys %min_configs;
3656
ac6974c7
SR
3657 # All configs need a depcount
3658 foreach my $config (@config_keys) {
3659 my $kconfig = chomp_config $config;
3660 if (!defined $depcount{$kconfig}) {
3661 $depcount{$kconfig} = 0;
3662 }
3663 }
3664
4c4ab120
SR
3665 # Remove anything that was set by the make allnoconfig
3666 # we shouldn't need them as they get set for us anyway.
3667 foreach my $config (@config_keys) {
3668 # Remove anything in the ignore_config
3669 if (defined($keep_configs{$config})) {
3670 my $file = $ignore_config;
3671 $file =~ s,.*/(.*?)$,$1,;
3672 doprint "$config set by $file ... ignored\n";
3673 delete $min_configs{$config};
3674 next;
3675 }
3676 # But make sure the settings are the same. If a min config
3677 # sets a selection, we do not want to get rid of it if
3678 # it is not the same as what we have. Just move it into
3679 # the keep configs.
3680 if (defined($config_ignore{$config})) {
3681 if ($config_ignore{$config} ne $min_configs{$config}) {
3682 doprint "$config is in allnoconfig as '$config_ignore{$config}'";
3683 doprint " but it is '$min_configs{$config}' in minconfig .. keeping\n";
3684 $keep_configs{$config} = $min_configs{$config};
3685 } else {
3686 doprint "$config set by allnoconfig ... ignored\n";
3687 }
3688 delete $min_configs{$config};
3689 }
3690 }
3691
4c4ab120 3692 my $done = 0;
b9066f6c 3693 my $take_two = 0;
4c4ab120
SR
3694
3695 while (!$done) {
3696
3697 my $config;
3698 my $found;
3699
3700 # Now disable each config one by one and do a make oldconfig
3701 # till we find a config that changes our list.
3702
4c4ab120 3703 my @test_configs = keys %min_configs;
ac6974c7
SR
3704
3705 # Sort keys by who is most dependent on
3706 @test_configs = sort { $depcount{chomp_config($b)} <=> $depcount{chomp_config($a)} }
3707 @test_configs ;
3708
3709 # Put configs that did not modify the config at the end.
4c4ab120
SR
3710 my $reset = 1;
3711 for (my $i = 0; $i < $#test_configs; $i++) {
3712 if (!defined($nochange_config{$test_configs[0]})) {
3713 $reset = 0;
3714 last;
3715 }
3716 # This config didn't change the .config last time.
3717 # Place it at the end
3718 my $config = shift @test_configs;
3719 push @test_configs, $config;
3720 }
3721
3722 # if every test config has failed to modify the .config file
3723 # in the past, then reset and start over.
3724 if ($reset) {
3725 undef %nochange_config;
3726 }
3727
b9066f6c
SR
3728 undef %processed_configs;
3729
4c4ab120
SR
3730 foreach my $config (@test_configs) {
3731
b9066f6c 3732 $found = test_this_config $config;
4c4ab120 3733
b9066f6c 3734 last if (defined($found));
4c4ab120
SR
3735
3736 # oh well, try another config
4c4ab120
SR
3737 }
3738
3739 if (!defined($found)) {
b9066f6c
SR
3740 # we could have failed due to the nochange_config hash
3741 # reset and try again
3742 if (!$take_two) {
3743 undef %nochange_config;
3744 $take_two = 1;
3745 next;
3746 }
4c4ab120
SR
3747 doprint "No more configs found that we can disable\n";
3748 $done = 1;
3749 last;
3750 }
b9066f6c 3751 $take_two = 0;
4c4ab120
SR
3752
3753 $config = $found;
3754
3755 doprint "Test with $config disabled\n";
3756
3757 # set in_bisect to keep build and monitor from dieing
3758 $in_bisect = 1;
3759
3760 my $failed = 0;
bf1c95ab
SR
3761 build "oldconfig" or $failed = 1;
3762 if (!$failed) {
3763 start_monitor_and_boot or $failed = 1;
ccc513b6
SR
3764
3765 if ($type eq "test" && !$failed) {
3766 do_run_test or $failed = 1;
3767 }
3768
bf1c95ab
SR
3769 end_monitor;
3770 }
4c4ab120
SR
3771
3772 $in_bisect = 0;
3773
3774 if ($failed) {
b9066f6c 3775 doprint "$min_configs{$config} is needed to boot the box... keeping\n";
4c4ab120
SR
3776 # this config is needed, add it to the ignore list.
3777 $keep_configs{$config} = $min_configs{$config};
43d1b651 3778 $save_configs{$config} = $min_configs{$config};
4c4ab120 3779 delete $min_configs{$config};
35ce5952
SR
3780
3781 # update new ignore configs
3782 if (defined($ignore_config)) {
3783 open (OUT, ">$temp_config")
3784 or die "Can't write to $temp_config";
43d1b651
SR
3785 foreach my $config (keys %save_configs) {
3786 print OUT "$save_configs{$config}\n";
35ce5952
SR
3787 }
3788 close OUT;
3789 run_command "mv $temp_config $ignore_config" or
3790 dodie "failed to copy update to $ignore_config";
3791 }
3792
4c4ab120
SR
3793 } else {
3794 # We booted without this config, remove it from the minconfigs.
3795 doprint "$config is not needed, disabling\n";
3796
3797 delete $min_configs{$config};
3798
3799 # Also disable anything that is not enabled in this config
3800 my %configs;
3801 assign_configs \%configs, $output_config;
3802 my @config_keys = keys %min_configs;
3803 foreach my $config (@config_keys) {
3804 if (!defined($configs{$config})) {
3805 doprint "$config is not set, disabling\n";
3806 delete $min_configs{$config};
3807 }
3808 }
3809
3810 # Save off all the current mandidory configs
35ce5952
SR
3811 open (OUT, ">$temp_config")
3812 or die "Can't write to $temp_config";
4c4ab120
SR
3813 foreach my $config (keys %keep_configs) {
3814 print OUT "$keep_configs{$config}\n";
3815 }
3816 foreach my $config (keys %min_configs) {
3817 print OUT "$min_configs{$config}\n";
3818 }
3819 close OUT;
35ce5952
SR
3820
3821 run_command "mv $temp_config $output_minconfig" or
3822 dodie "failed to copy update to $output_minconfig";
4c4ab120
SR
3823 }
3824
3825 doprint "Reboot and wait $sleep_time seconds\n";
bc7c5803 3826 reboot_to_good $sleep_time;
4c4ab120
SR
3827 }
3828
3829 success $i;
3830 return 1;
3831}
3832
4283b169
SRRH
3833sub make_warnings_file {
3834 my ($i) = @_;
3835
3836 if (!defined($warnings_file)) {
3837 dodie "Must define WARNINGS_FILE for make_warnings_file test";
3838 }
3839
3840 if ($build_type eq "nobuild") {
3841 dodie "BUILD_TYPE can not be 'nobuild' for make_warnings_file test";
3842 }
3843
3844 build $build_type or dodie "Failed to build";
3845
3846 open(OUT, ">$warnings_file") or dodie "Can't create $warnings_file";
3847
3848 open(IN, $buildlog) or dodie "Can't open $buildlog";
3849 while (<IN>) {
3850
3851 # Some compilers use UTF-8 extended for quotes
3852 # for distcc heterogeneous systems, this causes issues
3853 s/$utf8_quote/'/g;
3854
3855 if (/$check_build_re/) {
3856 print OUT;
3857 }
3858 }
3859 close(IN);
3860
3861 close(OUT);
3862
3863 success $i;
3864}
3865
8d1491ba
SR
3866$#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl config-file\n";
3867
3868if ($#ARGV == 0) {
3869 $ktest_config = $ARGV[0];
3870 if (! -f $ktest_config) {
3871 print "$ktest_config does not exist.\n";
35ce5952 3872 if (!read_yn "Create it?") {
8d1491ba
SR
3873 exit 0;
3874 }
3875 }
3876} else {
3877 $ktest_config = "ktest.conf";
3878}
3879
3880if (! -f $ktest_config) {
dbd3783b 3881 $newconfig = 1;
c4261d0f 3882 get_test_case;
8d1491ba
SR
3883 open(OUT, ">$ktest_config") or die "Can not create $ktest_config";
3884 print OUT << "EOF"
3885# Generated by ktest.pl
3886#
0e7a22de
SR
3887
3888# PWD is a ktest.pl variable that will result in the process working
3889# directory that ktest.pl is executed in.
3890
3891# THIS_DIR is automatically assigned the PWD of the path that generated
3892# the config file. It is best to use this variable when assigning other
3893# directory paths within this directory. This allows you to easily
3894# move the test cases to other locations or to other machines.
3895#
3896THIS_DIR := $variable{"PWD"}
3897
8d1491ba
SR
3898# Define each test with TEST_START
3899# The config options below it will override the defaults
3900TEST_START
c4261d0f 3901TEST_TYPE = $default{"TEST_TYPE"}
8d1491ba
SR
3902
3903DEFAULTS
3904EOF
3905;
3906 close(OUT);
3907}
3908read_config $ktest_config;
3909
23715c3c 3910if (defined($opt{"LOG_FILE"})) {
04262be3 3911 $opt{"LOG_FILE"} = eval_option("LOG_FILE", $opt{"LOG_FILE"}, -1);
23715c3c
SR
3912}
3913
8d1491ba
SR
3914# Append any configs entered in manually to the config file.
3915my @new_configs = keys %entered_configs;
3916if ($#new_configs >= 0) {
3917 print "\nAppending entered in configs to $ktest_config\n";
3918 open(OUT, ">>$ktest_config") or die "Can not append to $ktest_config";
3919 foreach my $config (@new_configs) {
3920 print OUT "$config = $entered_configs{$config}\n";
0e7a22de 3921 $opt{$config} = process_variables($entered_configs{$config});
8d1491ba
SR
3922 }
3923}
2545eb61 3924
2b7d9b21
SR
3925if ($opt{"CLEAR_LOG"} && defined($opt{"LOG_FILE"})) {
3926 unlink $opt{"LOG_FILE"};
3927}
2545eb61 3928
2b7d9b21
SR
3929doprint "\n\nSTARTING AUTOMATED TESTS\n\n";
3930
a57419b3
SR
3931for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
3932
3933 if (!$i) {
3934 doprint "DEFAULT OPTIONS:\n";
3935 } else {
3936 doprint "\nTEST $i OPTIONS";
3937 if (defined($repeat_tests{$i})) {
3938 $repeat = $repeat_tests{$i};
3939 doprint " ITERATE $repeat";
3940 }
3941 doprint "\n";
3942 }
3943
3944 foreach my $option (sort keys %opt) {
3945
3946 if ($option =~ /\[(\d+)\]$/) {
3947 next if ($i != $1);
3948 } else {
3949 next if ($i);
3950 }
3951
3952 doprint "$option = $opt{$option}\n";
3953 }
2b7d9b21 3954}
2545eb61 3955
2a62512b 3956sub __set_test_option {
5a391fbf 3957 my ($name, $i) = @_;
2545eb61 3958
5a391fbf 3959 my $option = "$name\[$i\]";
5c42fc5b 3960
5a391fbf
SR
3961 if (defined($opt{$option})) {
3962 return $opt{$option};
5f9b6ced
SR
3963 }
3964
a57419b3
SR
3965 foreach my $test (keys %repeat_tests) {
3966 if ($i >= $test &&
3967 $i < $test + $repeat_tests{$test}) {
3968 $option = "$name\[$test\]";
3969 if (defined($opt{$option})) {
3970 return $opt{$option};
3971 }
3972 }
3973 }
3974
5a391fbf
SR
3975 if (defined($opt{$name})) {
3976 return $opt{$name};
2545eb61
SR
3977 }
3978
5a391fbf
SR
3979 return undef;
3980}
3981
2a62512b
SR
3982sub set_test_option {
3983 my ($name, $i) = @_;
3984
3985 my $option = __set_test_option($name, $i);
3986 return $option if (!defined($option));
3987
04262be3 3988 return eval_option($name, $option, $i);
2a62512b
SR
3989}
3990
5a391fbf 3991# First we need to do is the builds
a75fecec
SR
3992for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
3993
4ab1cce5
SR
3994 # Do not reboot on failing test options
3995 $no_reboot = 1;
759a3cc6 3996 $reboot_success = 0;
4ab1cce5 3997
683a3e64
SR
3998 $have_version = 0;
3999
576f627c
SR
4000 $iteration = $i;
4001
c1434dcc
SR
4002 undef %force_config;
4003
a75fecec
SR
4004 my $makecmd = set_test_option("MAKE_CMD", $i);
4005
8e80bf05
SRRH
4006 $outputdir = set_test_option("OUTPUT_DIR", $i);
4007 $builddir = set_test_option("BUILD_DIR", $i);
4008
4009 chdir $builddir || die "can't change directory to $builddir";
4010
4011 if (!-d $outputdir) {
4012 mkpath($outputdir) or
4013 die "can't create $outputdir";
4014 }
4015
4016 $make = "$makecmd O=$outputdir";
4017
9cc9e091
SR
4018 # Load all the options into their mapped variable names
4019 foreach my $opt (keys %option_map) {
4020 ${$option_map{$opt}} = set_test_option($opt, $i);
4021 }
b5f4aea6 4022
35ce5952
SR
4023 $start_minconfig_defined = 1;
4024
921ed4c7
SR
4025 # The first test may override the PRE_KTEST option
4026 if (defined($pre_ktest) && $i == 1) {
4027 doprint "\n";
4028 run_command $pre_ktest;
4029 }
4030
4031 # Any test can override the POST_KTEST option
4032 # The last test takes precedence.
4033 if (defined($post_ktest)) {
4034 $final_post_ktest = $post_ktest;
4035 }
4036
4c4ab120 4037 if (!defined($start_minconfig)) {
35ce5952 4038 $start_minconfig_defined = 0;
4c4ab120
SR
4039 $start_minconfig = $minconfig;
4040 }
4041
8e80bf05
SRRH
4042 if (!-d $tmpdir) {
4043 mkpath($tmpdir) or
4044 die "can't create $tmpdir";
a75fecec 4045 }
1a5cfce3 4046
e48c5293
SR
4047 $ENV{"SSH_USER"} = $ssh_user;
4048 $ENV{"MACHINE"} = $machine;
4049
a75fecec 4050 $buildlog = "$tmpdir/buildlog-$machine";
a9dd5d63 4051 $testlog = "$tmpdir/testlog-$machine";
a75fecec 4052 $dmesg = "$tmpdir/dmesg-$machine";
51ad1dd1 4053 $output_config = "$outputdir/.config";
a75fecec 4054
bb8474b1
SR
4055 if (!$buildonly) {
4056 $target = "$ssh_user\@$machine";
4057 if ($reboot_type eq "grub") {
4058 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
a15ba913
SR
4059 } elsif ($reboot_type eq "grub2") {
4060 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
4061 dodie "GRUB_FILE not defined" if (!defined($grub_file));
7786954c
SR
4062 } elsif ($reboot_type eq "syslinux") {
4063 dodie "SYSLINUX_LABEL not defined" if (!defined($syslinux_label));
bb8474b1 4064 }
a75fecec
SR
4065 }
4066
4067 my $run_type = $build_type;
4068 if ($test_type eq "patchcheck") {
b5f4aea6 4069 $run_type = $patchcheck_type;
a75fecec 4070 } elsif ($test_type eq "bisect") {
b5f4aea6 4071 $run_type = $bisect_type;
0a05c769 4072 } elsif ($test_type eq "config_bisect") {
b5f4aea6 4073 $run_type = $config_bisect_type;
4283b169
SRRH
4074 } elsif ($test_type eq "make_min_config") {
4075 $run_type = "";
4076 } elsif ($test_type eq "make_warnings_file") {
4c4ab120
SR
4077 $run_type = "";
4078 }
4079
a75fecec
SR
4080 # mistake in config file?
4081 if (!defined($run_type)) {
4082 $run_type = "ERROR";
4083 }
5a391fbf 4084
e0a8742e
SR
4085 my $installme = "";
4086 $installme = " no_install" if ($no_install);
4087
2545eb61 4088 doprint "\n\n";
e0a8742e 4089 doprint "RUNNING TEST $i of $opt{NUM_TESTS} with option $test_type $run_type$installme\n\n";
7faafbd6 4090
921ed4c7
SR
4091 if (defined($pre_test)) {
4092 run_command $pre_test;
4093 }
4094
7faafbd6
SR
4095 unlink $dmesg;
4096 unlink $buildlog;
a9dd5d63 4097 unlink $testlog;
2545eb61 4098
250bae8b
SR
4099 if (defined($addconfig)) {
4100 my $min = $minconfig;
4101 if (!defined($minconfig)) {
4102 $min = "";
4103 }
4104 run_command "cat $addconfig $min > $tmpdir/add_config" or
2b7d9b21 4105 dodie "Failed to create temp config";
9be2e6b5 4106 $minconfig = "$tmpdir/add_config";
2b7d9b21
SR
4107 }
4108
6c5ee0be
SR
4109 if (defined($checkout)) {
4110 run_command "git checkout $checkout" or
4111 die "failed to checkout $checkout";
4112 }
4113
759a3cc6
SR
4114 $no_reboot = 0;
4115
648a182c
SR
4116 # A test may opt to not reboot the box
4117 if ($reboot_on_success) {
759a3cc6 4118 $reboot_success = 1;
648a182c 4119 }
4ab1cce5 4120
a75fecec 4121 if ($test_type eq "bisect") {
5f9b6ced
SR
4122 bisect $i;
4123 next;
0a05c769
SR
4124 } elsif ($test_type eq "config_bisect") {
4125 config_bisect $i;
4126 next;
a75fecec 4127 } elsif ($test_type eq "patchcheck") {
6c5ee0be
SR
4128 patchcheck $i;
4129 next;
4c4ab120
SR
4130 } elsif ($test_type eq "make_min_config") {
4131 make_min_config $i;
4132 next;
4283b169
SRRH
4133 } elsif ($test_type eq "make_warnings_file") {
4134 $no_reboot = 1;
4135 make_warnings_file $i;
4136 next;
2545eb61 4137 }
2545eb61 4138
7faafbd6
SR
4139 if ($build_type ne "nobuild") {
4140 build $build_type or next;
4283b169 4141 check_buildlog or next;
2545eb61
SR
4142 }
4143
cd8e368f
SR
4144 if ($test_type eq "install") {
4145 get_version;
4146 install;
4147 success $i;
4148 next;
4149 }
4150
a75fecec 4151 if ($test_type ne "build") {
a75fecec 4152 my $failed = 0;
ddf607e5 4153 start_monitor_and_boot or $failed = 1;
a75fecec
SR
4154
4155 if (!$failed && $test_type ne "boot" && defined($run_test)) {
4156 do_run_test or $failed = 1;
4157 }
4158 end_monitor;
4159 next if ($failed);
5a391fbf
SR
4160 }
4161
5f9b6ced 4162 success $i;
2545eb61
SR
4163}
4164
921ed4c7
SR
4165if (defined($final_post_ktest)) {
4166 run_command $final_post_ktest;
4167}
4168
5c42fc5b 4169if ($opt{"POWEROFF_ON_SUCCESS"}) {
75c3fda7 4170 halt;
759a3cc6 4171} elsif ($opt{"REBOOT_ON_SUCCESS"} && !do_not_reboot && $reboot_success) {
bc7c5803 4172 reboot_to_good;
648a182c
SR
4173} elsif (defined($switch_to_good)) {
4174 # still need to get to the good kernel
4175 run_command $switch_to_good;
5c42fc5b 4176}
75c3fda7 4177
648a182c 4178
e48c5293
SR
4179doprint "\n $successes of $opt{NUM_TESTS} tests were successful\n\n";
4180
2545eb61 4181exit 0;