# Copyright 2009-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 amd64 displaced stepping.


if { ![istarget x86_64-*-* ] || ![is_lp64_target] } {
    verbose "Skipping x86_64 displaced stepping tests."
    return
}

set newline "\[\r\n\]*"

set opts {debug nopie}
standard_testfile .S

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

gdb_test "set displaced-stepping on" ""
gdb_test "show displaced-stepping" ".* displaced stepping .* is on.*"

if ![runto_main] then {
    return 0
}

##########################################

# Test call/ret.

gdb_test "break test_call" \
    "Breakpoint.*at.* file .*$srcfile, line.*"
gdb_test "break test_call_end" \
    "Breakpoint.*at.* file .*$srcfile, line.*"

gdb_test "break test_ret" \
    "Breakpoint.*at.* file .*$srcfile, line.*"
gdb_test "break test_ret_end" \
    "Breakpoint.*at.* file .*$srcfile, line.*"

gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_call ().*" \
    "continue to test_call"
gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_call_end ().*" \
    "continue to test_call_end"

gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_ret ().*" \
    "continue to test_ret"
gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_ret_end ().*" \
    "continue to test_ret_end"

##########################################

# Test abs-jmp/rep-ret.

gdb_test "break test_abs_jmp" \
    "Breakpoint.*at.* file .*$srcfile, line.*"
gdb_test "break test_abs_jmp_end" \
    "Breakpoint.*at.* file .*$srcfile, line.*"

gdb_test "break test_rep_ret" \
    "Breakpoint.*at.* file .*$srcfile, line.*"
gdb_test "break test_rep_ret_end" \
    "Breakpoint.*at.* file .*$srcfile, line.*"

gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_abs_jmp ().*" \
    "continue to test_abs_jmp"
gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_abs_jmp_end ().*" \
    "continue to test_abs_jmp_end"

gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_rep_ret ().*" \
    "continue to test_rep_ret"
gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_rep_ret_end ().*" \
    "continue to test_rep_ret_end"

##########################################

# Test syscall.

gdb_test "break test_syscall" \
    "Breakpoint.*at.* file .*$srcfile, line.*"
gdb_test "break test_syscall_end" \
    "Breakpoint.*at.* file .*$srcfile, line.*"

gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_syscall ().*" \
    "continue to test_syscall"
gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_syscall_end ().*" \
    "continue to test_syscall_end"

##########################################

# int3 (with prefixes)
# These don't occur in normal code, but gdb should still DTRT.

gdb_test "break test_int3" \
    "Breakpoint.*at.* file .*$srcfile, line.*"
gdb_test "break test_int3_end" \
    "Breakpoint.*at.* file .*$srcfile, line.*"

gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_int3 ().*" \
    "continue to test_int3"

gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_int3_end ().*" \
    "continue to test_int3_end"

##########################################

# Test rip-relative.
# GDB picks a spare register to hold the rip-relative address.
# Exercise all the possibilities (rax-rdi, sans rsp).

# The order must much the order in srcfile.
set rip_regs { "rax" "rbx" "rcx" "rdx" "rbp" "rsi" "rdi" }

# Assign val to all specified regs.

proc set_regs { regs val } {
    global gdb_prompt

    foreach reg ${regs} {
	# Use send_gdb/gdb_expect so that these aren't logged as pass/fail.
	send_gdb "set \$${reg} = ${val}\n"
	gdb_expect 10 {
	    -re "$gdb_prompt $" { 
		verbose "Setting ${reg} to ${val}." 2
	    }
	    timeout {
		warning "Couldn't set ${reg} to ${val}."
	    }
	}
    }
}

# Verify all REGS equal VAL, except REG which equals REG_VAL.

proc verify_regs { test_name regs val except_reg except_reg_val } {
    global newline

    foreach reg ${regs} {
	set expected ${val}
	if { "${reg}" == "${except_reg}" } {
	    set expected ${except_reg_val}
	}
	# The cast to (int) is because RBP is printed as a pointer.
	gdb_test "p (int) \$${reg}" " = ${expected}${newline}" "${test_name} ${reg} expected value"
    }
}

proc rip_test { reg } {
    global srcfile rip_regs

    set test_start_label "test_rip_${reg}"
    set test_end_label "test_rip_${reg}_end"

    gdb_test "break ${test_start_label}" \
	"Breakpoint.*at.* file .*$srcfile, line.*"
    gdb_test "break ${test_end_label}" \
	"Breakpoint.*at.* file .*$srcfile, line.*"

    gdb_test "continue" \
	"Continuing.*Breakpoint.*, ${test_start_label} ().*" \
	"continue to ${test_start_label}"

    set_regs ${rip_regs} 0

    gdb_test "continue" \
	"Continuing.*Breakpoint.*, ${test_end_label} ().*" \
	"continue to ${test_end_label}"

    verify_regs "test rip w/${reg}" ${rip_regs} 0 ${reg} 42
}

foreach reg ${rip_regs} {
    rip_test $reg
}

##########################################

# Done, run program to exit.

gdb_continue_to_end "amd64-disp-step"
