diff options
author | Rob Savoye <rob@welcomehome.org> | 2001-02-05 04:14:59 +0000 |
---|---|---|
committer | Rob Savoye <rob@welcomehome.org> | 2001-02-05 04:14:59 +0000 |
commit | 20f1185dd84bcadf4b238d1d2ca18f5ca79157d4 (patch) | |
tree | da300d5097593bc1d61123a8e32179914440e85f /config/vxworks.exp | |
download | dejagnu-20f1185dd84bcadf4b238d1d2ca18f5ca79157d4.zip dejagnu-20f1185dd84bcadf4b238d1d2ca18f5ca79157d4.tar.gz dejagnu-20f1185dd84bcadf4b238d1d2ca18f5ca79157d4.tar.bz2 |
Initial revision
Diffstat (limited to 'config/vxworks.exp')
-rw-r--r-- | config/vxworks.exp | 511 |
1 files changed, 511 insertions, 0 deletions
diff --git a/config/vxworks.exp b/config/vxworks.exp new file mode 100644 index 0000000..3ab4a71 --- /dev/null +++ b/config/vxworks.exp @@ -0,0 +1,511 @@ +# Copyright (C) 92, 93, 94, 95, 1996, 1997 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# DejaGnu@cygnus.com + +# This file was originally written by Rob Savoye. (rob@cygnus.com) +# and modified by Bob Manson (manson@cygnus.com) + +# +# Try to boot the machine into the requested OS. +# +proc ${board}_init { dest } { + # This is not the right way to determine the required OS... + global target_os; + set shell_prompt [board_info $dest shell_prompt]; + set do_reboot 0; + + set desired_kernel [board_info $dest "kernel,$target_os"]; + + if { $desired_kernel == "" } { + vxworks_final_init $dest; + # Nothing to see here, nothing to do. Move along. + return; + } + + remote_raw_open $dest raw; + remote_send $dest "\n"; + remote_expect $dest 5 { + -re "$shell_prompt" { + set do_reboot 1; + } + -re "Press any key to stop auto-boot" { + remote_send $dest "\n"; + exp_continue; + } + -re "VxWorks Boot" { + set boot_mon 0; + set boot_mon_prompt "VxWorks Boot"; + } + -re "\[0-9\]\[\r\n\]+ *\[0-9\]\[\r\n\]" { + remote_send $dest "\n"; + exp_continue; + } + timeout { + set do_reboot 1; + } + } + + if { $do_reboot } { + remote_close $dest; + remote_reboot $dest; + return; + } + remote_binary $dest; + remote_send $dest "\n\n"; + remote_expect $dest 3 { + timeout {} + -re ".+" { exp_continue; } + } + remote_send $dest "p\n"; + remote_expect $dest 20 { + -re "file name\[ \t\]+: (\[^ \r\n\]+)\[ \r\n\]+" { + set curr_file $expect_out(1,string); + exp_continue; + } + -re "$boot_mon_prompt" { } + } + if ![info exists curr_file] { + remote_close $dest; + remote_reboot $dest; + return; + } + if { $curr_file != $desired_kernel } { + verbose "$curr_file != '$desired_kernel'"; + # Oh boy. + remote_send $dest "c\n"; + remote_expect $dest 20 { + -re "file name\[ \t\]+:.*$" { + remote_send $dest "$desired_kernel\n"; + exp_continue; + } + -re "\[a-z() \t\]+:.*$" { + remote_send $dest "\n"; + exp_continue; + } + -re "$boot_mon_prompt" {} + } + } + remote_send $dest "@\n"; + remote_expect $dest 30 { + -re "(^|\[\r\n\])$shell_prompt" {} + -re ".+" { + exp_continue; + } + } + vxworks_final_init $dest; + remote_close $dest; +} + +proc vxworks_final_init { dest } { + if [board_info $dest exists preload_obj] { + if { [target_compile [board_info $dest preload_obj] foo.out object [board_info $dest preload_obj_flags]] == "" } { + vxworks_ld $dest foo.out + } + remote_file build delete foo.out; + } +} +# +# Execute the command PROGRAM on VxWorks. +# + +proc vxworks_exec { dest program pargs inp outp } { + global decimal hex; + + set shell_id [vxworks_open $dest]; + if { $shell_id < 0 } { + return [list -1 "open failure"]; + } + + if { $inp != "" } { + set inp [remote_download $dest $inp]; + set suffix " < $inp"; + } else { + set suffix "" + } + + set shell_prompt [board_info $dest shell_prompt]; + remote_send $dest "${program} ${pargs}$suffix\n"; + # FIXME: The value 300 below should probably be a parameter passed in. + remote_expect $dest 300 { + -re "\\\[VxWorks Boot\\\]:" { + remote_send $dest "@\n"; + sleep 20; + exp_continue; + } + -re "(.*)value = (-*$decimal) = $hex\[^\r\n\]*\[\r\n\]+$shell_prompt" { + set result [list $expect_out(2,string) $expect_out(1,string)]; + } + -re "undefined symbol: .*$shell_prompt" { + set result [list 1 "unknown command"]; + } + -re "syntax error.*$shell_prompt" { + set result [list -1 "syntax error in command"]; + } + default { + set result [list -1 "unable to execute command"]; + } + } + if { $suffix != "" } { + remote_file $dest delete $inp; + } + return $result; +} + +proc vxworks_download { dest localfile remotefile } { + if [board_info $dest exists vxworks_homedir] { + set rfile "[board_info $dest vxworks_homedir]/$remotefile"; + remote_download build $localfile $rfile; + return $rfile; + } + return [remote_raw_download $dest $localfile $remotefile]; +} + +proc vxworks_file { dest op args } { + set file [lindex $args 0]; + if [board_info $dest exists vxworks_homedir] { + set dir "[board_info $dest vxworks_homedir]"; + switch $op { + exists { + set file "${dir}/[file tail $file]"; + return [file exists $file]; + } + delete { + foreach x $args { + set x "${dir}/[file tail $x]"; + if { [file exists $x] && [file isfile $x] } { + exec rm -f $x; + } + } + return; + } + } + } + return [eval remote_raw_file \"$dest\" \"$op\" $args]; +} + +proc vxworks_send { dest string } { + # Convert LFs to CRs, 'cause that is what VxWorks wants to see. + regsub -all "\n" $string "\r" string; + verbose "Sending '$string' to $dest" 2 + return [remote_raw_send $dest "$string"]; +} + +proc vxworks_open { dest args } { + if [board_info $dest exists fileid] { + return [board_info $dest fileid]; + } + + set shell_prompt [board_info $dest shell_prompt] + + set shell_id [remote_raw_open $dest]; + + if { $shell_id == "" || $shell_id < 0 } { + return -1; + } + + if [board_info $dest exists logname] { + set logname [board_info $dest logname]; + if [board_info $dest exists password] { + remote_send $dest "iam \"$logname\",\"[board_info $dest passwd]\"\r" + } else { + remote_send $dest "iam \"$logname\"\r" + } + + remote_expect $dest 30 { + "iam*value = 0 = 0x0*$shell_prompt" { + verbose "Set default user." 2 + } + timeout { + # ??? This is really an error. It's not clear whether `perror' + # or `warning' should be used here. There are *lots* of other + # cases like this. + perror "Couldn't set default user." + return -1; + } + } + } + + set dir ""; + if [board_info $dest exists ftp_directory] { + set dir [board_info $dest ftp_directory]; + } + if [board_info $dest exists vxworks_homedir] { + set dir [board_info $dest vxworks_homedir]; + } + if { $dir != "" } { + set status [remote_exec $dest "cd" "\"$dir\""]; + if [lindex $status 0] { + perror "Error in cd to $dir--[lindex $status 1]"; + return 1; + } + } + return $shell_id; +} +# +# Load a file into vxworks +# +# The result is: +# 0 - success +# 1 - failed (eg: link failed so testcase should fail) +# -1 - unresolved (eg: timeout), may be fixed by rebooting +# +proc vxworks_ld { dest prog } { + global decimal hex + global board_info + + if { $prog == "" } { + return 1; + } + + set shell_id [remote_open $dest]; + + if { $shell_id < 0 } { + return -1; + } + + set prog [remote_download $dest $prog]; + + set shell_prompt [board_info $dest shell_prompt]; + + # We always want to exit the program via the code at the end. + # If the load fails we want `expect_out' stored in the log and this + # saves duplicating that code. + + for { set x 0 ; } { $x < 3 } {incr x; } { + remote_send $dest "\n"; + remote_expect $dest 30 { + -re ".*$shell_prompt $" { set x 20; } + -re "\\\[VxWorks Boot\\\]:" { + remote_send $dest "@\n"; + sleep 20; + exp_continue; + } + timeout { return -1; } + } + } + + set tries 0 + set maxtries 3 + set result -7 ;# -7 is a local value meaning "not done" + + while { $result == -7 && $tries < $maxtries } { + verbose "Loading $prog into vxworks." + remote_send $dest "ld < $prog\n"; + incr tries + remote_expect $dest 300 { + -re "USER.*command not understood" { + perror "Need to set the user and password." + set result 1 + } + -re "Stale NFS file handle.*$shell_prompt $" { + # Need to retry. + } + -re "undefined symbol:.*$shell_prompt $" { + # This is an error in the testcase, don't call perror. + warning "Undefined symbol, $prog not loaded." + set result 1 + } + -re "memPartAlloc: block too.*$shell_prompt $" { + perror "Not enough memory to load $prog." + set result -1 + } + -re "can't open input.*$shell_prompt $" { + perror "Can't access $prog." + set result 1 + } + -re "value = (-*${decimal}) = ${hex}.*$shell_prompt $" { + verbose "Loaded $prog into vxworks." + set board_info([board_info $dest name],vx_module) $expect_out(1,string); + set result 0 + } + -re "(.*)$shell_prompt $" { + warning "Load failed: $expect_out(1,string)" + } + timeout { + warning "Timed out trying load $prog." + set result -1 + } + } + } + + if { $result && [info exists expect_out(buffer)] } { + send_log "$expect_out(buffer)" + } + + remote_file $dest delete $prog; + return $result +} + +# +# Start a thread (process) executing +# +# The result is: +# 0 - success +# 1 - failed (eg: testcase aborted) +# -1 - unresolved, may be fixed by rebooting +# +proc vxworks_run { dest function pargs inp outp } { + global hex decimal; + + set shell_prompt [board_info $dest shell_prompt]; + set output ""; + + # There isn't a command to wait for a thread to finish, so we have to keep + # polling. Instead, we expect the status wrapper to return an exit + # status. + + set status [remote_exec $dest "sp" "$function $pargs" $inp $outp]; + + set tid [lindex $status 0]; + + # Bad task id, reboot and try again. + if { $tid == -1 || $tid == 0 } { + return -1; + } + + set result 1; + # FIXME: The value 300 below should be a parameter. + remote_expect $dest 300 { + -re "task ${hex} - aborted.*$shell_prompt $" { + # FIXME: It's not clear we'll ever get here. + verbose "$function aborted" + set result 1 + } + -re "\[\r\n\]syntax error\[\r\n\]" { + verbose "weirdness after task started" + set result -1; + } + -re "(.*)\\*\\*\\* EXIT code ($decimal)\[\r\n\]" { + set output "$expect_out(1,string)"; + set exit_code "$expect_out(2,string)"; + if { ($exit_code + 0) != 0 } { + set result 1; + } else { + set result 0; + } + } + -re "Operation Fault.*fault type:" { + set result 1; + } + -re "Bus Error" { + # This is here to try to cope with apparently flaky h/w. + # This is potentially an error in the testcase, but we don't + # really know, do we? + warning "Bus Error." + set result 1; + set output "Bus Error"; + remote_reboot $dest; + } + timeout { + # Infinite loop? probably. + remote_exec $dest "td" "$tid"; + set result 1; + } + } + + return [list $result $output]; +} + +# +# Unload the last executable that we loaded, so we can free up its memory. +# +proc vxworks_unld { dest } { + global board_info; + + if [board_info $dest exists vx_module] { + # Vxworks5.0 does not have the unld command. + if { [board_info $dest os] != "vxworks5.0" } { + remote_exec $dest "unld" "[board_info $dest vx_module]"; + } + unset board_info([board_info $dest name],vx_module); + } +} + +# +# We loop around rebooting the box until either the load and run +# "work" or we give up. +# +proc vxworks_load {dest prog args} { + set result ""; + set output ""; + + if { [llength $args] > 0 } { + set pargs "[lindex $args 0]"; + } else { + set pargs "" + } + + if { [llength $args] > 1 } { + set inp "[lindex $args 1]"; + } else { + set inp "" + } + + if { [llength $args] > 2 } { + set outp "[lindex $args 2]"; + } else { + set outp "" + } + + for { set x 0; } { $x < 3 } { incr x } { + set status [vxworks_ld $dest $prog]; + if { $status >= 0 } { + if { $status > 0 } { + set result "fail"; + } else { + set out [vxworks_run $dest __wrap_main $pargs $inp $outp]; + set status [lindex $out 0]; + set output [lindex $out 1]; + # Get rid of the carriage returns, because they confuse + # callers that try to parse the result. + regsub -all "\r" $output "" output + if { $status != 0 } { + if { $status > 0 } { + set result "fail"; + } + } else { + set result "pass"; + } + } + } + if { $result != "" } { + vxworks_unld $dest; + return [list $result $output]; + } + remote_reboot $dest; + } + return [list "fail" ""]; +} + +set_board_info protocol "vxworks" +# -lm under vxworks isn't needed. +set_board_info mathlib "" +set_board_info shell_prompt "->" +set_board_info needs_status_wrapper 1 +# FTP doesn't work in passive mode to this board. +set_board_info ftp_no_passive 1 +# Wait 15 seconds after powercycling. +set_board_info reboot_delay 15 + +# We don't have sys/unistd.h. +set_board_info wrap_compile_flags "-DNO_UNISTD_H" + +set_board_info gdb_prompt "\[(\]vxgdb\[)\]" + +set_board_info is_vxworks 1; +set_board_info gdb,nosignals 1; |