1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
# Copyright 2021-2023 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Test to see if gdb is properly single stepping over the
# displaced plxv instruction.
if { ![istarget powerpc*-*] || [skip_power_isa_3_1_tests] } {
verbose "Skipping powerpc ISA 3.1 plxv test."
return
}
set retval 0
standard_testfile .s
if { [prepare_for_testing "failed to prepare" $testfile "$srcfile" \
{debug quiet}] } {
return -1
}
gdb_test "set radix 0b10000"
gdb_test "set debug displaced"
if {![runto_main]} {
return
}
gdb_test "set debug displaced on"
# Proc to extract the uint128 hex value from the output of
# a print vector statement.
proc get_vector_hexadecimal_valueof { exp default {test ""} } {
set val "0x0000"
global gdb_prompt
if {$test == ""} {
set test "get vector_hexadecimal valueof \"${exp}\""
}
gdb_test_multiple "print $${exp}.uint128" $test {
-re -wrap "\\$\[0-9\]* = (0x\[0-9a-zA-Z\]+).*" {
set val $expect_out(1,string)
pass "$test"
}
-re -wrap ".*Illegal instruction.* $" {
fail "Illegal instruction on print."
set val 0xffff
}
}
return ${val}
}
# Proc to do a single-step, and ensure we gently handle
# an illegal instruction situation.
proc stepi_over_instruction { xyz } {
global gdb_prompt
gdb_test_multiple "stepi" "${xyz} " {
-re -wrap ".*Illegal instruction.*" {
fail "Illegal instruction on single step."
return
}
-re -wrap ".*" {
pass "stepi ${xyz}"
}
}
}
set check_pc [get_hexadecimal_valueof "\$pc" "default0"]
# set some breakpoints on the instructions below main().
gdb_test "disas /r main"
set bp1 *$check_pc+4
set bp2 *$check_pc+0d12
set bp3 *$check_pc+0d20
set bp4 *$check_pc+0d28
gdb_breakpoint $bp1
gdb_breakpoint $bp2
gdb_breakpoint $bp3
gdb_breakpoint $bp4
# single-step through the plxv instructions, and retrieve the
# register values as we proceed.
stepi_over_instruction "stepi over NOP"
stepi_over_instruction "stepi over lnia"
stepi_over_instruction "stepi over addi"
stepi_over_instruction "stepi over vs4 assignment"
set check_vs4 [get_vector_hexadecimal_valueof "vs4" "default0"]
stepi_over_instruction "stepi over vs5 assignment"
set check_vs5 [get_vector_hexadecimal_valueof "vs5" "default0"]
stepi_over_instruction "stepi over vs6 assignment"
set check_vs6 [get_vector_hexadecimal_valueof "vs6" "default0"]
stepi_over_instruction "stepi over vs7 assignment"
set check_vs7 [get_vector_hexadecimal_valueof "vs7" "default0"]
set vs4_expected 0xa5b5c5d5a4b4c4d4a3b3c3d3a2b2c2d2
set vs5_expected 0xa7b7c7d7a6b6c6d6a5b5c5d5a4b4c4d4
set vs6_expected 0xa9b9c9d9a8b8c8d8a7b7c7d7a6b6c6d6
set vs7_expected 0xabbbcbdbaabacadaa9b9c9d9a8b8c8d8
if [expr $check_vs4 != $vs4_expected] {
fail "unexpected value vs4; actual:$check_vs4 expected:$vs4_expected"
}
if [expr $check_vs5 != $vs5_expected ] {
fail "unexpected value vs5; actual:$check_vs5 expected:$vs5_expected"
}
if [expr $check_vs6 != $vs6_expected ] {
fail "unexpected value vs6; actual:$check_vs6 expected:$vs6_expected"
}
if [expr $check_vs7 != $vs7_expected ] {
fail "unexpected value vs7; actual:$check_vs7 expected:$vs7_expected"
}
gdb_test "info break"
gdb_test "info register vs4 vs5 vs6 vs7 "
gdb_test "disas main #2"
|