# Copyright 2013-2016 Free Software Foundation, Inc.
#
# Contributed by Intel Corp. <walfred.tedeschi@intel.com>
#
# 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/>.

if { ![istarget i?86-*-*] && ![istarget x86_64-*-* ] } {
    verbose "Skipping x86 MPX tests."
    return
}

standard_testfile

if { ![istarget i?86-*-*] && ![istarget x86_64-*-* ] } {
    verbose "Skipping x86 MPX tests."
    return
}

set comp_flags "-mmpx -fcheck-pointer-bounds -I${srcdir}/../nat/"

if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} \
     [list debug nowarnings additional_flags=${comp_flags}]] } {
    return -1
}

if ![runto_main] {
    untested "could not run to main"
    return -1
}

set supports_mpx 0
set test "probe MPX support"
gdb_test_multiple "print have_mpx()" $test {
    -re ".. = 1\r\n$gdb_prompt $" {
        pass $test
        set supports_mpx 1
    }
    -re ".. = 0\r\n$gdb_prompt $" {
        pass $test
    }
}

if { !$supports_mpx } {
    unsupported "processor does not support MPX"
    return
}

# Test bndcfg register and bndstatus at startup
set test_string "\\\{raw = 0x\[0-9a-f\]+, config = \\\{base = \[0-9\]+,\
reserved = \[0-9\]+, preserved = \[0-9\]+, enabled = \[0-9\]+\\\}\\\}"

gdb_test "print \$bndcfgu" $test_string "bndcfgu formating"
gdb_test "print \$bndcfgu.config.enabled" "= 1" "test if bndstatus is enabled"
gdb_test "print \$bndstatus" "\\\{raw = 0x0, status = \\\{bde = 0, error = 0\\\}\\\}" \
		"bndstatus formating"
gdb_test "print \$bndstatus.raw" "= \\\(void \\\*\\\) 0x0" "bndstatus is zero by startup"

# Read values from pseudo registers.
gdb_breakpoint [ gdb_get_line_number "break here" ]
gdb_continue_to_breakpoint "break here" ".*break here.*"

set test_string ".*\\\{lbound = 0xa, ubound = 0x13\\\}.*"
gdb_test "info register bnd0" ".*bnd0$test_string" "Pure bnd0 register"

set test_string ".*\\\{lbound = 0x14, ubound = 0x1d\\\}.*"
gdb_test "info register bnd1" ".*bnd1$test_string" "Pure bnd1 register"

set test_string ".*\\\{lbound = 0x1e, ubound = 0x27\\\}.*"
gdb_test "info register bnd2" ".*bnd2$test_string" "Pure bnd2 register"

set test_string ".*\\\{lbound = 0x28, ubound = 0x31\\\}.*"
gdb_test "info register bnd3" ".*bnd3$test_string" "Pure bnd3 register"

# Read value from registers bndrs.

set test_string ".*\\\{lbound = 0xa, ubound_raw = 0x\[f\]+ec\\\}.*"
gdb_test "info register bnd0raw" ".*bnd0$test_string" "Pure bnd0r register"

set test_string ".*\\\{lbound = 0x14, ubound_raw = 0x\[f\]+e2\\\}.*"
gdb_test "info register bnd1raw" ".*bnd1$test_string" "Pure bnd1r register"

set test_string ".*\\\{lbound = 0x1e, ubound_raw = 0x\[f\]+d8\\\}.*"
gdb_test "info register bnd2raw" ".*bnd2$test_string" "Pure bnd2r register"

set test_string ".*\\\{lbound = 0x28, ubound_raw = 0x\[f\]+ce\\\}.*"
gdb_test "info register bnd3raw" ".*bnd3$test_string" "Pure bnd3r register"

# Setting fields on bnds
set test_string ".*\\\{lbound = 0xa, ubound = 0x400\\\}.*"
gdb_test "print \$bnd0.ubound = 0x400" "= \\\(void \\\*\\\) 0x400" "set value for bnd0.ubound"
gdb_test "print  \$bnd0" "$test_string" "after setting bnd0.ubound"
set test_string ".*\\\{lbound = 0xa, ubound_raw = 0x\[f\]+bff\\\}.*"
gdb_test "print /x \$bnd0raw" "$test_string" "bnd0raw after set bnd0.ubound"

set test_string ".*\\\{lbound = 0x1, ubound = 0x400\\\}.*"
gdb_test "print \$bnd0.lbound = 0x1" "= \\\(void \\\*\\\) 0x1" "set value for bnd0.lbound"
gdb_test "print  \$bnd0" "$test_string" "after setting bnd0.lbound"
set test_string ".*\\\{lbound = 0x1, ubound_raw = 0x\[f\]+bff\\\}.*"
gdb_test "print /x \$bnd0raw" "$test_string" "bnd0raw after set bnd0.lbound"

# Setting fields on bnd0raw.
set test_string ".*\\\{lbound = 0x1, ubound_raw = 0x600\\\}.*"
gdb_test "print /x \$bnd0raw.ubound_raw = 0x600" "= 0x600" "set value for bnd0raw.ubound"
gdb_test "print /x \$bnd0raw" "$test_string" "bnd0raw after setting bnd0raw.ubound"
set test_string ".*\\\{lbound = 0x1, ubound = 0x\[f\]+9ff\\\}.*"
gdb_test "print /x \$bnd0" "$test_string" "bnd0 after set bnd0raw.ubound"

set test_string ".*\\\{lbound = 0x100, ubound_raw = 0x600\\\}.*"
gdb_test "print /x \$bnd0raw.lbound = 0x100" "= 0x100" "set value for bnd0raw.lbound"
gdb_test "print /x \$bnd0raw" "$test_string" "bnd0raw after setting bnd0raw.lbound"
set test_string ".*\\\{lbound = 0x100, ubound = 0x\[f\]+9ff\\\}.*"
gdb_test "print /x \$bnd0" "$test_string" "bnd0 after set bnd0raw.lbound"

# Set full value bnd raw
set test_string ".*\\\{lbound = 0x10, ubound_raw = 0x\[f\]+cff\\\}.*"
gdb_test "print /x \$bnd0raw = {0x10, ~0x300}" "$test_string" "set full value for bnd0raw"
set test_string ".*\\\{lbound = 0x10, ubound = 0x300\\\}.*"
gdb_test "print /x \$bnd0" "$test_string" "bnd0raw after setting full bnd0raw"

# Set full value bnd
set test_string ".*\\\{lbound = 0x10, ubound = 0x300\\\}.*"
gdb_test "print /x \$bnd0 = {0x10, 0x300}" "$test_string" "set full value for bnd0"
set test_string ".*\\\{lbound = 0x10, ubound_raw = 0x\[f\]+cff\\\}.*"
gdb_test "print /x \$bnd0raw" "$test_string" "bnd0raw after setting full bnd0"

# Test bndcfg register and bndstatus after a failure on bndstr
gdb_test "print \$bndstatus.status.error" "= 2" "bndstatus error is 2\
after a failure on allocating an entry"

# Going to test the python extension for lenght.
if { [skip_python_tests] } { continue }
# Verify if size is right
set test_string ".*\\\: size 17.*"
gdb_test "print /x \$bnd0 = {0x10, 0x20}" "$test_string" "verify size for bnd0"

send_gdb "quit\n"
