xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.base/memattr.exp (revision 16dce51364ebe8aeafbae46bc5aa167b8115bc45)
1# Copyright 2011-2016 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# This file is part of the gdb testsuite
17
18# Test the memory attribute commands.
19
20standard_testfile .c
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
113set info_mem_header_pattern \
114    "info mem.*Num\[ \t\]+Enb\[ \t\]+Low\[ \t\]+Addr\[ \t\]+High\[ \t\]+Addr\[ \t\]+Attrs\[^\n\r]*.."
115
116gdb_test_multiple "info mem" "info mem(1)" {
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\]*.." {
122	set see1 1
123	exp_continue
124    }
125    -re "^2   y  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
126	set see2 1
127	exp_continue
128    }
129    -re "^3   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
130	set see3 1
131	exp_continue
132    }
133    -re "^4   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
134	set see4 1
135	exp_continue
136    }
137    -re "^5   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
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" {
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\]*.." {
196	set see1 1
197	exp_continue
198    }
199    -re "^2   n  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
200	set see2 1
201	exp_continue
202    }
203    -re "^3   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
204	set see3 1
205	exp_continue
206    }
207    -re "^4   n  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
208	set see4 1
209	exp_continue
210    }
211    -re "^5   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
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" {
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\]*.." {
238	set see1 1
239	exp_continue
240    }
241    -re "^2   y  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
242	set see2 1
243	exp_continue
244    }
245    -re "^3   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
246	set see3 1
247	exp_continue
248    }
249    -re "^4   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
250	set see4 1
251	exp_continue
252    }
253    -re "^5   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
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" {
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\]*.." {
280	set see1 1
281	exp_continue
282    }
283    -re "^2   n  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
284	set see2 1
285	exp_continue
286    }
287    -re "^3   n  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
288	set see3 1
289	exp_continue
290    }
291    -re "^4   n  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
292	set see4 1
293	exp_continue
294    }
295    -re "^5   n  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
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" {
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\]*.." {
322	set see1 1
323	exp_continue
324    }
325    -re "^2   y  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
326	set see2 1
327	exp_continue
328    }
329    -re "^3   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
330	set see3 1
331	exp_continue
332    }
333    -re "^4   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
334	set see4 1
335	exp_continue
336    }
337    -re "^5   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
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" {
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\]*.." {
371	set see1 1
372	exp_continue
373    }
374    -re "^2   y  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
375	set see2 1
376	exp_continue
377    }
378    -re "^3   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
379	set see3 1
380	exp_continue
381    }
382    -re "^4   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
383	set see4 1
384	exp_continue
385    }
386    -re "^5   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
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" {
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\]*.." {
412	set see1 1
413	exp_continue
414    }
415    -re "^2   y  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
416	set see2 1
417	exp_continue
418    }
419    -re "^3   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
420	set see3 1
421	exp_continue
422    }
423    -re "^4   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
424	set see4 1
425	exp_continue
426    }
427    -re "^5   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
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" {
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\]*.." {
455	set see1 1
456	exp_continue
457    }
458    -re "^2   y  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*.." {
459	set see2 1
460	exp_continue
461    }
462    -re "^3   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
463	set see3 1
464	exp_continue
465    }
466    -re "^4   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
467	set see4 1
468	exp_continue
469    }
470    -re "^5   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*.." {
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"
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.*$" {
495           send_gdb "y\n"
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}
577