]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/testsuite/gdb.base/memattr.exp
Update year range in copyright notice of all files owned by the GDB project.
[thirdparty/binutils-gdb.git] / gdb / testsuite / gdb.base / memattr.exp
CommitLineData
32d0add0 1# Copyright 2011-2015 Free Software Foundation, Inc.
fbcb778d
MS
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# This file is part of the gdb testsuite
17
18# Test the memory attribute commands.
19
f8b41b00 20standard_testfile .c
fbcb778d
MS
21
22if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
23 return -1
24}
25
26runto main
27
28set mem1start -1
29set mem2start -1
30set mem3start -1
31set mem4start -1
32set mem5start -1
33
34set mem1end -1
35set mem2end -1
36set mem3end -1
37set mem4end -1
38set mem5end -1
39
40
41gdb_test_multiple "info address mem1" "get address of mem1" {
42 -re "Symbol \"mem1\" is static storage at address ($hex).*$gdb_prompt $" {
43 set mem1start $expect_out(1,string)
44 }
45}
46
47gdb_test_multiple "info address mem2" "get address of mem2" {
48 -re "Symbol \"mem2\" is static storage at address ($hex).*$gdb_prompt $" {
49 set mem2start $expect_out(1,string)
50 }
51}
52
53gdb_test_multiple "info address mem3" "get address of mem3" {
54 -re "Symbol \"mem3\" is static storage at address ($hex).*$gdb_prompt $" {
55 set mem3start $expect_out(1,string)
56 }
57}
58
59gdb_test_multiple "info address mem4" "get address of mem4" {
60 -re "Symbol \"mem4\" is static storage at address ($hex).*$gdb_prompt $" {
61 set mem4start $expect_out(1,string)
62 }
63}
64
65gdb_test_multiple "info address mem5" "get address of mem5" {
66 -re "Symbol \"mem5\" is static storage at address ($hex).*$gdb_prompt $" {
67 set mem5start $expect_out(1,string)
68 }
69}
70
71gdb_test_multiple "print &mem1\[64\]" "get end of mem1" {
72 -re "$decimal = .* ($hex).*$gdb_prompt $" {
73 set mem1end $expect_out(1,string)
74 }
75}
76
77gdb_test_multiple "print &mem2\[64\]" "get end of mem2" {
78 -re "$decimal = .* ($hex).*$gdb_prompt $" {
79 set mem2end $expect_out(1,string)
80 }
81}
82
83gdb_test_multiple "print &mem3\[64\]" "get end of mem3" {
84 -re "$decimal = .* ($hex).*$gdb_prompt $" {
85 set mem3end $expect_out(1,string)
86 }
87}
88
89gdb_test_multiple "print &mem4\[64\]" "get end of mem4" {
90 -re "$decimal = .* ($hex).*$gdb_prompt $" {
91 set mem4end $expect_out(1,string)
92 }
93}
94
95gdb_test_multiple "print &mem5\[64\]" "get end of mem5" {
96 -re "$decimal = .* ($hex).*$gdb_prompt $" {
97 set mem5end $expect_out(1,string)
98 }
99}
100
101gdb_test_no_output "mem $mem1start $mem1end wo" "create mem region 1"
102gdb_test_no_output "mem $mem2start $mem2end ro" "create mem region 2"
103gdb_test_no_output "mem $mem3start $mem3end rw" "create mem region 3"
104gdb_test_no_output "mem $mem4start $mem4end rw" "create mem region 4"
105gdb_test_no_output "mem $mem5start $mem5end rw" "create mem region 5"
106
107set see1 0
108set see2 0
109set see3 0
110set see4 0
111set see5 0
112
fc98a809
AB
113set info_mem_header_pattern \
114 "info mem.*Num\[ \t\]+Enb\[ \t\]+Low\[ \t\]+Addr\[ \t\]+High\[ \t\]+Addr\[ \t\]+Attrs\[^\n\r]*.."
115
fbcb778d 116gdb_test_multiple "info mem" "info mem(1)" {
fc98a809
AB
117 -re ${info_mem_header_pattern} {
118 # Discard the header.
119 exp_continue
120 }
121 -re "^1 y \[ \t\]+$hex $hex wo nocache \[^\r\n\]*.." {
fbcb778d
MS
122 set see1 1
123 exp_continue
124 }
fc98a809 125 -re "^2 y \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
fbcb778d
MS
126 set see2 1
127 exp_continue
128 }
fc98a809 129 -re "^3 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
130 set see3 1
131 exp_continue
132 }
fc98a809 133 -re "^4 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
134 set see4 1
135 exp_continue
136 }
fc98a809 137 -re "^5 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
138 set see5 1
139 exp_continue
140 }
141 -re "$gdb_prompt $" {
142 if { $see1 && $see2 && $see3 && $see4 && $see5 } then {
143 pass "info mem (1)"
144 } else {
145 fail "info mem (1)"
146 }
147 }
148}
149
150#
151# Test read-only, write-only
152#
153
154# mem1 is write only: read should fail.
155gdb_test "print mem1\[1\]" \
156 "Cannot access memory at address $hex" \
157 "mem1 cannot be read"
158
159gdb_test "print mem1\[1\] = 9" \
160 "$decimal = 9" \
161 "mem1 can be written"
162
163# mem2 is read only: write should fail.
164gdb_test "print mem2\[1\] = 9" \
165 "Cannot access memory at address $hex" \
166 "mem2 cannot be written"
167
168gdb_test "print mem2\[1\]" \
169 "$decimal = 0" \
170 "mem2 can be read"
171
172#
173# Test disable and enable
174#
175
176gdb_test_no_output "disable mem 1" "disable mem 1"
177gdb_test "info mem" "1 n .*" "mem 1 was disabled"
178
179gdb_test_no_output "enable mem 1" "enable mem 1"
180gdb_test "info mem" "1 y .*" "mem 1 was enabled"
181
182gdb_test_no_output "disable mem 2 4"
183
184set see1 0
185set see2 0
186set see3 0
187set see4 0
188set see5 0
189
190gdb_test_multiple "info mem" "mem 2 and 4 were disabled" {
fc98a809
AB
191 -re ${info_mem_header_pattern} {
192 # Discard the header.
193 exp_continue
194 }
195 -re "^1 y \[ \t\]+$hex $hex wo nocache \[^\r\n\]*.." {
fbcb778d
MS
196 set see1 1
197 exp_continue
198 }
fc98a809 199 -re "^2 n \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
fbcb778d
MS
200 set see2 1
201 exp_continue
202 }
fc98a809 203 -re "^3 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
204 set see3 1
205 exp_continue
206 }
fc98a809 207 -re "^4 n \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
208 set see4 1
209 exp_continue
210 }
fc98a809 211 -re "^5 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
212 set see5 1
213 exp_continue
214 }
215 -re "$gdb_prompt $" {
216 if { $see1 && $see2 && $see3 && $see4 && $see5 } then {
217 pass "mem 2 and 4 were disabled"
218 } else {
219 fail "mem 2 and 4 were disabled"
220 }
221 }
222}
223
224gdb_test_no_output "enable mem 2-4" "enable mem 2-4"
225
226set see1 0
227set see2 0
228set see3 0
229set see4 0
230set see5 0
231
232gdb_test_multiple "info mem" "mem 2-4 were enabled" {
fc98a809
AB
233 -re ${info_mem_header_pattern} {
234 # Discard the header.
235 exp_continue
236 }
237 -re "^1 y \[ \t\]+$hex $hex wo nocache \[^\r\n\]*.." {
fbcb778d
MS
238 set see1 1
239 exp_continue
240 }
fc98a809 241 -re "^2 y \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
fbcb778d
MS
242 set see2 1
243 exp_continue
244 }
fc98a809 245 -re "^3 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
246 set see3 1
247 exp_continue
248 }
fc98a809 249 -re "^4 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
250 set see4 1
251 exp_continue
252 }
fc98a809 253 -re "^5 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
254 set see5 1
255 exp_continue
256 }
257 -re "$gdb_prompt $" {
258 if { $see1 && $see2 && $see3 && $see4 && $see5 } then {
259 pass "mem 2-4 were enabled"
260 } else {
261 fail "mem 2-4 were enabled"
262 }
263 }
264}
265
266gdb_test_no_output "disable mem" "disable mem"
267
268set see1 0
269set see2 0
270set see3 0
271set see4 0
272set see5 0
273
274gdb_test_multiple "info mem" "mem 1 to 5 were disabled" {
fc98a809
AB
275 -re ${info_mem_header_pattern} {
276 # Discard the header.
277 exp_continue
278 }
279 -re "^1 n \[ \t\]+$hex $hex wo nocache \[^\r\n\]*.." {
fbcb778d
MS
280 set see1 1
281 exp_continue
282 }
fc98a809 283 -re "^2 n \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
fbcb778d
MS
284 set see2 1
285 exp_continue
286 }
fc98a809 287 -re "^3 n \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
288 set see3 1
289 exp_continue
290 }
fc98a809 291 -re "^4 n \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
292 set see4 1
293 exp_continue
294 }
fc98a809 295 -re "^5 n \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
296 set see5 1
297 exp_continue
298 }
299 -re "$gdb_prompt $" {
300 if { $see1 && $see2 && $see3 && $see4 && $see5 } then {
301 pass "mem 1 to 5 were disabled"
302 } else {
303 fail "mem 1 to 5 were disabled"
304 }
305 }
306}
307
308gdb_test_no_output "enable mem" "enable mem"
309
310set see1 0
311set see2 0
312set see3 0
313set see4 0
314set see5 0
315
316gdb_test_multiple "info mem" "mem 1 to 5 were enabled" {
fc98a809
AB
317 -re ${info_mem_header_pattern} {
318 # Discard the header.
319 exp_continue
320 }
321 -re "^1 y \[ \t\]+$hex $hex wo nocache \[^\r\n\]*.." {
fbcb778d
MS
322 set see1 1
323 exp_continue
324 }
fc98a809 325 -re "^2 y \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
fbcb778d
MS
326 set see2 1
327 exp_continue
328 }
fc98a809 329 -re "^3 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
330 set see3 1
331 exp_continue
332 }
fc98a809 333 -re "^4 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
334 set see4 1
335 exp_continue
336 }
fc98a809 337 -re "^5 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
338 set see5 1
339 exp_continue
340 }
341 -re "$gdb_prompt $" {
342 if { $see1 && $see2 && $see3 && $see4 && $see5 } then {
343 pass "mem 1 to 5 were enabled"
344 } else {
345 fail "mem 1 to 5 were enabled"
346 }
347 }
348}
349
350gdb_test "disable mem 7 8" \
351 "No memory region number 7.*No memory region number 8." \
352 "disable non-existant regions"
353
354#
355# Test delete
356#
357
358set see1 0
359set see2 0
360set see3 0
361set see4 0
362set see5 0
363
364gdb_test_no_output "delete mem 1" "delete mem 1"
365gdb_test_multiple "info mem" "mem 1 was deleted" {
fc98a809
AB
366 -re ${info_mem_header_pattern} {
367 # Discard the header.
368 exp_continue
369 }
370 -re "^1 y \[ \t\]+$hex $hex wo nocache \[^\r\n\]*.." {
fbcb778d
MS
371 set see1 1
372 exp_continue
373 }
fc98a809 374 -re "^2 y \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
fbcb778d
MS
375 set see2 1
376 exp_continue
377 }
fc98a809 378 -re "^3 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
379 set see3 1
380 exp_continue
381 }
fc98a809 382 -re "^4 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
383 set see4 1
384 exp_continue
385 }
fc98a809 386 -re "^5 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
387 set see5 1
388 exp_continue
389 }
390 -re "$gdb_prompt $" {
391 if { !$see1 && $see2 && $see3 && $see4 && $see5 } then {
392 pass "mem 1 was deleted"
393 } else {
394 fail "mem 1 was deleted"
395 }
396 }
397}
398
399set see1 0
400set see2 0
401set see3 0
402set see4 0
403set see5 0
404
405gdb_test_no_output "delete mem 2 4" "delete mem 2 4"
406gdb_test_multiple "info mem" "mem 2 and 4 were deleted" {
fc98a809
AB
407 -re ${info_mem_header_pattern} {
408 # Discard the header.
409 exp_continue
410 }
411 -re "^1 y \[ \t\]+$hex $hex wo nocache \[^\r\n\]*.." {
fbcb778d
MS
412 set see1 1
413 exp_continue
414 }
fc98a809 415 -re "^2 y \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
fbcb778d
MS
416 set see2 1
417 exp_continue
418 }
fc98a809 419 -re "^3 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
420 set see3 1
421 exp_continue
422 }
fc98a809 423 -re "^4 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
424 set see4 1
425 exp_continue
426 }
fc98a809 427 -re "^5 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
428 set see5 1
429 exp_continue
430 }
431 -re "$gdb_prompt $" {
432 if { !$see1 && !$see2 && $see3 && !$see4 && $see5 } then {
433 pass "mem 2 and 4 were deleted"
434 } else {
435 fail "mem 2 and 4 were deleted"
436 }
437 }
438}
439
440set see1 0
441set see2 0
442set see3 0
443set see4 0
444set see5 0
445
446gdb_test "delete mem 2-4" \
447 "No memory region number 2.*No memory region number 4." \
448 "delete mem 2-4"
449gdb_test_multiple "info mem" "mem 2-4 were deleted" {
fc98a809
AB
450 -re ${info_mem_header_pattern} {
451 # Discard the header.
452 exp_continue
453 }
454 -re "^1 y \[ \t\]+$hex $hex wo nocache \[^\r\n\]*.." {
fbcb778d
MS
455 set see1 1
456 exp_continue
457 }
fc98a809 458 -re "^2 y \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
fbcb778d
MS
459 set see2 1
460 exp_continue
461 }
fc98a809 462 -re "^3 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
463 set see3 1
464 exp_continue
465 }
fc98a809 466 -re "^4 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
467 set see4 1
468 exp_continue
469 }
fc98a809 470 -re "^5 y \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
fbcb778d
MS
471 set see5 1
472 exp_continue
473 }
474 -re "$gdb_prompt $" {
475 if { !$see1 && !$see2 && !$see3 && !$see4 && $see5 } then {
476 pass "mem 2-4 were deleted"
477 } else {
478 fail "mem 2-4 were deleted"
479 }
480 }
481}
482
483gdb_test "delete mem 8" "No memory region number 8." \
484 "delete non-existant region"
1591a1e8
PA
485
486#
487# Test overlapping checking
488#
489
490proc delete_memory {} {
491 global gdb_prompt
492
493 gdb_test_multiple "delete mem" "delete mem" {
494 -re "Delete all memory regions.*y or n.*$" {
4ec70201 495 send_gdb "y\n"
1591a1e8
PA
496 exp_continue
497 }
498 -re "$gdb_prompt $" { }
499 }
500}
501
502# Create a region that doesn't overlap (a PASS in the table).
503
504proc region_pass { region } {
505 gdb_test_no_output "mem $region ro" "$region: no-overlap"
506}
507
508# Try to create a region that overlaps (a FAIL in the table).
509
510proc region_fail { region } {
511 gdb_test "mem $region ro" "overlapping memory region" "$region: overlap"
512}
513
514# Test normal case (upper != 0)
515#
516# lo' hi'
517# |--------|
518# 10 20 30 40 50 60 70 80 90
519# |-----| FAIL
520# |--| FAIL
521# |--| FAIL
522# |--| FAIL
523# |-----| FAIL
524# |--------| FAIL
525# |--------------| FAIL
526# |--------------------- FAIL
527# |------------------ FAIL
528# |--------------- FAIL
529# |--| PASS
530# |--| PASS
531# |--- PASS
532
533delete_memory
534gdb_test_no_output "mem 0x30 0x60 ro"
535with_test_prefix "0x30 0x60" {
536 region_fail "0x20 0x40"
537 region_fail "0x30 0x40"
538 region_fail "0x40 0x50"
539 region_fail "0x50 0x60"
540 region_fail "0x50 0x70"
541 region_fail "0x30 0x60"
542 region_fail "0x20 0x70"
543 region_fail "0x20 0x0"
544 region_fail "0x30 0x0"
545 region_fail "0x40 0x0"
546 region_pass "0x20 0x30"
547 region_pass "0x60 0x70"
548 region_pass "0x80 0x0"
549}
550
551# Test special case (upper == 0)
552#
553# lo' hi'
554# |---------------
555# 00 10 20 30 40 50 60 70 80
556# |--------| FAIL
557# |-----| FAIL
558# |--| FAIL
559# |------------------ FAIL
560# |--------------- FAIL
561# |------------ FAIL
562# |--| PASS
563# |--| PASS
564
565delete_memory
566gdb_test_no_output "mem 0x30 0x0 ro"
567with_test_prefix "0x30 0x0" {
568 region_fail "0x20 0x50"
569 region_fail "0x30 0x50"
570 region_fail "0x40 0x50"
571 region_fail "0x20 0x0"
572 region_fail "0x30 0x0"
573 region_fail "0x40 0x0"
574 region_pass "0x20 0x30"
575 region_pass "0x00 0x10"
576}