| # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, |
| # 2001, 2002, 2003 Free Software Foundation, Inc. |
| # |
| # This file is part of DejaGnu. |
| # |
| # DejaGnu 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. |
| # |
| # DejaGnu 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 DejaGnu; if not, write to the Free Software Foundation, |
| # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| |
| # This file was written by Rob Savoye. (rob@welcomehome.org) |
| |
| # |
| # Connect to Spectra (VTRX) using xsh |
| # |
| proc xsh_open { hostname } { |
| global hex |
| global target_triplet |
| global xsh_shell_prompt |
| global board_info |
| |
| if [board_info $hostname exists fileid] { |
| unset board_info($hostname,fileid) |
| } |
| |
| if ![board_info $hostname exists spectra] { |
| perror "No spectra directory for $hostname" |
| return -1 |
| } else { |
| set spectra [board_info $hostname spectra] |
| } |
| |
| if ![board_info $hostname exists xsh_shell_prompt] { |
| set xsh_shell_prompt ".*> " |
| } else { |
| set xsh_shell_prompt [board_info $hostname shell_prompt] |
| } |
| |
| set retries 0 |
| set result 0 |
| if ![board_info $hostname exists xsh_prog] { |
| set xsh xsh |
| } else { |
| set xsh [board_info $hostname xsh_prog] |
| } |
| |
| if {[which $xsh] != 0} { |
| spawn $xsh |
| } else { |
| warning "Can't find xsh in path" |
| return -1 |
| } |
| |
| set shell_id $spawn_id |
| |
| # start the shell |
| expect { |
| "*Spectra Cross-Development Shell version*$xsh_shell_prompt" { |
| verbose "Got prompt" |
| set result 0 |
| } |
| timeout { |
| warning "Timed out trying to connect." |
| set result -1 |
| incr retries |
| if { $retries <= 2 } { |
| exp_continue |
| } |
| } |
| } |
| |
| # connect to the shell |
| set retries 0 |
| send "connect $hostname\n" |
| expect { |
| "connect $hostname*$hostname connected \(non-os mode\)*\n" { |
| set xsh_shell_prompt "$hostname> " |
| verbose "Connected to $hostname" |
| } |
| "*connect: not attached*" { |
| warning "Couldn't attach target" |
| set result -1 |
| } |
| -re ".* reset on target.*$" { |
| send_user "Spectra was reset\n" |
| exp_continue |
| } |
| -re "\[0-9A-Fa-f\]+\[ 0x\]+\[0-9A-Fa-f\]+.*$" { |
| exp_continue |
| } |
| "$hostname> " { |
| #send "\n" |
| } |
| timeout { |
| warning "Timed out trying to connect after $expect_out(seconds) seconds." |
| set result -1 |
| incr retries |
| if { $retries <= 2 } { |
| exp_continue |
| } |
| } |
| } |
| |
| send "\n\n\n" |
| expect { |
| "*$hostname*$hostname" { |
| verbose "Cleared reset messages" 1 |
| } |
| timeout { |
| warning "Couldn't clear reset messages" |
| set result 1 |
| } |
| } |
| |
| set board_info($hostname,fileid) $spawn_id |
| # load to operating system |
| set timeout 20 |
| set retries 0 |
| if {[xsh_download $hostname $spectra/${target_triplet}-os.o "" {-e sys_start_crt0}]!=0} { |
| perror "Couldn't load Spectra into target" |
| return -1 |
| } |
| |
| set timeout 10 |
| # start the OS running |
| set retries 0 |
| send "go\n" |
| expect { |
| -re ".*Multithreading on target darkstar.*$" { |
| verbose "Spectra has been started..." 1 |
| set result 0 |
| } |
| -re ".*reset on target.*$" { |
| verbose "Spectra was reset" |
| exp_continue |
| } |
| -re "\[0-9A-Fa-f\]+\[ 0x\]+\[0-9A-Fa-f\]+.*$" { |
| #send "\n" |
| exp_continue |
| } |
| -re "go\n" { exp_continue } |
| "$xsh_shell_prompt" { exp_continue } |
| timeout { |
| perror "Spectra wouldn't start" |
| set result -1 |
| incr retries |
| if { $retries <= 2 } { |
| send "go\r" |
| exp_continue |
| } |
| } |
| } |
| |
| if { $result < 0 } { |
| perror "Couldn't connect after $retries retries.\n" |
| return -1 |
| } else { |
| set board_info($hostname,fileid) $spawn_id |
| return $spawn_id |
| } |
| } |
| |
| # |
| # Download an executable using the load command in Spectra. |
| # arg[0] - is a full path name to the file to download. |
| # arg[1] - optional arguments to the load command. |
| # returns 1 if a spectra error occured, |
| # -1 if an internal error occured, |
| # 0 otherwise. |
| # |
| proc xsh_download { dest file destfile args } { |
| global verbose |
| global shell_id |
| global decimal |
| global hex |
| global expect_out |
| global board_info |
| |
| set result 1 |
| set retries 0 |
| set shell_id [board_info $dest fileid] |
| |
| if { [llength $args] > 1 } { |
| set opts [lindex $args 1] |
| } else { |
| set opts "" |
| } |
| |
| if { [llength $args] > 0 } { |
| set destfile [lindex $args 0] |
| } |
| |
| if ![file exists $file] { |
| perror "$file doesn't exist." |
| return 1 |
| } |
| |
| verbose "Downloading $file..." |
| |
| send -i $shell_id "load $opts $file\r" |
| set force 0 |
| expect { |
| -i $shell_id -re "\[0-9A-Fa-f\]+\[ 0x\]+\[0-9A-Fa-f\]+\r\n" { |
| set timeout 1 |
| send "dout\n" |
| while $force<2 { |
| expect { |
| "dout*undefined kernel symbol*$xsh_shell_prompt" { |
| verbose "Attempted to flush I/O buffers" 1 |
| } |
| timout { |
| incr force |
| flush stdout |
| } |
| } |
| } |
| set timeout 20 |
| exp_continue |
| } |
| -i $shell_id "load $opts $file*\r" { |
| verbose "Loading a.out..." |
| exp_continue |
| } |
| -i $shell_id "Warm reset on target*\n" { |
| verbose "Spectra did a warm reset" |
| exp_continue |
| } |
| -i $shell_id "Cold reset on target*\n" { |
| verbose "Spectra did a cold reset" |
| exp_continue |
| } |
| -i $shell_id "loading a.out*\r" { |
| verbose "Loading a.out..." |
| exp_continue |
| } |
| -i $shell_id "reading symbols*\r" { |
| verbose "Reading symbols..." |
| exp_continue |
| } |
| -i $shell_id "defining symbols*\r" { |
| verbose "defining symbols..." |
| exp_continue |
| } |
| -i $shell_id "*loading image*\r" { |
| verbose "Loading image..." |
| exp_continue |
| } |
| -i $shell_id -re ".*bytes loaded:.*$decimal.*$" { |
| verbose "$expect_out(buffer)" |
| exp_continue |
| } |
| -i $shell_id "*loading done*\r" { |
| verbose "Loading done..." |
| exp_continue |
| } |
| -i $shell_id "*setting PC*\r" { |
| verbose "Setting PC..." |
| exp_continue |
| } |
| -i $shell_id "*resolving symbols*\r" { |
| verbose "Resolving symbols..." |
| exp_continue |
| } |
| -i $shell_id -re ".*load module id = $decimal.*$" { |
| verbose "" |
| } |
| -i $shell_id -re ".*load: undefined symbols.*$" { |
| perror "undefined symbols, make sure os is loaded and running" |
| set result -1 |
| } |
| -i $shell_id "$xsh_shell_prompt" { |
| set result 0 |
| exp_continue |
| } |
| -i $shell_id "load: no default target" { |
| perror "default target isn't set" |
| return -1 |
| } |
| -i $shell_id timeout { |
| perror "Timed out trying to download after $expect_out(seconds) seconds." |
| incr retries |
| set result 1 |
| if { $retries <= 2 } { |
| exp_continue |
| } |
| } |
| } |
| |
| set timeout 10 |
| if [info exists expect_out(buffer)] { |
| send_log $expect_out(buffer) |
| } |
| set board_info($hostname,fileid) $shell_id |
| return $result |
| } |
| |
| # |
| # Exit the remote shell |
| # |
| proc xsh_close { hostname } { |
| global board_info |
| |
| if ![board_info $hostname exists fileid] { |
| return |
| } |
| |
| set shell_id [board_info ${hostname} fileid] |
| send -i $shell_id "exit\n" |
| unset board_info(${hostname},fileid) |
| |
| verbose "Exiting shell." |
| return 0 |
| } |