# Copyright 2004-2013 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/>.

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@gnu.org

# This file is part of the gdb testsuite.


if { ![istarget s390-*-*] && ![istarget s390x-*-* ] } {
    verbose "Skipping s390 TDB register tests."
    return
}

set testfile "s390-tdbregs"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if { [get_compiler_info] } {
    return -1
}

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
      executable [list debug]] != "" } {
    fail "compile failed"
    return
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if { ![runto_main] } then {
    gdb_suppress_tests
}

gdb_test_multiple "next" "check for TE support" {
    -re "Program received signal SIGILL,.*\r\n$gdb_prompt $" {
	unsupported "No TE support."
	return
    }
    -re "\[0-9\]+.*\r\n$gdb_prompt $" {
	pass "TE support available"
    }
    -re "$gdb_prompt $" {
	unsupported "No TE support (unknown error)."
	return
    }
}

set crashline [gdb_get_line_number "FAULT"]

gdb_test "print \$tdb0" "\\\$\[0-9\]+ = <unavailable>" "tdb0 unavailable"
gdb_test "print \$tr0" "\\\$\[0-9\]+ = <unavailable>" "tr0 unavailable"
gdb_test "next" \
    "Program received signal SIGSEGV, .*" \
    "crash in transaction"
gdb_test "print/x \$tdb0" "\\\$\[0-9\]+ = 0x1.*" "tdb0 available"
gdb_test "set print symbol-filename" "" "set print symbol-filename"
gdb_test "print/a \$atia" \
    "<crash_in_transaction.*:$crashline>" \
    "ATIA points to crash"
