1 # Copyright (C) 2023-2024 Free Software Foundation, Inc.
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.
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.
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/>.
16 # Exercise reading/writing ZA registers when there is ZA state.
17 # Exercise reading/writing to ZT0 when there is ZA state available.
19 load_lib aarch64-scalable.exp
21 require is_aarch64_target
22 require allow_aarch64_sve_tests
23 require allow_aarch64_sme_tests
25 # Remote targets can't communicate vector length (vl or svl) changes
27 require
!gdb_protocol_is_remote
30 # Cycle through all ZA registers and pseudo-registers and validate that their
31 # contents are available for vector length SVL.
33 # Make sure reading/writing to ZA registers work as expected.
35 proc check_regs
{ mode vl svl
} {
36 # Check VG to make sure it is correct
37 set expected_vg
[expr $vl / 8]
38 gdb_test
"print \$vg" "= ${expected_vg}"
40 # Check SVG to make sure it is correct
41 set expected_svg
[expr $svl / 8]
42 gdb_test
"print \$svg" "= ${expected_svg}"
44 # If svl is adjusted by prctl, we will have ZA enabled. If gdb is
45 # adjusting svl, ZA will not be enabled by default. It will only be
46 # enabled when ZA is written to.
47 set za_state
"= \\\[ ZA \\\]"
49 set za_state
"= \\\[ \\\]"
53 if [gdb_test
"print \$svcr" $za_state "svcr before assignments" ] {
54 fail
"incorrect za state"
58 # Check the size of ZA.
59 set expected_za_size
[expr $svl * $svl]
60 gdb_test
"print sizeof \$za" " = $expected_za_size"
62 # Check the size of Z0.
63 gdb_test
"print sizeof \$z0" " = $vl"
65 # Exercise reading/writing from/to ZA.
66 initialize_2d_array
"\$za" 255 $svl $svl
67 set pattern
[string_to_regexp
[2d_array_value_pattern
255 $svl $svl]]
68 gdb_test
"print \$za" " = $pattern" "read back from za"
70 # Exercise reading/writing from/to the tile pseudo-registers.
72 set expected_size
[expr $svl * $svl]
74 set za_state
"= \\\[ ZA \\\]"
75 foreach_with_prefix granularity
{"b" "h" "s" "d" "q"} {
76 for {set tile
0} {$tile < $last_tile} {incr tile
} {
77 set register_name
"\$za${tile}${granularity}"
80 gdb_test
"print sizeof ${register_name}" " = ${expected_size}"
82 # Test reading/writing
83 initialize_2d_array
$register_name 255 $tile_svl $tile_svl
85 # Make sure we have ZA state.
86 if [gdb_test
"print \$svcr" $za_state "svcr after assignment to ${register_name}" ] {
87 fail
"incorrect za state"
91 set pattern
[string_to_regexp
[2d_array_value_pattern
255 $tile_svl $tile_svl]]
92 gdb_test
"print $register_name" " = $pattern" "read back from $register_name"
94 set last_tile
[expr $last_tile * 2]
95 set expected_size
[expr $expected_size / 2]
96 set tile_svl
[expr $tile_svl / 2]
99 # Exercise reading/writing from/to the tile slice pseudo-registers.
102 set expected_size
$svl
103 set num_elements
$svl
104 foreach_with_prefix granularity
{"b" "h" "s" "d" "q"} {
105 for {set tile
0} {$tile < $last_tile} {incr tile
} {
106 for {set slice
0} {$slice < $last_slice} {incr slice
} {
107 foreach_with_prefix direction
{"h" "v"} {
108 set register_name
"\$za${tile}${direction}${granularity}${slice}"
111 gdb_test
"print sizeof ${register_name}" " = ${expected_size}"
113 # Test reading/writing
114 initialize_1d_array
$register_name 255 $num_elements
116 # Make sure we have ZA state.
117 if [gdb_test
"print \$svcr" $za_state "svcr after assignment of ${register_name}" ] {
118 fail
"incorrect za state"
122 set pattern
[string_to_regexp
[1d_array_value_pattern
255 $num_elements]]
123 gdb_test
"print $register_name" " = $pattern" "read back from $register_name"
127 set last_tile
[expr $last_tile * 2]
128 set last_slice
[expr ($last_slice / 2)]
129 set num_elements
[expr $num_elements / 2]
132 # Exercise reading/writing from/to SME2 registers.
133 if [is_sme2_available
] {
134 # The target supports SME2.
136 gdb_test
"print sizeof \$zt0" " = $zt_size"
138 # Initially, when ZA is activated, ZT0 will be all zeroes.
139 set zt_pattern
[string_to_regexp
[1d_array_value_pattern
0 $zt_size]]
140 gdb_test
"print \$zt0" " = $zt_pattern" "validate zeroed zt0"
142 # Validate that writing to ZT0 does the right thing.
143 initialize_1d_array
"\$zt0" 255 $zt_size
144 set zt_pattern
[string_to_regexp
[1d_array_value_pattern
255 $zt_size]]
145 gdb_test
"print \$zt0" " = $zt_pattern" "read back from zt0"
150 # Cycle through all ZA registers and pseudo-registers and validate their
153 proc test_sme_registers_available
{ id_start id_end
} {
155 set compile_flags
{"debug" "macros"}
156 lappend compile_flags
"additional_flags=-DID_START=${id_start}"
157 lappend compile_flags
"additional_flags=-DID_END=${id_end}"
159 standard_testfile
${::srcdir}/${::subdir}/aarch64-sme-regs-available.c
160 set executable
"${::testfile}-${id_start}-${id_end}"
161 if {[prepare_for_testing
"failed to prepare" ${executable
} ${::srcfile} ${compile_flags
}]} {
164 set binfile
[standard_output_file
${executable
}]
167 untested
"could not run to main"
171 gdb_test_no_output
"set print repeats 1"
173 set prctl_breakpoint
"stop 1"
174 gdb_breakpoint
[gdb_get_line_number
$prctl_breakpoint]
176 for {set id
$id_start} {$id <= $id_end} {incr id
} {
177 set vl
[test_id_to_vl
$id]
178 set svl
[test_id_to_svl
$id]
180 set skip_unsupported
0
181 if {![aarch64_supports_sve_vl
$vl]
182 ||
![aarch64_supports_sme_svl
$svl]} {
183 # We have a vector length or streaming vector length that
184 # is not supported by this target. Skip to the next iteration
185 # since it is no use running tests for an unsupported vector
187 if {![aarch64_supports_sve_vl
$vl]} {
188 verbose
-log "SVE vector length $vl not supported."
189 } elseif
{![aarch64_supports_sme_svl
$svl]} {
190 verbose
-log "SME streaming vector length $svl not supported."
192 verbose
-log "Skipping test."
193 set skip_unsupported
1
197 with_test_prefix
"$mode, vl=${vl} svl=${svl}" {
198 # If the SVE or SME vector length is not supported, just skip
200 if {$skip_unsupported} {
201 untested
"unsupported configuration on target"
205 # Run the program until it has adjusted svl.
206 gdb_continue_to_breakpoint
$prctl_breakpoint
207 check_regs
$mode $vl $svl
211 set non_prctl_breakpoint
"stop 2"
212 gdb_breakpoint
[gdb_get_line_number
$non_prctl_breakpoint]
214 for {set id
$id_start} {$id <= $id_end} {incr id
} {
215 set vl
[test_id_to_vl
$id]
216 set svl
[test_id_to_svl
$id]
218 set skip_unsupported
0
219 if {![aarch64_supports_sve_vl
$vl]
220 ||
![aarch64_supports_sme_svl
$svl]} {
221 # We have a vector length or streaming vector length that
222 # is not supported by this target. Skip to the next iteration
223 # since it is no use running tests for an unsupported vector
225 if {![aarch64_supports_sve_vl
$vl]} {
226 verbose
-log "SVE vector length $vl not supported."
227 } elseif
{![aarch64_supports_sme_svl
$svl]} {
228 verbose
-log "SME streaming vector length $svl not supported."
230 verbose
-log "Skipping test."
231 set skip_unsupported
1
235 with_test_prefix
"$mode, vl=${vl} svl=${svl}" {
236 # If the SVE or SME vector length is not supported, just skip
238 if {$skip_unsupported} {
239 untested
"unsupported configuration on target"
243 # Run the program until we stop at the point where gdb should
244 # adjust the SVE and SME vector lengths.
245 gdb_continue_to_breakpoint
$non_prctl_breakpoint
247 # Adjust svl via gdb.
248 set vg_value
[expr $vl / 8]
249 set svg_value
[expr $svl / 8]
250 gdb_test_no_output
"set \$vg = ${vg_value}"
251 gdb_test_no_output
"set \$svg = ${svg_value}"
253 check_regs
$mode $vl $svl
258 test_sme_registers_available
$id_start $id_end