1# Copyright 2010-2023 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# Check that when GDB connects to a stopped target in either non-stop
17# or all-stop modes, "target remote" does not return with the remote
18# thread marked running.
19
20load_lib gdbserver-support.exp
21load_lib prelink-support.exp
22
23if {[skip_gdbserver_tests]} {
24    return
25}
26
27standard_testfile
28set executable ${testfile}
29
30if {[build_executable "failed to prepare" $testfile $srcfile debug]} {
31    return -1
32}
33
34proc do_test {nonstop} {
35    global binfile
36    global gdb_prompt
37    global hex
38
39    clean_restart $binfile
40
41    # Make sure we're disconnected, in case we're testing with an
42    # extended-remote board, therefore already connected.
43    gdb_test "disconnect" ".*"
44
45    gdb_test "set non-stop $nonstop"
46
47    set res [gdbserver_spawn ""]
48    set gdbserver_protocol [lindex $res 0]
49    set gdbserver_gdbport [lindex $res 1]
50
51    gdb_test_multiple "define connect" "define user command: connect" {
52	-re "Type commands for definition of \"connect\".\r\nEnd with a line saying just \"end\".\r\n>$" {
53	    gdb_test [join [list \
54				"target $gdbserver_protocol $gdbserver_gdbport" \
55				"info threads" \
56				"p /x \$pc" \
57				"end" \
58			       ] "\n"] \
59		"" \
60		"define user command: connect"
61	}
62    }
63
64    # In non-stop mode, "target remote" used to return before the
65    # already-stopped thread was marked stopped.  Because of that, a
66    # script (or fast user) could see the target as running right
67    # after connection:
68    #
69    # (gdb) connect
70    #   Id   Target Id         Frame
71    # * 1    Thread 31179      (running)
72    # Target is executing.
73    # (gdb)
74    gdb_test "connect" " = $hex" "connect and print pc"
75    gdb_test "print /x \$pc" " = $hex" "print pc again"
76}
77
78foreach nonstop { "off" "on" } {
79    with_test_prefix "non-stop=$nonstop" {
80	do_test $nonstop
81    }
82}
83