# Copyright 2013-2021 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
}

if { ![supports_mpx_check_pointer_bounds] } {
    return -1
}

if { ![have_mpx] } {
    unsupported "processor does not support MPX"
    return -1
}

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

if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} \
     [list debug nowarnings additional_flags=${comp_flags}]] } {
    return -1
}

if ![runto_main] {
    return -1
}

# 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"
