summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.arch/i386-mpx.exp
blob: 7ce744e005da19b4dcb92b9e5fb7d906ad10ec61 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# Copyright 2013-2017 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 "failed to prepare" ${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"