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