| # Copyright 2009-2016 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/>. |
| # |
| # Contributed by Markus Deuling <deuling@de.ibm.com>. |
| # |
| # Testsuite for Cell Broadband Engine combined debugger |
| # This testcases tests on PPU and SPU if variables and registers are accessible |
| # via print and set by using names and adresses. |
| |
| load_lib cell.exp |
| |
| set ppu_file "mem-access" |
| set ppu_src ${srcdir}/${subdir}/${ppu_file}.c |
| set ppu_bin ${objdir}/${subdir}/${ppu_file} |
| set spu_file "mem-access-spu" |
| set spu_src ${srcdir}/${subdir}/${spu_file}.c |
| set spu_bin ${objdir}/${subdir}/${spu_file} |
| |
| if {[skip_cell_tests]} { |
| return 0 |
| } |
| |
| # Compile SPU binary. |
| if { [gdb_compile_cell_spu $spu_src $spu_bin executable {debug}] != "" } { |
| unsupported "Compiling spu binary failed." |
| return -1 |
| } |
| # Compile PPU binary. |
| if { [gdb_cell_embedspu $spu_bin $spu_bin-embed.o {debug}] != "" } { |
| unsupported "Embedding spu binary failed." |
| return -1 |
| } |
| if { [gdb_compile_cell_ppu [list $ppu_src $spu_bin-embed.o] $ppu_bin executable {debug}] != "" } { |
| unsupported "Compiling ppu binary failed." |
| return -1 |
| } |
| |
| if [get_compiler_info] { |
| return -1 |
| } |
| |
| # Get the adress to symbol name. If $reg |
| # is set to 1, get address from a register. |
| proc get_adress_from_name { name reg } { |
| global gdb_prompt |
| set adr "" |
| |
| if { $reg == 1 } { |
| set q "x/x $name" |
| } else { |
| set q "x/x &$name" |
| } |
| |
| gdb_test_multiple $q "get address from $name" { |
| -re "(0x.....):.*$gdb_prompt $" { # Registers. |
| set adr $expect_out(1,string) |
| pass "get adress from $name = $adr" |
| } |
| -re "(0x........) <.*$gdb_prompt $" { # PPU address. |
| set adr $expect_out(1,string) |
| pass "get adress from $name = $adr" |
| } |
| -re "(0x....) <.*$gdb_prompt $" { # SPU address. |
| set adr $expect_out(1,string) |
| pass "get adress from $name = $adr" |
| } |
| -re "(0x...) <.*$gdb_prompt $" { # SPU address. |
| set adr $expect_out(1,string) |
| pass "get adress from $name = $adr" |
| } |
| } |
| |
| return ${adr} |
| } |
| |
| # Try to set a $value at adress $adr. |
| proc set_adr_content { adr value } { |
| gdb_test "set *$adr=$value" \ |
| "" \ |
| "set *$adr=$value" |
| } |
| |
| # Try to set a $value for $symbol. |
| proc set_symbol_content { symbol value } { |
| gdb_test "set $symbol=$value" \ |
| "" \ |
| "set *$symbol=$value" |
| } |
| |
| # Check if $value is at *adr |
| proc test_adr_content { adr value } { |
| gdb_test "p *$adr" \ |
| ".*=.*$value.*" \ |
| "(ptr) *$adr==$value" |
| } |
| |
| proc test_symbol_content { symbol value } { |
| gdb_test "p $symbol" \ |
| ".*=.*$value.*" \ |
| "(symbol) $symbol==$value" |
| } |
| |
| # Check VARNAME. Check if it has the inital |
| # value INITIALVALUE. Set it to NEWVALUE. |
| # Check if set properly. Do it via symbols and |
| # pointers. |
| proc check_var { varname initalvalue newvalue } { |
| |
| # Initial value should be $initalvalue. |
| test_symbol_content $varname $initalvalue |
| |
| # Get pointer to symbol and check if the |
| # initial value is found. |
| set adr [get_adress_from_name $varname 0] |
| test_adr_content $adr $initalvalue |
| |
| # Re-set value using the pointer. |
| set_adr_content $adr $newvalue |
| |
| # Test values by pointer and by symbol. |
| test_adr_content $adr $newvalue |
| test_symbol_content $varname $newvalue |
| |
| # Set value back to initalvalue using symbol |
| # name and check it. |
| set_symbol_content $varname $initalvalue |
| test_adr_content $adr $initalvalue |
| test_symbol_content $varname $initalvalue |
| } |
| |
| gdb_exit |
| gdb_start |
| gdb_reinitialize_dir $srcdir/$subdir |
| gdb_load ${ppu_bin} |
| |
| if ![runto_main] then { |
| fail "Can't run to main" |
| return 0 |
| } |
| |
| # Check in PPU thread. |
| c_to "Marker PPUEA" $ppu_file.c |
| check_var "test_var" 5 7 |
| |
| # Go to SPU thread. |
| cont_spu_main |
| c_to "Marker SPUEA" $spu_file.c |
| check_spu_arch "" |
| |
| # Check in SPU thread. |
| check_var "test_var" 5 7 |
| # Check $sp register. |
| set adr [get_adress_from_name "\$sp" 1] |
| set_adr_content $adr 8 |
| test_adr_content $adr 8 |
| |
| gdb_exit |
| return 0 |