xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.arch/i386-mpx-sigsegv.c (revision 901e7e84758515fbf39dfc064cb0b45ab146d8b0)
1 /* Copyright (C) 2015-2020 Free Software Foundation, Inc.
2 
3    Contributed by Intel Corp. <walfred.tedeschi@intel.com>
4 
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9 
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14 
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17 
18 #include "x86-cpuid.h"
19 #include <stdio.h>
20 
21 #define OUR_SIZE    5
22 
23 int gx[OUR_SIZE];
24 int ga[OUR_SIZE];
25 int gb[OUR_SIZE];
26 int gc[OUR_SIZE];
27 int gd[OUR_SIZE];
28 
29 unsigned int
30 have_mpx (void)
31 {
32   unsigned int eax, ebx, ecx, edx;
33 
34   if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
35     return 0;
36 
37   if ((ecx & bit_OSXSAVE) == bit_OSXSAVE)
38     {
39       if (__get_cpuid_max (0, NULL) < 7)
40 	return 0;
41 
42       __cpuid_count (7, 0, eax, ebx, ecx, edx);
43 
44       if ((ebx & bit_MPX) == bit_MPX)
45 	return 1;
46       else
47 	return 0;
48     }
49   return 0;
50 }
51 
52 int
53 bp1 (int value)
54 {
55   return 1;
56 }
57 
58 int
59 bp2 (int value)
60 {
61   return 1;
62 }
63 
64 void
65 upper (int * p, int * a, int * b, int * c, int * d, int len)
66 {
67   int value;
68   value = *(p + len);
69   value = *(a + len);
70   value = *(b + len);
71   value = *(c + len);
72   value = *(d + len);
73 }
74 
75 void
76 lower (int * p, int * a, int * b, int * c, int * d, int len)
77 {
78   int value;
79   value = *(p - len);
80   value = *(a - len);
81   value = *(b - len);
82   value = *(c - len);
83   bp2 (value);
84   value = *(d - len);
85 }
86 
87 int
88 main (void)
89 {
90   if (have_mpx ())
91     {
92       int sx[OUR_SIZE];
93       int sa[OUR_SIZE];
94       int sb[OUR_SIZE];
95       int sc[OUR_SIZE];
96       int sd[OUR_SIZE];
97       int *x, *a, *b, *c, *d;
98 
99       x = calloc (OUR_SIZE, sizeof (int));
100       a = calloc (OUR_SIZE, sizeof (int));
101       b = calloc (OUR_SIZE, sizeof (int));
102       c = calloc (OUR_SIZE, sizeof (int));
103       d = calloc (OUR_SIZE, sizeof (int));
104 
105       upper (x, a, b, c, d, OUR_SIZE + 2);
106       upper (sx, sa, sb, sc, sd, OUR_SIZE + 2);
107       upper (gx, ga, gb, gc, gd, OUR_SIZE + 2);
108       lower (x, a, b, c, d, 1);
109       lower (sx, sa, sb, sc, sd, 1);
110       bp1 (*x);
111       lower (gx, ga, gb, gc, gd, 1);
112 
113       free (x);
114       free (a);
115       free (b);
116       free (c);
117       free (d);
118     }
119   return 0;
120 }
121