# Copyright 2008-2021 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/>.
#
# This file is part of the gdb testsuite.

# Test single stepping through atomic sequences beginning with
# a lwarx/ldarx instruction and ending with a stwcx/stdcx
# instruction.


if {![istarget "powerpc*"] || ![is_lp64_target]} {
    verbose "Skipping testing of powerpc64 single stepping over atomic sequences."
    return
}

standard_testfile .S

if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} {debug quiet}] } {
    return -1
}

# The test proper.  DISPLACED is true if we should try with displaced
# stepping.
proc do_test { displaced } {
    global decimal hex

    if ![runto_main] then {
	return -1
    }

    gdb_test_no_output "set displaced-stepping $displaced"

    set bp1 [gdb_get_line_number "lwarx"]
    gdb_breakpoint "$bp1" "Breakpoint $decimal at $hex" \
	"set the breakpoint at the start of the lwarx/stwcx sequence"

    set bp2 [gdb_get_line_number "ldarx"]
    gdb_breakpoint "$bp2" "Breakpoint $decimal at $hex" \
	"set the breakpoint at the start of the ldarx/stdcx sequence"

    gdb_test continue "Continuing.*Breakpoint $decimal.*" \
	"continue until lwarx/stwcx start breakpoint"

    gdb_test nexti "bne.*1b" \
	"step through the lwarx/stwcx sequence"

    gdb_test continue "Continuing.*Breakpoint $decimal.*" \
	"continue until ldarx/stdcx start breakpoint"

    gdb_test nexti "bne.*1b" \
	"step through the ldarx/stdcx sequence"
}

foreach displaced { "off" "on" } {
    with_test_prefix "displaced=$displaced" {
	do_test $displaced
    }
}
