# Copyright (C) 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. # This file was written by Bob Manson (manson@cygnus.com) # Reset the prompt to what GDB needs. proc ${board}_init { dest } { global doing_ddb_init if ![info exists doing_ddb_init] { set doing_ddb_init 1 remote_close $dest for { set x 0 } { $x < 3 } { incr x } { set shell_id [remote_open $dest] if { $shell_id == "" || $shell_id < 0 } { remote_reboot $dest } else { break } } set shell_prompt [board_info $dest shell_prompt] remote_send $dest "\n" remote_expect $dest 10 { -re ".*PMON> $" { remote_send $dest "set prompt \"$shell_prompt\"\n" exp_continue } -re ".*${shell_prompt}$" { } } remote_close $dest unset doing_ddb_init } else { return } } proc ddb_ether_load { dest prog args } { for { set x 0 } { $x < 3 } { incr x } { set result [eval remote_spawn \{$dest\} \{$prog\} $args] if { $result < 0 } { remote_reboot $dest } else { set result [remote_wait $dest 300] set status [lindex $result 0] set output [lindex $result 1] if { $status >= 0 } { if { $status > 0 } { return [list "fail" $output] } else { return [list "pass" $output] } } } } return [list "fail" ""] } proc ddb_ether_ld { dest prog } { if ![board_info $dest exists tftpdir] { perror "Must set_board_info tftpdir for [board_info $dest name]" return "fail" } if ![board_info $dest exists fileid] { set spawn_id [remote_open $dest] if { $spawn_id == "" || $spawn_id < 0 } { return "retry" } remote_binary $dest } set shell_prompt [board_info $dest shell_prompt] remote_send $dest "\n" remote_expect $dest 10 { -re ".*${shell_prompt}$" { } default { return "retry" } } set basename "a.out.[pid]" set file "[board_info $dest tftpdir]/$basename" set file [remote_download build $prog $file] if { $file == "" } { perror "download to tftp area failed" return "fail" } set state "pass" remote_send $dest "boot /$basename\n" set tries 0 remote_expect $dest 30 { -re "Loading.*Entry address is.*${shell_prompt}$" { } -re "invalid executable.*${shell_prompt}$" { incr tries if { $tries < 3 } { sleep 2 remote_send $dest "boot /$basename\n" exp_continue } } -re ".*${shell_prompt}$" { set state "fail" } default { set state "fail" } } remote_file build delete $file if { $state == "fail" } { return $state } return "pass" } proc ddb_ether_spawn { dest prog args } { set state [ddb_ether_ld $dest $prog] if { $state != "pass" } { return -1 } remote_send $dest "g\n" remote_expect $dest 5 { -re "g\[\r\n\]\[\r\n\]?" { } default { } } return [board_info $dest fileid] } proc ddb_ether_wait { dest timeout } { set output "" set shell_prompt [board_info $dest shell_prompt] remote_expect $dest $timeout { -re "^g\[\r\n\]\[\r\n\]?" { if { $output != "" } { append output $expect_out(buffer) } exp_continue } -re "(.*)$shell_prompt" { append output $expect_out(1,string) set status [check_for_board_status output] if { $status > 0 } { return [list $status $output] } else { if [regexp "Exception Cause=" $output] { remote_reboot $dest return [list -1 $output] } return [list 0 $output] } } -re "\[\r\n\]+" { append output $expect_out(buffer) if { [string length $output] < 512000 } { exp_continue } else { return [list -1 ""] } } default { return [list -1 ""] } } } set_board_info send_initial_cr 1 set_board_info protocol "ddb_ether" set_board_info shell_prompt "NEC010> "