Commit | Line | Data |
---|---|---|
42a4f53d | 1 | # Copyright 2009-2019 Free Software Foundation, Inc. |
1ea34204 UW |
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 | ||
22 | load_lib cell.exp | |
23 | ||
24 | set ppu_file "mem-access" | |
25 | set ppu_src ${srcdir}/${subdir}/${ppu_file}.c | |
617cd4bc | 26 | set ppu_bin [standard_output_file ${ppu_file}] |
1ea34204 UW |
27 | set spu_file "mem-access-spu" |
28 | set spu_src ${srcdir}/${subdir}/${spu_file}.c | |
617cd4bc | 29 | set spu_bin [standard_output_file ${spu_file}] |
1ea34204 UW |
30 | |
31 | if {[skip_cell_tests]} { | |
32 | return 0 | |
33 | } | |
34 | ||
35 | # Compile SPU binary. | |
36 | if { [gdb_compile_cell_spu $spu_src $spu_bin executable {debug}] != "" } { | |
bc6c7af4 | 37 | unsupported "compiling spu binary failed." |
1ea34204 UW |
38 | return -1 |
39 | } | |
40 | # Compile PPU binary. | |
41 | if { [gdb_cell_embedspu $spu_bin $spu_bin-embed.o {debug}] != "" } { | |
bc6c7af4 | 42 | unsupported "embedding spu binary failed." |
1ea34204 UW |
43 | return -1 |
44 | } | |
45 | if { [gdb_compile_cell_ppu [list $ppu_src $spu_bin-embed.o] $ppu_bin executable {debug}] != "" } { | |
bc6c7af4 | 46 | unsupported "compiling ppu binary failed." |
1ea34204 UW |
47 | return -1 |
48 | } | |
49 | ||
4c93b1db | 50 | if [get_compiler_info] { |
1ea34204 UW |
51 | return -1 |
52 | } | |
53 | ||
54 | # Get the adress to symbol name. If $reg | |
55 | # is set to 1, get address from a register. | |
56 | proc 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. | |
89 | proc 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. | |
96 | proc 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 | |
103 | proc test_adr_content { adr value } { | |
104 | gdb_test "p *$adr" \ | |
105 | ".*=.*$value.*" \ | |
106 | "(ptr) *$adr==$value" | |
107 | } | |
108 | ||
109 | proc 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. | |
119 | proc 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 | ||
143 | gdb_exit | |
144 | gdb_start | |
145 | gdb_reinitialize_dir $srcdir/$subdir | |
146 | gdb_load ${ppu_bin} | |
147 | ||
148 | if ![runto_main] then { | |
bc6c7af4 | 149 | fail "can't run to main" |
1ea34204 UW |
150 | return 0 |
151 | } | |
152 | ||
153 | # Check in PPU thread. | |
154 | c_to "Marker PPUEA" $ppu_file.c | |
155 | check_var "test_var" 5 7 | |
156 | ||
157 | # Go to SPU thread. | |
158 | cont_spu_main | |
159 | c_to "Marker SPUEA" $spu_file.c | |
160 | check_spu_arch "" | |
161 | ||
162 | # Check in SPU thread. | |
163 | check_var "test_var" 5 7 | |
164 | # Check $sp register. | |
165 | set adr [get_adress_from_name "\$sp" 1] | |
166 | set_adr_content $adr 8 | |
167 | test_adr_content $adr 8 | |
168 | ||
169 | gdb_exit | |
170 | return 0 |