| # 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 udi using mondfe |
| # |
| # HOSTNAME can be `iss' to talk to the simulator. |
| # The result is the value of `spawn_id' or -1 for failure. |
| # |
| proc mondfe_open { hostname } { |
| global spawn_id |
| global board_info |
| |
| set retries 0 |
| set result -1 |
| |
| set shell_prompt [board_info $hostname shell_prompt] |
| if ![board_info $hostname exists mondfe,name] { |
| perror "Must set board_info(${hostname},mondfe,name)" |
| return -1 |
| } |
| if [board_info $hostname exists mondfe] { |
| set mondfe [board_info $hostname mondfe] |
| } else { |
| set mondfe "mondfe" |
| } |
| |
| set remote_host [board_info $hostname mondfe,name] |
| |
| if [board_info $hostname exists mondfe_host] { |
| set rh [board_info $hostname mondfe_host] |
| } else { |
| verbose "Attempting to connect to $hostname via mondfe." |
| set rh "host" |
| } |
| |
| set shell_id [remote_spawn $rh "$mondfe -D -TIP $remote_host"] |
| |
| remote_expect $rh 60 { |
| "$shell_prompt" { |
| verbose "Got prompt" |
| set result 0 |
| } |
| "*server bind*failed: Address already in use*" { |
| warning "Socket file already exists." |
| incr retries |
| if { $retries <= 2 } { |
| exp_continue |
| } |
| } |
| -indices -re ".*(UDIERROR\[^\r\n\]*)\[\r\n\]" { |
| warning "$expect_out(1,string)" |
| exp_continue |
| } |
| -indices -re ".*(DFEERROR\[^\r\n\]*)\[\r\n\]" { |
| warning "$expect_out(1,string)" |
| exp_continue |
| } |
| timeout { |
| warning "Timed out trying to connect." |
| set result -1 |
| incr retries |
| if { $retries <= 2 } { |
| remote_send $rh "\n" |
| exp_continue |
| } |
| } |
| } |
| |
| if { $result < 0 } { |
| perror "Couldn't connect after $retries retries." |
| remote_close $rh |
| return -1 |
| } else { |
| set board_info($hostname,fileid) $shell_id |
| return $shell_id |
| } |
| } |
| |
| # |
| # Downloads using the y (yank) command in mondfe |
| # |
| # FILE is a full path name to the file to download. |
| # Returns 1 if an error occured, 0 otherwise. |
| # |
| proc mondfe_ld { dest_machine file } { |
| global decimal # Regexp to match a decimal number. |
| |
| if ![file exists $file] { |
| perror "$file doesn't exist." |
| return "" |
| } |
| |
| set shell_prompt [board_info $dest_machine shell_prompt] |
| |
| if [board_info $dest_machine exists mondfe_host] { |
| set remote_host [board_info $dest_machine mondfe_host] |
| set file [remote_download $remote_host $file montest] |
| } else { |
| set remote_host "host" |
| } |
| |
| verbose "Downloading $file." 2 |
| verbose "Shell prompt is $shell_prompt." 3 |
| set result 1 |
| remote_send $remote_host "y $file\n" |
| remote_expect $remote_host 60 { |
| "y $file" { |
| exp_continue |
| } |
| -re "loading $file\[\r\n\]+" { |
| exp_continue |
| } |
| -re "Load(ing|ed) *TEXT section from\[^\r\n\]*\[\r\n\]+" { |
| verbose -n "." 2 |
| exp_continue |
| } |
| -re "Load(ing|ed) *LIT section from\[^\r\n\]*\[\r\n\]+" { |
| verbose -n "." 2 |
| exp_continue |
| } |
| -re "Load(ing|ed) *DATA section from\[^\r\n\]*\[\r\n\]+" { |
| verbose -n "." 2 |
| exp_continue |
| } |
| -re "Clear(ing|ed) *BSS section from\[^\r\n\]*\[\r\n\]+" { |
| verbose -n "." 2 |
| exp_continue |
| } |
| -re "(^|\[\r\n\]+)$shell_prompt$" { |
| verbose "Downloaded $file successfully." 2 |
| set result 0 |
| } |
| -re "Command failed.*$shell_prompt$" { |
| set result 1 |
| } |
| -re "DFEWARNING: $decimal : EMMAGIC: Bad COFF file magic number.*Command failed.*$shell_prompt$" { |
| warning "Bad COFF file magic number" |
| set result 1 |
| } |
| -re "Ignoring COMMENT section \($decimal bytes\)\[^\r\n\]*\[\r\n\]+" { |
| verbose "Ignoring COMMENT section" 2 |
| exp_continue |
| } |
| timeout { |
| perror "Timed out trying to download $file." |
| set result 1 |
| } |
| } |
| |
| if { $result && [info exists expect_out(buffer)] } { |
| send_log $expect_out(buffer) |
| } |
| |
| if [board_info $dest_machine exists mondfe_host] { |
| remote_file $remote_machine delete $file |
| } |
| |
| return $result |
| } |
| |
| # |
| # Exit the remote shell |
| # |
| proc mondfe_close { hostname } { |
| global board_info |
| |
| if [board_info $hostname exists mondfe_host] { |
| set remote_host [board_info $hostname mondfe_host] |
| } else { |
| set remote_host "host" |
| } |
| |
| if ![board_info $hostname exists fileid] { |
| return 0 |
| } |
| |
| if [board_info $remote_host exists fileid] { |
| remote_send $remote_host "q\n" |
| remote_expect $remote_host 30 { |
| "Goodbye." { |
| verbose "Exited mondfe." |
| } |
| timeout { |
| warning "mondfe didn't exit cleanly." |
| } |
| } |
| |
| remote_close $remote_host |
| } |
| |
| unset board_info($hostname,fileid) |
| |
| return 0 |
| } |