| # Copyright 2020-2021 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 3 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, see <http://www.gnu.org/licenses/>. |
| |
| # Let the user override the path to the simavr binary with the SIMAVR_PATH |
| # environment variable. |
| |
| if { [info exists ::env(SIMAVR_PATH)] } { |
| set simavr_path $::env(SIMAVR_PATH) |
| } else { |
| set simavr_path simavr |
| } |
| |
| # Let the user override the simulated AVR chip with the SIMAVR_PATH environment |
| # variable. |
| # |
| # The value passed here must be supported by avr-gcc (see the -mmcu flag in the |
| # `AVR Options` section of the gcc(1) man page) and by simavr (see output of |
| # `simavr --list-cores`). |
| |
| if { [info exists ::env(SIMAVR_MCU)] } { |
| set simavr_mcu $::env(SIMAVR_MCU) |
| } else { |
| set simavr_mcu atmega2560 |
| } |
| |
| set simavr_last_load_file "" |
| set simavr_spawn_id "" |
| |
| set_board_info compiler avr-gcc |
| set_board_info c++compiler avr-g++ |
| |
| set_board_info cflags "-mmcu=${simavr_mcu}" |
| set_board_info ldflags "-mmcu=${simavr_mcu}" |
| |
| # As of version 10, GCC produces stabs by default for AVR. Force it to use |
| # DWARF. |
| set_board_info debug_flags "-gdwarf-4" |
| |
| set_board_info use_gdb_stub 1 |
| set_board_info gdb_protocol "remote" |
| set_board_info gdb,do_reload_on_run 1 |
| set_board_info noargs 1 |
| set_board_info gdb,noinferiorio 1 |
| set_board_info gdb,nofileio 1 |
| set_board_info gdb,noresults 1 |
| set_board_info gdb,nosignals 1 |
| |
| proc gdb_load { file } { |
| global simavr_last_load_file |
| global simavr_spawn_id |
| global simavr_mcu |
| global simavr_path |
| global gdb_prompt |
| |
| if { $file == "" } { |
| set file $simavr_last_load_file |
| } else { |
| set simavr_last_load_file $file |
| } |
| |
| gdb_file_cmd $file |
| |
| # Close any previous simavr instance. |
| if { $simavr_spawn_id != "" } { |
| verbose -log "simavr: closing previous spawn id $simavr_spawn_id" |
| if [catch { close -i $simavr_spawn_id } != 0] { |
| warning "simavr: failed to close connection to previous simavr instance" |
| } |
| |
| wait -i $simavr_spawn_id |
| set simavr_spawn_id "" |
| } |
| |
| # Run simavr. |
| set cmd "spawn -noecho ${simavr_path} --mcu ${simavr_mcu} -g $file" |
| verbose -log "Spawning simavr: $cmd" |
| eval $cmd |
| set simavr_spawn_id $spawn_id |
| |
| verbose -log "simavr: simavr spawned with spawn id $simavr_spawn_id, pid [exp_pid $simavr_spawn_id]" |
| |
| # Wait for "listening on port" message of simavr. |
| expect { |
| -i $simavr_spawn_id -re ".*avr_gdb_init listening on port 1234" {} |
| timeout { |
| verbose -log "simavr: timeout, closing simavr spawn id" |
| close -i $simavr_spawn_id |
| verbose -log "simavr: timeout, waiting for simavr process exit" |
| wait -i $simavr_spawn_id |
| set simavr_spawn_id "" |
| error "unable to start simavr: timeout" |
| } |
| eof { |
| verbose -log "simavr: eof, waiting for simavr process exit" |
| wait -i $simavr_spawn_id |
| set simavr_spawn_id "" |
| error "unable to start simavr: eof" |
| } |
| } |
| |
| # Connect to simavr. |
| send_gdb "target remote :1234\n" |
| gdb_expect { |
| -re ".*Remote debugging using :1234.*\[\r\n\]+$gdb_prompt $" {} |
| timeout { |
| verbose -log "simavr: unable to connect to simavr, closing simavr spawn id" |
| close -i $simavr_spawn_id |
| verbose -log "simavr: unable to connect to simavr, waiting for simavr process exit" |
| wait -i $simavr_spawn_id |
| set simavr_spawn_id "" |
| error "unable to connect to simavr stub" |
| } |
| } |
| |
| return 0 |
| } |