1# Copyright 2009-2013 Free Software Foundation, Inc.
2#
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program.  If not, see <http://www.gnu.org/licenses/>.
15#
16# Contributed by Markus Deuling <deuling@de.ibm.com>.
17#
18# Testsuite for Cell Broadband Engine combined debugger
19# This testcases tests on PPU and SPU if variables and registers are accessible
20# via print and set by using names and adresses.
21
22load_lib cell.exp
23
24set ppu_file "mem-access"
25set ppu_src ${srcdir}/${subdir}/${ppu_file}.c
26set ppu_bin ${objdir}/${subdir}/${ppu_file}
27set spu_file "mem-access-spu"
28set spu_src ${srcdir}/${subdir}/${spu_file}.c
29set spu_bin ${objdir}/${subdir}/${spu_file}
30
31if {[skip_cell_tests]} {
32    return 0
33}
34
35# Compile SPU binary.
36if { [gdb_compile_cell_spu $spu_src $spu_bin executable {debug}]  != "" } {
37  unsupported "Compiling spu binary failed."
38  return -1
39}
40# Compile PPU binary.
41if { [gdb_cell_embedspu $spu_bin $spu_bin-embed.o {debug}]  != "" } {
42  unsupported "Embedding spu binary failed."
43  return -1
44}
45if { [gdb_compile_cell_ppu [list $ppu_src $spu_bin-embed.o] $ppu_bin executable {debug}] != "" } {
46  unsupported "Compiling ppu binary failed."
47  return -1
48}
49
50if [get_compiler_info] {
51  return -1
52}
53
54# Get the adress to symbol name. If $reg
55# is set to 1, get address from a register.
56proc get_adress_from_name { name reg } {
57  global gdb_prompt
58  set adr ""
59
60  if { $reg == 1 } {
61    set q "x/x $name"
62  } else {
63    set q "x/x &$name"
64  }
65
66  gdb_test_multiple $q "get address from $name" {
67    -re "(0x.....):.*$gdb_prompt $" { # Registers.
68      set adr $expect_out(1,string)
69      pass "get adress from $name = $adr"
70    }
71    -re "(0x........) <.*$gdb_prompt $" { # PPU address.
72      set adr $expect_out(1,string)
73      pass "get adress from $name = $adr"
74    }
75    -re "(0x....) <.*$gdb_prompt $" { # SPU address.
76      set adr $expect_out(1,string)
77      pass "get adress from $name = $adr"
78    }
79    -re "(0x...) <.*$gdb_prompt $" { # SPU address.
80      set adr $expect_out(1,string)
81      pass "get adress from $name = $adr"
82    }
83  }
84
85  return ${adr}
86}
87
88# Try to set a $value at adress $adr.
89proc set_adr_content { adr value } {
90  gdb_test "set *$adr=$value" \
91	   "" \
92	   "set *$adr=$value"
93}
94
95# Try to set a $value for $symbol.
96proc set_symbol_content { symbol value } {
97  gdb_test "set $symbol=$value" \
98	   "" \
99	   "set *$symbol=$value"
100}
101
102# Check if $value is at *adr
103proc test_adr_content { adr value } {
104  gdb_test "p *$adr" \
105           ".*=.*$value.*" \
106           "(ptr) *$adr==$value"
107}
108
109proc test_symbol_content { symbol value } {
110  gdb_test "p $symbol" \
111	   ".*=.*$value.*" \
112	   "(symbol) $symbol==$value"
113}
114
115# Check VARNAME. Check if it has the inital
116# value INITIALVALUE. Set it to NEWVALUE.
117# Check if set properly. Do it via symbols and
118# pointers.
119proc check_var { varname initalvalue newvalue } {
120
121  # Initial value should be $initalvalue.
122  test_symbol_content $varname $initalvalue
123
124  # Get pointer to symbol and check if the
125  # initial value is found.
126  set adr [get_adress_from_name $varname 0]
127  test_adr_content $adr $initalvalue
128
129  # Re-set value using the pointer.
130  set_adr_content $adr $newvalue
131
132  # Test values by pointer and by symbol.
133  test_adr_content $adr $newvalue
134  test_symbol_content $varname $newvalue
135
136  # Set value back to initalvalue using symbol
137  # name and check it.
138  set_symbol_content $varname $initalvalue
139  test_adr_content $adr $initalvalue
140  test_symbol_content $varname $initalvalue
141}
142
143gdb_exit
144gdb_start
145gdb_reinitialize_dir $srcdir/$subdir
146gdb_load ${ppu_bin}
147
148if ![runto_main] then {
149  fail "Can't run to main"
150  return 0
151}
152
153# Check in PPU thread.
154c_to "Marker PPUEA" $ppu_file.c
155check_var "test_var" 5 7
156
157# Go to SPU thread.
158cont_spu_main
159c_to "Marker SPUEA" $spu_file.c
160check_spu_arch ""
161
162# Check in SPU thread.
163check_var "test_var" 5 7
164# Check $sp register.
165set adr [get_adress_from_name "\$sp" 1]
166set_adr_content $adr 8
167test_adr_content $adr 8
168
169gdb_exit
170return 0
171