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
|
# Copyright (C) 2016-2024 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/>.
require is_aarch32_target
standard_testfile
if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} \
[list debug]] } {
return -1
}
if { ![runto_main] } {
return -1
}
# Initialize kernel_user_helper_version.
gdb_test "next" "for .*"
# Check kernel helpers are supported or not.
set kernel_helper_supported 0
gdb_test_multiple "p kernel_user_helper_version" \
"check kernel helper version" {
-re " = ($decimal)\r\n$gdb_prompt $" {
if { $expect_out(1,string) >= 1 } {
set kernel_helper_supported 1
}
}
}
if { !$kernel_helper_supported } {
unsupported "kernel doesn't have helpers"
return 0
}
# Get the instruction branching to kernel helper, they can be
# blx rN or bx rN.
set branch_to_kernel_helper 0
set branch_insn "bl?x\[ \t\]*r${decimal}"
set test "disassemble main"
gdb_test_multiple $test $test {
-re ".*($hex) <\\+$decimal>:\[ \t\]+$branch_insn" {
set branch_to_kernel_helper $expect_out(1,string)
exp_continue
}
-re ".*$gdb_prompt $" {
}
}
if { ![gdb_assert $branch_to_kernel_helper \
"find instruction branch to kernel helper"] } {
return
}
with_test_prefix "single-step" {
gdb_breakpoint "*${branch_to_kernel_helper}"
gdb_continue_to_breakpoint "branch to kernel helper"
gdb_test "si"
set test "bt"
gdb_test_multiple $test $test {
-re "#0 \[^\\r\\n\]*main .*\r\n$gdb_prompt $" {
# Test that the program still stops in main rather than
# somewhere else.
pass $test
}
-re "#0 0xffff0fe0 .*\r\n$gdb_prompt $" {
# AArch64 linux kernel can do hardware single step, so
# the program can stop at kernel helper.
pass $test
}
}
delete_breakpoints
}
with_test_prefix "cond-breakpoint" {
gdb_breakpoint "*${branch_to_kernel_helper} if i > 5"
gdb_continue_to_breakpoint "branch to kernel helper"
gdb_test "p i" " = 6"
delete_breakpoints
}
|